次のように Template Toolkit を構成できますか。
[% foo %]
あなたが今言う必要があることをします:
[% foo | html %]
つまり、foo
?で HTML をエスケープします。そして、次のように何か他のことをします:
[% foo | noHtml %]
逃げたくない場合は?
次のように Template Toolkit を構成できますか。
[% foo %]
あなたが今言う必要があることをします:
[% foo | html %]
つまり、foo
?で HTML をエスケープします。そして、次のように何か他のことをします:
[% foo | noHtml %]
逃げたくない場合は?
自分で同じ質問に答えようとしたときに、あなたの質問に出くわしました。
http://search.cpan.org/~mithaldu/Template-AutoFilter/は私たちが望むことをしているようですが、別のモジュールをインストールする必要があります。とにかくやってみます。
デフォルトで変数をエスケープするようにTemplate::Stashを拡張することで、独自のスタッシュを作成できると思います。
そうは言っても、それは良い考えではないと思います。デフォルトの動作に固執し、カスタムの変更は確かに混乱を招くため控えたほうがよいでしょう。
最近、この問題に時間を費やしました。これが私のソリューションの概要です。
セキュリティの脆弱性なしで安全に WWW クライアントに書き込むことができる文字列を含む、HtmlSafe という新しいクラスを作成しました。HTML タグを生成する関数は HtmlSafe オブジェクトを返し、すぐに使用できる変数は HtmlSafe ではないという考えでした。HtmlSafe を作成するものは、問題の文字列の安全性も保証しています。非 HTML セーフ文字列を HTML セーフ文字列と連結すると、非 HTML セーフ文字列が CGI::escapeHTML によってエスケープされ、HTML セーフ文字列と結合されます。HtmlSafe の別のインスタンスを HtmlSafe に連結すると、エスケープせずに問題の文字列が結合されます。を再定義できるように、オーバーロードを使用することになりました。HtmlSafe クラスの演算子。
このことを踏まえて、$template->process() 関数に、実際には HtmlSafe との連結を呼び出すサブルーチンである $output 変数を次のように与えました。
my $output = HtmlSafe->new("");
$template->process($vars, sub { $output .= $_[0]; });
return $output->unwrap(); # remove HtmlSafe and return underlying string
HtmlSafe TT2 の準備がほぼ整いました。私が実際にやらなければならなかった大きな変更は、Template::Directive の textblock() 関数を変更することでした。これは、Template::Parser が発行しようとしたテキスト ブロックの HtmlSafe インスタンスを生成するために使用されます。これらは、解析されたテンプレートの TEXT ノードに対応しているように見えるので、
package MyDirective;
use base "Template::Directive";
sub textblock { my $self = shift; return "$Template::Directive::OUTPUT HtmlSafe->new(" . $self->text(@_) . ")"; }
私はパーサーに次のように与えました:
my $parser = Template::Parser->new({
FACTORY => "MyDirective",
});
これに加えて、HtmlSafe として定義されているものを単純にラップする TT2 用の "none" フィルターを定義したので、必要に応じて未加工の HTML を出力できます。これにより、物事のエスケープが回避されます。HtmlSafe に連結されたものはすべてエスケープされるため、デフォルトの「html」フィルタはノーオペレーションです。