mirror of
https://github.com/sphinx-doc/sphinx.git
synced 2025-02-25 18:55:22 -06:00
Add tests for "any" role and default-role setting. Fix some minor bugs with "any".
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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']", ''),
|
||||
|
||||
Reference in New Issue
Block a user