Skip to content

SolKul/md_hatena_parser

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

13 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

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

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以上。pathilibmarkdownモジュールを使います。

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

About

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

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published