Django语法突出显示导致字符转义问题

2024-03-29 07:03:02 发布

您现在位置:Python中文网/ 问答频道 /正文

我一直在写我自己的基于django的博客(像我认识的每个人一样)来改进我的python,我认为添加一些语法亮点会非常好。我看了一些代码片段,决定结合一些代码片段,用漂亮的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

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

^{pr2}$

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

{{ post.body|pygmentize|safe }}

这种方法会导致代码块中的任何html只是呈现为html(即,不显示)。我一直在尝试使用django转义函数来处理由我的过滤器从body中提取的代码,但我似乎永远都不能正确地使用它。我认为我对内容转义的理解还不够全面。我也尝试过在post body(例如<;)中编写转义版本,但它只是以文本形式出现。在

标记html以供显示的最佳方法是什么?我是不是做错了?在

谢谢。在


Tags: django代码importtreepygmentsvaluestyleformatter
1条回答
网友
1楼 · 发布于 2024-03-29 07:03:02

我终于找到时间来弄清楚了。当beautiful soup拉入内容并包含一个标记时,该标记将作为列表的子节点列出。这条线是罪魁祸首:

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

[0]切断了代码的另一部分,它没有被错误地解码。可怜的虫子在我这方面。该行需要替换为:

^{pr2}$

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

相关问题 更多 >