diff options
Diffstat (limited to 'src/xmlgen.cpp')
-rw-r--r-- | src/xmlgen.cpp | 1032 |
1 files changed, 542 insertions, 490 deletions
diff --git a/src/xmlgen.cpp b/src/xmlgen.cpp index 70fcd70..86f3081 100644 --- a/src/xmlgen.cpp +++ b/src/xmlgen.cpp @@ -15,11 +15,7 @@ #include <stdlib.h> -#include <qdir.h> -#include <qfile.h> -#include <qtextstream.h> -#include <qintdict.h> - +#include "textstream.h" #include "xmlgen.h" #include "doxygen.h" #include "message.h" @@ -49,6 +45,8 @@ #include "section.h" #include "htmlentity.h" #include "resourcemgr.h" +#include "dir.h" +#include "utf8.h" // no debug info #define XML_DB(x) do {} while(0) @@ -59,64 +57,65 @@ //------------------ -/** Helper class mapping MemberList::ListType to a string representing */ -class XmlSectionMapper : public QIntDict<char> +static std::map<MemberListType,std::string> g_xmlSectionMap = { - public: - XmlSectionMapper() : QIntDict<char>(47) - { - insert(MemberListType_pubTypes,"public-type"); - insert(MemberListType_pubMethods,"public-func"); - insert(MemberListType_pubAttribs,"public-attrib"); - insert(MemberListType_pubSlots,"public-slot"); - insert(MemberListType_signals,"signal"); - insert(MemberListType_dcopMethods,"dcop-func"); - insert(MemberListType_properties,"property"); - insert(MemberListType_events,"event"); - insert(MemberListType_interfaces,"interfaces"); - insert(MemberListType_services,"services"); - insert(MemberListType_pubStaticMethods,"public-static-func"); - insert(MemberListType_pubStaticAttribs,"public-static-attrib"); - insert(MemberListType_proTypes,"protected-type"); - insert(MemberListType_proMethods,"protected-func"); - insert(MemberListType_proAttribs,"protected-attrib"); - insert(MemberListType_proSlots,"protected-slot"); - insert(MemberListType_proStaticMethods,"protected-static-func"); - insert(MemberListType_proStaticAttribs,"protected-static-attrib"); - insert(MemberListType_pacTypes,"package-type"); - insert(MemberListType_pacMethods,"package-func"); - insert(MemberListType_pacAttribs,"package-attrib"); - insert(MemberListType_pacStaticMethods,"package-static-func"); - insert(MemberListType_pacStaticAttribs,"package-static-attrib"); - insert(MemberListType_priTypes,"private-type"); - insert(MemberListType_priMethods,"private-func"); - insert(MemberListType_priAttribs,"private-attrib"); - insert(MemberListType_priSlots,"private-slot"); - insert(MemberListType_priStaticMethods,"private-static-func"); - insert(MemberListType_priStaticAttribs,"private-static-attrib"); - insert(MemberListType_friends,"friend"); - insert(MemberListType_related,"related"); - insert(MemberListType_decDefineMembers,"define"); - insert(MemberListType_decProtoMembers,"prototype"); - insert(MemberListType_decTypedefMembers,"typedef"); - insert(MemberListType_decSequenceMembers,"sequence"); - insert(MemberListType_decDictionaryMembers,"dictionary"); - insert(MemberListType_decEnumMembers,"enum"); - insert(MemberListType_decFuncMembers,"func"); - insert(MemberListType_decVarMembers,"var"); - } + { MemberListType_pubTypes,"public-type" }, + { MemberListType_pubMethods,"public-func" }, + { MemberListType_pubAttribs,"public-attrib" }, + { MemberListType_pubSlots,"public-slot" }, + { MemberListType_signals,"signal" }, + { MemberListType_dcopMethods,"dcop-func" }, + { MemberListType_properties,"property" }, + { MemberListType_events,"event" }, + { MemberListType_interfaces,"interfaces" }, + { MemberListType_services,"services" }, + { MemberListType_pubStaticMethods,"public-static-func" }, + { MemberListType_pubStaticAttribs,"public-static-attrib" }, + { MemberListType_proTypes,"protected-type" }, + { MemberListType_proMethods,"protected-func" }, + { MemberListType_proAttribs,"protected-attrib" }, + { MemberListType_proSlots,"protected-slot" }, + { MemberListType_proStaticMethods,"protected-static-func" }, + { MemberListType_proStaticAttribs,"protected-static-attrib" }, + { MemberListType_pacTypes,"package-type" }, + { MemberListType_pacMethods,"package-func" }, + { MemberListType_pacAttribs,"package-attrib" }, + { MemberListType_pacStaticMethods,"package-static-func" }, + { MemberListType_pacStaticAttribs,"package-static-attrib" }, + { MemberListType_priTypes,"private-type" }, + { MemberListType_priMethods,"private-func" }, + { MemberListType_priAttribs,"private-attrib" }, + { MemberListType_priSlots,"private-slot" }, + { MemberListType_priStaticMethods,"private-static-func" }, + { MemberListType_priStaticAttribs,"private-static-attrib" }, + { MemberListType_friends,"friend" }, + { MemberListType_related,"related" }, + { MemberListType_decDefineMembers,"define" }, + { MemberListType_decProtoMembers,"prototype" }, + { MemberListType_decTypedefMembers,"typedef" }, + { MemberListType_decSequenceMembers,"sequence" }, + { MemberListType_decDictionaryMembers,"dictionary" }, + { MemberListType_decEnumMembers,"enum" }, + { MemberListType_decFuncMembers,"func" }, + { MemberListType_decVarMembers,"var" }, }; -static XmlSectionMapper g_xmlSectionMapper; +static const char *xmlSectionMapper(MemberListType ml) +{ + auto it = g_xmlSectionMap.find(ml); + return it!=g_xmlSectionMap.end() ? it->second.c_str() : ""; +} -inline void writeXMLString(FTextStream &t,const char *s) +inline void writeXMLString(TextStream &t,const QCString &s) { t << convertToXML(s); } -inline void writeXMLCodeString(FTextStream &t,const char *s, int &col) +inline void writeXMLCodeString(TextStream &t,const QCString &str, int &col) { + if (str.isEmpty()) return; + const char *s = str.data(); char c; while ((c=*s++)) { @@ -143,34 +142,32 @@ inline void writeXMLCodeString(FTextStream &t,const char *s, int &col) // encode invalid XML characters (see http://www.w3.org/TR/2000/REC-xml-20001006#NT-Char) t << "<sp value=\"" << int(c) << "\"/>"; break; - default: s=writeUtf8Char(t,s-1); col++; break; + default: s=writeUTF8Char(t,s-1); col++; break; } } } -static void writeXMLHeader(FTextStream &t) +static void writeXMLHeader(TextStream &t) { - t << "<?xml version='1.0' encoding='UTF-8' standalone='no'?>" << endl;; + t << "<?xml version='1.0' encoding='UTF-8' standalone='no'?>\n";; t << "<doxygen xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" "; t << "xsi:noNamespaceSchemaLocation=\"compound.xsd\" "; t << "version=\"" << getDoxygenVersion() << "\" "; t << "xml:lang=\"" << theTranslator->trISOLang() << "\""; - t << ">" << endl; + t << ">\n"; } static void writeCombineScript() { QCString outputDirectory = Config_getString(XML_OUTPUT); QCString fileName=outputDirectory+"/combine.xslt"; - QFile f(fileName); - if (!f.open(IO_WriteOnly)) + std::ofstream t(fileName.str(),std::ofstream::out | std::ofstream::binary); + if (!t.is_open()) { - err("Cannot open file %s for writing!\n",fileName.data()); + err("Cannot open file %s for writing!\n",qPrint(fileName)); return; } - FTextStream t(&f); - //t.setEncoding(FTextStream::UnicodeUTF8); t << "<!-- XSLT script to combine the generated output into a single file. \n" @@ -191,16 +188,16 @@ static void writeCombineScript() } -void writeXMLLink(FTextStream &t,const char *extRef,const char *compoundId, - const char *anchorId,const char *text,const char *tooltip) +void writeXMLLink(TextStream &t,const QCString &extRef,const QCString &compoundId, + const QCString &anchorId,const QCString &text,const QCString &tooltip) { t << "<ref refid=\"" << compoundId; - if (anchorId) t << "_1" << anchorId; + if (!anchorId.isEmpty()) t << "_1" << anchorId; t << "\" kindref=\""; - if (anchorId) t << "member"; else t << "compound"; + if (!anchorId.isEmpty()) t << "member"; else t << "compound"; t << "\""; - if (extRef) t << " external=\"" << extRef << "\""; - if (tooltip) t << " tooltip=\"" << convertToXML(tooltip) << "\""; + if (!extRef.isEmpty()) t << " external=\"" << extRef << "\""; + if (!tooltip.isEmpty()) t << " tooltip=\"" << convertToXML(tooltip) << "\""; t << ">"; writeXMLString(t,text); t << "</ref>"; @@ -210,26 +207,26 @@ void writeXMLLink(FTextStream &t,const char *extRef,const char *compoundId, class TextGeneratorXMLImpl : public TextGeneratorIntf { public: - TextGeneratorXMLImpl(FTextStream &t): m_t(t) {} - void writeString(const char *s,bool /*keepSpaces*/) const + TextGeneratorXMLImpl(TextStream &t): m_t(t) {} + void writeString(const QCString &s,bool /*keepSpaces*/) const { writeXMLString(m_t,s); } void writeBreak(int) const {} - void writeLink(const char *extRef,const char *file, - const char *anchor,const char *text + void writeLink(const QCString &extRef,const QCString &file, + const QCString &anchor,const QCString &text ) const { - writeXMLLink(m_t,extRef,file,anchor,text,0); + writeXMLLink(m_t,extRef,file,anchor,text,QCString()); } private: - FTextStream &m_t; + TextStream &m_t; }; //------------------------------------------------------------------------------------------- /** Generator for producing XML formatted source code. */ -void XMLCodeGenerator::codify(const char *text) +void XMLCodeGenerator::codify(const QCString &text) { XML_DB(("(codify \"%s\")\n",text)); if (m_insideCodeLine && !m_insideSpecialHL && m_normalHLNeedStartTag) @@ -239,9 +236,9 @@ void XMLCodeGenerator::codify(const char *text) } writeXMLCodeString(m_t,text,m_col); } -void XMLCodeGenerator::writeCodeLink(const char *ref,const char *file, - const char *anchor,const char *name, - const char *tooltip) +void XMLCodeGenerator::writeCodeLink(const QCString &ref,const QCString &file, + const QCString &anchor,const QCString &name, + const QCString &tooltip) { XML_DB(("(writeCodeLink)\n")); if (m_insideCodeLine && !m_insideSpecialHL && m_normalHLNeedStartTag) @@ -250,10 +247,10 @@ void XMLCodeGenerator::writeCodeLink(const char *ref,const char *file, m_normalHLNeedStartTag=FALSE; } writeXMLLink(m_t,ref,file,anchor,name,tooltip); - m_col+=qstrlen(name); + m_col+=name.length(); } -void XMLCodeGenerator::writeTooltip(const char *, const DocLinkInfo &, const char *, - const char *, const SourceLinkInfo &, const SourceLinkInfo & +void XMLCodeGenerator::writeTooltip(const QCString &, const DocLinkInfo &, const QCString &, + const QCString &, const SourceLinkInfo &, const SourceLinkInfo & ) { XML_DB(("(writeToolTip)\n")); @@ -294,13 +291,13 @@ void XMLCodeGenerator::endCodeLine() m_t << "</highlight>"; m_normalHLNeedStartTag=TRUE; } - m_t << "</codeline>" << endl; // non DocBook + m_t << "</codeline>\n"; // non DocBook m_lineNumber = -1; m_refId.resize(0); m_external.resize(0); m_insideCodeLine=FALSE; } -void XMLCodeGenerator::startFontClass(const char *colorClass) +void XMLCodeGenerator::startFontClass(const QCString &colorClass) { XML_DB(("(startFontClass)\n")); if (m_insideCodeLine && !m_insideSpecialHL && !m_normalHLNeedStartTag) @@ -317,23 +314,23 @@ void XMLCodeGenerator::endFontClass() m_t << "</highlight>"; // non DocBook m_insideSpecialHL=FALSE; } -void XMLCodeGenerator::writeCodeAnchor(const char *) +void XMLCodeGenerator::writeCodeAnchor(const QCString &) { XML_DB(("(writeCodeAnchor)\n")); } -void XMLCodeGenerator::writeLineNumber(const char *extRef,const char *compId, - const char *anchorId,int l) +void XMLCodeGenerator::writeLineNumber(const QCString &extRef,const QCString &compId, + const QCString &anchorId,int l) { XML_DB(("(writeLineNumber)\n")); // we remember the information provided here to use it // at the <codeline> start tag. m_lineNumber = l; - if (compId) + if (!compId.isEmpty()) { m_refId=compId; - if (anchorId) m_refId+=(QCString)"_1"+anchorId; + if (!anchorId.isEmpty()) m_refId+=(QCString)"_1"+anchorId; m_isMemberRef = anchorId!=0; - if (extRef) m_external=extRef; + if (!extRef.isEmpty()) m_external=extRef; } } void XMLCodeGenerator::finish() @@ -341,19 +338,19 @@ void XMLCodeGenerator::finish() if (m_insideCodeLine) endCodeLine(); } -void XMLCodeGenerator::startCodeFragment(const char *) +void XMLCodeGenerator::startCodeFragment(const QCString &) { - m_t << " <programlisting>" << endl; + m_t << " <programlisting>\n"; } -void XMLCodeGenerator::endCodeFragment(const char *) +void XMLCodeGenerator::endCodeFragment(const QCString &) { - m_t << " </programlisting>" << endl; + m_t << " </programlisting>\n"; } //------------------------------------------------------------------------------------------- -static void writeTemplateArgumentList(FTextStream &t, +static void writeTemplateArgumentList(TextStream &t, const ArgumentList &al, const Definition *scope, const FileDef *fileScope, @@ -363,50 +360,55 @@ static void writeTemplateArgumentList(FTextStream &t, indentStr.fill(' ',indent); if (al.hasParameters()) { - t << indentStr << "<templateparamlist>" << endl; + t << indentStr << "<templateparamlist>\n"; for (const Argument &a : al) { - t << indentStr << " <param>" << endl; + t << indentStr << " <param>\n"; if (!a.type.isEmpty()) { t << indentStr << " <type>"; linkifyText(TextGeneratorXMLImpl(t),scope,fileScope,0,a.type); - t << "</type>" << endl; + t << "</type>\n"; } if (!a.name.isEmpty()) { - t << indentStr << " <declname>" << convertToXML(a.name) << "</declname>" << endl; - t << indentStr << " <defname>" << convertToXML(a.name) << "</defname>" << endl; + t << indentStr << " <declname>" << convertToXML(a.name) << "</declname>\n"; + t << indentStr << " <defname>" << convertToXML(a.name) << "</defname>\n"; } if (!a.defval.isEmpty()) { t << indentStr << " <defval>"; linkifyText(TextGeneratorXMLImpl(t),scope,fileScope,0,a.defval); - t << "</defval>" << endl; + t << "</defval>\n"; } if (!a.typeConstraint.isEmpty()) { t << indentStr << " <typeconstraint>"; linkifyText(TextGeneratorXMLImpl(t),scope,fileScope,0,a.typeConstraint); - t << "</typeconstraint>" << endl; + t << "</typeconstraint>\n"; } - t << indentStr << " </param>" << endl; + t << indentStr << " </param>\n"; } - t << indentStr << "</templateparamlist>" << endl; + t << indentStr << "</templateparamlist>\n"; } } -static void writeMemberTemplateLists(const MemberDef *md,FTextStream &t) +static void writeMemberTemplateLists(const MemberDef *md,TextStream &t) { writeTemplateArgumentList(t,md->templateArguments(),md->getClassDef(),md->getFileDef(),8); } -static void writeTemplateList(const ClassDef *cd,FTextStream &t) +static void writeTemplateList(const ClassDef *cd,TextStream &t) { - writeTemplateArgumentList(t,cd->templateArguments(),cd,0,4); + writeTemplateArgumentList(t,cd->templateArguments(),cd,cd->getFileDef(),4); } -static void writeXMLDocBlock(FTextStream &t, +static void writeTemplateList(const ConceptDef *cd,TextStream &t) +{ + writeTemplateArgumentList(t,cd->getTemplateParameterList(),cd,cd->getFileDef(),4); +} + +static void writeXMLDocBlock(TextStream &t, const QCString &fileName, int lineNr, const Definition *scope, @@ -417,11 +419,11 @@ static void writeXMLDocBlock(FTextStream &t, if (stext.isEmpty()) return; // convert the documentation string into an abstract syntax tree DocNode *root = validatingParseDoc(fileName,lineNr,scope,md,text,FALSE,FALSE, - 0,FALSE,FALSE,Config_getBool(MARKDOWN_SUPPORT)); + QCString(),FALSE,FALSE,Config_getBool(MARKDOWN_SUPPORT)); // create a code generator XMLCodeGenerator *xmlCodeGen = new XMLCodeGenerator(t); // create a parse tree visitor for XML - XmlDocVisitor *visitor = new XmlDocVisitor(t,*xmlCodeGen); + XmlDocVisitor *visitor = new XmlDocVisitor(t,*xmlCodeGen,scope?scope->getDefFileExtension():QCString("")); // visit all nodes root->accept(visitor); // clean up @@ -431,7 +433,7 @@ static void writeXMLDocBlock(FTextStream &t, } -void writeXMLCodeBlock(FTextStream &t,FileDef *fd) +void writeXMLCodeBlock(TextStream &t,FileDef *fd) { auto intf=Doxygen::parserManager->getCodeParser(fd->getDefFileExtension()); SrcLangExt langExt = getLanguageFromFileName(fd->getDefFileExtension()); @@ -439,11 +441,11 @@ void writeXMLCodeBlock(FTextStream &t,FileDef *fd) XMLCodeGenerator *xmlGen = new XMLCodeGenerator(t); xmlGen->startCodeFragment("DoxyCode"); intf->parseCode(*xmlGen, // codeOutIntf - 0, // scopeName + QCString(), // scopeName fileToString(fd->absFilePath(),Config_getBool(FILTER_SOURCE_FILES)), langExt, // lang FALSE, // isExampleBlock - 0, // exampleName + QCString(), // exampleName fd, // fileDef -1, // startLine -1, // endLine @@ -456,7 +458,7 @@ void writeXMLCodeBlock(FTextStream &t,FileDef *fd) delete xmlGen; } -static void writeMemberReference(FTextStream &t,const Definition *def,const MemberDef *rmd,const char *tagName) +static void writeMemberReference(TextStream &t,const Definition *def,const MemberDef *rmd,const QCString &tagName) { QCString scope = rmd->getScopeString(); QCString name = rmd->name(); @@ -475,7 +477,7 @@ static void writeMemberReference(FTextStream &t,const Definition *def,const Memb t << " endline=\"" << rmd->getEndBodyLine() << "\""; } } - t << ">" << convertToXML(name) << "</" << tagName << ">" << endl; + t << ">" << convertToXML(name) << "</" << tagName << ">\n"; } @@ -513,7 +515,7 @@ static QCString memberOutputFileBase(const MemberDef *md) } -static void generateXMLForMember(const MemberDef *md,FTextStream &ti,FTextStream &t,const Definition *def) +static void generateXMLForMember(const MemberDef *md,TextStream &ti,TextStream &t,const Definition *def) { // + declaration/definition arg lists @@ -561,7 +563,7 @@ static void generateXMLForMember(const MemberDef *md,FTextStream &ti,FTextStream ti << " <member refid=\"" << memberOutputFileBase(md) << "_1" << md->anchor() << "\" kind=\"" << memType << "\"><name>" - << convertToXML(md->name()) << "</name></member>" << endl; + << convertToXML(md->name()) << "</name></member>\n"; QCString scopeName; if (md->getClassDef()) @@ -791,44 +793,44 @@ static void generateXMLForMember(const MemberDef *md,FTextStream &ti,FTextStream t << "\""; } - t << ">" << endl; + t << ">\n"; if (md->memberType()!=MemberType_Define && md->memberType()!=MemberType_Enumeration ) { writeMemberTemplateLists(md,t); - QCString typeStr = md->typeString(); //replaceAnonymousScopes(md->typeString()); + QCString typeStr = md->typeString(); stripQualifiers(typeStr); t << " <type>"; linkifyText(TextGeneratorXMLImpl(t),def,md->getBodyDef(),md,typeStr); - t << "</type>" << endl; - t << " <definition>" << convertToXML(md->definition()) << "</definition>" << endl; - t << " <argsstring>" << convertToXML(md->argsString()) << "</argsstring>" << endl; + t << "</type>\n"; + t << " <definition>" << convertToXML(md->definition()) << "</definition>\n"; + t << " <argsstring>" << convertToXML(md->argsString()) << "</argsstring>\n"; } if (md->memberType() == MemberType_Enumeration) { t << " <type>"; linkifyText(TextGeneratorXMLImpl(t),def,md->getBodyDef(),md,md->enumBaseType()); - t << "</type>" << endl; + t << "</type>\n"; } - t << " <name>" << convertToXML(md->name()) << "</name>" << endl; + t << " <name>" << convertToXML(md->name()) << "</name>\n"; if (md->memberType() == MemberType_Property) { if (md->isReadable()) - t << " <read>" << convertToXML(md->getReadAccessor()) << "</read>" << endl; + t << " <read>" << convertToXML(md->getReadAccessor()) << "</read>\n"; if (md->isWritable()) - t << " <write>" << convertToXML(md->getWriteAccessor()) << "</write>" << endl; + t << " <write>" << convertToXML(md->getWriteAccessor()) << "</write>\n"; } - if (md->memberType()==MemberType_Variable && md->bitfieldString()) + if (md->memberType()==MemberType_Variable && !md->bitfieldString().isEmpty()) { QCString bitfield = md->bitfieldString(); if (bitfield.at(0)==':') bitfield=bitfield.mid(1); - t << " <bitfield>" << convertToXML(bitfield) << "</bitfield>" << endl; + t << " <bitfield>" << convertToXML(bitfield) << "</bitfield>\n"; } const MemberDef *rmd = md->reimplements(); @@ -836,27 +838,22 @@ static void generateXMLForMember(const MemberDef *md,FTextStream &ti,FTextStream { t << " <reimplements refid=\"" << memberOutputFileBase(rmd) << "_1" << rmd->anchor() << "\">" - << convertToXML(rmd->name()) << "</reimplements>" << endl; + << convertToXML(rmd->name()) << "</reimplements>\n"; } - MemberList *rbml = md->reimplementedBy(); - if (rbml) + for (const auto &rbmd : md->reimplementedBy()) { - MemberListIterator mli(*rbml); - for (mli.toFirst();(rmd=mli.current());++mli) - { - t << " <reimplementedby refid=\"" - << memberOutputFileBase(rmd) << "_1" << rmd->anchor() << "\">" - << convertToXML(rmd->name()) << "</reimplementedby>" << endl; - } + t << " <reimplementedby refid=\"" + << memberOutputFileBase(rbmd) << "_1" << rbmd->anchor() << "\">" + << convertToXML(rbmd->name()) << "</reimplementedby>\n"; } if (md->isFriendClass()) // for friend classes we show a link to the class as a "parameter" { - t << " <param>" << endl; + t << " <param>\n"; t << " <type>"; linkifyText(TextGeneratorXMLImpl(t),def,md->getBodyDef(),md,md->name()); - t << "</type>" << endl; - t << " </param>" << endl; + t << "</type>\n"; + t << " </param>\n"; } else if (isFunc) //function { @@ -874,136 +871,136 @@ static void generateXMLForMember(const MemberDef *md,FTextStream &ti,FTextStream defArg = &(*defIt); ++defIt; } - t << " <param>" << endl; + t << " <param>\n"; if (!a.attrib.isEmpty()) { t << " <attributes>"; writeXMLString(t,a.attrib); - t << "</attributes>" << endl; + t << "</attributes>\n"; } if (!a.type.isEmpty()) { t << " <type>"; linkifyText(TextGeneratorXMLImpl(t),def,md->getBodyDef(),md,a.type); - t << "</type>" << endl; + t << "</type>\n"; } if (!a.name.isEmpty()) { t << " <declname>"; writeXMLString(t,a.name); - t << "</declname>" << endl; + t << "</declname>\n"; } if (defArg && !defArg->name.isEmpty() && defArg->name!=a.name) { t << " <defname>"; writeXMLString(t,defArg->name); - t << "</defname>" << endl; + t << "</defname>\n"; } if (!a.array.isEmpty()) { t << " <array>"; writeXMLString(t,a.array); - t << "</array>" << endl; + t << "</array>\n"; } if (!a.defval.isEmpty()) { t << " <defval>"; linkifyText(TextGeneratorXMLImpl(t),def,md->getBodyDef(),md,a.defval); - t << "</defval>" << endl; + t << "</defval>\n"; } if (defArg && defArg->hasDocumentation()) { t << " <briefdescription>"; writeXMLDocBlock(t,md->getDefFileName(),md->getDefLine(), md->getOuterScope(),md,defArg->docs); - t << "</briefdescription>" << endl; + t << "</briefdescription>\n"; } - t << " </param>" << endl; + t << " </param>\n"; } } } else if (md->memberType()==MemberType_Define && - md->argsString()) // define + !md->argsString().isEmpty()) // define { if (md->argumentList().empty()) // special case for "foo()" to // distinguish it from "foo". { - t << " <param></param>" << endl; + t << " <param></param>\n"; } else { for (const Argument &a : md->argumentList()) { - t << " <param><defname>" << a.type << "</defname></param>" << endl; + t << " <param><defname>" << a.type << "</defname></param>\n"; } } } + if (!md->requiresClause().isEmpty()) + { + t << " <requiresclause>"; + linkifyText(TextGeneratorXMLImpl(t),md,md->getFileDef(),md,md->requiresClause()); + t << " </requiresclause>\n"; + } if (md->hasOneLineInitializer() || md->hasMultiLineInitializer()) { t << " <initializer>"; linkifyText(TextGeneratorXMLImpl(t),def,md->getBodyDef(),md,md->initializer()); - t << "</initializer>" << endl; + t << "</initializer>\n"; } - if (md->excpString()) + if (!md->excpString().isEmpty()) { t << " <exceptions>"; linkifyText(TextGeneratorXMLImpl(t),def,md->getBodyDef(),md,md->excpString()); - t << "</exceptions>" << endl; + t << "</exceptions>\n"; } if (md->memberType()==MemberType_Enumeration) // enum { - const MemberList *enumFields = md->enumFieldList(); - if (enumFields) + for (const auto &emd : md->enumFieldList()) { - MemberListIterator emli(*enumFields); - const MemberDef *emd; - for (emli.toFirst();(emd=emli.current());++emli) - { - ti << " <member refid=\"" << memberOutputFileBase(md) - << "_1" << emd->anchor() << "\" kind=\"enumvalue\"><name>" - << convertToXML(emd->name()) << "</name></member>" << endl; + ti << " <member refid=\"" << memberOutputFileBase(md) + << "_1" << emd->anchor() << "\" kind=\"enumvalue\"><name>" + << convertToXML(emd->name()) << "</name></member>\n"; - t << " <enumvalue id=\"" << memberOutputFileBase(md) << "_1" - << emd->anchor() << "\" prot=\""; - switch (emd->protection()) - { - case Public: t << "public"; break; - case Protected: t << "protected"; break; - case Private: t << "private"; break; - case Package: t << "package"; break; - } - t << "\">" << endl; - t << " <name>"; - writeXMLString(t,emd->name()); - t << "</name>" << endl; - if (!emd->initializer().isEmpty()) - { - t << " <initializer>"; - writeXMLString(t,emd->initializer()); - t << "</initializer>" << endl; - } - t << " <briefdescription>" << endl; - writeXMLDocBlock(t,emd->briefFile(),emd->briefLine(),emd->getOuterScope(),emd,emd->briefDescription()); - t << " </briefdescription>" << endl; - t << " <detaileddescription>" << endl; - writeXMLDocBlock(t,emd->docFile(),emd->docLine(),emd->getOuterScope(),emd,emd->documentation()); - t << " </detaileddescription>" << endl; - t << " </enumvalue>" << endl; + t << " <enumvalue id=\"" << memberOutputFileBase(md) << "_1" + << emd->anchor() << "\" prot=\""; + switch (emd->protection()) + { + case Public: t << "public"; break; + case Protected: t << "protected"; break; + case Private: t << "private"; break; + case Package: t << "package"; break; } + t << "\">\n"; + t << " <name>"; + writeXMLString(t,emd->name()); + t << "</name>\n"; + if (!emd->initializer().isEmpty()) + { + t << " <initializer>"; + writeXMLString(t,emd->initializer()); + t << "</initializer>\n"; + } + t << " <briefdescription>\n"; + writeXMLDocBlock(t,emd->briefFile(),emd->briefLine(),emd->getOuterScope(),emd,emd->briefDescription()); + t << " </briefdescription>\n"; + t << " <detaileddescription>\n"; + writeXMLDocBlock(t,emd->docFile(),emd->docLine(),emd->getOuterScope(),emd,emd->documentation()); + t << " </detaileddescription>\n"; + t << " </enumvalue>\n"; } } - t << " <briefdescription>" << endl; + t << " <briefdescription>\n"; writeXMLDocBlock(t,md->briefFile(),md->briefLine(),md->getOuterScope(),md,md->briefDescription()); - t << " </briefdescription>" << endl; - t << " <detaileddescription>" << endl; + t << " </briefdescription>\n"; + t << " <detaileddescription>\n"; writeXMLDocBlock(t,md->docFile(),md->docLine(),md->getOuterScope(),md,md->documentation()); - t << " </detaileddescription>" << endl; - t << " <inbodydescription>" << endl; + t << " </detaileddescription>\n"; + t << " <inbodydescription>\n"; writeXMLDocBlock(t,md->docFile(),md->inbodyLine(),md->getOuterScope(),md,md->inbodyDocumentation()); - t << " </inbodydescription>" << endl; + t << " </inbodydescription>\n"; if (md->getDefLine()!=-1) { t << " <location file=\"" @@ -1026,7 +1023,7 @@ static void generateXMLForMember(const MemberDef *md,FTextStream &ti,FTextStream << md->getDeclLine() << "\" declcolumn=\"" << md->getDeclColumn() << "\""; } - t << "/>" << endl; + t << "/>\n"; } //printf("md->getReferencesMembers()=%p\n",md->getReferencesMembers()); @@ -1041,7 +1038,7 @@ static void generateXMLForMember(const MemberDef *md,FTextStream &ti,FTextStream writeMemberReference(t,def,refmd,"referencedby"); } - t << " </memberdef>" << endl; + t << " </memberdef>\n"; } // namespace members are also inserted in the file scope, but @@ -1053,15 +1050,13 @@ static bool memberVisible(const Definition *d,const MemberDef *md) md->getNamespaceDef()==0; } -static void generateXMLSection(const Definition *d,FTextStream &ti,FTextStream &t, - const MemberList *ml,const char *kind,const char *header=0, - const char *documentation=0) +static void generateXMLSection(const Definition *d,TextStream &ti,TextStream &t, + const MemberList *ml,const QCString &kind,const QCString &header=QCString(), + const QCString &documentation=QCString()) { if (ml==0) return; - MemberListIterator mli(*ml); - const MemberDef *md; int count=0; - for (mli.toFirst();(md=mli.current());++mli) + for (const auto &md : *ml) { if (memberVisible(d,md) && (md->memberType()!=MemberType_EnumValue) && !md->isHidden()) @@ -1071,30 +1066,30 @@ static void generateXMLSection(const Definition *d,FTextStream &ti,FTextStream & } if (count==0) return; // empty list - t << " <sectiondef kind=\"" << kind << "\">" << endl; - if (header) + t << " <sectiondef kind=\"" << kind << "\">\n"; + if (!header.isEmpty()) { - t << " <header>" << convertToXML(header) << "</header>" << endl; + t << " <header>" << convertToXML(header) << "</header>\n"; } - if (documentation) + if (!documentation.isEmpty()) { t << " <description>"; writeXMLDocBlock(t,d->docFile(),d->docLine(),d,0,documentation); - t << "</description>" << endl; + t << "</description>\n"; } - for (mli.toFirst();(md=mli.current());++mli) + for (const auto &md : *ml) { if (memberVisible(d,md)) { generateXMLForMember(md,ti,t,d); } } - t << " </sectiondef>" << endl; + t << " </sectiondef>\n"; } -static void writeListOfAllMembers(const ClassDef *cd,FTextStream &t) +static void writeListOfAllMembers(const ClassDef *cd,TextStream &t) { - t << " <listofallmembers>" << endl; + t << " <listofallmembers>\n"; for (auto &mni : cd->memberNameInfoLinkedMap()) { for (auto &mi : *mni) @@ -1126,14 +1121,14 @@ static void writeListOfAllMembers(const ClassDef *cd,FTextStream &t) t << " ambiguityscope=\"" << convertToXML(mi->ambiguityResolutionScope()) << "\""; } t << "><scope>" << convertToXML(cd->name()) << "</scope><name>" << - convertToXML(md->name()) << "</name></member>" << endl; + convertToXML(md->name()) << "</name></member>\n"; } } } - t << " </listofallmembers>" << endl; + t << " </listofallmembers>\n"; } -static void writeInnerClasses(const ClassLinkedRefMap &cl,FTextStream &t) +static void writeInnerClasses(const ClassLinkedRefMap &cl,TextStream &t) { for (const auto &cd : cl) { @@ -1148,12 +1143,12 @@ static void writeInnerClasses(const ClassLinkedRefMap &cl,FTextStream &t) case Private: t << "private"; break; case Package: t << "package"; break; } - t << "\">" << convertToXML(cd->name()) << "</innerclass>" << endl; + t << "\">" << convertToXML(cd->name()) << "</innerclass>\n"; } } } -static void writeInnerNamespaces(const NamespaceLinkedRefMap &nl,FTextStream &t) +static void writeInnerNamespaces(const NamespaceLinkedRefMap &nl,TextStream &t) { for (const auto &nd : nl) { @@ -1161,26 +1156,21 @@ static void writeInnerNamespaces(const NamespaceLinkedRefMap &nl,FTextStream &t) { t << " <innernamespace refid=\"" << nd->getOutputFileBase() << "\"" << (nd->isInline() ? " inline=\"yes\"" : "") - << ">" << convertToXML(nd->name()) << "</innernamespace>" << endl; + << ">" << convertToXML(nd->name()) << "</innernamespace>\n"; } } } -static void writeInnerFiles(const FileList *fl,FTextStream &t) +static void writeInnerFiles(const FileList &fl,TextStream &t) { - if (fl) + for (const auto &fd : fl) { - QListIterator<FileDef> fli(*fl); - FileDef *fd; - for (fli.toFirst();(fd=fli.current());++fli) - { - t << " <innerfile refid=\"" << fd->getOutputFileBase() - << "\">" << convertToXML(fd->name()) << "</innerfile>" << endl; - } + t << " <innerfile refid=\"" << fd->getOutputFileBase() + << "\">" << convertToXML(fd->name()) << "</innerfile>\n"; } } -static void writeInnerPages(const PageLinkedRefMap &pl,FTextStream &t) +static void writeInnerPages(const PageLinkedRefMap &pl,TextStream &t) { for (const auto &pd : pl) { @@ -1189,33 +1179,53 @@ static void writeInnerPages(const PageLinkedRefMap &pl,FTextStream &t) { t << "_" << pd->name(); } - t << "\">" << convertToXML(pd->title()) << "</innerpage>" << endl; + t << "\">" << convertToXML(pd->title()) << "</innerpage>\n"; } } -static void writeInnerGroups(const GroupList &gl,FTextStream &t) +static void writeInnerGroups(const GroupList &gl,TextStream &t) { for (const auto &sgd : gl) { t << " <innergroup refid=\"" << sgd->getOutputFileBase() << "\">" << convertToXML(sgd->groupTitle()) - << "</innergroup>" << endl; + << "</innergroup>\n"; } } -static void writeInnerDirs(const DirList *dl,FTextStream &t) +static void writeInnerDirs(const DirList *dl,TextStream &t) { if (dl) { for(const auto subdir : *dl) { t << " <innerdir refid=\"" << subdir->getOutputFileBase() - << "\">" << convertToXML(subdir->displayName()) << "</innerdir>" << endl; + << "\">" << convertToXML(subdir->displayName()) << "</innerdir>\n"; + } + } +} + +static void writeIncludeInfo(const IncludeInfo *ii,TextStream &t) +{ + if (ii) + { + QCString nm = ii->includeName; + if (nm.isEmpty() && ii->fileDef) nm = ii->fileDef->docName(); + if (!nm.isEmpty()) + { + t << " <includes"; + if (ii->fileDef && !ii->fileDef->isReference()) // TODO: support external references + { + t << " refid=\"" << ii->fileDef->getOutputFileBase() << "\""; + } + t << " local=\"" << (ii->local ? "yes" : "no") << "\">"; + t << nm; + t << "</includes>\n"; } } } -static void generateXMLForClass(const ClassDef *cd,FTextStream &ti) +static void generateXMLForClass(const ClassDef *cd,TextStream &ti) { // + brief description // + detailed description @@ -1239,22 +1249,21 @@ static void generateXMLForClass(const ClassDef *cd,FTextStream &ti) if (cd->templateMaster()!=0) return; // skip generated template instances. if (cd->isArtificial()) return; // skip artificially created classes - msg("Generating XML output for class %s\n",cd->name().data()); + msg("Generating XML output for class %s\n",qPrint(cd->name())); ti << " <compound refid=\"" << classOutputFileBase(cd) << "\" kind=\"" << cd->compoundTypeString() - << "\"><name>" << convertToXML(cd->name()) << "</name>" << endl; + << "\"><name>" << convertToXML(cd->name()) << "</name>\n"; QCString outputDirectory = Config_getString(XML_OUTPUT); QCString fileName=outputDirectory+"/"+ classOutputFileBase(cd)+".xml"; - QFile f(fileName); - if (!f.open(IO_WriteOnly)) + std::ofstream f(fileName.str(),std::ofstream::out | std::ofstream::binary); + if (!f.is_open()) { - err("Cannot open file %s for writing!\n",fileName.data()); + err("Cannot open file %s for writing!\n",qPrint(fileName)); return; } - FTextStream t(&f); - //t.setEncoding(FTextStream::UnicodeUTF8); + TextStream t(&f); writeXMLHeader(t); t << " <compounddef id=\"" @@ -1271,10 +1280,10 @@ static void generateXMLForClass(const ClassDef *cd,FTextStream &ti) if (cd->isFinal()) t << "\" final=\"yes"; if (cd->isSealed()) t << "\" sealed=\"yes"; if (cd->isAbstract()) t << "\" abstract=\"yes"; - t << "\">" << endl; + t << "\">\n"; t << " <compoundname>"; writeXMLString(t,cd->name()); - t << "</compoundname>" << endl; + t << "</compoundname>\n"; for (const auto &bcd : cd->baseClasses()) { t << " <basecompoundref "; @@ -1309,7 +1318,7 @@ static void generateXMLForClass(const ClassDef *cd,FTextStream &ti) { t << convertToXML(bcd.classDef->displayName()); } - t << "</basecompoundref>" << endl; + t << "</basecompoundref>\n"; } for (const auto &bcd : cd->subClasses()) { @@ -1331,33 +1340,17 @@ static void generateXMLForClass(const ClassDef *cd,FTextStream &ti) case Pure: t << "pure-virtual"; break; } t << "\">" << convertToXML(bcd.classDef->displayName()) - << "</derivedcompoundref>" << endl; + << "</derivedcompoundref>\n"; } - IncludeInfo *ii=cd->includeInfo(); - if (ii) - { - QCString nm = ii->includeName; - if (nm.isEmpty() && ii->fileDef) nm = ii->fileDef->docName(); - if (!nm.isEmpty()) - { - t << " <includes"; - if (ii->fileDef && !ii->fileDef->isReference()) // TODO: support external references - { - t << " refid=\"" << ii->fileDef->getOutputFileBase() << "\""; - } - t << " local=\"" << (ii->local ? "yes" : "no") << "\">"; - t << nm; - t << "</includes>" << endl; - } - } + writeIncludeInfo(cd->includeInfo(),t); writeInnerClasses(cd->getClasses(),t); writeTemplateList(cd,t); for (const auto &mg : cd->getMemberGroups()) { - generateXMLSection(cd,ti,t,mg->members(),"user-defined",mg->header(), + generateXMLSection(cd,ti,t,&mg->members(),"user-defined",mg->header(), mg->documentation()); } @@ -1365,29 +1358,36 @@ static void generateXMLForClass(const ClassDef *cd,FTextStream &ti) { if ((ml->listType()&MemberListType_detailedLists)==0) { - generateXMLSection(cd,ti,t,ml.get(),g_xmlSectionMapper.find(ml->listType())); + generateXMLSection(cd,ti,t,ml.get(),xmlSectionMapper(ml->listType())); } } - t << " <briefdescription>" << endl; + if (!cd->requiresClause().isEmpty()) + { + t << " <requiresclause>"; + linkifyText(TextGeneratorXMLImpl(t),cd,cd->getFileDef(),0,cd->requiresClause()); + t << " </requiresclause>\n"; + } + + t << " <briefdescription>\n"; writeXMLDocBlock(t,cd->briefFile(),cd->briefLine(),cd,0,cd->briefDescription()); - t << " </briefdescription>" << endl; - t << " <detaileddescription>" << endl; + t << " </briefdescription>\n"; + t << " <detaileddescription>\n"; writeXMLDocBlock(t,cd->docFile(),cd->docLine(),cd,0,cd->documentation()); - t << " </detaileddescription>" << endl; + t << " </detaileddescription>\n"; DotClassGraph inheritanceGraph(cd,Inheritance); if (!inheritanceGraph.isTrivial()) { - t << " <inheritancegraph>" << endl; + t << " <inheritancegraph>\n"; inheritanceGraph.writeXML(t); - t << " </inheritancegraph>" << endl; + t << " </inheritancegraph>\n"; } DotClassGraph collaborationGraph(cd,Collaboration); if (!collaborationGraph.isTrivial()) { - t << " <collaborationgraph>" << endl; + t << " <collaborationgraph>\n"; collaborationGraph.writeXML(t); - t << " </collaborationgraph>" << endl; + t << " </collaborationgraph>\n"; } t << " <location file=\"" << convertToXML(stripFromPath(cd->getDefFileName())) << "\" line=\"" @@ -1403,15 +1403,59 @@ static void generateXMLForClass(const ClassDef *cd,FTextStream &ti) t << " bodystart=\"" << cd->getStartBodyLine() << "\" bodyend=\"" << cd->getEndBodyLine() << "\""; } - t << "/>" << endl; + t << "/>\n"; writeListOfAllMembers(cd,t); - t << " </compounddef>" << endl; - t << "</doxygen>" << endl; + t << " </compounddef>\n"; + t << "</doxygen>\n"; - ti << " </compound>" << endl; + ti << " </compound>\n"; } -static void generateXMLForNamespace(const NamespaceDef *nd,FTextStream &ti) +static void generateXMLForConcept(const ConceptDef *cd,TextStream &ti) +{ + if (cd->isReference() || cd->isHidden()) return; // skip external references. + + ti << " <compound refid=\"" << cd->getOutputFileBase() + << "\" kind=\"concept\"" << "><name>" + << convertToXML(cd->name()) << "</name>\n"; + + QCString outputDirectory = Config_getString(XML_OUTPUT); + QCString fileName=outputDirectory+"/"+cd->getOutputFileBase()+".xml"; + std::ofstream f(fileName.str(),std::ofstream::out | std::ofstream::binary); + if (!f.is_open()) + { + err("Cannot open file %s for writing!\n",qPrint(fileName)); + return; + } + TextStream t(&f); + writeXMLHeader(t); + t << " <compounddef id=\"" << cd->getOutputFileBase() + << "\" kind=\"concept\">\n"; + t << " <compoundname>"; + writeXMLString(t,cd->name()); + t << "</compoundname>\n"; + writeIncludeInfo(cd->includeInfo(),t); + writeTemplateList(cd,t); + t << " <initializer>"; + linkifyText(TextGeneratorXMLImpl(t),cd,cd->getFileDef(),0,cd->initializer()); + t << " </initializer>\n"; + t << " <briefdescription>\n"; + writeXMLDocBlock(t,cd->briefFile(),cd->briefLine(),cd,0,cd->briefDescription()); + t << " </briefdescription>\n"; + t << " <detaileddescription>\n"; + writeXMLDocBlock(t,cd->docFile(),cd->docLine(),cd,0,cd->documentation()); + t << " </detaileddescription>\n"; + t << " <location file=\"" + << convertToXML(stripFromPath(cd->getDefFileName())) << "\" line=\"" + << cd->getDefLine() << "\"" << " column=\"" + << cd->getDefColumn() << "\"/>\n" ; + t << " </compounddef>\n"; + t << "</doxygen>\n"; + + ti << " </compound>\n"; +} + +static void generateXMLForNamespace(const NamespaceDef *nd,TextStream &ti) { // + contained class definitions // + contained namespace definitions @@ -1426,35 +1470,34 @@ static void generateXMLForNamespace(const NamespaceDef *nd,FTextStream &ti) ti << " <compound refid=\"" << nd->getOutputFileBase() << "\" kind=\"namespace\"" << "><name>" - << convertToXML(nd->name()) << "</name>" << endl; + << convertToXML(nd->name()) << "</name>\n"; QCString outputDirectory = Config_getString(XML_OUTPUT); QCString fileName=outputDirectory+"/"+nd->getOutputFileBase()+".xml"; - QFile f(fileName); - if (!f.open(IO_WriteOnly)) + std::ofstream f(fileName.str(),std::ofstream::out | std::ofstream::binary); + if (!f.is_open()) { - err("Cannot open file %s for writing!\n",fileName.data()); + err("Cannot open file %s for writing!\n",qPrint(fileName)); return; } - FTextStream t(&f); - //t.setEncoding(FTextStream::UnicodeUTF8); + TextStream t(&f); writeXMLHeader(t); t << " <compounddef id=\"" << nd->getOutputFileBase() << "\" kind=\"namespace\" " << (nd->isInline()?"inline=\"yes\" ":"") << "language=\"" - << langToString(nd->getLanguage()) << "\">" << endl; + << langToString(nd->getLanguage()) << "\">\n"; t << " <compoundname>"; writeXMLString(t,nd->name()); - t << "</compoundname>" << endl; + t << "</compoundname>\n"; writeInnerClasses(nd->getClasses(),t); writeInnerNamespaces(nd->getNamespaces(),t); for (const auto &mg : nd->getMemberGroups()) { - generateXMLSection(nd,ti,t,mg->members(),"user-defined",mg->header(), + generateXMLSection(nd,ti,t,&mg->members(),"user-defined",mg->header(), mg->documentation()); } @@ -1462,27 +1505,27 @@ static void generateXMLForNamespace(const NamespaceDef *nd,FTextStream &ti) { if ((ml->listType()&MemberListType_declarationLists)!=0) { - generateXMLSection(nd,ti,t,ml.get(),g_xmlSectionMapper.find(ml->listType())); + generateXMLSection(nd,ti,t,ml.get(),xmlSectionMapper(ml->listType())); } } - t << " <briefdescription>" << endl; + t << " <briefdescription>\n"; writeXMLDocBlock(t,nd->briefFile(),nd->briefLine(),nd,0,nd->briefDescription()); - t << " </briefdescription>" << endl; - t << " <detaileddescription>" << endl; + t << " </briefdescription>\n"; + t << " <detaileddescription>\n"; writeXMLDocBlock(t,nd->docFile(),nd->docLine(),nd,0,nd->documentation()); - t << " </detaileddescription>" << endl; + t << " </detaileddescription>\n"; t << " <location file=\"" << convertToXML(stripFromPath(nd->getDefFileName())) << "\" line=\"" << nd->getDefLine() << "\"" << " column=\"" - << nd->getDefColumn() << "\"/>" << endl ; - t << " </compounddef>" << endl; - t << "</doxygen>" << endl; + << nd->getDefColumn() << "\"/>\n" ; + t << " </compounddef>\n"; + t << "</doxygen>\n"; - ti << " </compound>" << endl; + ti << " </compound>\n"; } -static void generateXMLForFile(FileDef *fd,FTextStream &ti) +static void generateXMLForFile(FileDef *fd,TextStream &ti) { // + includes files // + includedby files @@ -1502,75 +1545,64 @@ static void generateXMLForFile(FileDef *fd,FTextStream &ti) ti << " <compound refid=\"" << fd->getOutputFileBase() << "\" kind=\"file\"><name>" << convertToXML(fd->name()) - << "</name>" << endl; + << "</name>\n"; QCString outputDirectory = Config_getString(XML_OUTPUT); QCString fileName=outputDirectory+"/"+fd->getOutputFileBase()+".xml"; - QFile f(fileName); - if (!f.open(IO_WriteOnly)) + std::ofstream f(fileName.str(),std::ofstream::out | std::ofstream::binary); + if (!f.is_open()) { - err("Cannot open file %s for writing!\n",fileName.data()); + err("Cannot open file %s for writing!\n",qPrint(fileName)); return; } - FTextStream t(&f); - //t.setEncoding(FTextStream::UnicodeUTF8); + TextStream t(&f); writeXMLHeader(t); t << " <compounddef id=\"" << fd->getOutputFileBase() << "\" kind=\"file\" language=\"" - << langToString(fd->getLanguage()) << "\">" << endl; + << langToString(fd->getLanguage()) << "\">\n"; t << " <compoundname>"; writeXMLString(t,fd->name()); - t << "</compoundname>" << endl; - - IncludeInfo *inc; + t << "</compoundname>\n"; - if (fd->includeFileList()) + for (const auto &inc : fd->includeFileList()) { - QListIterator<IncludeInfo> ili1(*fd->includeFileList()); - for (ili1.toFirst();(inc=ili1.current());++ili1) + t << " <includes"; + if (inc.fileDef && !inc.fileDef->isReference()) // TODO: support external references { - t << " <includes"; - if (inc->fileDef && !inc->fileDef->isReference()) // TODO: support external references - { - t << " refid=\"" << inc->fileDef->getOutputFileBase() << "\""; - } - t << " local=\"" << (inc->local ? "yes" : "no") << "\">"; - t << inc->includeName; - t << "</includes>" << endl; + t << " refid=\"" << inc.fileDef->getOutputFileBase() << "\""; } + t << " local=\"" << (inc.local ? "yes" : "no") << "\">"; + t << inc.includeName; + t << "</includes>\n"; } - if (fd->includedByFileList()) + for (const auto &inc : fd->includedByFileList()) { - QListIterator<IncludeInfo> ili2(*fd->includedByFileList()); - for (ili2.toFirst();(inc=ili2.current());++ili2) + t << " <includedby"; + if (inc.fileDef && !inc.fileDef->isReference()) // TODO: support external references { - t << " <includedby"; - if (inc->fileDef && !inc->fileDef->isReference()) // TODO: support external references - { - t << " refid=\"" << inc->fileDef->getOutputFileBase() << "\""; - } - t << " local=\"" << (inc->local ? "yes" : "no") << "\">"; - t << inc->includeName; - t << "</includedby>" << endl; + t << " refid=\"" << inc.fileDef->getOutputFileBase() << "\""; } + t << " local=\"" << (inc.local ? "yes" : "no") << "\">"; + t << inc.includeName; + t << "</includedby>\n"; } DotInclDepGraph incDepGraph(fd,FALSE); if (!incDepGraph.isTrivial()) { - t << " <incdepgraph>" << endl; + t << " <incdepgraph>\n"; incDepGraph.writeXML(t); - t << " </incdepgraph>" << endl; + t << " </incdepgraph>\n"; } DotInclDepGraph invIncDepGraph(fd,TRUE); if (!invIncDepGraph.isTrivial()) { - t << " <invincdepgraph>" << endl; + t << " <invincdepgraph>\n"; invIncDepGraph.writeXML(t); - t << " </invincdepgraph>" << endl; + t << " </invincdepgraph>\n"; } writeInnerClasses(fd->getClasses(),t); @@ -1578,7 +1610,7 @@ static void generateXMLForFile(FileDef *fd,FTextStream &ti) for (const auto &mg : fd->getMemberGroups()) { - generateXMLSection(fd,ti,t,mg->members(),"user-defined",mg->header(), + generateXMLSection(fd,ti,t,&mg->members(),"user-defined",mg->header(), mg->documentation()); } @@ -1586,28 +1618,28 @@ static void generateXMLForFile(FileDef *fd,FTextStream &ti) { if ((ml->listType()&MemberListType_declarationLists)!=0) { - generateXMLSection(fd,ti,t,ml.get(),g_xmlSectionMapper.find(ml->listType())); + generateXMLSection(fd,ti,t,ml.get(),xmlSectionMapper(ml->listType())); } } - t << " <briefdescription>" << endl; + t << " <briefdescription>\n"; writeXMLDocBlock(t,fd->briefFile(),fd->briefLine(),fd,0,fd->briefDescription()); - t << " </briefdescription>" << endl; - t << " <detaileddescription>" << endl; + t << " </briefdescription>\n"; + t << " <detaileddescription>\n"; writeXMLDocBlock(t,fd->docFile(),fd->docLine(),fd,0,fd->documentation()); - t << " </detaileddescription>" << endl; + t << " </detaileddescription>\n"; if (Config_getBool(XML_PROGRAMLISTING)) { writeXMLCodeBlock(t,fd); } - t << " <location file=\"" << convertToXML(stripFromPath(fd->getDefFileName())) << "\"/>" << endl; - t << " </compounddef>" << endl; - t << "</doxygen>" << endl; + t << " <location file=\"" << convertToXML(stripFromPath(fd->getDefFileName())) << "\"/>\n"; + t << " </compounddef>\n"; + t << "</doxygen>\n"; - ti << " </compound>" << endl; + ti << " </compound>\n"; } -static void generateXMLForGroup(const GroupDef *gd,FTextStream &ti) +static void generateXMLForGroup(const GroupDef *gd,TextStream &ti) { // + members // + member groups @@ -1624,24 +1656,23 @@ static void generateXMLForGroup(const GroupDef *gd,FTextStream &ti) if (gd->isReference()) return; // skip external references ti << " <compound refid=\"" << gd->getOutputFileBase() - << "\" kind=\"group\"><name>" << convertToXML(gd->name()) << "</name>" << endl; + << "\" kind=\"group\"><name>" << convertToXML(gd->name()) << "</name>\n"; QCString outputDirectory = Config_getString(XML_OUTPUT); QCString fileName=outputDirectory+"/"+gd->getOutputFileBase()+".xml"; - QFile f(fileName); - if (!f.open(IO_WriteOnly)) + std::ofstream f(fileName.str(),std::ofstream::out | std::ofstream::binary); + if (!f.is_open()) { - err("Cannot open file %s for writing!\n",fileName.data()); + err("Cannot open file %s for writing!\n",qPrint(fileName)); return; } + TextStream t(&f); - FTextStream t(&f); - //t.setEncoding(FTextStream::UnicodeUTF8); writeXMLHeader(t); t << " <compounddef id=\"" - << gd->getOutputFileBase() << "\" kind=\"group\">" << endl; - t << " <compoundname>" << convertToXML(gd->name()) << "</compoundname>" << endl; - t << " <title>" << convertToXML(gd->groupTitle()) << "</title>" << endl; + << gd->getOutputFileBase() << "\" kind=\"group\">\n"; + t << " <compoundname>" << convertToXML(gd->name()) << "</compoundname>\n"; + t << " <title>" << convertToXML(gd->groupTitle()) << "</title>\n"; writeInnerFiles(gd->getFiles(),t); writeInnerClasses(gd->getClasses(),t); @@ -1651,7 +1682,7 @@ static void generateXMLForGroup(const GroupDef *gd,FTextStream &ti) for (const auto &mg : gd->getMemberGroups()) { - generateXMLSection(gd,ti,t,mg->members(),"user-defined",mg->header(), + generateXMLSection(gd,ti,t,&mg->members(),"user-defined",mg->header(), mg->documentation()); } @@ -1659,62 +1690,61 @@ static void generateXMLForGroup(const GroupDef *gd,FTextStream &ti) { if ((ml->listType()&MemberListType_declarationLists)!=0) { - generateXMLSection(gd,ti,t,ml.get(),g_xmlSectionMapper.find(ml->listType())); + generateXMLSection(gd,ti,t,ml.get(),xmlSectionMapper(ml->listType())); } } - t << " <briefdescription>" << endl; + t << " <briefdescription>\n"; writeXMLDocBlock(t,gd->briefFile(),gd->briefLine(),gd,0,gd->briefDescription()); - t << " </briefdescription>" << endl; - t << " <detaileddescription>" << endl; + t << " </briefdescription>\n"; + t << " <detaileddescription>\n"; writeXMLDocBlock(t,gd->docFile(),gd->docLine(),gd,0,gd->documentation()); - t << " </detaileddescription>" << endl; - t << " </compounddef>" << endl; - t << "</doxygen>" << endl; + t << " </detaileddescription>\n"; + t << " </compounddef>\n"; + t << "</doxygen>\n"; - ti << " </compound>" << endl; + ti << " </compound>\n"; } -static void generateXMLForDir(DirDef *dd,FTextStream &ti) +static void generateXMLForDir(DirDef *dd,TextStream &ti) { if (dd->isReference()) return; // skip external references ti << " <compound refid=\"" << dd->getOutputFileBase() << "\" kind=\"dir\"><name>" << convertToXML(dd->displayName()) - << "</name>" << endl; + << "</name>\n"; QCString outputDirectory = Config_getString(XML_OUTPUT); QCString fileName=outputDirectory+"/"+dd->getOutputFileBase()+".xml"; - QFile f(fileName); - if (!f.open(IO_WriteOnly)) + std::ofstream f(fileName.str(),std::ofstream::out | std::ofstream::binary); + if (!f.is_open()) { - err("Cannot open file %s for writing!\n",fileName.data()); + err("Cannot open file %s for writing!\n",qPrint(fileName)); return; } + TextStream t(&f); - FTextStream t(&f); - //t.setEncoding(FTextStream::UnicodeUTF8); writeXMLHeader(t); t << " <compounddef id=\"" - << dd->getOutputFileBase() << "\" kind=\"dir\">" << endl; - t << " <compoundname>" << convertToXML(dd->displayName()) << "</compoundname>" << endl; + << dd->getOutputFileBase() << "\" kind=\"dir\">\n"; + t << " <compoundname>" << convertToXML(dd->displayName()) << "</compoundname>\n"; writeInnerDirs(&dd->subDirs(),t); writeInnerFiles(dd->getFiles(),t); - t << " <briefdescription>" << endl; + t << " <briefdescription>\n"; writeXMLDocBlock(t,dd->briefFile(),dd->briefLine(),dd,0,dd->briefDescription()); - t << " </briefdescription>" << endl; - t << " <detaileddescription>" << endl; + t << " </briefdescription>\n"; + t << " <detaileddescription>\n"; writeXMLDocBlock(t,dd->docFile(),dd->docLine(),dd,0,dd->documentation()); - t << " </detaileddescription>" << endl; - t << " <location file=\"" << convertToXML(stripFromPath(dd->name())) << "\"/>" << endl; - t << " </compounddef>" << endl; - t << "</doxygen>" << endl; + t << " </detaileddescription>\n"; + t << " <location file=\"" << convertToXML(stripFromPath(dd->name())) << "\"/>\n"; + t << " </compounddef>\n"; + t << "</doxygen>\n"; - ti << " </compound>" << endl; + ti << " </compound>\n"; } -static void generateXMLForPage(PageDef *pd,FTextStream &ti,bool isExample) +static void generateXMLForPage(PageDef *pd,TextStream &ti,bool isExample) { // + name // + title @@ -1734,53 +1764,52 @@ static void generateXMLForPage(PageDef *pd,FTextStream &ti,bool isExample) ti << " <compound refid=\"" << pageName << "\" kind=\"" << kindName << "\"><name>" << convertToXML(pd->name()) - << "</name>" << endl; + << "</name>\n"; QCString outputDirectory = Config_getString(XML_OUTPUT); QCString fileName=outputDirectory+"/"+pageName+".xml"; - QFile f(fileName); - if (!f.open(IO_WriteOnly)) + std::ofstream f(fileName.str(),std::ofstream::out | std::ofstream::binary); + if (!f.is_open()) { - err("Cannot open file %s for writing!\n",fileName.data()); + err("Cannot open file %s for writing!\n",qPrint(fileName)); return; } + TextStream t(&f); - FTextStream t(&f); - //t.setEncoding(FTextStream::UnicodeUTF8); writeXMLHeader(t); t << " <compounddef id=\"" << pageName; - t << "\" kind=\"" << kindName << "\">" << endl; + t << "\" kind=\"" << kindName << "\">\n"; t << " <compoundname>" << convertToXML(pd->name()) - << "</compoundname>" << endl; + << "</compoundname>\n"; if (pd==Doxygen::mainPage.get()) // main page is special { QCString title; if (mainPageHasTitle()) { - title = filterTitle(convertCharEntitiesToUTF8(Doxygen::mainPage->title())); + title = filterTitle(convertCharEntitiesToUTF8(Doxygen::mainPage->title()).str()); } else { title = Config_getString(PROJECT_NAME); } t << " <title>" << convertToXML(convertCharEntitiesToUTF8(title)) - << "</title>" << endl; + << "</title>\n"; } else { const SectionInfo *si = SectionManager::instance().find(pd->name()); if (si) { - t << " <title>" << convertToXML(convertCharEntitiesToUTF8(filterTitle(si->title()))) - << "</title>" << endl; + t << " <title>" << convertToXML(filterTitle(convertCharEntitiesToUTF8(si->title()).str())) + << "</title>\n"; } } writeInnerPages(pd->getSubPages(),t); const SectionRefs §ionRefs = pd->getSectionRefs(); if (pd->localToc().isXmlEnabled() && !sectionRefs.empty()) { - t << " <tableofcontents>" << endl; + t << " <tableofcontents>\n"; int level=1,l; bool inLi[5]={ FALSE, FALSE, FALSE, FALSE, FALSE }; int maxLevel = pd->localToc().xmlLevel(); @@ -1788,31 +1817,31 @@ static void generateXMLForPage(PageDef *pd,FTextStream &ti,bool isExample) { if (isSection(si->type())) { - //printf(" level=%d title=%s\n",level,si->title.data()); + //printf(" level=%d title=%s\n",level,qPrint(si->title)); int nextLevel = (int)si->type(); if (nextLevel>level) { for (l=level;l<nextLevel;l++) { - if (l < maxLevel) t << " <tableofcontents>" << endl; + if (l < maxLevel) t << " <tableofcontents>\n"; } } else if (nextLevel<level) { for (l=level;l>nextLevel;l--) { - if (l <= maxLevel && inLi[l]) t << " </tocsect>" << endl; + if (l <= maxLevel && inLi[l]) t << " </tocsect>\n"; inLi[l]=FALSE; - if (l <= maxLevel) t << " </tableofcontents>" << endl; + if (l <= maxLevel) t << " </tableofcontents>\n"; } } if (nextLevel <= maxLevel) { - if (inLi[nextLevel]) t << " </tocsect>" << endl; + if (inLi[nextLevel]) t << " </tocsect>\n"; QCString titleDoc = convertToXML(si->title()); - t << " <tocsect>" << endl; - t << " <name>" << (si->title().isEmpty()?si->label():titleDoc) << "</name>" << endl; - t << " <reference>" << convertToXML(pageName) << "_1" << convertToXML(si->label()) << "</reference>" << endl; + t << " <tocsect>\n"; + t << " <name>" << (si->title().isEmpty()?si->label():titleDoc) << "</name>\n"; + t << " <reference>" << convertToXML(pageName) << "_1" << convertToXML(si->label()) << "</reference>\n"; inLi[nextLevel]=TRUE; level = nextLevel; } @@ -1820,19 +1849,19 @@ static void generateXMLForPage(PageDef *pd,FTextStream &ti,bool isExample) } while (level>1 && level <= maxLevel) { - if (inLi[level]) t << " </tocsect>" << endl; + if (inLi[level]) t << " </tocsect>\n"; inLi[level]=FALSE; - t << " </tableofcontents>" << endl; + t << " </tableofcontents>\n"; level--; } - if (level <= maxLevel && inLi[level]) t << " </tocsect>" << endl; + if (level <= maxLevel && inLi[level]) t << " </tocsect>\n"; inLi[level]=FALSE; - t << " </tableofcontents>" << endl; + t << " </tableofcontents>\n"; } - t << " <briefdescription>" << endl; + t << " <briefdescription>\n"; writeXMLDocBlock(t,pd->briefFile(),pd->briefLine(),pd,0,pd->briefDescription()); - t << " </briefdescription>" << endl; - t << " <detaileddescription>" << endl; + t << " </briefdescription>\n"; + t << " <detaileddescription>\n"; if (isExample) { writeXMLDocBlock(t,pd->docFile(),pd->docLine(),pd,0, @@ -1843,19 +1872,20 @@ static void generateXMLForPage(PageDef *pd,FTextStream &ti,bool isExample) writeXMLDocBlock(t,pd->docFile(),pd->docLine(),pd,0, pd->documentation()); } - t << " </detaileddescription>" << endl; + t << " </detaileddescription>\n"; - t << " <location file=\"" << convertToXML(stripFromPath(pd->getDefFileName())) << "\"/>" << endl; + t << " <location file=\"" << convertToXML(stripFromPath(pd->getDefFileName())) << "\"/>\n"; - t << " </compounddef>" << endl; - t << "</doxygen>" << endl; + t << " </compounddef>\n"; + t << "</doxygen>\n"; - ti << " </compound>" << endl; + ti << " </compound>\n"; } void generateXML() { // + classes + // + concepts // + namespaces // + files // + groups @@ -1863,111 +1893,133 @@ void generateXML() // - examples QCString outputDirectory = Config_getString(XML_OUTPUT); - QDir xmlDir(outputDirectory); + Dir xmlDir(outputDirectory.str()); createSubDirs(xmlDir); ResourceMgr::instance().copyResource("xml.xsd",outputDirectory); ResourceMgr::instance().copyResource("index.xsd",outputDirectory); + ResourceMgr::instance().copyResource("doxyfile.xsd",outputDirectory); QCString fileName=outputDirectory+"/compound.xsd"; - QFile f(fileName); - if (!f.open(IO_WriteOnly)) + std::ofstream f(fileName.str(),std::ofstream::out | std::ofstream::binary); + if (!f.is_open()) { - err("Cannot open file %s for writing!\n",fileName.data()); + err("Cannot open file %s for writing!\n",qPrint(fileName)); return; } - - // write compound.xsd, but replace special marker with the entities - QCString compound_xsd = ResourceMgr::instance().getAsString("compound.xsd"); - const char *startLine = compound_xsd.data(); - while (*startLine) { - // find end of the line - const char *endLine = startLine+1; - while (*endLine && *(endLine-1)!='\n') endLine++; // skip to end of the line including \n - int len=endLine-startLine; - if (len>0) + TextStream t(&f); + + // write compound.xsd, but replace special marker with the entities + QCString compound_xsd = ResourceMgr::instance().getAsString("compound.xsd"); + const char *startLine = compound_xsd.data(); + while (*startLine) { - QCString s(len+1); - qstrncpy(s.rawData(),startLine,len); - s[len]='\0'; - if (s.find("<!-- Automatically insert here the HTML entities -->")!=-1) + // find end of the line + const char *endLine = startLine+1; + while (*endLine && *(endLine-1)!='\n') endLine++; // skip to end of the line including \n + int len=static_cast<int>(endLine-startLine); + if (len>0) { - FTextStream t(&f); - HtmlEntityMapper::instance()->writeXMLSchema(t); - } - else - { - f.writeBlock(startLine,len); + QCString s(startLine,len); + if (s.find("<!-- Automatically insert here the HTML entities -->")!=-1) + { + HtmlEntityMapper::instance()->writeXMLSchema(t); + } + else + { + t.write(startLine,len); + } } + startLine=endLine; } - startLine=endLine; } f.close(); - fileName=outputDirectory+"/index.xml"; - f.setName(fileName); - if (!f.open(IO_WriteOnly)) + fileName=outputDirectory+"/Doxyfile.xml"; + f.open(fileName.str(),std::ofstream::out | std::ofstream::binary); + if (!f.is_open()) { - err("Cannot open file %s for writing!\n",fileName.data()); + err("Cannot open file %s for writing\n",fileName.data()); return; } - FTextStream t(&f); - //t.setEncoding(FTextStream::UnicodeUTF8); - - // write index header - t << "<?xml version='1.0' encoding='UTF-8' standalone='no'?>" << endl;; - t << "<doxygenindex xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" "; - t << "xsi:noNamespaceSchemaLocation=\"index.xsd\" "; - t << "version=\"" << getDoxygenVersion() << "\" "; - t << "xml:lang=\"" << theTranslator->trISOLang() << "\""; - t << ">" << endl; - - for (const auto &cd : *Doxygen::classLinkedMap) + else { - generateXMLForClass(cd.get(),t); + TextStream t(&f); + Config::writeXMLDoxyfile(t); } - for (const auto &nd : *Doxygen::namespaceLinkedMap) + f.close(); + + fileName=outputDirectory+"/index.xml"; + f.open(fileName.str(),std::ofstream::out | std::ofstream::binary); + if (!f.is_open()) { - msg("Generating XML output for namespace %s\n",nd->name().data()); - generateXMLForNamespace(nd.get(),t); + err("Cannot open file %s for writing!\n",qPrint(fileName)); + return; } - for (const auto &fn : *Doxygen::inputNameLinkedMap) + else { - for (const auto &fd : *fn) + TextStream t(&f); + + // write index header + t << "<?xml version='1.0' encoding='UTF-8' standalone='no'?>\n";; + t << "<doxygenindex xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" "; + t << "xsi:noNamespaceSchemaLocation=\"index.xsd\" "; + t << "version=\"" << getDoxygenVersion() << "\" "; + t << "xml:lang=\"" << theTranslator->trISOLang() << "\""; + t << ">\n"; + + for (const auto &cd : *Doxygen::classLinkedMap) { - msg("Generating XML output for file %s\n",fd->name().data()); - generateXMLForFile(fd.get(),t); + generateXMLForClass(cd.get(),t); + } + for (const auto &cd : *Doxygen::conceptLinkedMap) + { + msg("Generating XML output for concept %s\n",qPrint(cd->name())); + generateXMLForConcept(cd.get(),t); + } + for (const auto &nd : *Doxygen::namespaceLinkedMap) + { + msg("Generating XML output for namespace %s\n",qPrint(nd->name())); + generateXMLForNamespace(nd.get(),t); + } + for (const auto &fn : *Doxygen::inputNameLinkedMap) + { + for (const auto &fd : *fn) + { + msg("Generating XML output for file %s\n",qPrint(fd->name())); + generateXMLForFile(fd.get(),t); + } + } + for (const auto &gd : *Doxygen::groupLinkedMap) + { + msg("Generating XML output for group %s\n",qPrint(gd->name())); + generateXMLForGroup(gd.get(),t); + } + for (const auto &pd : *Doxygen::pageLinkedMap) + { + msg("Generating XML output for page %s\n",qPrint(pd->name())); + generateXMLForPage(pd.get(),t,FALSE); + } + for (const auto &dd : *Doxygen::dirLinkedMap) + { + msg("Generate XML output for dir %s\n",qPrint(dd->name())); + generateXMLForDir(dd.get(),t); + } + for (const auto &pd : *Doxygen::exampleLinkedMap) + { + msg("Generating XML output for example %s\n",qPrint(pd->name())); + generateXMLForPage(pd.get(),t,TRUE); + } + if (Doxygen::mainPage) + { + msg("Generating XML output for the main page\n"); + generateXMLForPage(Doxygen::mainPage.get(),t,FALSE); } - } - for (const auto &gd : *Doxygen::groupLinkedMap) - { - msg("Generating XML output for group %s\n",gd->name().data()); - generateXMLForGroup(gd.get(),t); - } - for (const auto &pd : *Doxygen::pageLinkedMap) - { - msg("Generating XML output for page %s\n",pd->name().data()); - generateXMLForPage(pd.get(),t,FALSE); - } - for (const auto &dd : *Doxygen::dirLinkedMap) - { - msg("Generate XML output for dir %s\n",dd->name().data()); - generateXMLForDir(dd.get(),t); - } - for (const auto &pd : *Doxygen::exampleLinkedMap) - { - msg("Generating XML output for example %s\n",pd->name().data()); - generateXMLForPage(pd.get(),t,TRUE); - } - if (Doxygen::mainPage) - { - msg("Generating XML output for the main page\n"); - generateXMLForPage(Doxygen::mainPage.get(),t,FALSE); - } - //t << " </compoundlist>" << endl; - t << "</doxygenindex>" << endl; + //t << " </compoundlist>\n"; + t << "</doxygenindex>\n"; + } writeCombineScript(); } |