Skip to content
Snippets Groups Projects
post_process_documentation.py 3.55 KiB
Newer Older
  • Learn to ignore specific revisions
  • #! /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)