Django: templatetag pygments - Userlinux.net

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…

Django: templatetag pygments

18.Apr.2011 ~ 4 Comentarios ~ 1132 Lecturas

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=&#39;lines line-"+str(suma)+"&#39;><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).

Categorías: programación

Comentarios


gravatar
19.Apr.2011
¡Muy bueno! Se nota que le estás dando caña a django.

gravatar
20.Apr.2011
No me he enterado de nada(tampoco he hecho mucho esfuerzo).
Para entender el framework supongo que primero tendría que entender python.
En fin vaya asco de comentario, feliz semana santa.

gravatar
smith
05.Jul.2011
Hola! Yo también estoy utlizando templatetags, pero en mi caso lo que quiero es incluir un formulario de login en todas las templates de mi web. Quiero hacer uso del AuthenticationForm de django.contrib.auth.views.login. He seguido la documentacion y mi templatetag queda así:

@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

Comentarios


Los comentarios están cerrados: los comentarios se cierran automáticamente una vez pasados 15 días. Si quieres comentar algo acerca de la anotación, puedes hacerlo por e-mail.

Buscar

Cargando...

Últimos comentarios

  • graffic
  • reidrac
  • reidrac
  • Wu
  • dilam
  • r0sk
  • reidrac
  • r0sk
  • chucu
  • r0sk
  • el_palomo_programador
  • r0sk
  • reidrac
  • Player 1
  • r0sk

Moneting

Valor de mi cuenta de Facebook según Moneting
Valor de mi cuenta de Twitter según Moneting

Tagcloud

bsd humor bake twitter vacaciones ps3 hack 2007 python blog django alemania_2006 mundial cake felicidades games conciertos rsidenotes juegos openbsd web iphone sidenotes rfilms ubuntu barça cakephp blogsfera mac bash meme macosx deportes canción ds personal films freebsd 2008 opinion nintendo sysadmin futbol mysql php frases userlinux debian ssh linux blogs champions apple lugo league programación twitt lucux seguridad cumpleaños

Archivo

Social

Enlaces de interés