🎄

Python で Markdown を Html に変換する(基本編)

2022/01/03に公開約2,100字

環境:

> python -V

Python 3.9.5

Windows で動かしていますがきっと OS 依存の部分はないはずっ…。

コード

convert.py

import argparse
from pathlib import Path

import mistletoe

# ファイルの読み込み
def read_file(file_path:str) -> str:
    with open(file_path, "r", encoding="utf-8") as input_file:
        return input_file.read()

# ファイルへ書き出し
def write_file(file_path:str, html_str:str) -> None:
    with open(file_path, "w", encoding="utf-8") as output_file:
        output_file.write(html_str)

# body タグの中身に変換する
def get_body(md_str:str) -> dict:
    markup = mistletoe.markdown(md_str)
    return "\n".join([
        '<body>',
        markup,
        '</body>'
    ])

# メイン処理
def main(file_path:str) -> None:

    md_path = Path(file_path)
    if md_path.suffix != ".md":
        return

    md_str = read_file(file_path)
    body = get_body(md_str)

    head = "\n".join([
        r'<meta charset="utf-8">',
        r'<base target="_blank">', # リンクは新規タブで開く
        r'<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">', # viewport を設定しておく
    ])

    markup = "\n".join([
        '<!DOCTYPE html>',
        '<html lang="ja">',
        head,
        body,
        '</html>'
    ])

    out_path = md_path.with_name(md_path.stem + ".html")
    write_file(out_path, markup)

# コマンドライン引数をパースして実行
if __name__ == '__main__':
    parser = argparse.ArgumentParser()
    parser.add_argument("filePath", type=str)
    args = parser.parse_args()
    main(args.filePath)

コマンドライン引数に md ファイルのパスを指定してやり、処理が無事に完了すれば同じディレクトリに html に変換したファイルが書き出されます。

> python .\convert.py .\ほげほげ.md

mistletoe(ライブラリ)

定番のライブラリとして Python-Markdown を使うのもありですが今回は mistletoe を使ってみました。

https://github.com/miyuchina/mistletoe

Pure Python の Markdown パーサで速さが売りとのことです。
まだ使いこなせていませんがカスタムトークンも使用可能で拡張性の高さも相当とのこと。

Python-Markdown では表( <Table> )や打ち消し線( <Del> )の変換のためにいくつか 拡張機能 を追加する必要があるのに対し、mistletoe では最初から全部入りなので大変お手軽でした。


次回の 応用編 では mistletoe のカスタム記法にチャレンジします!

Discussion

ログインするとコメントできます