1# -*- Mode: Python -*-
2# vi:si:et:sw=4:sts=4:ts=4
3
4"""
5use the output from gst-xmlinspect.py to mangle tmpl/*.sgml and
6insert/overwrite Short Description and Long Description
7"""
8
9# FIXME: right now it uses pygst and scans on its own;
10# we really should use inspect/*.xml instead since the result of
11# gst-xmlinspect.py is committed by the docs maintainer, who can be
12# expected to have pygst, but this step should be done for every docs build,
13# so no pygst allowed
14
15# read in inspect/*.xml
16# for every tmpl/element-(name).xml: mangle with details from element
17
18from __future__ import print_function, unicode_literals
19
20import glob
21import re
22import sys
23import os
24
25class Tmpl:
26    def __init__(self, filename):
27        self.filename = filename
28        self._sectionids = []
29        self._sections = {}
30
31    def read(self):
32        """
33        Read and parse the sections from the given file.
34        """
35        lines = open(self.filename).readlines()
36        matcher = re.compile("<!-- ##### SECTION (\S+) ##### -->\n")
37        id = None
38
39        for line in lines:
40            match = matcher.search(line)
41            if match:
42                id = match.expand("\\1")
43                self._sectionids.append(id)
44                self._sections[id] = []
45            else:
46                if not id:
47                    sys.stderr.write(
48                        "WARNING: line before a SECTION header: %s" % line)
49                else:
50                    self._sections[id].append(line)
51
52    def get_section(self, id):
53        """
54        Get the content from the given section.
55        """
56        return self._sections[id]
57
58    def set_section(self, id, content):
59        """
60        Replace the given section id with the given content.
61        """
62        self._sections[id] = content
63
64    def output(self):
65        """
66        Return the output of the current template in the tmpl/*.sgml format.
67        """
68        lines = []
69        for id in self._sectionids:
70            lines.append("<!-- ##### SECTION %s ##### -->\n" % id)
71            for line in self._sections[id]:
72                lines.append(line)
73
74        return "".join(lines)
75
76    def write(self, backup=False):
77        """
78        Write out the template file again, backing up the previous one.
79        """
80        if backup:
81            target = self.filename + ".mangle.bak"
82            os.rename(self.filename, target)
83
84        handle = open(self.filename, "w")
85        handle.write(self.output())
86        handle.close()
87
88import xml.dom.minidom
89
90def get_elements(file):
91    elements = {}
92    doc = xml.dom.minidom.parse(file)
93
94    elem = None
95    for e in doc.childNodes:
96        if e.nodeType == e.ELEMENT_NODE and e.localName == 'plugin':
97            elem = e
98            break
99    if elem == None:
100        return None
101
102    elem2 = None
103    for e in elem.childNodes:
104        if e.nodeType == e.ELEMENT_NODE and e.localName == 'elements':
105            elem2 = e
106            break
107    if elem2 == None:
108        return None
109
110    elem = elem2
111
112    for e in elem.childNodes:
113        if e.nodeType == e.ELEMENT_NODE and e.localName == 'element':
114            name = None
115            description = None
116
117            for e2 in e.childNodes:
118                if e2.nodeType == e2.ELEMENT_NODE and e2.localName == 'name':
119                    name = e2.childNodes[0].nodeValue.encode("UTF-8")
120                elif e2.nodeType == e2.ELEMENT_NODE and e2.localName == 'description':
121                    if e2.childNodes:
122                      description = e2.childNodes[0].nodeValue.encode("UTF-8")
123                    else:
124                      description = 'No description'
125
126            if name != None and description != None:
127                elements[name] = {'description': description}
128
129    return elements
130
131def main():
132    if not len(sys.argv) == 3:
133        sys.stderr.write('Please specify the inspect/ dir and the tmpl/ dir')
134        sys.exit(1)
135
136    inspectdir = sys.argv[1]
137    tmpldir = sys.argv[2]
138
139    # parse all .xml files; build map of element name -> short desc
140    #for file in glob.glob("inspect/plugin-*.xml"):
141    elements = {}
142    for file in glob.glob("%s/plugin-*.xml" % inspectdir):
143        elements.update(get_elements(file))
144
145    for file in glob.glob("%s/element-*.sgml" % tmpldir):
146        base = os.path.basename(file)
147        element = base[len("element-"):-len(".sgml")]
148        tmpl = Tmpl(file)
149        tmpl.read()
150        if element in elements.keys():
151            description = elements[element]['description']
152            tmpl.set_section("Short_Description", "%s\n\n" % description)
153
154        # put in an include if not yet there
155        line = '<include xmlns="http://www.w3.org/2003/XInclude" href="' + \
156            'element-' + element + '-details.xml">' + \
157            '<fallback xmlns="http://www.w3.org/2003/XInclude" />' + \
158            '</include>\n'
159        section = tmpl.get_section("Long_Description")
160        if not section[0]  == line:
161            section.insert(0, line)
162        tmpl.set_section("Long_Description", section)
163        tmpl.write()
164
165main()
166