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: もうタグを書きたくない
正確には、「<」と「>」をもう書きたくないのです。
あと、タグでくくるのに、同じ単語を書くなんてもううんざりです。
そしてそれで行が長くなり、何十にも折りたたまれたソースを読むのは心身に健康ではありません。
実装予定機能
まだコアしかできていない状態なので、これから追加したい機能が山とあります。
- set aa bb
defineのようにaaという変数にbbという値を突っ込み、内部一斉置換させる。
- merge aa
別のファイル内ソースをその部分にマージする
- escape
テンプレートエンジンの必須項目である、HTMLのescapeがなんと入ってないので、それを追加する
- 配列で値を渡す
- extends
blockを使用することで、あるテンプレートを継承して、そのテンプレートの一部だけ書き換える機能。
コアのソースは以下で公開中。