Template-Toolkit 2.15 リリース,そして

長らくメンテされてなかったように見えた TT ですが,2.15 がリリースされました。Changes を読んでもいまいちどこがかわったのかわかりませんでした(←かっこわるす)。

Perl 5.8 と UNICODE - daily dayflower で変なところで苦労していたんですが,どうも勘違いだったぽく,

#!/usr/bin/perl

use strict;
use utf8;
use Template;
use Template::Context;
use Template::Provider::Encoding;
use Template::Stash;

my $tt = Template::Context->new(
  LOAD_TEMPLATES => [
    Template::Provider::Encoding->new
  ],
  STASH => Template::Stash->new(
    {
      '日本語変数' => '日本語値',
    },
  ),
);

print Encode::encode('utf8', $tt->process('utf8.txt', {}));

utf8.txt の内容は

テスト: [% 日本語変数 %]

これ,うまくいきました。以前は \*DATA で読んでいたのがごちゃごちゃしちゃってた原因ぽいです。まとめると,

  • Template::Provider::Encoding を使うと,読み込んだテンプレートが内部 UNICODE として変換される。
  • だから Parser は上記でいう「日本語変数」という部分もうまくパースしてくれる(Encoding じゃない Provider でもためしてみてください;パーサでエラーになります)。
  • このような状況で,標準添付の Stash でも utf8 ビットがたった値やラベルをセットしてあれば,うまくいく。
  • 他のモジュールの出力結果を利用したりした場合に,Stash の値が octet stream になってしまうことがある。そんな場合のために Template::Stash::ForceUTF8 を使うのだと思う。