"Fossies" - the Fresh Open Source Software Archive 
Member "gammu-1.42.0/docs/manual/configext.py" (3 Oct 2020, 5701 Bytes) of package /linux/privat/gammu-1.42.0.tar.bz2:
As a special service "Fossies" has tried to format the requested source page into HTML format using (guessed) Python source code syntax highlighting (style:
standard) with prefixed line numbers.
Alternatively you can here
view or
download the uninterpreted source code file.
For more information about "configext.py" see the
Fossies "Dox" file reference documentation and the latest
Fossies "Diffs" side-by-side code changes report:
1.41.0_vs_1.42.0.
1 from sphinx.domains import Domain, ObjType
2 from sphinx.roles import XRefRole
3 from sphinx.domains.std import GenericObject, StandardDomain
4 from sphinx.directives import ObjectDescription
5 from sphinx.util.nodes import clean_astext, make_refnode
6 from sphinx.util import ws_re
7 from sphinx import addnodes
8 from docutils import nodes
9
10 class ConfigOption(ObjectDescription):
11 indextemplate = 'configuration option; %s'
12 parse_node = None
13
14 def handle_signature(self, sig, signode):
15 if self.parse_node:
16 name = self.parse_node(self.env, sig, signode)
17 else:
18 signode.clear()
19 signode += addnodes.desc_name(sig, sig)
20 # normalize whitespace like XRefRole does
21 name = ws_re.sub('', sig)
22 return name
23
24 def add_target_and_index(self, name, sig, signode):
25 targetname = '%s-%s' % (self.objtype, name)
26 signode['ids'].append(targetname)
27 self.state.document.note_explicit_target(signode)
28 if self.indextemplate:
29 colon = self.indextemplate.find(':')
30 if colon != -1:
31 indextype = self.indextemplate[:colon].strip()
32 indexentry = self.indextemplate[colon+1:].strip() % (name,)
33 else:
34 indextype = 'single'
35 indexentry = self.indextemplate % (name,)
36 self.indexnode['entries'].append((indextype, indexentry,
37 targetname, targetname))
38 self.env.domaindata['config']['objects'][self.objtype, name] = \
39 self.env.docname, targetname
40
41
42 class ConfigSectionXRefRole(XRefRole):
43 """
44 Cross-referencing role for configuration sections (adds an index entry).
45 """
46
47 def result_nodes(self, document, env, node, is_ref):
48 if not is_ref:
49 return [node], []
50 varname = node['reftarget']
51 tgtid = 'index-%s' % env.new_serialno('index')
52 indexnode = addnodes.index()
53 indexnode['entries'] = [
54 ('single', varname, tgtid, varname),
55 ('single', 'configuration section; %s' % varname, tgtid, varname)
56 ]
57 targetnode = nodes.target('', '', ids=[tgtid])
58 document.note_explicit_target(targetnode)
59 return [indexnode, targetnode, node], []
60
61 class ConfigSection(ObjectDescription):
62 indextemplate = 'configuration section; %s'
63 parse_node = None
64
65 def handle_signature(self, sig, signode):
66 if self.parse_node:
67 name = self.parse_node(self.env, sig, signode)
68 else:
69 signode.clear()
70 signode += addnodes.desc_name(sig, sig)
71 # normalize whitespace like XRefRole does
72 name = ws_re.sub('', sig)
73 return name
74
75 def add_target_and_index(self, name, sig, signode):
76 targetname = '%s-%s' % (self.objtype, name)
77 signode['ids'].append(targetname)
78 self.state.document.note_explicit_target(signode)
79 if self.indextemplate:
80 colon = self.indextemplate.find(':')
81 if colon != -1:
82 indextype = self.indextemplate[:colon].strip()
83 indexentry = self.indextemplate[colon+1:].strip() % (name,)
84 else:
85 indextype = 'single'
86 indexentry = self.indextemplate % (name,)
87 self.indexnode['entries'].append((indextype, indexentry,
88 targetname, targetname))
89 self.env.domaindata['config']['objects'][self.objtype, name] = \
90 self.env.docname, targetname
91
92
93 class ConfigOptionXRefRole(XRefRole):
94 """
95 Cross-referencing role for configuration options (adds an index entry).
96 """
97
98 def result_nodes(self, document, env, node, is_ref):
99 if not is_ref:
100 return [node], []
101 varname = node['reftarget']
102 tgtid = 'index-%s' % env.new_serialno('index')
103 indexnode = addnodes.index()
104 indexnode['entries'] = [
105 ('single', varname, tgtid, varname, None),
106 ('single', 'configuration option; %s' % varname, tgtid, varname, None)
107 ]
108 targetnode = nodes.target('', '', ids=[tgtid])
109 document.note_explicit_target(targetnode)
110 return [indexnode, targetnode, node], []
111
112
113 class ConfigFileDomain(Domain):
114 name = 'config'
115 label = 'Config'
116
117 object_types = {
118 'option': ObjType('config option', 'option'),
119 'section': ObjType('config section', 'section'),
120 }
121 directives = {
122 'option': ConfigOption,
123 'section': ConfigSection,
124 }
125 roles = {
126 'option': ConfigOptionXRefRole(),
127 'section': ConfigSectionXRefRole(),
128 }
129
130 initial_data = {
131 'objects': {}, # (type, name) -> docname, labelid
132 }
133
134 def clear_doc(self, docname):
135 remove = []
136 for key, (fn, _) in self.data['objects'].items():
137 if fn == docname:
138 remove.append(key)
139 for key in remove:
140 del self.data['objects'][key]
141
142 def resolve_xref(self, env, fromdocname, builder,
143 typ, target, node, contnode):
144 docname, labelid = self.data['objects'].get((typ, target), ('', ''))
145 if not docname:
146 return None
147 else:
148 return make_refnode(builder, fromdocname, docname,
149 labelid, contnode)
150
151 def get_objects(self):
152 for (type, name), info in self.data['objects'].items():
153 yield (name, name, type, info[0], info[1],
154 self.object_types[type].attrs['searchprio'])
155
156 def setup(app):
157 app.add_domain(ConfigFileDomain)
158