Sphinx API接口

因为许多项目在其文档中需要特殊的特性,所以Sphinx被设计为在多个层次上具有可扩展性。

在扩展中,您可以完成的事情:

  • 添加新的 builder (构建器),以支持新的输出格式或输出行为。

  • 使用 Docutils标记 API 注册自定义的reStructuredText角色和指令。

  • 将自定义代码添加到构建过程的关键位置处(所谓的"钩子点")中,使得您可以注册钩子并运行特殊代码。例如,请参阅 事件回调API

扩展是带有 setup() 函数的Python模块。用户通过在 extensions 配置值中添加扩展模块名(或子模块)来激活扩展。

当执行 sphinx-build 时,sphinx将尝试导入列出的每个模块,然后执行 yourmodule.setup(app)。此函数用于扩展的初始化(例如,通过执行Python代码),链接Sphinx在构建过程中使用的资源(如CSS或HTML文件),并将扩展提供的所有内容通知Sphinx(例如指令或角色定义)。 app 参数是 Sphinx 的一个实例,它使您可以控制Sphinx构建的大多数方面。

备注

如果配置文件包含 setup() 函数,则该配置文件本身也被当做一个扩展。需要加载的所有其它扩展必须列在 extensions 配置值中。

本页的其余部分描述了开发扩展的一些高级方面,以及您可以控制的Sphinx行为的各个部分。有关如何创建和使用扩展来控制Sphinx的不同部分的一些示例,请参阅 教程

重要的对象

有几个关键对象,它们的API接口将在编写扩展时使用:

应用

application对象(通常称为 app)是 Sphinx 类的实例。它控制大多数高级功能,例如加载配置、初始化环境和设定扩展。

构建环境

build environment对象(通常称为 env)是 BuildEnvironment 类的实例。它负责解析源文档,存储文档集合的所有元数据,并在每次构建后序列化到磁盘。

它的接口提供了访问元数据、解析引用等的方法。插件也可以使用它来缓存应该为增量重建保留的信息。

如果您有application或builder对象,则环境可用作 app.envbuilder.env。在 SphinxDirectiveSphinxRoleSphinxTransform 子类中,环境用 self.env 描述。

构建器

builder对象(通常称为 builder)是一个特定子类 Builder 的实例。每个builder类都知道如何将已解析的文档转换为输出格式,或者以其他方式处理它们(例如,检查外部链接)。

如果您有application对象,则构建器用 app.builder 描述。

配置

config对象(通常称为 config)提供在 conf.py 中作为属性设置的配置值。它是一个 Config 类的实例。

config用 env.configbuilder.configapp.config 描述。在 SphinxDirectiveSphinxRoleSphinxTransform 子类中,环境用 self.config 描述。

事件

event manager对象(通常称为 events)管理和分发Sphinx的事件系统。它是 EventManager 类的实例。

event manager用 env.eventsbuilder.eventsapp.events 描述。

要查看这些对象的使用示例,请参阅 the tutorials

构建的各个阶段

为了理解扩展机制,一件至关重要的事情是Sphinx项目的构建方式:它分几个阶段工作。

digraph phases {

    graph [
        rankdir = LR
    ]

    node [
        shape = rect;
        style = filled;
        fillcolor ="#f7f7f7";
        fontcolor = "#0a507a"
    ]

    Initialization -> Reading;
    Reading -> "Consistency checks";
    "Consistency checks" -> Resolving;
    Resolving -> Writing;
}

构建的各个阶段

阶段0:初始化

在这个阶段,几乎没有任何值得我们关注的事情发生。在源目录中搜索源文件,并初始化各扩展。如果存在一个已经被保存了的构建环境,则加载该环境,否则将创建一个新环境。

阶段1:读取

在阶段1中,所有源文件(以及后续构建中的新的或更改的)都将被读取和解析。这是docutils遇到指令和角色并执行相应代码的阶段。这个阶段的输出是每个源文件的 doctree;这是docutils节点的树。对于在读取所有现有文件之前不完全知道的文档元素,将创建临时节点。

docutils提供的节点在 docutils文档 中有记录。Sphinx提供了其他节点,描述在这里

在读取过程中,将用已读取文档的元数据和交叉引用数据(比如标签、标题名称、所描述的Python对象和索引项)对 build environment 进行更新。这将稍后用于替换临时节点。

解析后的doctree存储在磁盘上,因为不可能将它们全部保存在内存中。

阶段2: 一致性检查

进行一些检查以确保生成的文档中没有意外情况。

阶段3:解析

现在,所有现有文档的元数据和交叉引用数据都是已知的,所有临时节点都将被节点替换,这些节点可以使用称为transforms的组件转换为输出。例如,为存在的对象引用创建链接,为不存在的对象引用创建简单文本节点。

阶段4:写作

此阶段将解析的doctree转换为所需的输出格式,例如HTML或LaTeX。这是通过一个所谓的docutils编写器来实现的,它访问每个doctree的各个节点,并在这个过程中生成一些输出。

备注

一些构建器偏离了这个一般的构建计划,例如,检查外部链接的构建器只需要解析的doctree,因此不需要第2-4阶段。

要查看应用示例,请参阅 对构建过程进行扩展

扩展的元数据

在 1.3 版本加入.

setup() 函数应返回一个字典。Sphinx将其视为扩展的元数据。当前识别的元数据键有:

'version'

一个标识扩展版本的字符串。它用于扩展版本需求检查(参见 needs_extensions)和信息目的。如果没有返回版本字符串,则默认使用 'unknown version'

'env_version'

一个非零正整数,记录扩展在环境中存储的数据的版本。

注意

如果未设置 'env_version',则扩展 不能 直接在环境对象(env)上存储任何数据或状态。

如果扩展使用 env 对象来存储数据,则必须定义此键。每当存储数据的类型、结构或含义发生变化时,版本号必须递增,以确保Sphinx不会尝试从缓存的环境中加载无效数据。

在 1.8 版本加入.

'parallel_read_safe'

一个布尔值,指定在加载扩展时是否可以使用源文件的并行读取。它默认为 False,这意味着您必须在检查扩展是否安全进行并行读取后,明确指定您的扩展是安全的。

重要

parallel-read-safeTrue 时,扩展必须满足以下条件:

  • 扩展的核心逻辑在读取阶段是可并行执行的。

  • 如果在读取阶段将数据存储到build environment对象(env)中,则它具有 env-merge-infoenv-purge-doc 事件的事件处理程序。

'parallel_write_safe'

一个布尔值,指定在加载扩展时是否可以使用输出文件的并行写入。由于扩展通常不会对该过程产生负面影响,因此它默认为 True

重要

parallel-write-safeTrue 时,扩展必须满足以下条件:

  • 扩展的核心逻辑在写入阶段是可并行执行的。

用于编写扩展的API接口

这些部分提供了在开发Sphinx扩展时可以使用的工具的更完整的描述。一些是Sphinx的核心(例如 应用接口),而其他一些则触发特定的行为(例如 i18n接口