Kategorije bloga

Isticanje koda u Django template uz pomoć Pygments-a

Ako želite da prikažete i istaknete kod na stranama vašeg Django sajta, izvrstan alat je Pygments, ali njegovo podešavanje zahteva malo više vremena. Evo primera kako to ipak možete uraditi jednostavno i brzo koristeći ovaj snipet kod.

Pratite sledeće korake:

  • 1. Instalirajte Pygments
  • 2. Odredite koji od pygments stilova želite da koristite isprobavanjem ponuđenih stilova na njihovom sajtu
  • 3. Kreirajte pygments css fajl za odabrani stil koji vam se dopao, tako što ćete otvoriti terminal i pokrenuti pygmentize komandu da generišete CSS fajl, za isticanje vašeg koda. U primeru koristimo default stil.
  • pygmentize -S default -f html > default.css
    

    Uključite generisan fajl u vašu stranu.

    <link rel="stylesheet" type="text/css" href="{% static 'css/default.css' %}">
    

    4. Dodajte sledeći filter u vašu aplikaciju:

    #!/usr/bin/python
    #-*- coding: UTF-8 -*-
    from django import template
    import re
    import pygments
    from pygments.lexers import LEXERS, get_lexer_by_name
    from pygments import highlight
    from pygments.formatters import HtmlFormatter
    
    register = template.Library()
    
    regex = re.compile(r'<code>(.*?)</code>', re.DOTALL)
    
    @register.filter(name='gsailpygment')
    def gsailpygment(value):
        try:
            last_end = 0
            to_return = ''
            found = 0
            for match_obj in regex.finditer(value):
                code_string = match_obj.group(1)
                try:
                    lexer = pygments.lexers.guess_lexer(code_string)
                except ValueError:
                    lexer = pygments.lexers.PythonLexer()
                pygmented_string = pygments.highlight(code_string, lexer, pygments.formatters.HtmlFormatter())
                to_return = to_return + value[last_end:match_obj.start(1)] + pygmented_string
                last_end = match_obj.end(1)
                found = found + 1
            to_return = to_return + value[last_end:]
            return to_return
        except:
            return value
    

    5. Kod na vašoj strani koji želite da istaknete obavijte (wrap) sa <code> tagom.

    6. U vašem template fajlu uključite filter i koristite ga zajedno sa safe filterom.

    {{ value|gsailpygment|safe }}
    

    Živeli!