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