Template Cascading についてかんがえてみた
https://github.com/tokuhirom/Template-Cascading
前回の話は、DOM ベースでうわがきすればいいんじゃね、っていう話が本筋だということにきづいたので、そういう風にできるライブラリをつくってみた。Just a PoC なんですけど。
- カスケーディングって HTML んときしかつかわないよね
- カスケードする対象って DOM 要素単位だよね
- カスケードして、上書きされる対象を親の側で指定するのだるくね?
ってあたりのことをかんがえてたら、できた。
とりあえず PoC なので YAML をつかっている。
たとえば base が
<!doctype html> <html> <head> <title>base</title> </head> <body> <div class="container"> <div id="Content"> main content here </div> </div> </body> </html>
みたいな HTML のときに、子テンプレートを以下のようにかく。
--- 'title': '[% user %] page' '#Content': |+ Wow! [% user %] is [% sex %]!!!
そうすると、テンプレートのレンダリングは以下のようになる
Template::Cascading->new( tmpl => $xslate, # or any Tiffany-ish object html => slurp('t/test/simple/base.html'), )->cascade('t/test/simple/detail.yml', { user => 'John', sex => 'male', })->to_html, <<'...');
ベースとなる HTML をどれにするかは、YAML の方にかいたほうがいいかもしれない。
パーザを書くのが面倒だから、汎用フォーマットであるところの YAML をつかったけど、本当は YAML じゃない方がつかいやすいとおもう。