1 from sphinx
import addnodes
2 from sphinx.roles
import XRefRole
3 from sphinx.directives
import ObjectDescription
4 from sphinx.domains
import Domain, ObjType, Index
5 from sphinx.util.docfields
import TypedField, Field
6 from sphinx.util.nodes
import make_refnode
7 from sphinx.util
import logging
8 logger = logging.getLogger(__name__)
13 A Basf2 x-ref directive registered with Sphinx.add_object_type().
14 Basically copied together from sphinxcontrib-domaintools and sphinxcontrib-adadomain.
18 TypedField(
"parameter", label=
"Parameters", names=(
"param",
"parameter",
"arg",
"argument"),
19 typenames=(
"paramtype",
"type"), typerolename=
None, can_collapse=
True),
20 Field(
'returnvalue', label=
'Returns', has_arg=
False,
21 names=(
'returns',
'return')),
24 def handle_signature(self, sig, signode):
29 name, args = sig.split(
"(", 1)
30 except Exception
as e:
36 signode += addnodes.desc_name(name, name)
41 paramlist = addnodes.desc_parameterlist()
42 for arg
in (e.strip()
for e
in args[:-1].split(
",")):
45 paramlist += addnodes.desc_parameter(arg, arg)
51 def add_target_and_index(self, name, sig, signode):
53 targetname =
'%s-%s' % (self.objtype, name)
55 signode[
'ids'].append(targetname)
56 self.state.document.note_explicit_target(signode)
60 ddata = self.env.domaindata[
"b2"][self.objtype +
's']
64 logger.warn(
"Duplicate description of basf2 %s %s, " % (self.objtype, name) +
65 "Other instance in " + self.env.doc2path(ddata[name][0]) +
66 ", please add ':noindex:' to one",
67 location=(self.env.docname, self.lineno))
69 ddata[name] = (self.env.docname, targetname)
73 """Create an alphabetic index of all modules"""
75 localname =
"Basf2 Module Index"
76 shortname =
"basf2 modules"
78 def generate(self, docnames=None):
80 modules = self.domain.data[
"modules"].items()
81 for modname, (docname, target)
in sorted(modules):
82 letter = modname[0].upper()
83 content.setdefault(letter, [])
84 content[letter].append([modname, 0, docname, target,
"",
"",
""])
85 return list(content.items()),
False
89 """Create an alphabetic index of all variables"""
91 localname =
"Basf2 Variable Index"
92 shortname =
"basf2 variables"
94 def generate(self, docnames=None):
96 modules = self.domain.data[
"variables"].items()
97 modules = sorted(modules, key=
lambda x: x[0].lower())
98 for modname, (docname, target)
in modules:
99 letter = modname[0].upper()
100 content.setdefault(letter, [])
101 content[letter].append([modname, 0, docname, target,
"",
"",
""])
102 return list(content.items()),
False
106 """Basf2 Software Domain"""
108 label =
"Belle 2 Software"
110 "module": ObjType(
"module",
"mod"),
111 "variable": ObjType(
"variable",
"var")
115 "module": Basf2Object,
116 "variable": Basf2Object,
132 """Remove the existing domain data for a given document name"""
133 for t
in "modules",
"variables":
135 for name, (doc, target)
in list(self.data[t].items()):
137 del self.data[t][name]
141 def get_objects(self):
142 for i, type
in enumerate([
"modules",
"variables"]):
143 for name, (docname, target)
in self.data[type].items():
144 yield(name, name, type, docname, target, i)
146 def get_type_name(self, type, primary=False):
150 def resolve_xref(self, env, fromdocname, builder,
151 typ, target, node, contnode):
152 t = {
"mod":
"modules",
"var":
"variables"}[typ]
154 docname, labelid = self.data[t][target]
155 return make_refnode(builder, fromdocname, docname,