= Tempura - リファレンスマニュアル == テンプレートの書式 Tempuraのテンプレートは、REXMLでパース可能なXML形式のテキストとして表 現します。テンプレートは、(({REXML::Document.new}))に第一引数としてそ のまま渡されます。いくつかのXML属性とその値がTempuraの処理に利用されま す。 === XML属性 * _nil_ : XML要素を削除 * _child_ : XML要素の内容を属性値の評価結果で置換 * _self_ : XML要素自体を属性値の評価結果で置換 * _child_xml_ : XML要素の内容を属性値の評価結果をREXMLパースしたもので置換 * _self_xml_ : XML要素自体を属性値の評価結果をREXMLパースしたもので置換 * _attr_* : (接頭辞) XML属性とその値を置換 * _block_ : XML要素をブロックが呼ばれた回数分複製 * _event_ : aおよびform要素を「ユーザによるイベント」として変更 * _action_ : aおよびform要素において、_event_の送信先を変更 * _if_ : 属性値の評価結果が偽ならXML要素自体を削除 (暫定的に実装) * _unless_ : 属性値の評価結果が真ならXML要素自体を削除 (暫定的に実装) 以上のXML属性がTempuraによる展開の結果に影響を与えます。これらのXML属 性自身は、Tempuraによる展開の出力結果からは削除されます。 以降、各XML属性の仕様を説明します。 :_nil_ この属性を持つXML要素をまるごと削除します。XMLの仕様上、属性値を省略 することはできませんが、値は無視されます。 XHTMLをプレビューするとき などに、ダミーのXML要素を置くのに使うことができます。 例 (展開前): 例 (展開後): :_child_ この属性を持つXML要素の内容を、属性値を評価した結果で置き換えます。 属性値は、Rubyスクリプトとして実行時に指定された環境(binding)で評価 されます。ただし例外として、((<_block_>))属性の影響下にあるときには、 ブロックの環境で評価されます。 ((<_self_>))がXML要素自体をまるごと置き換えるのに対して、_child_では、 XML要素の内容を置き換えます。 評価の結果が: * nilだった場合、このXML要素自体を削除します。 * falseだった場合、何もしません。 * REXML::Childのインスタンスだった場合、そのまま置き換えます。 * その他のオブジェクトの場合、to_sで文字列にしてテキスト要素として置 き換えます。 例 (展開前):

current time

例 (展開後):

Wed Sep 17 17:47:35 JST 2003

:_self_ この属性を持つXML要素自体を、属性値を評価した結果で置き換えます。属 性値は、実行時に指定された環境(binding)でRubyスクリプトとして評価さ れます。ただし例外として、((<_block_>))属性の影響下にあるときには、 ブロックの環境で評価されます。 ((<_child_>))がXML要素自体ではなく内容を変更するのに対して、_self_で は、XML要素自体を置き換えます。 評価の結果が: * nilだった場合、このXML要素自体を削除します。 * falseだった場合、何もしません。 * REXML::Childのインスタンスだった場合、そのまま置き換えます。 * その他のオブジェクトの場合、to_sで文字列にしてテキスト要素として置 き換えます。 例 (展開前):

current time

例 (展開後): Wed Sep 17 17:47:35 JST 2003 :_child_xml_, _self_xml_ それぞれ_child_、_self_と基本的には同じです。しかし、評価の結果が、 nil・false・REXML::Childのインスタンスのいずれでもないとき(その他の オブジェクトの場合)の振舞いが異なります。 * nilだった場合、このXML要素自体を削除します。 * falseだった場合、何もしません。 * REXML::Childのインスタンスだった場合、そのまま置き換えられます。 ここまでは、それぞれ_child_、_self_と同じですが * その他のオブジェクトの場合、to_sで文字列にした評価結果をREXMLでパー スした結果で置き換えます。 となります。 _child_と_self_では、文字列に変換した評価結果がXML形式であろうがなか ろうが、まるごとテキスト要素として扱われます。 それに対して、_ child_xml_と_self_xml_では、文字列に変換した評価結果 をREXMLで一度パースします。したがってXML形式の文字列はREXML::Childの インスタンスとして扱われることになります。 この_xml_という接尾辞がつくXML属性は、評価結果がXML形式の文字列を返 すことが想定される場合、それを文字列でなくXML部品として扱いたいとき に使います。具体的には、XMLで書かれたTempura::Divテンプレートの中に、 Div標準のErbで書かれたDiv::Divテンプレートを埋め込むときなどに使います。 以下に、(({ @erbdiv.to_div(context)}))を評価した結果が (({"
hello
" }))という文字列を返す場合の、_xml_接尾辞の有無 による結果の違いを例示します。 * 例 - _xml_有 (展開前): hoge hoge * 例 - _xml_有 (展開後):
hello
hello
* 例 - _xml_無 (展開前): hoge hoge * 例 - _xml_無 (展開後): <div>hello</div> <div>hello</div> この結果から、ErbによるDiv::Divを埋め込む場合には、 _child_xml_や_self_xml_の方が役に立つだろうことが推測できるでしょうか。 :_attr_* (名前が_attr_で始まるXML属性) この属性を持つXML要素の指定された属性を、属性値を評価した結果を文字 列化したもので、置き換えます。_attr_*属性名の_attr_ を取り除いたもの が変更される属性(ターゲット属性)の名前になります。 属性値は、実行時に指定された環境(binding)でRubyスクリプトとして評価 されます。ただし例外として、((<_block_>))属性の影響下にあるときには、 ブロックの環境で評価されます。評価の結果により、以下のようにターゲッ ト属性を変更します。 * nilだった場合、ターゲット属性自体を削除 * falseだった場合、何もしません * それ以外の場合、ターゲット属性の値を評価結果を文字列にしたもので置換 例 (展開前):

hello world