使用 Pygments 过滤空格和换行符

Posted

技术标签:

【中文标题】使用 Pygments 过滤空格和换行符【英文标题】:Filter whitespace and newlines with Pygments 【发布时间】:2011-03-22 01:33:50 【问题描述】:

我一直在尝试向我的 django 网站添加语法高亮。问题是我正在格式化 <br /> 字符。有没有办法保留这些字符?这是我正在使用的代码:

from BeautifulSoup  import BeautifulSoup
from django import template
from django.template.defaultfilters import stringfilter
import pygments
import pygments.formatters
import pygments.lexers


register = template.Library()

@register.filter
@stringfilter
def pygmentized(html):
    soup = BeautifulSoup(html)
    codeblocks = soup.findAll('code')
    for block in codeblocks:
        if block.has_key('class'):
            try:
                code = ''.join([unicode(item) for item in block.contents])
                lexer = pygments.lexers.get_lexer_by_name(block['class'], stripall=True)
                formatter = pygments.formatters.HtmlFormatter()
                code_hl = pygments.highlight(code, lexer, formatter)
                block.contents = [BeautifulSoup(code_hl)]
                block.name = 'code'
            except:
                raise
    return unicode(soup)

【问题讨论】:

 通常用于代码块。这样你就不需要<br> 
谢谢 Petri。我以前应该读过关于 html 标签的内容,真丢人。 【参考方案1】:

好吧,Petri 是对的,pre 是针对代码块的。在他指出我刚刚写了一个函数来清理第一个输出之前,它很乱,但也许只需要从最终输出中删除某些东西的人可能会发现它没问题:

from BeautifulSoup  import BeautifulSoup
from django import template
from django.template.defaultfilters import stringfilter
import pygments
import pygments.formatters
import pygments.lexers


register = template.Library()
wanted = 'br': '<br />', 'BR': '<BR />', 'nbsp': '&nbsp;', 'NBSP': '&NBSP;', '/&gt;': ''

def uglyfilter(html):
    content = BeautifulSoup(html)
    for node in content.findAll('span'):
        data = ''.join(node.findAll(text=True))
        if wanted.has_key(data):
            node.replaceWith(wanted.get(data))
    return unicode(content)     


@register.filter
@stringfilter
def pygmentized(html):
    soup = BeautifulSoup(html)
    codeblocks = soup.findAll('pre')
    for block in codeblocks:
        if block.has_key('class'):
            try:
                code = ''.join([unicode(item) for item in block.contents])
                lexer = pygments.lexers.get_lexer_by_name(block['class'], stripall=True)
                formatter = pygments.formatters.HtmlFormatter()
                code_hl = pygments.highlight(code, lexer, formatter)
                clean = uglyfilter(code_hl)
                block.contents = [BeautifulSoup(clean)]
                block.name = 'pre'
            except:
                raise
    return unicode(soup)

【讨论】:

以上是关于使用 Pygments 过滤空格和换行符的主要内容,如果未能解决你的问题,请参考以下文章

使用 charAt() 查找空格、换行符和制表符

在 PHP 中用一个空格替换多个空格和换行符

使用 jQuery 删除 HTML 元素之间的空格和换行符

使用从 xml 到 html 的 xsl 转换来维护空格和换行符

使用 json_encode() 时如何添加空格和换行符? [复制]

如何使用正则表达式 python3 替换除空格和换行符旁边的数字以外的所有其他符号