默认情况下,在Template Toolkit中转义HTML

时间:2010-12-16 22:59:37

标签: perl template-toolkit

我可以以某种方式配置Template Toolkit,以便:

[% foo %]

做你现在需要说的话:

[% foo | html %]

即在foo中转义HTML?并做一些其他的事情,比如:

[% foo | noHtml %]

如果我想要逃避?

3 个答案:

答案 0 :(得分:5)

在尝试为自己回答相同问题时遇到了您的问题。

http://search.cpan.org/~mithaldu/Template-AutoFilter/似乎做了我们想要的,但确实需要安装另一个模块。无论如何,我打算试一试。

答案 1 :(得分:4)

我猜你可以通过扩展Template::Stash创建自己的存储,以便默认转义变量。

那说我认为这不是一个好主意。最好坚持使用默认行为并避免自定义修改,因为它们确实令人困惑。

答案 2 :(得分:1)

我最近在这个问题上花了一些时间。以下是我的解决方案的概要。

我创建了一个名为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" filter is no-op,因为无论如何,与HtmlSafe连接的任何内容都会被转义。