107 lines
3.6 KiB
Python
107 lines
3.6 KiB
Python
|
#! /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
|
||
|
|
||
|
from xml.dom.minidom import parse
|
||
|
|
||
|
|
||
|
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
|
||
|
if (one.hasChildNodes() and not two.hasChildNodes()):
|
||
|
two.parentNode.replaceChild(one.cloneNode(True), two)
|
||
|
elif (two.hasChildNodes() and not one.hasChildNodes()):
|
||
|
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:
|
||
|
if (managerEvent.parentNode.nodeName == 'list-elements'
|
||
|
or managerEvent.parentNode.nodeName == 'responses'):
|
||
|
continue
|
||
|
managerEvent.parentNode.removeChild(managerEvent)
|
||
|
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)
|