GitBook で Markdown 文法そのものに手を入れたい場合には、kramed に手を入れると良い

読了まで:約3分


本日の​知見未満。

以前、と​いうか​数日前に​外出中に​調べていて、​その​辺りを​まとめるのを​すっかり​忘れていた話。


まあ、​ [[Markdown]] で​ [[電子書籍]] が​作れる!​ と​いう​ [[ソフトウェア]] に、

って​いうのが​有るんですが、​この​ GitBook の​ [[Markdown]] 処理系は、​ ( [[2015-11-30]] ) 現在、

が​使われています。

それで、​ [[GitBook]] 本体の​方では、​プラグイン用に​使える​拡張構文みたいなのは​実装されてはいますが、​ [[Markdown]] 文法に​深く​食い​込んだ​構文拡張を​しようと​思うと、​この​ [[GitBook]] ​その​ものの​拡張構文では​どうにも​上手く​行かない​場合が​有り、​その​辺り、​なんとか​出来ないか​ナーと​数日前​調べていた​ところ、

アレ、​ GitBook で​使われてる​ kramed 、​微妙に​拡張できそうだぞ……!

と​判ったので​その​辺り​メモがてらまとめて​おきます。


先に​結論から​書くと、​ kramed が​ export している​値は、

kramed/kramed.js at master · GitbookIO/kramed

kramed.Parser = Parser;
kramed.parser = Parser.parse;
kramed.Renderer = Renderer;
kramed.Lexer = Lexer;
kramed.lexer = Lexer.lex;
kramed.InlineLexer = InlineLexer;
kramed.inlineLexer = InlineLexer.output;
kramed.parse = kramed;
module.exports = kramed;

と​いう​感じに​なっていて、​この​ kramed.Parser や​ kramed.Lexer or kramed.InlineLexer 辺りを​いじれば、

Markdown 構文​その​ものを​拡張できそう

と​いう​感じです。

それで、​実際に​コードとか​見ていて​この​辺り​注意した方は​良さそうだなーと​思ったのは、kramed​ の​場合、​Markdown の​ Parser と、​それ変換して​出力する​ Renderer は​別実装と​なっていて、​Parser から​直に​ Renderer の​各種メソッドを​呼ぶ、​みたいな​形に​なってるっぽいので、​Parser を​拡張して​ Markdown 構文を​拡張した​場合、​ Renderer も​拡張する​必要が​あるっぽい、と​いう​ところでしょうか。

まあ、​この​辺りの​流れと​しては、

  1. Lexer を​いじって​ Markdown 構文の​ Tokenize を​拡張する
  2. その​拡張部分を​サポートさせる​ために​ Parser の​メソッドも​拡張する
  3. 最後に​それを​出力する​ Renderer の​方も​対応させる

と​いう​感じ (?​) っぽいです。

ただ、​ GitBook 自体、​こういう​ Markdown 処理系の​内部に​手を​突っ込む​コトを​想定してないと​いうか、​多分、​こういう​ダイレクトアタックみたいな​コトを​行なうと​いう​コトは​考えられて​作られないと​思うので、​その​辺りの​処理拡張で​ GitBook 処理系が​おかしな​コトに​なっても​知らん、​って​感じだと​思います。​常識的に​考えて。​その​ため、​この​手法を​使うのは​奥の​手と​いうか、​ま、​ 自己責任で​行なってね!​ って​感じですね。​はい。


まーこの​手の​構文拡張の​正攻法と​しては、​ GitBook ​その​ものに​備わっている​拡張構文​使う​コトだと​思っているので、​今回の​知見未満な​方​法は、​まあ邪道ではないけど​邪法っぽい​感じです。

ただ、​やっぱり​ Markdown 自体を​いじらないと​どうしようも​無い​場合には、​これを​使うしか​ないっぽい、と​いうのは​なんともなーって​感じですががががが。

まーでも、​実際に​今回の​コレは​ GitBook の​実装が​アレって​いうより、​ 自分の​要件が​アレ って​言う​感じなので、​まあ GitBook は​悪くないと​思います。​はい。


と​いう​コトで​本日の​知見未満は​以上。

何かの​役に​立つか​どうか​判りませんが、​とりあえず​個人的には​必要なので、​雑に​メモして​終わっときます。​はい。

にゃるら(カラクリスタ)

『輝かしい青春』なんて失かった人。
次に備えて待機中。

今は趣味でプログラミングをして
生活しています。