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

テンプレート展開2


要素を指定することによるテンプレート置き換え

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))

ページトップへ