Markdownのパーサー・レンダラの自作

公開:2020-02-18 21:42
更新:2020-02-18 21:48
カテゴリ:Webサイトリニューアル,静的ブログジェネレータ,Markdown

Webサイトリニューアルの一環として、[markdown]ベースのオリジナル・ドキュメントのパーサ/レンダラを[peg.js]で作りはじめた。が、まだはっきりと「これ」で進めると決めているわけでもなく、markdownに関する知識を得たい欲求もあるので手を止めて情報を集めたりしている。

githubのreadme.mdもmarkdownで書けるわけだが、これは正確にはmarkdownではなく[GitHub Flavored Markdown](GFM)というmarkdownの拡張書式である。

そもそもmarkdownは「テキスト修飾の記法で、かつその書式自体がHTML装飾を指定するための記法になっているもの」なのだ。markdownは記法の解釈にあいまいなところがあって、それがmarkdown互換ツールが出力するHTMLの微妙な違いとなっている。そのため、[commonmark]というmarkdownの記法を厳密化したものが登場した。

そしてGFMのspecはcommonmarkをベースに書き直された。拡張部分はspecに拡張とわかるように追加されている。

marked.js

markdownのパーサー・レンダラはたくさん作られている。私が今使っているのは[marked.js]の0.6あたりのバージョンである。これにtexのサポートとカスタムタグを拡張し、そしてrenderer部分に手を入れてHTMLとAMP-HTMLの両方を出力できるようにしている。しかし私の拡張している部分がちょっと汚くなっているし、marked.jsの正規表現で書かれたlexer部分をきちんと理解していないせいもあって、そこに手をいれることができないでいる。markdownをきちんと理解する意味でも一度はパーサ・レンダラを自作したいと考えて作り始めたわけだ。

cmark

[cmark]はGFMのC言語による実装である。これのnode版の[node-cmark]というものもある。C言語で書いてあるだけあってパース・レンダリングは速いらしい。lexerの部分は[re2c]というlexerジェネレータで作成されている。私は「速い」という言葉に弱く、またnodeのネイティブ・アドオンに触れてみたいという欲求もあって、いまこのツールのレポジトリを読んでいるところである。

今後

cmarkのlexerのソースコードを読んでみて、lexerの定義ソースをpeg.jsに移植してみるかもしれないし、re2cの構文定義をいじってネイティブ・アドオンとするかもしれない。冒頭に書いたが現時点では実装方法を決めておらず、試行錯誤がしばらく続くと思う。