Пытаюсь использовать handlebars.js для шаблонизации, но библиотека, похоже, игнорирует новые строки.
Каков правильный способ работы с новыми строками? Должны ли они быть заменены вручную после действия шаблонизации?
Он не делает это автоматически, но с помощью функции helpers этого можно добиться:
JS:
Handlebars.registerHelper('breaklines', function(text) {
text = Handlebars.Utils.escapeExpression(text);
text = text.replace(/(\r\n|\n|\r)/gm, '<br>');
return new Handlebars.SafeString(text);
});
HTML-шаблон:
<div>
{{breaklines description}}
</div>
Вставив три скобки вместо обычных двух, вы можете дать команду handlebars прекратить обычную технику экранирования html-выражений, таких как <br>
и <p>
;
Например, с сайта handlebars:
"Handlebars HTML-escapes значения, возвращаемые {{выражением}}''. Если вы не хотите, чтобы Handlebars экранировал значение, используйте "тройной пробел",
{{`."
<div class="entry">
<h1>{{title}}</h1>
<div class="body">
{{{body}}}
</div>
</div>
с этим контекстом:
{
title: "All about <p> Tags",
body: "<p>This is a post about <p> tags</p>"
}
приводит к:
<div class="entry">
<h1>All About <p> Tags</h1>
<div class="body">
<p>This is a post about <p> tags</p>
</div>
</div>
Вот два подхода, я предпочитаю на данный момент-принято отвечать:
Шаблон.registerHelper('перегибов', функции (текст) { текст = Блейз._escape(текст); текст = текст.заменить(/(\р\н|\н|\р)/ГМ, '<БР>'); возврат новый Spacebars.SafeString(текст); });
См https://github.com/meteor/meteor/blob/devel/packages/blaze/preamble.js для Блейз._escape`
Я'использовал код, опубликованный @Uri, и он оказался очень полезным.
Но я понял, что когда я регистрирую помощника, параметром функции, который он получает, является не текст, а функция, которая вызывается внутри шаблона Handlebars. Поэтому сначала я должен был вызвать ее, чтобы получить текст.
Чтобы прояснить ситуацию, я должен был сделать следующее:
Handlebars.registerHelper('breaklines', function(descriptionFunction) {
text = descriptionFunction();
text = Handlebars.Utils.escapeExpression(text);
text = text.toString();
text = text.replace(/(\r\n|\n|\r)/gm, '<br>');
return new Handlebars.SafeString(text);
});
Только так я смог заставить его работать.
Любое решение, которое использует тройной бород будете открывать приложения для XSS-атак, если вы не реализуете что-то, чтобы очистить HTML-код.
Я предложил бы использовать в <предварительно> по тегу
вместо того, чтобы создавать пользовательские помощником.
Для других, вроде меня, что после получения кода начала и я'т знаю, почему HTML не было появляться.
в руль документации выражений он гласит
руль в HTML-побег значений, возвращаемых {{выражение}}. Если вы Don'т хотим, руль, чтобы избежать значение, используйте "и втройне-заначка-то", {{{