summaryrefslogtreecommitdiff
path: root/docs.rtems.org/configuration.py
diff options
context:
space:
mode:
Diffstat (limited to 'docs.rtems.org/configuration.py')
-rw-r--r--docs.rtems.org/configuration.py264
1 files changed, 264 insertions, 0 deletions
diff --git a/docs.rtems.org/configuration.py b/docs.rtems.org/configuration.py
new file mode 100644
index 0000000..b7b19e5
--- /dev/null
+++ b/docs.rtems.org/configuration.py
@@ -0,0 +1,264 @@
+#
+# RTEMS Project Documentation
+#
+
+import datetime
+import os
+import xml.dom.minidom as xml
+
+try:
+ import configparser
+except:
+ import ConfigParser as configparser
+
+def today():
+ now = datetime.date.today()
+ m = now.strftime('%b')
+ y = now.strftime('%Y')
+ if now.day == 11:
+ s = 'th'
+ elif now.day % 10 == 1:
+ s = 'st'
+ elif now.day == 12:
+ s = 'th'
+ elif now.day % 10 == 2:
+ s = 'nd'
+ elif now.day == 13:
+ s = 'th'
+ elif now.day == 3:
+ s = 'rd'
+ else:
+ s = 'th'
+ d = '%2d%s' % (now.day, s)
+ return '%s %s %s' % (d, m, y)
+
+class configuration:
+ def __init__(self, ctx, config):
+ self.ctx = ctx
+ self.config = None
+ self.branches = None
+ self.releases = None
+ self.titles = None
+ self.name = None
+ self.load(config)
+
+ def __str__(self):
+ import pprint
+ s = self.name + os.linesep
+ s += 'Titles:' + os.linesep + \
+ pprint.pformat(self.titles, indent = 1, width = 80) + os.linesep
+ s += 'Branches:' + os.linesep + \
+ pprint.pformat(self.branches, indent = 1, width = 80) + os.linesep
+ s += 'Releases:' + os.linesep + \
+ pprint.pformat(self.releases, indent = 1, width = 80) + os.linesep
+ return s
+
+ def _get_item(self, section, label, err = True):
+ try:
+ rec = self.config.get(section, label).replace(os.linesep, ' ')
+ return rec
+ except:
+ if err:
+ self.ctx.fatal('config: no %s found in %s' % (label, section))
+ return None
+
+ def _get_items(self, section, err = True):
+ try:
+ items = self.config.items(section)
+ return items
+ except:
+ if err:
+ self.ctx.fatal('config: section %s not found' % (section))
+ return []
+
+ def _comma_list(self, section, label, error = True):
+ items = self._get_item(section, label, error)
+ if items is None:
+ return []
+ return sorted(set([a.strip() for a in items.split(',')]))
+
+ def _xml_create_doc(self, cat, name, legacy, release, html, pdf):
+ doc = cat.createElement('doc')
+
+ name_ = cat.createElement('name')
+ text = cat.createTextNode(name)
+ name_.appendChild(text)
+ doc.appendChild(name_)
+
+ title_ = cat.createElement('title')
+ text = cat.createTextNode(self.titles[name.lower()])
+ title_.appendChild(text)
+ doc.appendChild(title_)
+
+ if legacy:
+ legacy_ = cat.createElement('legacy')
+ text = cat.createTextNode('Yes')
+ legacy_.appendChild(text)
+ doc.appendChild(legacy_)
+
+ release_ = cat.createElement('release')
+ text = cat.createTextNode(release)
+ release_.appendChild(text)
+ doc.appendChild(release_)
+
+ version_ = cat.createElement('version')
+ text = cat.createTextNode(release)
+ version_.appendChild(text)
+ doc.appendChild(version_)
+
+ html_ = cat.createElement('html')
+ text = cat.createTextNode(html)
+ html_.appendChild(text)
+ doc.appendChild(html_)
+
+ pdf_ = cat.createElement('pdf')
+ text = cat.createTextNode(pdf)
+ pdf_.appendChild(text)
+ doc.appendChild(pdf_)
+
+ return doc
+
+ def load(self, name):
+ '''Load the configuration INI file. Create titles, branches, and releases.'''
+ self.name = name
+ self.config = configparser.ConfigParser()
+ try:
+ self.config.read(self.name)
+ except configparser.ParsingError as ce:
+ self.ctx.fatal('config: %s' % (ce))
+ self.titles = {}
+ for t in self._get_items('titles'):
+ title = t[1]
+ if title[0] == '"':
+ title = title[1:]
+ if title[-1] == '"':
+ title = title[:-1]
+ self.titles[t[0]] = title
+ self.latestes = {}
+ for l in self._get_items('latest'):
+ self.latestes[l[0]] = l[1]
+ self.branches = self._get_items('branches')
+ self.releases = {}
+ self.releases['releases'] = self._get_items('releases')
+ for r in self.releases['releases']:
+ label = r[1]
+ self.releases[label] = {}
+ rel = self.releases[label]
+ template = self._get_item(label, 'template', False)
+ if template is None:
+ template = label
+ rel['manuals'] = self._comma_list(template, 'manuals')
+ rel['supplements'] = self._comma_list(template, 'supplements', False)
+ rel['legacy'] = self._get_item(template, 'legacy', False)
+ if rel['legacy'] is None:
+ rel['legacy'] = self._get_item(label, 'legacy', False)
+ rel['html'] = self._get_item(label, 'html')
+ rel['pdf'] = self._get_item(label, 'pdf')
+ for d in rel['manuals'] + rel['supplements']:
+ if d.lower() not in self.titles:
+ self.ctx.fatal('title not found in %s: %s' % (label, d))
+
+ def get_releases(self):
+ if self.releases is None:
+ self.ctx.fatal('no configuration loaded')
+ return sorted([r[0] for r in self.releases['releases']])
+
+ def generate_xml(self):
+ if self.releases is None:
+ self.ctx.fatal('no configuration loaded')
+ for r in self.releases['releases']:
+ name = r[0]
+ label = r[1]
+ rel = self.releases[label]
+
+ cat = xml.Document()
+
+ root = cat.createElement('rtems-docs')
+ root.setAttribute('date', today())
+ cat.appendChild(root)
+
+ heading = cat.createElement('catalogue')
+ text = cat.createTextNode(name)
+ heading.appendChild(text)
+ root.appendChild(heading)
+
+ for m in rel['manuals']:
+ html = rel['html'] + '/' + m + '.html'
+ pdf = rel['pdf'] + '/' + m + '.pdf'
+ legacy = rel['legacy']
+ doc = self._xml_create_doc(cat, m, legacy, name, html, pdf)
+ root.appendChild(doc)
+
+ catnode = self.ctx.get_cwd().make_node('%s.xml' % (name))
+ catnode.write(cat.toprettyxml(indent = ' ' * 2, newl = os.linesep))
+
+ def generate_html(self, what, indent = 5):
+ def _tag(tag):
+ for c in [' ','.',',','(','}','[',']']:
+ tag = tag.replace(c, '_')
+ return tag
+
+ def _branch_tag(branch):
+ return _tag(branch[0])
+ def _branch_script(branch):
+ path = branch[1]
+ tag = _branch_tag(branch)
+ return \
+ '<script> loadCatalogue("%s/catalogue.xml", "%s", "%s", false); </script>\n' \
+ % (path, path, tag)
+
+ def _release_tag(release):
+ return _tag(release[0])
+ def _release_script(release):
+ name = release[0]
+ tag = _release_tag(release)
+ return \
+ '<script> loadCatalogue("releases/%s.xml", "releases", "%s", false); </script>\n' \
+ % (name, tag)
+
+ def _match_all(tag):
+ return True
+ def _match_latest_release(tag):
+ return tag == _tag(self.latest('release'))
+
+ if self.releases is None:
+ self.ctx.fatal('no configuration loaded')
+
+ if what == 'branches':
+ data = self.branches
+ tagger = _branch_tag
+ scripter = _branch_script
+ matcher = _match_all
+ elif what == 'releases':
+ data = self.releases['releases']
+ tagger = _release_tag
+ scripter = _release_script
+ matcher = _match_all
+ elif what == 'latest-release':
+ data = self.releases['releases']
+ tagger = _release_tag
+ scripter = _release_script
+ matcher = _match_latest_release
+ else:
+ self.ctx.fatal('invalid html type: ' + what)
+
+ scripts = ''
+ hindent = ' ' * indent
+ html = ''
+
+ for d in data:
+ tag = tagger(d)
+ if matcher(tag):
+ html += hindent + '<div id="rtems-catalogue-%s">\n' % (tag)
+ html += hindent + ' No catalogue found.\n'
+ html += hindent + '</div>\n'
+ scripts += ' ' * 3 + scripter(d)
+
+ html = html[:-1]
+ scripts = scripts[:-1]
+ return html, scripts
+
+ def latest(self, what):
+ if what not in self.latestes:
+ self.ctx.fatal(what + 'not found in latest')
+ return self.latestes[what]