我一直在写我自己的基于 django 的博客(就像我认识的每个人一样)来提高我的 python,我认为添加一些语法高亮会非常棒。我查看了那里的一些片段,并决定结合一些片段并使用 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 的最佳方法是什么?我对这一切都错了吗?
谢谢。