テンプレートエンジンはじめます - pilika

2週間ほど前より、テンプレートエンジンを作りたくなって開発をはじめました。

世の中には色々なテンプレートエンジンがあるのですが、そのほとんどはプログラマ向けの仕様になっており、
Webデザイナが使うには使いにくいテンプレートエンジンが多いと感じます。
第1にテンプレートがブラウザで表示確認できないと、管理画面程度ならば良くともCSSを駆使したデザインの画面は扱いにくくなります。
したがって、HTMLのコードの中にスクリプトが混在したり、ループの終わりに不要なタグがあるようなテンプレートは使いたくありません。
また、ロジックとは言えないけどちょっとしたロジックが必要な場合、ヘルパクラス(関数)を作成する方法がよくとられます。
例えば、偶数行のみに特定のCSSを当てるためにヘルパ関数を呼び出したり、判定のスクリプトがHTMLコードに混入します。
前者はテンプレート作成者がフレームワークの知識を持たなければ使いにくく、後者はデザインを崩したり可読性を低下させるというデメリットがあります。
また、どちらにしてもテンプレートのコーディングを行う人が、フレームワークにあわせた言語を習得するか、その部分をプログラマに頼む必要が出てきます。

pilikaはこの2つの問題を解決する為にデザインされたテンプレートエンジンです。
簡単なサンプルをご覧ください。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:plk="http://www.hoge/plk" >
<head>
  <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
  <title>Sample: 商品一覧</title>
</head>
<body>
  <h1>${category.name}</h1>
  <p plk:if.empty="items" >現在、「${category.name}」に属する商品はありません。</p>
  <ul plk:if.not.empty="items" >
    <li plk:for="item in items">
          商品名:${item.name}、価格:${item.price}円、説明:${trim(item.description,30)}
    </li>
  </ul>
  <p></p>
</body>
<plk:def language="groovy" type="function" name="trim(text,maxLen)" >
<![CDATA[
def trim(text, maxLen) {
  text.length() < maxLen ? text : text.substring(0, maxLen)+"...";
}
]]>
</plk:def>
</html>

XMLベースであること

テンプレートエンジンとしてはGenshiの書式をベースにしており、XMLの属性としてテンプレートの振る舞いを定義します。したがって、ブラウザでプレビューした場合でも表示が崩れることはありません。

スクリプトをテンプレート内に記述できること

簡単なスクリプトであれば、関数としてテンプレート内に記述できます。開発を進めていく中でよく使われる関数はincludeできるような仕組みも考えています。これでModel, Controllerの層からViewに依存した部分のロジックは分離可能です。また、ここで使えるスクリプト言語フレームワークに依存しません。JRuby on Railsであってもスクリプト言語Rubyである必要はなく、JavaScriptやGroovy、Pythonなどを使用できます。

Java実装であること

実装はJavaです。したがって、JRuby on RailsのようにJVM上で動くフレームワークであればどんなフレームワークのView層に使うこともできるでしょう。

開発中であること

そんな思想の元、開発を進めております。興味のある方は、こちらもご覧ください。
http://www.deathmarch.jp/pilika/