quabbinの日記: [プログラミング] ウェブテンプレートエンジン 2
先日、ぼや~っとテンプレートエンジンについて考えていたところ、世の中にテンプレートエンジンは多数あるが、その表現にはあまり差異がないのでは? なんて疑問がわいて来ました。
そこで、ちょっと…どころじゃなく時間をかけて調査。
とはいっても、何の表現に視点を当てるかはハッキリとさせる必要があります。
そこでテンプレートエンジンの表現で基本となるものをざっと考えてみました。
まず一つ目は値の出力だろう。が、これは大体、$hogeだの${hoge}だの%hogeだの{hoge}、<%= hoge %>、<quabbin:value-of value="hoge" />といったパターンばかりで、まぁあまり差異がないでしょう。
…いや、結構あるか…。
おいといて。
そもそもテンプレートエンジンとはMVCで言うviewを担当するものなわけで、つまりテンプレートエンジンにおいて重要なのは表示系を要求どおり構築できるかというもの。
そのために、誰にとって・どのようにすれば分かりやすいかと言うのは、それぞれの思想が現れるところなるのではないでしょうか。
このうち、「誰にとって」は「どのように」に内包されるのではないかと仮定し、その「どのように」は条件分岐と繰返し表現の二要素に集約されるのではないかと考え(根拠は薄弱ですが)、調べてみる事としました。
以下、注意書き。
・ここで扱う「テンプレートエンジン」としているものは、例えばVelocityのような一般的にテンプレートエンジンと呼ばれるもののみでなく、ASPやJSPのようなものも扱います。
・SQLの出力用とかの、HTMLがターゲットに無いエンジンは扱いません。
・JavadocなどのドキュメントHTML生成ツールのようなものも扱いません。
・まだPyPI、PEAR、RubyForgeは調査し切れてません。いつか追加調査したいと考えています。
・表現だけ急いで調査をしたため、間違いが含まれているかもしれません。見つけた場合はコメントにて指摘を願います。
ASPに似ている方式
ifやforeachのといった制御構文の周りに開始記述・終了記述があり、各々記号一つか二つで表現されているタイプ。
要するに
<% if(test){ %>
show somthing
<% } %>
とか
{- if(test) -}
show somthing
{- end -}
または
[ if(test) ]
show somthing
[ end ]
のような表現方法のもの。
・JSP(Java)
・ASP(ActiveScript)
・PHP(PHP)
・eRuby(Ruby)
・Simpley(PHP)
・ClearSilver(C)
・Template Toolkit(Perl)
・MuMu(PHP)
・Savant(PHP)
・AvanTemplate(PHP)
・Brian Lozier’s php based template engine(PHP)
・BTE (Better Templates for Everyone)(Java)
・Jamon(Java)
・Tea(Java)
・Jxp(JavaScript)
・Canvas(Groovy)
・FryPHP(PHP)
・Tenjin(Ruby/Python/Perl/PHP/JavaScript)
・Yapter(PHP)
・Heyes Template Class(PHP)
・Jinja(Python)
・Django(Python)
・PEAR::HTML_Template_Flexy(PHP)
・SimpleT(PHP)
・Vemplator(PHP)
・Genshi(Python)
・cstemplate(Ruby)
・pagetemplate(Ruby)
・xtemplate(Ruby)
・rote(Ruby)
・webgen(Ruby)
・blogtari(Ruby)
・erubis(Ruby)
・tmplc(Ruby)
XML namespace
制御構文の開始・終了がxml namespaceを用いているタイプ。つまり
<quabbin:if test="...">
show something
</quabbin:if>
とか
<div quabbin:if="test...">
show something
</div>
といった表現方法のもの。
・XSL(XML)
・Tag Libraries(Java)
・JSF(Java)
・ASP.NET(.NET)・Cocoon(Java)
・Tapestry(Java)
・patTemplate(PHP)
・facelets(Java)
・Nirvana(Java) # 開発中止?
・Struts(Java)
・Shale(Java)
・Wicket(Java)
・Kid(Python)
・Nevow(Python)
・SimpleTAL(Python)
・bTemplate(PHP)
・Mayaa(Java)
・WACT(PHP)
・PHPTAL(PHP)
・JBYTE(Java)
・SiteMesh(Java)
・LSP(Java)
・IKAT(Java)
・Asp.NET HTML Template Engine(.NET)
・Evolve MasterPages(.NET)
・web.template(PHP)
・Bleetz(PHP)
・misen(Ruby)
・Radius(Ruby)
・GSP(Groovy)
・XSP(Cocoon)(Java)
・JXTemplate(Cocoon)(Java)
・Commons Jexl
コメントタグ
制御構文の開始・終了をHTMLのコメント表現に埋め込まれているタイプ。
<!-- QUABBIN IF -->
show something
<!-- END IF --->
といった表現方法のもの。
・Sifter(PHP/Perl/Ruby)
・OO Template Class(PHP)
・PEAR::HTML_Template_IT(PHP)
・Grafx Software’s Fast Template[ 参考](PHP)
・TemplatePower Layout Solution(PHP)
・PHP Class for Parsing Dreamweaver templates(PHP)
・MiniTemplator (Template Engine)(Java/PHP/VB/VBA)
・JDynamiTe(Java)
・Jtpl(Java)
・XTemplate(PHP)
・SSTP (Server-Side Template Parser)(PHP)
・ecTemplate(PHP)
・Qtpl(PHP)
・Virtual Template(PHP)
・QuickTemplate(PHP)
・FastTemplate(PHP)
・siki-template(Ruby) # ドキュメントなし。コードから…ちゃんと読めてるだろうか…
独自エレメント
独自のエレメント定義またはそれに近い形式になっているタイプ。
<QUABBIN_IF>
show something
</QUABBIN_IF>
とか
#QUABBIN_IF#
show something
#/QUABBIN_IF#
といった表現方法のもの。(前者と後者では思想に大きな隔たりがあるけど、ここでは無視)
・FreeMarker(Perl)
・HTML::Template(Perl)
・STP Simple Template Parser(PHP)
・ETS - easy template system(PHP)
・vlibTemplate(PHP)
・TagTemplate(PHP)
・htmltmpl: templating engine(PHP/Python)
・FreeMarker(Java)
・Dynamator(Java/ASP/PHP/XML)
・Bluprints(Java) # どちらかというとページフローエンジン?
・Open Power Template(PHP)
・Template Lite(PHP)
・phemplate(PHP)
・SledgeHammer(PHP)
・PHPService(PHP)
・canny(Ruby)
・Smarty(PHP)
独自アトリビュート
アトリビュートに独自の形式を持たせてある物。例えば
<div quabbin_if="test">show something</div>
といった表現方法のもの。
・Tempura(Ruby)
・htree(Ruby)
IDアトリビュート
IDアトリビュートを利用して、コントローラからビューを制御しているもの。例えば
<div id="hoge"></div>
としておき、コントローラで
hash = Hash.new
hash["hoge"] = "show something"
call_template(hash)
のような事をやって組み立てる形式。
・Amrita(Ruby)
・kwartz(Ruby)
・cerise(Ruby)
・Kahua(Scheme)
Wiki文法
・deplate(Ruby)
DSL
元の言語に対して文法拡張をしたタイプ。DOMのような操作。
・markaby(Ruby)
・RubyWaves(Ruby)
・Lift(Scala)
独自定義
上記に当てはまらない独特な制御構文を持っているもの。例えば
#quabbin if test
show something
#quabbin end
といった表現方法、その他例外的な表現方法のもの。
・Velocity(Java)
・NVelocity(.NET)
・Cheetah(Python)
・Mako(Python)
・Simple Template(JavaScript)
・CodeIgniter Template class(PHP)
・PEAR::HTML_Template_Xipe[旧SimpleTemplate](PHP) # 詳細ドキュメントなし
・TinyButStrong(PHP)
・StringTemplate(Java/C#/Python)
・WebMacro(Java)
・YATS(PHP)
・Templeet(PHP)
・HAML(Ruby)
・html-template(Ruby)
・ruby-template(Ruby)
・rednails(Ruby)
・kashmir(Ruby)
・nukumi2(Ruby)
・rubyjournal(Ruby)
・ruwiki(Ruby)
・Amrita2(Ruby)
コントローラ任せ(テンプレート結合型)
テンプレートには置換ポインタのみ表現し、コントローラで内容を記述もしくは内容となるテンプレートを設定する方法。
・Text::SimpleTemplate(PHP)
・DTemplate(PHP)
・Layout Solution(PHP)
・Cached Fast Template(PHP)
・EnzymeTemplates(PHP)
・CGI::FastTemplate(Perl)
コントローラ任せ(出力可否)
テンプレートは置換ポインタのみの表現で、表示可否や繰り返し表現は、コントローラ側で文字列を作成して対応させる方式。
・VarPage(旧ShellPage)[参考](PHP) # 開発終了?
・EasyTemplatePHP(PHP) # 開発終了? 詳しい資料無し。archive.orgに残ってた内容から推察
・VOOT (Vanilla Object Oriented Templates)(PHP)
判定不能
入手困難かつ解説が見あたらないため、判断ができないもの
(以下のリンクは404なところが多く含まれています)
・Simple Turtle PHP Template(PHP) # 開発終了?
・Netro[参考](.NET) # 開発終了?
・html-tmpl-tools(Ruby) # 開発終了?
・mortar(Ruby) # 開発終了?
・efl(Ruby) # ソースコードを解読するのが難しい…
・gemsite(Ruby) # OCaml方面で活動しているRyan Tarpine(この人?)の作らしいけど、無かったことになっているのだろうか、コードすら入手できない状態
・nora(Ruby) # 開発終了?
・radical(Ruby) # 開発終了?
・rweb(Ruby) # 開発終了?
・strongtyping(Ruby) # 開発終了?
=============================================================================
調査をしている中で、やはりこの条件分岐に対する考え方というのはそれぞれのテンプレートエンジンで特徴があり、またWEBに対するそれぞれ独自な考察の結果が強く表現されているように感じました。
また、多くはフレームワークではなくライブラリとして実装されており、フレームワークになるまでの重厚さを持った実装はなかなか難しいのだと実感させられました。
詳しい考察はまた後日。
参考1: ≫ Top 25 PHP template engines:
参考2: Programming Resources, News and Ideas: 60+ template engines for JAVA, PHP and .NET:
参考3: RAA
多謝 : 数え切れないほど多くのblog、サイト
追記 2008-06-29
shimashimaさんの指摘を受けて、Cocoonで利用するテンプレートを個別技術ごとに分けました。shimashimaさん、ありがとうございました。
Cocoonは色々 (スコア:1)
私がいますぐに出てくるところで、
もっとも、Cocoon独自のViewTemplateというとXSPとJXTemplate、Jexlくらいでしょうか。
…結局XMLベースなのにはかわらないので、quabbinさんの分類で正しいのは確かですね。
Re:Cocoonは色々 (スコア:1)
実は、確かCocoon1の頃の記憶だとホボXSLTベースだったなぁ…と思って書いてしまっていて、そこまで調べきれていなかったです。
情報ありがとうございました。
それぞれ別で項目立てします。