首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在狮身人面像项目中包括侏儒风格?

如何在狮身人面像项目中包括侏儒风格?
EN

Stack Overflow用户
提问于 2018-02-05 03:48:50
回答 5查看 3.7K关注 0票数 12

狮身人面像既可以定义主题,也可以定义可使用的pygments样式。

但是,我找不到一种很好的方法让Sphinx项目为pygments定义一个自定义样式(配色方案)。

来自医生们

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

  • 要么将其注册为插件(见插件文档)
  • 或者把它放到Pygments的样式子包中--每个样式都有一个样式类,其中文件名是样式名,类名是StylenameClass。

据我所知,第一个选项是我想要的,因为应该可以动态地扩展pygments。虽然从检查链接,我不确定这将如何做(没有如何使用插件系统的例子)。第二个例子涉及将文件复制到pygments中,这是不切实际的,特别是因为路径可能不能被用户写入。

虽然这不是一个很好的解决方案,但我还是设法破解了一种风格:

包括完整性

代码语言:javascript
复制
# 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
EN

回答 5

Stack Overflow用户

发布于 2018-02-05 04:23:00

conf.py中指定要使用的Pygments样式。来自狮身人面像文件

pygments_style 用于突出显示源代码的Pygments的样式名称。如果没有设置,则为HTML输出选择主题的默认样式或“sphinx”。

可以通过以下方法检索可用名称

代码语言:javascript
复制
>>> from pygments.styles import get_all_styles
>>> styles = list(get_all_styles())

一些狮身人面像主题和俾格斯风格组合的在线预览是可用的。

如果你不喜欢开箱即用的花花公子风格,那么你可以创建自定义Pygments样式.

票数 4
EN

Stack Overflow用户

发布于 2021-10-20 16:25:15

我就是这样设置的:

文件夹结构:

代码语言:javascript
复制
docs
├── source
│   ├── conf.py <--
│   ├── _pygments
│   │   ├── style.py <--
│   ├── _static
│   ├── ...

conf.py

(在最上面)

代码语言:javascript
复制
import sys, os
sys.path.append(os.path.abspath("./_pygments"))
pygments_style = 'style.MonokaiStyle'
...

style.py

代码语言:javascript
复制
from pygments.style import Style
from pygments.token import Keyword, Name, Comment, String, Error, Text, \
     Number, Operator, Generic, Whitespace, Punctuation, Other, Literal

class MonokaiStyle(Style):
    """
    This style mimics the Monokai color scheme.
    """

    background_color = "#272822"
    highlight_color = "#49483e"

    styles = {
        # No corresponding class for the following:
        Text:                      "#f8f8f2", # class:  ''
        Whitespace:                "",        # class: 'w'
        Error:                     "#960050 bg:#1e0010", # class: 'err'
        Other:                     "",        # class 'x'
        ...
    }

您可以选择预定义的样式这里 (正如我所做的那样),并将官方增资回购中的相应*.py文件放入_pygment文件夹。或者您可以定义自己的样式,根据自己的喜好重命名类(不要忘记将conf.py中的导入子句调整为新的名称)

编辑:是用于样式查找的更好的资源。

票数 3
EN

Stack Overflow用户

发布于 2020-12-29 14:56:49

我也有类似的需求,尽管我真正想要的是稍微改变现有的风格(下面称为基本样式)。我能够扩展问题中的代码以满足我的需要。我把它寄给其他遇到这个问题的人。

代码语言:javascript
复制
# Sphinx "conf.py"

# Syntax highlighting of code blocks
import pygments.styles, pygments.token
def monkeypatch_pygments(name, base_name='default', attrs={}):
    import importlib, sys
    base_module = importlib.import_module('.'.join(['pygments', 'styles', base_name]))

    def name_to_class_name(name):
        return name.capitalize() + 'Style'
    base_class = getattr(base_module, name_to_class_name(base_name))
    styles = getattr(base_class, 'styles', {}).copy()
    styles.update(attrs.pop('styles', {}))
    attrs['styles'] = styles
    class_name = name_to_class_name(name)
    Style = type(class_name, (base_class,), attrs)
    module = type(base_module)(name)
    setattr(module, class_name, Style)
    setattr(pygments.styles, name, module)
    pygments.styles.STYLE_MAP[name] = f'{name}::{class_name}'
    sys.modules['.'.join(['pygments', 'styles', name])] = module
pygments_style = 'custom'  # Arbitrary name of new style
monkeypatch_pygments(
    pygments_style,
    'friendly',  # Name of base style to use
    {
        # Changes to base style
        'background_color': '#f6f6f6',
        'styles': {
            pygments.token.Comment:       'italic #688F98',
            pygments.token.Name.Variable: '#d27a0a',
        },
    },
)

在上面的示例中,使用friendly样式作为基本样式。它的'background_color''styles'字典中的一些项被重新定义。请注意,'styles'中未指定的项将从基样式中提取。基本样式本身没有更改。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48615629

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档