【发布时间】:2011-05-26 20:34:24
【问题描述】:
我能否以某种方式配置模板工具包,以便:
[% foo %]
做你现在需要说的:
[% foo | html %]
即在foo中转义HTML?做点别的,比如:
[% foo | noHtml %]
如果我不想想逃跑?
【问题讨论】:
标签: perl template-toolkit
我能否以某种方式配置模板工具包,以便:
[% foo %]
做你现在需要说的:
[% foo | html %]
即在foo中转义HTML?做点别的,比如:
[% foo | noHtml %]
如果我不想想逃跑?
【问题讨论】:
标签: perl template-toolkit
在尝试为自己回答同样的问题时遇到了您的问题。
http://search.cpan.org/~mithaldu/Template-AutoFilter/ 似乎做了我们想做的事,但它确实需要安装另一个模块。不管怎样,我要试一试。
【讨论】:
我猜你可以通过扩展 Template::Stash 创建自己的存储区,以便默认转义变量。
也就是说,我认为这不是一个好主意。最好坚持默认行为并避免自定义修改,因为它们肯定会令人困惑。
【讨论】:
[% x %] 和 [% y = x %] 都会调用 stash 的 get() 方法来查找 x 但只有第一个产生输出,stash 可能无法区分“获取和打印”与“ get" 所以你最终会得到很多双/三/... HTML 编码的东西。最好不要打扰。
我最近在这个问题上花了一些时间。这是我的解决方案的概要。
我创建了一个名为 HtmlSafe 的新类,其中包含可以安全地写入 WWW 客户端而没有安全漏洞的字符串。这个想法是生成 HTML 标记的函数返回 HtmlSafe 对象,而开箱即用的变量不是 HtmlSafe。任何创建 HtmlSafe 的东西也保证了相关字符串的安全性。将非 HTML 安全字符串与 HTML 安全字符串连接会导致非 HTML 安全字符串通过 CGI::escapeHTML 转义,然后与 HTML 安全字符串连接。将 HtmlSafe 的另一个实例连接到 HtmlSafe 只是连接有问题的字符串而不会转义。我最终使用了重载,所以我可以重新定义 . HtmlSafe 类的运算符。
有了这个东西,我给了一个 $template->process() 函数一个 $output 变量,它实际上是一个调用与 HtmlSafe 连接的子变量,如下所示:
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",
});
除此之外,我为 TT2 定义了一个“无”过滤器,它简单地包装任何定义为 HtmlSafe 的内容,因此您可以在需要时输出原始 HTML。这样可以避免逃避事情。默认的“html”过滤器是无操作的,因为任何连接到 HtmlSafe 的东西现在都会被转义。
【讨论】: