【问题标题】:How to use Pygments in Pelican with Markdown?如何通过 Markdown 在 Pelican 中使用 Pygments?
【发布时间】:2015-06-20 18:36:39
【问题描述】:

TLDR:我正在尝试在 pelican 中进行 CSS 行编号,同时使用 markdown 编写。 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 行编号...它更容易控制编号的开始和停止时间。

任何帮助将不胜感激,我已经搞砸了几个小时。

【问题讨论】:

    标签: python css markdown pygments pelican


    【解决方案1】:

    我知道的唯一方法是分叉 CodeHilite 扩展(我是开发人员)。首先,您需要复制现有的扩展名(file),对代码进行必要的更改以实现您想要的结果,并将文件保存到您的 PYTHONPATH(可能在“sitepackages”目录中,确切位置其中取决于您所在的系统以及 Python 的安装方式)。请注意,您需要为文件创建一个唯一名称,以免与任何其他 Python 包冲突。

    一旦你这样做了,你需要告诉鹈鹕这件事。由于 Pelican 的配置文件只是 Python,请导入您的新扩展名(使用不带文件扩展名的文件名:yourmodule.py => yourmodule)并将其包含在扩展名列表中。

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

    请注意,对CodeHiliteExtension 的调用不是字符串,而是实际调用类并传入适当的参数,您可以根据需要进行调整。

    应该就是这样。如果您想设置一种更简单的方法来部署您的扩展(或将其分发给其他人使用),您可能需要考虑创建一个 setup.py 文件,这超出了本问题的范围。请参阅此 tutorial 以获取特定于 Markdown 扩展的帮助。

    如果您需要对扩展程序中的代码进行更改所需的具体帮助,这取决于您要完成的任务。首先,参数在第 117 行传递给 Pygments。最简单的方法是在那里硬编码你想要的选项。


    请注意,如果您尝试复制 reStructuredText 中的行为,您可能会感到失望。 Docutils 用它自己的一些处理来包装 Pygments。事实上,一些选项永远不会传递给 Pygments,而是由 reStructeredText 解析器本身处理。如果我没记错的话,CSS 行号就是这样一种功能。事实上,Pygments 并没有提供这个选项。

    在这种情况下,您需要通过让 Pygments 返回非编号代码来修改 CodeHilite 扩展的分支,然后在扩展返回突出显示的代码块之前自己应用必要的挂钩。为此,您可能需要在换行符处拆分,然后循环遍历适当地包裹每一行的行。最后,加入新包裹的行并返回。


    我怀疑以下(未经测试的)更改可以帮助您入门:

    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 库以及它具有哪些功能。

    【讨论】:

      【解决方案2】:

      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
      

      【讨论】:

        猜你喜欢
        • 2022-01-06
        • 1970-01-01
        • 1970-01-01
        • 2010-11-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-11-08
        • 2013-05-12
        相关资源
        最近更新 更多