📄 xmlgen.cpp
字号:
t << "</declname>" << endl; } if (defArg && !defArg->name.isEmpty() && defArg->name!=a->name) { t << " <defname>"; writeXMLString(t,defArg->name); t << "</defname>" << endl; } if (!a->array.isEmpty()) { t << " <array>"; writeXMLString(t,a->array); t << "</array>" << endl; } if (!a->defval.isEmpty()) { t << " <defval>"; linkifyText(TextGeneratorXMLImpl(t),scopeName,md->name(),a->defval); t << "</defval>" << endl; } t << " </param>" << endl; if (defArg) ++defAli; } } delete declAl; } else if (md->memberType()==MemberDef::Define && md->argsString()!=0) // define { ArgumentListIterator ali(*md->argumentList()); Argument *a; for (ali.toFirst();(a=ali.current());++ali) { t << " <param><defname>" << a->type << "</defname></param>" << endl; } } if (!md->initializer().isEmpty()) { t << " <initializer>"; linkifyText(TextGeneratorXMLImpl(t),scopeName,md->name(),md->initializer()); t << "</initializer>" << endl; } // TODO: exceptions, const volatile if (md->memberType()==MemberDef::Enumeration) // enum { if (md->enumFieldList()) { MemberListIterator emli(*md->enumFieldList()); MemberDef *emd; for (emli.toFirst();(emd=emli.current());++emli) { t << " <enumvalue>" << endl; t << " <name>"; writeXMLString(t,emd->name()); t << "</name>" << endl; if (!emd->initializer().isEmpty()) { t << " <initializer>"; writeXMLString(t,emd->initializer()); t << "</initializer>" << endl; } t << " </enumvalue>" << endl; } } } t << " <briefdescription>" << endl; writeXMLDocBlock(t,md->getDefFileName(),md->getDefLine(),scopeName,md->name(),md->briefDescription()); t << " </briefdescription>" << endl; t << " <detaileddescription>" << endl; writeXMLDocBlock(t,md->getDefFileName(),md->getDefLine(),scopeName,md->name(),md->documentation()); t << " </detaileddescription>" << endl; if (md->getDefLine()!=-1) { t << " <location file=\"" << md->getDefFileName() << "\" line=\"" << md->getDefLine() << "\"/>" << endl; } //printf("md->getReferencesMembers()=%p\n",md->getReferencesMembers()); if (md->getReferencesMembers()) { MemberSDict::Iterator mdi(*md->getReferencesMembers()); MemberDef *rmd; for (mdi.toFirst();(rmd=mdi.current());++mdi) { if (rmd->getStartBodyLine()!=-1 && rmd->getBodyDef()) { t << " <references id=\""; t << rmd->getBodyDef()->getOutputFileBase() << "_1" // encoded `:' character (see util.cpp:convertNameToFile) << rmd->anchor() << "\" line=\"" << rmd->getStartBodyLine() << "\">"; QCString scope = rmd->getScopeString(); QCString name = rmd->name(); if (!scope.isEmpty() && scope!=def->name()) { name.prepend(scope+"::"); } writeXMLString(t,name); t << "</references>" << endl; } } } if (md->getReferencedByMembers()) { MemberSDict::Iterator mdi(*md->getReferencedByMembers()); MemberDef *rmd; for (mdi.toFirst();(rmd=mdi.current());++mdi) { if (rmd->getStartBodyLine()!=-1 && rmd->getBodyDef()) { t << " <referencedby id=\""; t << rmd->getBodyDef()->getOutputFileBase() << "_1" // encoded `:' character (see util.cpp:convertNameToFile) << rmd->anchor() << "\" line=\"" << rmd->getStartBodyLine() << "\">"; QCString scope = rmd->getScopeString(); QCString name = rmd->name(); if (!scope.isEmpty() && scope!=def->name()) { name.prepend(scope+"::"); } writeXMLString(t,name); t << "</referencedby>" << endl; } } } t << " </memberdef>" << endl;}void generateXMLClassSection(ClassDef *cd,QTextStream &t,MemberList *ml,const char *kind){ if (ml->count()>0) { t << " <sectiondef kind=\"" << kind << "\">" << endl; //t << " <memberlist>" << endl; MemberListIterator mli(*ml); MemberDef *md; for (mli.toFirst();(md=mli.current());++mli) { generateXMLForMember(md,t,cd); } //t << " </memberlist>" << endl; t << " </sectiondef>" << endl; }}void generateXMLForClass(ClassDef *cd,QTextStream &t){ // + brief description // + detailed description // - template arguments // - include files // + inheritance diagram // + list of direct super classes // + list of direct sub classes // + collaboration diagram // - list of all members // + user defined member sections // + standard member sections // + detailed member documentation // - examples if (cd->isReference()) return; // skip external references. if (cd->name().find('@')!=-1) return; // skip anonymous compounds. if (cd->templateMaster()!=0) return; // skip generated template instances. t << " <compounddef id=\"" << cd->getOutputFileBase() << "\" kind=\"" << cd->compoundTypeString() << "\">" << endl; t << " <compoundname>"; writeXMLString(t,cd->name()); t << "</compoundname>" << endl; if (cd->baseClasses()->count()>0) { BaseClassListIterator bcli(*cd->baseClasses()); BaseClassDef *bcd; for (bcli.toFirst();(bcd=bcli.current());++bcli) { t << " <basecompoundref idref=\"" << bcd->classDef->getOutputFileBase() << "\" prot=\""; switch (bcd->prot) { case Public: t << "public"; break; case Protected: t << "protected"; break; case Private: t << "private"; break; } t << "\" virt=\""; switch(bcd->virt) { case Normal: t << "non-virtual"; break; case Virtual: t << "virtual"; break; case Pure: t <<"pure-virtual"; break; } t << "\"/>" << endl; } } if (cd->subClasses()->count()>0) { BaseClassListIterator bcli(*cd->subClasses()); BaseClassDef *bcd; for (bcli.toFirst();(bcd=bcli.current());++bcli) { t << " <derivedcompoundref idref=\"" << bcd->classDef->getOutputFileBase() << "\" prot=\""; switch (bcd->prot) { case Public: t << "public"; break; case Protected: t << "protected"; break; case Private: t << "private"; break; } t << "\" virt=\""; switch(bcd->virt) { case Normal: t << "non-virtual"; break; case Virtual: t << "virtual"; break; case Pure: t << "pure-virtual"; break; } t << "\"/>" << endl; } } int numMembers = cd->pubTypes.count()+cd->pubMembers.count()+cd->pubAttribs.count()+ cd->pubSlots.count()+cd->signals.count()+cd->dcopMethods.count()+ cd->pubStaticMembers.count()+ cd->pubStaticAttribs.count()+cd->proTypes.count()+cd->proMembers.count()+ cd->proAttribs.count()+cd->proSlots.count()+cd->proStaticMembers.count()+ cd->proStaticAttribs.count()+cd->priTypes.count()+cd->priMembers.count()+ cd->priAttribs.count()+cd->priSlots.count()+cd->priStaticMembers.count()+ cd->priStaticAttribs.count()+cd->friends.count()+cd->related.count(); if (numMembers>0) { //t << " <sectionlist>" << endl; generateXMLClassSection(cd,t,&cd->pubTypes,"public-type"); generateXMLClassSection(cd,t,&cd->pubMembers,"public-func"); generateXMLClassSection(cd,t,&cd->pubAttribs,"public-attrib"); generateXMLClassSection(cd,t,&cd->pubSlots,"public-slot"); generateXMLClassSection(cd,t,&cd->signals,"signal"); generateXMLClassSection(cd,t,&cd->dcopMethods,"dcop-func"); generateXMLClassSection(cd,t,&cd->properties,"property"); generateXMLClassSection(cd,t,&cd->pubStaticMembers,"public-static-func"); generateXMLClassSection(cd,t,&cd->pubStaticAttribs,"public-static-attrib"); generateXMLClassSection(cd,t,&cd->proTypes,"protected-type"); generateXMLClassSection(cd,t,&cd->proMembers,"protected-func"); generateXMLClassSection(cd,t,&cd->proAttribs,"protected-attrib"); generateXMLClassSection(cd,t,&cd->proSlots,"protected-slot"); generateXMLClassSection(cd,t,&cd->proStaticMembers,"protected-static-func"); generateXMLClassSection(cd,t,&cd->proStaticAttribs,"protected-static-attrib"); generateXMLClassSection(cd,t,&cd->priTypes,"private-type"); generateXMLClassSection(cd,t,&cd->priMembers,"private-func"); generateXMLClassSection(cd,t,&cd->priAttribs,"private-attrib"); generateXMLClassSection(cd,t,&cd->priSlots,"private-slot"); generateXMLClassSection(cd,t,&cd->priStaticMembers,"private-static-func"); generateXMLClassSection(cd,t,&cd->priStaticAttribs,"private-static-attrib"); generateXMLClassSection(cd,t,&cd->friends,"signal"); generateXMLClassSection(cd,t,&cd->related,"related"); //t << " </sectionlist>" << endl; } t << " <briefdescription>" << endl; writeXMLDocBlock(t,cd->getDefFileName(),cd->getDefLine(),cd->name(),0,cd->briefDescription()); t << " </briefdescription>" << endl; t << " <detaileddescription>" << endl; writeXMLDocBlock(t,cd->getDefFileName(),cd->getDefLine(),cd->name(),0,cd->documentation()); t << " </detaileddescription>" << endl; DotClassGraph inheritanceGraph(cd,DotClassGraph::Inheritance); if (!inheritanceGraph.isTrivial()) { t << " <inheritancegraph>" << endl; inheritanceGraph.writeXML(t); t << " </inheritancegraph>" << endl; } DotClassGraph collaborationGraph(cd,DotClassGraph::Implementation); if (!collaborationGraph.isTrivial()) { t << " <collaborationgraph>" << endl; collaborationGraph.writeXML(t); t << " </collaborationgraph>" << endl; } t << " <location file=\"" << cd->getDefFileName() << "\" line=\"" << cd->getDefLine() << "\"/>" << endl; t << " </compounddef>" << endl;}void generateXMLSection(Definition *d,QTextStream &t,MemberList *ml,const char *kind){ if (ml->count()>0) { t << " <sectiondef kind=\"" << kind << "\">" << endl; MemberListIterator mli(*ml); MemberDef *md; for (mli.toFirst();(md=mli.current());++mli) { generateXMLForMember(md,t,d); } t << " </sectiondef>" << endl; }}void generateXMLForNamespace(NamespaceDef *nd,QTextStream &t){ if (nd->isReference()) return; // skip external references t << " <compounddef id=\"" << nd->getOutputFileBase() << "\" kind=\"namespace\">" << endl; t << " <compoundname>"; writeXMLString(t,nd->name()); t << "</compoundname>" << endl; int numMembers = nd->decDefineMembers.count()+nd->decProtoMembers.count()+ nd->decTypedefMembers.count()+nd->decEnumMembers.count()+ nd->decFuncMembers.count()+nd->decVarMembers.count(); if (numMembers>0) { generateXMLSection(nd,t,&nd->decDefineMembers,"define"); generateXMLSection(nd,t,&nd->decProtoMembers,"prototype"); generateXMLSection(nd,t,&nd->decTypedefMembers,"typedef"); generateXMLSection(nd,t,&nd->decEnumMembers,"enum"); generateXMLSection(nd,t,&nd->decFuncMembers,"func"); generateXMLSection(nd,t,&nd->decVarMembers,"var"); } t << " <briefdescription>" << endl; writeXMLDocBlock(t,nd->getDefFileName(),nd->getDefLine(),0,0,nd->briefDescription()); t << " </briefdescription>" << endl; t << " <detaileddescription>" << endl; writeXMLDocBlock(t,nd->getDefFileName(),nd->getDefLine(),0,0,nd->documentation()); t << " </detaileddescription>" << endl; t << " <location file=\"" << nd->getDefFileName() << "\" line=\"" << nd->getDefLine() << "\"/>" << endl; t << " </compounddef>" << endl;}void generateXMLForFile(FileDef *fd,QTextStream &t){ if (fd->isReference()) return; // skip external references t << " <compounddef id=\"" << fd->getOutputFileBase() << "\" kind=\"file\">" << endl; t << " <compoundname>"; writeXMLString(t,fd->name()); t << "</compoundname>" << endl; int numMembers = fd->decDefineMembers.count()+fd->decProtoMembers.count()+ fd->decTypedefMembers.count()+fd->decEnumMembers.count()+ fd->decFuncMembers.count()+fd->decVarMembers.count(); if (numMembers>0) { generateXMLSection(fd,t,&fd->decDefineMembers,"define"); generateXMLSection(fd,t,&fd->decProtoMembers,"prototype"); generateXMLSection(fd,t,&fd->decTypedefMembers,"typedef"); generateXMLSection(fd,t,&fd->decEnumMembers,"enum"); generateXMLSection(fd,t,&fd->decFuncMembers,"func"); generateXMLSection(fd,t,&fd->decVarMembers,"var"); } t << " <briefdescription>" << endl; writeXMLDocBlock(t,fd->getDefFileName(),fd->getDefLine(),0,0,fd->briefDescription()); t << " </briefdescription>" << endl; t << " <detaileddescription>" << endl; writeXMLDocBlock(t,fd->getDefFileName(),fd->getDefLine(),0,0,fd->documentation()); t << " </detaileddescription>" << endl; t << " <programlisting>" << endl; writeXMLCodeBlock(t,fd); t << " </programlisting>" << endl; t << " <location file=\"" << fd->getDefFileName() << "\" line=\"" << fd->getDefLine() << "\"/>" << endl; t << " </compounddef>" << endl;}void generateXML(){ QCString outputDirectory = Config_getString("OUTPUT_DIRECTORY"); if (outputDirectory.isEmpty()) { outputDirectory=QDir::currentDirPath(); } else { QDir dir(outputDirectory); if (!dir.exists()) { dir.setPath(QDir::currentDirPath()); if (!dir.mkdir(outputDirectory)) { err("Error: tag OUTPUT_DIRECTORY: Output directory `%s' does not " "exist and cannot be created\n",outputDirectory.data()); exit(1); } else if (!Config_getBool("QUIET")) { err("Notice: Output directory `%s' does not exist. " "I have created it for you.\n", outputDirectory.data()); } dir.cd(outputDirectory); } outputDirectory=dir.absPath(); } QDir dir(outputDirectory); if (!dir.exists()) { dir.setPath(QDir::currentDirPath()); if (!dir.mkdir(outputDirectory)) { err("Cannot create directory %s\n",outputDirectory.data()); return; } } QDir xmlDir(outputDirectory+"/xml"); if (!xmlDir.exists() && !xmlDir.mkdir(outputDirectory+"/xml")) { err("Could not create xml directory in %s\n",outputDirectory.data()); return; } QCString fileName=outputDirectory+"/xml/doxygen.xml"; QFile f(fileName); if (!f.open(IO_WriteOnly)) { err("Cannot open file %s for writing!\n",fileName.data()); return; } QTextStream t(&f); t << "<?xml version='1.0' encoding='ISO-8859-1' standalone='yes'?>" << endl; //t << "<!DOCTYPE doxygen SYSTEM \"doxygen.dtd\">" << endl; t << "<doxygen>" << endl; if (Doxygen::classSDict.count()+Doxygen::inputNameList.count()>0) { //t << " <compoundlist>" << endl; ClassSDict::Iterator cli(Doxygen::classSDict); ClassDef *cd; for (cli.toFirst();(cd=cli.current());++cli) { generateXMLForClass(cd,t); } FileNameListIterator fnli(Doxygen::inputNameList); FileName *fn; for (;(fn=fnli.current());++fnli) { FileNameIterator fni(*fn); FileDef *fd; for (;(fd=fni.current());++fni) { generateXMLForFile(fd,t); } } //t << " </compoundlist>" << endl; } t << "</doxygen>" << endl;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -