Подстветка синтаксиса в Django

Приделал к бложику подсветку синтаксиса. Для этого изобрел специальный template-тег для Django. В отличие от большинства существующих решений, подсветка делается не на стороне клиента, а на сервере. Ниже представлен исходный код, который вы можете свободно использовать.

Для работы этого тега требуется установленная утилита highlight. В Убунте она имеется, и, я думаю, что в других дистрибутивах тоже.

Код тега прост до безобразия:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
from django import template
import subprocess, shlex


register = template.Library()


class HightlightNode(template.Node):

    def __init__(self, nodelist, format):
        self.nodelist = nodelist
        self.format = format

    def render(self, context):
        output = self.nodelist.render(context)
        args = shlex.split("highlight -S %s -f" % str(self.format))
        try:
            p = subprocess.Popen(args, stdin=subprocess.PIPE, stdout=subprocess.PIPE)
            out, errors = p.communicate(output.encode('utf-8'))
            if out:
                output = out.decode('utf-8')
        except:
            pass

        return output


@register.tag(name="highlight")
def do_highlight(parser, token):
    parts = token.split_contents()
    tag_name = parts[0]
    args = parts[1:]
    if len(args) != 1:
        raise template.TemplateSyntaxError, "%r tag requires exactly one argument" % tag_name
    nodelist = parser.parse(('endhighlight',))
    parser.delete_first_token()    
    return HightlightNode(nodelist, args[0])

В шаблон это хозяйство вставляется следующим образом:

{% highlight py %}SOME PYTHON CODE{% endhighlight %}

Параметр тега — это формат исходного кода. В данном случае это py, то есть Питон.

Кроме того, понадобится таблица стилей, чтобы полученный код заиграл новыми красками. Я, например, использую такую:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
.hl.num {
  color: #2928ff;
}

.hl.esc {
  color: #ff00ff;
}

.hl.str {
  color: #ff0000;
}

.hl.dstr {
  color: #818100;
}

.hl.slc {
  color: #838183;
  font-style: italic;
}

.hl.com {
  color: #838183;
  font-style: italic;
}

.hl.dir {
  color: #008200;
}

.hl.sym {
  color: #000000;
}

.hl.line {
  color: #555555;
}

.hl.mark {
  background-color: #ffffbb;
}

.hl.kwa {
  color: #000000;
  font-weight: bold;
}

.hl.kwb {
  color: #830000;
}

.hl.kwc {
  color: #000000;
  font-weight: bold;
}

.hl.kwd {
  color: #010181;
}

Пользуйтесь на здоровье.