| TOP>>OBAQ>>HTMLジェネレーター | 概略 | ツアー | <OBAQ> | 構成定義 | アプリケーションサーバ | リファレンス | サイトマップ |
ExpandByMemberによるテンプレート置き換えexpandの引数がHtmlGen::ExpandByMember というモジュールをincludeしたクラスのオブジェクトだった場合は id=xxxの属性値と同名のメソッドを呼び出して展開します。 class FileStat
include Obaq
include HtmlGen
include ExpandByMember
attr_reader :path, :size
def initialize(path, size)
@path, @size = path, size
end
end
def Sample1.main
template = HtmlParser.parse_inline <<-END
<table>
<tr id="file_list"><td id=path><td id=size></tr>
</table>
END
data = {
:file_list => [
FileStat.new("a.html", 100),
FileStat.new("b.html", 200),
FileStat.new("c.html", 300),
]
}
puts template.expand(data)
end<td id=path>に与えられる、expandの引数はFileStatオブジェクトです。 このオブジェクトはExpandByMemberをincludeしていますから、 このオブジェクトに対して、pathというメソッドが呼び出されます。 その結果以下のようになります。 <table> <tr> <td>a.html</td> <td>100</td> </tr> <tr> <td>b.html</td> <td>200</td> </tr> <tr> <td>c.html</td> <td>300</td> </tr> </table> 応用例この機能を利用して、 既存のクラスのオブジェクトを利用してテンプレート展開を行うことができます。 次の例は、Ruby標準のFile::Statオブジェクトを使用した例です。 include Obaq
include HtmlGen
class FileStat < SimpleDelegator
include Obaq
include HtmlGen
include ExpandByMember
attr_reader :path, :uid
def initialize(path)
@path = path
@stat = File::stat(path)
super(@stat)
end
end
def Sample2.main
template = HtmlParser.parse_inline <<-END
<table>
<tr><th>path<th>mtime<th>size</tr>
<tr id="file_list"><td id=path><td id=mtime><td id=size></tr>
<table>
END
file_list = Dir.glob("*").collect do |f|
next if FileTest::directory?(f)
FileStat.new(f)
end
data = {
:file_list => file_list
}
puts template.expand(data)
endこの結果、次のようなテーブルが作成されます。
|