日記
XMLを関数ツリーにマッピング (13:50)Edit

作りかけて放棄したHTMLレンダリングエンジンのアプローチにちょっと似ているかも。作ろうとしていたHTMLレンダリングエンジンは、XMLではなくて、PHParrayを使ったツリー構造データなんだけど、その各ノードに、

  • テンプレート(ファイルもしくはテンプレート文字列そのもの)
  • データ(型は自由)
  • レンダリング関数(関数名文字列、もしくはAbstractRendererを継承したクラスのインスタンス)

を持ち、テンプレートファイルをデータとレンダリング関数を使って展開しつつ、ツリーのノードをたどっていくイメージだった。どうやってそれを表現し実装するかは、あまり具体的に考えていなかったんだけど、もしXMLでその定義ファイルを書くと、

<item name="html_header">
<template>html_header.html</template>
<data>$_ENV,$_SERVER,$_GLOBALS</data>
<renderer>replacer</renderer>
</item>
<item name="pagelist">
<item name="list_header">
<template>list_header.html</template>
<data>Page::ListCaption</data>
<renderer>replacer</renderer>
</item>
<item name="list_body">
<template>list_line.html</template>
<data>Page::GetList</data>
<renderer>iterator</renderer>
</item>
<item name="list_footer">
<template>list_footer.html</template>
<data></data>
<renderer></renderer>
</item>
</item>
<item name="html_footer">
<template>html_footer.html</template>
<data></data>
<renderer></renderer>
</item>

なんて感じか。多分内部的な処理としては、XML Functional Mapping(http://www.ba.wakwak.com/~fuchi/rubyxml/rFAX/doc/mapping.html)と似た感じになるだろうな。

ただ、この方向でこり始めると、手間を省くために作ったものが新たな手間を生み出したりする展開になりそうだったんで、途中であきらめた。でもいろいろややこしくなりそうな部分を一通りきれいに解決する方法を思いついたら、もう一度チャレンジしてみるかも。

テンプレートエンジン内で独自のマクロ言語を定義するアプローチよりも、ロジックを組み込みたければ純粋に(データ定義レイヤーではなく、ロジックレイヤーで)ロジックを書くアプローチの方が好みだ。

Published At2003-07-21 00:00Updated At2003-07-21 00:00