Markdownをはてな流Markdownにパースする

Markdown中の数式をてなブログのはてな流の数式に変換するプログラムをつくりました。Markdownファイル全体を一括で変換します。

GitHub - SolKul/md_2_hatena_md

使用方法

md_parserフォルダ内のmd_parser.pyを次のようにインポートして使います。

from md_parser import md_parser
md_parser.parse_md_to_hatena(pathlib.Pathオブジェクト,style="default")

styleでスタイルを指定できます。

レポジトリ内のmain.pyを実行するとSample.mdがパースされ、パースされたSample_hatena.mdというファイルができるはずです。

動機

Markdownはてな記法(html)に変換したり、その中に含まれる数式をSVG形式にして軽くしたりといろいろやってきました。

Markdownをはてな記法にパースする - あおいろメモ

数式をSVG化することで表示速度を12倍高速化した - あおいろメモ

しかし、はてな記法はhtmlなので、後からちょっと誤字脱字を直したいといったちょっとした編集をする際にどこを直せばいいか分かりにくいといった難点があります。また、数式が大量にある記事の場合ははてな記法を使って数式をSVG化して軽くした方がいいですが、大量に数式がない場合ははてな記法を持ち出さなくてもMarkdownでお手軽に書けた方が嬉しいです。そこで、このようなプログラムを作りました。

そもそもはてなブログMarkdown

  • 画面半々にしてプレビューできるがスクロールが同期しない
  • 数式がプレビューされない
  • 数式の記法がLaTeXの普通の記法と異なる(キャレット、アンダーバーなど)
  • いろいろ特有のクセがある(後述)

と使いにくいです。

VSCodeMarkdownを書く

そこで、VSCode拡張機能の一つであるMarkdown Preview EnhancedMarkdownをプレビューしながら文章や数式を書き、それをはてな流のMarkdownに変換することにします。

f:id:SolKul:20210131114414p:plain
VSCodeでのMPEのMarkdown編集画面とプレビュー画面。はてなブログよりかなり優秀。

これを使えば数式を含むQiitaの記事をはてなブログに移植するのも楽になると思います。

Markdown Preview Enhancedについてはこちら

Visual Studio Code + markdown preview enhanced は最高なノートだと思う - Qiita

ただ、はてなブログMarkdown特有のクセには注意が必要です。たとえば、箇条書きの直後に番号付きリストをつけるとバグる、バッククォートを含むコードがコードブロックで書けないなどなど。注意しましょう。

数式の記法

Markdown Preview Enhancedではいくつかの数式の挿入方法がサポートされていますが、そのうち$$で囲まれたブロック数式、$で囲まれたインライン数式に対応しています。しかし、

​```math
e^{i\pi} = -1
​```

には対応していません。

実装

もとのmdファイルをリスト化し、文章全体を標準ブロック、数式ブロックなどとブロックごとのリストに分けてます。標準ブロックについては標準ブロック内のインライン数式をre.findallですべて検索し、順次はてな流インライン数式に変換します。数式ブロックにつていもはてなブログ用の数式ブロックになるように変換します。最後に"".join()で結合し、保存しています。

数式の変換については(styledefaultを指定した場合)

  • ブロック数式($$で囲まれた数式)

については

  1. <div align="center">[tex:]</div>で囲む
  2. ]\]に置換
  3. <>\lt\gtに変換

と変換します。

  • インライン数式($で囲まれた数式)

については

  1. [tex:\displaystyle{}]で囲む
  2. ^(指数)の後ろにスペースを挿入
  3. _(添え字)の前後にスペースを挿入
  4. \{,\},]\\{,\\},\\]に置換
  5. <>\lt\gtに変換

必要環境

python3.8以上。pathilibモジュールを使います。

参考サイト

以下のサイトを参考にさせていただきました。ありがとうございました。

はてなブログで数式を書く - 七誌の開発日記

Latexをはてなブログmarkdown形式に変換 - ano3のブログ