#!/usr/bin/env python # -*- coding: utf-8 -*- import sys import xml.etree.ElementTree as ET tree = ET.parse(sys.argv[1]) old_doc = tree.getroot() tree = ET.parse(sys.argv[2]) new_doc = tree.getroot() f = file(sys.argv[3], "wb") tab = 0 old_classes = {} def write_string(_f, text, newline=True): for t in range(tab): _f.write("\t") _f.write(text) if (newline): _f.write("\n") def escape(ret): ret = ret.replace("&", "&") ret = ret.replace("<", ">") ret = ret.replace(">", "<") ret = ret.replace("'", "'") ret = ret.replace("\"", """) return ret def inc_tab(): global tab tab += 1 def dec_tab(): global tab tab -= 1 write_string(f, '<?xml version="1.0" encoding="UTF-8" ?>') write_string(f, '<doc version="' + new_doc.attrib["version"] + '">') def get_tag(node, name): tag = "" if (name in node.attrib): tag = ' ' + name + '="' + escape(node.attrib[name]) + '" ' return tag def find_method_descr(old_class, name): methods = old_class.find("methods") if(methods != None and len(list(methods)) > 0): for m in list(methods): if (m.attrib["name"] == name): description = m.find("description") if (description != None and description.text.strip() != ""): return description.text return None def find_signal_descr(old_class, name): signals = old_class.find("signals") if(signals != None and len(list(signals)) > 0): for m in list(signals): if (m.attrib["name"] == name): description = m.find("description") if (description != None and description.text.strip() != ""): return description.text return None def find_constant_descr(old_class, name): if (old_class is None): return None constants = old_class.find("constants") if(constants != None and len(list(constants)) > 0): for m in list(constants): if (m.attrib["name"] == name): if (m.text.strip() != ""): return m.text return None def write_class(c): class_name = c.attrib["name"] print("Parsing Class: " + class_name) if (class_name in old_classes): old_class = old_classes[class_name] else: old_class = None category = get_tag(c, "category") inherits = get_tag(c, "inherits") write_string(f, '<class name="' + class_name + '" ' + category + inherits + '>') inc_tab() write_string(f, "<brief_description>") if (old_class != None): old_brief_descr = old_class.find("brief_description") if (old_brief_descr != None): write_string(f, escape(old_brief_descr.text.strip())) write_string(f, "</brief_description>") write_string(f, "<description>") if (old_class != None): old_descr = old_class.find("description") if (old_descr != None): write_string(f, escape(old_descr.text.strip())) write_string(f, "</description>") methods = c.find("methods") if(methods != None and len(list(methods)) > 0): write_string(f, "<methods>") inc_tab() for m in list(methods): qualifiers = get_tag(m, "qualifiers") write_string(f, '<method name="' + escape(m.attrib["name"]) + '" ' + qualifiers + '>') inc_tab() for a in list(m): if (a.tag == "return"): typ = get_tag(a, "type") write_string(f, '<return' + typ + '>') write_string(f, '</return>') elif (a.tag == "argument"): default = get_tag(a, "default") write_string(f, '<argument index="' + a.attrib["index"] + '" name="' + escape(a.attrib["name"]) + '" type="' + a.attrib["type"] + '"' + default + '>') write_string(f, '</argument>') write_string(f, '<description>') if (old_class != None): old_method_descr = find_method_descr(old_class, m.attrib["name"]) if (old_method_descr): write_string(f, escape(escape(old_method_descr.strip()))) write_string(f, '</description>') dec_tab() write_string(f, "</method>") dec_tab() write_string(f, "</methods>") signals = c.find("signals") if(signals != None and len(list(signals)) > 0): write_string(f, "<signals>") inc_tab() for m in list(signals): write_string(f, '<signal name="' + escape(m.attrib["name"]) + '">') inc_tab() for a in list(m): if (a.tag == "argument"): write_string(f, '<argument index="' + a.attrib["index"] + '" name="' + escape(a.attrib["name"]) + '" type="' + a.attrib["type"] + '">') write_string(f, '</argument>') write_string(f, '<description>') if (old_class != None): old_signal_descr = find_signal_descr(old_class, m.attrib["name"]) if (old_signal_descr): write_string(f, escape(old_signal_descr.strip())) write_string(f, '</description>') dec_tab() write_string(f, "</signal>") dec_tab() write_string(f, "</signals>") constants = c.find("constants") if(constants != None and len(list(constants)) > 0): write_string(f, "<constants>") inc_tab() for m in list(constants): write_string(f, '<constant name="' + escape(m.attrib["name"]) + '" value="' + m.attrib["value"] + '">') old_constant_descr = find_constant_descr(old_class, m.attrib["name"]) if (old_constant_descr): write_string(f, escape(old_constant_descr.strip())) write_string(f, "</constant>") dec_tab() write_string(f, "</constants>") dec_tab() write_string(f, "</class>") for c in list(old_doc): old_classes[c.attrib["name"]] = c for c in list(new_doc): write_class(c) write_string(f, '</doc>\n')