Migrate AMI VarSet events raised by GoSub local variables
[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         rootNode.removeChild(managerEvent)
63         attr = managerEvent.getAttribute('name')
64         if attr in events:
65             # match, collapse the two managerEvents
66             events[attr] = collapse_event_pair(events[attr], managerEvent)
67         else:
68             events[attr] = managerEvent
69
70     # Combine parameter information and re-add the manager Events
71     for k, event in events.items():
72         merge_parameter_information(event)
73         rootNode.appendChild(event)
74     return
75
76
77 def main(argv=None):
78
79     if argv is None:
80         argv = sys.argv
81
82     parser = optparse.OptionParser()
83     parser.add_option('-i', '--input', dest='input_file',
84                       default='doc/core-full-en_US.xml',
85                       help='The XML file to process')
86     parser.add_option('-o', '--output', dest='output_file',
87                       default='doc/core-en_US.xml',
88                       help='The XML file to create')
89     (options, args) = parser.parse_args(argv)
90
91     dom = parse(options.input_file)
92
93     datasource = open(options.output_file, 'w')
94     docs = dom.getElementsByTagName("docs")[0]
95     managerEvents = dom.getElementsByTagName("managerEvent")
96     if (managerEvents):
97         collapse_manager_events(docs, managerEvents)
98
99     dom.writexml(datasource)
100     datasource.close()
101
102     return 0
103
104 if __name__ == "__main__":
105     sys.exit(main() or 0)