日記

日記。

RailsのContent-Type

RailsというWebフレームワークでは、HTTPレスポンスをActionDispatch::Responseというクラスで扱うのだが、次のように、charsetの後にもoptionalなparameterを持つようなContent-Typeをこのインスタンスに入れて取り出すと、optionalなparameterが消えてしまう。

Content-Type: text/csv; charset=sjis; header=present

ActionDispatch::Responseでは、内部的にContent-Typeをパースしており、MIME-Typeとcharsetという2種類の情報に分類して保存しているのだが、optionalなparameterの扱いが曖昧で、MIME-Typeに含むのか含まないのかがそこまではっきりと決まっておらず、とりあえず (?) 先頭からcharsetの直前までがMIME-Type、という感じのパース方法になっているためである。

この挙動だと一貫性が無いので困るというIssueを出して、それからパーサーの実装を変更するというPull Requestを出してみた。パーサーとか絶対自分で書きたくないよ。だいたい壊れてるもん。元々の一貫性の無いパーサーを入れたのも自分だし…

Markdownパーサー

昨日に続き、今日もMarkdownパーサーの実装を少し進めた。こいつ一日中パーサー実装してるな。

今回実装したのはIndented code block。Fenced code blockと比べると言語を指定する機能がなかったり、インデントするのが面倒だったりという都合で、なかなか使われない記法であるが、他のレアな記法と比べるとまだよく見る方である。

このインデントにはスペースの代わりにタブも使うことができて、タブはその挿入位置に応じてスペース1個から4個相当のインデントを表現することになる。また、4レベルまでのインデントはコードブロックを開始・継続するためのインデントとして扱われるが、それ以上はコード内のインデントとして扱われるというルールがあったり、コードブロック末尾の連続する空行は最終的な出力からは取り除かれるというルールがあったりして、実装する上ではそこそこ手間のかかるルールが沢山存在している。

早朝に実装したせいか、CommonMarkのテストに成功するものを意外と難なく実装できた。次回はFenced code blockを実装していきたい。