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

テンプレート展開1


テンプレート展開1

読みこんだHtmlgen::Nodeオブジェクトのexpandメソッドを呼び出すことで、 テンプレート展開が行なわれます。

expandメソッドは引数をひとつだけ取ります。 その引数(モデルデータ)の型によって、それぞれ対応する展開処理が行なわれます。

モデルデータの型による展開処理
モデルデータの型処理内容
TrueClassテンプレートをそのまま展開
NilClassその要素を削除
配列(Enumerable)eachを呼び出して繰り返した数だけテンプレートの要素を繰り返す
HashID属性が存在する場合はその属性値でHashを引きを子要素に対して再帰的に適用。存在しない場合はHash自体を再帰的に適用
Obaq::HtmlGen::ExpandByMemberID属性が存在する場合はその属性値をメンバーとして呼び出した値を子要素に対して再帰的に適用。存在しない場合はHash自体を再帰的に適用
Obaq::HtmlGen::Elementその要素を子要素とする
ProcそのProcを呼び出して返却された値と置き換える
その他その値を文字列にして(to_s)要素の子要素とする

例1

# テンプレート
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>ノードにはID属性がないので、このノードの子要素に対して、ハッシュを適用して展開処理を行います。 そして、<h1>までたどりつくとID属性がありますから、このIDの値つまり :titleをキーとしてハッシュを引きます。 そして、data[:title]の値は文字列ですから、 この文字列を<h1>の子要素とします。

同様に、<p id=body>に対しても同じことを行い、結果として下記のように展開されます。

<html>
  <body>
    <h1>サンプル1</h1>
    <p>この文章が本文に挿入されます。</p>
  </body>
</html> 

例2

template = HtmlParser.parse_inline <<-END
  <ul>
    <li id=list1>
  </ul>
END

data = {
  :list1 => [1, 2, 3]
}
tree = template.expand(data)
f = Formatter.new(true, STDOUT)
f.format(tree)

この例では、<li id=list1>に対応する値が配列(Enumerableをincludeしたクラス)ですから、 <li>を配列の数だけ繰り返し、そのひとつひとつの値に対して、展開します。 その結果、以下のようになります。

<ul>
  <li>1</li>
  <li>2</li>
  <li>3</li>
</ul>

例3

template = HtmlParser.parse_inline <<-END
  <table>
    <tr id=list1><td id=name><td id=url>
  </table>
END

data = {
  :list1 => [ 
    { :name => "ruby", :url => "www.ruby-lang.org" },
    { :name => "java", :url => "java.sun.com" }
  ]
}
tree = template.expand(data)
f = Formatter.new(true, STDOUT)
f.format(tree)

この例では、id=list1が配列であることまでは前と同じですが、 その配列の要素がハッシュなので、 trの子要素である2つのtd要素(ID属性を持っているもの)に対して、このハッシュを適用します。 その結果下記のようになります。

<table>
  <tr>
  <td>ruby</td>
  <td>www.ruby-lang.org</td>
  </tr>
  <tr>
  <td>java</td>
  <td>java.sun.com</td>
  </tr>
</table>

ページトップへ