キマイラ・サイトは http://www.chimaira.org/です。
トラックバック/コメントは日付を気にせずにどうぞ。
連絡は hiyama{at}chimaira{dot}org へ。
蒸し返し歓迎!
ところで、アーカイブってけっこう便利ですよ。タクソノミーも作成中。
2009-06-04 (木)
テレンス・パーのMVCR (Model-View-Controller-Renderer) 方式はどうなんだろうか
雑記/備忘 | |
ココに書いた事情で、Kuwataさんにいろいろと作業していただいています。StringTemplateは、僕が気に入ったテンプレート言語/エンジンですが、Kuwataさん曰く:
[注:StringTemplateの]致命的な弱点としてはデフォルトで HTML 特殊文字がエスケープされないことが発覚。これは StringTemplate があくまでも汎用的なテンプレートエンジンで、特に Web ページの出力に特化しているわけじゃないのが原因だろう。
StringTemplateは確かに汎用エンジンで、メールの定型文を生成するのにも使えます。特に、パーザージェネレータANTLRと組み合わせてソースコードの生成に使う用途を強く意識しているようです。よって、HTML特有の処理が組み込まれてないのは、まーしょうがないでしょう。
さて、HTMLエスケープの問題(例えば、"<" を "<" に直す)は、ベンジャミン・ヘール(Benjamin Geer)という人に指摘されたらしく、"Enforcing Strict Model-View Separation in Template Engines"(http://www.cs.usfca.edu/~parrt/papers/mvc.templates.pdf)の "8.1 Attribute Rendering" で扱っています。テレンス・パーはJavaを例に説明してますが、以下ではプログラミング言語に依存しないで、テレンス・パーのアイディアを述べてみます。
テレンス・パーは、テンプレートを展開するときの環境を「属性セット」とか「属性テーブル」とか呼んでいます。属性値には、整数とか文字列とかのデータ型があるのですが、テンプレート展開の時点ではいかなるデータも文字列にする必要があります。例えば、整数 23 は文字列 "23" としてテンプレートのプレースホルダを埋めることになります。
このようにプログラムから提供されたデータ(属性)を文字列化する変換を(誤解を招きかねない用語ですが)レンダリングといい、レンダリングを担当するナニカ(関数とかメソッドとか)をレンダラーと呼びます。文字'<' をそのまま出力するか、"&" に直すか、あるいはその他の表現に置き換えるかなどは、レンダラーが知っている、とするのです。
当然に、レンダラーは出力フォーマットに依存するし、出力フォーマットごとにレンダラを切り替える必要があります。HTMLフォーマットに対してはHTMLレンダラーを使い、プレーンテキスト・フォーマットに対してはプレーンテキスト・レンダラーを使う、という具合に。
この方式をテレンス・パーは MVCR (Model-View-Controller-Renderer) と呼んでいます。レンダラーが、属性(プログラムからのデータ)とテンプレートとの橋渡しをするのです。この方法によってエスケープの問題は解決すると彼は言いたいようです。
が、ほんとうでしょうか? ある文字列をHTMLファイル内に挿入するとして、div要素内とpre要素内とscript要素内では、エスケープ方法や改行の扱いが微妙に違ったりします。とはいっても、HTMLファイルを真面目にパーズして判断するのは非現実的です。
また、PHP Smartyで言うところの修飾子(Django Template で言うところのフィルター)を考えると、レンダラーと修飾子の実行順序が問題になったりして、なかなか一筋縄ではいきません。思いのほか根が深い問題のようです。さーて、どうしたもんかなー。
- 54 http://reader.livedoor.com/reader/
- 31 http://return0.dyndns.org/log/
- 20 http://www.google.co.jp/search?hl=ja&client=firefox-a&rls=org.mozilla:ja:official&q=c void&btnG=検索&lr=lang_ja
- 20 http://www.google.co.jp/search?sourceid=navclient&hl=ja&ie=UTF-8&rlz=1T4DAJP_jaJP309JP278&q=bshell+リダイレクト
- 19 http://www.google.co.jp/reader/view/?hl=ja&tab=wy
- 18 http://www.google.co.jp/reader/view/
- 15 http://www.google.com/reader/view/
- 12 http://twitter.com/ckuwata
- 11 http://d.hatena.ne.jp/m-hiyama-memo/
- 8 http://d.hatena.ne.jp/
以前、私の家の近所にある某ディスカウントショップに「ダイソーン掃除機」という掃除機が売られているのを見た事があります。
どう見ても小さい本体、箱の横に思いっきり書かれた「MADE IN China」、値段も9980円と格安と怪しさ大爆発の商品が「限定5台限り!」と書かれて売り場に置いてありました。
さすがに買う勇気は無かったです。
> 値段も9980円
うわー、1万円でお釣りが来るダイソーンですか。
> 限定5台限り
全部買い占めるとダイソンに匹敵するかも、はらったお金。