如何通过 Markdown 在 Pelican 中使用 Pygments?
How to use Pygments in Pelican with Markdown?
TLDR:我正在尝试在 pelican 中执行 CSS 行编号,同时在 markdown 中编写。 Pygments 是间接使用的,你不能将选项传递给它,所以我不能分开行,也没有 "new line".
的 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 行编号...它更容易控制编号开始和停止的时间。
任何帮助将不胜感激,我已经搞砸了几个小时。
我知道的唯一方法是分叉 CodeHilite 扩展(我是开发人员)。首先,您需要复制现有扩展(这个 file),更改必要的代码以实现您想要的结果,并将文件保存到您的 PYTHONPATH(可能在 "sitepackages" 目录中,其确切位置取决于您所在的系统以及 Python 的安装方式)。请注意,您需要为文件创建一个唯一的名称,以免与任何其他 Python 包发生冲突。
完成后,您需要将这件事告诉 Pelican。由于 Pelican 的配置文件只是 Python,导入您的新扩展名(使用不带文件扩展名的文件名:yourmodule.py
=> yourmodule
)并将其包含在扩展列表中。
from yourmodule import CodeHiliteExtension
MD_EXTENSIONS = [
CodeHiliteExtension(css_class='highlight', linenums=False),
'extra']
请注意,对 CodeHiliteExtension
的调用不是字符串,而是实际调用 class 并传入适当的参数,您可以根据需要进行调整。
应该就是这样。如果您想设置一种更简单的方法来部署您的扩展(或将其分发给其他人使用),您可能需要考虑创建一个 setup.py
文件,这超出了这个问题的范围。请参阅此 tutorial 以获取特定于 Markdown 扩展的帮助。
如果您需要对扩展中的代码进行更改所需的具体帮助,这取决于您要完成的任务。首先,参数在第 117 行传递给 Pygments。最简单的方法是在那里硬编码您想要的选项。
请注意,如果您试图复制 reStructuredText 中的行为,您可能会感到失望。 Docutils 用它自己的一些处理来包装 Pygments。事实上,一些选项永远不会传递给 Pygments,而是由 reStructeredText 解析器本身处理。如果我没记错的话,CSS 行编号就是这样一个功能。事实上,Pygments 并没有提供这个选项。
在这种情况下,您需要通过使用 Pygments return 非编号代码来修改 CodeHilite 扩展的分支,然后在扩展 return 之前自己应用必要的挂钩突出显示的代码块。为此,您可能需要在换行符处进行拆分,然后遍历适当地换行的行。最后,加入新换行和 return.
我怀疑以下(未经测试的)更改会让您入门:
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;博士
在 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
TLDR:我正在尝试在 pelican 中执行 CSS 行编号,同时在 markdown 中编写。 Pygments 是间接使用的,你不能将选项传递给它,所以我不能分开行,也没有 "new line".
的 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 行编号...它更容易控制编号开始和停止的时间。
任何帮助将不胜感激,我已经搞砸了几个小时。
我知道的唯一方法是分叉 CodeHilite 扩展(我是开发人员)。首先,您需要复制现有扩展(这个 file),更改必要的代码以实现您想要的结果,并将文件保存到您的 PYTHONPATH(可能在 "sitepackages" 目录中,其确切位置取决于您所在的系统以及 Python 的安装方式)。请注意,您需要为文件创建一个唯一的名称,以免与任何其他 Python 包发生冲突。
完成后,您需要将这件事告诉 Pelican。由于 Pelican 的配置文件只是 Python,导入您的新扩展名(使用不带文件扩展名的文件名:yourmodule.py
=> yourmodule
)并将其包含在扩展列表中。
from yourmodule import CodeHiliteExtension
MD_EXTENSIONS = [
CodeHiliteExtension(css_class='highlight', linenums=False),
'extra']
请注意,对 CodeHiliteExtension
的调用不是字符串,而是实际调用 class 并传入适当的参数,您可以根据需要进行调整。
应该就是这样。如果您想设置一种更简单的方法来部署您的扩展(或将其分发给其他人使用),您可能需要考虑创建一个 setup.py
文件,这超出了这个问题的范围。请参阅此 tutorial 以获取特定于 Markdown 扩展的帮助。
如果您需要对扩展中的代码进行更改所需的具体帮助,这取决于您要完成的任务。首先,参数在第 117 行传递给 Pygments。最简单的方法是在那里硬编码您想要的选项。
请注意,如果您试图复制 reStructuredText 中的行为,您可能会感到失望。 Docutils 用它自己的一些处理来包装 Pygments。事实上,一些选项永远不会传递给 Pygments,而是由 reStructeredText 解析器本身处理。如果我没记错的话,CSS 行编号就是这样一个功能。事实上,Pygments 并没有提供这个选项。
在这种情况下,您需要通过使用 Pygments return 非编号代码来修改 CodeHilite 扩展的分支,然后在扩展 return 之前自己应用必要的挂钩突出显示的代码块。为此,您可能需要在换行符处进行拆分,然后遍历适当地换行的行。最后,加入新换行和 return.
我怀疑以下(未经测试的)更改会让您入门:
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;博士
在 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