Closes #1285: Avoid name clashes between C domain objects and section titles.

This commit is contained in:
Georg Brandl 2014-01-17 07:08:32 +01:00
parent 5721370438
commit de92e3b026
3 changed files with 18 additions and 13 deletions

View File

@ -97,6 +97,8 @@ Bugs fixed
Also make the redirect code apparent and tweak the output a bit to be Also make the redirect code apparent and tweak the output a bit to be
more obvious. more obvious.
* #1285: Avoid name clashes between C domain objects and section titles.
Documentation Documentation
------------- -------------

View File

@ -156,10 +156,12 @@ class CObject(ObjectDescription):
return '' return ''
def add_target_and_index(self, name, sig, signode): def add_target_and_index(self, name, sig, signode):
# note target # for C API items we add a prefix since names are usually not qualified
if name not in self.state.document.ids: # by a module name and so easily clash with e.g. section titles
signode['names'].append(name) targetname = 'c.' + name
signode['ids'].append(name) if targetname not in self.state.document.ids:
signode['names'].append(targetname)
signode['ids'].append(targetname)
signode['first'] = (not self.names) signode['first'] = (not self.names)
self.state.document.note_explicit_target(signode) self.state.document.note_explicit_target(signode)
inv = self.env.domaindata['c']['objects'] inv = self.env.domaindata['c']['objects']
@ -172,7 +174,8 @@ class CObject(ObjectDescription):
indextext = self.get_index_text(name) indextext = self.get_index_text(name)
if indextext: if indextext:
self.indexnode['entries'].append(('single', indextext, name, '')) self.indexnode['entries'].append(('single', indextext,
targetname, ''))
def before_content(self): def before_content(self):
self.typename_set = False self.typename_set = False
@ -242,9 +245,9 @@ class CDomain(Domain):
if target not in self.data['objects']: if target not in self.data['objects']:
return None return None
obj = self.data['objects'][target] obj = self.data['objects'][target]
return make_refnode(builder, fromdocname, obj[0], target, return make_refnode(builder, fromdocname, obj[0], 'c.' + target,
contnode, target) contnode, target)
def get_objects(self): def get_objects(self):
for refname, (docname, type) in self.data['objects'].iteritems(): for refname, (docname, type) in self.data['objects'].iteritems():
yield (refname, refname, type, docname, refname, 1) yield (refname, refname, type, docname, 'c.' + refname, 1)

View File

@ -186,13 +186,13 @@ HTML_XPATH = {
(".//a[@href='#userdesc-myobj'][@class='reference internal']", ''), (".//a[@href='#userdesc-myobj'][@class='reference internal']", ''),
# C references # C references
(".//span[@class='pre']", 'CFunction()'), (".//span[@class='pre']", 'CFunction()'),
(".//a[@href='#Sphinx_DoSomething']", ''), (".//a[@href='#c.Sphinx_DoSomething']", ''),
(".//a[@href='#SphinxStruct.member']", ''), (".//a[@href='#c.SphinxStruct.member']", ''),
(".//a[@href='#SPHINX_USE_PYTHON']", ''), (".//a[@href='#c.SPHINX_USE_PYTHON']", ''),
(".//a[@href='#SphinxType']", ''), (".//a[@href='#c.SphinxType']", ''),
(".//a[@href='#sphinx_global']", ''), (".//a[@href='#c.sphinx_global']", ''),
# reference from old C markup extension # reference from old C markup extension
(".//a[@href='#Sphinx_Func']", ''), (".//a[@href='#c.Sphinx_Func']", ''),
# test global TOC created by toctree() # test global TOC created by toctree()
(".//ul[@class='current']/li[@class='toctree-l1 current']/a[@href='']", (".//ul[@class='current']/li[@class='toctree-l1 current']/a[@href='']",
'Testing object descriptions'), 'Testing object descriptions'),