Markdownをはてな記法にパースする

Markdownはてなブログはてな記法にパース(変換)するプログラムを作りました。

github.com

使い方

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プレビューは数式がプレビューされない、スクロール同期しないなど使いにくい。

そこで、VSCodeMarkdown Preview EnhancedでMarkdownをプレビューしながら文章や数式を書き、それをはてな記法に変換することにしました。

注意

うまくパースできなくても責任は取れないです。あくまでこういう事ができるという例です。

必要環境

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

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は公式リファレンスよりわかりやすいよね)

参考にしたサイト

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

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

MarkdownをPythonライブラリとして使用する - 愚鈍人