⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 xmlgen.cpp

📁 doxygen(一个自动从源代码生成文档的工具)的源代码
💻 CPP
📖 第 1 页 / 共 3 页
字号:
          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 + -