]>
git.saurik.com Git - wxWidgets.git/blob - docs/doxygen/scripts/doxymlparser.py
   4 Licence: wxWindows licence 
   8 Takes the output of Doxygen XML and parses it to retrieve metadata about the classes and methods. 
  10 To create the Doxygen XML files, from the wxWidgets/docs/doxygen directory, do: 
  14 To see the results from parsing a particular class, do: 
  16 python doxymlparser.py --report out/xml/classwx_<whatever>.xml 
  28 from xml
.dom 
import minidom
 
  30 class ClassDefinition
: 
  33         self
.constructors 
= [] 
  36         self
.brief_description 
= "" 
  37         self
.detailed_description 
= "" 
  52 """ % (self
.name
, string
.join(self
.bases
, ", "), self
.includes
, self
.brief_description
, self
.detailed_description
) 
  53         str_repr 
+= "Methods:\n" 
  55         for method 
in self
.methods
: 
  56             str_repr 
+= str(method
) 
  60 class MethodDefinition
: 
  67         self
.brief_description 
= "" 
  68         self
.detailed_description 
= "" 
  81 """ % (self
.name
, self
.return_type
, self
.params
, self
.definition 
+ self
.argsstring
, self
.brief_description
, self
.detailed_description
) 
  84 def getTextValue(node
, recursive
=False): 
  86     for child 
in node
.childNodes
: 
  87         if child
.nodeType 
== child
.ELEMENT_NODE 
and child
.nodeName 
== "ref": 
  88             text 
+= getTextValue(child
) 
  89         if child
.nodeType 
== child
.TEXT_NODE
: 
  90             # Add a space to ensure we have a space between qualifiers and parameter names 
  91             text 
+= child
.nodeValue
.strip() + " " 
  95 def doxyMLToText(node
): 
  99     def __init__(self
, verbose 
= False): 
 101         self
.verbose 
= verbose
 
 103     def find_class(self
, name
): 
 104         for aclass 
in self
.classes
: 
 105             if aclass
.name 
== name
: 
 110     def get_enums_and_functions(self
, filename
, aclass
): 
 111         file_path 
= os
.path
.dirname(filename
) 
 112         enum_filename 
= os
.path
.join(file_path
, aclass
.name
[2:] + "_8h.xml") 
 113         if os
.path
.exists(enum_filename
): 
 114             root 
= minidom
.parse(enum_filename
).documentElement
 
 115             for method 
in root
.getElementsByTagName("memberdef"): 
 116                 if method
.getAttribute("kind") == "enum": 
 117                     self
.parse_enum(aclass
, method
, root
) 
 119     def is_derived_from_base(self
, aclass
, abase
): 
 120         base 
= get_first_value(aclass
.bases
) 
 121         while base 
and base 
!= "": 
 126             parentclass 
= self
.find_class(base
) 
 129                 base 
= get_first_value(parentclass
.bases
) 
 135     def parse(self
, filename
): 
 136         self
.xmldoc 
= minidom
.parse(filename
).documentElement
 
 137         for node 
in self
.xmldoc
.getElementsByTagName("compounddef"): 
 138             new_class 
= self
.parse_class(node
) 
 139             self
.classes
.append(new_class
) 
 140             self
.get_enums_and_functions(filename
, new_class
) 
 142     def parse_class(self
, class_node
): 
 143         new_class 
= ClassDefinition() 
 144         new_class
.name 
= getTextValue(class_node
.getElementsByTagName("compoundname")[0]) 
 145         for node 
in class_node
.childNodes
: 
 146             if node
.nodeName 
== "basecompoundref": 
 147                 new_class
.bases
.append(getTextValue(node
)) 
 148             elif node
.nodeName 
== "briefdescription": 
 149                 # let the post-processor determ 
 150                 new_class
.brief_description 
= node
.toxml() 
 151             elif node
.nodeName 
== "detaileddescription": 
 152                 new_class
.detailed_description 
= node
.toxml() 
 153             elif node
.nodeName 
== "includes": 
 154                 new_class
.includes
.append(getTextValue(node
)) 
 156         self
.parse_methods(new_class
, class_node
) 
 160     def parse_enum(self
, new_class
, enum
, root
): 
 164         for node 
in enum
.childNodes
: 
 165             if node
.nodeName 
== "name": 
 166                 enum_name 
= getTextValue(node
) 
 167             elif node
.nodeName 
== "enumvalue": 
 168                 enum_values
.append(getTextValue(node
.getElementsByTagName("name")[0])) 
 170         new_class
.enums
[enum_name
] = enum_values
 
 172     def parse_methods(self
, new_class
, root
): 
 173         for method 
in root
.getElementsByTagName("memberdef"):                 
 174             new_method 
= MethodDefinition() 
 175             for node 
in method
.childNodes
: 
 176                 if node
.nodeName 
== "name": 
 177                     new_method
.name 
= getTextValue(node
) 
 178                 elif node
.nodeName 
== "type": 
 179                     new_method
.return_type 
= getTextValue(node
) 
 180                 elif node
.nodeName 
== "definition": 
 181                     new_method
.definition 
= getTextValue(node
) 
 182                 elif node
.nodeName 
== "argsstring": 
 183                     new_method
.argsstring 
= getTextValue(node
) 
 184                 elif node
.nodeName 
== "param": 
 186                     for child 
in node
.childNodes
: 
 187                         if child
.nodeType 
== child
.ELEMENT_NODE
: 
 188                             param
[child
.nodeName
] = getTextValue(child
) 
 189                     new_method
.params
.append(param
) 
 192                 print "Adding %s" % (new_method
.name 
+ new_method
.argsstring
) 
 194             if new_method
.name 
== new_class
.name
: 
 195                 new_class
.constructors
.append(new_method
) 
 196             elif new_method
.name 
== "~" + new_class
.name
: 
 197                 new_class
.destructors
.append(new_method
) 
 199                 new_class
.methods
.append(new_method
) 
 201 if __name__ 
== "__main__": 
 203                 "report"        : (False, "Print out the classes and methods found by this script."), 
 204                 "verbose"       : (False, "Provide status updates and other information."), 
 207     parser 
= optparse
.OptionParser(usage
="usage: %prog [options] <doxyml files to parse>\n" + __description__
, version
="%prog 1.0") 
 209     for opt 
in option_dict
: 
 210         default 
= option_dict
[opt
][0] 
 213         if type(default
) == types
.BooleanType
: 
 214             action 
= "store_true" 
 215         parser
.add_option("--" + opt
, default
=default
, action
=action
, dest
=opt
, help=option_dict
[opt
][1]) 
 217     options
, arguments 
= parser
.parse_args() 
 219     if len(arguments
) < 1: 
 223     doxyparse 
= DoxyMLParser(verbose 
= options
.verbose
) 
 224     for arg 
in arguments
: 
 228         for aclass 
in doxyparse
.classes
: