我所知道的唯一方法是 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:
txt = self.src.replace('&', '&')
如果禁用Pygments并使用JavaScript库进行高亮显示,则可能更容易实现所需的效果。这取决于您选择哪个JavaScript库以及它具有哪些功能。