J'ai travaillé sur mon propre blog basé sur django (comme tout le monde, je le sais) pour aiguiser mon python, et je pensais que l'ajout de syntaxe serait super. J'ai regardé quelques-uns des extraits et j'ai décidé d'en combiner quelques-uns et d'écrire mon propre filtre de gabarit de coloration en utilisant Beautiful Soup et Pygments. Il ressemble à ceci:Synchronisation de la syntaxe de Django causant des problèmes d'échappement de caractères
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 les annonces les styles pertinents:
<code class="python">
print "Hello World"
</code>
Ce fut tout fonctionne bien jusqu'à ce qu'un bloc de code que je faisais partie avait quelques-uns html dedans. Maintenant, je sais tout le code html j'ai besoin, donc j'écris mes messages de blog directement et lors du rendu au modèle, marquer tout le corps de poste sûr:
{{ post.body|pygmentize|safe }}
Cette approche donne lieu à une html dans un code bloque juste le rendu en html (c'est-à-dire ne pas apparaître). J'ai joué avec l'utilisation de la fonction d'échappement de django sur le code extrait du corps par mon filtre, mais je n'arrive jamais à le faire correctement. 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 du message (par exemple, <), mais cela sort juste comme du texte.
Quelle est la meilleure façon de marquer le code HTML pour l'affichage? Est-ce que je vais à ce sujet tout faux?
Merci.