From 6e3e43939935333ede12b206e38ea230f775740c Mon Sep 17 00:00:00 2001 From: Michael Schlenker Date: Fri, 8 Nov 2013 14:10:07 +0000 Subject: [PATCH] Find node.source recursively. In some cases (.. figure nested inside other blocks or lists), the node.parent.source is None too, so the old logic fails. Just traverse up, until we get a valid node.source or have no parent at all. --- sphinx/util/nodes.py | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/sphinx/util/nodes.py b/sphinx/util/nodes.py index 81872a8b9..9d303188f 100644 --- a/sphinx/util/nodes.py +++ b/sphinx/util/nodes.py @@ -41,6 +41,23 @@ IGNORED_NODES = ( nodes.doctest_block, #XXX there are probably more ) + +def find_source_node(node): + if node.source: + return node.source + + current = node + while 1: + parent = current.parent + if parent.source: + return parent.source + else: + current = parent + + if not current: + break + return None + def extract_messages(doctree): """Extract translatable messages from a document tree.""" for node in doctree.traverse(nodes.TextElement): @@ -59,7 +76,7 @@ def extract_messages(doctree): # sf.net/tracker/?func=detail&aid=3599485&group_id=38414&atid=422032 # sourceforge.net/p/docutils/patches/108/ if isinstance(node, (nodes.caption, nodes.title, nodes.rubric)) and not node.source: - node.source = node.parent.source + node.source = find_source_node(node) node.line = 0 #need fix docutils to get `node.line` if not node.source: