diff options
author | Zbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl> | 2012-08-09 18:08:14 +0200 |
---|---|---|
committer | Zbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl> | 2012-09-17 12:42:22 +0200 |
commit | d9cfd69403d18438d7bafd172d6a0686940c2e30 (patch) | |
tree | f86629279af44b1a97d1193501420856a7867a9b /make-directive-index.py | |
parent | 98a77df5fe8591034c48e5d56d903ee268de37f9 (diff) |
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.
Diffstat (limited to 'make-directive-index.py')
-rw-r--r-- | make-directive-index.py | 101 |
1 files changed, 101 insertions, 0 deletions
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 = '''\ +<refentry id="systemd.directives"> + + <refentryinfo> + <title>systemd.directives</title> + <productname>systemd</productname> + + <authorgroup> + <author> + <contrib>Developer</contrib> + <firstname>Zbigniew</firstname> + <surname>Jędrzejewski-Szmek</surname> + <email>zbyszek@in.waw.pl</email> + </author> + </authorgroup> + </refentryinfo> + + <refmeta> + <refentrytitle>systemd.directives</refentrytitle> + <manvolnum>5</manvolnum> + </refmeta> + + <refnamediv> + <refname>systemd.directives</refname> + <refpurpose>Index of configuration directives</refpurpose> + </refnamediv> + + <refsect1> + <title>Unit directives</title> + + <para>Directives for configuring units, used in unit + files.</para> + + <variablelist id='unit-directives' /> + </refsect1> +</refentry> +''' + +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:])) |