Sinatraがサポートするテンプレート、気が付くとすごく増えてますね。
ここを見ると、
* 利用可能なテンプレート言語
Haml テンプレート
Erb テンプレート
Builder テンプレート
Nokogiri テンプレート
Sass テンプレート
Scss テンプレート
Less テンプレート
Liquid テンプレート
Markdown テンプレート
Textile テンプレート
RDoc テンプレート
AsciiDoc テンプレート
Radius テンプレート
Markaby テンプレート
RABL テンプレート
Slim テンプレート
Creole テンプレート
MediaWiki テンプレート
CoffeeScript テンプレート
Stylus テンプレート
Yajl テンプレート
WLang テンプレート
こんなふうに並んでて圧倒されるんですが、さりげなく "Nokogiri" って入ってます。Nokogiriってあの鋸ですよね。不覚にもまったく気がついていませんでした。
base.rb にちゃんとある・・・
どんなときに使うのかといえば、これはXMLを生成する時に使うんです。
options[:default_content_type] = :xml
って書いてあるし。
作ってみる
では、簡単にのこぎりTemplateを利用するものを作ってみましょう。
require 'sinatra'
require 'tilt/nokogiri'
get '/' do
@name = "hosoi"
@loop = [1,2,3,4]
nokogiri :index
end
テンプレートファイルをこんなふうに書いてみます。ほぼruby DSLそのままですね。
xml.test {
@loop.each do |x|
xml.p(@name, "class" => "test_#{x}")
end
}
こうすると、レンダリング結果は以下のようになります。ループが処理され、属性と本体が出力されています。
<?xml version="1.0"?>
<test>
<p class="test_1">hosoi</p>
<p class="test_2">hosoi</p>
<p class="test_3">hosoi</p>
<p class="test_4">hosoi</p>
</test>
valid!
まとめ
Nokogiri と聞いて「ああXPathでスクレイピングするライブラリね」と思っていました。本当にすみませんでした。よく見たらMiddlemanとかのテンプレートにも名を連ねておりますね。なお、ちゃんとビルダーが用意されているのでNokogiri DSLではhtmlも生成できるのですが、NokogiriTemplateクラスを見ると残念なことに xml 決め打ちのようです。
Sinatraを使ってレスポンスにXMLを返したいときには、ぜひ Nokogiri テンプレートをご利用ください。
※ なお、検索してみるとNokogiriでテンプレートエンジンを作っている先人もいるようです。不明を恥じるばかりです。