diff options
author | Jakob Lykke Andersen <Jakob@caput.dk> | 2017-03-08 20:35:44 +0900 |
---|---|---|
committer | Jakob Lykke Andersen <Jakob@caput.dk> | 2017-03-08 20:35:44 +0900 |
commit | 9ca5d990f6f68a9c9672eb052aa48b21b8e93b64 (patch) | |
tree | a3c04a0468468b229fce65e1498a94bc0fe667cf /sphinx/util/docfields.py | |
parent | 38b38d8affe9110968a5dc0cf91f4e566c1739a2 (diff) | |
download | sphinx-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.py | 31 |
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) |