AmritaはRuby用のHTML/XMLテンプレートエンジンです。その改造版を置いています。
Amritaはテンプレートエンジンと呼ばれるものの一つです。Webアプリケーションなど、動的にHTMLデータを生成するプログラムで使います。
これまでは、HTMLにプログラムを埋め込んだり、逆にプログラムにHTMLデータを散りばめたりするものばかりで、どうしてもデザインとロジックが混ざってしまいました。テンプレートエンジンを使うと、HTMLデータとプログラムをほぼ完全に分離できます。
テンプレートエンジンは、あらかじめ何らかのマーク(目印)を付けておいたHTMLデータに、様々なデータを埋め込んでいきます。Amritaはほかのテンプレートエンジンと異なり、テンプレートがHTMLそのままです。
例えば、テンプレートであるHTMLデータとそのHTMLデータに値を埋め込むプログラムは、次のようになります。
<p id="text">ここを置き換える</p>
require "amrita/template" model = {:text => "はろーわーるど"} # これがモデル(マッピング)データ tmpl = Amrita::TemplateFile.new("sample.html") tmpl.expand($stdout, model)
出力結果は次のとおりです。
<p>はろーわーるど</p>
Amrita::Template#expand()に、出力先と、テンプレートに埋め込むデータを指すマッピングデータを渡します。
詳しい使い方は、基礎から学ぶWebデータベースプログラミング を参照してください。
Amritaには、安定版であるバージョン1.0系列と開発版である1.8系列がありました。1.8系列は(初期設定のままで)属性値の置き換えができる、高速、などの特徴がありました。
拙著の基礎から学ぶWebデータベースプログラミングでも、属性値の置換をしたかったのと、開発版でもありバグがあっても早晩改修されるだろうと考えて、1.8系列を使っていました。
しかし、1.8系列の新版はいつになっても出てきません。いくつか看過できない重大なバグがあり、仕方ないので自分で直そうと思いましたが、内部が複雑怪奇でどのように手を付けたらいいか分かりませんでした。
そこで、1.8系列用に書かれたテンプレートとRubyスクリプトをAmrita 1.0系列でも動作するようにしました。
amrita-alteredは、基本的にはバグ修正が中心であり、既存のプログラムが動作しなくなるような変更はしないつもりです。
属性値の展開方法がAmrita 1.0.xオリジナルとAmrita 1.8.xでは異なるのですが、amrita-alteredは、モードを切り替えることで、どちらを対象としたプログラムであってもそのまま動くようにしています。
Amrita 1.0.xオリジナルでは、HTMLタグの属性値を展開するには、Amrita::Template#expand_attr をtrueにする必要がありました。amrita-alteredは、この場合にAmrita 1.0.x互換モードで動作します。そうでないときはAmrita 1.8.xに合わせた動作になります。
デフォルト | expand_attr=true | |
---|---|---|
Amrita 1.0 オリジナル | 属性値を展開しない。 | 属性値を展開する。属性は要素と並列。 |
Amrita 1.8 | 展開する。属性は要素の子 | expand_attrがなく、エラーになる。 |
amrita-altered | 展開する。属性は要素の子 | 展開する。属性は要素と並列。 |
オリジナルのAmrita 1.0.2は、属性指定と要素指定とを並列に扱うため、要素の内容であるテキストと属性値の両方を置換するには、次のように書きます。なお、tid属性はAmritaでの置換対象を表します。
<ul> <span tid="item"><li tid="text" style="@s">here is replaced</li></span> </ul>
model = { :item => [ {:s => "color:black", :text => "テキスト1"}, {:s => "color:red", :text => "テキスト2"} ] } tmpl.amrita_id = "tid" tmpl.expand_attr = true # Amrita 1.0モード tmpl.expand($stdout, model)
展開する前のHTMLデータは、HTMLとしてかなり不自然です。
Amrita 1.8.2およびamrita-alteredのデフォルトでは、HTMLデータを次のように書きます。モデルデータは上と同じです。
<ul> <li tid="item" style="@s"><span tid="text">here is replaced</span></li> </ul>
属性は、要素の子と考えるようになっています。
Amritaのテンプレートは、HTMLデータかXMLデータです。テンプレートのパーサは、Template#xml=で切り替えます。これがfalse(デフォルト)のときはHTMLパーサを、trueのときはXMLパーサを使います。
XMLモードのときは、RDFなどHTML以外のデータも扱えるように、HTMLとしての妥当性検査は行いません。例えばhrという名前の要素であっても、内容を持つことができます。
xml | asxml | 動作 |
---|---|---|
false(デフォルト) | false(デフォルト) | テンプレートはHTMLデータ。出力時にHTMLの妥当性検査を行う。 |
false | true | テンプレートはHTMLデータ。出力時にHTMLの妥当性検査を行う。XHTMLとして出力。 |
true | 無視 | テンプレートはXMLデータ。出力はXMLスタイル。出力時に妥当性検査を省略。 |
amrita-altered 1.1で導入した機能です。
表を出力するときに、次のように交互に色を変えたいことがあります。
ABC | 123 |
DEF | 456 |
オリジナルのamritaでは、style属性値をRubyソースに書く必要があり、またRubyソースが煩雑でした。amrita-alteredでは、次のようにテンプレートを書きます。id属性値の末尾に「+」を付けます。
<table style="border:solid black 1px"> <tr id="line+" style="background-color:white"><td id="x"><td id="y"> <tr id="line+" style="background-color:#CCFFCC"><td id="x"><td id="y"> </table>
Rubyスクリプトは、次のようにします。
model = { :line => [ {:x => "ABC", :y => 123}, {:x => "DEF", :y => 456}, {:x => "GHI", :y => 789} ] } tmpl.expand(STDOUT, model)
出力は、次のようになります。(手で改行を入れています。)
<table style="border:solid black 1px"> <tr style="background-color:white"> <td>ABC</td><td>123</td> </tr> <tr style="background-color:#CCFFCC"> <td>DEF</td><td>456</td> </tr> <tr style="background-color:white"> <td>GHI</td><td>789</td> </tr> </table>
Ruby'sライセンスです。
リリースされてない最新状態は, gitリポジトリから入手できます。
$ git clone https://gitlab.com/netsphere/small-bag.git $ git filter-branch --subdirectory-filter amrita-altered HEAD
次のページで, ソースコードを閲覧することもできます。
以下は、すべてオリジナル版へのパッチになっています。
オリジナル版;amrita-1.0.2.tar.gz (ローカルコピー)