Handbars.js замества ли символите за нов ред с ‹br›?

Опитвате се да използвате handlebars.js за шаблони, но библиотеката изглежда игнорира новите редове.

Какъв е правилният начин за справяне с нови редове? Трябва ли да бъдат заменени ръчно след действието по шаблон?


person Uri    schedule 08.09.2012    source източник
comment
Handlebars не прави нищо с нови редове във вашия шаблон. Какъв е шаблонът, с който имате проблеми, как излиза HTML и искате ли да изглежда HTML?   -  person mu is too short    schedule 08.09.2012
comment
@muistooshort има текст с нов ред и искам вместо това кормилото да постави текста с ‹br›   -  person Uri    schedule 09.09.2012
comment
Ще трябва да го направите сами, евентуално да използвате помощник.   -  person mu is too short    schedule 09.09.2012


Отговори (6)


Това не се прави автоматично, но с помощната функция това може да се постигне:

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>
person Uri    schedule 12.09.2012
comment
За да използвате това в Meteor, незабавно извикваният функционален израз, който дефинира Handlebars.Utils, трябва да бъде копиран и поставен в .js файл в приложението. По някаква причина обикновено не е достъпен от Meteor. Намира се в .meteor/local/build/server/node_modules/handlebars/lib/handlebars/utils.js. - person wizonesolutions; 17.07.2013
comment
Защо се нуждаем от toString()? escapeExpression вече връща низ, нали? - person Jonatan Littke; 15.10.2013
comment
За Ember трябваше да използвам Ember.Handlebars.registerBoundHelper - person gerry3; 24.02.2015
comment
Този отговор не работи и е остарял... вижте отговора с тройни фигурни скоби по-долу - person Ben Summerhayes; 19.03.2017
comment
Къде трябва да направя това? получавам Handlebars is not defined - person Post Self; 03.11.2017
comment
къде да добавим този код? Търсих доста, но не можах да намеря къде да напиша това. Изпробван маркер на скрипт в html. Опитах и ​​функция controller.ts (работи на Nestjs) - person Adeel Shekhani; 08.03.2021

Чрез вмъкване на три скоби вместо конвенционалните две, можете да инструктирате ръкохватките да спрат нормалните си техники за избягване на html изрази като <br> и <p>;

Например от уебсайта на кормилото:

„Handlebars HTML-escapes стойности, върнати от {{expression}}. Ако не искате Handlebars да екранира стойност, използвайте „triple-stash“, {{{.“

    <div class="entry">
      <h1>{{title}}</h1>
      <div class="body">
        {{{body}}}
      </div>
    </div>

с този контекст:

    {
      title: "All about <p> Tags",
      body: "<p>This is a post about &lt;p&gt; tags</p>"
    }

води до:

    <div class="entry">
      <h1>All About &lt;p&gt; Tags</h1>
      <div class="body">
        <p>This is a post about &lt;p&gt; tags</p>
      </div>
    </div>
person Douglas Adam Smith II    schedule 02.08.2013
comment
това проработи за мен - открих, че е по-лесно да задам прекъсванията на редовете от страна на сървъра, просто исках HB да ги използва - person Leon; 26.06.2014
comment
Освен ако използвате генерирано от потребител съдържание от текстово поле, никакъв HTML няма да бъде екраниран и сега имате XSS вектор, тъй като използването може да въвежда скриптови тагове. - person Steve Swinsburg; 12.03.2015
comment
Това изисква повече гласове за, тъй като това решение е много по-просто и ясно. В моя случай използвах github.com/yads/nodemailer-express-handlebars и Ще трябва да импортирам класа Handlebar.Utils (както е отбелязано в коментар на друг отговор). - person Xeroxoid; 18.03.2015
comment
Да, приетото решение не работи за мен без проблеми. Този го направи. - person Egor; 27.06.2015
comment
много по-добър начин...верният отговор по-горе е остарял и вече не работи - person Ben Summerhayes; 19.03.2017
comment
ТОЧНО това търсех! Благодаря ти! - person Scott; 30.10.2017
comment
Уау, толкова много положителни гласове за въвеждането на XSS вектор!! Изразът с тройна наклонена черта трябва да се използва само ако сте 100% сигурни за съдържанието на вашия шаблон. Тоест, почти никога! - person dpr; 15.12.2017

Ето два подхода, които предпочитам пред приетия в момента отговор:

  1. Използвайте white-space: pre-wrap; или white-space: pre; върху елемента, където искате да запазите прекъсванията на редовете (съответно позволявайки или потискайки естественото обвиване на редове). Ако искате последователности от бели интервали да бъдат свити, което е начинът, по който текстът в HTML обикновено се представя, използвайте white-space: pre-line;, но имайте предвид, че IE8 и по-стари не поддържат това. https://developer.mozilla.org/en-US/docs/Web/CSS/white-space
  2. Или ето версия на помощника на шаблона, която не изисква никакво копиране и поставяне на външен код:

    Template.registerHelper('breaklines', function (text) {
      text = Blaze._escape(text);
      text = text.replace(/(\r\n|\n|\r)/gm, '<br>');
      return new Spacebars.SafeString(text);
    });
    

    Вижте https://github.com/meteor/meteor/blob/devel/packages/blaze/preamble.js за Blaze._escape

person Matt Jenkins    schedule 08.11.2015

Използвах кода, публикуван от @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);
});

Това е единственият начин да го накарам да работи.

person eze.scaruli    schedule 02.11.2012
comment
За Ember трябваше да използвам Ember.Handlebars.registerBoundHelper - person gerry3; 24.02.2015

Всяко решение, което използва тройни staches, ще отвори вашето приложение за XSS атаки, освен ако не внедрите нещо, което да дезинфекцира HTML.

Бих предложил да използвате маркера <pre>, вместо да създавате персонализиран помощник.

person ryanw51    schedule 26.07.2015

За други като мен, които следваха кода Първи стъпки и не знаеха защо не се показва HTML.

в документацията за изрази на кормилото се посочва

Handlebars HTML-escapes стойности, върнати от {{expression}}. Ако не искате Handlebars да избягва стойност, използвайте "triple-stash", {{{

person Nagy Wesley    schedule 20.08.2019