Mise en évidence de la syntaxe Django causant des problèmes d'échappement de caractères

StackOverflow https://stackoverflow.com/questions/1607979

Question

J'ai travaillé sur mon propre blog basé sur django (comme tout le monde, je le sais) pour affiner mon python, et je pensais que l'ajout d'un surlignage syntaxique serait vraiment génial. J'ai jeté un coup d'œil à certains extraits et décidé d'en combiner quelques-uns et d'écrire mon propre filtre de modèle de surbrillance de la syntaxe à l'aide de Beautiful Soup and Pygments. Cela ressemble à ceci:

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

Il recherche un bloc de code comme celui-ci et met en évidence et annonce les styles appropriés:

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

Tout fonctionnait bien jusqu'à ce qu'un bloc de code dans lequel j'étais inclus contienne du code HTML. Maintenant, je connais tout le html dont j'ai besoin, alors j'écris mes articles de blog directement dans celui-ci et lors du rendu au modèle, marquez simplement le corps de l'article comme étant sûr:

{{ post.body|pygmentize|safe }}

Cette approche aboutit à ce que tout code HTML apparaisse dans un bloc de code simplement rendu au format HTML (c'est-à-dire qu'il ne s'affiche pas). Je me suis amusé à utiliser la fonction d'échappement django sur le code extrait de body par mon filtre, mais je n'arrive jamais vraiment à comprendre. Je pense que ma compréhension du contenu qui s'échappe n'est pas assez complète. J'ai également essayé d'écrire la version échappée dans le corps de l'article (par exemple, & Lt;), mais elle ne reste que du texte.

Quel est le meilleur moyen de marquer le code HTML à afficher? Est-ce que je vais à ce sujet tout faux?

Merci.

Était-ce utile?

La solution

J'ai enfin trouvé un peu de temps pour le comprendre. Lorsque la belle soupe affiche le contenu et qu'il contient une balise, celle-ci est répertoriée comme un sous-nœud d'une liste. Cette ligne est le coupable:

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

Le [0] coupe l’autre partie du code, il n’est pas décodé correctement. Pauvre bogue repérant de ma part. Cette ligne doit être remplacée par:

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

Les leçons ici sont de vous assurer de connaître le problème et de savoir comment fonctionnent vos bibliothèques.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top