title-logo

Nokogiri なしで middleman-blog を使いたい

November 03, 2014

さて、書くことがないので、またこのブログ自体に関する記事になります。

このブログは middleman-blog を利用して作っていますが、middleman-blog はサマリの生成に Nokogiri を使用しています。

嗚呼、Nokogiri よ、無数の刃を持つ板きれの名を与えられたものよ、わたしはあなたが恐ろしい。bundle install であなたが吐いた赤い字を見るのが恐ろしい。公開環境にデプロイしたら、当然のような顔をしてあなたが転んでいた。嗚呼、Nokogiri よ、わたしはあなたが恐ろしい。

もちろん、便利に使わせてもらっていた手前、あまり dis りたくはないのだけれど、それ以上に困り果てたことも多かったので、依存関係に Nokogiri の名を見た瞬間に思わずこんな詩を編まずにはおれない気分になってしまいます。なので、もし Nokogiri なしで構築できるならそうしたいところ。先に書いたとおり、middleman-blog で Nokogiri を使用しているのはサマリを生成するためだけで強い依存があるわけではないので、使わずにやり過ごすこともそんなに難しくはなさそうです。ただ、記事からサマリを切り出したときに DOM の構造を維持しておく必要があり、そのためには HTML パーサーを利用しなければなりません。

Oga

Oga という新しい XML/HTML パーサーがあります。libxml を利用しないことから、Nokogiri を置き換える可能性を持ったものとして注目を集めています。

この Oga を middleman-blog で利用することができれば、Nokogiri に依存することなく環境を構築することができそうです。

Middleman Blog with Oga

middleman-blog でサマリを切り出しているところのソースコードを見てみると、truncate_html.rb でトランケート用のモジュールを定義して、それを Nokogiri の各 DOM クラスに include させているようでした。Oga にも DOM の要素を示すクラスが用意されているので、同じように実装してあげれば Oga への差し替えは難しくなさそうです。

そうして修正したソースコードがこちらです。無事、 Nokogiri を使用せずにサマリの生成を行うことができるようになりました。Gemfile などで middleman-blog の代わりにこのリポジトリの with-oga ブランチを指定してやれば使うことができます。

Gemfile

gem 'middleman-blog', :github => '5t111111/middleman-blog',
                      :branch => 'with-oga'

この修正は本家の middleman-blog に対して Pull Request を出していますが、取り込まれていません。 Nokogiri 外しと Oga への置き換え自体に対しては前向きに考えてくれていますが、「middleman-core へ取り込もう」という話に発展していて、それはもちろん大歓迎なんですが、取り込まれるには残念ながらまだしばらく時間がかかりそうです。