Django 语法高亮导致字符转义问题

Posted

技术标签:

【中文标题】Django 语法高亮导致字符转义问题【英文标题】:Django syntax highlighting causing character escaping issues 【发布时间】:2009-10-22 15:20:35 【问题描述】:

我一直在写我自己的基于 django 的博客(就像我认识的每个人一样)来提高我的 python,我认为添加一些语法高亮会非常棒。我查看了一些 sn-ps 并决定结合一些并使用 Beautiful Soup 和 Pygments 编写我自己的语法高亮模板过滤器。它看起来像这样:

from django import template
from BeautifulSoup import BeautifulSoup
import pygments
import pygments.lexers as lexers
import pygments.formatters as formatters

register = template.Library()

@register.filter(name='pygmentize')
def pygmentize(value):
    try:
        formatter = formatters.htmlFormatter(style='trac')
        tree = BeautifulSoup(value)
        for code in tree.findAll('code'):
            if not code['class']: code['class'] = 'text'
            lexer = lexers.get_lexer_by_name(code['class'])
            new_content = pygments.highlight(code.contents[0], lexer, formatter)
            new_content += u"<style>%s</style>" % formatter.get_style_defs('.highlight')
            code.replaceWith ( "%s\n" % new_content )
        content = str(tree)
        return content
    except KeyError:
        return value

它会寻找这样的代码块,并突出显示相关样式并对其进行广告:

<code class="python">
    print "Hello World"
</code>

这一切都很好,直到我包含的代码块中有一些 html。现在,我知道我需要的所有 html,所以我直接在其中写我的博客文章,并在渲染到模板时,只需将文章正文标记为安全:

 post.body|pygmentize|safe 

这种方法会导致代码块中的任何 html 仅呈现为 html(即不显示)。我一直在尝试对过滤器从正文中提取的代码使用 django 转义函数,但我似乎永远无法做到正确。我认为我对内容转义的理解还不够完整。我也尝试在帖子正文中编写转义版本(例如

标记要显示的 html 的最佳方法是什么?我对这一切都错了吗?

谢谢。

【问题讨论】:

【参考方案1】:

我终于找到了一些时间来弄清楚。当美丽的汤拉入内容并且它包含一个标签时,该标签被列为列表的子节点。这行是罪魁祸首:

new_content = pygments.highlight(code.contents[0], lexer, formatter)

[0] 切断了代码的其他部分,它没有被错误地解码。我的错误发现很差。该行需要替换为:

new_content = pygments.highlight(code.decodeContents(), lexer, formatter)

这里的课程是确保您了解问题所在,并了解您的库是如何工作的。

【讨论】:

以上是关于Django 语法高亮导致字符转义问题的主要内容,如果未能解决你的问题,请参考以下文章

python高亮显示输出

Python语法的转义字符

带有 JSon 的 GraphQL 和 Python - 未转义字符的语法错误

如何在 Django Rest Framework 中不转义字符

在 Django Admin 更改列表中显示未转义的 HTML 字符串

获取转义的多语法 sql 更新字符串