Pull to refresh

Подсветка исходного кода

Reading time4 min
Views4.2K
Так получилось, что на хабре принято подсвечивать код с помощью Source Code Highlighter. Список поддерживаемых языков не впечатляет, да и возможности выбрать цветовую схему я не нашел. Существует библиотека pygments, которая понимает большинство используемых языков, умеет выдавать на выходе html, картинки, latex и не только. Но для хабры, как известно, нужен особый подход, и html вывод pygments хабра не пропускает. В связи с этим я написал небольшой класс для pygments, который исправляет это досадное недоразумение. Воспользоваться веб-версией можно по адресу paste.ly.

# -*- coding: utf-8 -*-

from pygments.formatter import Formatter

class HabrFormatter(Formatter):
    
    _html_escape_table = (('&''&'),
                          ('<''&lt;'),
                          ('>''&gt;'),
                          ('"''&quot;'),
                          ("'"'&#39;'),
                          (' ''&nbsp;'),
                          ('\t''&nbsp;'*4))
    
    def escape_html(self, value):
        return reduce(lambda value, rep: value.replace(*rep),
                      self._html_escape_table, value)
    
    def format_unencoded(self, tokensource, outfile):
        outfile.write('<blockquote><code>')
        last_start = last_end = ''
        for token_type, value in tokensource:
            value = self.escape_html(value)
            style = self.style.style_for_token(token_type)
            start = end = ''
            if style['color']:
                start += '<font color="#%s">' % style['color']
                end = '</font>' + end
            if style['bold']:
                start += '<strong>'
                end = '</strong>' + end
            if style['italic']:
                start += '<em>'
                end = '</em>' + end
            if style['underline']:
                start += '<u>'
                end = '</u>' + end
            if last_start != start:
                outfile.write(last_end)
                outfile.write(start)
            outfile.write(value)
            last_start, last_end = start, end
        outfile.write('</code></blockquote>')

Единственная неприятность — не получается изменить цвет фона на хабре, что делает не все цветовые стили pygments пригодными для использования.
Tags:
Hubs:
+29
Comments28

Articles