From d9cfd69403d18438d7bafd172d6a0686940c2e30 Mon Sep 17 00:00:00 2001 From: Zbigniew Jędrzejewski-Szmek Date: Thu, 9 Aug 2012 18:08:14 +0200 Subject: man: generate an index of directives Systemd has a large (and growing) number of manpages. Sometimes it's not immediately obvious, where to look for a directive. Especially, when something is described in more than one place. Making sense of all the settings should be easier with an index. --- make-directive-index.py | 101 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 101 insertions(+) create mode 100644 make-directive-index.py (limited to 'make-directive-index.py') diff --git a/make-directive-index.py b/make-directive-index.py new file mode 100644 index 000000000..0c3b67a9d --- /dev/null +++ b/make-directive-index.py @@ -0,0 +1,101 @@ +# -*- coding: utf-8 -*- +import sys +import collections +import xml.etree.ElementTree as tree + +TEMPLATE = '''\ + + + + systemd.directives + systemd + + + + Developer + Zbigniew + Jędrzejewski-Szmek + zbyszek@in.waw.pl + + + + + + systemd.directives + 5 + + + + systemd.directives + Index of configuration directives + + + + Unit directives + + Directives for configuring units, used in unit + files. + + + + +''' + +def _extract_directives(directive_groups, page): + t = tree.parse(page) + section = t.find('./refmeta/manvolnum').text + pagename = t.find('./refmeta/refentrytitle').text + for variablelist in t.iterfind('.//variablelist'): + klass = variablelist.attrib.get('class') or 'unit-directives' + stor = directive_groups[klass] + for varname in variablelist.iterfind('./varlistentry/term/varname'): + text = ''.join(varname.text.partition('=')[:2]) + stor[text].append((pagename, section)) + +def _make_section(refentry, name, directives): + varlist = refentry.find(".//*[@id='{}']".format(name)) + for varname, manpages in sorted(directives.items()): + entry = tree.SubElement(varlist, 'varlistentry') + a = tree.SubElement(tree.SubElement(entry, 'term'), 'varname') + a.text = varname + para = tree.SubElement(tree.SubElement(entry, 'listitem'), 'para') + + b = None + for manpage, manvolume in sorted(manpages): + if b is not None: + b.tail = ', ' + b = tree.SubElement(para, 'citerefentry') + c = tree.SubElement(b, 'refentrytitle') + c.text = manpage + d = tree.SubElement(b, 'manvolnum') + d.text = manvolume + entry.tail = '\n\n' + +def _make_page(directive_groups): + """Create an XML tree from directive_groups. + + directive_groups = { + 'class': {'variable': [('manpage', 'manvolume'), ...], + 'variable2': ...}, + ... + } + """ + refentry = tree.fromstring(TEMPLATE) + + for name, directives in directive_groups.items(): + _make_section(refentry, name, directives) + + return refentry + +def make_page(xml_files): + "Extract directives from xml_files and return XML index tree." + directive_groups = {name:collections.defaultdict(list) + for name in ['unit-directives', + ]} + for page in xml_files: + _extract_directives(directive_groups, page) + + return _make_page(directive_groups) + +if __name__ == '__main__': + tree.dump(make_page(sys.argv[1:])) -- cgit v1.2.3