"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