#  -*- Mode: python; coding: utf-8; indent-tabs-mode: nil -*- */
#
#  This file is part of systemd.
#
#  Copyright 2012 Zbigniew Jędrzejewski-Szmek
#
#  systemd is free software; you can redistribute it and/or modify it
#  under the terms of the GNU Lesser General Public License as published by
#  the Free Software Foundation; either version 2.1 of the License, or
#  (at your option) any later version.
#
#  systemd is distributed in the hope that it will be useful, but
#  WITHOUT ANY WARRANTY; without even the implied warranty of
#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
#  Lesser General Public License for more details.
#
#  You should have received a copy of the GNU Lesser General Public License
#  along with systemd; If not, see .
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.
                
        
        
                System manager directives
                Directives for configuring the behaviour of the
                systemd process.
                
        
        
                UDEV directives
                Directives for configuring systemd units through the
                udev database.
                
        
        
                Journal directives
                Directives for configuring the behaviour of the
                journald process.
                
        
'''
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:]))