Fix #1540: Fix RuntimeError with circular referenced toctree

This commit is contained in:
Takeshi KOMIYA
2015-08-09 21:08:14 +09:00
parent 82e05e7a9c
commit 49b812b856
6 changed files with 25 additions and 22 deletions

View File

@@ -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)

View File

@@ -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)

View File

@@ -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)

View File

@@ -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

View File

@@ -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)

View File

@@ -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