PHPでテンプレートエンジンをまた自作してしまった。

前回forkTemplateを作って、しばらくその自作を使っていたんですが、

もやもやがどうしても消えなくて、
ドヤ顔で作ったはずの前回のやりかたをさっくりと捨て、
とうとうまたテンプレートエンジンを作ってしまいました。

「完全に自分が欲しいものを作る程度の能力」
くらいは欲しいのに、全く手に入りません。

!html{ null ,;
    !head{null,;
        !metaCharset{UTF-8}
        !metaIphone{}
        !loadCss{reset.css}
        !loadJs{test.js}
    }
    !h1{,;riseTemplate is Tempalte Engine For PHP }
    !hr{}
    !h4{style="margin-left:20px;",;very simple}
    !h4{style="margin-left:20px;",;very extandable}
    !h4{style="margin-left:20px;",;very easy to read and write}
    <?php
    for( $i = 0 ; $i < 10 ; ++$i ){
        printf("!div{null,;%s}",$i);
    }
    ?>
}

こういう感じの疑似コードをHTMLとして出力するテンプレートエンジンです。

これらはまずPHP部分が解釈され、その後、それぞれのタグを関数化して読み込んでいきます。

コンセプト

テンプレートエンジンを作るときに考えていたことは3つあります。


1: 「テンプレートエンジン用のemacsのモードを作るのがめんどい」

emacsには様々なモードがあり、テンプレートエンジンといえども、それ専用のテンプレートを気持ちよく記述するには、やはりモードが必要です。
色がついていないソースを読んで楽しいプログラマなどただのドMです。

新しい、素晴らしいテンプレートエンジンは数あれど、複雑なHTMLを色付きなしで眺めるなんて苦行でしかないんです。

たとえばTwig、たとえばSmarty
これらは素晴らしいテンプレートエンジンですが、本当にHTMLモードでは苦行でしかない。

かといって、これらの専用モードではHTMLがおそろかになったりするのです。
もう耐えられません。

さらにインデントにいたってはもっと破壊的です。
中にPHPのインデントを入れようと思っても、いくつかのモードの混在は本当に面倒だからです。


しかしもう解決です。
なぜならこのテンプレートはすべて「php-mode]で記述できます。
ちなみにインデントも完璧です。

もしjavascriptを記述しようと思っても、php-modeでscriptタグにjavascriptを記述することは難しくありません。

本物のjavascriptはjsファイルに書くべきですから、ちょこっとしたjavascriptならば、インデントすればだいたい十分です。

このコンセプトはこのテンプレートエンジン的にはかなり重要視されており、
それ故、ちょっと奇怪な記述があります。


2: もうタグを書きたくない

正確には、「<」と「>」をもう書きたくないのです。
あと、タグでくくるのに、同じ単語を書くなんてもううんざりです。

そしてそれで行が長くなり、何十にも折りたたまれたソースを読むのは心身に健康ではありません。

3: スニペットは必要。もっと気軽に使いたい。

上記の1を満たすだけならば、ふつうにPHPをHTMLにかきゃいいんですが、
それだけではいやで、やはり独自タグ(要はスニペット)が欲しいです。

なので、もっとも単純にスニペットを呼び出す形式にしました。
{}の中に「,;」の区切りで並んでいるパラメータが、そのまま定義された
タグのスニペットの引数となります。

なんでもOK感バリバリです。

実装予定機能

まだコアしかできていない状態なので、これから追加したい機能が山とあります。

  • set aa bb

defineのようにaaという変数にbbという値を突っ込み、内部一斉置換させる。

  • merge aa

別のファイル内ソースをその部分にマージする

  • escape

テンプレートエンジンの必須項目である、HTMLのescapeがなんと入ってないので、それを追加する

  • 配列で値を渡す
  • extends

blockを使用することで、あるテンプレートを継承して、そのテンプレートの一部だけ書き換える機能。


コアのソースは以下で公開中。

https://github.com/isdriven/riseTemplate