Tempura - TEMPlate Utility for Ruby Application

[リファレンス] [変更履歴] [ダウンロード]

最新バージョンは 0.1.2r3 です。

概要

Tempura は、XML(XHTMLなど)で書かれたテンプレートと実データ(任意のオブ ジェクト)を結び付け、生きたXML文書を生成するための、いわゆるテンプレー トライブラリです。オブジェクト指向スクリプト言語Ruby用のライブラリとし て実装されています。

特色

プレビュー可能なXML形式の文書によるテンプレート

Tempuraでは、XML準拠形式*1の テキストをテンプレートとします。テンプレートは、そのままWEBブラウ ザでプレビューすることが可能です。また多くのHTMLエディタでの編集も 可能(なはず)です。テーブルなどで検索結果を列挙するようなビューのプ レビューにも対応できるように工夫されています。

数種類の特別な属性名を持つXML属性のみが展開に作用

Tempuraでは、テンプレート内の特定のXML属性だけが展開に作用します。 Tempura用のXML属性は、どのXML要素に対しても効果を与えることができ ます。展開に作用するXML属性名には、他のソフトウェアやCSSと比較的衝 突しにくい名前を採用しています。

モデルデータは任意のRubyオブジェクト

配列やハッシュだけでなく任意のRubyオブジェクトを、モデルデータとし てそのまま使用可能です。

ビューとモデルの分離

画面デザインとアプリケーションロジックを明確に分離できます。見た目 を重視するようなWEBアプリケーションの開発において、画面デザイン担 当者(WEBデザイナー)とプログラマの作業が、それぞれ影響されにくく独 立してすすめやすくなります。

イベント駆動型WEBアプリケーションのサポート

WEBアプリケーションをイベント駆動のGUIアプリケーションという視点で 見たときに、ユーザの操作によるイベントを簡単に扱う仕組みを持ってい ます。この仕組みは、HTMLのa要素やform要素によるユーザのアプリケー ション操作とメソッド呼び出しの関係の抽象化をサポートします。

WEBアプリケーションフレームワークDiv用のライブラリ部品

WEBアプリケーションフレームワークDivのためのライブラリ部品を装備し ています。Divのテンプレートとして、Erbに加えて、プレビュー可能な HTMLを使うことが可能になります。

開発の理由

特色のところを読んで、どこかで読んだことのある文句だと感じた方も多いか もしれません。Tempuraと同種のテンプレートライブラリはすでに数多く存在 します。Tempuraに比較的近いもの・Tempuraが影響を受けているものとしては、 Ruby用のテンプレートライブラリである amritaXTemplateなどがあげられま す。

では、なぜあえて新たに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>


*1 REXMLライブラリでパース可能な形式
*2Tempura ではイ ベントと呼びます