Pagedown使用Django转义代码段中的特殊字符

时间:2012-07-01 18:01:08

标签: django escaping markdown html-entities pagedown

我正在使用Stack Overflow上使用的Markdown编辑器的Pagedown实现,我的项目正在使用Django。我遇到的问题是,Markdown代码部分中的<等特殊字符被Django转义,但后来被Pagedown视为代码并显示为&lt;

当我输入如下代码段时:

    for(var i = 0; i < 10; i++)

我在下面得到了正确的预览。 <也正确地保存在数据库中,而不是HTML实体&lt;中。

但是,当我在新页面上输出此注释时,Django会自动转义这些特殊字符。

    for(var i = 0; i &lt; 10; i++)

我已经尝试关闭autoescape,但这似乎是正确的行为,因为如果用户写了

    <script>alert('hi');</script>

作为代码注释,并且Django没有逃避这个,它会执行这个JavaScript代码。但是,当Pagedown将其转换为代码标记时,它会在此部分周围添加<pre>标记,以便代码显示为

    for(var i = 0; i &lt; 10; i++)

如何让代码部分显示正确的非转义字符,还要安全地编写它以便它不执行任意JavaScript代码?似乎我可以让Django输出保存的注释(转义),然后去unescape所有内容,然后重新转义所有非代码部分。

有更好的方法吗?

1 个答案:

答案 0 :(得分:0)

此修复程序似乎将所有&amp;转换为简单&,因此HTML实体可以在代码部分中正确呈现。然而,在它看起来像&amp;lt;之前会呈现为&lt而不是&lt;变成<

使用此方法:

unhtmlEntityCode: function(code){
    code = code.replace(/&amp;/g, '&');
    return code;
},