カスタムタグ

カスタムタグは <t:customtagname /> みたな感じでテンプレートファイルに記述すると、

  1. コンパイル時に対応するオブジェクトが生成されて
  2. 実行時用のPHPをはき出すように指示される

という流れ。なお、コンパイル後にはオブジェクトは生成されない事に注意(呼び出すには、自分で書き出す必要がある)
指示のタイミングは

  1. パーサが開始タグを見つけ、オブジェクトが生成されてドキュメントツリー(DOMツリー)に登録された後(onTagOpened)
  2. パーサが終了タグを見つけ、つまり子ノードのツリーが完成した後(onTagClosed)
  3. PHPをはき出すように指示(toPHP)
    1. 子ノードをコンパイルして(getChildren)
    2. 開始タグ部分のPHPをはき出すように指示(getOpenPHP)
    3. 終了タグ部分のPHPをはき出すように指示(getClosePHP)

toPHPは、オーバーライドしないと getChildren → getOpenPHP →getClosePHP を順に呼び出す。
getChildren は、オーバーライドしないと、順番に子ノードのtoPHPを呼び出して(つまりPHPスクリプト化=データとしては文字列化して)返す。
document に出せる指示は、HTMLのヘッダエリアに何か加える(addHeadPHP)。任意の名前を付けて登録・上書きすることができるので、いくつものタグから登録されても重複しない。


こんな感じで…
「HTMLのヘッダに何か加える」機能をつけたことで、JavaScriptスタイルシートのライブラリを外に出しやすくなっている。これにより、HTMLテンプレートからJavaScriptを切り出す事に成功し、デザイナーに邪魔されないリッチなインターフェースを構築可能。
後「子ツリーの構築をフックする」機能をつけようと思う。つまりカスタムタグ化したform タグ内で追加される input タグなどを乗っ取れる様に。


カスタムタグが書き出すのはHTMLではなくPHPで、いろいろエスケープが面倒だったりするので、HTMLTemplate_TagTemplate とかいうクラスを作って外部ファイルにしてみたり。コンパイル時にしか実行されないので、少々時間がかかってもよいはず。
現状では、簡単な正規表現置換で、コンパイル時に実行するPHPと、表示時に実行するPHPの開始タグを分けてるだけだけど、なんかやりにくい。もうちょっと仕様を考える必要があるなぁ。PHP用のプリプロセッサPHP自体のテンプレート)ってどっかに無いだろうか…