pythonを使用してmarkdown to htmlを変換する

31738 ワード

の原因となる
markdownをhtmlに直接変換できるエディタがたくさんありますが、なぜ自分で書くのでしょうか.markdownを書き終わったら、ノートソフト(例えば道がある)に保存したり、githubに置いてバージョン管理したり、ブログ(例えばブログ園)に公開したりしたいからです.これらはすべて操作すると煩雑なので、スクリプトに渡さなければなりません.
げんりょう
  • markdown2 or mistune
  • pygments

  • 操作の原理
  • まずmarkdownの構文解析器が必要です.それからhtml変換器が必要です.これはmarkdown 2かmistoneでできます.
  • その後、私のノートには多くのコードがあり、コードのハイライトが必要です.これはまずmarkdownのコードブロックを抽出し,どの言語であるかを判断して着色する必要がある.このセクションはpymentsによって
  • を完了できます.
    コード#コード#
    mistune(ソースコードは学習価値があります).pygmentsモジュールレンダリングコードブロックを自分で導入する必要があります.公式サイトには参考例があります.
    import mistune
    import sys
    import codecs
    from pygments import highlight
    from pygments.lexers import get_lexer_by_name
    from pygments.formatters import html
    
    
    class HighlightRenderer(mistune.Renderer):
        def block_code(self, code, lang):
            if not lang:
                return '
    %s
    ' % \ mistune.escape(code) lexer = get_lexer_by_name(lang, stripall=True) formatter = html.HtmlFormatter() return highlight(code, lexer, formatter) def main(argv): name = argv[0] input_file = codecs.open(name, mode='r', encoding='utf-8') text = input_file.read() renderer = HighlightRenderer() markdown = mistune.Markdown(renderer=renderer) html = markdown(text) html_name = '%s.html' % (name[:-3]) output_file = codecs.open( html_name, 'w', encoding='utf-8', errors='xmlcharrefreplace') output_file.write(html) if __name__ == "__main__": main(sys.argv[1:])

    , css, html css, css http://richleland.github.io/pygments-css/ 。

    <style type = "text/css">
    .highlight .hll { background-color: #ffffcc }
    .highlight .c { color: #60a0b0; font-style: italic } /* Comment */
    .highlight .err { border: 1px solid #FF0000 } /* Error */
    .highlight .k { color: #007020; font-weight: bold } /* Keyword */
    .highlight .o { color: #666666 } /* Operator */
    .highlight .cm { color: #60a0b0; font-style: italic } /* Comment.Multiline */
    .highlight .cp { color: #007020 } /* Comment.Preproc */
    .highlight .c1 { color: #60a0b0; font-style: italic } /* Comment.Single */
    .highlight .cs { color: #60a0b0; background-color: #fff0f0 } /* Comment.Special */
    .highlight .gd { color: #A00000 } /* Generic.Deleted */
    .highlight .ge { font-style: italic } /* Generic.Emph */
    .highlight .gr { color: #FF0000 } /* Generic.Error */
    .highlight .gh { color: #000080; font-weight: bold } /* Generic.Heading */
    .highlight .gi { color: #00A000 } /* Generic.Inserted */
    .highlight .go { color: #808080 } /* Generic.Output */
    .highlight .gp { color: #c65d09; font-weight: bold } /* Generic.Prompt */
    .highlight .gs { font-weight: bold } /* Generic.Strong */
    .highlight .gu { color: #800080; font-weight: bold } /* Generic.Subheading */
    .highlight .gt { color: #0040D0 } /* Generic.Traceback */
    .highlight .kc { color: #007020; font-weight: bold } /* Keyword.Constant */
    .highlight .kd { color: #007020; font-weight: bold } /* Keyword.Declaration */
    .highlight .kn { color: #007020; font-weight: bold } /* Keyword.Namespace */
    .highlight .kp { color: #007020 } /* Keyword.Pseudo */
    .highlight .kr { color: #007020; font-weight: bold } /* Keyword.Reserved */
    .highlight .kt { color: #902000 } /* Keyword.Type */
    .highlight .m { color: #40a070 } /* Literal.Number */
    .highlight .s { color: #4070a0 } /* Literal.String */
    .highlight .na { color: #4070a0 } /* Name.Attribute */
    .highlight .nb { color: #007020 } /* Name.Builtin */
    .highlight .nc { color: #0e84b5; font-weight: bold } /* Name.Class */
    .highlight .no { color: #60add5 } /* Name.Constant */
    .highlight .nd { color: #555555; font-weight: bold } /* Name.Decorator */
    .highlight .ni { color: #d55537; font-weight: bold } /* Name.Entity */
    .highlight .ne { color: #007020 } /* Name.Exception */
    .highlight .nf { color: #06287e } /* Name.Function */
    .highlight .nl { color: #002070; font-weight: bold } /* Name.Label */
    .highlight .nn { color: #0e84b5; font-weight: bold } /* Name.Namespace */
    .highlight .nt { color: #062873; font-weight: bold } /* Name.Tag */
    .highlight .nv { color: #bb60d5 } /* Name.Variable */
    .highlight .ow { color: #007020; font-weight: bold } /* Operator.Word */
    .highlight .w { color: #bbbbbb } /* Text.Whitespace */
    .highlight .mf { color: #40a070 } /* Literal.Number.Float */
    .highlight .mh { color: #40a070 } /* Literal.Number.Hex */
    .highlight .mi { color: #40a070 } /* Literal.Number.Integer */
    .highlight .mo { color: #40a070 } /* Literal.Number.Oct */
    .highlight .sb { color: #4070a0 } /* Literal.String.Backtick */
    .highlight .sc { color: #4070a0 } /* Literal.String.Char */
    .highlight .sd { color: #4070a0; font-style: italic } /* Literal.String.Doc */
    .highlight .s2 { color: #4070a0 } /* Literal.String.Double */
    .highlight .se { color: #4070a0; font-weight: bold } /* Literal.String.Escape */
    .highlight .sh { color: #4070a0 } /* Literal.String.Heredoc */
    .highlight .si { color: #70a0d0; font-style: italic } /* Literal.String.Interpol */
    .highlight .sx { color: #c65d09 } /* Literal.String.Other */
    .highlight .sr { color: #235388 } /* Literal.String.Regex */
    .highlight .s1 { color: #4070a0 } /* Literal.String.Single */
    .highlight .ss { color: #517918 } /* Literal.String.Symbol */
    .highlight .bp { color: #007020 } /* Name.Builtin.Pseudo */
    .highlight .vc { color: #bb60d5 } /* Name.Variable.Class */
    .highlight .vg { color: #bb60d5 } /* Name.Variable.Global */
    .highlight .vi { color: #bb60d5 } /* Name.Variable.Instance */
    .highlight .il { color: #40a070 } /* Literal.Number.Integer.Long */
    style>
    

    import mistune
    import sys
    import codecs
    from pygments import highlight
    from pygments.lexers import get_lexer_by_name
    from pygments.formatters import html
    
    
    class HighlightRenderer(mistune.Renderer):
        def block_code(self, code, lang):
            if not lang:
                return '
    %s
    ' % \ mistune.escape(code) lexer = get_lexer_by_name(lang, stripall=True) formatter = html.HtmlFormatter() return highlight(code, lexer, formatter) def main(argv): md_name = argv[0] with codecs.open(md_name, mode='r', encoding='utf-8') as mdfile: with codecs.open("friendly.css",mode = 'r',encoding = 'utf-8') as cssfile: md_text = mdfile.read() css_text = cssfile.read() renderer = HighlightRenderer() markdown = mistune.Markdown(renderer=renderer) html_text = markdown(md_text) html_name = '%s.html' % (md_name[:-3]) with codecs.open(html_name, 'w', encoding='utf-8', errors='xmlcharrefreplace') as output_file: output_file.write(css_text + html_text) if __name__ == "__main__": if len(sys.argv) == 2: main(sys.argv[1:]) else: print("Error:please specify markdown file path")

    friendly.css css 。

    markdown2 :

    import markdown2
    import codecs
    import sys
    
    
    def main(argv):
        md_name = argv[0]
    
        with codecs.open(md_name, mode='r', encoding='utf-8') as mdfile:
            with codecs.open("friendly.css", mode='r', encoding='utf-8') as cssfile:
                md_text = mdfile.read()
                css_text = cssfile.read()
    
                extras = ['code-friendly', 'fenced-code-blocks', 'footnotes']
                html_text = markdown2.markdown(md_text, extras=extras)
    
                html_name = '%s.html' % (md_name[:-3])
                with codecs.open(html_name, 'w', encoding='utf-8', errors='xmlcharrefreplace') as output_file:
                    output_file.write(css_text + html_text)
    
    if __name__ == "__main__":
        if len(sys.argv) == 2:
            main(sys.argv[1:])
        else:
            print("Error:please specify markdown file path")
    

      

    :https://www.cnblogs.com/WeyneChen/p/6339965.html