2009-10-22 9 views
1

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.

Répondre

1

J'ai finalement trouvé le temps de le comprendre. Quand la belle soupe tire dans le contenu et qu'elle contient une étiquette, la balise est listée comme un sous-noeud d'une liste. Cette ligne est le coupable:

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

[0] coupe l'autre partie du code, il est pas mal décodé. Pauvre spotting spotting de ma part. Cette ligne doit être remplacé par:

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

Les leçons sont ici assurer que vous savez quel est le problème, et de savoir comment fonctionnent vos bibliothèques.

Questions connexes