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).
Comentarios
Para entender el framework supongo que primero tendría que entender python.
En fin vaya asco de comentario, feliz semana santa.
@register.inclusion_tag('registration/login.html', takes_context=True)
def get_login(context):
...
return {'formLogin': mark_safe(AuthenticationForm())}
El caso es que mi template no detecta el formulario cuando intento acceder a él añadiendo: {{ formLogin.username }},{{ formLogin.password }},...
También he añadido {% load mytags %}{% get_login %}
en mi base.html.
¿Me falta algún método en el templatetag? ¿Se os ocurre algo???
Gracias