| TOP>>OBAQ>>HTMLジェネレーター | 概略 | ツアー | <OBAQ> | 構成定義 | アプリケーションサーバ | リファレンス | サイトマップ |
HTMLジェネレーターとはObaqのHTMLジェネレーターとは、次のようにHTMLファイルの指定した位置に、 Rubyスクリプトの処理結果をハメこむライブラリです。 テンプレート(雛型のHTMLファイル) + モデル(Rubyで記述したデータを供給するスクリプト) → データの埋めこまれたHTMLファイル 特色は次のとおりです。
シンプルな例include Obaq
include HtmlGen
# テンプレート(通常はファイルから読みこむ)
template = HtmlParser.parse_inline <<-END
<html>
<body>
<h1 id=title></h1>
<p id=body></p>
</body>
</html>
END
# テンプレートのID=に対応したデータ(=モデル)
data = {
:title => "サンプル1",
:body => "この文章が本文に挿入されます。"
}
# テンプレートを展開して出力する
tree = template.expand(data)
f = Formatter.new(true, STDOUT)
f.format(tree)これを実行すると、下記のようなHTMLが生成され、標準出力に出力されます。 <html>
<body>
<h1>サンプル1</h1>
<p>この文章が本文に挿入されます。</p>
</body>
</html> つまり、ObaqのHTMLジェネレーターはテンプレート内のHTMLの要素の中で、 id=xxxという属性を持つものに対して置換えを行います。 上記の例では、置き換えを行なうモデルデータとしてハッシュを使用していますが、 他にもいろいろなパターンがあり、 簡潔で直感的な記述が可能です。 複雑な例データの部分には、ハッシュだけでなくて配列やProcオブジェクト等いろいろなものを渡すことができます。 これを最大限に活用したのが次の例です。 スクリプトは複雑になりますが、 テンプレートとモデルが完全に分離しています。 ですから、テンプレートのbgcolorの属性やカラム幅の設定などをHTMLエディタを使って行なうことができます。 id=xxxという属性を持ったタグの論理的な構成が変化しない限りは、どのようにテンプレートを修正しても、 ロジックの方を修正する必要はありません。 テンプレート
モデルデータ[[ "aa", "bb"], ["cc", "dd"], ["ee", "ff"], ["gg", "hh"]] 結果
スクリプトこの処理を行なうスクリプトは以下のようになります。 template = HtmlParser.parse_inline <<-END
<html>
<body>
<h1 id=title></h1>
<table id=table1 border=1>
<tr id=header><th>col1</th><th>col2</th></tr>
<tr id=line1 bgcolor="#ff99ff"> <td id=col11><td id=col12></tr>
<tr id=line2 bgcolor="#66ffff"><td id=col21><td id=col22></tr>
</table>
</body>
</html>
END
colomun_data = [[ "aa", "bb"], ["cc", "dd"], ["ee", "ff"], ["gg", "hh"]]
data = {
:title => "Sample1",
:table1 => proc do |table|
h = table.find { |e| e.hid == "header" }
l1 = table.find { |e| e.hid == "line1" }
l2 = table.find { |e| e.hid == "line2" }
h.delete_attr(:id)
l1.delete_attr(:id)
l2.delete_attr(:id)
ret = [ h ]
colomun_data.each_with_index do |d, i|
if i%2 == 0
ret << l1.expand({ :col11 => d[0], :col12 => d[1] })
else
ret << l2.expand({ :col21 => d[0], :col22 => d[1] })
end
end
table.clone { ret }
end
}
Formatter.new(true, STDOUT).format(template.expand(data))以下の章で、これを順番に解説していきます。 |