bloxsom のフレーバを Template-Toolkit で処理するためのプラグインが謎の挙動をしていて、昨日のエントリの permalink ページがエラーとなっていました。
で、原因となる箇所は特定できたのですが、原因がさっぱり分からないので、どなたかご存知の方は教えてください。
まず、プラグインの処理の概要ですが、tt プラグインの interpolate() の中で、$template にフレーバの内容をつっこんで、同じプラグイン内の parse() に渡しています。parse() では、Template::Parser を利用して、TT のディレクティブからパラメータをひろって配列につっこんでいます。その後も処理があるのですが、今回の問題とは関係がないので省略。問題のある部分を抜粋すると以下の様な感じです。
sub interpolate { return sub { my $template = shift; # 省略 my @params = parse($template); # 省略 } } sub parse { my $template = shift; my $parser = Template::Parser->new; my $tokens = $parser->tokenise_directive($template); # 省略 }
で、何が問題かというと、interpolate() 内の $template が、parse() の $parser->tokenise_directive($template) を実行すると空になってしまうのです。それも、$template がある程度長くなった場合のみ。(具体的に何byte 以上かは調べてないのですが。)
parse() 内の $template は、 interpolate() 内の $template のコピーのはずなので、直接 interpolate() の $template はいじってないし、Template::Parser のソースを見ても、渡された $template をいじっているようには見えないんですよね。
また、問題が発生する $template の内容と同一のデータを使って、blosxom のプラグインという形ではなく、単一のプログラムを書いて実行してみると、正常に処理できるんですよね。謎です。
とりあえず長さが問題だということと、parse() には $template の中身をすべて渡す必要がなく、TT の ディレクティブだけ渡せばいいので、そういった処理をするように修正してしのいでいます。(それでも挙動がおかしいところがあるのですが。)