Pergunta

Eu tenho trabalhado no meu blog com base própria Django (como todos, eu sei) para aguçar o meu python, e eu pensei que adicionado algum destaque sintaxe seria muito grande. Eu olhei para alguns dos trechos lá fora e decidiu combinar alguns e escrever meu próprio realce de sintaxe filtro modelo usando Bela Sopa e Pygments. Parece que este:

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

Ele procura por um bloco de código como este e destaques e anúncios nos estilos relevantes:

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

Isso foi tudo funcionando bem até que um bloco de código que foi incluído tinha algum html nele. Agora, eu sei tudo a necessidade html I, então eu escrevo meus posts diretamente nele e quando o processamento para o modelo, basta marcar o corpo pós tão seguro:

{{ post.body|pygmentize|safe }}

Esta abordagem resulta em qualquer html em um bloco de código apenas renderização como html (ou seja, não aparecendo). Eu fui brincar com o uso da função de Django fuga no código extraído do corpo pelo meu filtro, mas eu nunca consigo parecem obtê-lo direito. Acho que a minha compreensão do conteúdo escapando apenas não é suficiente completa. Eu também tentei escrever a versão escapou no corpo pós (por exemplo, <), mas ele só sai como texto.

O que é a melhor maneira de marcar o html para exibição? Eu vou sobre esta tudo errado?

Graças.

Foi útil?

Solução

Eu finalmente encontrei algum tempo para descobrir isso. Quando bela sopa puxa no conteúdo e que contém uma tag, a tag é listado como um sub nó de uma lista. Esta linha é o culpado:

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

Os [0] corta a outra parte do código, ele não está sendo decodificado incorretamente. manchas bug pobre da minha parte. Que as necessidades de linha para ser substituída por:

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

As lições aqui são certifique-se de saber qual é o problema e saber como o seu bibliotecas trabalho.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top