diff options
author | Takeshi KOMIYA <i.tkomiya@gmail.com> | 2017-03-10 11:08:13 +0900 |
---|---|---|
committer | Takeshi KOMIYA <i.tkomiya@gmail.com> | 2017-03-10 11:08:13 +0900 |
commit | ff94ba9f896b2250b441fd99820ad06ac3ec50db (patch) | |
tree | 3598a87a6b307ef6f9709351982a26c263871d3a | |
parent | 65bde6a01ef0fac5adcaf3467f69fbd195792408 (diff) | |
download | sphinx-git-ff94ba9f896b2250b441fd99820ad06ac3ec50db.tar.gz |
Move env._resolve_any_reference() to ReferenceResolver
-rw-r--r-- | sphinx/environment/__init__.py | 44 | ||||
-rw-r--r-- | sphinx/transforms/post_transforms.py | 49 |
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 |