Исключить HTML по умолчанию в Template Toolkit

Можно ли каким-либо образом настроить Template Toolkit, чтобы:

[% foo %]

делает то, что вам теперь нужно сказать:

[% foo | html %]

то есть вывести HTML в foo? И сделайте что-нибудь еще, например:

[% foo | noHtml %]

если я не хочет сбежать?

3 ответа

Я думаю, вы могли бы создать свой собственный кошелек, расширив Template:: Stash, чтобы по умолчанию это были escape-переменные.

Я сказал, что это не очень хорошая идея. Лучше придерживаться поведения по умолчанию и воздерживаться от пользовательских изменений, поскольку они, безусловно, запутывают.


Пошел на ваш вопрос, пытаясь ответить на тот же вопрос для себя.

http://search.cpan.org/~mithaldu/Template-AutoFilter/, похоже, делает то, что мы хотим, но требует установки другого модуля. Я все равно дам ему попробовать.


Я потратил некоторое время на эту проблему недавно. Вот схема моего решения.

Я создал новый класс под названием HtmlSafe, который содержит строки, которые можно безопасно записать на WWW-клиент без уязвимости безопасности. Идея заключалась в том, что функции, генерирующие теги HTML, возвращают объекты HtmlSafe, а переменные из коробки не являются HtmlSafe. Независимо от того, что создает HtmlSafe, он также поручился за безопасность этой строки. Объединение строки, не содержащей HTML-код, с безопасной для HTML строкой, приводит к тому, что небезопасная строка может быть экранирована через CGI:: escapeHTML, а затем соединена с безопасной для HTML строкой. Объединение другого экземпляра HtmlSafe в HtmlSafe просто соединяет рассматриваемые строки без экранирования. Я закончил использовать перегрузку, чтобы я мог переопределить. оператора для класса HtmlSafe.

Вооружившись этой штукой, я передал функцию $template- > process() переменную $output, которая на самом деле была sub, которая вызывала конкатенацию с помощью HtmlSafe, например:

my $output = HtmlSafe->new("");
$template->process($vars, sub { $output .= $_[0]; });
return $output->unwrap(); # remove HtmlSafe and return underlying string

Мы почти готовы с HtmlSafe TT2. Большое изменение, которое я должен был сделать, это изменить функцию textblock() в Template:: Directive, которая используется 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",
});

В дополнение к этому я определил фильтр "none" для TT2, который просто обертывает все, что определено как HtmlSafe, поэтому вы можете выводить необработанный HTML, если вам нужно. Это позволяет избежать побегов. По умолчанию фильтр "html" не работает, потому что что-то, связанное с HtmlSafe, теперь все равно экранируется.

licensed under cc by-sa 3.0 with attribution.