Domanda

Ho lavorato sul mio blog basato su django (come tutti, lo so) per affinare il mio pitone, e ho pensato che l'aggiunta di alcuni punti salienti della sintassi sarebbe stata grandiosa. Ho guardato alcuni frammenti là fuori e ho deciso di combinarne alcuni e scrivere il mio filtro modello di evidenziazione della sintassi usando Beautiful Soup e Pygments. Sembra così:

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

Cerca un blocco di codice come questo ed evidenzia e pubblicizza gli stili pertinenti:

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

Tutto funzionava bene fino a quando un blocco di codice che avevo incluso non conteneva un po 'di HTML. Ora conosco tutto l'html di cui ho bisogno, quindi scrivo i miei post sul blog direttamente in esso e quando eseguo il rendering sul modello, contrassegnare il corpo del post come sicuro:

{{ post.body|pygmentize|safe }}

Questo approccio porta a qualsiasi html in un blocco di codice che viene semplicemente visualizzato come html (ovvero, non viene visualizzato). Ho giocato con l'uso della funzione di escape django sul codice estratto da body dal mio filtro, ma non riesco mai a farlo bene. Penso che la mia comprensione del contenuto in fuga non sia abbastanza completa. Ho anche provato a scrivere la versione con escape nel corpo del post (ad es. & Lt;), ma viene appena visualizzato come testo.

Qual è il modo migliore per contrassegnare l'html per la visualizzazione? Sto sbagliando tutto?

Grazie.

È stato utile?

Soluzione

Ho finalmente trovato un po 'di tempo per capirlo. Quando la bella zuppa estrae il contenuto e contiene un tag, il tag viene elencato come un nodo secondario di un elenco. Questa linea è il colpevole:

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

Lo [0] interrompe l'altra parte del codice, non viene decodificato in modo errato. Scarsa segnalazione di bug da parte mia. Quella riga deve essere sostituita con:

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

Le lezioni qui riportate ti assicurano di sapere qual è il problema e di sapere come funzionano le tue librerie.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top