HTML::Template を使ってみた

id:yuki_neko_nyanさんに紹介していただいた HTML::Template も使ってみました。
http://tech.ymirlink.co.jp/ruby/raa/template.html
http://raa.ruby-lang.org/project/html-template/
http://vce.ce-lab.net/ja/fasthtmltmpl.html


前回(id:aufheben:20060603)作った BeanDesc.rb はそのまま再利用し、ERBExample.rb を書き換えます。

#
# HtmlTemplateExample.rb
#

require 'BeanDesc'
require 'html/template'

def generate_bean(desc, out = STDOUT)
  #out.puts desc.inspect
  template = HTML::Template.new
  template.set_html(<<'EOB')
/*
 * <!var:desc.name>.java
 */
package ;

/**
 * <!var:desc.name>.
 */
public class <!var:desc.name> {

<!begin:desc.properties>
    private <!var:type> <!var:name>;
<!end:desc.properties>
<!begin:desc.properties2>

    /**
     * <!var:name> を返す。
     */
    public <!var:type> <!var:getter_name>() {
        return <!var:name>;
    }

    /**
     * <!var:name> を設定する。
     */
    public void <!var:setter_name>(<!var:type> <!var:name>) {
        this.<!var:name> = <!var:name>;
    }
<!end:desc.properties2>

}
EOB
  template.param({
    'desc.name'    => desc.name,
    'desc.package' => desc.package,
  })
  desc.properties.each do |p|
    template.node('desc.properties').param({
      'name' => p.name,
      'type' => p.type,
      'getter_name' => p.getter_name,
      'setter_name' => p.setter_name,
    })
    template.node('desc.properties2').param({
      'name' => p.name,
      'type' => p.type,
      'getter_name' => p.getter_name,
      'setter_name' => p.setter_name,
    })
  end
  out.puts template.output
end

desc = BeanDesc.new('Order', 'example')
desc.add_property('customer', 'String')
desc.add_property('product', 'String')
desc.add_property('quantity', 'int')
desc.add_property('accepted', 'boolean')

generate_bean(desc)

こんな感じで使い方あってるでしょうか?
感想としては、ERB の方が断然いいです。yuki_neko_nyanさんゴメンなさい。(^^;)。HTML::Template は以下のような欠点がありました。

  • オブジェクトをそのまま渡せず、Hash に詰め替える必要がある。
  • desc.properties を2回繰り返すことができず、別のパラメータを用意する必要がある。
  • 出力結果に余分な空行が入ってしまう。

もし、誤りがありましたらご指摘お願いします。m(_ _)m