Python 当两个sphinx构建器生成不同的doctree时,如何修复sphinx扩展?

Python 当两个sphinx构建器生成不同的doctree时,如何修复sphinx扩展?,python,python-sphinx,Python,Python Sphinx,在,, 我定义了自定义rst指令test\u action和自定义sphinx生成器 xmlexport这样当我用默认的sphinx html构建sphinx项目时 生成器(通过makehtml),将test\u操作指令转换为 单个html表,而使用xmlexportbuilder时,指令只是 包装在divhtml标记中,无需任何额外处理 为了实现这一点,test\u操作指令生成自定义doctree节点 当 使用xmlexportbuilder,或使用htmlbuilder创建自定义节点 通过自

在,, 我定义了自定义rst指令
test\u action
和自定义sphinx生成器
xmlexport
这样当我用默认的sphinx html构建sphinx项目时 生成器(通过
makehtml
),将
test\u操作
指令转换为 单个html表,而使用
xmlexport
builder时,指令只是 包装在
div
html标记中,无需任何额外处理

为了实现这一点,
test\u操作
指令生成自定义doctree节点 当 使用
xmlexport
builder,或使用
html
builder创建自定义节点 通过自定义rst转换类转换为html表

我通过检查使用的生成器和添加转换类来实现这一点 因此:

def pylatest_transform_handler(app):
    if isinstance(app.builder, builders.XmlExportBuilder):
        ...
    else:
        # pylatest transforms for human readable html output,
        # translates pylatest nodes into nice sections or tables
        app.add_transform(transforms.TestActionsTableTransform)
在处理 在我的狮身人面像延伸中:

def setup(app):
    ...
    # pylatest transforms are added based on app.builder value
    app.connect('builder-inited', pylatest_transform_handler)
这种方法是可行的,但它有一个问题:当使用
html
builder时,doctree 在
\u build/doctree/
中缓存的与之后缓存的不同
xmlexport
builder运行。这意味着当我在 执行
makexmlexport
,生成失败,因为sphinx使用了错误的doctree

所以我的问题是:如何确保sphinx doctree缓存 当不同的构建器相继使用时重新生成,但在
再次使用相同的生成器?

这里的问题是我使用的是事件
builder inited
,这不适合此特定用法

这会导致在初始化阶段之后的一致性检查阶段之后保存doctree生成,因此转换的效果存储在doctree生成文件中

当我从
add_transform
切换到
add_post_transform
hooked时 相反,在
doctree resolved
事件中,它开始按照我的需要工作:doctree已保存
文件的转换是相同的(因为文件不受转换的影响),转换发生在编写阶段的后面。

根据Komiya Takeshi关于提交链接的回复,修复了我项目中的问题: