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 %}
&lt;div class="codehilite"&gt;{{ paste|coloreame }}&lt;/div&gt;
{% 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).

code django

About the author

Óscar
has doubledaddy super powers, father of Hugo and Nico, husband of Marta, *nix user, Djangonaut and open source passionate.