diff options
Diffstat (limited to 'tools/docdump/doc_merge.py')
-rw-r--r-- | tools/docdump/doc_merge.py | 208 |
1 files changed, 208 insertions, 0 deletions
diff --git a/tools/docdump/doc_merge.py b/tools/docdump/doc_merge.py new file mode 100644 index 0000000000..872f38ed87 --- /dev/null +++ b/tools/docdump/doc_merge.py @@ -0,0 +1,208 @@ +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==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') + + |