Tempuraは、Ruby用のテンプレートエンジンの一つ。テンプレートエンジンにはすでにAmritaなどがあるが、新たに登場したこのTempuraに、何か違いがあるかどうか試してみる。インストールアーカイブファイルは、次のところから入手できる。Tempuraに添付されている文字コード変換器を使うときは、別途、Uconvモジュールが必要。Rubyに添付されているiconvを使って自分で変換器を書いてもよい。Uconvモジュールは、次のところから入手できる。http://www.yoshidam.net/Ruby_ja.html小さなテンプレートとスクリプトさっそく小さなサンプルを書いてみる。TempuraはテンプレートデータをREXMLでパースする。そのため、テンプレートデータはXMLで書かれていなければならない。終了タグを省略したりすると、パース時点でエラーが発生する。テンプレートファイルを用意する。Tempuraでは特別な要素は使わず、属性として指示を埋め込んでいく。属性値としてRubyスクリプトの断片を埋め込む。_child_="fetch(:obj1)">(ここが置き換えられる)これを素にして変換結果を出力するRubyスクリプトを書く。テンプレートにRubyスクリプトを書くため、テンプレートデータが汚染されていると(外部からの入力だと)セキュリティエラーが発生する。テンプレートデータの汚染マークを明示的に取り除く必要がある。実際には、盲目的にuntaint()するとセキュリティ上の脆弱性となるので、テンプレートファイルがworld-writableでないかなど、十分な確認が必要となる。tmpl.expand(model)Amritaではテンプレートに埋め込まれたIDとRubyデータとのマッピングをモデルデータして作成し、これをテンプレートエンジンに与えて展開する。Tempuraでは、このマッピングを作成せず、テンプレートデータにRubyのデータへアクセスするスクリプトを直接埋め込む。いう文字列が得られ、これで要素の内容が置換される。Tempuraのやり方では、例えば要素の内容を文字列で置換するだけだったのを繰り返しにするときなど、モデルデータを変更したときにテンプレートの修正が必要になる可能性が高い。相互依存度が高く、このデザインは非常に不味い。要素を繰り返す場合は、次のようにする。_child_="i">(replaced)</li></ul>このテンプレートのためのモデルデータは、次のとおり。これ以外の部分は、上述のスクリプトと同じ。<li>最初の</li><li>二番目の</li></ul>これを組み合わせると、よくある表を作れる。</tr></table>モデルデータは次のようになる。</tr></table>属性値の置き換えも似たような感じで書く。_attr_style="fetch(:a)">スタイルを変更する</p>次のスクリプトでは、Tempura::Template.new_with_string()の第2引数として、文字コード変換器を渡している。tmpl.expand(model)文字コード変換器は、次のように書けばいい。これは日本語EUC用。適切にエスケープしなければならない。_attr_href="fetch(:o2)">(replaced)</a>次のモデルデータを与えてみる。"}実行結果は次のとおり。適切にエスケープされる。含む</a>イベントWebアプリケーションを製作する場合、aタグのhref属性値などを適切に設定する必要がある。Tempuraは、formとaを特別扱いし、この手間を減らしている。_event_属性は、formまたはaに書く。_event_を書いた場合、formではaction属性を省略し、aではhref属性を省略する。メソッドでイベントを処理するスクリプトを指定する。href='do.cgi?event=act2'>別アクション</a></div>do.cgiでは、eventコントロール値を見るだけで、処理を分岐できるようになる。ふーむ、この部分は少し便利かも。結論セキュリティへの考慮、モデルデータとテンプレートデータの分離という点で難点がある。