diff --git a/sphinx/util/nodes.py b/sphinx/util/nodes.py index e7be08b8b..bc19be87e 100644 --- a/sphinx/util/nodes.py +++ b/sphinx/util/nodes.py @@ -36,7 +36,7 @@ caption_ref_re = explicit_title_re # b/w compat alias def apply_source_workaround(node): - if node.source: + if node.source and node.rawsource: return # workaround: nodes.term doesn't have source, line and rawsource @@ -63,7 +63,9 @@ def apply_source_workaround(node): ))): node.source = find_source_node(node) node.line = 0 # need fix docutils to get `node.line` - return + + if not node.rawsource: + node.rawsource = node.astext() IGNORED_NODES = ( @@ -73,6 +75,23 @@ IGNORED_NODES = ( nodes.doctest_block, #XXX there are probably more ) +def translatable_node(node): + if isinstance(node, nodes.TextElement): + apply_source_workaround(node) + + if not node.source: + return False # built-in message + if isinstance(node, IGNORED_NODES) and 'translatable' not in node: + return False + # orphan + # XXX ignore all metadata (== docinfo) + if isinstance(node, nodes.field_name) and node.children[0] == 'orphan': + return False + return True + + return False + + LITERAL_TYPE_NODES = ( nodes.literal_block, nodes.doctest_block, @@ -80,22 +99,9 @@ LITERAL_TYPE_NODES = ( ) def extract_messages(doctree): """Extract translatable messages from a document tree.""" - for node in doctree.traverse(nodes.TextElement): - apply_source_workaround(node) - - if not node.source: - continue # built-in message - if isinstance(node, IGNORED_NODES) and 'translatable' not in node: - continue - # orphan - # XXX ignore all metadata (== docinfo) - if isinstance(node, nodes.field_name) and node.children[0] == 'orphan': - continue - + for node in doctree.traverse(translatable_node): if isinstance(node, LITERAL_TYPE_NODES): msg = node.rawsource - if not msg: - msg = node.astext() else: msg = node.rawsource.replace('\n', ' ').strip()