📄 doxproc.py
字号:
target = target.parentNode elif name == 'operator=': kind = 'copy-assignment' target = target.parentNode else: kind = 'method' method = target.appendChild(self._createNode(kind, # id=memberdef.getAttribute('id'), name=name, cv=' '.join([ if_attribute(memberdef,'const','const','').strip() ]), specifiers=' '.join([ if_attribute(memberdef,'static','static',''), if_attribute(memberdef,'explicit','explicit',''), if_attribute(memberdef,'inline','inline','') ]).strip() )) ## We iterate the children to translate each part of the function. for n in memberdef.childNodes: self._translateNode(memberdef,'function',n,target=method) return method #~ Translate: #~ <memberdef kind="function"...><templateparamlist>...</templateparamlist></memberdef> def _translate_memberdef_function_templateparamlist( self, templateparamlist, target=None, **kwargs ): return self._translate_templateparamlist(templateparamlist,target=target,**kwargs) #~ Translate: #~ <memberdef kind="function"...><type>...</type></memberdef> #~ To: #~ ...<type>?</type> def _translate_memberdef_function_type( self, resultType, target=None, **kwargs ): methodType = self._createNode('type') self._translate_type(resultType,target=methodType) if methodType.hasChildNodes(): target.appendChild(methodType) return methodType #~ Translate: #~ <memberdef kind="function"...><briefdescription>...</briefdescription></memberdef> def _translate_memberdef_function_briefdescription( self, description, target=None, **kwargs ): result = self._translateDescription(description,target=target,**kwargs) ## For functions if we translate the brief docs to the purpose they end up ## right above the regular description. And since we just added the brief to that ## on the previous line, don't bother with the repetition. # result = self._translateDescription(description,target=target,tag='purpose',**kwargs) return result #~ Translate: #~ <memberdef kind="function"...><detaileddescription>...</detaileddescription></memberdef> def _translate_memberdef_function_detaileddescription( self, description, target=None, **kwargs ): return self._translateDescription(description,target=target,**kwargs) #~ Translate: #~ <memberdef kind="function"...><inbodydescription>...</inbodydescription></memberdef> def _translate_memberdef_function_inbodydescription( self, description, target=None, **kwargs ): return self._translateDescription(description,target=target,**kwargs) #~ Translate: #~ <memberdef kind="function"...><param>...</param></memberdef> def _translate_memberdef_function_param( self, param, target=None, **kwargs ): return self._translate_param(param,target=target,**kwargs) #~ Translate: #~ <memberdef kind="variable" id="?"> #~ <name>...</name> #~ <type>...</type> #~ </memberdef> #~ To: #~ <data-member id="?" name="?"> #~ <type>...</type> #~ </data-member> def _translate_memberdef_variable( self, memberdef, target=None, scope=None, **kwargs ): self._setID(memberdef.getAttribute('id'), scope+'::'+self._getChildData('name',root=memberdef)) data_member = target.appendChild(self._createNode('data-member', id=memberdef.getAttribute('id'), name=self._getChildData('name',root=memberdef))) data_member_type = data_member.appendChild(self._createNode('type')) self._translate_type(self._getChild('type',root=memberdef),target=data_member_type) #~ Translate: #~ <memberdef kind="enum" id="?"> #~ <name>...</name> #~ ... #~ </memberdef> #~ To: #~ <enum id="?" name="?"> #~ ... #~ </enum> def _translate_memberdef_enum( self, memberdef, target=None, scope=None, **kwargs ): self._setID(memberdef.getAttribute('id'), scope+'::'+self._getChildData('name',root=memberdef)) enum = target.appendChild(self._createNode('enum', id=memberdef.getAttribute('id'), name=self._getChildData('name',root=memberdef))) for n in memberdef.childNodes: self._translateNode(memberdef,'enum',n,target=enum,scope=scope,**kwargs) return enum #~ Translate: #~ <memberdef kind="enum"...> #~ <enumvalue id="?"> #~ <name>...</name> #~ <initializer>...</initializer> #~ </enumvalue> #~ </memberdef> #~ To: #~ <enumvalue id="?" name="?"> #~ <default>...</default> #~ </enumvalue> def _translate_memberdef_enum_enumvalue( self, enumvalue, target=None, scope=None, **kwargs ): self._setID(enumvalue.getAttribute('id'), scope+'::'+self._getChildData('name',root=enumvalue)) value = target.appendChild(self._createNode('enumvalue', id=enumvalue.getAttribute('id'), name=self._getChildData('name',root=enumvalue))) initializer = self._getChild('initializer',root=enumvalue) if initializer: self._translateChildren(initializer, target=target.appendChild(self._createNode('default'))) return value #~ Translate: #~ <param> #~ <type>...</type> #~ <declname>...</declname> #~ <defval>...</defval> #~ </param> #~ To: #~ <parameter name="?"> #~ <paramtype>...</paramtype> #~ ... #~ </parameter> def _translate_param( self, param, target=None, **kwargs): parameter = target.appendChild(self._createNode('parameter', name=self._getChildData('declname',root=param))) paramtype = parameter.appendChild(self._createNode('paramtype')) self._translate_type(self._getChild('type',root=param),target=paramtype) defval = self._getChild('defval',root=param) if defval: self._translateChildren(self._getChild('defval',root=param),target=parameter) return parameter #~ Translate: #~ <ref kindref="?" ...>...</ref> def _translate_ref( self, ref, **kwargs ): return self._translateNode(ref,ref.getAttribute('kindref')) #~ Translate: #~ <ref refid="?" kindref="compound">...</ref> #~ To: #~ <link linkend="?"><classname>...</classname></link> def _translate_ref_compound( self, ref, **kwargs ): result = self._createNode('link',linkend=ref.getAttribute('refid')) classname = result.appendChild(self._createNode('classname')) self._translateChildren(ref,target=classname) return result #~ Translate: #~ <ref refid="?" kindref="member">...</ref> #~ To: #~ <link linkend="?">...</link> def _translate_ref_member( self, ref, **kwargs ): result = self._createNode('link',linkend=ref.getAttribute('refid')) self._translateChildren(ref,target=result) return result #~ Translate: #~ <type>...</type> def _translate_type( self, type, target=None, **kwargs ): result = self._translateChildren(type,target=target,**kwargs) #~ Filter types to clean up various readability problems, most notably #~ with really long types. xml = target.toxml('utf-8'); if ( xml.startswith('<type>boost::mpl::') or xml.startswith('<type>BOOST_PP_') or re.match('<type>boost::(lazy_)?(enable|disable)_if',xml) ): while target.firstChild: target.removeChild(target.firstChild) target.appendChild(self._createText('emphasis','unspecified')) return result def _getChild( self, tag = None, id = None, name = None, root = None ): if not root: root = self.boostbook.documentElement for n in root.childNodes: found = True if tag and found: found = found and tag == n.nodeName if id and found: if n.hasAttribute('id'): found = found and n.getAttribute('id') == id else: found = found and n.hasAttribute('id') and n.getAttribute('id') == id if name and found: found = found and n.hasAttribute('name') and n.getAttribute('name') == name if found: #~ print '--|', n return n return None def _getChildData( self, tag, **kwargs ): return self._getData(self._getChild(tag,**kwargs),**kwargs) def _getData( self, node, **kwargs ): if node: text = self._getChild('#text',root=node) if text: return text.data.strip() return '' def _cppName( self, type ): parts = re.search('^([^<]+)[<]?(.*)[>]?$',type.strip().strip(':')) result = { 'compoundname' : parts.group(1), 'namespace' : parts.group(1).split('::')[0:-1], 'name' : parts.group(1).split('::')[-1], 'specialization' : parts.group(2) } if result['namespace'] and len(result['namespace']) > 0: namespace = '::'.join(result['namespace']) while ( len(result['namespace']) > 0 and ( not self.symbols.has_key(namespace) or self.symbols[namespace]['kind'] != 'namespace') ): result['name'] = result['namespace'].pop()+'::'+result['name'] namespace = '::'.join(result['namespace']) return result def _createNode( self, tag, **kwargs ): result = self.boostbook.createElement(tag) for k in kwargs.keys(): if kwargs[k] != '': if k == 'id': result.setAttribute('id',kwargs[k]) else: result.setAttribute(k,kwargs[k]) return result def _createText( self, tag, data, **kwargs ): result = self._createNode(tag,**kwargs) data = data.strip() if len(data) > 0: result.appendChild(self.boostbook.createTextNode(data)) return resultdef main( xmldir=None, output=None, id=None, title=None, index=False ): #~ print '--- main: xmldir = %s, output = %s' % (xmldir,output) input = glob.glob( os.path.abspath( os.path.join( xmldir, "*.xml" ) ) ) input.sort translator = Doxygen2BoostBook(id=id, title=title, index=index) #~ Feed in the namespaces first to build up the set of namespaces #~ and definitions so that lookup is unambiguous when reading in the definitions. namespace_files = filter( lambda x: os.path.basename(x).startswith('namespace'), input) decl_files = filter( lambda x: not os.path.basename(x).startswith('namespace') and not os.path.basename(x).startswith('_'), input) for dox in namespace_files: #~ print '--|',os.path.basename(dox) translator.addDox(xml.dom.minidom.parse(dox)) for dox in decl_files: #~ print '--|',os.path.basename(dox) translator.addDox(xml.dom.minidom.parse(dox)) if output: output = open(output,'w') else: output = sys.stdout if output: output.write(translator.tostring())main( **get_args() )
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -