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

概要


HTMLジェネレーターとは

ObaqのHTMLジェネレーターとは、次のようにHTMLファイルの指定した位置に、 Rubyスクリプトの処理結果をハメこむライブラリです。

テンプレート(雛型のHTMLファイル) + モデル(Rubyで記述したデータを供給するスクリプト) 
  →  データの埋めこまれたHTMLファイル

特色は次のとおりです。

  1. テンプレートとモデルが完全に分離している
  2. テンプレートは普通のHTMLファイルであり、特殊なタグを使用しない
  3. 配列やハッシュ等のRubyの標準データ構造をそのままモデルとして使用できるので簡潔で直感的な記述が可能

シンプルな例

include Obaq
include HtmlGen

# テンプレート(通常はファイルから読みこむ)
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>
  <body>
    <h1>サンプル1</h1>
    <p>この文章が本文に挿入されます。</p>
  </body>
</html> 

つまり、ObaqのHTMLジェネレーターはテンプレート内のHTMLの要素の中で、 id=xxxという属性を持つものに対して置換えを行います。 上記の例では、置き換えを行なうモデルデータとしてハッシュを使用していますが、 他にもいろいろなパターンがあり、 簡潔で直感的な記述が可能です。

複雑な例

データの部分には、ハッシュだけでなくて配列やProcオブジェクト等いろいろなものを渡すことができます。 これを最大限に活用したのが次の例です。 スクリプトは複雑になりますが、 テンプレートとモデルが完全に分離しています。

ですから、テンプレートのbgcolorの属性やカラム幅の設定などをHTMLエディタを使って行なうことができます。 id=xxxという属性を持ったタグの論理的な構成が変化しない限りは、どのようにテンプレートを修正しても、 ロジックの方を修正する必要はありません。

テンプレート

col1col2
data1data2
data1data2

モデルデータ

[[ "aa", "bb"], ["cc", "dd"], ["ee", "ff"], ["gg", "hh"]]

結果

col1 col2
aa bb
cc dd
ee ff
gg hh

スクリプト

この処理を行なうスクリプトは以下のようになります。

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", 
  :table1 => proc do |table|
    h = table.find { |e| e.hid == "header" }
    l1 = table.find { |e| e.hid == "line1" }
    l2 = table.find { |e| e.hid == "line2" }
    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.clone { ret }
  end
}
Formatter.new(true, STDOUT).format(template.expand(data))

以下の章で、これを順番に解説していきます。


ページトップへ