2011-08-03 34 views
11

我有一个快速应用程序使用默认的Jade视图引擎。当我试图在<pre>元素中原样呈现HTML时,它将呈现为实际DOM元素而不是文字字符。nodejs,玉逃跑标记

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> 

回答

22

玉使用爆炸来强制非转换输出。所以你把定期输出转义输出与下面的结构:!=
如果你的内容是一个div标签内,你可以做到以下几点:

div!= content 
+3

该帖子询问如何**转义html,而不是unescape。请参阅下面的答案。 –

8

其实OP询问逸出,而不是转义。我今天碰到了什么。

假设,你有varName变量与<b>FooBar</b>内容。

那么这个模板将使用转义值:

#foobar= varName 

,使其成为:

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

如果使用砰操作:

#foobar!= varName 

玉不会逃脱它,所以它变成:

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

作为补充,这里是你需要考虑的另一种使用情况:

如果您正在使用外推的#{...} HTML内容,它仍然会给出错误的输出。 对于该用例,您需要!{...}替代方案。

所以,

div= varname 

成为

div!= varname 

而且

div #{varname} is extrapolated badly 

成为

div !{varname} is extrapolated perfectly 
+0

“错误输出”是什么意思? –

2

它不是内置于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' ); 
} 

然后使用 '逃离' 过滤器在玉文件:

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> 

来源:Embedding escaped code in a Jade template