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.


