diff options
Diffstat (limited to 'Documentation/sphinx/automarkup.py')
| -rw-r--r-- | Documentation/sphinx/automarkup.py | 25 | 
1 files changed, 18 insertions, 7 deletions
| diff --git a/Documentation/sphinx/automarkup.py b/Documentation/sphinx/automarkup.py index acf5473002f3..cc348b219fca 100644 --- a/Documentation/sphinx/automarkup.py +++ b/Documentation/sphinx/automarkup.py @@ -271,19 +271,30 @@ def get_c_namespace(app, docname):  def auto_markup(app, doctree, name):      global c_namespace      c_namespace = get_c_namespace(app, name) +    def text_but_not_a_reference(node): +        # The nodes.literal test catches ``literal text``, its purpose is to +        # avoid adding cross-references to functions that have been explicitly +        # marked with cc:func:. +        if not isinstance(node, nodes.Text) or isinstance(node.parent, nodes.literal): +            return False + +        child_of_reference = False +        parent = node.parent +        while parent: +            if isinstance(parent, nodes.Referential): +                child_of_reference = True +                break +            parent = parent.parent +        return not child_of_reference +      #      # This loop could eventually be improved on.  Someday maybe we      # want a proper tree traversal with a lot of awareness of which      # kinds of nodes to prune.  But this works well for now.      # -    # The nodes.literal test catches ``literal text``, its purpose is to -    # avoid adding cross-references to functions that have been explicitly -    # marked with cc:func:. -    #      for para in doctree.traverse(nodes.paragraph): -        for node in para.traverse(nodes.Text): -            if not isinstance(node.parent, nodes.literal): -                node.parent.replace(node, markup_refs(name, app, node)) +        for node in para.traverse(condition=text_but_not_a_reference): +            node.parent.replace(node, markup_refs(name, app, node))  def setup(app):      app.connect('doctree-resolved', auto_markup) |