最新バージョンは 0.1.2r3 です。
Tempura は、XML(XHTMLなど)で書かれたテンプレートと実データ(任意のオブ ジェクト)を結び付け、生きたXML文書を生成するための、いわゆるテンプレー トライブラリです。オブジェクト指向スクリプト言語Ruby用のライブラリとし て実装されています。
Tempuraでは、XML準拠形式*1の テキストをテンプレートとします。テンプレートは、そのままWEBブラウ ザでプレビューすることが可能です。また多くのHTMLエディタでの編集も 可能(なはず)です。テーブルなどで検索結果を列挙するようなビューのプ レビューにも対応できるように工夫されています。
Tempuraでは、テンプレート内の特定のXML属性だけが展開に作用します。 Tempura用のXML属性は、どのXML要素に対しても効果を与えることができ ます。展開に作用するXML属性名には、他のソフトウェアやCSSと比較的衝 突しにくい名前を採用しています。
配列やハッシュだけでなく任意のRubyオブジェクトを、モデルデータとし てそのまま使用可能です。
画面デザインとアプリケーションロジックを明確に分離できます。見た目 を重視するようなWEBアプリケーションの開発において、画面デザイン担 当者(WEBデザイナー)とプログラマの作業が、それぞれ影響されにくく独 立してすすめやすくなります。
WEBアプリケーションをイベント駆動のGUIアプリケーションという視点で 見たときに、ユーザの操作によるイベントを簡単に扱う仕組みを持ってい ます。この仕組みは、HTMLのa要素やform要素によるユーザのアプリケー ション操作とメソッド呼び出しの関係の抽象化をサポートします。
WEBアプリケーションフレームワークDivのためのライブラリ部品を装備し ています。Divのテンプレートとして、Erbに加えて、プレビュー可能な HTMLを使うことが可能になります。
特色のところを読んで、どこかで読んだことのある文句だと感じた方も多いか もしれません。Tempuraと同種のテンプレートライブラリはすでに数多く存在 します。Tempuraに比較的近いもの・Tempuraが影響を受けているものとしては、 Ruby用のテンプレートライブラリである amritaや XTemplateなどがあげられま す。
では、なぜあえて新たにTempuraを作ったのでしょうか?理由は、amrita や XTemplateなどに見られる利点である「プレビュー可能なテンプレート」と、 Ruby で書かれたWeb アプリケーションフレームワークDivなどに見られる利点 である「ユーザ操作を抽象的に扱うイベント駆動型プログラミング」を同時に 行いたい、というところにありました。
DivのGUIアプリケーション風イベント駆動型プログラミングでは、eRuby で記 述したビューから a や form などのメソッドを呼ぶことにより、 type='hidden' を持つinput要素を利用したメソッド呼出へのマッピングなど の泥くさい部分を隠すことができます。ユーザによる操作*2が抽象化され、対応するメソッド呼出との関係をシンプ ルに扱うことができるわけです。しかし、eRuby によるビューは、HTMLとして 特殊な構文のために、視覚上のデザインをそのままHTMLブラウザで確認するこ とができません。
一方、amirtaやXTemplateでは、テンプレート(ビュー)はそのままHTMLであり、 「視覚上のデザインをそのままHTMLブラウザで確認」することができます。し かし、テンプレートの中で、ユーザによる操作(イベント)をメソッド呼出にマッ プするためには、form要素・hidden型のinput要素・a要素のhref属性などを、 生のHTMLとして記述する必要が出てくるでしょう。
こういったことをふまえた上で、Tempuraは
を考慮したテンプレートライブラリとして、作成されました。
<body> <table border="1"> <tr><th>name</th><th>author</th></tr> <tr _block_="items//each//item"> <td _child_="item.name">(will be replaced with a name of each item)</td> <td _child_="item.author">(will be replaced with an author of each item)</td> </tr> </table> <form method="POST" _event_="add"> name: <input type="text" name="name"/> author: <input type="text" name="author"/> <input type="submit" value="Add"/> </form> </body>
class Item attr_reader :name, :author def initialize(name, author) @name = name @author = author end end class ItemContainer attr_reader :items def initialize @items = [] end def add(name, author) @items << Item.new(name, author) end end
data = ItemContainer.new data.add("Ruby", "matz") data.add("Perl", "Larry Wall") data.add("Python", "Guido")
tmpl = Tempura::Template.new( テンプレート ) tmpl.default_action = "myapp.cgi" puts tmpl.expand(data)
<body> <table border='1'> <tr><th>name</th><th>author</th></tr> <tr> <td>Ruby</td> <td>matz</td> </tr><tr> <td>Perl</td> <td>Larry Wall</td> </tr><tr> <td>Python</td> <td>Guido</td> </tr> </table> <form action='myapp.cgi' method='POST'><input name='event' type='hidden' value='add'/> name: <input name='name' type='text'/> author: <input name='author' type='text'/> <input type='submit' value='Add'/> </form> </body>
それぞれ以下からダウンロード可能です。
<URL:http://www.fobj.com/tempura/files/>からダウンロードできます。
$ ruby install.rb
-dオプションでインストール先を指定することができます。
$ ruby install.rb -d {anywhere}
Tempuraに含まれるソースコードおよびドキュメントは藤本尚邦が著作権を保持 します。それらのファイルは GNU Lesser General Public Licence version 2 に従って配布するものとします。
本プログラムは無保証です。作者は、本プログラムをサポートする意志はあり ますが、プログラム自身のバグ、あるいは、本プログラムの実行などから発生 するいかなる損害に対しても責任を持ちません。
<URL:http://www.fobj.com/tempura/>
藤本尚邦 <hisa at fobj.com>