なぜChiroを作ったか
今日の記事「最近Rubyの記事が多い気がする - はにっき」で紹介した拙作ライブラリの名前はChiro(チロ)です。さて、何故私はわざわざフルスクラッチしてまでこんなのを作ったかを述べたいと思います。
最近、Ruby on Railsが話題ですね。Rubyのキラーフレームワークになりそうな勢いです。しかしこれ、実は私はいまだに試せてません。なぜなら、
- ちょっとためそうにもMySQLがどうこうとめんどい
- インストール方法もめんどい
ということなのですよ。ということで、すごく簡単にインストールできて試せるやつを作りたいなと思ったわけです。
次にテンプレートのことです。最近の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>
いかがでしょ?