Экранирование одинарных кавычек в Template Toolkit

Вы когда-нибудь избегали одинарных кавычек в инструментарии шаблонов для необходимых обработчиков javascript? Если так, то как ты это делаешь.

[% SET s = "A'B'C" %]

<a href="/abc.html" onclick="popup('[% s | html_entity %]')">ABC</a>

html_entity явно не работает, потому что обрабатывает только двойные кавычки. Итак, как вы это делаете?


person Zach    schedule 07.06.2010    source источник


Ответы (5)


Я не использую встроенные обработчики событий — по той же причине я отказываюсь использовать атрибут style для css. Jquery просто упрощает выполнение class="foo" в html и $('.foo').click( function () {} ) во внешнем .js файле.

Но чтобы сделать все возможное, чтобы ответить на этот вопрос, ознакомьтесь с этими документами на Template::Filter для тех, что в ядре.

Кажется, что вы могли бы сделать [% s | replace( "'", "\'" ) %], чтобы избежать одинарных кавычек. Или вы, вероятно, могли бы написать более сложный очищающий анализатор javascript, который разрешает только вызовы функций, и создать свой собственный Шаблон::Фильтр

person Evan Carroll    schedule 07.06.2010
comment
Хотя я согласен с вашим советом, я только что понял, что реальное решение имеет другую обратную косую черту: [% s | заменять( ', \\' ) %] - person Zach; 12.08.2010

Обновление 2018 года для справки:

В TT для этого есть метод sqote для экранирования одинарных кавычек и dquote для двойных кавычек.

[% tim = "Tim O'Reilly" %]
[% tim.squote %]          # Tim O\'Reilly

Ссылка на вопрос будет выглядеть примерно так:

<a href="/abc.html" onclick="popup('[% s.squote %]')">ABC</a>

http://www.template-toolkit.org/docs/manual/VMethods.html#section_squote

person pizzamonster    schedule 25.02.2018

Вы можете попробовать: popup('[% s | html %]').

person Ky6uk    schedule 18.01.2011

Perl не самый сильный мой язык... Но!

Самый простой способ, который я нашел, - это использовать модуль JSON. В модуле под названием JS.pm или что-то в этом роде:

use JSON;

sub encode () {
   my $self = shift;
   my $string = shift;

   $json = JSON->new->allow_nonref;

   return $json->encode( $string );
}

Подробнее здесь: http://search.cpan.org/~makamaka/JSON-2.90/lib/JSON.pm

Затем в вашем шаблоне:

[% use JS; %]

<script>
  var escaped_string = [% JS.encode( some_template_variable ) %];
</script>
person KeatsKelleher    schedule 20.11.2014
comment
ОП не говорит, что это основная проблема, но, конечно, это может быть проблема XY. Однако здесь вы заново изобретаете колесо, уже есть зрелый плагин для TT под названием Template::Plugin::JSON. - person RET; 21.11.2014
comment
Потрясающий! Спасибо за информацию. - person KeatsKelleher; 21.11.2014

Не забудьте дважды экранировать косую черту при замене, иначе это будет интерпретировано как экранирование апострофа.

[% string.replace( "'", "\\'" ) %]
person HoldOffHunger    schedule 14.07.2016