TOP>>OBAQ>>HTMLジェネレーター 概略ツアー<OBAQ>構成定義アプリケーションサーバリファレンスサイトマップ

テンプレート展開3


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

この結果、次のようなテーブルが作成されます。

path mtime size
sample.html Mon May 21 20:39:48 JST 2001 103
html1.rb Tue May 22 08:51:05 JST 2001 2490
html2.rb Mon May 21 20:04:45 JST 2001 1147
html3.rb Tue May 22 10:28:42 JST 2001 1798
html4.rb Tue May 22 10:52:33 JST 2001 849
html5.rb Tue May 22 11:24:39 JST 2001 1407

ページトップへ