Nodejs, разметка побега нефрита

У меня есть приложение Express, использующее механизм просмотра Jade по умолчанию. Когда я пытаюсь отобразить HTML как есть в элементе <pre>, он становится отображаемым как фактические элементы DOM вместо буквенных символов.

h1 Code Sample
pre
  code
    <div>some text</div>

Вывод:

<h1>Code Sample</h1>
<pre>
  <code>
    <div>some text</div>
  </code>
</pre>

Как мне избежать HTML, чтобы он отображался следующим образом?

<h1>Code Sample</h1>
<pre>
  <code>
    &lt;div&gt;some text&lt;/div&gt;
  </code>
</pre>

Ответ 1

Джейд использует удар, чтобы вывести неэкранированный выход. Таким образом, вы поворачиваете регулярный вывод на unescaped output со следующей конструкцией: !=
Если ваш контент находится внутри тега div, вы можете сделать следующее:

div!= content

Ответ 2

В качестве дополнения, вот еще один вариант использования, который вам нужно рассмотреть:

Если вы экстраполируете содержимое HTML с помощью #{...}, оно все равно даст неверный вывод. Для этого варианта использования вам нужна альтернатива !{...}.

Итак,

div= varname

становится

div!= varname

и

div #{varname} is extrapolated badly

становится

div !{varname} is extrapolated perfectly

Ответ 3

Фактически OP запрашивает ускорение, а не отмену. Который я столкнулся сегодня.

Предположим, что у вас есть переменная varName с содержимым <b>FooBar</b>.

Затем этот шаблон будет использовать escape-значение:

#foobar= varName

поэтому он становится:

<div id="foobar">&lt;b&gt;FooBar&lt;/b&gt;</div>

Если вы используете оператор bang:

#foobar!= varName

нефрит не ускользнет, ​​поэтому он станет следующим:

<div id="foobar"><b>FooBar</b></div>

Ответ 5

Он не встроен в Jade, но вы можете сделать это с помощью фильтра :
(Это можно добавить в любом месте в верхней части app.js.)

require('jade').filters.escape = function( block ) {
  return block
    .replace( /&/g, '&amp;'  )
    .replace( /</g, '&lt;'   )
    .replace( />/g, '&gt;'   )
    .replace( /"/g, '&quot;' )
    .replace( /#/g, '&#35;'  )
    .replace( /\\/g, '\\\\'  )
    .replace( /\n/g, '\\n'   );
}

Затем используйте фильтр "escape" в вашем нефритовом файле:

h1 Code Sample
pre
  code
    :escape
      <div>some text</div>

Вывод:

<h1>Code Sample</h1>
<pre>
  <code>&lt;div&gt;hi&lt;/div&gt;</code>
</pre>

Источник: Внедрение экранированного кода в шаблон Jade