| 
									
										
										
										
											2012-06-25 17:59:34 +00:00
										 |  |  | #! /usr/bin/env python | 
					
						
							|  |  |  | # vin: sw=3 et: | 
					
						
							|  |  |  | '''
 | 
					
						
							|  |  |  | Copyright (C) 2012, Digium, Inc. | 
					
						
							|  |  |  | Matt Jordan <mjordan@digium.com> | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | This program is free software, distributed under the terms of | 
					
						
							|  |  |  | the GNU General Public License Version 2. | 
					
						
							|  |  |  | '''
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import sys | 
					
						
							|  |  |  | import optparse | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-12-14 10:21:25 +02:00
										 |  |  | from xml.dom.minidom import parse | 
					
						
							| 
									
										
										
										
											2012-06-25 17:59:34 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def merge_parameter_information(managerEvent): | 
					
						
							|  |  |  |     ''' Merge the parameter information across all managerEventInstances
 | 
					
						
							|  |  |  |     within a managerEvent node '''
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def __swap_parameter_documentation(one, two): | 
					
						
							|  |  |  |         # See who has the better documentation and use it | 
					
						
							| 
									
										
										
										
											2013-05-02 20:59:20 +00:00
										 |  |  |         if (one.hasChildNodes() and not two.hasChildNodes()): | 
					
						
							| 
									
										
										
										
											2012-06-25 17:59:34 +00:00
										 |  |  |             two.parentNode.replaceChild(one.cloneNode(True), two) | 
					
						
							| 
									
										
										
										
											2013-05-02 20:59:20 +00:00
										 |  |  |         elif (two.hasChildNodes() and not one.hasChildNodes()): | 
					
						
							| 
									
										
										
										
											2012-06-25 17:59:34 +00:00
										 |  |  |             one.parentNode.replaceChild(two.cloneNode(True), one) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def __merge_parameter(param, other_instances): | 
					
						
							|  |  |  |         # Compare the parameter to every other instance's set of parameters | 
					
						
							|  |  |  |         for other in other_instances: | 
					
						
							|  |  |  |             other_parameters = other.getElementsByTagName("parameter") | 
					
						
							|  |  |  |             match = [p for p in other_parameters | 
					
						
							|  |  |  |                      if p.getAttribute('name') == param.getAttribute('name')] | 
					
						
							|  |  |  |             if (match): | 
					
						
							|  |  |  |                 # See who has the better documentation and use it | 
					
						
							|  |  |  |                 __swap_parameter_documentation(param, match[0]) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     instances = managerEvent.getElementsByTagName("managerEventInstance") | 
					
						
							|  |  |  |     merged = [] | 
					
						
							|  |  |  |     for instance in instances: | 
					
						
							|  |  |  |         others = [i for i in instances if i != instance] | 
					
						
							|  |  |  |         parameters = instance.getElementsByTagName("parameter") | 
					
						
							|  |  |  |         for parameter in parameters: | 
					
						
							|  |  |  |             if parameter not in merged: | 
					
						
							|  |  |  |                 merged.append(parameter) | 
					
						
							|  |  |  |                 __merge_parameter(parameter, others) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def collapse_event_pair(managerEventOne, managerEventTwo): | 
					
						
							|  |  |  |     # Move all children of managerEventTwo to managerEventOne | 
					
						
							|  |  |  |     for node in managerEventTwo.childNodes: | 
					
						
							|  |  |  |         managerEventOne.appendChild(node.cloneNode(True)) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     return managerEventOne | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def collapse_manager_events(rootNode, managerEvents): | 
					
						
							|  |  |  |     events = {} | 
					
						
							|  |  |  |     for managerEvent in managerEvents: | 
					
						
							| 
									
										
										
										
											2014-08-07 03:04:49 +00:00
										 |  |  |         if (managerEvent.parentNode.nodeName == 'list-elements' | 
					
						
							|  |  |  |             or managerEvent.parentNode.nodeName == 'responses'): | 
					
						
							|  |  |  |             continue | 
					
						
							|  |  |  |         managerEvent.parentNode.removeChild(managerEvent) | 
					
						
							| 
									
										
										
										
											2012-06-25 17:59:34 +00:00
										 |  |  |         attr = managerEvent.getAttribute('name') | 
					
						
							|  |  |  |         if attr in events: | 
					
						
							|  |  |  |             # match, collapse the two managerEvents | 
					
						
							|  |  |  |             events[attr] = collapse_event_pair(events[attr], managerEvent) | 
					
						
							|  |  |  |         else: | 
					
						
							|  |  |  |             events[attr] = managerEvent | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     # Combine parameter information and re-add the manager Events | 
					
						
							|  |  |  |     for k, event in events.items(): | 
					
						
							|  |  |  |         merge_parameter_information(event) | 
					
						
							|  |  |  |         rootNode.appendChild(event) | 
					
						
							|  |  |  |     return | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def main(argv=None): | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if argv is None: | 
					
						
							|  |  |  |         argv = sys.argv | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     parser = optparse.OptionParser() | 
					
						
							|  |  |  |     parser.add_option('-i', '--input', dest='input_file', | 
					
						
							|  |  |  |                       default='doc/core-full-en_US.xml', | 
					
						
							|  |  |  |                       help='The XML file to process') | 
					
						
							|  |  |  |     parser.add_option('-o', '--output', dest='output_file', | 
					
						
							|  |  |  |                       default='doc/core-en_US.xml', | 
					
						
							|  |  |  |                       help='The XML file to create') | 
					
						
							|  |  |  |     (options, args) = parser.parse_args(argv) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     dom = parse(options.input_file) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     datasource = open(options.output_file, 'w') | 
					
						
							|  |  |  |     docs = dom.getElementsByTagName("docs")[0] | 
					
						
							|  |  |  |     managerEvents = dom.getElementsByTagName("managerEvent") | 
					
						
							|  |  |  |     if (managerEvents): | 
					
						
							|  |  |  |         collapse_manager_events(docs, managerEvents) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     dom.writexml(datasource) | 
					
						
							|  |  |  |     datasource.close() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     return 0 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | if __name__ == "__main__": | 
					
						
							|  |  |  |     sys.exit(main() or 0) |