Markdownをはてな記法にパースする
Markdownをはてなブログのはてな記法にパース(変換)するプログラムを作りました。
使い方
md_parser
フォルダ内のmd_parser.py
を次のようにインポートして使います。
from pathlib import Path from md_parser import md_parser md_parser.parse_md_to_hatena(pathlib.Pathオブジェクト)
動機
数式をはてなブログで書きたいとする。はてなブログの編集方法は、見たまま、はてな記法、Markdownの3つあるが、数式を扱う場合ははてな記法、Markdownの2択になる。
このうちはてなブログのMarkdownは数式をうまく扱えない(とうか独自仕様で移植性が悪い)。そしてそもそもMarkdown自体はカスタマイズ性が低い。例えばMathJaxは重いので、将来的にはサーバーサイドで処理もしたい。ということではてな記法を選んだ。
ただ、また一方でプレビューしながら文章や数式を書きたいという欲望もある。そしてはてなブログのMarkdownプレビューは数式がプレビューされない、スクロール同期しないなど使いにくい。
そこで、VSCodeのMarkdown Preview EnhancedでMarkdownをプレビューしながら文章や数式を書き、それをはてな記法に変換することにしました。
注意
うまくパースできなくても責任は取れないです。あくまでこういう事ができるという例です。
必要環境
python3.8以上。pathilib
、markdown
モジュールを使います。
例
main.pyを実行するとSample.md
がパースされ、パースされたSample_hatena.txt
というファイルができるはずです。
対応しているもの、していないもの
$$
で囲まれたブロック数式、$
で囲まれたインライン数式、表、#
が2つか3つのヘッダーには対応しています。
基本的にmarkdown
モジュールがパースできるものはパースできるはずです。githubと同様、適度に改行しないとパースできないので注意(そのためmarkdown-preview-enhanced.breakOnSingleNewLine
はオフ推奨)
また画像には対応していません。はてなブログに対応した方法で画像を貼り付けたほうがいいと思われるので。
実装
もとのmd
ファイルをリスト化し、文章全体を標準ブロック、数式ブロックとブロックごとのリストに分けてます。そして、標準ブロックはインライン数式を一旦退避させて、markdown
モジュールで変換した後、退避させていたインライン数式を(はてな記法に変換した上で)変換後の文字列に戻しています。数式ブロックもはてなブログ用の数式フォーマットになるようにパースしています。そして最後に"".join()
で全部ドッキングしてます。
感想
標準ブロック中のインライン数式に手間取りました😅。インライン数式中の不等号はmarkdown
モジュールで解釈され勝手に変換されてしまうので、インライン数式を置換した後markdown
モジュールで変換しても、markdown
モジュールで変換した後インライン数式を置換してもダメなので、一度退避するという大掛かりなことをしなければなりませんでした。(markdown
モジュールの使い方次第でもっとシンプルにできそう。python-markdown-math
とかインストールすれば良いのか?ただ英語のレファレンスしか無く辛い。)
python-markdown
便利ですね。 いろいろできそう。
あとめっちゃre
モジュール(正規表現)使った。re
モジュールの使い方でこのサイトにはめちゃくちゃお世話になった。
Pythonの正規表現モジュールreの使い方(match、search、subなど) | note.nkmk.me
(というかnote.nkmkは公式リファレンスよりわかりやすいよね)