markdownをはてなブログのはてな記法にパースするプログラムです。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のテスト - 七誌の開発日記のコードをお借りしました。また、数式についてはてなキーワードの自動リンクを無効にするようにしているので、はてなキーワードの自動リンクに気を遣う必要はありません。svgではnodeなどで数式をSVGに変換してくれるサーバーを使えば、数式をSVG形式にします。私はmathjax-nodeを使ってました。ただ、SVGのソースが膨大になるのであまり実用的ではありません
レポジトリ内のmain.pyを実行するとSample.mdがパースされ、パースされたSample_hatena.htmlというファイルができるはずです。
はてなブログのMarkdownは
- 画面半々にしてプレビューできるがスクロールが同期しない
- 数式がプレビューされない
- 数式の記法がLaTeXの普通の記法と異なる(キャレット、アンダーバーなど)
と使いづらいです。
そこで、VSCodeの拡張機能の一つであるMarkdown Preview EnhancedでMarkdownをプレビューしながら文章や数式を書き、それをはてな記法のHTMLにパースすることにしました。
Markdown Preview Enhancedについてはこちら
https://qiita.com/tamaki_osamu/items/b5785930a77d44bba59c
うまくパースできなくても責任は取れないです。あくまでこういう事ができるという例です。
python3.8以上。pathilib、markdownモジュールを使います。
main.pyを実行するとSample.mdがパースされ、パースされたSample_hatena.htmlというファイルができるはずです。
$$で囲まれたブロック数式、$で囲まれたインライン数式、表、#が2つか3つのヘッダーには対応しています。
基本的にmarkdownモジュールがパースできるものはパースできるはずです。githubと同様、適度に改行しないとパースできないので注意(そのためmarkdown-preview-enhanced.breakOnSingleNewLineはオフ推奨)
また画像には対応していません。はてなブログに対応した方法で画像を貼り付けたほうがいいと思われるので。
もとのmdファイルをリスト化し、文章全体を標準ブロック、数式ブロックとブロックごとのリストに分けてます。そして、標準ブロックはインライン数式を一旦退避させて、markdownモジュールで変換した後、退避させていたインライン数式を(はてな記法に変換した上で)変換後の文字列に戻しています。数式ブロックもはてなブログ用の数式フォーマットになるようにパースしています。そして最後に"".join()で全部ドッキングしてます。
標準ブロック中のインライン数式に手間取りました😅。インライン数式中の不等号はmarkdownモジュールで解釈され勝手に変換されてしまうので、インライン数式を置換した後markdownモジュールで変換しても、markdownモジュールで変換した後インライン数式を置換してもダメなので、一度退避するという大掛かりなことをしなければなりませんでした。(markdownモジュールの使い方次第でもっとシンプルにできそう。python-markdown-mathとかインストールすれば良いのか?ただ英語のレファレンスしか無く辛い。)
python-markdown便利ですね。 いろいろできそう。
あとめっちゃreモジュール(正規表現)使った。reモジュールの使い方でこのサイトにはめちゃくちゃお世話になった。
https://note.nkmk.me/python-re-match-search-findall-etc/
(というかnote.nkmkは公式リファレンスよりわかりやすいよね)
https://7shi.hateblo.jp/entry/2018/07/27/185311
https://ano3.hatenablog.com/entry/2020/04/15/034609
http://ichitcltk.hustle.ne.jp/gudon2/index.php?pageType=file&id=python_markdown_library_reference.md