Einfacher Syntax-Highlighting Templatefilter für Django


Es ist eigentlich ganz einfach einen Templatefilter für Django zu schreiben, der Syntax highlighten kann, jedoch habe ich noch keinen entsprechenden gefunden. Darum habe ich meinen eigenen geschrieben und möchte ihn hier mit der Welt teilen.

Die funktionsweise ist ganz einfach. Es wird einfach nach <pre> Elementen im HTML-Code gesucht. Diese werden dann entweder mit der angegebenen Sprache (<pre lang="python">) gehighlightet, oder es wird versucht die Sprache zu erkennen.

Es werden nur Pygments und BeautifulSoup benötigt, um den Filter zu benutzen.

Der Code:

from django import template
 
from pygments import highlight as pygments_highlight
from pygments.lexers import guess_lexer, TextLexer, get_lexer_by_name
from pygments.formatters import HtmlFormatter
from BeautifulSoup import BeautifulSoup
 
register = template.Library()
 
@register.filter
def highlight(value):
	soup = BeautifulSoup(value)
	pre_list = soup.findAll('pre')
	for pre in pre_list:
		try:
			lexer = get_lexer_by_name(pre['lang'])
		except KeyError:
			try:
				lexer = guess_lexer(pre.renderContents())
			except ValueError:
				lexer = TextLexer()
		pre.replaceWith(pygments_highlight(pre.renderContents(), lexer, HtmlFormatter(linenos=True)))
	return unicode(soup)

Die entsprechenden Styles für Pygments müssen natürlich manuell eingebunden werden.

Lizenz: Der Code ist unter der BSD-Lizenz verfügbar.

[Update] Der Filter hatte ein paar kleine Probleme und ich habe ihn weiter verbessert. Der Code ist jetzt genau der gleiche, wie er auch auf Xairro.com verwendet wird.

Informationen und Links

Mach' mit, indem du kommentierst, verfolgst was andere zu sagen haben oder von deinem Blog aus verlinkst.


Weitere Artikel
Mozilla hat den Weltrekord
Django - Was sind Models?

Einen Kommentar schreiben

Nimm dir einen Moment Zeit und sage uns, was du denkst. Du darfst ein bisschen HTML zur Formatierung verwenden.

Kommentare

Sei der Erste, der einen Kommentar schreibt!