Как стать автором
Обновить

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

Время на прочтение4 мин
Количество просмотров4.4K
Так получилось, что на хабре принято подсвечивать код с помощью 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 пригодными для использования.
Теги:
Хабы:
Всего голосов 47: ↑38 и ↓9+29
Комментарии28

Публикации

Истории

Работа

Data Scientist
102 вакансии
Python разработчик
200 вакансий

Ближайшие события

27 августа – 7 октября
Премия digital-кейсов «Проксима»
МоскваОнлайн
28 – 29 сентября
Конференция E-CODE
МоскваОнлайн
28 сентября – 5 октября
О! Хакатон
Онлайн
30 сентября – 1 октября
Конференция фронтенд-разработчиков FrontendConf 2024
МоскваОнлайн
3 – 18 октября
Kokoc Hackathon 2024
Онлайн
7 – 8 ноября
Конференция byteoilgas_conf 2024
МоскваОнлайн