我可以以某种方式配置模板工具包,以便:
[% foo %]
做你现在需要说的:
[% foo | html %]
也就是说,在foo
?中转义 HTML 并做其他事情,例如:
[% foo | noHtml %]
如果我不想逃跑?
我可以以某种方式配置模板工具包,以便:
[% foo %]
做你现在需要说的:
[% foo | html %]
也就是说,在foo
?中转义 HTML 并做其他事情,例如:
[% foo | noHtml %]
如果我不想逃跑?
尝试为自己回答相同的问题时遇到了您的问题。
http://search.cpan.org/~mithaldu/Template-AutoFilter/似乎可以满足我们的需求,但它确实需要安装另一个模块。反正我要试一试。
我想您可以通过扩展Template::Stash创建自己的存储,以便默认转义变量。
也就是说,我认为这不是一个好主意。最好坚持默认行为并避免自定义修改,因为它们肯定会令人困惑。
我最近在这个问题上花了一些时间。这是我的解决方案的大纲。
我创建了一个名为 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 的东西现在都会被转义。