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

2024-10-03 23:25:01 发布

您现在位置:Python中文网/ 问答频道 /正文

my pylatest sphinx extension中, 我定义了自定义rst指令test_action和自定义sphinx构建器 xmlexport这样当我用默认的sphinxhtml构建一个sphinx项目时 builder(通过make html),将test_action指令转换为 {builder>只包含一个表指令 包装在divhtml标记中,无需任何其他处理。在

为此,test_action指令生成自定义doctree节点 当 xmlexportbuilder被使用,或者与{}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)

在处理^{} event的函数中 在我的狮身人面像分机里:

^{pr2}$

这个方法可以工作,但是有一个问题:当使用htmlbuilder时,doctree 在_build/doctree/中缓存的与之后缓存的不同 xmlexport生成器运行。这意味着当我在 执行make xmlexport,生成失败,因为sphinx使用了错误的doctree。在

所以我的问题是:如何确保sphinx doctree缓存 当不同的构建器互相使用时会重新生成,但当 同一个生成器又被使用了?在


Tags: testappmake节点htmlsphinxbuilder指令
1条回答
网友
1楼 · 发布于 2024-10-03 23:25:01

这里的问题是我使用的是eventbuilder-inited,这不适合这种特殊用法。在

这将导致转换在initialization phase of sphinx build期间执行,并且由于doctree构建是在初始化之后的一致性检查阶段之后保存的,因此转换的效果存储在doctree构建文件中。在

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

相关问题 更多 >