build_tools: Skip managerEvent combining for AMI action responses
[asterisk/asterisk.git] / build_tools / post_process_documentation.py
1 #! /usr/bin/env python
2 # vin: sw=3 et:
3 '''
4 Copyright (C) 2012, Digium, Inc.
5 Matt Jordan <mjordan@digium.com>
6
7 This program is free software, distributed under the terms of
8 the GNU General Public License Version 2.
9 '''
10
11 import sys
12 import os
13 import optparse
14 import xml.dom.minidom
15
16 from xml.dom.minidom import Element, parse
17
18
19 def merge_parameter_information(managerEvent):
20     ''' Merge the parameter information across all managerEventInstances
21     within a managerEvent node '''
22
23     def __swap_parameter_documentation(one, two):
24         # See who has the better documentation and use it
25         if (one.hasChildNodes() and not two.hasChildNodes()):
26             two.parentNode.replaceChild(one.cloneNode(True), two)
27         elif (two.hasChildNodes() and not one.hasChildNodes()):
28             one.parentNode.replaceChild(two.cloneNode(True), one)
29
30     def __merge_parameter(param, other_instances):
31         # Compare the parameter to every other instance's set of parameters
32         for other in other_instances:
33             other_parameters = other.getElementsByTagName("parameter")
34             match = [p for p in other_parameters
35                      if p.getAttribute('name') == param.getAttribute('name')]
36             if (match):
37                 # See who has the better documentation and use it
38                 __swap_parameter_documentation(param, match[0])
39
40     instances = managerEvent.getElementsByTagName("managerEventInstance")
41     merged = []
42     for instance in instances:
43         others = [i for i in instances if i != instance]
44         parameters = instance.getElementsByTagName("parameter")
45         for parameter in parameters:
46             if parameter not in merged:
47                 merged.append(parameter)
48                 __merge_parameter(parameter, others)
49
50
51 def collapse_event_pair(managerEventOne, managerEventTwo):
52     # Move all children of managerEventTwo to managerEventOne
53     for node in managerEventTwo.childNodes:
54         managerEventOne.appendChild(node.cloneNode(True))
55
56     return managerEventOne
57
58
59 def collapse_manager_events(rootNode, managerEvents):
60     events = {}
61     for managerEvent in managerEvents:
62         if (managerEvent.parentNode.nodeName == 'list-elements'
63             or managerEvent.parentNode.nodeName == 'responses'):
64             continue
65         managerEvent.parentNode.removeChild(managerEvent)
66         attr = managerEvent.getAttribute('name')
67         if attr in events:
68             # match, collapse the two managerEvents
69             events[attr] = collapse_event_pair(events[attr], managerEvent)
70         else:
71             events[attr] = managerEvent
72
73     # Combine parameter information and re-add the manager Events
74     for k, event in events.items():
75         merge_parameter_information(event)
76         rootNode.appendChild(event)
77     return
78
79
80 def main(argv=None):
81
82     if argv is None:
83         argv = sys.argv
84
85     parser = optparse.OptionParser()
86     parser.add_option('-i', '--input', dest='input_file',
87                       default='doc/core-full-en_US.xml',
88                       help='The XML file to process')
89     parser.add_option('-o', '--output', dest='output_file',
90                       default='doc/core-en_US.xml',
91                       help='The XML file to create')
92     (options, args) = parser.parse_args(argv)
93
94     dom = parse(options.input_file)
95
96     datasource = open(options.output_file, 'w')
97     docs = dom.getElementsByTagName("docs")[0]
98     managerEvents = dom.getElementsByTagName("managerEvent")
99     if (managerEvents):
100         collapse_manager_events(docs, managerEvents)
101
102     dom.writexml(datasource)
103     datasource.close()
104
105     return 0
106
107 if __name__ == "__main__":
108     sys.exit(main() or 0)