Text::MicroTemplate を拡張してみた
最近は Text::MicroTemplate (TMT) をよく利用するようになったのですが、使用するにつれ不満なところが出てきたのでそれを解決するために少し拡張してみました。
実際には拡張したのは Text::MicroTemplate ではなく、Text::MicroTemplate::File です。
http://github.com/typester/text-microtemplate-extended-perl/tree/master
現在二つの機能を追加してあるのでそれを以下にまとめておきます。
テンプレートの継承機能を追加
テンプレートを分割するような規模になってくると現状の TMT では
<?=r $self->render_file('header.mt') ?>
ここにコンテンツ
<?=r $self->render_file('footer.mt') ?>
などのように書くことになりますが、これは TT の wrapper 機能などに慣れていると少しめんどくさい。
追記: TMTでもwrapperはつかえるみたいです。> $mtf->wrapper_fileそこで、TMT でも wrapper 機能をつかえるように!! ・・・しようかと思ったのですがやめて、代わりに Django のテンプレートなどで採用されている継承という仕組みを実装してみました。
詳しい説明は Django のテンプレートのドキュメントがとても詳しいのでそちらを参照するといいと思います。
で、上記の Django ドキュメントにあるテンプレート継承の例をこの拡張版 TMT で書くとどうなるかというと、base.html (base.mt) が
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<link rel="stylesheet" href="style.css" />
<title><? block title => sub { ?>My amazing site<? } ?></title>
</head>
<body>
<div id="sidebar">
<? block sidebar => sub { ?>
<ul>
<li><a href="/">Home</a></li>
<li><a href="/blog/">Blog</a></li>
</ul>
<? } ?>
</div>
<div id="content">
<? block content => sub {} ?>
</div>
</body>
</html>
child.html (child.mt) は:
text
のようになります。
TT のような wrapper という方式と、このような継承という仕組みはどちらも一長一短ありますが、柔軟にテンプレートを定義できるのは継承の方かなぁと感じてます。
ちなみに Django テンプレートに実装されている block.super
相当の機能はまだ実装できていません。
テンプレートに名前付き引数を渡せる機能を追加
もう一つ、テンプレートに名前付きで値を渡せる機能も追加しました。オブジェクトを作成するときに
Text::MicroTemplate::Extended->new( include_path => ['.'], template_args => { foo => 'bar' } );
などのように template_args パラメータにハッシュリファレンスを渡しておくと、テンプレート中でこのハッシュのキーを
<?= $foo ?> # => bar
と参照することができるようになるという機能です。