From b016896c1c3d7e2a1de3f9201f49f391687f7dd0 Mon Sep 17 00:00:00 2001 From: Georg Brandl Date: Sun, 6 Apr 2008 16:47:28 +0000 Subject: [PATCH] Don't swallow toc entries when resolving subtrees. --- CHANGES | 5 +++++ doc/contents.rst | 2 +- sphinx/environment.py | 24 +++++++++++++++--------- 3 files changed, 21 insertions(+), 10 deletions(-) diff --git a/CHANGES b/CHANGES index 81126beca..d3c590c6b 100644 --- a/CHANGES +++ b/CHANGES @@ -5,9 +5,14 @@ Changes in trunk It works like ``add_description_unit`` but the directive will only create a target and no output. +* sphinx.environment: Don't swallow TOC entries when resolving subtrees. + * sphinx.directives: Allow giving a different title to documents in the toctree. +* sphinx.builder, sphinx.environment: Gracefully handle some exception + cases. + Release 0.1.61950 (Mar 26, 2008) ================================ diff --git a/doc/contents.rst b/doc/contents.rst index dab72a9cb..764eb779b 100644 --- a/doc/contents.rst +++ b/doc/contents.rst @@ -7,7 +7,7 @@ Sphinx documentation contents :maxdepth: 2 intro - Konzepte + concepts rest markup/index builders diff --git a/sphinx/environment.py b/sphinx/environment.py index 62eed3eb4..992a0e4b7 100644 --- a/sphinx/environment.py +++ b/sphinx/environment.py @@ -703,7 +703,7 @@ class BuildEnvironment: self.resolve_references(doctree, docname, builder) # now, resolve all toctree nodes - def _entries_from_toctree(toctreenode): + def _entries_from_toctree(toctreenode, separate=False): """Return TOC entries for a toctree node.""" includefiles = map(str, toctreenode['includefiles']) @@ -716,13 +716,18 @@ class BuildEnvironment: self.warn(docname, 'toctree contains ref to nonexisting ' 'file %r' % includefile) else: + # resolve all sub-toctrees for toctreenode in toc.traverse(addnodes.toctree): - toctreenode.parent.replace_self( - _entries_from_toctree(toctreenode)) - entries.append(toc) - if entries: - return addnodes.compact_paragraph('', '', *entries) - return [] + i = toctreenode.parent.index(toctreenode) + 1 + for item in _entries_from_toctree(toctreenode): + toctreenode.parent.insert(i, item) + i += 1 + toctreenode.parent.remove(toctreenode) + if separate: + entries.append(toc) + else: + entries.extend(toc.children) + return entries def _walk_depth(node, depth, maxdepth, titleoverrides): """Utility: Cut a TOC at a specified depth.""" @@ -738,8 +743,9 @@ class BuildEnvironment: for toctreenode in doctree.traverse(addnodes.toctree): maxdepth = toctreenode.get('maxdepth', -1) titleoverrides = toctreenode.get('includetitles', {}) - newnode = _entries_from_toctree(toctreenode) - if newnode is not None: + tocentries = _entries_from_toctree(toctreenode, separate=True) + if tocentries: + newnode = addnodes.compact_paragraph('', '', *tocentries) # prune the tree to maxdepth and replace titles if maxdepth > 0: _walk_depth(newnode, 1, maxdepth, titleoverrides)