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
でスタイルを指定できます。
- デフォルトの
default
ははてなブログにそのまま数式を渡す形になります。はてなブログは数式の表示にGoogle Charts APIかMathJaxを使っているらしいです。これはかなり遅いです。 katex
を指定すれば、KaTeXで高速にレンダリングしてくれるようになります。KaTeXのテスト - 七誌の開発日記のコードをお借りしました。また、数式についてはてなキーワードの自動リンクを無効にするようにしているので、はてなキーワードの自動リンクに気を遣う必要はありません。
レポジトリ内のmain.py
を実行するとSample.md
がパースされ、パースされたSample_hatena.md
というファイルができるはずです。
動機
Markdownをはてな記法(html)に変換したり、その中に含まれる数式をSVG形式にして軽くしたりといろいろやってきました。
数式をSVG化することで表示速度を12倍高速化した - あおいろメモ
しかし、はてな記法はhtmlなので、後からちょっと誤字脱字を直したいといったちょっとした編集をする際にどこを直せばいいか分かりにくいといった難点があります。また、数式が大量にある記事の場合ははてな記法を使って数式をSVG化して軽くした方がいいですが、大量に数式がない場合ははてな記法を持ち出さなくてもMarkdownでお手軽に書けた方が嬉しいです。そこで、このようなプログラムを作りました。
- 画面半々にしてプレビューできるがスクロールが同期しない
- 数式がプレビューされない
- 数式の記法がLaTeXの普通の記法と異なる(キャレット、アンダーバーなど)
- いろいろ特有のクセがある(後述)
と使いにくいです。
VSCodeでMarkdownを書く
そこで、VSCodeの拡張機能の一つであるMarkdown Preview Enhanced
でMarkdownをプレビューしながら文章や数式を書き、それをはてな流の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()
で結合し、保存しています。
数式の変換については(style
でdefault
を指定した場合)
- ブロック数式(
$$
で囲まれた数式)
については
<div align="center">[tex:
と]</div>
で囲む]
を\]
に置換<
、>
を\lt
、\gt
に変換
と変換します。
- インライン数式(
$
で囲まれた数式)
については
[tex:\displaystyle{
と}]
で囲む^
(指数)の後ろにスペースを挿入_
(添え字)の前後にスペースを挿入\{
,\}
,]
を\\{
,\\}
,\\]
に置換<
、>
を\lt
、\gt
に変換
必要環境
python3.8以上。pathilib
モジュールを使います。
参考サイト
以下のサイトを参考にさせていただきました。ありがとうございました。