Подстветка синтаксиса в Django
Приделал к бложику подсветку синтаксиса. Для этого изобрел специальный template-тег для Django. В отличие от большинства существующих решений, подсветка делается не на стороне клиента, а на сервере. Ниже представлен исходный код, который вы можете свободно использовать.
Для работы этого тега требуется установленная утилита highlight. В Убунте она имеется, и, я думаю, что в других дистрибутивах тоже.
Код тега прост до безобразия:
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, то есть Питон.
Кроме того, понадобится таблица стилей, чтобы полученный код заиграл новыми красками. Я, например, использую такую:
.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; }
Пользуйтесь на здоровье.
Комментарии