カテゴリ別 2003年 | 2004年 | 2005年 | 2006年 | 2007年 | 2008年
知り合いサイト: よんだもの / 暴想 / Linuxでやる夫 / 新宿Vipper / 僕だけが幸せになればいいのに。
Rubyについて Part 7@2ch プログラム技術板のレス 348 より。
Ruby で作成されたテンプレートシステム。IPA の平成15年度未踏ソフトウェア創造事業のプロジェクトの「プレゼンテーション層を2つに分割した、Web用超高速テンプレートシステムの開発」の成果ですね。
Kwartz は、プレゼンテーションデータとプレゼンテーションロジックからなるテンプレートから、中間言語を介して各種言語(Ruby、PHP、JSP、eRuby、ERB、Velocity など)の出力用スクリプトを生成する戦略を採っています。
ロジックを記述するための中間言語を用意しているのが興味深いです。制御構文のキーワード(while など)がテンプレートに入るのはしょうがないのかな。Amrita のルールの少なさ・単純さを好んでいますので、移行するかどうかは分かりませんが、要チェックです。
Amrita と空要素タグの続きです。ソースを少し追いかけてみました。属性がない場合には終了タグが省略され、値が空ではない属性があると終了タグも出力されるようです(コードサンプル1)。
[サンプルコード1] amrita 1.8.2 使用
require 'amrita/template'
Amrita::TemplateText.new('<br>').expand(STDOUT, nil)
#=> <br />
Amrita::TemplateText.new('<img src="">').expand(STDOUT, nil)
#=> <img src="" />
Amrita::TemplateText.new('<img src="a.png">').expand(STDOUT, nil)
#=> <img src="a.png"></img>
内部の HTML パーサがテンプレートをコマンド(HTML 生成メソッドのコード)に変換しますので(template.rb:179)、上のサンプルコードの三つのテンプレートテキストは以下のコマンドになります。
e(:br) e(:img,:src=>"") e(:img,:src=>"a.png")
これがコンパイラにかけられ、VM 用のコードにさらに変換されるのですが、変換は convert_to_bytecode メソッドで行われます(compiler.rb:546、この場合は ElementCommon モジュール)。
e(:br) -> ByteCode::PrintStaticNode[ self ]
e(:img,:src=>"") -> ByteCode::PrintStaticNode[ self ]
e(:img,:src=>"a.png") -> ByteCode::Sequence[
ByteCode::ExtractData[exattrs],
ByteCode::MergeElement[self],
ByteCode::PrintDynamicElement[
ByteCode::ExtractData[exattrs],
ByteCode::MergeElement[self],
ByteCode::PrintDynamicElement[
body.convert_to_bytecode(compiler),
]
]
ということで、属性に値が存在する場合には生成される VM 用のコードが異なることが分かりました。これはテンプレートにて @ で始まる属性値を展開するためだと思います。
ここで力尽きたので続きはまた今度。
最近のコメント:
RSS
![]()
This work is licensed under a
Creative Commons License
(note: text only. w/o web design, citations, (re)distributed softwares).