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