9from docutils
import nodes
10from docutils.parsers.rst
import directives
11from sphinx
import addnodes
12from sphinx.roles
import XRefRole
13from sphinx.directives
import ObjectDescription
14from sphinx.domains
import Domain, ObjType, Index
15from sphinx.util.docfields
import TypedField, Field
16from sphinx.util.nodes
import make_refnode
17from sphinx.util
import logging
18logger = logging.getLogger(__name__)
23 A basf2 x-ref directive registered with Sphinx.add_object_type().
24 Basically copied together from sphinxcontrib-domaintools and sphinxcontrib-adadomain.
30 TypedField(
"parameter", label=
"Parameters", names=(
"param",
"parameter",
"arg",
"argument"),
31 typenames=(
"paramtype",
"type"), typerolename=
None, can_collapse=
True),
32 Field(
'returnvalue', label=
'Returns', has_arg=
False,
33 names=(
'returns',
'return')),
36 def handle_signature(self, sig, signode):
41 name, args = sig.split(
"(", 1)
48 signode += addnodes.desc_name(name, name)
53 paramlist = addnodes.desc_parameterlist()
54 for arg
in (e.strip()
for e
in args[:-1].split(
",")):
57 paramlist += addnodes.desc_parameter(arg, arg)
65 def add_target_and_index(self, name, sig, signode):
67 targetname = f
'{self.objtype}-{name}'
69 signode[
'ids'].append(targetname)
70 self.state.document.note_explicit_target(signode)
74 ddata = self.env.domaindata[
"b2"][self.objtype +
's']
78 logger.warn(f
"Duplicate description of basf2 {self.objtype} {name}, " +
79 "Other instance in " + self.env.doc2path(ddata[name][0]) +
80 ", please add ':noindex:' to one",
81 location=(self.env.docname, self.lineno))
83 ddata[name] = (self.env.docname, targetname)
87 """Create an alphabetic index of all modules"""
90 localname =
"basf2 Module Index"
91 shortname =
"basf2 modules"
93 def generate(self, docnames=None):
95 modules = self.domain.data[
"modules"].items()
96 for modname, (docname, target)
in sorted(modules):
97 letter = modname[0].upper()
98 content.setdefault(letter, [])
99 content[letter].append([modname, 0, docname, target,
"",
"",
""])
100 return list(content.items()),
False
105 """Create an alphabetic index of all variables"""
108 localname =
"basf2 Variable Index"
109 shortname =
"basf2 variables"
111 def generate(self, docnames=None):
113 modules = self.domain.data[
"variables"].items()
114 modules = sorted(modules, key=
lambda x: x[0].lower())
115 for modname, (docname, target)
in modules:
116 letter = modname[0].upper()
117 content.setdefault(letter, [])
118 content[letter].append([modname, 0, docname, target,
"",
"",
""])
119 return list(content.items()),
False
125 option_spec = Basf2Object.option_spec.copy()
if hasattr(Basf2Object,
"option_spec")
else {}
127 "source": directives.uri,
130 def handle_signature(self, sig, signode):
132 name = super().handle_signature(sig, signode)
137 linknode = nodes.reference(
'',
'[source]', refuri=uri, classes=[
'var-source-link'])
144 """basf2 Software Domain"""
147 label =
"Belle II Software"
149 "module": ObjType(
"module",
"mod"),
150 "variable": ObjType(
"variable",
"var")
154 "module": Basf2Object,
155 "variable": Basf2VariableObject,
172 """Remove the existing domain data for a given document name"""
173 for t
in "modules",
"variables":
175 for name, (doc, target)
in list(self.data[t].items()):
177 del self.data[t][name]
182 def get_objects(self):
183 for i, type
in enumerate([
"modules",
"variables"]):
184 for name, (docname, target)
in self.data[type].items():
185 yield (name, name, type, docname, target, i)
187 def get_type_name(self, type, primary=False):
191 def resolve_xref(self, env, fromdocname, builder,
192 typ, target, node, contnode):
193 t = {
"mod":
"modules",
"var":
"variables"}[typ]
195 docname, labelid = self.data[t][target]
196 return make_refnode(builder, fromdocname, docname,