= Tempura - TEMPlate Utility for Ruby Application

[((<リファレンス|URL:references.ja.html>))]
[((<変更履歴|URL:changes.ja.html>))]
[((<ダウンロード|URL:http://www.imasy.or.jp/~hisa/ruby/tempura/files/>))]

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

== 概要

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

=== 特色

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

    Tempuraでは、XML準拠形式((- REXMLライブラリでパース可能な形式-))の
    テキストをテンプレートとします。テンプレートは、そのまま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用のテンプレートライブラリである
((<amrita|URL:http://www.brain-tokyo.jp/research/amrita/>))や
((<XTemplate|URL:http://xtemplate.sourceforge.net/>))などがあげられま
す。

では、なぜあえて新たにTempuraを作ったのでしょうか？理由は、amrita や
XTemplateなどに見られる利点である「プレビュー可能なテンプレート」と、
Ruby で書かれたWeb アプリケーションフレームワークDivなどに見られる利点
である「ユーザ操作を抽象的に扱うイベント駆動型プログラミング」を同時に
行いたい、というところにありました。

DivのGUIアプリケーション風イベント駆動型プログラミングでは、eRuby で記
述したビューから a や form などのメソッドを呼ぶことにより、
type='hidden' を持つinput要素を利用したメソッド呼出へのマッピングなど
の泥くさい部分を隠すことができます。ユーザによる操作((-Tempura ではイ
ベントと呼びます-))が抽象化され、対応するメソッド呼出との関係をシンプ
ルに扱うことができるわけです。しかし、eRuby によるビューは、HTMLとして
特殊な構文のために、視覚上のデザインをそのままHTMLブラウザで確認するこ
とができません。

一方、amirtaやXTemplateでは、テンプレート(ビュー)はそのままHTMLであり、
「視覚上のデザインをそのままHTMLブラウザで確認」することができます。し
かし、テンプレートの中で、ユーザによる操作(イベント)をメソッド呼出にマッ
プするためには、form要素・hidden型のinput要素・a要素のhref属性などを、
生のHTMLとして記述する必要が出てくるでしょう。

こういったことをふまえた上で、Tempuraは

  * プレビュー可能なテンプレート
  * Webアプリケーションでのユーザ操作の抽象化

を考慮したテンプレートライブラリとして、作成されました。


== 使用例

=== テンプレート:

  <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:references.ja.html>))
* ((<変更履歴|URL:changes.ja.html>))


== 実行環境

=== 最低限必要なソフトウェア

  * Ruby       - 1.6 以降
  * REXML      - XMLパーサ。Ruby 1.8 には標準添付

=== ユニットテストを実行するために必要なソフトウェア

  * Test::Unit - ユニットテストのためのライブラリ。Ruby 1.8 には標準添付
  * uconv      - utf8とeucの変換のためのライブラリ

=== より便利に使うために推奨するソフトウェア

  * Div        - WEBアプリケーションフレームワーク
  * WEBrick    - HTTPサーバーとして簡単に使える。Ruby 1.8 には標準添付

それぞれ以下からダウンロード可能です。

* Ruby       - ((<URL:http://www.ruby-lang.org/>))
* REXML      - ((<URL:http://raa.ruby-lang.org/list.rhtml?name=rexml>))
* Test::Unit - ((<URL:http://raa.ruby-lang.org/list.rhtml?name=testunit>))
* uconv      - ((<URL:http://raa.ruby-lang.org/list.rhtml?name=uconv>))
* Div        - ((<URL:http://raa.ruby-lang.org/list.rhtml?name=div>))
* WEBrick    - ((<URL:http://raa.ruby-lang.org/list.rhtml?name=webrick>))


== ダウンロード

((<URL:http://www.imasy.or.jp/~hisa/ruby/tempura/files/>))からダウンロー
ドできます。


== インストール

  $ ruby install.rb

-dオプションでインストール先を指定することができます。

  $ ruby install.rb -d {anywhere}


== ライセンス

Tempuraに含まれるソースコードおよびドキュメントは藤本尚邦が著作権を保持
します。それらのファイルは GNU Lesser General Public Licence version 2
に従って配布するものとします。


== 免責事項

本プログラムは無保証です。作者は、本プログラムをサポートする意志はあり
ますが、プログラム自身のバグ、あるいは、本プログラムの実行などから発生
するいかなる損害に対しても責任を持ちません。


== ホームページ

((<URL:http://www.imasy.or.jp/~hisa/ruby/tempura/>))


藤本尚邦 <hisa@imasy.or.jp>
