| TOP>>OBAQ>>HTMLジェネレーター | 概略 | ツアー | <OBAQ> | 構成定義 | アプリケーションサーバ | リファレンス | サイトマップ |
要素を指定することによるテンプレート置き換えexpandの引数として、HtmlGen::Element型の要素が指定された場合は、 その内容を指定した要素の子要素として展開します。 template = HtmlParser.parse_inline <<-END
<body>
<h1 id=title></h1>
</body>
END
data = {
:title => E(:h, A(:name, "label1")) { "TITLE TEXT" }
}
puts template.expand(data)
↓<body> <h1><h name="label1">TITLE TEXT</h></h1> </body> Procによるテンプレート置き換えexpandの引数がProcオブジェクトだった場合には、 元の要素を引数としてそのProcを呼び出します。 そして、その処理結果をテンプレートと置き換えます。 data = {
:title => proc do |e|
E(:h1) { E(:h, A(:name, "label1")) { "TITLE TEXT" } }
end
}上の例で、このデータを使用しても同じことができます。 また、自分と同じタグと属性の要素を生成して子要素を入れ換えるメソッドとして、 clone(&block)を用意してあります。 このデータを使用しても結果は同じです。 data = {
:title => proc do |e|
e.clone { E(:h, A(:name, "label1")) { "TITLE TEXT" } }
end
}応用例最初の例を説明します。 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",
# <table id=table1>の要素は以下のProcの処理結果で展開される
:table1 => proc do |table|
# tableの子要素で指定したIDがついたものを取り出しテンプレートとする
h = table.find { |e| e.hid == "header" }
l1 = table.find { |e| e.hid == "line1" }
l2 = table.find { |e| e.hid == "line2" }
# テンプレートとして行単位でコピーされるので、id=は削除する必要がある
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...>の属性を保持したまま、処理結果を子要素とする
table.clone { ret }
end
}
Formatter.new(true, STDOUT).format(template.expand(data)) |