如何在 sphinx 项目中包含 pygments 样式?

ide*_*n42 9 pygments python-sphinx

Sphinx 可以定义主题以及要使用的 pygments 样式。

但是,我不能 - 为 Sphinx 项目找到一种好方法来定义供 pygments 使用的自定义样式(配色方案)。

文档

要使样式可用于 Pygments,您必须

  • 要么将其注册为插件(请参阅插件文档)
  • 或将其放入 Pygments 发行版的样式子包中,每个样式一个样式类,其中文件名是样式名称,类名称是 StylenameClass。

据我所知,第一个选项是我所追求的,因为应该可以动态扩展 pygments。虽然通过检查链接我不确定这将如何完成(没有关于如何使用插件系统的示例)。第二个示例涉及将文件复制到 pygments 中,这不切实际,特别是因为用户可能无法写入路径。


确实设法以一种风格破解,尽管这不是一个很好的解决方案:

包括完整性

# Sphinx "conf.py"

# Master toctree document
master_doc = 'contents'

# BEGIN MONKEY-PATCH
from pygments.style import Style
from pygments.token import Text, Other, Comment, Whitespace

class MyFancyStyle(Style):
    background_color = "#1e1e27"
    default_style = ""
    styles = {
        Text:                      "#cfbfad",
        Other:                     "#cfbfad",
        Whitespace:                "#434357",
        Comment:                   "#cd8b00",
        Comment.Preproc:           "#409090",
        Comment.PreprocFile:       "bg:#404040 #ffcd8b",
        Comment.Special:           "#808bed",
        # ... snip (just more colors, you get the idea) ...
    }


def pygments_monkeypatch_style(mod_name, cls):
    import sys
    import pygments.styles
    cls_name = cls.__name__
    mod = type(__import__("os"))(mod_name)
    setattr(mod, cls_name, cls)
    setattr(pygments.styles, mod_name, mod)
    sys.modules["pygments.styles." + mod_name] = mod
    from pygments.styles import STYLE_MAP
    STYLE_MAP[mod_name] = mod_name + "::" + cls_name


pygments_monkeypatch_style("my_fancy_style", MyFancyStyle)
pygments_style = "my_fancy_style"
# END MONKEY-PATCH
Run Code Online (Sandbox Code Playgroud)

Ste*_*rcy 4

在您conf.py指定要使用的 Pygments 样式。来自Sphinx 文档

\n
\n

pygments_style

\n

用于 Pygments 源代码突出显示的样式名称。如果未设置,则选择 theme\xe2\x80\x99s 默认样式或 \'sphinx\' 进行 HTML 输出。

\n
\n

可以通过以下方式检索可用名称:

\n
>>> from pygments.styles import get_all_styles\n>>> styles = list(get_all_styles())\n
Run Code Online (Sandbox Code Playgroud)\n

一些 Sphinx 主题和 Pygments 风格组合的在线预览现已推出。

\n

如果开箱即用的 Pygments 样式不符合您的喜好,那么您可以创建自定义 Pygments 样式

\n