MarkdownをHTMLに変換 (2017/04/02)

Markdownで書かれたブログ記事をHTMLに変換する。私はブログ記事をMarkdownで書き、それをHTMLに変換してからブログにアップしている。

以下はそのためのプログラム作成と実行の手順である。

markdownのインストール

これから作成するプログラムを実行するには、あらかじめ「markdown」ライブラリをインストールしておく必要がある。

  1. 以下のコマンドを端末にコピー&ペーストして「Enter」キーを押す。

    $ conda install markdown
    
  2. もし「Proceed ([y]/n)?」と表示されたら「Enter」キーを押す。

プログラムの作成

下のコードを「~/py」フォルダーに「markdown2html.py」ファイルとして保存する。

# coding: utf-8

import sys
import markdown

def markdown2html(md_file):
    '''markdownで書かれたファイルをhtmlに変換し、別ファイルとして作成する。
        Args:
            md_file: mdファイル名。
    '''
    # ファイルを読み込む。
    input_file = markdown.codecs.open(md_file, mode='r', encoding='utf-8')
    text = input_file.read()
    # htmlに変換する。
    html = (
        '<script src="https://cdn.rawgit.com/google/code-prettify/master/' +
        'loader/run_prettify.js"></script>\n' +
        '<script type="text/x-mathjax-config">' +
        'MathJax.Hub.Config({displayAlign: "left", displayIndent: "2em"});' +
        '</script>\n' +
        '<script type="text/javascript" src="https://cdn.mathjax.org/' +
        'mathjax/latest/MathJax.js?config=TeX-AMS-MML_SVG"></script>\n\n')
    temp = markdown.markdown(text)
    html = "{}{}".format(html, temp)
    html = html.replace('<pre>', '<pre class="prettyprint">')
    # 書き込み用のファイルを作成する。
    html_file = md_file.replace('.md', '.html')
    output_file = markdown.codecs.open(html_file, 'w', encoding='utf-8',
                                       errors='xmlcharrefreplace')
    # ファイルを書き込む。
    output_file.write(html)

if __name__ == '__main__':
    # 設定を読み込む。
    argv = sys.argv
    md_file = argv[1]
    # markdownで書かれたファイルをhtmlに変換し、別ファイルとして作成する。
    markdown2html(md_file)

このプログラムではシンタックスハイライトとMathJaxが利用できるようにしている。また、エスケープ処理も行っている。

エスケープ処理はMarkdownで書かれたもののみ実行される。MarkdownとHTMLを併用した場合、HTMLで書かれた部分は処理されない。特にコードをpreタグで囲んだりするとその部分はエスケープ処理が行われないので注意。

プログラムの実行

「~/ドキュメント/blog/00」フォルダーにMarkdownで書かれた「00.md」ファイルがあるとして説明する。

%run ~/py/markdown2html.py ~/ドキュメント/blog/00/00.md

「~/ドキュメント/blog/00」フォルダーにhtmlに変換された「00.html」ファイルが生成する。

コメント

非公開コメント