こんなテンプレートエンジンほしい

  • なぜ、いちいちエスケープを手動で指定しなければいけないのか
  • 文脈によって、自動的にエスケープ手法は決定できるはず

と思ってます。

テンプレートエンジン作りたい - kazuhoのメモ置き場

ですよねー。

で,そのへんを自然に取り込んでいるのが,おもに Python 方面で人気のある XML ベースのテンプレートシステムだと思います。

実際,Genshi のドキュメントにも

The main feature is a template language that is smart about markup: unlike conventional template languages that only deal with bytes and (if you're lucky) characters, Genshi knows the difference between tags, attributes, and actual text nodes, and uses that knowledge to your advantage. For example:

  • Intelligent automatic escaping greatly reduces the risk of opening up your site to cross-site scripting attacks (XSS).
Genshi

なんて書いてあります。


XML ベースのテンプレートエンジンというと,げ,XSL みたいなの?と思いがちですが,

<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:py="http://genshi.edgewall.org/"
      lang="en">
  <div py:if="foo">
    <p>Bar</p>
  </div>
  <ul>
    <li py:for="item in items">${item}</li>
  </ul>
</html>
Documentation/xml-templates.html – Genshi

たとえば Genshi や Kid はこんな感じで直感的に理解可能な構文になっており,XML namespace の機能を使ってるので XML としても「自然」なんです。

んでしばらく前に Perl の Genshi みたいなのってないなぁ暇ができたらつくりたいなぁと思ってたんですが*1,当時は真剣に探してなかった*2ことが判明しました。いま検索してみたら,さっくりと NenshiPetalTemplate::TAL というのがみつかりました*3


ただ XML ベースの「一見直感的」なテンプレート構文にも問題点がありまして。厳格な XML ベースにしてしまうと valid な XML でないと通らないエンジンになってしまいます。たとえば,

<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:py="http://genshi.edgewall.org/">
  <p>
    <py:if test="foo"><strong></py:if>
      Hoge ...
    <py:if test="foo"></strong></py:if>
  </p>
</html>

思わずこんなの書くユーザがいると思うのですが,これは valid でないので通らないと思います。

とあんなこんなで,結局プログラマーの自己満足にすぎないのかなと思ったのと,忙しいというのがあって手をつけずにいました。


id:kazuhooku さんはおそらく軽量ウェブフレームワークに同梱できるようなコンパクトなものを指向なさっていると思うのであまり関係ないかと思いますが,便乗して最近(Perl の)テンプレートエンジンについて考えていることをつらつらと書いてみました。

まとめ
  • Genshi みたいな XML 系テンプレートエンジンがほしい
  • できれば libxml2 + C によるライブラリ + 各スクリプト言語へのバインディング
    • ライブラリというよりミドルウェア
    • だって各スクリプト言語ごとに実装をつくるのって,おたがい無駄なことしてるみたいじゃね?
    • 各言語によってテンプレート言語の差異が少ないとデザイナへの訴求力も高くね?
    • パース結果を保持したりシリアライズ&キャッシュしたりできたら,それなりに遅くないものができそうじゃない?
  • 自分でつくろうと思ったけど
    • id:kazuhooku さんみたいなスーパーハカーが作ったらうれしいと思った
      • 方向性が違うならいつか自分で作ってみたいです
        • 老後だったりして
追記

あ,別に XML ベースじゃないとそういうのができないとかそういうわけではなくて,XML ベースにしてそれなりのパーサ(libxml2)を使ってテンプレートエンジンをくむと,エンジン側としてテキストノードとかタグとか属性とかの区別がつきやすい(って上記の Genshi のドキュメントにも書いてありますが)ので楽,というのとただの好みです。

*1:そのせいもあって libxml2 について勉強したこともありました。

*2:なんのことはない CPAN で template っていれて適当に眺めただけだったんで。

*3:Nenshi のドキュメントをみたらなぜか例示が日本語 HTML だったのであれ日本人?とおもったら Rintaro さんが作ってたんでしたか。