From de92e3b0265e6613278a5dbf83bf833d176f7c03 Mon Sep 17 00:00:00 2001 From: Georg Brandl Date: Fri, 17 Jan 2014 07:08:32 +0100 Subject: [PATCH] Closes #1285: Avoid name clashes between C domain objects and section titles. --- CHANGES | 2 ++ sphinx/domains/c.py | 17 ++++++++++------- tests/test_build_html.py | 12 ++++++------ 3 files changed, 18 insertions(+), 13 deletions(-) diff --git a/CHANGES b/CHANGES index 1b128c551..3c0ab53c5 100644 --- a/CHANGES +++ b/CHANGES @@ -97,6 +97,8 @@ Bugs fixed Also make the redirect code apparent and tweak the output a bit to be more obvious. +* #1285: Avoid name clashes between C domain objects and section titles. + Documentation ------------- diff --git a/sphinx/domains/c.py b/sphinx/domains/c.py index aed5b47e5..26e3c984c 100644 --- a/sphinx/domains/c.py +++ b/sphinx/domains/c.py @@ -156,10 +156,12 @@ class CObject(ObjectDescription): return '' def add_target_and_index(self, name, sig, signode): - # note target - if name not in self.state.document.ids: - signode['names'].append(name) - signode['ids'].append(name) + # for C API items we add a prefix since names are usually not qualified + # by a module name and so easily clash with e.g. section titles + targetname = 'c.' + name + if targetname not in self.state.document.ids: + signode['names'].append(targetname) + signode['ids'].append(targetname) signode['first'] = (not self.names) self.state.document.note_explicit_target(signode) inv = self.env.domaindata['c']['objects'] @@ -172,7 +174,8 @@ class CObject(ObjectDescription): indextext = self.get_index_text(name) if indextext: - self.indexnode['entries'].append(('single', indextext, name, '')) + self.indexnode['entries'].append(('single', indextext, + targetname, '')) def before_content(self): self.typename_set = False @@ -242,9 +245,9 @@ class CDomain(Domain): if target not in self.data['objects']: return None obj = self.data['objects'][target] - return make_refnode(builder, fromdocname, obj[0], target, + return make_refnode(builder, fromdocname, obj[0], 'c.' + target, contnode, target) def get_objects(self): for refname, (docname, type) in self.data['objects'].iteritems(): - yield (refname, refname, type, docname, refname, 1) + yield (refname, refname, type, docname, 'c.' + refname, 1) diff --git a/tests/test_build_html.py b/tests/test_build_html.py index 2f34e9e40..ef8e3888b 100644 --- a/tests/test_build_html.py +++ b/tests/test_build_html.py @@ -186,13 +186,13 @@ HTML_XPATH = { (".//a[@href='#userdesc-myobj'][@class='reference internal']", ''), # C references (".//span[@class='pre']", 'CFunction()'), - (".//a[@href='#Sphinx_DoSomething']", ''), - (".//a[@href='#SphinxStruct.member']", ''), - (".//a[@href='#SPHINX_USE_PYTHON']", ''), - (".//a[@href='#SphinxType']", ''), - (".//a[@href='#sphinx_global']", ''), + (".//a[@href='#c.Sphinx_DoSomething']", ''), + (".//a[@href='#c.SphinxStruct.member']", ''), + (".//a[@href='#c.SPHINX_USE_PYTHON']", ''), + (".//a[@href='#c.SphinxType']", ''), + (".//a[@href='#c.sphinx_global']", ''), # reference from old C markup extension - (".//a[@href='#Sphinx_Func']", ''), + (".//a[@href='#c.Sphinx_Func']", ''), # test global TOC created by toctree() (".//ul[@class='current']/li[@class='toctree-l1 current']/a[@href='']", 'Testing object descriptions'),