Trimpath JavaScript Templates
JavaScriptでもDjangoのテンプレートを使いたい, と思うのは私だけではないらしく,既に作った人がいた.
Django Template Language in JavaScript - Ajaxian
でもこれはDojoフレームワークの一部なので, 単品で使うことは難しそうだ. こんなまとめページもあった. ただ, 2年前のなので, ちょっと情報は古いのかもしれない.
なんとprototype.jsにもテンプレート機能があるらしい! と思って調べてみたら,単なる文字列置換機能でかなり貧弱.
いくつか見てみたが, ここにある, Trimpath JavaScript Templatesが良さそうだ. これもTrimpathというより大きなプロジェクトの一部なのが微妙だが, テンプレート単体で運用できる.
面白いのは, テンプレートをhidden なtextareaに書いておくことが推奨されていること.
なるほど, それならHTML本体にテンプレートを埋め込んでおくことができて, 便利だ. こんな感じで使うことができる.
<html> <head> <script language="javascript" src="trimpath-template-1.0.38.js"></script> <script language="javascript" src="prototype.js"></script> <script language="javascript"> var data = { items : [1,2,3,4,5], } function render(){ var result = TrimPath.processDOMTemplate("template", data); $("toShow").innerHTML = result; } </script> </head> <body> <button onclick="render()">render</button> <textarea id="template" style="display:none;"> <ul> {for item in items} <li> ${item} </li> {/for} </ul> </textarea> <div id="toShow"> </div> </body> </html>
Trimpath JavaScript Templates は, Djangoテンプレートよりも強力で, テンプレート内に任意の式を書くことができる. こんな風に比較式の中身も思いのまま.
{if items.length > 0} <ul> {for item in items} <li> ${item} </li> {/for} </ul> {/if}
Djangoのテンプレートでは変数と変数プロパティの参照はできるけど, 例えば関数の実行なんかはできない.
これだと, テンプレートの中で副作用のある式をがんがん実行できてしまったりして, 実行の順序やら回数やら, 深く考え始めると面倒な問題がいろいろありそうだ.機能が強力すぎるので, テンプレート主導でページを書くこともできてしまいそう. そうなると, ページのロジックと表示部分の分離という観点からは, 好ましくないだろう.
Djangoテンプレートで任意の式が書けないのは, そういう問題をさけるためなのかも.単にパーザが面倒だったのかもしれないけど. __get__()を再定義してしまえば, 副作用を持たせることもできてしまいそうだし.
ちなみに, Trimpath JavaScript Templatesにはマクロ機能まであるようだ. 便利ではあるだろうけど, ちょっとやり過ぎのような気がしないでもない.