Frage

Ich habe auf meinem eigenen django basierten Blog arbeitet (wie jeder, ich weiß) meine Python zu schärfen, und ich dachte, einige Syntax Highlight wäre ziemlich groß hinzugefügt. Ich schaute auf die Schnipsel auf einige da draußen, und beschlossen, ein paar zu kombinieren und schreibe meine eigenen Syntaxvorlage Filter Schöne Suppe und Pygments hervorgehoben. Es sieht wie folgt aus:

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

Es sieht für einen Codeblock wie folgt und Highlights und Anzeigen der relevanten Arten:

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

Das war alles funktioniert gut, bis ein Code-Block I eingeschlossen wurde es einige html hatte. Nun, ich weiß, alle html ich brauche, so schreibe ich meine Blog-Posts direkt in sie und wenn sie auf die Vorlage Rendering, markieren Sie einfach die Post Körper als sicher:

{{ post.body|pygmentize|safe }}

Dieser Ansatz führt zu einem beliebigen HTML in einem Codeblock nur als HTML-Rendering (dh nicht angezeigt). Ich habe mit der Verwendung der django Escape-Funktion auf dem Code von Körper durch meine Filter extrahiert herumspielen, aber ich kann nie ganz scheinen, um es richtig zu machen. Ich glaube, mein Verständnis des Inhalts zu entkommen gerade genug, um nicht abgeschlossen ist. Ich habe auch versucht, die maskierte Version in der Post Körper zu schreiben (zB <), aber es kommt nur als Text aus.

Was ist der beste Weg, um die HTML für die Anzeige markieren? Werde ich über dieses alles falsch?

Danke.

War es hilfreich?

Lösung

Ich habe festgestellt, endlich Zeit, es herauszufinden. Wenn schöne Suppe in dem Inhalt zieht und es enthält einen Tag wird der Tag als Unterknoten einer Liste aufgeführt. Diese Linie ist der Täter:

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

Die [0] abschneidet dem anderen Teil des Codes, ist es nicht falsch decodiert werden. Schlechte Fehler Flecken auf meiner Seite. Diese Linie muss ersetzt werden mit:

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

Die Lektionen sind hier stellen Sie sicher wissen, was das Problem ist, und wissen, wie Sie Ihre Bibliotheken arbeiten.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top