summaryrefslogtreecommitdiffstats
path: root/make-directive-index.py
blob: af2d948cd1b696df8f2f635aa27bc58c2b5f80f0 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
# -*- 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>

        <refsect1>
                <title>System manager directives</title>

                <para>Directives for configuring the behaviour of the
                systemd process.</para>

                <variablelist id='systemd-directives' />
        </refsect1>

        <refsect1>
                <title>UDEV directives</title>

                <para>Directives for configuring systemd units through the
                udev database.</para>

                <variablelist id='udev-directives' />
        </refsect1>

        <refsect1>
                <title>Journal directives</title>

                <para>Directives for configuring the behaviour of the
                journald process.</para>

                <variablelist id='journal-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',
                                     'udev-directives',
                                     'systemd-directives',
                                     'journal-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:]))