長年日記のためのテンプレートのコードを修正する。
■ ■ ■
先日,日別アーカイブを「長年日記」風にした(nlog(n): Movable Type で長年日記)。管理画面から再構築すると気がつかないのだが,mt-rebuild で再構築するとエラーが表示されることが分かった。次のようなメッセージが山ほど出るのである。
Error output from PerlScript tag: Use of uninitialized value in concatenation (.) or string at (eval 5893) line 14.
Use of uninitialized value in concatenation (.) or string at (eval 5893) line 14.
Use of uninitialized value in concatenation (.) or string at (eval 5893) line 14.
Use of uninitialized value in concatenation (.) or string at (eval 5893) line 14.
Error output from PerlScript tag: Use of uninitialized value in concatenation (.) or string at (eval 116970) line 14.
初期化されていない変数が使われているという,PerlScript プラグインのエラーである。テンプレートのコードを次のように修正したところ,エラーが出なくなった。
<div class="date"><a href="<$MTArchiveLink$>" title="<$MTArchiveDate$>"><$MTArchiveDate format="%B %e"$></a></div>
<MTTagInvoke tag_name="MTSetVar" name="thisday">
<MTTagAttribute name="value"><$MTArchiveDate format="%m%d"$></MTTagAttribute>
</MTTagInvoke>
<MTTagInvoke tag_name="MTSetVar" name="thisdate">
<MTTagAttribute name="value"><$MTArchiveDate format="%Y%m%d"$></MTTagAttribute>
</MTTagInvoke>
<MTArchiveList>
<MTEntries>
<MTPerlScript>
$a = '<$MTGetVar name="thisday"$>';
$b = '<$MTArchiveDate format="%m%d"$>';
$aa = '<$MTGetVar name="thisdate"$>';
$bb = '<$MTArchiveDate format="%Y%m%d"$>';
$blogbodystyle = $aa eq $bb ? ' thisyear' : '';
if ($a eq $b) {
print <<'HERE_DOCUMENT';
<MTDateHeader>
<div class="date">
<a href="<$MTEntryPermalink archive_type="Daily"$>" title="<$MTEntryDate format="format="%a %Y"$>"><$MTEntryDate format="%a %Y"$></a>
</div>
</MTDateHeader>
<div id="a<$MTEntryID pad="1"$>" class="title">
<a href="<$MTEntryLink$>" title="<$MTEntryTitle$>"><$MTEntryTitle$></a>
</div>
HERE_DOCUMENT
print qq|<div class="blogbody$blogbodystyle">|;
print <<'HERE_DOCUMENT';
<$MTEntryBody$>
... (追記,Permalink,コメント,トラックバックなどの記述をそのまま)
</div>
HERE_DOCUMENT
}
</MTPerlScript>
</MTEntries>
</MTArchiveList>
ポイントは,ヒア・ドキュメントの変数展開を抑止したことである。修正前は「print <<HERE_DOCUMENT;」となっており,この指定ではヒア・ドキュメント内のPerl の変数が展開される。展開しないようにするには,「print <<'HERE_DOCUMENT';」としてシングルクォートで囲めばよい。変数展開をさせたい部分が1か所あるので,そこだけを「print qq|<div class="blogbody$blogbodystyle">|;」とした。
エラーの原因は,PerlScript プラグインが Movable Type のテンプレートタグを変数として解釈していたらしいということが分かる。例えば,ヒア・ドキュメント内のテンプレートタグ「<$MTEntryBody$>」の「$」から始まる文字列を Perl の変数「$MTEntryBody」と「$>」として解釈していたということである。確かにどちらも Perl の変数として定義していないものである。
しかし,これは結構不思議なことである。「$b = '<$MTArchiveDate format="%m%d"$>';」が上手く動作しているので,Perl 変数の評価よりもテンプレートタグが先に展開されていると考えられる。一方で,ヒア・ドキュメント内のテンプレートタグは後に展開されていることになる。上手くできている。
Posted by n at 2006-08-08 22:45 | Edit | Comments (0) | Trackback(0)