Как использовать Pygments в Pelican с Markdown?

TLDR: я пытаюсь сделать нумерацию строк CSS в pelican, а пишу в уценке. Pygments используется косвенно, и вы не можете передать ему параметры, поэтому я не могу разделить строки, и нет селектора CSS для «новой строки».

Используя Markdown в Pelican, я могу генерировать блоки кода с помощью расширения CodeHilite. Pelican не поддерживает использование пигментов напрямую, если вы используете Markdown... только RST (и... нет преобразования всего в RST).

Итак, что я пробовал:

MD_EXTENSIONS = [
'codehilite(css_class=highlight,linenums=False,guess_lang=True,use_pygments=True)',
'extra']

А также:

:::python
<div class="line">import __main__ as main</div>

А также:

PYGMENTS_RST_OPTIONS = {'classprefix': 'pgcss', 'linenos': 'table'}

Могу ли я получить номера строк для отображения? Да. Могу ли я заставить их перейти к следующему блоку кода? Нет. И именно поэтому я хочу использовать нумерацию строк CSS... так проще контролировать, когда нумерация начинается и заканчивается.

Любая помощь будет принята с благодарностью, я возился с этим несколько часов.


person AtHeartEngineer    schedule 14.04.2015    source источник


Ответы (2)


Единственный способ, о котором я знаю, - это разветвить расширение CodeHilite (и я разработчик). Сначала вам нужно будет сделать копию существующего расширения (это file), внесите изменения в код, необходимые для получения желаемого результата, и сохраните файл в вашем PYTHONPATH (вероятно, в каталоге «sitepackages», точное расположение которого зависит от того, в какой системе вы работаете и как Питон был установлен). Обратите внимание, что вам нужно создать уникальное имя для вашего файла, чтобы не конфликтовать с другими пакетами Python.

Как только вы это сделаете, вам нужно рассказать об этом Пеликану. Поскольку файл конфигурации Pelican — это просто Python, импортируйте новое расширение (используйте имя вашего файла без расширения файла: yourmodule.py => yourmodule) и включите его в список расширений.

from yourmodule import CodeHiliteExtension
MD_EXTENSIONS = [
CodeHiliteExtension(css_class='highlight', linenums=False),
'extra']

Обратите внимание, что вызов CodeHiliteExtension не является строкой, а фактически вызывает класс и передает соответствующие аргументы, которые вы можете настроить по мере необходимости.

И это должно быть так. Если вы хотите настроить более простой способ развертывания вашего расширения (или распространения его для использования другими), вы можете подумать о создании файла setup.py, что выходит за рамки этого вопроса. См. этот учебник для получения помощи. к расширениям Markdown.

Если вам нужна конкретная помощь с изменениями, которые необходимо внести в код расширения, это зависит от того, чего вы хотите достичь. Для начала аргументы передаются в Pygments в строке 117. Самый простой подход — жестко запрограммировать там нужные параметры.


Имейте в виду, что если вы попытаетесь воспроизвести поведение в reStructuredText, вы, вероятно, будете разочарованы. Docutils оборачивает Pygments некоторой собственной обработкой. Фактически, некоторые параметры никогда не передаются в Pygments, а обрабатываются самим синтаксическим анализатором reStructeredText. Если я правильно помню, нумерация строк CSS является одной из таких функций. На самом деле Pygments не предлагает такой опции.

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


Я подозреваю, что следующие (непроверенные) изменения помогут вам начать работу:

diff --git a/markdown/extensions/codehilite.py b/markdown/extensions/codehilite.py
index 0657c37..fbd127d 100644
--- a/markdown/extensions/codehilite.py
+++ b/markdown/extensions/codehilite.py
@@ -115,12 +115,18 @@ class CodeHilite(object):
                 except ValueError:
                     lexer = get_lexer_by_name('text')
             formatter = get_formatter_by_name('html',
-                                              linenos=self.linenums,
+                                              linenos=self.linenums if self.linenumes != 'css' else False,
                                               cssclass=self.css_class,
                                               style=self.style,
                                               noclasses=self.noclasses,
                                               hl_lines=self.hl_lines)
-            return highlight(self.src, lexer, formatter)
+            result = highlight(self.src, lexer, formatter)
+            if self.linenums == 'css':
+                lines = result.split('\n')
+                for i, line in enumerate(lines):
+                    lines[i] = '<div class="line">%s</div>' % line
+                result = '\n'.join(lines)
+            return result
         else:
             # just escape and build markup usable by JS highlighting libs
             txt = self.src.replace('&', '&amp;')

Вы можете добиться большего успеха в достижении того, чего хотите, отключив Pygments и используя библиотеку JavaScript для выделения. Это зависит от того, какую библиотеку JavaScript вы выберете и какие функции она имеет.

person Waylan    schedule 15.04.2015

TL; DR

в pelicanconf.py добавьте это:

# for highlighting code-segments
# PYGMENTS_RST_OPTIONS = {'cssclass': 'codehilite', 'linenos': 'table'}   # disable RST options
MD_EXTENSIONS = ['codehilite(noclasses=True, pygments_style=native)', 'extra']  # enable MD options

Очевидно, вам нужно правильно установить эти

pip install pygments markdown
person kmonsoor    schedule 21.11.2015