如何在使用Markdown的Pelican中使用Pygments?

4
TLDR:我正在尝试在使用Markdown写作的Pelican网站中进行CSS行编号。 Pygments被间接使用,您无法向其传递选项,因此无法分离行,并且没有“新行”的CSS选择器。
在Pelican中使用Markdown,我可以使用CodeHilite扩展生成代码块。如果您使用Markdown,Pelican不支持直接使用pygments...只支持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行号...它更容易控制何时开始和停止编号。

任何帮助都将不胜感激,我已经折腾了几个小时。

2个回答

6
我所知道的唯一方法是 fork CodeHilite Extension(我就是这个扩展程序的开发者)。首先,你需要复制现有扩展程序的副本(这个文件),修改代码以实现你想要的结果,并将该文件保存到 PYTHONPATH (可能在“site-packages”目录中,其确切位置取决于你使用的系统和 Python 的安装方式)。请注意,你需要为你的文件创建一个唯一的名称,以避免与其他 Python 包发生冲突。
完成上述步骤后,你需要告诉 Pelican。由于 Pelican 的配置文件只是 Python,所以导入你的新扩展程序(使用你的文件名而不带扩展名: yourmodule.py => yourmodule ),并将其包括在扩展列表中。
from yourmodule import CodeHiliteExtension
MD_EXTENSIONS = [
CodeHiliteExtension(css_class='highlight', linenums=False),
'extra']

请注意,对于CodeHiliteExtension的调用不是一个字符串,而是实际调用类并传递适当的参数,您可以根据需要进行调整。
如果您想设置更容易部署扩展程序的方式(或者分发给其他人使用),您可能需要考虑创建一个setup.py文件,这超出了本问题的范围。有关Markdown扩展的帮助,请参见此教程
如果您需要特定的帮助来更改扩展程序中的代码,则取决于您想要实现什么目标。要开始,参数传递到第117行的Pygments。最简单的方法是在那里硬编码所需的选项。
请注意,如果您试图复制reStructuredText中的行为,您可能会感到失望。 Docutils包装了一些自己的处理工具。事实上,一些选项从未传递给Pygments,而是由reStructeredText解析器本身处理。如果我没记错的话,CSS行号就是这样一个功能。实际上,Pygments不提供这个选项。
在这种情况下,您需要通过修改CodeHilite Extension的fork使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库以及它具有哪些功能。


3

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接