我是sphinx-needs的维护者,它允许定义需求,错误,......
这些对象存储在相关的指令运行函数中,最后我得到了sphinx文档中所有对象的列表。
对象可以相互链接,我想创建这些链接的图表(使用plantuml和相关的sphinx-plantuml扩展)。
问题是,我不知道如何让sphinx添加并重新呈现动态创建的工厂图规范。
在指令中,我可以使用state_machine来完成这项工作:
diagram = generate_plantuml_spec(objects)
self.state_machine.insert_input(
diagram.split('\n'),
self.state_machine.document.attributes['source'])
但这是错误的地方,因为我的扩展程序尚未收集所有对象。
所以正确的位置应该在一个函数内部,当sphinx触发事件“doctree-resolved”时执行该函数。
在这个函数里面我可以添加任何类型的docutils节点。 我的想法是使用生成的图表规范
创建node.Text() def process_needfilters(app, doctree, fromdocname):
diagram_data = """"
.. plantuml::
@startuml
node Test
@enduml
"""
for node in doctree.traverse(needs_diagram):
content = []
diagram = nodes.Text(diagram_data, diagram_data)
content.append(diagram)
node.replace_self(content)
然而,这不会强制狮身人面像渲染内容。
我还发现了一个名为nested_parse_with_titles()的sphinx函数,但这需要一个'state'对象,它只能在一个指令中使用,而不能在一个事件处理程序中使用。
那么,任何想法如何在sphinx事件处理程序中呈现第一个内容?
答案 0 :(得分:0)
解决方案是直接使用plantuml-extension中的plantuml节点:
来自sphinx-needs的简化代码段:
from sphinxcontrib.plantuml import plantuml
for node in doctree.traverse(MyDirective):
plantuml_block_text = ".. plantuml::\n" \
"\n" \
" @startuml" \
" @enduml"
puml_node = plantuml(plantuml_block_text, **dict())
node.replace_self(puml_node)