Django: templatetag pygments
Cuando empecé a programar mi propio pasteador de código (post relacionado) una de las features que quería incorporarle era un mínimo coloreado que facilitara la lectura del mismo. Navegando, leyendo y preguntando vi que ya existía pygments así que ¿por qué reinventar la rueda?.
Obviamente tenía que aprender a integrar este tipo de addons dentro de mi proyecto Django... y así me enteré de la existencia de los templatetags. Crear uno es sencillo, hacemos una carpeta templatetags dentro del directorio de la aplicación (con su respectivo __ini__.py) y dentro un colorea.py con el siguiente código:
# -*- coding: utf-8 -*-
from django import template
from pygments import highlight
from pygments.lexers import get_lexer_by_name
from pygments.formatters import HtmlFormatter
register = template.Library()
class CodeHtmlFormatter(HtmlFormatter):
def wrap(self, source, outfile):
return self._wrap_code(source)
def _wrap_code(self, source):
yield 0, "<code>"
suma = 0
for i, t in source:
suma = suma + 1;
t = "</code></pre><div class='lines line-"+str(suma)+"'><pre><code>"+t+"</code></pre></div>"
yield i, t
yield 0, "</code>"
@register.filter
def coloreame(paste):
lexer = get_lexer_by_name(paste.language.language, stripall=True)
formatter = CodeHtmlFormatter(linenos="table", cssclass="source", full=True,
anchorlinenos=True, lineanchors="line", lineseparator="\n")
return highlight(paste.paste, lexer, formatter)
Es sencillo, la función coloreame es la encargada de colorear el código a través de la clase CodeHtmlFormatter, así que cuando queramos colorear el código no hace falta más que llamar a este nuevo filtro como si fuera de los builtin, por ejemplo:
{% extends "base.html" %}
{% load colorea %}
{% block content %}
<div class="codehilite">{{ paste|coloreame }}</div>
{% endblock %}
Y no hay mucho más truco. Se trata de una gran forma de mejorar los filtros que trae Django de serie hasta donde nuestra imaginación nos permita. (más información).