python - 如何自定义 Sphinx 的代码块语言?

标签 python python-sphinx pygments

考虑以下情况:

.. code-block:: my_lang

    ...


如果我想让 my_lang 像 Python 这样的东西,我该怎么做?

最佳答案

首先,您需要创建一个脚本( _ext/mylanglexer.py ),然后添加到 extensions在 conf.py
( _ext 是惯例,但不是必须的。)
_ext/mylanglexer.py

# _ext/mylanglexer.py

from pygments.lexers import get_lexer_by_name  # refer LEXERS
from pygments.lexers._mapping import LEXERS
from pygments.lexers.python import PythonLexer


def setup(app):
    # choose one, both ok
    app.add_lexer('my_lang', get_lexer_by_name('py'))
    # app.add_lexer('my_lang', PythonLexer)
配置文件
# conf.py

extensions = [
    ...
    '_ext.mylanglexer',  # types.ModuleType, they are likely the_module = __import__('sphinx.ext.autodoc')
]
在某些 tutorial告诉你最好加sys.path.append(os.path.abspath("./_ext"))然后 extensions = ['mylanglexer'] 反正只要知道是模块,所有的扩展名应该都可以import ... ,所以如果你的模块不在默认路径中,当然,你必须追加。
现在,它正在工作!

它是如何工作的
pygements.lexers.init.py
# pygements.lexers.__init__.py

def get_lexer_by_name(_alias, **options):
    ...

    # lookup builtin lexers
    for module_name, name, aliases, _, _ in LEXERS.values():  # <-- Be focus on this line.
        if _alias.lower() in aliases:
            return _lexer_cache[name](**options)  # The class object (module_name+key_name), for example: pygments.lexers.python.PythonLexer(**options)
    # continue with lexers from setuptools entrypoints
    for cls in find_plugin_lexers():

        ...
        return cls(**options)

    raise ClassNotFound('no lexer for alias %r found' % _alias)
其中LEXERS是某种以下的东西。
# pygments.lexers._mapping.py

LEXERS = {
    # key_name: module_name, name, aliases: Tuple[str], _, _
    ...
    'ObjectiveCLexer': ('pygments.lexers.objective', 'Objective-C', ('objective-c', 'objectivec', 'obj-c', 'objc'), ('*.m', '*.h'), ('text/x-objective-c',)),
    'ObjectiveCppLexer': ('pygments.lexers.objective', 'Objective-C++', ('objective-c++', 'objectivec++', 'obj-c++', 'objc++'), ('*.mm', '*.hh'), ('text/x-objective-c++',)),
    'ObjectiveJLexer': ('pygments.lexers.javascript', 'Objective-J', ('objective-j', 'objectivej', 'obj-j', 'objj'), ('*.j',), ('text/x-objective-j',)),
    'OcamlLexer': ('pygments.lexers.ml', 'OCaml', ('ocaml',), ('*.ml', '*.mli', '*.mll', '*.mly'), ('text/x-ocaml',)),
    'OctaveLexer': ('pygments.lexers.matlab', 'Octave', ('octave',), ('*.m',), ('text/octave',)),
    'JsonLexer': ('pygments.lexers.data', 'JSON', ('json',), ('*.json', 'Pipfile.lock'), ('application/json',)),
    'PythonLexer': ('pygments.lexers.python', 'Python', ('python', 'py', 'sage', 'python3', 'py3'), ('*.py', '*.pyw', '*.jy', '*.sage', '*.sc', 'SConstruct', 'SConscript', '*.bzl', 'BUCK', 'BUILD', 'BUILD.bazel', 'WORKSPACE', '*.tac'), ('text/x-python', 'application/x-python', 'text/x-python3', 'application/x-python3')),
    ...
}
你知道,你的_aliasaliases ,然后就可以了!
如何自定义我的风格?
您可以复制并修改 Lexer,例如 ObjectiveCLexer , JsonLexer ...
终于 app.add_lexer('my_lang', YourLexer)这就是问题所在。

关于python - 如何自定义 Sphinx 的代码块语言?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62084358/

相关文章:

python - 创建 csv 文件,其中每一行都是一个列表中的一些嵌套列表

python - 如何在 sphinx autodoc 中有选择地隐藏模块文档字符串?

python - 如何用狮身人面像制作两列

conditional-statements - 狮身人面像中的有条件toctree

python - NoReverseMatch 错误,尝试在 Django 中设置详细页面 View

python - 如何通过张量有效地使用 PyTorch 的 autograd?

python - 运行 pyinstaller 应用程序时导入错误

python - 如何获得 minted 包来渲染具有可复制缩进的代码块?

python - 基本 Pygments 示例不起作用

ruby - Windows 上的 Jekyll : Pygments not working