|
Packit |
1c1d7e |
/******************************************************************************
|
|
Packit |
1c1d7e |
*
|
|
Packit |
1c1d7e |
* Copyright (C) 1997-2015 by Dimitri van Heesch.
|
|
Packit |
1c1d7e |
*
|
|
Packit |
1c1d7e |
* Permission to use, copy, modify, and distribute this software and its
|
|
Packit |
1c1d7e |
* documentation under the terms of the GNU General Public License is hereby
|
|
Packit |
1c1d7e |
* granted. No representations are made about the suitability of this software
|
|
Packit |
1c1d7e |
* for any purpose. It is provided "as is" without express or implied warranty.
|
|
Packit |
1c1d7e |
* See the GNU General Public License for more details.
|
|
Packit |
1c1d7e |
*
|
|
Packit |
1c1d7e |
* Documents produced by Doxygen are derivative works derived from the
|
|
Packit |
1c1d7e |
* input used in their production; they are not affected by this license.
|
|
Packit |
1c1d7e |
*
|
|
Packit |
1c1d7e |
*/
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
#include <stdlib.h>
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
#include <qdir.h>
|
|
Packit |
1c1d7e |
#include <qfile.h>
|
|
Packit |
1c1d7e |
#include <qtextstream.h>
|
|
Packit |
1c1d7e |
#include <qintdict.h>
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
#include "xmlgen.h"
|
|
Packit |
1c1d7e |
#include "doxygen.h"
|
|
Packit |
1c1d7e |
#include "message.h"
|
|
Packit |
1c1d7e |
#include "config.h"
|
|
Packit |
1c1d7e |
#include "classlist.h"
|
|
Packit |
1c1d7e |
#include "util.h"
|
|
Packit |
1c1d7e |
#include "defargs.h"
|
|
Packit |
1c1d7e |
#include "outputgen.h"
|
|
Packit |
1c1d7e |
#include "dot.h"
|
|
Packit |
1c1d7e |
#include "pagedef.h"
|
|
Packit |
1c1d7e |
#include "filename.h"
|
|
Packit |
1c1d7e |
#include "version.h"
|
|
Packit |
1c1d7e |
#include "xmldocvisitor.h"
|
|
Packit |
1c1d7e |
#include "docparser.h"
|
|
Packit |
1c1d7e |
#include "language.h"
|
|
Packit |
1c1d7e |
#include "parserintf.h"
|
|
Packit |
1c1d7e |
#include "arguments.h"
|
|
Packit |
1c1d7e |
#include "memberlist.h"
|
|
Packit |
1c1d7e |
#include "groupdef.h"
|
|
Packit |
1c1d7e |
#include "memberdef.h"
|
|
Packit |
1c1d7e |
#include "namespacedef.h"
|
|
Packit |
1c1d7e |
#include "membername.h"
|
|
Packit |
1c1d7e |
#include "membergroup.h"
|
|
Packit |
1c1d7e |
#include "dirdef.h"
|
|
Packit |
1c1d7e |
#include "section.h"
|
|
Packit |
1c1d7e |
#include "htmlentity.h"
|
|
Packit |
1c1d7e |
#include "resourcemgr.h"
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
// no debug info
|
|
Packit |
1c1d7e |
#define XML_DB(x) do {} while(0)
|
|
Packit |
1c1d7e |
// debug to stdout
|
|
Packit |
1c1d7e |
//#define XML_DB(x) printf x
|
|
Packit |
1c1d7e |
// debug inside output
|
|
Packit |
1c1d7e |
//#define XML_DB(x) QCString __t;__t.sprintf x;m_t << __t
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
//------------------
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
/** Helper class mapping MemberList::ListType to a string representing */
|
|
Packit |
1c1d7e |
class XmlSectionMapper : public QIntDict<char>
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
public:
|
|
Packit |
1c1d7e |
XmlSectionMapper() : QIntDict<char>(47)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
insert(MemberListType_pubTypes,"public-type");
|
|
Packit |
1c1d7e |
insert(MemberListType_pubMethods,"public-func");
|
|
Packit |
1c1d7e |
insert(MemberListType_pubAttribs,"public-attrib");
|
|
Packit |
1c1d7e |
insert(MemberListType_pubSlots,"public-slot");
|
|
Packit |
1c1d7e |
insert(MemberListType_signals,"signal");
|
|
Packit |
1c1d7e |
insert(MemberListType_dcopMethods,"dcop-func");
|
|
Packit |
1c1d7e |
insert(MemberListType_properties,"property");
|
|
Packit |
1c1d7e |
insert(MemberListType_events,"event");
|
|
Packit |
1c1d7e |
insert(MemberListType_interfaces,"interfaces");
|
|
Packit |
1c1d7e |
insert(MemberListType_services,"services");
|
|
Packit |
1c1d7e |
insert(MemberListType_pubStaticMethods,"public-static-func");
|
|
Packit |
1c1d7e |
insert(MemberListType_pubStaticAttribs,"public-static-attrib");
|
|
Packit |
1c1d7e |
insert(MemberListType_proTypes,"protected-type");
|
|
Packit |
1c1d7e |
insert(MemberListType_proMethods,"protected-func");
|
|
Packit |
1c1d7e |
insert(MemberListType_proAttribs,"protected-attrib");
|
|
Packit |
1c1d7e |
insert(MemberListType_proSlots,"protected-slot");
|
|
Packit |
1c1d7e |
insert(MemberListType_proStaticMethods,"protected-static-func");
|
|
Packit |
1c1d7e |
insert(MemberListType_proStaticAttribs,"protected-static-attrib");
|
|
Packit |
1c1d7e |
insert(MemberListType_pacTypes,"package-type");
|
|
Packit |
1c1d7e |
insert(MemberListType_pacMethods,"package-func");
|
|
Packit |
1c1d7e |
insert(MemberListType_pacAttribs,"package-attrib");
|
|
Packit |
1c1d7e |
insert(MemberListType_pacStaticMethods,"package-static-func");
|
|
Packit |
1c1d7e |
insert(MemberListType_pacStaticAttribs,"package-static-attrib");
|
|
Packit |
1c1d7e |
insert(MemberListType_priTypes,"private-type");
|
|
Packit |
1c1d7e |
insert(MemberListType_priMethods,"private-func");
|
|
Packit |
1c1d7e |
insert(MemberListType_priAttribs,"private-attrib");
|
|
Packit |
1c1d7e |
insert(MemberListType_priSlots,"private-slot");
|
|
Packit |
1c1d7e |
insert(MemberListType_priStaticMethods,"private-static-func");
|
|
Packit |
1c1d7e |
insert(MemberListType_priStaticAttribs,"private-static-attrib");
|
|
Packit |
1c1d7e |
insert(MemberListType_friends,"friend");
|
|
Packit |
1c1d7e |
insert(MemberListType_related,"related");
|
|
Packit |
1c1d7e |
insert(MemberListType_decDefineMembers,"define");
|
|
Packit |
1c1d7e |
insert(MemberListType_decProtoMembers,"prototype");
|
|
Packit |
1c1d7e |
insert(MemberListType_decTypedefMembers,"typedef");
|
|
Packit |
1c1d7e |
insert(MemberListType_decEnumMembers,"enum");
|
|
Packit |
1c1d7e |
insert(MemberListType_decFuncMembers,"func");
|
|
Packit |
1c1d7e |
insert(MemberListType_decVarMembers,"var");
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
};
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
static XmlSectionMapper g_xmlSectionMapper;
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
inline void writeXMLString(FTextStream &t,const char *s)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
t << convertToXML(s);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
inline void writeXMLCodeString(FTextStream &t,const char *s, int &col)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
char c;
|
|
Packit |
1c1d7e |
while ((c=*s++))
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
switch(c)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
case '\t':
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
static int tabSize = Config_getInt(TAB_SIZE);
|
|
Packit |
1c1d7e |
int spacesToNextTabStop = tabSize - (col%tabSize);
|
|
Packit |
1c1d7e |
col+=spacesToNextTabStop;
|
|
Packit |
1c1d7e |
while (spacesToNextTabStop--) t << "<sp/>";
|
|
Packit |
1c1d7e |
break;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
case ' ': t << "<sp/>"; col++; break;
|
|
Packit |
1c1d7e |
case '<': t << "<"; col++; break;
|
|
Packit |
1c1d7e |
case '>': t << ">"; col++; break;
|
|
Packit |
1c1d7e |
case '&': t << "&"; col++; break;
|
|
Packit |
1c1d7e |
case '\'': t << "'"; col++; break;
|
|
Packit |
1c1d7e |
case '"': t << """; col++; break;
|
|
Packit |
1c1d7e |
case 1: case 2: case 3: case 4: case 5: case 6: case 7: case 8:
|
|
Packit |
1c1d7e |
case 11: case 12: case 13: case 14: case 15: case 16: case 17: case 18:
|
|
Packit |
1c1d7e |
case 19: case 20: case 21: case 22: case 23: case 24: case 25: case 26:
|
|
Packit |
1c1d7e |
case 27: case 28: case 29: case 30: case 31:
|
|
Packit |
1c1d7e |
// encode invalid XML characters (see http://www.w3.org/TR/2000/REC-xml-20001006#NT-Char)
|
|
Packit |
1c1d7e |
t << "<sp value=\"" << int(c) << "\"/>";
|
|
Packit |
1c1d7e |
break;
|
|
Packit |
1c1d7e |
default: s=writeUtf8Char(t,s-1); col++; break;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
static void writeXMLHeader(FTextStream &t)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
t << "" << endl;;
|
|
Packit |
1c1d7e |
t << "
|
|
Packit |
1c1d7e |
t << "xsi:noNamespaceSchemaLocation=\"compound.xsd\" ";
|
|
Packit |
1c1d7e |
t << "version=\"" << versionString << "\">" << endl;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
static void writeCombineScript()
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
QCString outputDirectory = Config_getString(XML_OUTPUT);
|
|
Packit |
1c1d7e |
QCString fileName=outputDirectory+"/combine.xslt";
|
|
Packit |
1c1d7e |
QFile f(fileName);
|
|
Packit |
1c1d7e |
if (!f.open(IO_WriteOnly))
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
err("Cannot open file %s for writing!\n",fileName.data());
|
|
Packit |
1c1d7e |
return;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
FTextStream t(&f);
|
|
Packit |
1c1d7e |
//t.setEncoding(FTextStream::UnicodeUTF8);
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
t <<
|
|
Packit |
1c1d7e |
"
|
|
Packit |
1c1d7e |
" If you have xsltproc you could use:\n"
|
|
Packit |
1c1d7e |
" xsltproc combine.xslt index.xml >all.xml\n"
|
|
Packit |
1c1d7e |
"-->\n"
|
|
Packit |
1c1d7e |
"<xsl:stylesheet xmlns:xsl=\"http://www.w3.org/1999/XSL/Transform\" version=\"1.0\">\n"
|
|
Packit |
1c1d7e |
" <xsl:output method=\"xml\" version=\"1.0\" indent=\"no\" standalone=\"yes\" />\n"
|
|
Packit |
1c1d7e |
" <xsl:template match=\"/\">\n"
|
|
Packit |
1c1d7e |
" <doxygen version=\"{doxygenindex/@version}\">\n"
|
|
Packit |
1c1d7e |
" \n"
|
|
Packit |
1c1d7e |
" <xsl:for-each select=\"doxygenindex/compound\">\n"
|
|
Packit |
1c1d7e |
" <xsl:copy-of select=\"document( concat( @refid, '.xml' ) )/doxygen/*\" />\n"
|
|
Packit |
1c1d7e |
" </xsl:for-each>\n"
|
|
Packit |
1c1d7e |
" </doxygen>\n"
|
|
Packit |
1c1d7e |
" </xsl:template>\n"
|
|
Packit |
1c1d7e |
"</xsl:stylesheet>\n";
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void writeXMLLink(FTextStream &t,const char *extRef,const char *compoundId,
|
|
Packit |
1c1d7e |
const char *anchorId,const char *text,const char *tooltip)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
t << "
|
|
Packit |
1c1d7e |
if (anchorId) t << "_1" << anchorId;
|
|
Packit |
1c1d7e |
t << "\" kindref=\"";
|
|
Packit |
1c1d7e |
if (anchorId) t << "member"; else t << "compound";
|
|
Packit |
1c1d7e |
t << "\"";
|
|
Packit |
1c1d7e |
if (extRef) t << " external=\"" << extRef << "\"";
|
|
Packit |
1c1d7e |
if (tooltip) t << " tooltip=\"" << convertToXML(tooltip) << "\"";
|
|
Packit |
1c1d7e |
t << ">";
|
|
Packit |
1c1d7e |
writeXMLString(t,text);
|
|
Packit |
1c1d7e |
t << "</ref>";
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
/** Implements TextGeneratorIntf for an XML stream. */
|
|
Packit |
1c1d7e |
class TextGeneratorXMLImpl : public TextGeneratorIntf
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
public:
|
|
Packit |
1c1d7e |
TextGeneratorXMLImpl(FTextStream &t): m_t(t) {}
|
|
Packit |
1c1d7e |
void writeString(const char *s,bool /*keepSpaces*/) const
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
writeXMLString(m_t,s);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
void writeBreak(int) const {}
|
|
Packit |
1c1d7e |
void writeLink(const char *extRef,const char *file,
|
|
Packit |
1c1d7e |
const char *anchor,const char *text
|
|
Packit |
1c1d7e |
) const
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
writeXMLLink(m_t,extRef,file,anchor,text,0);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
private:
|
|
Packit |
1c1d7e |
FTextStream &m_;;
|
|
Packit |
1c1d7e |
};
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
/** Generator for producing XML formatted source code. */
|
|
Packit |
1c1d7e |
class XMLCodeGenerator : public CodeOutputInterface
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
public:
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
XMLCodeGenerator(FTextStream &t) : m_t(t), m_lineNumber(-1), m_isMemberRef(FALSE), m_col(0),
|
|
Packit |
1c1d7e |
m_insideCodeLine(FALSE), m_normalHLNeedStartTag(TRUE), m_insideSpecialHL(FALSE) {}
|
|
Packit |
1c1d7e |
virtual ~XMLCodeGenerator() { }
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void codify(const char *text)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
XML_DB(("(codify \"%s\")\n",text));
|
|
Packit |
1c1d7e |
if (m_insideCodeLine && !m_insideSpecialHL && m_normalHLNeedStartTag)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
m_t << "<highlight class=\"normal\">";
|
|
Packit |
1c1d7e |
m_normalHLNeedStartTag=FALSE;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
writeXMLCodeString(m_t,text,m_col);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
void writeCodeLink(const char *ref,const char *file,
|
|
Packit |
1c1d7e |
const char *anchor,const char *name,
|
|
Packit |
1c1d7e |
const char *tooltip)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
XML_DB(("(writeCodeLink)\n"));
|
|
Packit |
1c1d7e |
if (m_insideCodeLine && !m_insideSpecialHL && m_normalHLNeedStartTag)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
m_t << "<highlight class=\"normal\">";
|
|
Packit |
1c1d7e |
m_normalHLNeedStartTag=FALSE;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
writeXMLLink(m_t,ref,file,anchor,name,tooltip);
|
|
Packit |
1c1d7e |
m_col+=qstrlen(name);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
void writeTooltip(const char *, const DocLinkInfo &, const char *,
|
|
Packit |
1c1d7e |
const char *, const SourceLinkInfo &, const SourceLinkInfo &
|
|
Packit |
1c1d7e |
)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
XML_DB(("(writeToolTip)\n"));
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
void startCodeLine(bool)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
XML_DB(("(startCodeLine)\n"));
|
|
Packit |
1c1d7e |
m_t << "
|
|
Packit |
1c1d7e |
if (m_lineNumber!=-1)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
m_t << " lineno=\"" << m_lineNumber << "\"";
|
|
Packit |
1c1d7e |
if (!m_refId.isEmpty())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
m_t << " refid=\"" << m_refId << "\"";
|
|
Packit |
1c1d7e |
if (m_isMemberRef)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
m_t << " refkind=\"member\"";
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
m_t << " refkind=\"compound\"";
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
if (!m_external.isEmpty())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
m_t << " external=\"" << m_external << "\"";
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
m_t << ">";
|
|
Packit |
1c1d7e |
m_insideCodeLine=TRUE;
|
|
Packit |
1c1d7e |
m_col=0;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
void endCodeLine()
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
XML_DB(("(endCodeLine)\n"));
|
|
Packit |
1c1d7e |
if (!m_insideSpecialHL && !m_normalHLNeedStartTag)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
m_t << "</highlight>";
|
|
Packit |
1c1d7e |
m_normalHLNeedStartTag=TRUE;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
m_t << "</codeline>" << endl; // non DocBook
|
|
Packit |
1c1d7e |
m_lineNumber = -1;
|
|
Packit |
1c1d7e |
m_refId.resize(0);
|
|
Packit |
1c1d7e |
m_external.resize(0);
|
|
Packit |
1c1d7e |
m_insideCodeLine=FALSE;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
void startFontClass(const char *colorClass)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
XML_DB(("(startFontClass)\n"));
|
|
Packit |
1c1d7e |
if (m_insideCodeLine && !m_insideSpecialHL && !m_normalHLNeedStartTag)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
m_t << "</highlight>";
|
|
Packit |
1c1d7e |
m_normalHLNeedStartTag=TRUE;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
m_t << "<highlight class=\"" << colorClass << "\">"; // non DocBook
|
|
Packit |
1c1d7e |
m_insideSpecialHL=TRUE;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
void endFontClass()
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
XML_DB(("(endFontClass)\n"));
|
|
Packit |
1c1d7e |
m_t << "</highlight>"; // non DocBook
|
|
Packit |
1c1d7e |
m_insideSpecialHL=FALSE;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
void writeCodeAnchor(const char *)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
XML_DB(("(writeCodeAnchor)\n"));
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
void writeLineNumber(const char *extRef,const char *compId,
|
|
Packit |
1c1d7e |
const char *anchorId,int l)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
XML_DB(("(writeLineNumber)\n"));
|
|
Packit |
1c1d7e |
// we remember the information provided here to use it
|
|
Packit |
1c1d7e |
// at the <codeline> start tag.
|
|
Packit |
1c1d7e |
m_lineNumber = l;
|
|
Packit |
1c1d7e |
if (compId)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
m_refId=compId;
|
|
Packit |
1c1d7e |
if (anchorId) m_refId+=(QCString)"_1"+anchorId;
|
|
Packit |
1c1d7e |
m_isMemberRef = anchorId!=0;
|
|
Packit |
1c1d7e |
if (extRef) m_external=extRef;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
void setCurrentDoc(Definition *,const char *,bool)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
void addWord(const char *,bool)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void finish()
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (m_insideCodeLine) endCodeLine();
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
private:
|
|
Packit |
1c1d7e |
FTextStream &m_;;
|
|
Packit |
1c1d7e |
QCString m_refId;
|
|
Packit |
1c1d7e |
QCString m_external;
|
|
Packit |
1c1d7e |
int m_lineNumber;
|
|
Packit |
1c1d7e |
bool m_isMemberRef;
|
|
Packit |
1c1d7e |
int m_col;
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
bool m_insideCodeLine;
|
|
Packit |
1c1d7e |
bool m_normalHLNeedStartTag;
|
|
Packit |
1c1d7e |
bool m_insideSpecialHL;
|
|
Packit |
1c1d7e |
};
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
static void writeTemplateArgumentList(ArgumentList *al,
|
|
Packit |
1c1d7e |
FTextStream &t,
|
|
Packit |
1c1d7e |
Definition *scope,
|
|
Packit |
1c1d7e |
FileDef *fileScope,
|
|
Packit |
1c1d7e |
int indent)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
QCString indentStr;
|
|
Packit |
1c1d7e |
indentStr.fill(' ',indent);
|
|
Packit |
1c1d7e |
if (al)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
t << indentStr << "<templateparamlist>" << endl;
|
|
Packit |
1c1d7e |
ArgumentListIterator ali(*al);
|
|
Packit |
1c1d7e |
Argument *a;
|
|
Packit |
1c1d7e |
for (ali.toFirst();(a=ali.current());++ali)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
t << indentStr << " <param>" << endl;
|
|
Packit |
1c1d7e |
if (!a->type.isEmpty())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
t << indentStr << " <type>";
|
|
Packit |
1c1d7e |
linkifyText(TextGeneratorXMLImpl(t),scope,fileScope,0,a->type);
|
|
Packit |
1c1d7e |
t << "</type>" << endl;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
if (!a->name.isEmpty())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
t << indentStr << " <declname>" << a->name << "</declname>" << endl;
|
|
Packit |
1c1d7e |
t << indentStr << " <defname>" << a->name << "</defname>" << endl;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
if (!a->defval.isEmpty())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
t << indentStr << " <defval>";
|
|
Packit |
1c1d7e |
linkifyText(TextGeneratorXMLImpl(t),scope,fileScope,0,a->defval);
|
|
Packit |
1c1d7e |
t << "</defval>" << endl;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
if (!a->typeConstraint.isEmpty())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
t << indentStr << " <typeconstraint>";
|
|
Packit |
1c1d7e |
linkifyText(TextGeneratorXMLImpl(t),scope,fileScope,0,a->typeConstraint);
|
|
Packit |
1c1d7e |
t << "</typeconstraint>" << endl;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
t << indentStr << " </param>" << endl;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
t << indentStr << "</templateparamlist>" << endl;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
static void writeMemberTemplateLists(MemberDef *md,FTextStream &t)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
ArgumentList *templMd = md->templateArguments();
|
|
Packit |
1c1d7e |
if (templMd) // function template prefix
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
writeTemplateArgumentList(templMd,t,md->getClassDef(),md->getFileDef(),8);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
static void writeTemplateList(ClassDef *cd,FTextStream &t)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
writeTemplateArgumentList(cd->templateArguments(),t,cd,0,4);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
static void writeXMLDocBlock(FTextStream &t,
|
|
Packit |
1c1d7e |
const QCString &fileName,
|
|
Packit |
1c1d7e |
int lineNr,
|
|
Packit |
1c1d7e |
Definition *scope,
|
|
Packit |
1c1d7e |
MemberDef * md,
|
|
Packit |
1c1d7e |
const QCString &text)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
QCString stext = text.stripWhiteSpace();
|
|
Packit |
1c1d7e |
if (stext.isEmpty()) return;
|
|
Packit |
1c1d7e |
// convert the documentation string into an abstract syntax tree
|
|
Packit |
1c1d7e |
DocNode *root = validatingParseDoc(fileName,lineNr,scope,md,text,FALSE,FALSE);
|
|
Packit |
1c1d7e |
// create a code generator
|
|
Packit |
1c1d7e |
XMLCodeGenerator *xmlCodeGen = new XMLCodeGenerator(t);
|
|
Packit |
1c1d7e |
// create a parse tree visitor for XML
|
|
Packit |
1c1d7e |
XmlDocVisitor *visitor = new XmlDocVisitor(t,*xmlCodeGen);
|
|
Packit |
1c1d7e |
// visit all nodes
|
|
Packit |
1c1d7e |
root->accept(visitor);
|
|
Packit |
1c1d7e |
// clean up
|
|
Packit |
1c1d7e |
delete visitor;
|
|
Packit |
1c1d7e |
delete xmlCodeGen;
|
|
Packit |
1c1d7e |
delete root;
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void writeXMLCodeBlock(FTextStream &t,FileDef *fd)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
ParserInterface *pIntf=Doxygen::parserManager->getParser(fd->getDefFileExtension());
|
|
Packit |
1c1d7e |
SrcLangExt langExt = getLanguageFromFileName(fd->getDefFileExtension());
|
|
Packit |
1c1d7e |
pIntf->resetCodeParserState();
|
|
Packit |
1c1d7e |
XMLCodeGenerator *xmlGen = new XMLCodeGenerator(t);
|
|
Packit |
1c1d7e |
pIntf->parseCode(*xmlGen, // codeOutIntf
|
|
Packit |
1c1d7e |
0, // scopeName
|
|
Packit |
1c1d7e |
fileToString(fd->absFilePath(),Config_getBool(FILTER_SOURCE_FILES)),
|
|
Packit |
1c1d7e |
langExt, // lang
|
|
Packit |
1c1d7e |
FALSE, // isExampleBlock
|
|
Packit |
1c1d7e |
0, // exampleName
|
|
Packit |
1c1d7e |
fd, // fileDef
|
|
Packit |
1c1d7e |
-1, // startLine
|
|
Packit |
1c1d7e |
-1, // endLine
|
|
Packit |
1c1d7e |
FALSE, // inlineFragement
|
|
Packit |
1c1d7e |
0, // memberDef
|
|
Packit |
1c1d7e |
TRUE // showLineNumbers
|
|
Packit |
1c1d7e |
);
|
|
Packit |
1c1d7e |
xmlGen->finish();
|
|
Packit |
1c1d7e |
delete xmlGen;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
static void writeMemberReference(FTextStream &t,Definition *def,MemberDef *rmd,const char *tagName)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
QCString scope = rmd->getScopeString();
|
|
Packit |
1c1d7e |
QCString name = rmd->name();
|
|
Packit |
1c1d7e |
if (!scope.isEmpty() && scope!=def->name())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
name.prepend(scope+getLanguageSpecificSeparator(rmd->getLanguage()));
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
t << " <" << tagName << " refid=\"";
|
|
Packit |
1c1d7e |
t << rmd->getOutputFileBase() << "_1" << rmd->anchor() << "\"";
|
|
Packit |
1c1d7e |
if (rmd->getStartBodyLine()!=-1 && rmd->getBodyDef())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
t << " compoundref=\"" << rmd->getBodyDef()->getOutputFileBase() << "\"";
|
|
Packit |
1c1d7e |
t << " startline=\"" << rmd->getStartBodyLine() << "\"";
|
|
Packit |
1c1d7e |
if (rmd->getEndBodyLine()!=-1)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
t << " endline=\"" << rmd->getEndBodyLine() << "\"";
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
t << ">" << convertToXML(name) << "</" << tagName << ">" << endl;
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
static void stripQualifiers(QCString &typeStr)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
bool done=FALSE;
|
|
Packit |
1c1d7e |
while (!done)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (typeStr.stripPrefix("static "));
|
|
Packit |
1c1d7e |
else if (typeStr.stripPrefix("virtual "));
|
|
Packit |
1c1d7e |
else if (typeStr.stripPrefix("volatile "));
|
|
Packit |
1c1d7e |
else if (typeStr=="virtual") typeStr="";
|
|
Packit |
1c1d7e |
else done=TRUE;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
static QCString classOutputFileBase(ClassDef *cd)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
//static bool inlineGroupedClasses = Config_getBool(INLINE_GROUPED_CLASSES);
|
|
Packit |
1c1d7e |
//if (inlineGroupedClasses && cd->partOfGroups()!=0)
|
|
Packit |
1c1d7e |
return cd->getOutputFileBase();
|
|
Packit |
1c1d7e |
//else
|
|
Packit |
1c1d7e |
// return cd->getOutputFileBase();
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
static QCString memberOutputFileBase(MemberDef *md)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
//static bool inlineGroupedClasses = Config_getBool(INLINE_GROUPED_CLASSES);
|
|
Packit |
1c1d7e |
//if (inlineGroupedClasses && md->getClassDef() && md->getClassDef()->partOfGroups()!=0)
|
|
Packit |
1c1d7e |
// return md->getClassDef()->getXmlOutputFileBase();
|
|
Packit |
1c1d7e |
//else
|
|
Packit |
1c1d7e |
// return md->getOutputFileBase();
|
|
Packit |
1c1d7e |
return md->getOutputFileBase();
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
static void generateXMLForMember(MemberDef *md,FTextStream &ti,FTextStream &t,Definition *def)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
// + declaration/definition arg lists
|
|
Packit |
1c1d7e |
// + reimplements
|
|
Packit |
1c1d7e |
// + reimplementedBy
|
|
Packit |
1c1d7e |
// + exceptions
|
|
Packit |
1c1d7e |
// + const/volatile specifiers
|
|
Packit |
1c1d7e |
// - examples
|
|
Packit |
1c1d7e |
// + source definition
|
|
Packit |
1c1d7e |
// + source references
|
|
Packit |
1c1d7e |
// + source referenced by
|
|
Packit |
1c1d7e |
// - body code
|
|
Packit |
1c1d7e |
// + template arguments
|
|
Packit |
1c1d7e |
// (templateArguments(), definitionTemplateParameterLists())
|
|
Packit |
1c1d7e |
// - call graph
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
// enum values are written as part of the enum
|
|
Packit |
1c1d7e |
if (md->memberType()==MemberType_EnumValue) return;
|
|
Packit |
1c1d7e |
if (md->isHidden()) return;
|
|
Packit |
1c1d7e |
//if (md->name().at(0)=='@') return; // anonymous member
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
// group members are only visible in their group
|
|
Packit |
1c1d7e |
//if (def->definitionType()!=Definition::TypeGroup && md->getGroupDef()) return;
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
QCString memType;
|
|
Packit |
1c1d7e |
bool isFunc=FALSE;
|
|
Packit |
1c1d7e |
switch (md->memberType())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
case MemberType_Define: memType="define"; break;
|
|
Packit |
1c1d7e |
case MemberType_Function: memType="function"; isFunc=TRUE; break;
|
|
Packit |
1c1d7e |
case MemberType_Variable: memType="variable"; break;
|
|
Packit |
1c1d7e |
case MemberType_Typedef: memType="typedef"; break;
|
|
Packit |
1c1d7e |
case MemberType_Enumeration: memType="enum"; break;
|
|
Packit |
1c1d7e |
case MemberType_EnumValue: ASSERT(0); break;
|
|
Packit |
1c1d7e |
case MemberType_Signal: memType="signal"; isFunc=TRUE; break;
|
|
Packit |
1c1d7e |
case MemberType_Slot: memType="slot"; isFunc=TRUE; break;
|
|
Packit |
1c1d7e |
case MemberType_Friend: memType="friend"; isFunc=TRUE; break;
|
|
Packit |
1c1d7e |
case MemberType_DCOP: memType="dcop"; isFunc=TRUE; break;
|
|
Packit |
1c1d7e |
case MemberType_Property: memType="property"; break;
|
|
Packit |
1c1d7e |
case MemberType_Event: memType="event"; break;
|
|
Packit |
1c1d7e |
case MemberType_Interface: memType="interface"; break;
|
|
Packit |
1c1d7e |
case MemberType_Service: memType="service"; break;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
ti << "
|
|
Packit |
1c1d7e |
<< "_1" << md->anchor() << "\" kind=\"" << memType << "\"><name>"
|
|
Packit |
1c1d7e |
<< convertToXML(md->name()) << "</name></member>" << endl;
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
QCString scopeName;
|
|
Packit |
1c1d7e |
if (md->getClassDef())
|
|
Packit |
1c1d7e |
scopeName=md->getClassDef()->name();
|
|
Packit |
1c1d7e |
else if (md->getNamespaceDef())
|
|
Packit |
1c1d7e |
scopeName=md->getNamespaceDef()->name();
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
t << "
|
|
Packit |
1c1d7e |
//enum { define_t,variable_t,typedef_t,enum_t,function_t } xmlType = function_t;
|
|
Packit |
1c1d7e |
t << memType << "\" id=\"";
|
|
Packit |
1c1d7e |
if (md->getGroupDef() && def->definitionType()==Definition::TypeGroup)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
t << md->getGroupDef()->getOutputFileBase();
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
t << memberOutputFileBase(md);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
t << "_1" // encoded `:' character (see util.cpp:convertNameToFile)
|
|
Packit |
1c1d7e |
<< md->anchor();
|
|
Packit |
1c1d7e |
t << "\" prot=\"";
|
|
Packit |
1c1d7e |
switch(md->protection())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
case Public: t << "public"; break;
|
|
Packit |
1c1d7e |
case Protected: t << "protected"; break;
|
|
Packit |
1c1d7e |
case Private: t << "private"; break;
|
|
Packit |
1c1d7e |
case Package: t << "package"; break;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
t << "\"";
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
t << " static=\"";
|
|
Packit |
1c1d7e |
if (md->isStatic()) t << "yes"; else t << "no";
|
|
Packit |
1c1d7e |
t << "\"";
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
if (isFunc)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
ArgumentList *al = md->argumentList();
|
|
Packit |
1c1d7e |
t << " const=\"";
|
|
Packit |
1c1d7e |
if (al!=0 && al->constSpecifier) t << "yes"; else t << "no";
|
|
Packit |
1c1d7e |
t << "\"";
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
t << " explicit=\"";
|
|
Packit |
1c1d7e |
if (md->isExplicit()) t << "yes"; else t << "no";
|
|
Packit |
1c1d7e |
t << "\"";
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
t << " inline=\"";
|
|
Packit |
1c1d7e |
if (md->isInline()) t << "yes"; else t << "no";
|
|
Packit |
1c1d7e |
t << "\"";
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
if (al!=0 && al->refQualifier!=RefQualifierNone)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
t << " refqual=\"";
|
|
Packit |
1c1d7e |
if (al->refQualifier==RefQualifierLValue) t << "lvalue"; else t << "rvalue";
|
|
Packit |
1c1d7e |
t << "\"";
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
if (md->isFinal())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
t << " final=\"yes\"";
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
if (md->isSealed())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
t << " sealed=\"yes\"";
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
if (md->isNew())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
t << " new=\"yes\"";
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
if (md->isOptional())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
t << " optional=\"yes\"";
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
if (md->isRequired())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
t << " required=\"yes\"";
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
if (al && al->volatileSpecifier)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
t << " volatile=\"yes\"";
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
t << " virt=\"";
|
|
Packit |
1c1d7e |
switch (md->virtualness())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
case Normal: t << "non-virtual"; break;
|
|
Packit |
1c1d7e |
case Virtual: t << "virtual"; break;
|
|
Packit |
1c1d7e |
case Pure: t << "pure-virtual"; break;
|
|
Packit |
1c1d7e |
default: ASSERT(0);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
t << "\"";
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
if (md->memberType() == MemberType_Enumeration)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
t << " strong=\"";
|
|
Packit |
1c1d7e |
if (md->isStrong()) t << "yes"; else t << "no";
|
|
Packit |
1c1d7e |
t << "\"";
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
if (md->memberType() == MemberType_Variable)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
//ArgumentList *al = md->argumentList();
|
|
Packit |
1c1d7e |
//t << " volatile=\"";
|
|
Packit |
1c1d7e |
//if (al && al->volatileSpecifier) t << "yes"; else t << "no";
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
t << " mutable=\"";
|
|
Packit |
1c1d7e |
if (md->isMutable()) t << "yes"; else t << "no";
|
|
Packit |
1c1d7e |
t << "\"";
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
if (md->isInitonly())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
t << " initonly=\"yes\"";
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
if (md->isAttribute())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
t << " attribute=\"yes\"";
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
if (md->isUNOProperty())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
t << " property=\"yes\"";
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
if (md->isReadonly())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
t << " readonly=\"yes\"";
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
if (md->isBound())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
t << " bound=\"yes\"";
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
if (md->isRemovable())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
t << " removable=\"yes\"";
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
if (md->isConstrained())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
t << " constrained=\"yes\"";
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
if (md->isTransient())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
t << " transient=\"yes\"";
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
if (md->isMaybeVoid())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
t << " maybevoid=\"yes\"";
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
if (md->isMaybeDefault())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
t << " maybedefault=\"yes\"";
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
if (md->isMaybeAmbiguous())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
t << " maybeambiguous=\"yes\"";
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else if (md->memberType() == MemberType_Property)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
t << " readable=\"";
|
|
Packit |
1c1d7e |
if (md->isReadable()) t << "yes"; else t << "no";
|
|
Packit |
1c1d7e |
t << "\"";
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
t << " writable=\"";
|
|
Packit |
1c1d7e |
if (md->isWritable()) t << "yes"; else t << "no";
|
|
Packit |
1c1d7e |
t << "\"";
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
t << " gettable=\"";
|
|
Packit |
1c1d7e |
if (md->isGettable()) t << "yes"; else t << "no";
|
|
Packit |
1c1d7e |
t << "\"";
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
t << " privategettable=\"";
|
|
Packit |
1c1d7e |
if (md->isPrivateGettable()) t << "yes"; else t << "no";
|
|
Packit |
1c1d7e |
t << "\"";
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
t << " protectedgettable=\"";
|
|
Packit |
1c1d7e |
if (md->isProtectedGettable()) t << "yes"; else t << "no";
|
|
Packit |
1c1d7e |
t << "\"";
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
t << " settable=\"";
|
|
Packit |
1c1d7e |
if (md->isSettable()) t << "yes"; else t << "no";
|
|
Packit |
1c1d7e |
t << "\"";
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
t << " privatesettable=\"";
|
|
Packit |
1c1d7e |
if (md->isPrivateSettable()) t << "yes"; else t << "no";
|
|
Packit |
1c1d7e |
t << "\"";
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
t << " protectedsettable=\"";
|
|
Packit |
1c1d7e |
if (md->isProtectedSettable()) t << "yes"; else t << "no";
|
|
Packit |
1c1d7e |
t << "\"";
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
if (md->isAssign() || md->isCopy() || md->isRetain() || md->isStrong() || md->isWeak())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
t << " accessor=\"";
|
|
Packit |
1c1d7e |
if (md->isAssign()) t << "assign";
|
|
Packit |
1c1d7e |
else if (md->isCopy()) t << "copy";
|
|
Packit |
1c1d7e |
else if (md->isRetain()) t << "retain";
|
|
Packit |
1c1d7e |
else if (md->isStrong()) t << "strong";
|
|
Packit |
1c1d7e |
else if (md->isWeak()) t << "weak";
|
|
Packit |
1c1d7e |
t << "\"";
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else if (md->memberType() == MemberType_Event)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
t << " add=\"";
|
|
Packit |
1c1d7e |
if (md->isAddable()) t << "yes"; else t << "no";
|
|
Packit |
1c1d7e |
t << "\"";
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
t << " remove=\"";
|
|
Packit |
1c1d7e |
if (md->isRemovable()) t << "yes"; else t << "no";
|
|
Packit |
1c1d7e |
t << "\"";
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
t << " raise=\"";
|
|
Packit |
1c1d7e |
if (md->isRaisable()) t << "yes"; else t << "no";
|
|
Packit |
1c1d7e |
t << "\"";
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
t << ">" << endl;
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
if (md->memberType()!=MemberType_Define &&
|
|
Packit |
1c1d7e |
md->memberType()!=MemberType_Enumeration
|
|
Packit |
1c1d7e |
)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
writeMemberTemplateLists(md,t);
|
|
Packit |
1c1d7e |
QCString typeStr = md->typeString(); //replaceAnonymousScopes(md->typeString());
|
|
Packit |
1c1d7e |
stripQualifiers(typeStr);
|
|
Packit |
1c1d7e |
t << " <type>";
|
|
Packit |
1c1d7e |
linkifyText(TextGeneratorXMLImpl(t),def,md->getBodyDef(),md,typeStr);
|
|
Packit |
1c1d7e |
t << "</type>" << endl;
|
|
Packit |
1c1d7e |
t << " <definition>" << convertToXML(md->definition()) << "</definition>" << endl;
|
|
Packit |
1c1d7e |
t << " <argsstring>" << convertToXML(md->argsString()) << "</argsstring>" << endl;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
if (md->memberType() == MemberType_Enumeration)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
t << " <type>";
|
|
Packit |
1c1d7e |
linkifyText(TextGeneratorXMLImpl(t),def,md->getBodyDef(),md,md->enumBaseType());
|
|
Packit |
1c1d7e |
t << "</type>" << endl;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
t << " <name>" << convertToXML(md->name()) << "</name>" << endl;
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
if (md->memberType() == MemberType_Property)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (md->isReadable())
|
|
Packit |
1c1d7e |
t << " <read>" << convertToXML(md->getReadAccessor()) << "</read>" << endl;
|
|
Packit |
1c1d7e |
if (md->isWritable())
|
|
Packit |
1c1d7e |
t << " <write>" << convertToXML(md->getWriteAccessor()) << "</write>" << endl;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
if (md->memberType()==MemberType_Variable && md->bitfieldString())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
QCString bitfield = md->bitfieldString();
|
|
Packit |
1c1d7e |
if (bitfield.at(0)==':') bitfield=bitfield.mid(1);
|
|
Packit |
1c1d7e |
t << " <bitfield>" << convertToXML(bitfield) << "</bitfield>" << endl;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
MemberDef *rmd = md->reimplements();
|
|
Packit |
1c1d7e |
if (rmd)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
t << "
|
|
Packit |
1c1d7e |
<< memberOutputFileBase(rmd) << "_1" << rmd->anchor() << "\">"
|
|
Packit |
1c1d7e |
<< convertToXML(rmd->name()) << "</reimplements>" << endl;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
MemberList *rbml = md->reimplementedBy();
|
|
Packit |
1c1d7e |
if (rbml)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
MemberListIterator mli(*rbml);
|
|
Packit |
1c1d7e |
for (mli.toFirst();(rmd=mli.current());++mli)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
t << "
|
|
Packit |
1c1d7e |
<< memberOutputFileBase(rmd) << "_1" << rmd->anchor() << "\">"
|
|
Packit |
1c1d7e |
<< convertToXML(rmd->name()) << "</reimplementedby>" << endl;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
if (isFunc) //function
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
ArgumentList *declAl = md->declArgumentList();
|
|
Packit |
1c1d7e |
ArgumentList *defAl = md->argumentList();
|
|
Packit |
1c1d7e |
if (declAl && defAl && declAl->count()>0)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
ArgumentListIterator declAli(*declAl);
|
|
Packit |
1c1d7e |
ArgumentListIterator defAli(*defAl);
|
|
Packit |
1c1d7e |
Argument *a;
|
|
Packit |
1c1d7e |
for (declAli.toFirst();(a=declAli.current());++declAli)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
Argument *defArg = defAli.current();
|
|
Packit |
1c1d7e |
t << " <param>" << endl;
|
|
Packit |
1c1d7e |
if (!a->attrib.isEmpty())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
t << " <attributes>";
|
|
Packit |
1c1d7e |
writeXMLString(t,a->attrib);
|
|
Packit |
1c1d7e |
t << "</attributes>" << endl;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
if (!a->type.isEmpty())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
t << " <type>";
|
|
Packit |
1c1d7e |
linkifyText(TextGeneratorXMLImpl(t),def,md->getBodyDef(),md,a->type);
|
|
Packit |
1c1d7e |
t << "</type>" << endl;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
if (!a->name.isEmpty())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
t << " <declname>";
|
|
Packit |
1c1d7e |
writeXMLString(t,a->name);
|
|
Packit |
1c1d7e |
t << "</declname>" << endl;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
if (defArg && !defArg->name.isEmpty() && defArg->name!=a->name)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
t << " <defname>";
|
|
Packit |
1c1d7e |
writeXMLString(t,defArg->name);
|
|
Packit |
1c1d7e |
t << "</defname>" << endl;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
if (!a->array.isEmpty())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
t << " <array>";
|
|
Packit |
1c1d7e |
writeXMLString(t,a->array);
|
|
Packit |
1c1d7e |
t << "</array>" << endl;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
if (!a->defval.isEmpty())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
t << " <defval>";
|
|
Packit |
1c1d7e |
linkifyText(TextGeneratorXMLImpl(t),def,md->getBodyDef(),md,a->defval);
|
|
Packit |
1c1d7e |
t << "</defval>" << endl;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
if (defArg && defArg->hasDocumentation())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
t << " <briefdescription>";
|
|
Packit |
1c1d7e |
writeXMLDocBlock(t,md->getDefFileName(),md->getDefLine(),
|
|
Packit |
1c1d7e |
md->getOuterScope(),md,defArg->docs);
|
|
Packit |
1c1d7e |
t << "</briefdescription>" << endl;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
t << " </param>" << endl;
|
|
Packit |
1c1d7e |
if (defArg) ++defAli;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else if (md->memberType()==MemberType_Define &&
|
|
Packit |
1c1d7e |
md->argsString()) // define
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (md->argumentList()->count()==0) // special case for "foo()" to
|
|
Packit |
1c1d7e |
// disguish it from "foo".
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
t << " <param></param>" << endl;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
ArgumentListIterator ali(*md->argumentList());
|
|
Packit |
1c1d7e |
Argument *a;
|
|
Packit |
1c1d7e |
for (ali.toFirst();(a=ali.current());++ali)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
t << " <param><defname>" << a->type << "</defname></param>" << endl;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
if (md->hasOneLineInitializer() || md->hasMultiLineInitializer())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
t << " <initializer>";
|
|
Packit |
1c1d7e |
linkifyText(TextGeneratorXMLImpl(t),def,md->getBodyDef(),md,md->initializer());
|
|
Packit |
1c1d7e |
t << "</initializer>" << endl;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
if (md->excpString())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
t << " <exceptions>";
|
|
Packit |
1c1d7e |
linkifyText(TextGeneratorXMLImpl(t),def,md->getBodyDef(),md,md->excpString());
|
|
Packit |
1c1d7e |
t << "</exceptions>" << endl;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
if (md->memberType()==MemberType_Enumeration) // enum
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
MemberList *enumFields = md->enumFieldList();
|
|
Packit |
1c1d7e |
if (enumFields)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
MemberListIterator emli(*enumFields);
|
|
Packit |
1c1d7e |
MemberDef *emd;
|
|
Packit |
1c1d7e |
for (emli.toFirst();(emd=emli.current());++emli)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
ti << "
|
|
Packit |
1c1d7e |
<< "_1" << emd->anchor() << "\" kind=\"enumvalue\"><name>"
|
|
Packit |
1c1d7e |
<< convertToXML(emd->name()) << "</name></member>" << endl;
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
t << "
|
|
Packit |
1c1d7e |
<< emd->anchor() << "\" prot=\"";
|
|
Packit |
1c1d7e |
switch (emd->protection())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
case Public: t << "public"; break;
|
|
Packit |
1c1d7e |
case Protected: t << "protected"; break;
|
|
Packit |
1c1d7e |
case Private: t << "private"; break;
|
|
Packit |
1c1d7e |
case Package: t << "package"; break;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
t << "\">" << endl;
|
|
Packit |
1c1d7e |
t << " <name>";
|
|
Packit |
1c1d7e |
writeXMLString(t,emd->name());
|
|
Packit |
1c1d7e |
t << "</name>" << endl;
|
|
Packit |
1c1d7e |
if (!emd->initializer().isEmpty())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
t << " <initializer>";
|
|
Packit |
1c1d7e |
writeXMLString(t,emd->initializer());
|
|
Packit |
1c1d7e |
t << "</initializer>" << endl;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
t << " <briefdescription>" << endl;
|
|
Packit |
1c1d7e |
writeXMLDocBlock(t,emd->briefFile(),emd->briefLine(),emd->getOuterScope(),emd,emd->briefDescription());
|
|
Packit |
1c1d7e |
t << " </briefdescription>" << endl;
|
|
Packit |
1c1d7e |
t << " <detaileddescription>" << endl;
|
|
Packit |
1c1d7e |
writeXMLDocBlock(t,emd->docFile(),emd->docLine(),emd->getOuterScope(),emd,emd->documentation());
|
|
Packit |
1c1d7e |
t << " </detaileddescription>" << endl;
|
|
Packit |
1c1d7e |
t << " </enumvalue>" << endl;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
t << " <briefdescription>" << endl;
|
|
Packit |
1c1d7e |
writeXMLDocBlock(t,md->briefFile(),md->briefLine(),md->getOuterScope(),md,md->briefDescription());
|
|
Packit |
1c1d7e |
t << " </briefdescription>" << endl;
|
|
Packit |
1c1d7e |
t << " <detaileddescription>" << endl;
|
|
Packit |
1c1d7e |
writeXMLDocBlock(t,md->docFile(),md->docLine(),md->getOuterScope(),md,md->documentation());
|
|
Packit |
1c1d7e |
t << " </detaileddescription>" << endl;
|
|
Packit |
1c1d7e |
t << " <inbodydescription>" << endl;
|
|
Packit |
1c1d7e |
writeXMLDocBlock(t,md->docFile(),md->inbodyLine(),md->getOuterScope(),md,md->inbodyDocumentation());
|
|
Packit |
1c1d7e |
t << " </inbodydescription>" << endl;
|
|
Packit |
1c1d7e |
if (md->getDefLine()!=-1)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
t << "
|
|
Packit |
1c1d7e |
<< stripFromPath(md->getDefFileName()) << "\" line=\""
|
|
Packit |
1c1d7e |
<< md->getDefLine() << "\"" << " column=\""
|
|
Packit |
1c1d7e |
<< md->getDefColumn() << "\"" ;
|
|
Packit |
1c1d7e |
if (md->getStartBodyLine()!=-1)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
FileDef *bodyDef = md->getBodyDef();
|
|
Packit |
1c1d7e |
if (bodyDef)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
t << " bodyfile=\"" << stripFromPath(bodyDef->absFilePath()) << "\"";
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
t << " bodystart=\"" << md->getStartBodyLine() << "\" bodyend=\""
|
|
Packit |
1c1d7e |
<< md->getEndBodyLine() << "\"";
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
t << "/>" << endl;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
//printf("md->getReferencesMembers()=%p\n",md->getReferencesMembers());
|
|
Packit |
1c1d7e |
MemberSDict *mdict = md->getReferencesMembers();
|
|
Packit |
1c1d7e |
if (mdict)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
MemberSDict::Iterator mdi(*mdict);
|
|
Packit |
1c1d7e |
MemberDef *rmd;
|
|
Packit |
1c1d7e |
for (mdi.toFirst();(rmd=mdi.current());++mdi)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
writeMemberReference(t,def,rmd,"references");
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
mdict = md->getReferencedByMembers();
|
|
Packit |
1c1d7e |
if (mdict)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
MemberSDict::Iterator mdi(*mdict);
|
|
Packit |
1c1d7e |
MemberDef *rmd;
|
|
Packit |
1c1d7e |
for (mdi.toFirst();(rmd=mdi.current());++mdi)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
writeMemberReference(t,def,rmd,"referencedby");
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
t << " </memberdef>" << endl;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
static void generateXMLSection(Definition *d,FTextStream &ti,FTextStream &t,
|
|
Packit |
1c1d7e |
MemberList *ml,const char *kind,const char *header=0,
|
|
Packit |
1c1d7e |
const char *documentation=0)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (ml==0) return;
|
|
Packit |
1c1d7e |
MemberListIterator mli(*ml);
|
|
Packit |
1c1d7e |
MemberDef *md;
|
|
Packit |
1c1d7e |
int count=0;
|
|
Packit |
1c1d7e |
for (mli.toFirst();(md=mli.current());++mli)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
// namespace members are also inserted in the file scope, but
|
|
Packit |
1c1d7e |
// to prevent this duplication in the XML output, we filter those here.
|
|
Packit |
1c1d7e |
if (d->definitionType()!=Definition::TypeFile || md->getNamespaceDef()==0)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
count++;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
if (count==0) return; // empty list
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
t << " <sectiondef kind=\"" << kind << "\">" << endl;
|
|
Packit |
1c1d7e |
if (header)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
t << " <header>" << convertToXML(header) << "</header>" << endl;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
if (documentation)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
t << " <description>";
|
|
Packit |
1c1d7e |
writeXMLDocBlock(t,d->docFile(),d->docLine(),d,0,documentation);
|
|
Packit |
1c1d7e |
t << "</description>" << endl;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
for (mli.toFirst();(md=mli.current());++mli)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
// namespace members are also inserted in the file scope, but
|
|
Packit |
1c1d7e |
// to prevent this duplication in the XML output, we filter those here.
|
|
Packit |
1c1d7e |
if (d->definitionType()!=Definition::TypeFile || md->getNamespaceDef()==0)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
generateXMLForMember(md,ti,t,d);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
t << " </sectiondef>" << endl;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
static void writeListOfAllMembers(ClassDef *cd,FTextStream &t)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
t << " <listofallmembers>" << endl;
|
|
Packit |
1c1d7e |
if (cd->memberNameInfoSDict())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
MemberNameInfoSDict::Iterator mnii(*cd->memberNameInfoSDict());
|
|
Packit |
1c1d7e |
MemberNameInfo *mni;
|
|
Packit |
1c1d7e |
for (mnii.toFirst();(mni=mnii.current());++mnii)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
MemberNameInfoIterator mii(*mni);
|
|
Packit |
1c1d7e |
MemberInfo *mi;
|
|
Packit |
1c1d7e |
for (mii.toFirst();(mi=mii.current());++mii)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
MemberDef *md=mi->memberDef;
|
|
Packit |
1c1d7e |
if (md->name().at(0)!='@') // skip anonymous members
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
Protection prot = mi->prot;
|
|
Packit |
1c1d7e |
Specifier virt=md->virtualness();
|
|
Packit |
1c1d7e |
t << "
|
|
Packit |
1c1d7e |
md->anchor() << "\" prot=\"";
|
|
Packit |
1c1d7e |
switch (prot)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
case Public: t << "public"; break;
|
|
Packit |
1c1d7e |
case Protected: t << "protected"; break;
|
|
Packit |
1c1d7e |
case Private: t << "private"; break;
|
|
Packit |
1c1d7e |
case Package: t << "package"; break;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
t << "\" virt=\"";
|
|
Packit |
1c1d7e |
switch(virt)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
case Normal: t << "non-virtual"; break;
|
|
Packit |
1c1d7e |
case Virtual: t << "virtual"; break;
|
|
Packit |
1c1d7e |
case Pure: t << "pure-virtual"; break;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
t << "\"";
|
|
Packit |
1c1d7e |
if (!mi->ambiguityResolutionScope.isEmpty())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
t << " ambiguityscope=\"" << convertToXML(mi->ambiguityResolutionScope) << "\"";
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
t << "><scope>" << convertToXML(cd->name()) << "</scope><name>" <<
|
|
Packit |
1c1d7e |
convertToXML(md->name()) << "</name></member>" << endl;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
t << " </listofallmembers>" << endl;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
static void writeInnerClasses(const ClassSDict *cl,FTextStream &t)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (cl)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
ClassSDict::Iterator cli(*cl);
|
|
Packit |
1c1d7e |
ClassDef *cd;
|
|
Packit |
1c1d7e |
for (cli.toFirst();(cd=cli.current());++cli)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (!cd->isHidden() && cd->name().find('@')==-1) // skip anonymous scopes
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
t << "
|
|
Packit |
1c1d7e |
<< "\" prot=\"";
|
|
Packit |
1c1d7e |
switch(cd->protection())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
case Public: t << "public"; break;
|
|
Packit |
1c1d7e |
case Protected: t << "protected"; break;
|
|
Packit |
1c1d7e |
case Private: t << "private"; break;
|
|
Packit |
1c1d7e |
case Package: t << "package"; break;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
t << "\">" << convertToXML(cd->name()) << "</innerclass>" << endl;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
static void writeInnerNamespaces(const NamespaceSDict *nl,FTextStream &t)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (nl)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
NamespaceSDict::Iterator nli(*nl);
|
|
Packit |
1c1d7e |
NamespaceDef *nd;
|
|
Packit |
1c1d7e |
for (nli.toFirst();(nd=nli.current());++nli)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (!nd->isHidden() && nd->name().find('@')==-1) // skip anonymouse scopes
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
t << " <innernamespace refid=\"" << nd->getOutputFileBase()
|
|
Packit |
1c1d7e |
<< "\">" << convertToXML(nd->name()) << "</innernamespace>" << endl;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
static void writeInnerFiles(const FileList *fl,FTextStream &t)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (fl)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
QListIterator<FileDef> fli(*fl);
|
|
Packit |
1c1d7e |
FileDef *fd;
|
|
Packit |
1c1d7e |
for (fli.toFirst();(fd=fli.current());++fli)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
t << " <innerfile refid=\"" << fd->getOutputFileBase()
|
|
Packit |
1c1d7e |
<< "\">" << convertToXML(fd->name()) << "</innerfile>" << endl;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
static void writeInnerPages(const PageSDict *pl,FTextStream &t)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (pl)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
PageSDict::Iterator pli(*pl);
|
|
Packit |
1c1d7e |
PageDef *pd;
|
|
Packit |
1c1d7e |
for (pli.toFirst();(pd=pli.current());++pli)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
t << " <innerpage refid=\"" << pd->getOutputFileBase();
|
|
Packit |
1c1d7e |
if (pd->getGroupDef())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
t << "_" << pd->name();
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
t << "\">" << convertToXML(pd->title()) << "</innerpage>" << endl;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
static void writeInnerGroups(const GroupList *gl,FTextStream &t)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (gl)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
GroupListIterator gli(*gl);
|
|
Packit |
1c1d7e |
GroupDef *sgd;
|
|
Packit |
1c1d7e |
for (gli.toFirst();(sgd=gli.current());++gli)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
t << " <innergroup refid=\"" << sgd->getOutputFileBase()
|
|
Packit |
1c1d7e |
<< "\">" << convertToXML(sgd->groupTitle())
|
|
Packit |
1c1d7e |
<< "</innergroup>" << endl;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
static void writeInnerDirs(const DirList *dl,FTextStream &t)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (dl)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
QListIterator<DirDef> subdirs(*dl);
|
|
Packit |
1c1d7e |
DirDef *subdir;
|
|
Packit |
1c1d7e |
for (subdirs.toFirst();(subdir=subdirs.current());++subdirs)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
t << " <innerdir refid=\"" << subdir->getOutputFileBase()
|
|
Packit |
1c1d7e |
<< "\">" << convertToXML(subdir->displayName()) << "</innerdir>" << endl;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
static void generateXMLForClass(ClassDef *cd,FTextStream &ti)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
// + brief description
|
|
Packit |
1c1d7e |
// + detailed description
|
|
Packit |
1c1d7e |
// + template argument list(s)
|
|
Packit |
1c1d7e |
// - include file
|
|
Packit |
1c1d7e |
// + member groups
|
|
Packit |
1c1d7e |
// + inheritance diagram
|
|
Packit |
1c1d7e |
// + list of direct super classes
|
|
Packit |
1c1d7e |
// + list of direct sub classes
|
|
Packit |
1c1d7e |
// + list of inner classes
|
|
Packit |
1c1d7e |
// + collaboration diagram
|
|
Packit |
1c1d7e |
// + list of all members
|
|
Packit |
1c1d7e |
// + user defined member sections
|
|
Packit |
1c1d7e |
// + standard member sections
|
|
Packit |
1c1d7e |
// + detailed member documentation
|
|
Packit |
1c1d7e |
// - examples using the class
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
if (cd->isReference()) return; // skip external references.
|
|
Packit |
1c1d7e |
if (cd->isHidden()) return; // skip hidden classes.
|
|
Packit |
1c1d7e |
if (cd->name().find('@')!=-1) return; // skip anonymous compounds.
|
|
Packit |
1c1d7e |
if (cd->templateMaster()!=0) return; // skip generated template instances.
|
|
Packit |
1c1d7e |
if (cd->isArtificial()) return; // skip artificially created classes
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
msg("Generating XML output for class %s\n",cd->name().data());
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
ti << "
|
|
Packit |
1c1d7e |
<< "\" kind=\"" << cd->compoundTypeString()
|
|
Packit |
1c1d7e |
<< "\"><name>" << convertToXML(cd->name()) << "</name>" << endl;
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
QCString outputDirectory = Config_getString(XML_OUTPUT);
|
|
Packit |
1c1d7e |
QCString fileName=outputDirectory+"/"+ classOutputFileBase(cd)+".xml";
|
|
Packit |
1c1d7e |
QFile f(fileName);
|
|
Packit |
1c1d7e |
if (!f.open(IO_WriteOnly))
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
err("Cannot open file %s for writing!\n",fileName.data());
|
|
Packit |
1c1d7e |
return;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
FTextStream t(&f);
|
|
Packit |
1c1d7e |
//t.setEncoding(FTextStream::UnicodeUTF8);
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
writeXMLHeader(t);
|
|
Packit |
1c1d7e |
t << "
|
|
Packit |
1c1d7e |
<< classOutputFileBase(cd) << "\" kind=\""
|
|
Packit |
1c1d7e |
<< cd->compoundTypeString() << "\" language=\""
|
|
Packit |
1c1d7e |
<< langToString(cd->getLanguage()) << "\" prot=\"";
|
|
Packit |
1c1d7e |
switch (cd->protection())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
case Public: t << "public"; break;
|
|
Packit |
1c1d7e |
case Protected: t << "protected"; break;
|
|
Packit |
1c1d7e |
case Private: t << "private"; break;
|
|
Packit |
1c1d7e |
case Package: t << "package"; break;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
if (cd->isFinal()) t << "\" final=\"yes";
|
|
Packit |
1c1d7e |
if (cd->isSealed()) t << "\" sealed=\"yes";
|
|
Packit |
1c1d7e |
if (cd->isAbstract()) t << "\" abstract=\"yes";
|
|
Packit |
1c1d7e |
t << "\">" << endl;
|
|
Packit |
1c1d7e |
t << " <compoundname>";
|
|
Packit |
1c1d7e |
writeXMLString(t,cd->name());
|
|
Packit |
1c1d7e |
t << "</compoundname>" << endl;
|
|
Packit |
1c1d7e |
if (cd->baseClasses())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
BaseClassListIterator bcli(*cd->baseClasses());
|
|
Packit |
1c1d7e |
BaseClassDef *bcd;
|
|
Packit |
1c1d7e |
for (bcli.toFirst();(bcd=bcli.current());++bcli)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
t << "
|
|
Packit |
1c1d7e |
if (bcd->classDef->isLinkable())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
t << "refid=\"" << classOutputFileBase(bcd->classDef) << "\" ";
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
t << "prot=\"";
|
|
Packit |
1c1d7e |
switch (bcd->prot)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
case Public: t << "public"; break;
|
|
Packit |
1c1d7e |
case Protected: t << "protected"; break;
|
|
Packit |
1c1d7e |
case Private: t << "private"; break;
|
|
Packit |
1c1d7e |
case Package: ASSERT(0); break;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
t << "\" virt=\"";
|
|
Packit |
1c1d7e |
switch(bcd->virt)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
case Normal: t << "non-virtual"; break;
|
|
Packit |
1c1d7e |
case Virtual: t << "virtual"; break;
|
|
Packit |
1c1d7e |
case Pure: t <<"pure-virtual"; break;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
t << "\">";
|
|
Packit |
1c1d7e |
if (!bcd->templSpecifiers.isEmpty())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
t << convertToXML(
|
|
Packit |
1c1d7e |
insertTemplateSpecifierInScope(
|
|
Packit |
1c1d7e |
bcd->classDef->name(),bcd->templSpecifiers)
|
|
Packit |
1c1d7e |
);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
t << convertToXML(bcd->classDef->displayName());
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
t << "</basecompoundref>" << endl;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
if (cd->subClasses())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
BaseClassListIterator bcli(*cd->subClasses());
|
|
Packit |
1c1d7e |
BaseClassDef *bcd;
|
|
Packit |
1c1d7e |
for (bcli.toFirst();(bcd=bcli.current());++bcli)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
t << "
|
|
Packit |
1c1d7e |
<< classOutputFileBase(bcd->classDef)
|
|
Packit |
1c1d7e |
<< "\" prot=\"";
|
|
Packit |
1c1d7e |
switch (bcd->prot)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
case Public: t << "public"; break;
|
|
Packit |
1c1d7e |
case Protected: t << "protected"; break;
|
|
Packit |
1c1d7e |
case Private: t << "private"; break;
|
|
Packit |
1c1d7e |
case Package: ASSERT(0); break;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
t << "\" virt=\"";
|
|
Packit |
1c1d7e |
switch(bcd->virt)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
case Normal: t << "non-virtual"; break;
|
|
Packit |
1c1d7e |
case Virtual: t << "virtual"; break;
|
|
Packit |
1c1d7e |
case Pure: t << "pure-virtual"; break;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
t << "\">" << convertToXML(bcd->classDef->displayName())
|
|
Packit |
1c1d7e |
<< "</derivedcompoundref>" << endl;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
IncludeInfo *ii=cd->includeInfo();
|
|
Packit |
1c1d7e |
if (ii)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
QCString nm = ii->includeName;
|
|
Packit |
1c1d7e |
if (nm.isEmpty() && ii->fileDef) nm = ii->fileDef->docName();
|
|
Packit |
1c1d7e |
if (!nm.isEmpty())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
t << "
|
|
Packit |
1c1d7e |
if (ii->fileDef && !ii->fileDef->isReference()) // TODO: support external references
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
t << " refid=\"" << ii->fileDef->getOutputFileBase() << "\"";
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
t << " local=\"" << (ii->local ? "yes" : "no") << "\">";
|
|
Packit |
1c1d7e |
t << nm;
|
|
Packit |
1c1d7e |
t << "</includes>" << endl;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
writeInnerClasses(cd->getClassSDict(),t);
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
writeTemplateList(cd,t);
|
|
Packit |
1c1d7e |
if (cd->getMemberGroupSDict())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
MemberGroupSDict::Iterator mgli(*cd->getMemberGroupSDict());
|
|
Packit |
1c1d7e |
MemberGroup *mg;
|
|
Packit |
1c1d7e |
for (;(mg=mgli.current());++mgli)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
generateXMLSection(cd,ti,t,mg->members(),"user-defined",mg->header(),
|
|
Packit |
1c1d7e |
mg->documentation());
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
QListIterator<MemberList> mli(cd->getMemberLists());
|
|
Packit |
1c1d7e |
MemberList *ml;
|
|
Packit |
1c1d7e |
for (mli.toFirst();(ml=mli.current());++mli)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if ((ml->listType()&MemberListType_detailedLists)==0)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
generateXMLSection(cd,ti,t,ml,g_xmlSectionMapper.find(ml->listType()));
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
t << " <briefdescription>" << endl;
|
|
Packit |
1c1d7e |
writeXMLDocBlock(t,cd->briefFile(),cd->briefLine(),cd,0,cd->briefDescription());
|
|
Packit |
1c1d7e |
t << " </briefdescription>" << endl;
|
|
Packit |
1c1d7e |
t << " <detaileddescription>" << endl;
|
|
Packit |
1c1d7e |
writeXMLDocBlock(t,cd->docFile(),cd->docLine(),cd,0,cd->documentation());
|
|
Packit |
1c1d7e |
t << " </detaileddescription>" << endl;
|
|
Packit |
1c1d7e |
DotClassGraph inheritanceGraph(cd,DotNode::Inheritance);
|
|
Packit |
1c1d7e |
if (!inheritanceGraph.isTrivial())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
t << " <inheritancegraph>" << endl;
|
|
Packit |
1c1d7e |
inheritanceGraph.writeXML(t);
|
|
Packit |
1c1d7e |
t << " </inheritancegraph>" << endl;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
DotClassGraph collaborationGraph(cd,DotNode::Collaboration);
|
|
Packit |
1c1d7e |
if (!collaborationGraph.isTrivial())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
t << " <collaborationgraph>" << endl;
|
|
Packit |
1c1d7e |
collaborationGraph.writeXML(t);
|
|
Packit |
1c1d7e |
t << " </collaborationgraph>" << endl;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
t << "
|
|
Packit |
1c1d7e |
<< stripFromPath(cd->getDefFileName()) << "\" line=\""
|
|
Packit |
1c1d7e |
<< cd->getDefLine() << "\"" << " column=\""
|
|
Packit |
1c1d7e |
<< cd->getDefColumn() << "\"" ;
|
|
Packit |
1c1d7e |
if (cd->getStartBodyLine()!=-1)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
FileDef *bodyDef = cd->getBodyDef();
|
|
Packit |
1c1d7e |
if (bodyDef)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
t << " bodyfile=\"" << stripFromPath(bodyDef->absFilePath()) << "\"";
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
t << " bodystart=\"" << cd->getStartBodyLine() << "\" bodyend=\""
|
|
Packit |
1c1d7e |
<< cd->getEndBodyLine() << "\"";
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
t << "/>" << endl;
|
|
Packit |
1c1d7e |
writeListOfAllMembers(cd,t);
|
|
Packit |
1c1d7e |
t << " </compounddef>" << endl;
|
|
Packit |
1c1d7e |
t << "</doxygen>" << endl;
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
ti << " </compound>" << endl;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
static void generateXMLForNamespace(NamespaceDef *nd,FTextStream &ti)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
// + contained class definitions
|
|
Packit |
1c1d7e |
// + contained namespace definitions
|
|
Packit |
1c1d7e |
// + member groups
|
|
Packit |
1c1d7e |
// + normal members
|
|
Packit |
1c1d7e |
// + brief desc
|
|
Packit |
1c1d7e |
// + detailed desc
|
|
Packit |
1c1d7e |
// + location
|
|
Packit |
1c1d7e |
// - files containing (parts of) the namespace definition
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
if (nd->isReference() || nd->isHidden()) return; // skip external references
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
ti << " <compound refid=\"" << nd->getOutputFileBase()
|
|
Packit |
1c1d7e |
<< "\" kind=\"namespace\"" << "><name>"
|
|
Packit |
1c1d7e |
<< convertToXML(nd->name()) << "</name>" << endl;
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
QCString outputDirectory = Config_getString(XML_OUTPUT);
|
|
Packit |
1c1d7e |
QCString fileName=outputDirectory+"/"+nd->getOutputFileBase()+".xml";
|
|
Packit |
1c1d7e |
QFile f(fileName);
|
|
Packit |
1c1d7e |
if (!f.open(IO_WriteOnly))
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
err("Cannot open file %s for writing!\n",fileName.data());
|
|
Packit |
1c1d7e |
return;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
FTextStream t(&f);
|
|
Packit |
1c1d7e |
//t.setEncoding(FTextStream::UnicodeUTF8);
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
writeXMLHeader(t);
|
|
Packit |
1c1d7e |
t << " <compounddef id=\"" << nd->getOutputFileBase()
|
|
Packit |
1c1d7e |
<< "\" kind=\"namespace\" language=\""
|
|
Packit |
1c1d7e |
<< langToString(nd->getLanguage()) << "\">" << endl;
|
|
Packit |
1c1d7e |
t << " <compoundname>";
|
|
Packit |
1c1d7e |
writeXMLString(t,nd->name());
|
|
Packit |
1c1d7e |
t << "</compoundname>" << endl;
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
writeInnerClasses(nd->getClassSDict(),t);
|
|
Packit |
1c1d7e |
writeInnerNamespaces(nd->getNamespaceSDict(),t);
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
if (nd->getMemberGroupSDict())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
MemberGroupSDict::Iterator mgli(*nd->getMemberGroupSDict());
|
|
Packit |
1c1d7e |
MemberGroup *mg;
|
|
Packit |
1c1d7e |
for (;(mg=mgli.current());++mgli)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
generateXMLSection(nd,ti,t,mg->members(),"user-defined",mg->header(),
|
|
Packit |
1c1d7e |
mg->documentation());
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
QListIterator<MemberList> mli(nd->getMemberLists());
|
|
Packit |
1c1d7e |
MemberList *ml;
|
|
Packit |
1c1d7e |
for (mli.toFirst();(ml=mli.current());++mli)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if ((ml->listType()&MemberListType_declarationLists)!=0)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
generateXMLSection(nd,ti,t,ml,g_xmlSectionMapper.find(ml->listType()));
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
t << " <briefdescription>" << endl;
|
|
Packit |
1c1d7e |
writeXMLDocBlock(t,nd->briefFile(),nd->briefLine(),nd,0,nd->briefDescription());
|
|
Packit |
1c1d7e |
t << " </briefdescription>" << endl;
|
|
Packit |
1c1d7e |
t << " <detaileddescription>" << endl;
|
|
Packit |
1c1d7e |
writeXMLDocBlock(t,nd->docFile(),nd->docLine(),nd,0,nd->documentation());
|
|
Packit |
1c1d7e |
t << " </detaileddescription>" << endl;
|
|
Packit |
1c1d7e |
t << "
|
|
Packit |
1c1d7e |
<< stripFromPath(nd->getDefFileName()) << "\" line=\""
|
|
Packit |
1c1d7e |
<< nd->getDefLine() << "\"" << " column=\""
|
|
Packit |
1c1d7e |
<< nd->getDefColumn() << "\"/>" << endl ;
|
|
Packit |
1c1d7e |
t << " </compounddef>" << endl;
|
|
Packit |
1c1d7e |
t << "</doxygen>" << endl;
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
ti << " </compound>" << endl;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
static void generateXMLForFile(FileDef *fd,FTextStream &ti)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
// + includes files
|
|
Packit |
1c1d7e |
// + includedby files
|
|
Packit |
1c1d7e |
// + include graph
|
|
Packit |
1c1d7e |
// + included by graph
|
|
Packit |
1c1d7e |
// + contained class definitions
|
|
Packit |
1c1d7e |
// + contained namespace definitions
|
|
Packit |
1c1d7e |
// + member groups
|
|
Packit |
1c1d7e |
// + normal members
|
|
Packit |
1c1d7e |
// + brief desc
|
|
Packit |
1c1d7e |
// + detailed desc
|
|
Packit |
1c1d7e |
// + source code
|
|
Packit |
1c1d7e |
// + location
|
|
Packit |
1c1d7e |
// - number of lines
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
if (fd->isReference()) return; // skip external references
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
ti << " <compound refid=\"" << fd->getOutputFileBase()
|
|
Packit |
1c1d7e |
<< "\" kind=\"file\"><name>" << convertToXML(fd->name())
|
|
Packit |
1c1d7e |
<< "</name>" << endl;
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
QCString outputDirectory = Config_getString(XML_OUTPUT);
|
|
Packit |
1c1d7e |
QCString fileName=outputDirectory+"/"+fd->getOutputFileBase()+".xml";
|
|
Packit |
1c1d7e |
QFile f(fileName);
|
|
Packit |
1c1d7e |
if (!f.open(IO_WriteOnly))
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
err("Cannot open file %s for writing!\n",fileName.data());
|
|
Packit |
1c1d7e |
return;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
FTextStream t(&f);
|
|
Packit |
1c1d7e |
//t.setEncoding(FTextStream::UnicodeUTF8);
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
writeXMLHeader(t);
|
|
Packit |
1c1d7e |
t << " <compounddef id=\"" << fd->getOutputFileBase()
|
|
Packit |
1c1d7e |
<< "\" kind=\"file\" language=\""
|
|
Packit |
1c1d7e |
<< langToString(fd->getLanguage()) << "\">" << endl;
|
|
Packit |
1c1d7e |
t << " <compoundname>";
|
|
Packit |
1c1d7e |
writeXMLString(t,fd->name());
|
|
Packit |
1c1d7e |
t << "</compoundname>" << endl;
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
IncludeInfo *inc;
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
if (fd->includeFileList())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
QListIterator<IncludeInfo> ili1(*fd->includeFileList());
|
|
Packit |
1c1d7e |
for (ili1.toFirst();(inc=ili1.current());++ili1)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
t << "
|
|
Packit |
1c1d7e |
if (inc->fileDef && !inc->fileDef->isReference()) // TODO: support external references
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
t << " refid=\"" << inc->fileDef->getOutputFileBase() << "\"";
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
t << " local=\"" << (inc->local ? "yes" : "no") << "\">";
|
|
Packit |
1c1d7e |
t << inc->includeName;
|
|
Packit |
1c1d7e |
t << "</includes>" << endl;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
if (fd->includedByFileList())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
QListIterator<IncludeInfo> ili2(*fd->includedByFileList());
|
|
Packit |
1c1d7e |
for (ili2.toFirst();(inc=ili2.current());++ili2)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
t << "
|
|
Packit |
1c1d7e |
if (inc->fileDef && !inc->fileDef->isReference()) // TODO: support external references
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
t << " refid=\"" << inc->fileDef->getOutputFileBase() << "\"";
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
t << " local=\"" << (inc->local ? "yes" : "no") << "\">";
|
|
Packit |
1c1d7e |
t << inc->includeName;
|
|
Packit |
1c1d7e |
t << "</includedby>" << endl;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
DotInclDepGraph incDepGraph(fd,FALSE);
|
|
Packit |
1c1d7e |
if (!incDepGraph.isTrivial())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
t << " <incdepgraph>" << endl;
|
|
Packit |
1c1d7e |
incDepGraph.writeXML(t);
|
|
Packit |
1c1d7e |
t << " </incdepgraph>" << endl;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
DotInclDepGraph invIncDepGraph(fd,TRUE);
|
|
Packit |
1c1d7e |
if (!invIncDepGraph.isTrivial())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
t << " <invincdepgraph>" << endl;
|
|
Packit |
1c1d7e |
invIncDepGraph.writeXML(t);
|
|
Packit |
1c1d7e |
t << " </invincdepgraph>" << endl;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
if (fd->getClassSDict())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
writeInnerClasses(fd->getClassSDict(),t);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
if (fd->getNamespaceSDict())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
writeInnerNamespaces(fd->getNamespaceSDict(),t);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
if (fd->getMemberGroupSDict())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
MemberGroupSDict::Iterator mgli(*fd->getMemberGroupSDict());
|
|
Packit |
1c1d7e |
MemberGroup *mg;
|
|
Packit |
1c1d7e |
for (;(mg=mgli.current());++mgli)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
generateXMLSection(fd,ti,t,mg->members(),"user-defined",mg->header(),
|
|
Packit |
1c1d7e |
mg->documentation());
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
QListIterator<MemberList> mli(fd->getMemberLists());
|
|
Packit |
1c1d7e |
MemberList *ml;
|
|
Packit |
1c1d7e |
for (mli.toFirst();(ml=mli.current());++mli)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if ((ml->listType()&MemberListType_declarationLists)!=0)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
generateXMLSection(fd,ti,t,ml,g_xmlSectionMapper.find(ml->listType()));
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
t << " <briefdescription>" << endl;
|
|
Packit |
1c1d7e |
writeXMLDocBlock(t,fd->briefFile(),fd->briefLine(),fd,0,fd->briefDescription());
|
|
Packit |
1c1d7e |
t << " </briefdescription>" << endl;
|
|
Packit |
1c1d7e |
t << " <detaileddescription>" << endl;
|
|
Packit |
1c1d7e |
writeXMLDocBlock(t,fd->docFile(),fd->docLine(),fd,0,fd->documentation());
|
|
Packit |
1c1d7e |
t << " </detaileddescription>" << endl;
|
|
Packit |
1c1d7e |
if (Config_getBool(XML_PROGRAMLISTING))
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
t << " <programlisting>" << endl;
|
|
Packit |
1c1d7e |
writeXMLCodeBlock(t,fd);
|
|
Packit |
1c1d7e |
t << " </programlisting>" << endl;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
t << " <location file=\"" << stripFromPath(fd->getDefFileName()) << "\"/>" << endl;
|
|
Packit |
1c1d7e |
t << " </compounddef>" << endl;
|
|
Packit |
1c1d7e |
t << "</doxygen>" << endl;
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
ti << " </compound>" << endl;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
static void generateXMLForGroup(GroupDef *gd,FTextStream &ti)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
// + members
|
|
Packit |
1c1d7e |
// + member groups
|
|
Packit |
1c1d7e |
// + files
|
|
Packit |
1c1d7e |
// + classes
|
|
Packit |
1c1d7e |
// + namespaces
|
|
Packit |
1c1d7e |
// - packages
|
|
Packit |
1c1d7e |
// + pages
|
|
Packit |
1c1d7e |
// + child groups
|
|
Packit |
1c1d7e |
// - examples
|
|
Packit |
1c1d7e |
// + brief description
|
|
Packit |
1c1d7e |
// + detailed description
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
if (gd->isReference()) return; // skip external references
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
ti << " <compound refid=\"" << gd->getOutputFileBase()
|
|
Packit |
1c1d7e |
<< "\" kind=\"group\"><name>" << convertToXML(gd->name()) << "</name>" << endl;
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
QCString outputDirectory = Config_getString(XML_OUTPUT);
|
|
Packit |
1c1d7e |
QCString fileName=outputDirectory+"/"+gd->getOutputFileBase()+".xml";
|
|
Packit |
1c1d7e |
QFile f(fileName);
|
|
Packit |
1c1d7e |
if (!f.open(IO_WriteOnly))
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
err("Cannot open file %s for writing!\n",fileName.data());
|
|
Packit |
1c1d7e |
return;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
FTextStream t(&f);
|
|
Packit |
1c1d7e |
//t.setEncoding(FTextStream::UnicodeUTF8);
|
|
Packit |
1c1d7e |
writeXMLHeader(t);
|
|
Packit |
1c1d7e |
t << "
|
|
Packit |
1c1d7e |
<< gd->getOutputFileBase() << "\" kind=\"group\">" << endl;
|
|
Packit |
1c1d7e |
t << " <compoundname>" << convertToXML(gd->name()) << "</compoundname>" << endl;
|
|
Packit |
1c1d7e |
t << " <title>" << convertToXML(gd->groupTitle()) << "</title>" << endl;
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
writeInnerFiles(gd->getFiles(),t);
|
|
Packit |
1c1d7e |
writeInnerClasses(gd->getClasses(),t);
|
|
Packit |
1c1d7e |
writeInnerNamespaces(gd->getNamespaces(),t);
|
|
Packit |
1c1d7e |
writeInnerPages(gd->getPages(),t);
|
|
Packit |
1c1d7e |
writeInnerGroups(gd->getSubGroups(),t);
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
if (gd->getMemberGroupSDict())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
MemberGroupSDict::Iterator mgli(*gd->getMemberGroupSDict());
|
|
Packit |
1c1d7e |
MemberGroup *mg;
|
|
Packit |
1c1d7e |
for (;(mg=mgli.current());++mgli)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
generateXMLSection(gd,ti,t,mg->members(),"user-defined",mg->header(),
|
|
Packit |
1c1d7e |
mg->documentation());
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
QListIterator<MemberList> mli(gd->getMemberLists());
|
|
Packit |
1c1d7e |
MemberList *ml;
|
|
Packit |
1c1d7e |
for (mli.toFirst();(ml=mli.current());++mli)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if ((ml->listType()&MemberListType_declarationLists)!=0)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
generateXMLSection(gd,ti,t,ml,g_xmlSectionMapper.find(ml->listType()));
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
t << " <briefdescription>" << endl;
|
|
Packit |
1c1d7e |
writeXMLDocBlock(t,gd->briefFile(),gd->briefLine(),gd,0,gd->briefDescription());
|
|
Packit |
1c1d7e |
t << " </briefdescription>" << endl;
|
|
Packit |
1c1d7e |
t << " <detaileddescription>" << endl;
|
|
Packit |
1c1d7e |
writeXMLDocBlock(t,gd->docFile(),gd->docLine(),gd,0,gd->documentation());
|
|
Packit |
1c1d7e |
t << " </detaileddescription>" << endl;
|
|
Packit |
1c1d7e |
t << " </compounddef>" << endl;
|
|
Packit |
1c1d7e |
t << "</doxygen>" << endl;
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
ti << " </compound>" << endl;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
static void generateXMLForDir(DirDef *dd,FTextStream &ti)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (dd->isReference()) return; // skip external references
|
|
Packit |
1c1d7e |
ti << " <compound refid=\"" << dd->getOutputFileBase()
|
|
Packit |
1c1d7e |
<< "\" kind=\"dir\"><name>" << convertToXML(dd->displayName())
|
|
Packit |
1c1d7e |
<< "</name>" << endl;
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
QCString outputDirectory = Config_getString(XML_OUTPUT);
|
|
Packit |
1c1d7e |
QCString fileName=outputDirectory+"/"+dd->getOutputFileBase()+".xml";
|
|
Packit |
1c1d7e |
QFile f(fileName);
|
|
Packit |
1c1d7e |
if (!f.open(IO_WriteOnly))
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
err("Cannot open file %s for writing!\n",fileName.data());
|
|
Packit |
1c1d7e |
return;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
FTextStream t(&f);
|
|
Packit |
1c1d7e |
//t.setEncoding(FTextStream::UnicodeUTF8);
|
|
Packit |
1c1d7e |
writeXMLHeader(t);
|
|
Packit |
1c1d7e |
t << "
|
|
Packit |
1c1d7e |
<< dd->getOutputFileBase() << "\" kind=\"dir\">" << endl;
|
|
Packit |
1c1d7e |
t << " <compoundname>" << convertToXML(dd->displayName()) << "</compoundname>" << endl;
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
writeInnerDirs(&dd->subDirs(),t);
|
|
Packit |
1c1d7e |
writeInnerFiles(dd->getFiles(),t);
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
t << " <briefdescription>" << endl;
|
|
Packit |
1c1d7e |
writeXMLDocBlock(t,dd->briefFile(),dd->briefLine(),dd,0,dd->briefDescription());
|
|
Packit |
1c1d7e |
t << " </briefdescription>" << endl;
|
|
Packit |
1c1d7e |
t << " <detaileddescription>" << endl;
|
|
Packit |
1c1d7e |
writeXMLDocBlock(t,dd->docFile(),dd->docLine(),dd,0,dd->documentation());
|
|
Packit |
1c1d7e |
t << " </detaileddescription>" << endl;
|
|
Packit |
1c1d7e |
t << " <location file=\"" << stripFromPath(dd->name()) << "\"/>" << endl;
|
|
Packit |
1c1d7e |
t << " </compounddef>" << endl;
|
|
Packit |
1c1d7e |
t << "</doxygen>" << endl;
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
ti << " </compound>" << endl;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
static void generateXMLForPage(PageDef *pd,FTextStream &ti,bool isExample)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
// + name
|
|
Packit |
1c1d7e |
// + title
|
|
Packit |
1c1d7e |
// + documentation
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
const char *kindName = isExample ? "example" : "page";
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
if (pd->isReference()) return;
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
QCString pageName = pd->getOutputFileBase();
|
|
Packit |
1c1d7e |
if (pd->getGroupDef())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
pageName+=(QCString)"_"+pd->name();
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
if (pageName=="index") pageName="indexpage"; // to prevent overwriting the generated index page.
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
ti << "
|
|
Packit |
1c1d7e |
<< "\" kind=\"" << kindName << "\"><name>" << convertToXML(pd->name())
|
|
Packit |
1c1d7e |
<< "</name>" << endl;
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
QCString outputDirectory = Config_getString(XML_OUTPUT);
|
|
Packit |
1c1d7e |
QCString fileName=outputDirectory+"/"+pageName+".xml";
|
|
Packit |
1c1d7e |
QFile f(fileName);
|
|
Packit |
1c1d7e |
if (!f.open(IO_WriteOnly))
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
err("Cannot open file %s for writing!\n",fileName.data());
|
|
Packit |
1c1d7e |
return;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
FTextStream t(&f);
|
|
Packit |
1c1d7e |
//t.setEncoding(FTextStream::UnicodeUTF8);
|
|
Packit |
1c1d7e |
writeXMLHeader(t);
|
|
Packit |
1c1d7e |
t << "
|
|
Packit |
1c1d7e |
t << "\" kind=\"" << kindName << "\">" << endl;
|
|
Packit |
1c1d7e |
t << " <compoundname>" << convertToXML(pd->name())
|
|
Packit |
1c1d7e |
<< "</compoundname>" << endl;
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
if (pd==Doxygen::mainPage) // main page is special
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
QCString title;
|
|
Packit |
1c1d7e |
if (!pd->title().isEmpty() && pd->title().lower()!="notitle")
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
title = filterTitle(convertCharEntitiesToUTF8(Doxygen::mainPage->title()));
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
title = Config_getString(PROJECT_NAME);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
t << " <title>" << convertToXML(convertCharEntitiesToUTF8(title))
|
|
Packit |
1c1d7e |
<< "</title>" << endl;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
SectionInfo *si = Doxygen::sectionDict->find(pd->name());
|
|
Packit |
1c1d7e |
if (si)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
t << " <title>" << convertToXML(convertCharEntitiesToUTF8(filterTitle(si->title)))
|
|
Packit |
1c1d7e |
<< "</title>" << endl;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
writeInnerPages(pd->getSubPages(),t);
|
|
Packit |
1c1d7e |
if(pd->showToc())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
t << " <tableofcontents/>" << endl;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
t << " <briefdescription>" << endl;
|
|
Packit |
1c1d7e |
writeXMLDocBlock(t,pd->briefFile(),pd->briefLine(),pd,0,pd->briefDescription());
|
|
Packit |
1c1d7e |
t << " </briefdescription>" << endl;
|
|
Packit |
1c1d7e |
t << " <detaileddescription>" << endl;
|
|
Packit |
1c1d7e |
if (isExample)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
writeXMLDocBlock(t,pd->docFile(),pd->docLine(),pd,0,
|
|
Packit |
1c1d7e |
pd->documentation()+"\n\\include "+pd->name());
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
writeXMLDocBlock(t,pd->docFile(),pd->docLine(),pd,0,
|
|
Packit |
1c1d7e |
pd->documentation());
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
t << " </detaileddescription>" << endl;
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
t << " </compounddef>" << endl;
|
|
Packit |
1c1d7e |
t << "</doxygen>" << endl;
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
ti << " </compound>" << endl;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void generateXML()
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
// + classes
|
|
Packit |
1c1d7e |
// + namespaces
|
|
Packit |
1c1d7e |
// + files
|
|
Packit |
1c1d7e |
// + groups
|
|
Packit |
1c1d7e |
// + related pages
|
|
Packit |
1c1d7e |
// - examples
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
QCString outputDirectory = Config_getString(XML_OUTPUT);
|
|
Packit |
1c1d7e |
QDir xmlDir(outputDirectory);
|
|
Packit |
1c1d7e |
createSubDirs(xmlDir);
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
ResourceMgr::instance().copyResource("index.xsd",outputDirectory);
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
QCString fileName=outputDirectory+"/compound.xsd";
|
|
Packit |
1c1d7e |
QFile f(fileName);
|
|
Packit |
1c1d7e |
if (!f.open(IO_WriteOnly))
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
err("Cannot open file %s for writing!\n",fileName.data());
|
|
Packit |
1c1d7e |
return;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
// write compound.xsd, but replace special marker with the entities
|
|
Packit |
1c1d7e |
QCString compound_xsd = ResourceMgr::instance().getAsString("compound.xsd");
|
|
Packit |
1c1d7e |
const char *startLine = compound_xsd.data();
|
|
Packit |
1c1d7e |
while (*startLine)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
// find end of the line
|
|
Packit |
1c1d7e |
const char *endLine = startLine+1;
|
|
Packit |
1c1d7e |
while (*endLine && *(endLine-1)!='\n') endLine++; // skip to end of the line including \n
|
|
Packit |
1c1d7e |
int len=endLine-startLine;
|
|
Packit |
1c1d7e |
if (len>0)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
QCString s(len+1);
|
|
Packit |
1c1d7e |
qstrncpy(s.rawData(),startLine,len);
|
|
Packit |
1c1d7e |
s[len]='\0';
|
|
Packit |
1c1d7e |
if (s.find("")!=-1)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
FTextStream t(&f);
|
|
Packit |
1c1d7e |
HtmlEntityMapper::instance()->writeXMLSchema(t);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
f.writeBlock(startLine,len);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
startLine=endLine;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
f.close();
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
fileName=outputDirectory+"/index.xml";
|
|
Packit |
1c1d7e |
f.setName(fileName);
|
|
Packit |
1c1d7e |
if (!f.open(IO_WriteOnly))
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
err("Cannot open file %s for writing!\n",fileName.data());
|
|
Packit |
1c1d7e |
return;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
FTextStream t(&f);
|
|
Packit |
1c1d7e |
//t.setEncoding(FTextStream::UnicodeUTF8);
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
// write index header
|
|
Packit |
1c1d7e |
t << "" << endl;;
|
|
Packit |
1c1d7e |
t << "
|
|
Packit |
1c1d7e |
t << "xsi:noNamespaceSchemaLocation=\"index.xsd\" ";
|
|
Packit |
1c1d7e |
t << "version=\"" << versionString << "\">" << endl;
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
ClassSDict::Iterator cli(*Doxygen::classSDict);
|
|
Packit |
1c1d7e |
ClassDef *cd;
|
|
Packit |
1c1d7e |
for (cli.toFirst();(cd=cli.current());++cli)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
generateXMLForClass(cd,t);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
//{
|
|
Packit |
1c1d7e |
// ClassSDict::Iterator cli(Doxygen::hiddenClasses);
|
|
Packit |
1c1d7e |
// ClassDef *cd;
|
|
Packit |
1c1d7e |
// for (cli.toFirst();(cd=cli.current());++cli)
|
|
Packit |
1c1d7e |
// {
|
|
Packit |
1c1d7e |
// msg("Generating XML output for class %s\n",cd->name().data());
|
|
Packit |
1c1d7e |
// generateXMLForClass(cd,t);
|
|
Packit |
1c1d7e |
// }
|
|
Packit |
1c1d7e |
//}
|
|
Packit |
1c1d7e |
NamespaceSDict::Iterator nli(*Doxygen::namespaceSDict);
|
|
Packit |
1c1d7e |
NamespaceDef *nd;
|
|
Packit |
1c1d7e |
for (nli.toFirst();(nd=nli.current());++nli)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
msg("Generating XML output for namespace %s\n",nd->name().data());
|
|
Packit |
1c1d7e |
generateXMLForNamespace(nd,t);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
FileNameListIterator fnli(*Doxygen::inputNameList);
|
|
Packit |
1c1d7e |
FileName *fn;
|
|
Packit |
1c1d7e |
for (;(fn=fnli.current());++fnli)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
FileNameIterator fni(*fn);
|
|
Packit |
1c1d7e |
FileDef *fd;
|
|
Packit |
1c1d7e |
for (;(fd=fni.current());++fni)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
msg("Generating XML output for file %s\n",fd->name().data());
|
|
Packit |
1c1d7e |
generateXMLForFile(fd,t);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
GroupSDict::Iterator gli(*Doxygen::groupSDict);
|
|
Packit |
1c1d7e |
GroupDef *gd;
|
|
Packit |
1c1d7e |
for (;(gd=gli.current());++gli)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
msg("Generating XML output for group %s\n",gd->name().data());
|
|
Packit |
1c1d7e |
generateXMLForGroup(gd,t);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
PageSDict::Iterator pdi(*Doxygen::pageSDict);
|
|
Packit |
1c1d7e |
PageDef *pd=0;
|
|
Packit |
1c1d7e |
for (pdi.toFirst();(pd=pdi.current());++pdi)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
msg("Generating XML output for page %s\n",pd->name().data());
|
|
Packit |
1c1d7e |
generateXMLForPage(pd,t,FALSE);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
DirDef *dir;
|
|
Packit |
1c1d7e |
DirSDict::Iterator sdi(*Doxygen::directories);
|
|
Packit |
1c1d7e |
for (sdi.toFirst();(dir=sdi.current());++sdi)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
msg("Generate XML output for dir %s\n",dir->name().data());
|
|
Packit |
1c1d7e |
generateXMLForDir(dir,t);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
PageSDict::Iterator pdi(*Doxygen::exampleSDict);
|
|
Packit |
1c1d7e |
PageDef *pd=0;
|
|
Packit |
1c1d7e |
for (pdi.toFirst();(pd=pdi.current());++pdi)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
msg("Generating XML output for example %s\n",pd->name().data());
|
|
Packit |
1c1d7e |
generateXMLForPage(pd,t,TRUE);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
if (Doxygen::mainPage)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
msg("Generating XML output for the main page\n");
|
|
Packit |
1c1d7e |
generateXMLForPage(Doxygen::mainPage,t,FALSE);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
//t << " </compoundlist>" << endl;
|
|
Packit |
1c1d7e |
t << "</doxygenindex>" << endl;
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
writeCombineScript();
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
|