summaryrefslogtreecommitdiff
path: root/sphinx/util/docfields.py
diff options
context:
space:
mode:
authorJakob Lykke Andersen <Jakob@caput.dk>2017-03-08 20:35:44 +0900
committerJakob Lykke Andersen <Jakob@caput.dk>2017-03-08 20:35:44 +0900
commit9ca5d990f6f68a9c9672eb052aa48b21b8e93b64 (patch)
treea3c04a0468468b229fce65e1498a94bc0fe667cf /sphinx/util/docfields.py
parent38b38d8affe9110968a5dc0cf91f4e566c1739a2 (diff)
downloadsphinx-git-9ca5d990f6f68a9c9672eb052aa48b21b8e93b64.tar.gz
Add callback on domains for xrefs from fields.
Fixes sphinx-doc/sphinx#2607. Fixes sphinx-doc/sphinx#2665.
Diffstat (limited to 'sphinx/util/docfields.py')
-rw-r--r--sphinx/util/docfields.py31
1 files changed, 16 insertions, 15 deletions
diff --git a/sphinx/util/docfields.py b/sphinx/util/docfields.py
index d5cb4038f..dc8ca4cc6 100644
--- a/sphinx/util/docfields.py
+++ b/sphinx/util/docfields.py
@@ -54,35 +54,36 @@ class Field(object):
self.rolename = rolename
self.bodyrolename = bodyrolename
- def make_xref(self, rolename, domain, target,
+ def make_xref(self, env, rolename, domain, target,
innernode=addnodes.literal_emphasis, contnode=None):
if not rolename:
return contnode or innernode(target, target)
refnode = addnodes.pending_xref('', refdomain=domain, refexplicit=False,
reftype=rolename, reftarget=target)
refnode += contnode or innernode(target, target)
+ env.domains[domain].process_field_xref(refnode)
return refnode
- def make_xrefs(self, rolename, domain, target,
+ def make_xrefs(self, env, rolename, domain, target,
innernode=addnodes.literal_emphasis, contnode=None):
- return [self.make_xref(rolename, domain, target, innernode, contnode)]
+ return [self.make_xref(env, rolename, domain, target, innernode, contnode)]
def make_entry(self, fieldarg, content):
return (fieldarg, content)
- def make_field(self, types, domain, item):
+ def make_field(self, env, types, domain, item):
fieldarg, content = item
fieldname = nodes.field_name('', self.label)
if fieldarg:
fieldname += nodes.Text(' ')
- fieldname.extend(self.make_xrefs(self.rolename, domain,
+ fieldname.extend(self.make_xrefs(env, self.rolename, domain,
fieldarg, nodes.Text))
if len(content) == 1 and (
isinstance(content[0], nodes.Text) or
(isinstance(content[0], nodes.inline) and len(content[0]) == 1 and
isinstance(content[0][0], nodes.Text))):
- content = self.make_xrefs(self.bodyrolename, domain,
+ content = self.make_xrefs(env, self.bodyrolename, domain,
content[0].astext(), contnode=content[0])
fieldbody = nodes.field_body('', nodes.paragraph('', '', *content))
return nodes.field('', fieldname, fieldbody)
@@ -109,12 +110,12 @@ class GroupedField(Field):
Field.__init__(self, name, names, label, True, rolename)
self.can_collapse = can_collapse
- def make_field(self, types, domain, items):
+ def make_field(self, env, types, domain, items):
fieldname = nodes.field_name('', self.label)
listnode = self.list_type()
for fieldarg, content in items:
par = nodes.paragraph()
- par.extend(self.make_xrefs(self.rolename, domain, fieldarg,
+ par.extend(self.make_xrefs(env, self.rolename, domain, fieldarg,
addnodes.literal_strong))
par += nodes.Text(' -- ')
par += content
@@ -155,10 +156,10 @@ class TypedField(GroupedField):
self.typenames = typenames
self.typerolename = typerolename
- def make_field(self, types, domain, items):
+ def make_field(self, env, types, domain, items):
def handle_item(fieldarg, content):
par = nodes.paragraph()
- par.extend(self.make_xrefs(self.rolename, domain, fieldarg,
+ par.extend(self.make_xrefs(env, self.rolename, domain, fieldarg,
addnodes.literal_strong))
if fieldarg in types:
par += nodes.Text(' (')
@@ -168,8 +169,8 @@ class TypedField(GroupedField):
fieldtype = types.pop(fieldarg)
if len(fieldtype) == 1 and isinstance(fieldtype[0], nodes.Text):
typename = u''.join(n.astext() for n in fieldtype)
- par.extend(self.make_xrefs(self.typerolename, domain, typename,
- addnodes.literal_emphasis))
+ par.extend(self.make_xrefs(env, self.typerolename, domain,
+ typename, addnodes.literal_emphasis))
else:
par += fieldtype
par += nodes.Text(')')
@@ -196,7 +197,7 @@ class DocFieldTransformer(object):
"""
def __init__(self, directive):
- self.domain = directive.domain
+ self.directive = directive
if '_doc_field_type_map' not in directive.__class__.__dict__:
directive.__class__._doc_field_type_map = \
self.preprocess_fieldtypes(directive.__class__.doc_field_types)
@@ -308,7 +309,7 @@ class DocFieldTransformer(object):
else:
fieldtype, content = entry
fieldtypes = types.get(fieldtype.name, {})
- new_list += fieldtype.make_field(fieldtypes, self.domain,
- content)
+ new_list += fieldtype.make_field(self.directive.env, fieldtypes,
+ self.directive.domain, content)
node.replace_self(new_list)