Add tests for "any" role and default-role setting. Fix some minor bugs with "any".

This commit is contained in:
Georg Brandl
2014-09-19 14:17:36 +02:00
parent a973daea41
commit 6c3789a353
4 changed files with 47 additions and 19 deletions

View File

@@ -204,29 +204,29 @@ class Program(Directive):
return []
def _split_option(text, refnode, env):
try:
program, target = re.split(' (?=-|--|/)', text, 1)
except ValueError:
env.warn_node('Malformed :option: %r, does not contain option '
'marker - or -- or /' % text, refnode)
return None, text
else:
program = ws_re.sub('-', program)
return program, target
class OptionXRefRole(XRefRole):
innernodeclass = addnodes.literal_emphasis
def _split(self, text, refnode, env):
try:
program, target = re.split(' (?=-|--|/)', text, 1)
except ValueError:
env.warn_node('Malformed :option: %r, does not contain option '
'marker - or -- or /' % text, refnode)
return None, text
else:
program = ws_re.sub('-', program)
return program, target
def process_link(self, env, refnode, has_explicit_title, title, target):
program = env.temp_data.get('std:program')
if not has_explicit_title:
if ' ' in title and not (title.startswith('/') or
title.startswith('-')):
program, target = self._split(title, refnode, env)
program, target = _split_option(title, refnode, env)
target = target.strip()
elif ' ' in target:
program, target = self._split(target, refnode, env)
program, target = _split_option(target, refnode, env)
refnode['refprogram'] = program
return title, target
@@ -608,7 +608,13 @@ class StandardDomain(Domain):
return make_refnode(builder, fromdocname, docname,
labelid, contnode)
elif typ == 'option':
progname = node.get('refprogram', '')
if 'refprogram' in node:
progname = node['refprogram']
elif ' -' in target or ' /' in target:
# maybe an "any" directive, split it ourselves
progname, target = _split_option(target, node, env)
else:
return None
docname, labelid = self.data['progoptions'].get((progname, target),
('', ''))
if not docname:
@@ -632,8 +638,8 @@ class StandardDomain(Domain):
node, contnode):
results = []
for role in ('ref', 'option'): # do not try "keyword"
res = self.resolve_xref(env, fromdocname, builder, target,
role, node, contnode)
res = self.resolve_xref(env, fromdocname, builder, role, target,
node, contnode)
if res:
results.append(('std:ref', res))
# all others

View File

@@ -1357,7 +1357,7 @@ class BuildEnvironment:
elif typ == 'doc':
newnode = self._resolve_doc_reference(builder, node, contnode)
elif typ == 'citation':
newnode = self._resolve_citation(builder, node, contnode)
newnode = self._resolve_citation(builder, refdoc, node, contnode)
# no new node found? try the missing-reference event
if newnode is None:
newnode = builder.app.emit_firstresult(
@@ -1418,11 +1418,11 @@ class BuildEnvironment:
newnode.append(innernode)
return newnode
def _resolve_citation(self, builder, node, contnode):
def _resolve_citation(self, builder, fromdocname, node, contnode):
docname, labelid = self.citations.get(node['reftarget'], ('', ''))
if docname:
try:
newnode = make_refnode(builder, node['refdoc'],
newnode = make_refnode(builder, fromdocname,
docname, labelid, contnode)
return newnode
except NoUri:

View File

@@ -356,6 +356,25 @@ Only directive
Always present, because set through conf.py/command line.
Any role
--------
.. default-role:: any
Test referencing to `headings <with>` and `objects <func_without_body>`.
Also `modules <mod>` and `classes <Time>`.
More domains:
* `JS <bar.baz>`
* `C <SphinxType>`
* `myobj` (user markup)
* `n::Array`
* `perl -c`
.. default-role::
.. rubric:: Footnotes
.. [#] Like footnotes.

View File

@@ -175,6 +175,9 @@ HTML_XPATH = {
(".//p", 'In HTML.'),
(".//p", 'In both.'),
(".//p", 'Always present'),
# tests for ``any`` role
(".//a[@href='#with']/em", 'headings'),
(".//a[@href='objects.html#func_without_body']/code/span", 'objects'),
],
'objects.html': [
(".//dt[@id='mod.Cls.meth1']", ''),