doc_merge.py 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208
  1. import sys
  2. import xml.etree.ElementTree as ET
  3. tree = ET.parse(sys.argv[1])
  4. old_doc=tree.getroot()
  5. tree = ET.parse(sys.argv[2])
  6. new_doc=tree.getroot()
  7. f = file(sys.argv[3],"wb")
  8. tab=0
  9. old_classes={}
  10. def write_string(_f, text,newline=True):
  11. for t in range(tab):
  12. _f.write("\t")
  13. _f.write(text)
  14. if (newline):
  15. _f.write("\n")
  16. def escape(ret):
  17. ret=ret.replace("&","&");
  18. ret=ret.replace("<","&gt;");
  19. ret=ret.replace(">","&lt;");
  20. ret=ret.replace("'","&apos;");
  21. ret=ret.replace("\"","&quot;");
  22. return ret
  23. def inc_tab():
  24. global tab
  25. tab+=1
  26. def dec_tab():
  27. global tab
  28. tab-=1
  29. write_string(f,'<?xml version="1.0" encoding="UTF-8" ?>')
  30. write_string(f,'<doc version="'+new_doc.attrib["version"]+'">')
  31. def get_tag(node,name):
  32. tag=""
  33. if (name in node.attrib):
  34. tag=' '+name+'="'+escape(node.attrib[name])+'" '
  35. return tag
  36. def find_method_descr(old_class,name):
  37. methods = old_class.find("methods")
  38. if(methods!=None and len(list(methods))>0):
  39. for m in list(methods):
  40. if (m.attrib["name"]==name):
  41. description=m.find("description")
  42. if (description!=None and description.text.strip()!=""):
  43. return description.text
  44. return None
  45. def find_signal_descr(old_class,name):
  46. signals = old_class.find("signals")
  47. if(signals!=None and len(list(signals))>0):
  48. for m in list(signals):
  49. if (m.attrib["name"]==name):
  50. description=m.find("description")
  51. if (description!=None and description.text.strip()!=""):
  52. return description.text
  53. return None
  54. def find_constant_descr(old_class,name):
  55. if (old_class==None):
  56. return None
  57. constants = old_class.find("constants")
  58. if(constants!=None and len(list(constants))>0):
  59. for m in list(constants):
  60. if (m.attrib["name"]==name):
  61. if (m.text.strip()!=""):
  62. return m.text
  63. return None
  64. def write_class(c):
  65. class_name = c.attrib["name"]
  66. print("Parsing Class: "+class_name)
  67. if (class_name in old_classes):
  68. old_class=old_classes[class_name]
  69. else:
  70. old_class=None
  71. category=get_tag(c,"category")
  72. inherits=get_tag(c,"inherits")
  73. write_string(f,'<class name="'+class_name+'" '+category+inherits+'>')
  74. inc_tab()
  75. write_string(f,"<brief_description>")
  76. if (old_class!=None):
  77. old_brief_descr=old_class.find("brief_description")
  78. if (old_brief_descr!=None):
  79. write_string(f,escape(old_brief_descr.text.strip()))
  80. write_string(f,"</brief_description>")
  81. write_string(f,"<description>")
  82. if (old_class!=None):
  83. old_descr=old_class.find("description")
  84. if (old_descr!=None):
  85. write_string(f,escape(old_descr.text.strip()))
  86. write_string(f,"</description>")
  87. methods = c.find("methods")
  88. if(methods!=None and len(list(methods))>0):
  89. write_string(f,"<methods>")
  90. inc_tab()
  91. for m in list(methods):
  92. qualifiers=get_tag(m,"qualifiers")
  93. write_string(f,'<method name="'+escape(m.attrib["name"])+'" ' +qualifiers+'>')
  94. inc_tab()
  95. for a in list(m):
  96. if (a.tag=="return"):
  97. typ=get_tag(a,"type")
  98. write_string(f,'<return'+typ+'>');
  99. write_string(f,'</return>');
  100. elif (a.tag=="argument"):
  101. default=get_tag(a,"default")
  102. write_string(f,'<argument index="'+a.attrib["index"]+'" name="'+escape(a.attrib["name"])+'" type="'+a.attrib["type"]+'"' +default+'>');
  103. write_string(f,'</argument>');
  104. write_string(f,'<description>');
  105. if (old_class!=None):
  106. old_method_descr=find_method_descr(old_class,m.attrib["name"])
  107. if (old_method_descr):
  108. write_string(f,escape(escape(old_method_descr.strip())))
  109. write_string(f,'</description>');
  110. dec_tab()
  111. write_string(f,"</method>")
  112. dec_tab()
  113. write_string(f,"</methods>")
  114. signals = c.find("signals")
  115. if(signals!=None and len(list(signals))>0):
  116. write_string(f,"<signals>")
  117. inc_tab()
  118. for m in list(signals):
  119. write_string(f,'<signal name="'+escape(m.attrib["name"])+'">')
  120. inc_tab()
  121. for a in list(m):
  122. if (a.tag=="argument"):
  123. write_string(f,'<argument index="'+a.attrib["index"]+'" name="'+escape(a.attrib["name"])+'" type="'+a.attrib["type"]+'">');
  124. write_string(f,'</argument>');
  125. write_string(f,'<description>');
  126. if (old_class!=None):
  127. old_signal_descr=find_signal_descr(old_class,m.attrib["name"])
  128. if (old_signal_descr):
  129. write_string(f,escape(old_signal_descr.strip()))
  130. write_string(f,'</description>');
  131. dec_tab()
  132. write_string(f,"</signal>")
  133. dec_tab()
  134. write_string(f,"</signals>")
  135. constants = c.find("constants")
  136. if(constants!=None and len(list(constants))>0):
  137. write_string(f,"<constants>")
  138. inc_tab()
  139. for m in list(constants):
  140. write_string(f,'<constant name="'+escape(m.attrib["name"])+'" value="'+m.attrib["value"]+'">')
  141. old_constant_descr=find_constant_descr(old_class,m.attrib["name"])
  142. if (old_constant_descr):
  143. write_string(f,escape(old_constant_descr.strip()))
  144. write_string(f,"</constant>")
  145. dec_tab()
  146. write_string(f,"</constants>")
  147. dec_tab()
  148. write_string(f,"</class>")
  149. for c in list(old_doc):
  150. old_classes[c.attrib["name"]]=c
  151. for c in list(new_doc):
  152. write_class(c)
  153. write_string(f,'</doc>\n')