mirror of
https://github.com/sphinx-doc/sphinx.git
synced 2025-02-25 18:55:22 -06:00
Fix #1540: Fix RuntimeError with circular referenced toctree
This commit is contained in:
1
CHANGES
1
CHANGES
@@ -49,6 +49,7 @@ Bugs fixed
|
|||||||
* #1798: Fix building LaTeX with references in titles.
|
* #1798: Fix building LaTeX with references in titles.
|
||||||
* #1725: On py2 environment, doctest with using non-ASCII characters causes
|
* #1725: On py2 environment, doctest with using non-ASCII characters causes
|
||||||
``'ascii' codec can't decode byte`` exception.
|
``'ascii' codec can't decode byte`` exception.
|
||||||
|
* #1540: Fix RuntimeError with circular referenced toctree
|
||||||
|
|
||||||
|
|
||||||
Release 1.3.1 (released Mar 17, 2015)
|
Release 1.3.1 (released Mar 17, 2015)
|
||||||
|
|||||||
@@ -938,7 +938,7 @@ class SingleFileHTMLBuilder(StandaloneHTMLBuilder):
|
|||||||
def assemble_doctree(self):
|
def assemble_doctree(self):
|
||||||
master = self.config.master_doc
|
master = self.config.master_doc
|
||||||
tree = self.env.get_doctree(master)
|
tree = self.env.get_doctree(master)
|
||||||
tree = inline_all_toctrees(self, set(), master, tree, darkgreen)
|
tree = inline_all_toctrees(self, set(), master, tree, darkgreen, [master])
|
||||||
tree['docname'] = master
|
tree['docname'] = master
|
||||||
self.env.resolve_references(tree, master, self)
|
self.env.resolve_references(tree, master, self)
|
||||||
self.fix_refuris(tree)
|
self.fix_refuris(tree)
|
||||||
|
|||||||
@@ -124,7 +124,7 @@ class LaTeXBuilder(Builder):
|
|||||||
new_sect += node
|
new_sect += node
|
||||||
tree = new_tree
|
tree = new_tree
|
||||||
largetree = inline_all_toctrees(self, self.docnames, indexfile, tree,
|
largetree = inline_all_toctrees(self, self.docnames, indexfile, tree,
|
||||||
darkgreen)
|
darkgreen, [indexfile])
|
||||||
largetree['docname'] = indexfile
|
largetree['docname'] = indexfile
|
||||||
for docname in appendices:
|
for docname in appendices:
|
||||||
appendix = self.env.get_doctree(docname)
|
appendix = self.env.get_doctree(docname)
|
||||||
|
|||||||
@@ -70,7 +70,7 @@ class ManualPageBuilder(Builder):
|
|||||||
tree = self.env.get_doctree(docname)
|
tree = self.env.get_doctree(docname)
|
||||||
docnames = set()
|
docnames = set()
|
||||||
largetree = inline_all_toctrees(self, docnames, docname, tree,
|
largetree = inline_all_toctrees(self, docnames, docname, tree,
|
||||||
darkgreen)
|
darkgreen, [docname])
|
||||||
self.info('} ', nonl=True)
|
self.info('} ', nonl=True)
|
||||||
self.env.resolve_references(largetree, docname, self)
|
self.env.resolve_references(largetree, docname, self)
|
||||||
# remove pending_xref nodes
|
# remove pending_xref nodes
|
||||||
|
|||||||
@@ -180,7 +180,7 @@ class TexinfoBuilder(Builder):
|
|||||||
new_sect += node
|
new_sect += node
|
||||||
tree = new_tree
|
tree = new_tree
|
||||||
largetree = inline_all_toctrees(self, self.docnames, indexfile, tree,
|
largetree = inline_all_toctrees(self, self.docnames, indexfile, tree,
|
||||||
darkgreen)
|
darkgreen, [indexfile])
|
||||||
largetree['docname'] = indexfile
|
largetree['docname'] = indexfile
|
||||||
for docname in appendices:
|
for docname in appendices:
|
||||||
appendix = self.env.get_doctree(docname)
|
appendix = self.env.get_doctree(docname)
|
||||||
|
|||||||
@@ -228,7 +228,7 @@ def process_index_entry(entry, targetid):
|
|||||||
return indexentries
|
return indexentries
|
||||||
|
|
||||||
|
|
||||||
def inline_all_toctrees(builder, docnameset, docname, tree, colorfunc):
|
def inline_all_toctrees(builder, docnameset, docname, tree, colorfunc, traversed):
|
||||||
"""Inline all toctrees in the *tree*.
|
"""Inline all toctrees in the *tree*.
|
||||||
|
|
||||||
Record all docnames in *docnameset*, and output docnames with *colorfunc*.
|
Record all docnames in *docnameset*, and output docnames with *colorfunc*.
|
||||||
@@ -238,23 +238,25 @@ def inline_all_toctrees(builder, docnameset, docname, tree, colorfunc):
|
|||||||
newnodes = []
|
newnodes = []
|
||||||
includefiles = map(text_type, toctreenode['includefiles'])
|
includefiles = map(text_type, toctreenode['includefiles'])
|
||||||
for includefile in includefiles:
|
for includefile in includefiles:
|
||||||
try:
|
if includefile not in traversed:
|
||||||
builder.info(colorfunc(includefile) + " ", nonl=1)
|
try:
|
||||||
subtree = inline_all_toctrees(builder, docnameset, includefile,
|
traversed.append(includefile)
|
||||||
builder.env.get_doctree(includefile),
|
builder.info(colorfunc(includefile) + " ", nonl=1)
|
||||||
colorfunc)
|
subtree = inline_all_toctrees(builder, docnameset, includefile,
|
||||||
docnameset.add(includefile)
|
builder.env.get_doctree(includefile),
|
||||||
except Exception:
|
colorfunc, traversed)
|
||||||
builder.warn('toctree contains ref to nonexisting '
|
docnameset.add(includefile)
|
||||||
'file %r' % includefile,
|
except Exception:
|
||||||
builder.env.doc2path(docname))
|
builder.warn('toctree contains ref to nonexisting '
|
||||||
else:
|
'file %r' % includefile,
|
||||||
sof = addnodes.start_of_file(docname=includefile)
|
builder.env.doc2path(docname))
|
||||||
sof.children = subtree.children
|
else:
|
||||||
for sectionnode in sof.traverse(nodes.section):
|
sof = addnodes.start_of_file(docname=includefile)
|
||||||
if 'docname' not in sectionnode:
|
sof.children = subtree.children
|
||||||
sectionnode['docname'] = includefile
|
for sectionnode in sof.traverse(nodes.section):
|
||||||
newnodes.append(sof)
|
if 'docname' not in sectionnode:
|
||||||
|
sectionnode['docname'] = includefile
|
||||||
|
newnodes.append(sof)
|
||||||
toctreenode.parent.replace(toctreenode, newnodes)
|
toctreenode.parent.replace(toctreenode, newnodes)
|
||||||
return tree
|
return tree
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user