[英]How to use Pygments in Pelican with Markdown?
TLDR:我正在尝试在鹈鹕中进行CSS行编号,同时写下markdown。 Pygsments是间接使用的,你不能将选项传递给它,所以我不能分隔这些行,而且“new line”没有CSS选择器。
在Pelican中使用Markdown,我可以使用CodeHilite扩展生成代码块。 如果你使用Markdown只有RST(而且......不能将所有内容转换为RST),Pelican不支持直接使用pygments。
所以,我尝试过:
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线路编号......当编号开始和停止时,它更容易控制。
任何帮助将不胜感激,我已经搞乱了几个小时。
我知道的唯一方法是分叉CodeHilite扩展(我是开发人员)。 首先,您需要复制现有扩展(此文件 ),更改实现所需结果所需的代码,并将文件保存到PYTHONPATH(可能位于“sitepackages”目录中,其中的确切位置取决于你所使用的系统以及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。 实际上,一些选项永远不会传递给Pygments,而是由reStructeredText解析器本身处理。 如果我没记错的话,CSS行编号就是这样一个特征。 事实上,Pygments并不提供这种选择。
在这种情况下,您需要通过让Pygments返回非编号代码来修改CodeHilite扩展的fork,然后在扩展返回突出显示的代码块之前自己应用必要的钩子。 为此,您可能需要在换行符上拆分,然后循环遍历包含每一行的行。 最后,加入新包装的行并返回。
我怀疑以下(未经测试的)更改会让您入门:
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('&', '&')
通过禁用Pygments并使用JavaScript库进行突出显示,您可以更好地获得所需的内容。 这取决于您选择的JavaScript库以及它具有的功能。
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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.