Pygmentsのシンタックスハイライトをフィルタで使う

PygmentsのシンタックスハイライトをDjangoのフィルタで使う。
Django snippetsを探せばありそうだけど、作ってみた。
settingsでPYGMENTS_LINENOS=Trueなら行番号を表示する。

templatetags/sourcecode.py

from django.template.defaultfilters import stringfilter
from django import template
from django.utils.encoding import force_unicode
from django.utils.safestring import mark_safe
from django.conf import settings

from pygments import highlight
from pygments.lexers import get_lexer_by_name
from pygments.formatters import HtmlFormatter

register = template.Library()

@stringfilter
def sourcecode(value, lexer_name):
    formatter = HtmlFormatter(linenos=getattr(settings, 'PYGMENTS_LINENOS', False))
    try:
        lexer = get_lexer_by_name(lexer_name)
    except ValueError:
        lexer = get_lexer_by_name('text')
    parsed = highlight(value, lexer, formatter)
    return mark_safe(force_unicode(parsed))

register.filter(sourcecode)