なぜChiroを作ったか

 今日の記事「最近Rubyの記事が多い気がする - はにっき」で紹介した拙作ライブラリの名前はChiro(チロ)です。さて、何故私はわざわざフルスクラッチしてまでこんなのを作ったかを述べたいと思います。
 最近、Ruby on Railsが話題ですね。Rubyのキラーフレームワークになりそうな勢いです。しかしこれ、実は私はいまだに試せてません。なぜなら、

  1. ちょっとためそうにもMySQLがどうこうとめんどい
  2. インストール方法もめんどい

ということなのですよ。ということで、すごく簡単にインストールできて試せるやつを作りたいなと思ったわけです。
 次にテンプレートのことです。最近のMVCフレームワークは「Webデザイナーさんとの連携」を念頭にしています。しかし、ある程度の規模の仕事ならいざ知らず、1人月もかからないような(かけられないような)それこそ、単純にBBSのカスタマイズのような仕事みたいなのでは、いちいちデザイナーさんにテンプレートのルールを覚えてもらうのは正直辛いです。そこで、たとえば既存の稼働中のBBSを表示して、そこから持ってきたHTMLを改造したものでもテンプレートになるような、「ほとんどルールのない」テンプレートライブラリが欲しかったわけです。少なくとも、デザイナーさんが入稿したものにほんのわずか手を加えただけで動くものが欲しかったわけです。
 また、Chiroのほかのライブラリと違うところは、値を「流し込む」だけでなく、「取得」もできるところです。たとえば、こんな使い方もできます。

require 'chiro'
require 'net/http'

src = nil

Net::HTTP.version_1_2
Net::HTTP.start('localhost') do |http|
    response = http.get('/index.cgi')
    src = response.body
end

doc = Chiro::Document.new(src)
element = doc.get_element_by_name('html.body.p')

if element.inner_text == 'ハローワールド'
    puts 'OK'
else
    puts 'NG'
end

これは、「最近Rubyの記事が多い気がする - はにっき」で紹介したサンプルスクリプトのテスト用のスクリプトです。このように「取得もできる」というのが重要で、これによってStrutsでいうところのiterateやJSPタグライブラリのforEachのようなビジネスロジックをテンプレートに書く必要すらなくなるのです。Chiro的繰り返し処理は以下のように書きます。

require 'chiro'

list = ['ハロー', 'Hello', 'こんにちは']

doc = nil

open('hoge.html', 'r') do |fh|
    doc = Chiro::Document.new(fh)
end

elem = doc.get_element_by_name('html.body')

list.each do |val|
  new_elem = elem.get_template_by_name('p')
  new_elem.inner_text = val
  elem.add_child(new_elem)
end

puts doc

実行結果は以下のようになります。

<html>
<head>
  <title>サンプル</title>
</head>
<body>
  <h1>サンプル</h1>
  <p>ハロー</p>
  <p>Hello</p>
  <p>こんにちは</p>
</body>
</html>

いかがでしょ?