summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTakeshi KOMIYA <i.tkomiya@gmail.com>2017-03-10 11:08:13 +0900
committerTakeshi KOMIYA <i.tkomiya@gmail.com>2017-03-10 11:08:13 +0900
commitff94ba9f896b2250b441fd99820ad06ac3ec50db (patch)
tree3598a87a6b307ef6f9709351982a26c263871d3a
parent65bde6a01ef0fac5adcaf3467f69fbd195792408 (diff)
downloadsphinx-git-ff94ba9f896b2250b441fd99820ad06ac3ec50db.tar.gz
Move env._resolve_any_reference() to ReferenceResolver
-rw-r--r--sphinx/environment/__init__.py44
-rw-r--r--sphinx/transforms/post_transforms.py49
2 files changed, 47 insertions, 46 deletions
diff --git a/sphinx/environment/__init__.py b/sphinx/environment/__init__.py
index b6fd20cc3..b5119b734 100644
--- a/sphinx/environment/__init__.py
+++ b/sphinx/environment/__init__.py
@@ -968,50 +968,6 @@ class BuildEnvironment(object):
logger.warning(msg % {'target': target},
location=node, type='ref', subtype=typ)
- def _resolve_any_reference(self, builder, refdoc, node, contnode):
- # type: (Builder, unicode, nodes.Node, nodes.Node) -> nodes.Node
- """Resolve reference generated by the "any" role."""
- target = node['reftarget']
- results = [] # type: List[Tuple[unicode, nodes.Node]]
- # first, try resolving as :doc:
- doc_ref = self.domains['std'].resolve_xref(self, refdoc, builder, 'doc',
- target, node, contnode)
- if doc_ref:
- results.append(('doc', doc_ref))
- # next, do the standard domain (makes this a priority)
- results.extend(self.domains['std'].resolve_any_xref(
- self, refdoc, builder, target, node, contnode))
- for domain in self.domains.values():
- if domain.name == 'std':
- continue # we did this one already
- try:
- results.extend(domain.resolve_any_xref(self, refdoc, builder,
- target, node, contnode))
- except NotImplementedError:
- # the domain doesn't yet support the new interface
- # we have to manually collect possible references (SLOW)
- for role in domain.roles:
- res = domain.resolve_xref(self, refdoc, builder, role, target,
- node, contnode)
- if res and isinstance(res[0], nodes.Element):
- results.append(('%s:%s' % (domain.name, role), res))
- # now, see how many matches we got...
- if not results:
- return None
- if len(results) > 1:
- nice_results = ' or '.join(':%s:' % r[0] for r in results)
- logger.warning('more than one target found for \'any\' cross-'
- 'reference %r: could be %s', target, nice_results,
- location=node)
- res_role, newnode = results[0]
- # Override "any" class with the actual role type to get the styling
- # approximately correct.
- res_domain = res_role.split(':')[0]
- if newnode and newnode[0].get('classes'):
- newnode[0]['classes'].append(res_domain)
- newnode[0]['classes'].append(res_role.replace(':', '-'))
- return newnode
-
def create_index(self, builder, group_entries=True,
_fixre=re.compile(r'(.*) ([(][^()]*[)])')):
# type: (Builder, bool, Pattern) -> List[Tuple[unicode, List[Tuple[unicode, List[unicode]]]]] # NOQA
diff --git a/sphinx/transforms/post_transforms.py b/sphinx/transforms/post_transforms.py
index ed4276f5d..cc8c0b3c9 100644
--- a/sphinx/transforms/post_transforms.py
+++ b/sphinx/transforms/post_transforms.py
@@ -13,6 +13,7 @@ from docutils import nodes
from sphinx import addnodes
from sphinx.environment import NoUri
+from sphinx.locale import _
from sphinx.transforms import SphinxTransform
from sphinx.util import logging
@@ -54,8 +55,7 @@ class ReferencesResolver(SphinxTransform):
typ, target, node, contnode)
# really hardwired reference types
elif typ == 'any':
- newnode = self.env._resolve_any_reference(self.app.builder, refdoc,
- node, contnode)
+ newnode = self.resolve_anyref(refdoc, node, contnode)
# no new node found? try the missing-reference event
if newnode is None:
newnode = self.app.emit_firstresult('missing-reference', self.env,
@@ -68,6 +68,51 @@ class ReferencesResolver(SphinxTransform):
newnode = contnode
node.replace_self(newnode or contnode)
+ def resolve_anyref(self, refdoc, node, contnode):
+ # type: (unicode, nodes.Node, nodes.Node) -> nodes.Node
+ """Resolve reference generated by the "any" role."""
+ stddomain = self.env.get_domain('std')
+ target = node['reftarget']
+ results = [] # type: List[Tuple[unicode, nodes.Node]]
+ # first, try resolving as :doc:
+ doc_ref = stddomain.resolve_xref(self.env, refdoc, self.app.builder,
+ 'doc', target, node, contnode)
+ if doc_ref:
+ results.append(('doc', doc_ref))
+ # next, do the standard domain (makes this a priority)
+ results.extend(stddomain.resolve_any_xref(self.env, refdoc, self.app.builder,
+ target, node, contnode))
+ for domain in self.env.domains.values():
+ if domain.name == 'std':
+ continue # we did this one already
+ try:
+ results.extend(domain.resolve_any_xref(self.env, refdoc, self.app.builder,
+ target, node, contnode))
+ except NotImplementedError:
+ # the domain doesn't yet support the new interface
+ # we have to manually collect possible references (SLOW)
+ for role in domain.roles:
+ res = domain.resolve_xref(self.env, refdoc, self.app.builder,
+ role, target, node, contnode)
+ if res and isinstance(res[0], nodes.Element):
+ results.append(('%s:%s' % (domain.name, role), res))
+ # now, see how many matches we got...
+ if not results:
+ return None
+ if len(results) > 1:
+ nice_results = ' or '.join(':%s:' % r[0] for r in results)
+ logger.warning(_('more than one target found for \'any\' cross-'
+ 'reference %r: could be %s'), target, nice_results,
+ location=node)
+ res_role, newnode = results[0]
+ # Override "any" class with the actual role type to get the styling
+ # approximately correct.
+ res_domain = res_role.split(':')[0]
+ if newnode and newnode[0].get('classes'):
+ newnode[0]['classes'].append(res_domain)
+ newnode[0]['classes'].append(res_role.replace(':', '-'))
+ return newnode
+
class OnlyNodeTransform(SphinxTransform):
default_priority = 50