Tempura : tempura.ja.rd

# 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用のテンプレートライブラリである 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は

- プレビュー可能なテンプレート
- 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>

## ドキュメント

- リファレンスマニュアル
- 変更履歴

## 実行環境

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

- 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.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ライブラリでパース可能な形式
*2 Tempura ではイ ベントと呼びます