Django destaque de sintaxe causando problemas de caráter escapar
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.
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.