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)