Merge pull request #5610 from tk0miya/refactor_domains

Refactor std domain: Add add_object() and add_program_option()
This commit is contained in:
Takeshi KOMIYA 2018-11-14 00:55:06 +09:00 committed by GitHub
commit 45ad2e41a5
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -13,6 +13,7 @@ import re
import unicodedata import unicodedata
import warnings import warnings
from copy import copy from copy import copy
from typing import cast
from docutils import nodes from docutils import nodes
from docutils.parsers.rst import directives from docutils.parsers.rst import directives
@ -79,8 +80,9 @@ class GenericObject(ObjectDescription):
indexentry = self.indextemplate % (name,) indexentry = self.indextemplate % (name,)
self.indexnode['entries'].append((indextype, indexentry, self.indexnode['entries'].append((indextype, indexentry,
targetname, '', None)) targetname, '', None))
self.env.domaindata['std']['objects'][self.objtype, name] = \
self.env.docname, targetname std = cast(StandardDomain, self.env.get_domain('std'))
std.add_object(self.objtype, name, self.env.docname, targetname)
class EnvVar(GenericObject): class EnvVar(GenericObject):
@ -141,8 +143,10 @@ class Target(SphinxDirective):
name = self.name name = self.name
if ':' in self.name: if ':' in self.name:
_, name = self.name.split(':', 1) _, name = self.name.split(':', 1)
self.env.domaindata['std']['objects'][name, fullname] = \
self.env.docname, targetname std = cast(StandardDomain, self.env.get_domain('std'))
std.add_object(name, fullname, self.env.docname, targetname)
return ret return ret
@ -192,10 +196,12 @@ class Cmdoption(ObjectDescription):
targetname = 'cmdoption' + targetname targetname = 'cmdoption' + targetname
signode['names'].append(targetname) signode['names'].append(targetname)
domain = cast(StandardDomain, self.env.get_domain('std'))
self.state.document.note_explicit_target(signode) self.state.document.note_explicit_target(signode)
for optname in signode.get('allnames', []): for optname in signode.get('allnames', []):
self.env.domaindata['std']['progoptions'][currprogram, optname] = \ domain.add_program_option(currprogram, optname,
self.env.docname, signode['ids'][0] self.env.docname, signode['ids'][0])
# create only one index entry for the whole option # create only one index entry for the whole option
if optname == firstname: if optname == firstname:
self.indexnode['entries'].append( self.indexnode['entries'].append(
@ -248,15 +254,15 @@ def make_glossary_term(env, textnodes, index_key, source, lineno, new_id=None):
term.line = lineno term.line = lineno
gloss_entries = env.temp_data.setdefault('gloss_entries', set()) gloss_entries = env.temp_data.setdefault('gloss_entries', set())
objects = env.domaindata['std']['objects']
termtext = term.astext() termtext = term.astext()
if new_id is None: if new_id is None:
new_id = nodes.make_id('term-' + termtext) new_id = nodes.make_id('term-' + termtext)
if new_id in gloss_entries: if new_id in gloss_entries:
new_id = 'term-' + str(len(gloss_entries)) new_id = 'term-' + str(len(gloss_entries))
gloss_entries.add(new_id) gloss_entries.add(new_id)
objects['term', termtext.lower()] = env.docname, new_id
std = cast(StandardDomain, env.get_domain('std'))
std.add_object('term', termtext.lower(), env.docname, new_id)
# add an index entry too # add an index entry too
indexnode = addnodes.index() indexnode = addnodes.index()
@ -414,7 +420,7 @@ class ProductionList(SphinxDirective):
def run(self): def run(self):
# type: () -> List[nodes.Node] # type: () -> List[nodes.Node]
objects = self.env.domaindata['std']['objects'] domain = cast(StandardDomain, self.env.get_domain('std'))
node = addnodes.productionlist() # type: nodes.Node node = addnodes.productionlist() # type: nodes.Node
messages = [] # type: List[nodes.Node] messages = [] # type: List[nodes.Node]
i = 0 i = 0
@ -435,7 +441,7 @@ class ProductionList(SphinxDirective):
if idname not in self.state.document.ids: if idname not in self.state.document.ids:
subnode['ids'].append(idname) subnode['ids'].append(idname)
self.state.document.note_implicit_target(subnode, subnode) self.state.document.note_implicit_target(subnode, subnode)
objects['token', subnode['tokenname']] = self.env.docname, idname domain.add_object('token', subnode['tokenname'], self.env.docname, idname)
subnode.extend(token_xrefs(tokens)) subnode.extend(token_xrefs(tokens))
node.append(subnode) node.append(subnode)
return [node] + messages return [node] + messages
@ -644,6 +650,14 @@ class StandardDomain(Domain):
continue continue
labels[name] = docname, labelid, sectname labels[name] = docname, labelid, sectname
def add_object(self, objtype, name, docname, labelid):
# type: (unicode, unicode, unicode, unicode) -> None
self.data['objects'][objtype, name] = (docname, labelid)
def add_program_option(self, program, name, docname, labelid):
# type: (unicode, unicode, unicode, unicode) -> None
self.data['progoptions'][program, name] = (docname, labelid)
def check_consistency(self): def check_consistency(self):
# type: () -> None # type: () -> None
for name, (docname, labelid, lineno) in self.data['citations'].items(): for name, (docname, labelid, lineno) in self.data['citations'].items():