Сообщить об ошибке.

Расширение codehilite модуля markdown в Python

Включение подсветки кода в разметке Markdown

Для использования расширения необходимо загрузить и установить модуль pygments.

# активируем виртуальное окружение 
$ source .venv/bin/activate
# ставим модуль markdown
(VirtualEnv) Idea@Centre:~$ python -m pip install -U pygments

Далее нужно будет определить соответствующие классы CSS с соответствующими правилами. Правила CSS должны быть определены или связаны с заголовком ваших HTML-шаблонов. Mодуль pygments может сгенерировать правила CSS. Просто запустите следующую команду из командной строки:

(VirtualEnv) Idea@Centre:~$ pygmentize -S default -f html -a .codehilite > styles.css

Если вы используете другой css_class (по умолчанию: .codehilite), то установите значение параметра -a для этого имени класса. Правила CSS будут записаны в файл styles.css.

Если нужно использовать другую тему, то замените default на желаемую тему. Для получения списка доступных тем подсветки, установленных в системе (дополнительные темы можно установить через плагины модуля pygments), выполните следующую команду:

(VirtualEnv) Idea@Centre:~$ pygmentize -L style

Более подробную информацию смотрите в документации модуля pygments.

Синтаксис:

import markdown

html = markdown.markdown(some_text, extensions=['codehilite'])

Параметры:

  • some_text - разметка Markdown,
  • extensions - список расширений модуля.

Возвращаемое значение:

  • текст в формате HTML.

Описание:

Расширение markdown.extensions.codehilite добавляет подсветку кода/синтаксиса к стандартным блокам кода разметки Markdown с использованием модуля pygments.

Расширение codehilite следует тому же синтаксису, что и обычные блоки кода Markdown, за одним исключением. Маркер должен знать, какой язык использовать для блока кода. Есть три способа указать маркеру, какой язык содержит блок кода, и каждый из них дает свой результат.

Если первая строка блока кода содержит shebang, то язык является производным от этого и используются номера строк.

#!/usr/bin/python
# Code goes here ...

В результате получится:

1 #!/usr/bin/python
2 # Code goes here ...

Если первая строка содержит shebang, но строка она не содержит пути, то эта строка удаляется из блока кода перед обработкой. Используются номера строк.

#!python
# Code goes here ...

В результате получится:

1 # Code goes here ...

Если первая строка начинается с трех или более двоеточий, то текст, следующий за двоеточиями, определяет язык. Перед обработкой первая строка удаляется из блока кода, и номера строк не используются.

:::python
# Code goes here ...

В результате получится:

# Code goes here ...

Некоторые строки могут быть выделены, это делается с помощью синтаксиса нескольких двоеточий. При использовании CSS-стилей default модуля pygments, выделенные линии имеют желтый фон. Это полезно, чтобы обратить внимание читателя на конкретные строки.

:::python hl_lines="1 3"
# This line is emphasized
# This line isn't
# This line is emphasized

В результате 1-я и 3-я строки будут подсвечены.

Расширение codehilite полностью обратно совместимо, поэтому при обнаружении блока кода, не определяющего язык, этот блок просто упаковывается в предварительные теги и выводится.

# Code goes here ...

В результате сгенерируется HTML:

<div class="codehilite"><pre><code># Code goes here ...
</code></pre></div>

Для настройки вывода доступны следующие параметры:

  • linenums: псевдоним для параметра форматирования белье Pygments. Возможные значения: True, Falseи None. По умолчанию None.
    • Использование True заставит каждый блок кода иметь номера строк, даже при использовании двоеточий ::: для идентификации языка.
    • Использование False отключит все номера строк, даже если для идентификации языка используются shebang символы #!.
  • guess_lang: автоматическое определение языка. По умолчанию True.
    • Использование False будет подсвечивать синтаксис в блоках с кодом только тогда, когда явно устанавливается язык.
  • css_class: задает имя класса CSS для тега <div>, оборачивающего блок с кодом. По умолчанию - codehilite.
  • pygments_style: задает тему подсветки pygments (ColorScheme). По умолчанию default.Примечание. Это полезно, только если для параметра noclasses установлено значение True, в противном случае стили CSS должны быть предоставлены конечным пользователем.
  • noclasses: включает встроенные стили вместо классов CSS. По умолчанию False.
  • use_pygments: при генерации вывода указывает использование модуля pygments.

    Если True (по умолчанию) и доступен модуль pygments, то расширение CodeHilite будет использовать Pygments для анализа и форматирования вывода. Кроме того, при использовании Pygments >=2.4 вывод будет заключен в теги <code>, тогда как в более ранних версиях этого не будет.

    В противном случае Pygments использоваться не будут. Если для блока кода определен язык, то он будет назначен тегу кода как класс, способом, предложенным спецификацией HTML5, и может использоваться библиотекой JavaScript в браузере для выделения блока кода. Смотрите параметр lang_prefix, чтобы настроить префикс.

  • lang_prefix: префикс, добавленный к классу языка, назначенному тегу кода HTML. Язык по умолчанию language-.

    Этот параметр применяется только в том случае, если для параметра use_pygments установлено значение False, поскольку Pygments не предоставляет возможности для включения языкового префикса.

Пример создания подсветки синтаксиса блока кода Markdown:

import markdown
text = """
    #!/usr/bin/python
    # Code goes here ...
"""
config = {'codehilite':{'linenums': 'False', 'css_class': 'code-hilite'}}
html = markdown.markdown(text, extensions=['codehilite'], extension_configs=config)
print(html)
# <div class="code-hilite">
# <pre><code>
# <span class="ch">#!/usr/bin/python</span>
# <span class="c1"># Code goes here ...</span>
# </code></pre>
# </div>