52 lines
1.6 KiB
Python

from sphinx import addnodes
import docutils.nodes
class ToctreeElement:
uri = ""
children = {}
def html_page_context(app, pagename, templatename, context, doctree):
if 'toctree' not in context:
return
builder = app.builder
env = builder.env
doctree = env.get_doctree(env.config.master_doc)
for node in doctree.traverse(addnodes.toctree):
toctreenode = node
break
toctree = env.resolve_toctree(pagename, builder, toctreenode,
includehidden=True)
toctree_elements = {}
for item in toctree.traverse(docutils.nodes.list_item):
if 'toctree-l1' in item['classes']:
element = ToctreeElement()
for ref in item.traverse(docutils.nodes.reference):
if ref['anchorname']:
continue
element.uri = ref["refuri"]
break
children = {}
for child in item.traverse(docutils.nodes.list_item,
include_self=False):
child_element = ToctreeElement()
for ref in child.traverse(docutils.nodes.reference):
if ref['anchorname']:
continue
child_element.link = ref["refuri"]
children[child[0].astext()] = child_element
break
element.children = children
toctree_elements[item[0].astext()] = element
context['toctree_elements'] = toctree_elements
def setup(app):
app.connect('html-page-context', html_page_context)