日記

Markdownパーサー

ここ1週間ほど実装を続けているMarkdownパーサーについて、HTML Blockというやつの実装をはじめた。聞き慣れない用語だが、要はMarkdownの中にHTMLを(ブロックとして)埋め込むときに利用される仕様だ。

Markdownは任意のHTML要素を任意の位置に埋め込めるのだと勝手に思い込んでいたが、CommonMarkの仕様を読んでみると、意外とそういう訳ではなく、特定のパターンを満たすときだけそれらしく動くだけなことが分かる。以前、details要素をMarkdownの中に埋め込もうとしたときに、何か上手くいかないなと違和感を感じたことがあるが、この仕様が関係していたということが分かってすっきりした。

rails-controller-testing

rails-controller-testingに、幾つかPull Requestを出した。

rails-controller-testingは、その名前とは裏腹に、どのテンプレートが描画されたのかをテストするための機能を提供している。これを利用して、PC向けのHTMLテンプレートと携帯端末向けのHTMLテンプレートとを出し分けるようなときに、例えばPCのWebブラウザらしきUser-Agentからリクエストが来たときはPC向けのHTMLテンプレートが描画されることをテストで確かめたい。しかしこれが既存の実装だと実現できないので、今回Pull Requestを出すことになった。

assert_template identifier: Rails.root.join('articles/index.html.erb').to_s

提案した実装だと、上のような丁寧な書き方をしなければならない。まあそれでも、今まで出来なかったことが出来るようになるだけでもありがたいので、アプリケーション側で適当なラッパーでも書いて便利に使えるようにすれば良いだけの話ではある。

assert_template 'articles/index'
assert_template 'articles/index.html.erb'

本当はこのいずれの形式でもvalidになるように実装したい気もしているので、出したPull Requestにもしメンテナー側から良い反応があれば、将来的にこれも提案したいが…これは非互換な変更になるので、少し難しいかもしれないな。

assert_template /erb/

もし上述したようにvirtual_pathとidentifierに対してOR条件でパターンマッチするように変更するならば、今のassert_templateの第一引数はRegexpなども認めているので、こういうことも出来るようになる。せっかくRubyなので(?)、#=== に反応できるオブジェクトをなんでも渡せるようにしてしまう、というのも良いかもしれない。