Commit bedb8602 authored by Dimitri van Heesch's avatar Dimitri van Heesch

Release-1.4.4-20050806

parent 64c0fdd7
...@@ -4,4 +4,4 @@ Please read the installation section of the manual ...@@ -4,4 +4,4 @@ Please read the installation section of the manual
(http://www.doxygen.org/install.html) for instructions. (http://www.doxygen.org/install.html) for instructions.
-------- --------
Dimitri van Heesch (20 July 2005) Dimitri van Heesch (06 August 2005)
...@@ -17,4 +17,4 @@ to subscribe to the lists or to visit the archives. ...@@ -17,4 +17,4 @@ to subscribe to the lists or to visit the archives.
Enjoy, Enjoy,
Dimitri van Heesch (dimitri@stack.nl) (20 July 2005) Dimitri van Heesch (dimitri@stack.nl) (06 August 2005)
...@@ -486,6 +486,7 @@ class IDocRoot : public IDoc ...@@ -486,6 +486,7 @@ class IDocRoot : public IDoc
{ {
public: public:
virtual IDocIterator *contents() const = 0; virtual IDocIterator *contents() const = 0;
virtual IDocInternal *internal() const = 0;
}; };
class IDocIterator class IDocIterator
...@@ -601,6 +602,7 @@ class IMember ...@@ -601,6 +602,7 @@ class IMember
virtual ILinkedTextIterator *exceptions() const = 0; virtual ILinkedTextIterator *exceptions() const = 0;
virtual IMemberReferenceIterator *references() const = 0; virtual IMemberReferenceIterator *references() const = 0;
virtual IMemberReferenceIterator *referencedBy() const = 0; virtual IMemberReferenceIterator *referencedBy() const = 0;
virtual const IString *bodyFile() const = 0;
virtual int bodyStart() const = 0; virtual int bodyStart() const = 0;
virtual int bodyEnd() const = 0; virtual int bodyEnd() const = 0;
virtual const IString * definitionFile() const = 0; virtual const IString * definitionFile() const = 0;
...@@ -730,6 +732,7 @@ class ISection ...@@ -730,6 +732,7 @@ class ISection
Signals, //!< Qt Signals Signals, //!< Qt Signals
DCOPFuncs, //!< KDE-DCOP interface functions DCOPFuncs, //!< KDE-DCOP interface functions
Properties, //!< IDL properties Properties, //!< IDL properties
Events, //!< C# events
PubStatFuncs, //!< Public static member functions PubStatFuncs, //!< Public static member functions
PubStatAttribs, //!< Public static attributes PubStatAttribs, //!< Public static attributes
ProTypes, //!< Protected member typedefs ProTypes, //!< Protected member typedefs
...@@ -765,6 +768,11 @@ class ISection ...@@ -765,6 +768,11 @@ class ISection
/*! Returns what kind of section this is */ /*! Returns what kind of section this is */
virtual SectionKind kind() const = 0; virtual SectionKind kind() const = 0;
/*! Returns the description attached to this section (for user defined
* sections, also known as member groups).
*/
virtual IDocRoot *description() const = 0;
/*! Returns an iterator for the members of this section */ /*! Returns an iterator for the members of this section */
virtual IMemberIterator *members() const = 0; virtual IMemberIterator *members() const = 0;
...@@ -834,9 +842,10 @@ class ICompound ...@@ -834,9 +842,10 @@ class ICompound
public: public:
/*! Represents the kind of compounds recognised by doxygen. */ /*! Represents the kind of compounds recognised by doxygen. */
enum CompoundKind { Invalid=0, enum CompoundKind { Invalid=0,
Class, Struct, Union, Interface, Exception, Class, Struct, Union, Interface, Protocol, Category,
Namespace, File, Group, Page Exception, File, Namespace, Group, Page, Example, Dir
}; };
/*! Returns the name of this compound */ /*! Returns the name of this compound */
virtual const IString * name() const = 0; virtual const IString * name() const = 0;
...@@ -907,6 +916,7 @@ class IRelatedCompound ...@@ -907,6 +916,7 @@ class IRelatedCompound
virtual ICompound *compound() const = 0; virtual ICompound *compound() const = 0;
virtual Protection protection() const = 0; virtual Protection protection() const = 0;
virtual Kind kind() const = 0; virtual Kind kind() const = 0;
virtual const IString *name() const = 0;
}; };
...@@ -934,6 +944,7 @@ class IClass : public ICompound ...@@ -934,6 +944,7 @@ class IClass : public ICompound
virtual IParamIterator *templateParameters() const = 0; virtual IParamIterator *templateParameters() const = 0;
virtual const IString *locationFile() const = 0; virtual const IString *locationFile() const = 0;
virtual int locationLine() const = 0; virtual int locationLine() const = 0;
virtual const IString *locationBodyFile() const = 0;
virtual int locationBodyStartLine() const = 0; virtual int locationBodyStartLine() const = 0;
virtual int locationBodyEndLine() const = 0; virtual int locationBodyEndLine() const = 0;
......
...@@ -130,19 +130,19 @@ class CompoundTypeMap ...@@ -130,19 +130,19 @@ class CompoundTypeMap
CompoundTypeMap() CompoundTypeMap()
{ {
m_map.setAutoDelete(TRUE); m_map.setAutoDelete(TRUE);
m_map.insert("class",new int(ICompound::Class)); m_map.insert("class", new int(ICompound::Class));
m_map.insert("struct",new int(ICompound::Struct)); m_map.insert("struct", new int(ICompound::Struct));
m_map.insert("union",new int(ICompound::Union)); m_map.insert("union", new int(ICompound::Union));
m_map.insert("interface",new int(ICompound::Interface)); m_map.insert("interface",new int(ICompound::Interface));
m_map.insert("protocol",new int(ICompound::Interface)); m_map.insert("protocol", new int(ICompound::Protocol));
m_map.insert("category",new int(ICompound::Interface)); m_map.insert("category", new int(ICompound::Category));
m_map.insert("exception",new int(ICompound::Exception)); m_map.insert("exception",new int(ICompound::Exception));
m_map.insert("file",new int(ICompound::File)); m_map.insert("file", new int(ICompound::File));
m_map.insert("namespace",new int(ICompound::Namespace)); m_map.insert("namespace",new int(ICompound::Namespace));
m_map.insert("group",new int(ICompound::Group)); m_map.insert("group", new int(ICompound::Group));
m_map.insert("page",new int(ICompound::Page)); m_map.insert("page", new int(ICompound::Page));
m_map.insert("example",new int(ICompound::Page)); m_map.insert("example", new int(ICompound::Example));
m_map.insert("dir",new int(ICompound::Page)); m_map.insert("dir", new int(ICompound::Dir));
} }
virtual ~CompoundTypeMap() virtual ~CompoundTypeMap()
{ {
...@@ -176,18 +176,27 @@ void compoundhandler_exit() ...@@ -176,18 +176,27 @@ void compoundhandler_exit()
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
CompoundHandler::CompoundHandler(const QString &xmlDir) CompoundHandler::CompoundHandler(const QString &xmlDir)
: m_brief(0), m_detailed(0), m_programListing(0), : m_titleHandler(0),
m_xmlDir(xmlDir), m_refCount(1), m_memberDict(257), m_memberNameDict(257), m_includeDependencyGraph(0),
m_mainHandler(0), m_inheritanceGraph(0), m_collaborationGraph(0), m_includedByDependencyGraph(0),
m_includeDependencyGraph(0), m_includedByDependencyGraph(0), m_templateParamList(0), m_templateParamList(0),
m_titleHandler(0), m_members(0) m_brief(0),
m_detailed(0),
m_inheritanceGraph(0),
m_collaborationGraph(0),
m_programListing(0),
m_members(0),
m_xmlDir(xmlDir),
m_refCount(1),
m_memberDict(257),
m_memberNameDict(257),
m_mainHandler(0)
{ {
m_superClasses.setAutoDelete(TRUE); m_superClasses.setAutoDelete(TRUE);
m_subClasses.setAutoDelete(TRUE); m_subClasses.setAutoDelete(TRUE);
m_sections.setAutoDelete(TRUE); m_sections.setAutoDelete(TRUE);
m_memberNameDict.setAutoDelete(TRUE); m_memberNameDict.setAutoDelete(TRUE);
m_innerCompounds.setAutoDelete(TRUE); m_innerCompounds.setAutoDelete(TRUE);
m_params.setAutoDelete(TRUE);
m_includes.setAutoDelete(TRUE); m_includes.setAutoDelete(TRUE);
m_includedBy.setAutoDelete(TRUE); m_includedBy.setAutoDelete(TRUE);
...@@ -202,11 +211,11 @@ CompoundHandler::CompoundHandler(const QString &xmlDir) ...@@ -202,11 +211,11 @@ CompoundHandler::CompoundHandler(const QString &xmlDir)
addStartHandler("title",this,&CompoundHandler::startTitle); addStartHandler("title",this,&CompoundHandler::startTitle);
addStartHandler("basecompoundref",this,&CompoundHandler::addSuperClass); addStartHandler("basecompoundref",this,&CompoundHandler::startSuperClass);
addEndHandler("basecompoundref"); addEndHandler("basecompoundref",this,&CompoundHandler::endSuperClass);
addStartHandler("derivedcompoundref",this,&CompoundHandler::addSubClass); addStartHandler("derivedcompoundref",this,&CompoundHandler::startSubClass);
addEndHandler("derivedcompoundref"); addEndHandler("derivedcompoundref",this,&CompoundHandler::endSubClass);
addStartHandler("includes",this,&CompoundHandler::startIncludes); addStartHandler("includes",this,&CompoundHandler::startIncludes);
addStartHandler("includedby",this,&CompoundHandler::startIncludedBy); addStartHandler("includedby",this,&CompoundHandler::startIncludedBy);
...@@ -328,6 +337,7 @@ void CompoundHandler::startLocation(const QXmlAttributes& attrib) ...@@ -328,6 +337,7 @@ void CompoundHandler::startLocation(const QXmlAttributes& attrib)
{ {
m_defFile = attrib.value("file"); m_defFile = attrib.value("file");
m_defLine = attrib.value("line").toInt(); m_defLine = attrib.value("line").toInt();
m_defBodyFile = attrib.value("bodyfile");
m_defBodyStart = attrib.value("bodystart").toInt(); m_defBodyStart = attrib.value("bodystart").toInt();
m_defBodyEnd = attrib.value("bodyend").toInt(); m_defBodyEnd = attrib.value("bodyend").toInt();
} }
...@@ -380,7 +390,7 @@ void CompoundHandler::startListOfAllMembers(const QXmlAttributes& attrib) ...@@ -380,7 +390,7 @@ void CompoundHandler::startListOfAllMembers(const QXmlAttributes& attrib)
m_members->startListOfAllMembers(attrib); m_members->startListOfAllMembers(attrib);
} }
void CompoundHandler::addSuperClass(const QXmlAttributes& attrib) void CompoundHandler::startSuperClass(const QXmlAttributes& attrib)
{ {
IRelatedCompound::Protection prot = IRelatedCompound::Public; IRelatedCompound::Protection prot = IRelatedCompound::Public;
QString protString = attrib.value("prot"); QString protString = attrib.value("prot");
...@@ -407,9 +417,15 @@ void CompoundHandler::addSuperClass(const QXmlAttributes& attrib) ...@@ -407,9 +417,15 @@ void CompoundHandler::addSuperClass(const QXmlAttributes& attrib)
protString.data(), protString.data(),
kindString.data()); kindString.data());
m_superClasses.append(sc); m_superClasses.append(sc);
m_curString = "";
}
void CompoundHandler::endSuperClass()
{
m_superClasses.getLast()->setName(m_curString);
} }
void CompoundHandler::addSubClass(const QXmlAttributes& attrib) void CompoundHandler::startSubClass(const QXmlAttributes& attrib)
{ {
IRelatedCompound::Protection prot = IRelatedCompound::Public; IRelatedCompound::Protection prot = IRelatedCompound::Public;
QString protString = attrib.value("prot"); QString protString = attrib.value("prot");
...@@ -431,6 +447,12 @@ void CompoundHandler::addSubClass(const QXmlAttributes& attrib) ...@@ -431,6 +447,12 @@ void CompoundHandler::addSubClass(const QXmlAttributes& attrib)
protString.data(), protString.data(),
kindString.data()); kindString.data());
m_subClasses.append(sc); m_subClasses.append(sc);
m_curString = "";
}
void CompoundHandler::endSubClass()
{
m_subClasses.getLast()->setName(m_curString);
} }
void CompoundHandler::startTitle(const QXmlAttributes& attrib) void CompoundHandler::startTitle(const QXmlAttributes& attrib)
......
...@@ -36,7 +36,7 @@ class TemplateParamListHandler; ...@@ -36,7 +36,7 @@ class TemplateParamListHandler;
class TitleHandler; class TitleHandler;
class ListOfAllMembersHandler; class ListOfAllMembersHandler;
class IncludeHandler : public IInclude, public BaseHandler<IncludeHandler>\ class IncludeHandler : public IInclude, public BaseHandler<IncludeHandler>
{ {
public: public:
IncludeHandler(IBaseHandler *parent,const char *endtag); IncludeHandler(IBaseHandler *parent,const char *endtag);
...@@ -55,9 +55,9 @@ class IncludeHandler : public IInclude, public BaseHandler<IncludeHandler>\ ...@@ -55,9 +55,9 @@ class IncludeHandler : public IInclude, public BaseHandler<IncludeHandler>\
private: private:
IBaseHandler *m_parent; IBaseHandler *m_parent;
StringImpl m_name; StringImpl m_name; // element's content
StringImpl m_refId; StringImpl m_refId; // refid
bool m_isLocal; bool m_isLocal; // local
}; };
class IncludeIterator : public BaseIterator<IIncludeIterator,IInclude,IncludeHandler> class IncludeIterator : public BaseIterator<IIncludeIterator,IInclude,IncludeHandler>
...@@ -78,16 +78,19 @@ class RelatedCompound : public IRelatedCompound ...@@ -78,16 +78,19 @@ class RelatedCompound : public IRelatedCompound
) : ) :
m_parent(parent), m_id(id), m_protection(prot), m_kind(kind) {} m_parent(parent), m_id(id), m_protection(prot), m_kind(kind) {}
virtual ~RelatedCompound() {} virtual ~RelatedCompound() {}
void setName(const QString &str) { m_name = str; }
virtual ICompound *compound() const; virtual ICompound *compound() const;
virtual Protection protection() const { return m_protection; } virtual Protection protection() const { return m_protection; }
virtual Kind kind() const { return m_kind; } virtual Kind kind() const { return m_kind; }
virtual const IString *name() const { return &m_name; }
private: private:
CompoundHandler *m_parent; CompoundHandler *m_parent;
QString m_id; QString m_id; // refid
Protection m_protection; Protection m_protection; // prot
Kind m_kind; Kind m_kind; // virt
StringImpl m_name; // element's content
}; };
class RelatedCompoundIterator : public BaseIterator<IRelatedCompoundIterator,IRelatedCompound,RelatedCompound> class RelatedCompoundIterator : public BaseIterator<IRelatedCompoundIterator,IRelatedCompound,RelatedCompound>
...@@ -114,8 +117,10 @@ class CompoundHandler : public IClass, ...@@ -114,8 +117,10 @@ class CompoundHandler : public IClass,
public: public:
virtual void startSection(const QXmlAttributes& attrib); virtual void startSection(const QXmlAttributes& attrib);
virtual void startCompound(const QXmlAttributes& attrib); virtual void startCompound(const QXmlAttributes& attrib);
virtual void addSuperClass(const QXmlAttributes& attrib); virtual void startSuperClass(const QXmlAttributes& attrib);
virtual void addSubClass(const QXmlAttributes& attrib); virtual void endSuperClass();
virtual void startSubClass(const QXmlAttributes& attrib);
virtual void endSubClass();
virtual void endCompound(); virtual void endCompound();
virtual void endCompoundName(); virtual void endCompoundName();
virtual void startBriefDesc(const QXmlAttributes& attrib); virtual void startBriefDesc(const QXmlAttributes& attrib);
...@@ -168,6 +173,7 @@ class CompoundHandler : public IClass, ...@@ -168,6 +173,7 @@ class CompoundHandler : public IClass,
ICompoundIterator *nestedGroup() const; ICompoundIterator *nestedGroup() const;
const IString *locationFile() const { return &m_defFile; } const IString *locationFile() const { return &m_defFile; }
int locationLine() const { return m_defLine; } int locationLine() const { return m_defLine; }
const IString *locationBodyFile() const { return &m_defBodyFile; }
int locationBodyStartLine() const { return m_defBodyStart; } int locationBodyStartLine() const { return m_defBodyStart; }
int locationBodyEndLine() const { return m_defBodyEnd; } int locationBodyEndLine() const { return m_defBodyEnd; }
IMemberReferenceIterator *members() const; IMemberReferenceIterator *members() const;
...@@ -183,38 +189,45 @@ class CompoundHandler : public IClass, ...@@ -183,38 +189,45 @@ class CompoundHandler : public IClass,
const IDocTitle *title() const; const IDocTitle *title() const;
private: private:
QList<RelatedCompound> m_superClasses; // XML elements:
QList<RelatedCompound> m_subClasses; // -------------
QList<SectionHandler> m_sections; StringImpl m_name; // compoundname
QList<ParamHandler> m_params; TitleHandler* m_titleHandler; // title
QList<IncludeHandler> m_includes; QList<RelatedCompound> m_subClasses; // basecompoundref
QList<IncludeHandler> m_includedBy; QList<RelatedCompound> m_superClasses; // derivedcompoundref
DocHandler* m_brief; QList<IncludeHandler> m_includes; // includes
DocHandler* m_detailed; QList<IncludeHandler> m_includedBy; // includedBy
ProgramListingHandler* m_programListing; GraphHandler* m_includeDependencyGraph; // incdepgraph
StringImpl m_id; GraphHandler* m_includedByDependencyGraph; // invincdepgraph
StringImpl m_protection; QList<QString> m_innerCompounds; // innerdir/innerfile/innerclass/innernamespace/innergroup
StringImpl m_kindString; TemplateParamListHandler* m_templateParamList; // templateparamlist
CompoundKind m_kind; QList<SectionHandler> m_sections; // sectiondef
StringImpl m_name; DocHandler* m_brief; // briefdescription
StringImpl m_defFile; DocHandler* m_detailed; // detaileddescription
int m_defLine; GraphHandler* m_inheritanceGraph; // inheritancegraph
int m_defBodyStart; GraphHandler* m_collaborationGraph; // collaborationgraph
int m_defBodyEnd; ProgramListingHandler* m_programListing; // programlisting
QString m_xmlDir; // location
int m_refCount; StringImpl m_defFile; // - file
QDict<MemberHandler> m_memberDict; int m_defLine; // - line
QDict<QList<MemberHandler> > m_memberNameDict; StringImpl m_defBodyFile; // - bodyfile
MainHandler* m_mainHandler; int m_defBodyStart; // - bodystart
GraphHandler* m_inheritanceGraph; int m_defBodyEnd; // - bodyend
GraphHandler* m_collaborationGraph; ListOfAllMembersHandler* m_members; // listofallmember
GraphHandler* m_includeDependencyGraph;
GraphHandler* m_includedByDependencyGraph; // XML attributes:
QList<QString> m_innerCompounds; // ---------------
ProgramListingHandler* m_source; StringImpl m_id; // id
TemplateParamListHandler* m_templateParamList; CompoundKind m_kind; // kind
TitleHandler* m_titleHandler; StringImpl m_kindString; // kind as a string
ListOfAllMembersHandler* m_members; StringImpl m_protection; // prot
// local variables
QString m_xmlDir; // directory where the info is found
int m_refCount; // object reference counter
QDict<MemberHandler> m_memberDict; // id->member lookup
QDict<QList<MemberHandler> > m_memberNameDict; // name->memberlist lookup
MainHandler* m_mainHandler; // parent object
}; };
void compoundhandler_init(); void compoundhandler_init();
......
...@@ -1679,28 +1679,37 @@ ParagraphHandler::ParagraphHandler(IBaseHandler *parent) ...@@ -1679,28 +1679,37 @@ ParagraphHandler::ParagraphHandler(IBaseHandler *parent)
m_children.setAutoDelete(TRUE); m_children.setAutoDelete(TRUE);
m_markupHandler = new MarkupHandler(m_children,m_curString); m_markupHandler = new MarkupHandler(m_children,m_curString);
// preformatted
setFallBackHandler(m_markupHandler); setFallBackHandler(m_markupHandler);
addEndHandler("para",this,&ParagraphHandler::endParagraph); addEndHandler("para",this,&ParagraphHandler::endParagraph);
addStartHandler("itemizedlist",this,&ParagraphHandler::startItemizedList); addStartHandler("linebreak",this,&ParagraphHandler::startLineBreak);
addStartHandler("hruler",this,&ParagraphHandler::startHRuler);
addStartHandler("programlisting",this,&ParagraphHandler::startProgramListing);
addStartHandler("verbatim",this,&ParagraphHandler::startVerbatim);
addStartHandler("indexentry",this,&ParagraphHandler::startIndexEntry);
addStartHandler("orderedlist",this,&ParagraphHandler::startOrderedList); addStartHandler("orderedlist",this,&ParagraphHandler::startOrderedList);
addStartHandler("parameterlist",this,&ParagraphHandler::startParameterList); addStartHandler("itemizedlist",this,&ParagraphHandler::startItemizedList);
addStartHandler("simplesect",this,&ParagraphHandler::startSimpleSect); addStartHandler("simplesect",this,&ParagraphHandler::startSimpleSect);
addStartHandler("ref",this,&ParagraphHandler::startRef); // TODO: title
addStartHandler("variablelist",this,&ParagraphHandler::startVariableList); addStartHandler("variablelist",this,&ParagraphHandler::startVariableList);
addStartHandler("hruler",this,&ParagraphHandler::startHRuler); addStartHandler("table",this,&ParagraphHandler::startTable);
addStartHandler("linebreak",this,&ParagraphHandler::startLineBreak); // TODO: heading
addStartHandler("image",this,&ParagraphHandler::startImage);
addStartHandler("dotfile",this,&ParagraphHandler::startDotFile);
addStartHandler("toclist",this,&ParagraphHandler::startTocList);
// TODO: language???
addStartHandler("parameterlist",this,&ParagraphHandler::startParameterList);
// TODO: xrefsect
addStartHandler("copydoc",this,&ParagraphHandler::startCopyDoc);
addStartHandler("ref",this,&ParagraphHandler::startRef);
addStartHandler("ulink",this,&ParagraphHandler::startULink); addStartHandler("ulink",this,&ParagraphHandler::startULink);
addStartHandler("email",this,&ParagraphHandler::startEMail); addStartHandler("email",this,&ParagraphHandler::startEMail);
addStartHandler("link",this,&ParagraphHandler::startLink); addStartHandler("link",this,&ParagraphHandler::startLink);
addStartHandler("programlisting",this,&ParagraphHandler::startProgramListing);
addStartHandler("formula",this,&ParagraphHandler::startFormula); addStartHandler("formula",this,&ParagraphHandler::startFormula);
addStartHandler("image",this,&ParagraphHandler::startImage);
addStartHandler("dotfile",this,&ParagraphHandler::startDotFile);
addStartHandler("indexentry",this,&ParagraphHandler::startIndexEntry);
addStartHandler("table",this,&ParagraphHandler::startTable);
addStartHandler("verbatim",this,&ParagraphHandler::startVerbatim);
addStartHandler("latexonly",this,&ParagraphHandler::startHtmlOnly); addStartHandler("latexonly",this,&ParagraphHandler::startHtmlOnly);
addStartHandler("htmlonly",this,&ParagraphHandler::startLatexOnly); addStartHandler("htmlonly",this,&ParagraphHandler::startLatexOnly);
addStartHandler("umlaut",this,&ParagraphHandler::startUmlaut); addStartHandler("umlaut",this,&ParagraphHandler::startUmlaut);
...@@ -1714,8 +1723,6 @@ ParagraphHandler::ParagraphHandler(IBaseHandler *parent) ...@@ -1714,8 +1723,6 @@ ParagraphHandler::ParagraphHandler(IBaseHandler *parent)
addStartHandler("nbsp",this,&ParagraphHandler::startNbsp); addStartHandler("nbsp",this,&ParagraphHandler::startNbsp);
addStartHandler("copy",this,&ParagraphHandler::startCopy); addStartHandler("copy",this,&ParagraphHandler::startCopy);
addStartHandler("anchor",this,&ParagraphHandler::startAnchor); addStartHandler("anchor",this,&ParagraphHandler::startAnchor);
addStartHandler("copydoc",this,&ParagraphHandler::startCopyDoc);
addStartHandler("toclist",this,&ParagraphHandler::startTocList);
} }
ParagraphHandler::~ParagraphHandler() ParagraphHandler::~ParagraphHandler()
...@@ -2170,12 +2177,13 @@ DocHandler::DocHandler(IBaseHandler *parent) : m_parent(parent) ...@@ -2170,12 +2177,13 @@ DocHandler::DocHandler(IBaseHandler *parent) : m_parent(parent)
addEndHandler("briefdescription",this,&DocHandler::endDoc); addEndHandler("briefdescription",this,&DocHandler::endDoc);
addEndHandler("detaileddescription",this,&DocHandler::endDoc); addEndHandler("detaileddescription",this,&DocHandler::endDoc);
addEndHandler("inbodydescription",this,&DocHandler::endDoc); addEndHandler("inbodydescription",this,&DocHandler::endDoc);
addEndHandler("internal"); //addEndHandler("internal"); // TODO: implement this as a section
addStartHandler("internal",this,&DocHandler::startInternal);
addStartHandler("para",this,&DocHandler::startParagraph); addStartHandler("para",this,&DocHandler::startParagraph);
addStartHandler("sect1",this,&DocHandler::startSect1); addStartHandler("sect1",this,&DocHandler::startSect1);
addStartHandler("title",this,&DocHandler::startTitle); addStartHandler("title",this,&DocHandler::startTitle);
addStartHandler("internal"); //addStartHandler("internal");
} }
DocHandler::~DocHandler() DocHandler::~DocHandler()
...@@ -2215,8 +2223,19 @@ void DocHandler::startTitle(const QXmlAttributes& attrib) ...@@ -2215,8 +2223,19 @@ void DocHandler::startTitle(const QXmlAttributes& attrib)
m_children.append(titleHandler); m_children.append(titleHandler);
} }
void DocHandler::startInternal(const QXmlAttributes& attrib)
{
m_internal = new DocInternalHandler(this,1);
m_internal->startInternal(attrib);
}
IDocIterator *DocHandler::contents() const IDocIterator *DocHandler::contents() const
{ {
return new DocIterator(*this); return new DocIterator(*this);
} }
IDocInternal *DocHandler::internal() const
{
return m_internal;
}
...@@ -1311,7 +1311,7 @@ class DocInternalSubIterator : public BaseIteratorVia<IDocIterator,IDoc,DocImpl, ...@@ -1311,7 +1311,7 @@ class DocInternalSubIterator : public BaseIteratorVia<IDocIterator,IDoc,DocImpl,
/*! \brief Node representing a documentation block. /*! \brief Node representing a documentation block.
* *
*/ */
// children: para, title, sect1, sect2, sect3 // children: para, title, sect1, internal
class DocHandler : public DocRootImpl, public BaseHandler<DocHandler> class DocHandler : public DocRootImpl, public BaseHandler<DocHandler>
{ {
friend class DocIterator; friend class DocIterator;
...@@ -1321,6 +1321,7 @@ class DocHandler : public DocRootImpl, public BaseHandler<DocHandler> ...@@ -1321,6 +1321,7 @@ class DocHandler : public DocRootImpl, public BaseHandler<DocHandler>
virtual void startParagraph(const QXmlAttributes& attrib); virtual void startParagraph(const QXmlAttributes& attrib);
virtual void startSect1(const QXmlAttributes& attrib); virtual void startSect1(const QXmlAttributes& attrib);
virtual void startTitle(const QXmlAttributes& attrib); virtual void startTitle(const QXmlAttributes& attrib);
virtual void startInternal(const QXmlAttributes& attrib);
DocHandler(IBaseHandler *parent); DocHandler(IBaseHandler *parent);
virtual ~DocHandler(); virtual ~DocHandler();
...@@ -1328,10 +1329,12 @@ class DocHandler : public DocRootImpl, public BaseHandler<DocHandler> ...@@ -1328,10 +1329,12 @@ class DocHandler : public DocRootImpl, public BaseHandler<DocHandler>
// IDocRoot // IDocRoot
virtual Kind kind() const { return DocImpl::Root; } virtual Kind kind() const { return DocImpl::Root; }
virtual IDocIterator *contents() const; virtual IDocIterator *contents() const;
virtual IDocInternal *internal() const;
private: private:
IBaseHandler *m_parent; IBaseHandler *m_parent;
QList<DocImpl> m_children; QList<DocImpl> m_children;
DocInternalHandler *m_internal;
}; };
class DocIterator : public BaseIteratorVia<IDocIterator,IDoc,DocImpl,DocImpl> class DocIterator : public BaseIteratorVia<IDocIterator,IDoc,DocImpl,DocImpl>
......
...@@ -486,6 +486,7 @@ class IDocRoot : public IDoc ...@@ -486,6 +486,7 @@ class IDocRoot : public IDoc
{ {
public: public:
virtual IDocIterator *contents() const = 0; virtual IDocIterator *contents() const = 0;
virtual IDocInternal *internal() const = 0;
}; };
class IDocIterator class IDocIterator
...@@ -601,6 +602,7 @@ class IMember ...@@ -601,6 +602,7 @@ class IMember
virtual ILinkedTextIterator *exceptions() const = 0; virtual ILinkedTextIterator *exceptions() const = 0;
virtual IMemberReferenceIterator *references() const = 0; virtual IMemberReferenceIterator *references() const = 0;
virtual IMemberReferenceIterator *referencedBy() const = 0; virtual IMemberReferenceIterator *referencedBy() const = 0;
virtual const IString *bodyFile() const = 0;
virtual int bodyStart() const = 0; virtual int bodyStart() const = 0;
virtual int bodyEnd() const = 0; virtual int bodyEnd() const = 0;
virtual const IString * definitionFile() const = 0; virtual const IString * definitionFile() const = 0;
...@@ -730,6 +732,7 @@ class ISection ...@@ -730,6 +732,7 @@ class ISection
Signals, //!< Qt Signals Signals, //!< Qt Signals
DCOPFuncs, //!< KDE-DCOP interface functions DCOPFuncs, //!< KDE-DCOP interface functions
Properties, //!< IDL properties Properties, //!< IDL properties
Events, //!< C# events
PubStatFuncs, //!< Public static member functions PubStatFuncs, //!< Public static member functions
PubStatAttribs, //!< Public static attributes PubStatAttribs, //!< Public static attributes
ProTypes, //!< Protected member typedefs ProTypes, //!< Protected member typedefs
...@@ -765,6 +768,11 @@ class ISection ...@@ -765,6 +768,11 @@ class ISection
/*! Returns what kind of section this is */ /*! Returns what kind of section this is */
virtual SectionKind kind() const = 0; virtual SectionKind kind() const = 0;
/*! Returns the description attached to this section (for user defined
* sections, also known as member groups).
*/
virtual IDocRoot *description() const = 0;
/*! Returns an iterator for the members of this section */ /*! Returns an iterator for the members of this section */
virtual IMemberIterator *members() const = 0; virtual IMemberIterator *members() const = 0;
...@@ -834,9 +842,10 @@ class ICompound ...@@ -834,9 +842,10 @@ class ICompound
public: public:
/*! Represents the kind of compounds recognised by doxygen. */ /*! Represents the kind of compounds recognised by doxygen. */
enum CompoundKind { Invalid=0, enum CompoundKind { Invalid=0,
Class, Struct, Union, Interface, Exception, Class, Struct, Union, Interface, Protocol, Category,
Namespace, File, Group, Page Exception, File, Namespace, Group, Page, Example, Dir
}; };
/*! Returns the name of this compound */ /*! Returns the name of this compound */
virtual const IString * name() const = 0; virtual const IString * name() const = 0;
...@@ -907,6 +916,7 @@ class IRelatedCompound ...@@ -907,6 +916,7 @@ class IRelatedCompound
virtual ICompound *compound() const = 0; virtual ICompound *compound() const = 0;
virtual Protection protection() const = 0; virtual Protection protection() const = 0;
virtual Kind kind() const = 0; virtual Kind kind() const = 0;
virtual const IString *name() const = 0;
}; };
...@@ -934,6 +944,7 @@ class IClass : public ICompound ...@@ -934,6 +944,7 @@ class IClass : public ICompound
virtual IParamIterator *templateParameters() const = 0; virtual IParamIterator *templateParameters() const = 0;
virtual const IString *locationFile() const = 0; virtual const IString *locationFile() const = 0;
virtual int locationLine() const = 0; virtual int locationLine() const = 0;
virtual const IString *locationBodyFile() const = 0;
virtual int locationBodyStartLine() const = 0; virtual int locationBodyStartLine() const = 0;
virtual int locationBodyEndLine() const = 0; virtual int locationBodyEndLine() const = 0;
......
...@@ -154,7 +154,8 @@ void EnumValueHandler::startDetailedDesc(const QXmlAttributes& attrib) ...@@ -154,7 +154,8 @@ void EnumValueHandler::startDetailedDesc(const QXmlAttributes& attrib)
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
MemberHandler::MemberHandler(IBaseHandler *parent) MemberHandler::MemberHandler(IBaseHandler *parent)
: m_parent(parent), m_compound(0), m_brief(0), m_detailed(0), m_inbody(0) : m_brief(0), m_detailed(0), m_inbody(0),
m_compound(0), m_section(0), m_parent(parent)
{ {
//printf("MemberHandler::MemberHandler() %p\n",this); //printf("MemberHandler::MemberHandler() %p\n",this);
addEndHandler("memberdef",this,&MemberHandler::endMember); addEndHandler("memberdef",this,&MemberHandler::endMember);
...@@ -310,6 +311,7 @@ void MemberHandler::startInbodyDesc(const QXmlAttributes& attrib) ...@@ -310,6 +311,7 @@ void MemberHandler::startInbodyDesc(const QXmlAttributes& attrib)
void MemberHandler::startLocation(const QXmlAttributes& attrib) void MemberHandler::startLocation(const QXmlAttributes& attrib)
{ {
m_defFile = attrib.value("file"); m_defFile = attrib.value("file");
m_bodyFile = attrib.value("bodyfile");
QCString s; QCString s;
s = attrib.value("line"); s = attrib.value("line");
if (!s.isEmpty()) m_defLine=s.toInt(); if (!s.isEmpty()) m_defLine=s.toInt();
......
...@@ -61,53 +61,6 @@ class MemberReferenceIterator : public BaseIterator<IMemberReferenceIterator,IMe ...@@ -61,53 +61,6 @@ class MemberReferenceIterator : public BaseIterator<IMemberReferenceIterator,IMe
BaseIterator<IMemberReferenceIterator,IMemberReference,MemberReference>(list) {} BaseIterator<IMemberReferenceIterator,IMemberReference,MemberReference>(list) {}
}; };
#if 0
class EnumValueHandler : public IEnumValue, public BaseHandler<EnumValueHandler>
{
public:
virtual void startName(const QXmlAttributes& attrib);
virtual void endName();
virtual void startInitializer(const QXmlAttributes& attrib);
virtual void endInitializer();
virtual void startEnumValue(const QXmlAttributes& attrib);
virtual void endEnumValue();
virtual void startBriefDesc(const QXmlAttributes& attrib);
virtual void startDetailedDesc(const QXmlAttributes& attrib);
// IEnumValue
virtual const IString *name() const { return &m_name; }
virtual ILinkedTextIterator *initializer() const
{ return new LinkedTextIterator(m_initializer); }
void setName(const QString &name) { m_name=name; }
virtual ~EnumValueHandler();
EnumValueHandler(IBaseHandler *parent);
virtual IDocRoot *briefDescription() const
{ return m_brief; }
virtual IDocRoot *detailedDescription() const
{ return m_detailed; }
private:
StringImpl m_name;
QList<LinkedTextImpl> m_initializer;
IBaseHandler *m_parent;
DocHandler *m_brief;
DocHandler *m_detailed;
LinkedTextHandler *m_linkedTextHandler;
};
class EnumValueIterator : public BaseIterator<IEnumValueIterator,IEnumValue,EnumValueHandler>
{
public:
EnumValueIterator(const QList<EnumValueHandler> &list) :
BaseIterator<IEnumValueIterator,IEnumValue,EnumValueHandler>(list) {}
};
#endif
class MemberHandler : public IDefine, class MemberHandler : public IDefine,
public IProperty, public IProperty,
public IVariable, public IVariable,
...@@ -206,6 +159,8 @@ class MemberHandler : public IDefine, ...@@ -206,6 +159,8 @@ class MemberHandler : public IDefine,
virtual IMemberReferenceIterator *referencedBy() const; virtual IMemberReferenceIterator *referencedBy() const;
virtual ILinkedTextIterator *initializer() const; virtual ILinkedTextIterator *initializer() const;
virtual ILinkedTextIterator *exceptions() const; virtual ILinkedTextIterator *exceptions() const;
virtual const IString *bodyFile() const
{ return &m_bodyFile; }
virtual int bodyStart() const virtual int bodyStart() const
{ return m_bodyStart; } { return m_bodyStart; }
virtual int bodyEnd() const virtual int bodyEnd() const
...@@ -229,48 +184,56 @@ class MemberHandler : public IDefine, ...@@ -229,48 +184,56 @@ class MemberHandler : public IDefine,
void setSectionHandler(SectionHandler *s); void setSectionHandler(SectionHandler *s);
private: private:
IBaseHandler *m_parent; // XML elements:
// -----------------
QList<ParamHandler> m_templateParams; // templateparamlist
QList<LinkedTextImpl> m_type; // type
StringImpl m_definition; // definition
StringImpl m_argsstring; // argsstring
StringImpl m_name; // name
StringImpl m_read; // read
StringImpl m_write; // write
MemberReference *m_reimplements; // reimplements
QList<MemberReference> m_reimplementedBy; // reimplementedby
QList<ParamHandler> m_params; // param
QList<MemberHandler> m_enumValues; // enumvalue
QList<LinkedTextImpl> m_initializer; // initializer
QList<LinkedTextImpl> m_exception; // exceptions
DocHandler *m_brief; // briefdescription
DocHandler *m_detailed; // detaileddescription
DocHandler *m_inbody; // inbodydescription
// location
StringImpl m_defFile; // - file
int m_defLine; // - line
StringImpl m_bodyFile; // - bodyfile
int m_bodyStart; // - bodystart
int m_bodyEnd; // - bodyend
QList<MemberReference> m_references; // references
QList<MemberReference> m_referencedBy; // referencedby
// XML attributes:
// ---------------
MemberKind m_kind; // kind
StringImpl m_kindString; // kind as a string
StringImpl m_id; // id
StringImpl m_protection; // prot
bool m_isStatic; // static
bool m_isConst; // const
bool m_isExplicit; // explicit
bool m_isInline; // inline
StringImpl m_virtualness; // virt
bool m_isVolatile; // volatile
bool m_isMutable; // mutable
bool m_isReadable; // readable
bool m_isWritable; // writable
CompoundHandler *m_compound; CompoundHandler *m_compound;
SectionHandler *m_section; SectionHandler *m_section;
MemberKind m_kind;
StringImpl m_kindString;
StringImpl m_id;
StringImpl m_protection;
StringImpl m_virtualness;
StringImpl m_typeString; StringImpl m_typeString;
QList<LinkedTextImpl> m_type;
QList<LinkedTextImpl> m_initializer;
QList<LinkedTextImpl> m_exception;
StringImpl m_name;
StringImpl m_read;
StringImpl m_write;
StringImpl m_definition;
StringImpl m_argsstring;
DocHandler *m_brief;
DocHandler *m_detailed;
DocHandler *m_inbody;
QList<ParamHandler> m_params;
QList<ParamHandler> m_templateParams;
QList<MemberReference> m_references;
QList<MemberReference> m_referencedBy;
MemberReference *m_reimplements;
QList<MemberReference> m_reimplementedBy;
StringImpl m_defFile;
int m_defLine;
int m_bodyStart;
int m_bodyEnd;
bool m_isConst;
bool m_isVolatile;
LinkedTextHandler *m_linkedTextHandler; LinkedTextHandler *m_linkedTextHandler;
QList<MemberHandler> m_enumValues;
bool m_insideTemplateParamList; bool m_insideTemplateParamList;
bool m_hasTemplateParamList; bool m_hasTemplateParamList;
bool m_isStatic; IBaseHandler *m_parent;
bool m_isExplicit;
bool m_isInline;
bool m_isMutable;
bool m_isReadable;
bool m_isWritable;
}; };
class MemberIterator : public BaseIteratorVia<IMemberIterator, class MemberIterator : public BaseIteratorVia<IMemberIterator,
......
...@@ -50,7 +50,7 @@ void TemplateParamListHandler::endTemplateParamList() ...@@ -50,7 +50,7 @@ void TemplateParamListHandler::endTemplateParamList()
/////////////////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////////////////
ParamHandler::ParamHandler(IBaseHandler *parent) : m_parent(parent), m_brief(0) ParamHandler::ParamHandler(IBaseHandler *parent) : m_brief(0), m_parent(parent)
{ {
addEndHandler("param",this,&ParamHandler::endParam); addEndHandler("param",this,&ParamHandler::endParam);
......
...@@ -56,14 +56,19 @@ class ParamHandler : public IParam, public BaseHandler<ParamHandler> ...@@ -56,14 +56,19 @@ class ParamHandler : public IParam, public BaseHandler<ParamHandler>
virtual IDocRoot *briefDescription() const; virtual IDocRoot *briefDescription() const;
private: private:
// XML elements:
// -------------
QList<LinkedTextImpl> m_type; // type
StringImpl m_declName; // declname
StringImpl m_defName; // defname
StringImpl m_array; // array
QList<LinkedTextImpl> m_defVal; // defval
DocHandler *m_brief; // briefdescription
StringImpl m_attrib; // TODO: not yet in XML output
IBaseHandler *m_parent; IBaseHandler *m_parent;
DocHandler *m_brief;
QList<LinkedTextImpl> m_type;
StringImpl m_declName;
StringImpl m_defName;
StringImpl m_attrib;
StringImpl m_array;
QList<LinkedTextImpl> m_defVal;
LinkedTextHandler *m_linkedTextHandler; LinkedTextHandler *m_linkedTextHandler;
}; };
......
...@@ -17,6 +17,7 @@ ...@@ -17,6 +17,7 @@
#include "compoundhandler.h" #include "compoundhandler.h"
#include "sectionhandler.h" #include "sectionhandler.h"
#include "memberhandler.h" #include "memberhandler.h"
#include "dochandler.h"
#include "debug.h" #include "debug.h"
class SectionTypeMap class SectionTypeMap
...@@ -33,6 +34,7 @@ class SectionTypeMap ...@@ -33,6 +34,7 @@ class SectionTypeMap
m_map.insert("signal",new int(ISection::Signals)); m_map.insert("signal",new int(ISection::Signals));
m_map.insert("dcop-func",new int(ISection::DCOPFuncs)); m_map.insert("dcop-func",new int(ISection::DCOPFuncs));
m_map.insert("property",new int(ISection::Properties)); m_map.insert("property",new int(ISection::Properties));
m_map.insert("event",new int(ISection::Events));
m_map.insert("public-static-func",new int(ISection::PubStatFuncs)); m_map.insert("public-static-func",new int(ISection::PubStatFuncs));
m_map.insert("public-static-attrib",new int(ISection::PubStatAttribs)); m_map.insert("public-static-attrib",new int(ISection::PubStatAttribs));
m_map.insert("protected-type",new int(ISection::ProTypes)); m_map.insert("protected-type",new int(ISection::ProTypes));
...@@ -95,6 +97,7 @@ SectionHandler::SectionHandler(IBaseHandler *parent) : m_parent(parent) ...@@ -95,6 +97,7 @@ SectionHandler::SectionHandler(IBaseHandler *parent) : m_parent(parent)
addStartHandler("memberdef",this,&SectionHandler::startMember); addStartHandler("memberdef",this,&SectionHandler::startMember);
addStartHandler("header",this,&SectionHandler::startHeader); addStartHandler("header",this,&SectionHandler::startHeader);
addEndHandler("header",this,&SectionHandler::endHeader); addEndHandler("header",this,&SectionHandler::endHeader);
addStartHandler("description",this,&SectionHandler::startDescription);
} }
SectionHandler::~SectionHandler() SectionHandler::~SectionHandler()
...@@ -110,6 +113,13 @@ void SectionHandler::startSection(const QXmlAttributes& attrib) ...@@ -110,6 +113,13 @@ void SectionHandler::startSection(const QXmlAttributes& attrib)
debug(2,"section kind=`%s'\n",m_kindString.data()); debug(2,"section kind=`%s'\n",m_kindString.data());
} }
void SectionHandler::startDescription(const QXmlAttributes& attrib)
{
DocHandler *docHandler = new DocHandler(this);
docHandler->startDoc(attrib);
m_description = docHandler;
}
void SectionHandler::endSection() void SectionHandler::endSection()
{ {
m_parent->setDelegate(0); m_parent->setDelegate(0);
...@@ -146,6 +156,11 @@ void SectionHandler::initialize(CompoundHandler *ch) ...@@ -146,6 +156,11 @@ void SectionHandler::initialize(CompoundHandler *ch)
} }
} }
IDocRoot *SectionHandler::description() const
{
return m_description;
}
IMemberIterator *SectionHandler::members() const IMemberIterator *SectionHandler::members() const
{ {
return new MemberIterator(m_members); return new MemberIterator(m_members);
......
...@@ -23,8 +23,6 @@ ...@@ -23,8 +23,6 @@
#include "basehandler.h" #include "basehandler.h"
class MainHandler;
class SectionIterator : class SectionIterator :
public BaseIterator<ISectionIterator,ISection,SectionHandler> public BaseIterator<ISectionIterator,ISection,SectionHandler>
{ {
...@@ -40,6 +38,7 @@ class SectionHandler : public IUserDefined, public BaseHandler<SectionHandler> ...@@ -40,6 +38,7 @@ class SectionHandler : public IUserDefined, public BaseHandler<SectionHandler>
virtual void startMember(const QXmlAttributes& attrib); virtual void startMember(const QXmlAttributes& attrib);
virtual void startHeader(const QXmlAttributes& attrib); virtual void startHeader(const QXmlAttributes& attrib);
virtual void startSection(const QXmlAttributes& attrib); virtual void startSection(const QXmlAttributes& attrib);
virtual void startDescription(const QXmlAttributes& attrib);
virtual void endSection(); virtual void endSection();
virtual void endHeader(); virtual void endHeader();
...@@ -51,6 +50,7 @@ class SectionHandler : public IUserDefined, public BaseHandler<SectionHandler> ...@@ -51,6 +50,7 @@ class SectionHandler : public IUserDefined, public BaseHandler<SectionHandler>
{ return &m_kindString; } { return &m_kindString; }
virtual SectionKind kind() const virtual SectionKind kind() const
{ return m_kind; } { return m_kind; }
IDocRoot *description() const;
virtual IMemberIterator *members() const; virtual IMemberIterator *members() const;
virtual bool isStatic() const virtual bool isStatic() const
{ {
...@@ -83,10 +83,17 @@ class SectionHandler : public IUserDefined, public BaseHandler<SectionHandler> ...@@ -83,10 +83,17 @@ class SectionHandler : public IUserDefined, public BaseHandler<SectionHandler>
private: private:
IBaseHandler *m_parent; IBaseHandler *m_parent;
SectionKind m_kind;
StringImpl m_kindString; // XML elements:
StringImpl m_header; // -------------
QList<MemberHandler> m_members; StringImpl m_header; // header
DocHandler* m_description; // description
QList<MemberHandler> m_members; // memberdef
// XML attributes:
// ---------------
SectionKind m_kind; // kind
StringImpl m_kindString; // kind as a string
}; };
void sectionhandler_init(); void sectionhandler_init();
......
...@@ -31,9 +31,9 @@ The following sections explain the steps above in more detail. ...@@ -31,9 +31,9 @@ The following sections explain the steps above in more detail.
The configuration file that controls the settings of a project is parsed The configuration file that controls the settings of a project is parsed
and the settings are stored in the singleton class \c Config and the settings are stored in the singleton class \c Config
in \c src/config.h. The parser itself is written using \c flex and can be in <code>src/config.h</code>. The parser itself is written using \c flex
found in \c src/config.l. This parser is also used directly by \c doxywizard, and can be found in <code>src/config.l</code>. This parser is also used
so it is put in a separate library. directly by \c doxywizard, so it is put in a separate library.
Each configuration option has one of 5 possible types: \c String, Each configuration option has one of 5 possible types: \c String,
\c List, \c Enum, \c Int, or \c Bool. The values of these options are \c List, \c Enum, \c Int, or \c Bool. The values of these options are
......
...@@ -61,6 +61,7 @@ followed by the descriptions of the tags grouped by category. ...@@ -61,6 +61,7 @@ followed by the descriptions of the tags grouped by category.
\refitem cfg_alphabetical_index ALPHABETICAL_INDEX \refitem cfg_alphabetical_index ALPHABETICAL_INDEX
\refitem cfg_always_detailed_sec ALWAYS_DETAILED_SEC \refitem cfg_always_detailed_sec ALWAYS_DETAILED_SEC
\refitem cfg_binary_toc BINARY_TOC \refitem cfg_binary_toc BINARY_TOC
\refitem cfg_builtin_stl_support BUILTIN_STL_SUPPORT
\refitem cfg_brief_member_desc BRIEF_MEMBER_DESC \refitem cfg_brief_member_desc BRIEF_MEMBER_DESC
\refitem cfg_call_graph CALL_GRAPH \refitem cfg_call_graph CALL_GRAPH
\refitem cfg_case_sense_names CASE_SENSE_NAMES \refitem cfg_case_sense_names CASE_SENSE_NAMES
...@@ -206,6 +207,7 @@ followed by the descriptions of the tags grouped by category. ...@@ -206,6 +207,7 @@ followed by the descriptions of the tags grouped by category.
\refitem cfg_treeview_width TREEVIEW_WIDTH \refitem cfg_treeview_width TREEVIEW_WIDTH
\refitem cfg_uml_look UML_LOOK \refitem cfg_uml_look UML_LOOK
\refitem cfg_use_htags USE_HTAGS \refitem cfg_use_htags USE_HTAGS
\refitem cfg_use_pdflatex USE_PDFLATEX
\refitem cfg_use_windows_encoding USE_WINDOWS_ENCODING \refitem cfg_use_windows_encoding USE_WINDOWS_ENCODING
\refitem cfg_verbatim_headers VERBATIM_HEADERS \refitem cfg_verbatim_headers VERBATIM_HEADERS
\refitem cfg_warn_format WARN_FORMAT \refitem cfg_warn_format WARN_FORMAT
...@@ -343,7 +345,8 @@ followed by the descriptions of the tags grouped by category. ...@@ -343,7 +345,8 @@ followed by the descriptions of the tags grouped by category.
path to strip. path to strip.
\anchor cfg_strip_from_inc_path \anchor cfg_strip_from_inc_path
<dt>\c STRIP_FROM_INC_PATH <dt>\c STRIP_FROM_INC_PATH <dd>
\addindex STRIP_FROM_INC_PATH
The \c STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of The \c STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of
the path mentioned in the documentation of a class, which tells the path mentioned in the documentation of a class, which tells
the reader which header file to include in order to use a class. the reader which header file to include in order to use a class.
...@@ -378,6 +381,24 @@ followed by the descriptions of the tags grouped by category. ...@@ -378,6 +381,24 @@ followed by the descriptions of the tags grouped by category.
comment as the brief description. If set to NO (the default), the comment as the brief description. If set to NO (the default), the
Javadoc-style will behave just like the Qt-style comments. Javadoc-style will behave just like the Qt-style comments.
\anchor cfg_builtin_stl_support
<dt>\c BUILTIN_STL_SUPPORT <dd>
\addindex BUILTIN_STL_SUPPORT
If you use STL classes (i.e. std::string, std::vector, etc.) but do not want to
include (a tag file for) the STL sources as input, then you should
set this tag to \c YES in order to let doxygen match functions declarations and
definitions whose arguments contain STL classes (e.g. func(std::string); v.s.
func(std::string) {}). This also make the inheritance and collaboration
diagrams that involve STL classes more complete and accurate.
\anchor cfg_distribute_group_doc
<dt>\c DISTRIBUTE_GROUP_DOC <dd>
\addindex DISTRIBUTE_GROUP_DOC
If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC
tag is set to YES, then doxygen will reuse the documentation of the first
member in the group (if any) for the other members of the group. By default
all members of a group must be documented explicitly.
\anchor cfg_multiline_cpp_is_brief \anchor cfg_multiline_cpp_is_brief
<dt>\c MULTILINE_CPP_IS_BRIEF <dd> <dt>\c MULTILINE_CPP_IS_BRIEF <dd>
\addindex MULTILINE_CPP_IS_BRIEF \addindex MULTILINE_CPP_IS_BRIEF
...@@ -404,14 +425,6 @@ followed by the descriptions of the tags grouped by category. ...@@ -404,14 +425,6 @@ followed by the descriptions of the tags grouped by category.
member inherits the documentation from any documented member that it member inherits the documentation from any documented member that it
re-implements. re-implements.
\anchor cfg_distribute_group_doc
<dt>\c DISTRIBUTE_GROUP_DOC <dd>
\addindex DISTRIBUTE_GROUP_DOC
If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC
tag is set to YES, then doxygen will reuse the documentation of the first
member in the group (if any) for the other members of the group. By default
all members of a group must be documented explicitly.
\anchor cfg_separate_member_pages \anchor cfg_separate_member_pages
<dt>\c SEPARATE_MEMBER_PAGES <dd> <dt>\c SEPARATE_MEMBER_PAGES <dd>
\addindex SEPARATE_MEMBER_PAGES \addindex SEPARATE_MEMBER_PAGES
...@@ -453,10 +466,10 @@ followed by the descriptions of the tags grouped by category. ...@@ -453,10 +466,10 @@ followed by the descriptions of the tags grouped by category.
\anchor cfg_optimize_output_java \anchor cfg_optimize_output_java
<dt>\c OPTIMIZE_OUTPUT_JAVA <dd> <dt>\c OPTIMIZE_OUTPUT_JAVA <dd>
\addindex OPTIMIZE_OUTPUT_JAVA \addindex OPTIMIZE_OUTPUT_JAVA
Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java sources Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java or
only. Doxygen will then generate output that is more tailored for Java. Python sources only. Doxygen will then generate output that is more tailored
For instance, namespaces will be presented as packages, qualified scopes for that language. For instance, namespaces will be presented as packages,
will look different, etc. qualified scopes will look different, etc.
\anchor cfg_subgrouping \anchor cfg_subgrouping
<dt>\c SUBGROUPING <dd> <dt>\c SUBGROUPING <dd>
...@@ -683,18 +696,20 @@ function's detailed documentation block. ...@@ -683,18 +696,20 @@ function's detailed documentation block.
\anchor cfg_warn_if_doc_error \anchor cfg_warn_if_doc_error
<dt>\c WARN_IF_DOC_ERROR <dd> <dt>\c WARN_IF_DOC_ERROR <dd>
\addindex WARN_IF_DOC_ERROR
If \c WARN_IF_DOC_ERROR is set to \c YES, doxygen will generate warnings for If \c WARN_IF_DOC_ERROR is set to \c YES, doxygen will generate warnings for
potential errors in the documentation, such as not documenting some potential errors in the documentation, such as not documenting some
parameters in a documented function, or documenting parameters that parameters in a documented function, or documenting parameters that
don't exist or using markup commands wrongly. don't exist or using markup commands wrongly.
\anchor cfg_warn_no_paramdoc \anchor cfg_warn_no_paramdoc
<dt>\c WARN_NO_PARAMDOC <dt>\c WARN_NO_PARAMDOC <dd>
This \c WARN_NO_PARAMDOC option can be abled to get warnings for \addindex WARN_NO_PARAMDOC
functions that are documented, but have no documentation for their parameters This \c WARN_NO_PARAMDOC option can be abled to get warnings for
or return value. If set to \c NO (the default) doxygen will only warn about functions that are documented, but have no documentation for their parameters
wrong or incomplete parameter documentation, but not about the absence of or return value. If set to \c NO (the default) doxygen will only warn about
documentation. wrong or incomplete parameter documentation, but not about the absence of
documentation.
\anchor cfg_warn_format \anchor cfg_warn_format
<dt>\c WARN_FORMAT <dd> <dt>\c WARN_FORMAT <dd>
...@@ -749,7 +764,7 @@ documentation. ...@@ -749,7 +764,7 @@ documentation.
popen()) the command <code>command input-file</code>, where \c command is popen()) the command <code>command input-file</code>, where \c command is
the value of the \c FILE_VERSION_FILTER tag, and \c input-file is the name the value of the \c FILE_VERSION_FILTER tag, and \c input-file is the name
of an input file provided by doxygen. of an input file provided by doxygen.
Whatever the progam writes to standard output is used as the file version. Whatever the program writes to standard output is used as the file version.
Example of using a shell script as a filter for Unix: Example of using a shell script as a filter for Unix:
\verbatim \verbatim
...@@ -1243,12 +1258,12 @@ EXTRA_PACKAGES = times ...@@ -1243,12 +1258,12 @@ EXTRA_PACKAGES = times
\addindex PDF_HYPERLINKS \addindex PDF_HYPERLINKS
If the \c PDF_HYPERLINKS tag is set to \c YES, the \f$\mbox{\LaTeX}\f$ that If the \c PDF_HYPERLINKS tag is set to \c YES, the \f$\mbox{\LaTeX}\f$ that
is generated is prepared for conversion to PDF (using ps2pdf). is generated is prepared for conversion to PDF (using ps2pdf or pdflatex).
The PDF file will The PDF file will
contain links (just like the HTML output) instead of page references. contain links (just like the HTML output) instead of page references.
This makes the output suitable for online browsing using a PDF viewer. This makes the output suitable for online browsing using a PDF viewer.
\anchor cfg_latex_pdflatex \anchor cfg_use_pdflatex
<dt>\c USE_PDFLATEX <dd> <dt>\c USE_PDFLATEX <dd>
\addindex LATEX_PDFLATEX \addindex LATEX_PDFLATEX
......
...@@ -18,9 +18,11 @@ ...@@ -18,9 +18,11 @@
\section specialblock Special documentation blocks \section specialblock Special documentation blocks
A special documentation block is a C or C++ comment block with some A special documentation block is a C or C++ style comment block with some
additional markings, so doxygen knows it is a piece of documentation that additional markings, so doxygen knows it is a piece of documentation that
needs to end up in the generated documentation. needs to end up in the generated documentation. For Python code there is
a different comment convention, which can be found in section
\ref pythonblocks
For each code item there are two types of descriptions, which together For each code item there are two types of descriptions, which together
form the documentation: a \e brief description and \e detailed form the documentation: a \e brief description and \e detailed
...@@ -168,7 +170,7 @@ detailed description, the one before the \e definition is preferred ...@@ -168,7 +170,7 @@ detailed description, the one before the \e definition is preferred
and the one before the declaration will be ignored. and the one before the declaration will be ignored.
Here is an example of a documented piece of C++ code using the Qt style: Here is an example of a documented piece of C++ code using the Qt style:
\verbinclude qtstyle.cpp \include qtstyle.cpp
\htmlonly \htmlonly
Click <a href="$(DOXYGEN_DOCDIR)/examples/qtstyle/html/class_test.html">here</a> Click <a href="$(DOXYGEN_DOCDIR)/examples/qtstyle/html/class_test.html">here</a>
for the corresponding HTML documentation that is generated by doxygen. for the corresponding HTML documentation that is generated by doxygen.
...@@ -201,7 +203,7 @@ Here is an example: ...@@ -201,7 +203,7 @@ Here is an example:
Here is the same piece of code as shown above, this time documented using the Here is the same piece of code as shown above, this time documented using the
JavaDoc style and \ref cfg_javadoc_autobrief "JAVADOC_AUTOBRIEF" set to YES: JavaDoc style and \ref cfg_javadoc_autobrief "JAVADOC_AUTOBRIEF" set to YES:
\verbinclude jdstyle.cpp \include jdstyle.cpp
\htmlonly \htmlonly
Click <a href="$(DOXYGEN_DOCDIR)/examples/jdstyle/html/class_test.html">here</a> Click <a href="$(DOXYGEN_DOCDIR)/examples/jdstyle/html/class_test.html">here</a>
for the corresponding HTML documentation that is generated by doxygen. for the corresponding HTML documentation that is generated by doxygen.
...@@ -260,7 +262,7 @@ only the \< indicates that the member is ...@@ -260,7 +262,7 @@ only the \< indicates that the member is
located in front of the block instead of after the block. located in front of the block instead of after the block.
Here is an example of the use of these comment blocks: Here is an example of the use of these comment blocks:
\verbinclude afterdoc.h \include afterdoc.h
\htmlonly \htmlonly
Click <a href="$(DOXYGEN_DOCDIR)/examples/afterdoc/html/class_test.html">here</a> Click <a href="$(DOXYGEN_DOCDIR)/examples/afterdoc/html/class_test.html">here</a>
for the corresponding HTML documentation that is generated by doxygen. for the corresponding HTML documentation that is generated by doxygen.
...@@ -313,6 +315,7 @@ Other structural commands are: ...@@ -313,6 +315,7 @@ Other structural commands are:
<li>\c \\fn to document a function. <li>\c \\fn to document a function.
<li>\c \\var to document a variable or typedef or enum value. <li>\c \\var to document a variable or typedef or enum value.
<li>\c \\def to document a \#define. <li>\c \\def to document a \#define.
<li>\c \\typedef to document a type definition.
<li>\c \\file to document a file. <li>\c \\file to document a file.
<li>\c \\namespace to document a namespace. <li>\c \\namespace to document a namespace.
<li>\c \\package to document a Java package. <li>\c \\package to document a Java package.
...@@ -335,7 +338,7 @@ or a \verbatim /** @file */ \endverbatim line in this file. ...@@ -335,7 +338,7 @@ or a \verbatim /** @file */ \endverbatim line in this file.
Here is an example of a C header named \c structcmd.h that is documented Here is an example of a C header named \c structcmd.h that is documented
using structural commands: using structural commands:
\verbinclude structcmd.h \include structcmd.h
\htmlonly \htmlonly
Click <a href="$(DOXYGEN_DOCDIR)/examples/structcmd/html/structcmd_8h.html">here</a> Click <a href="$(DOXYGEN_DOCDIR)/examples/structcmd/html/structcmd_8h.html">here</a>
for the corresponding HTML documentation that is generated by doxygen. for the corresponding HTML documentation that is generated by doxygen.
...@@ -351,6 +354,40 @@ using structural commands: ...@@ -351,6 +354,40 @@ using structural commands:
in comment blocks which are place in front of a function. This is clearly in comment blocks which are place in front of a function. This is clearly
a case where the \\fn command is redundant and will only lead to problems. a case where the \\fn command is redundant and will only lead to problems.
\section pythonblocks Special documentation blocks in Python
For Python there is a standard way of documenting the code using
so called documentation strings. Such strings are stored in \c __doc__
and can be retrieved at runtime. Doxygen will extract such comments
and assume they have to be represented in a preformatted way.
\include docstring.py
\htmlonly
Click <a href="$(DOXYGEN_DOCDIR)/examples/docstring/html/index.html">here</a>
for the corresponding HTML documentation that is generated by doxygen.
\endhtmlonly
Note that in this case none of doxygen's \ref cmd_intro "special commands"
are supported.
There is also another way to document Python code using comments that
start with "##". These type of comment blocks are more in line with the
way documentation blocks work for the other languages support doxygen
and this also allows the use of special commands.
Here is the same example again but now using doxygen style comments:
\include pyexample.py
\htmlonly
Click <a href="$(DOXYGEN_DOCDIR)/examples/pyexample/html/index.html">here</a>
for the corresponding HTML documentation that is generated by doxygen.
\endhtmlonly
Since python looks more like Java than like C or C++, you should set
\ref cfg_optimize_output_java "OPTMIZE_OUTPUT_JAVA" to \c YES in the
config file.
\htmlonly \htmlonly
Go to the <a href="lists.html">next</a> section or return to the Go to the <a href="lists.html">next</a> section or return to the
<a href="index.html">index</a>. <a href="index.html">index</a>.
......
...@@ -21,20 +21,22 @@ ...@@ -21,20 +21,22 @@
<li>Requires very little overhead from the writer of the documentation. <li>Requires very little overhead from the writer of the documentation.
Plain text will do, but for more fancy or structured output HTML tags Plain text will do, but for more fancy or structured output HTML tags
and/or some of doxygen's special commands can be used. and/or some of doxygen's special commands can be used.
<li>Supports C/C++, Java, (Corba and Microsoft) Java, <li>Supports C/C++, Java, (Corba and Microsoft) Java, Python,
IDL, C#, Objective-C and to some extent D and PHP sources. IDL, C#, Objective-C and to some extent D and PHP sources.
<li>Supports documentation of files, namespaces, classes, structs, unions, <li>Supports documentation of files, namespaces, packages, classes,
templates, variables, functions, typedefs, enums and defines. structs, unions, templates, variables, functions, typedefs, enums and
defines.
<li>JavaDoc (1.1), Qt-Doc, and ECMA-334 (C# spec.) compatible. <li>JavaDoc (1.1), Qt-Doc, and ECMA-334 (C# spec.) compatible.
<li>Automatically generates class and collaboration diagrams in HTML (as clickable <li>Automatically generates class and collaboration diagrams in HTML (as clickable
image maps) and \f$\mbox{\LaTeX}\f$ (as Encapsulated PostScript images). image maps) and \f$\mbox{\LaTeX}\f$ (as Encapsulated PostScript images).
<li>Uses the dot tool of the Graphviz tool kit to generate <li>Uses the dot tool of the Graphviz tool kit to generate
include dependency graphs, collaboration diagrams, and include dependency graphs, collaboration diagrams, and
graphical class hierarchy graphs. graphical class hierarchy graphs.
<li>Allows you to put documentation in the header file (before the <li>Flexible comment placement: Allows you to put documentation in the
header file (before the
declaration of an entity), source file (before the definition of an entity) declaration of an entity), source file (before the definition of an entity)
or in a separate file. or in a separate file.
<li>Can generate a list of all members of a class (including any inherited <li>Generates a list of all members of a class (including any inherited
members) along with their protection level. members) along with their protection level.
<li>Outputs documentation in on-line format (HTML and UNIX man page) and <li>Outputs documentation in on-line format (HTML and UNIX man page) and
off-line format (\f$\mbox{\LaTeX}\f$ and RTF) simultaneously off-line format (\f$\mbox{\LaTeX}\f$ and RTF) simultaneously
......
...@@ -22,7 +22,7 @@ for each group. These groups are called \ref modules "'modules'" in the document ...@@ -22,7 +22,7 @@ for each group. These groups are called \ref modules "'modules'" in the document
The second mechanism works within a member list of some compound entity, The second mechanism works within a member list of some compound entity,
and is refered to as a \ref memgroup "'member groups'". and is refered to as a \ref memgroup "'member groups'".
For \ref cmdpage "pages" there is a third grouping mechanism referred to For \ref cmdpage "pages" there is a third grouping mechanism referred to
a \ref subpaging "subpaging". as \ref subpaging "subpaging".
\section modules Modules \section modules Modules
...@@ -217,4 +217,9 @@ the same time makes page B a subpage of A. This has the effect of making ...@@ -217,4 +217,9 @@ the same time makes page B a subpage of A. This has the effect of making
two groups GA and GB, where GB is part of GA, page A is put in group GA, two groups GA and GB, where GB is part of GA, page A is put in group GA,
and page B is put in group GB. and page B is put in group GB.
\htmlonly
Go to the <a href="formulas.html">next</a> section or return to the
<a href="index.html">index</a>.
\endhtmlonly
*/ */
...@@ -184,7 +184,7 @@ Compilation is now done by performing the following steps: ...@@ -184,7 +184,7 @@ Compilation is now done by performing the following steps:
This is sufficient to use doxygen. This is sufficient to use doxygen.
\note You need the GNU install tool for this to work (it is part of \note You need the GNU install tool for this to work (it is part of
the fileutils package). Other install tools may put the binaries in the coreutils package). Other install tools may put the binaries in
the wrong directory! the wrong directory!
If you have a RPM or DEP package, then please follow the If you have a RPM or DEP package, then please follow the
...@@ -549,14 +549,15 @@ features: ...@@ -549,14 +549,15 @@ features:
If you want to use MikTeX then you need to select at least the If you want to use MikTeX then you need to select at least the
medium size installation. For really old versions of MikTex or minimal medium size installation. For really old versions of MikTex or minimal
installations, you may need to download the fancyhdr package separately. installations, you may need to download the fancyhdr package separately.
You can find it at: You can find it in the
ftp://ftp.tex.ac.uk/tex-archive/macros/latex/contrib/supported/fancyhdr/ <a href="ftp://ftp.tex.ac.uk/tex-archive/macros/latex/contrib/supported/fancyhdr/">
contrib/supported</a> directory of the tex archives.
<li>If you want to generate compressed HTML help <li>If you want to generate compressed HTML help
(see \ref cfg_generate_htmlhelp "GENERATE_HTMLHELP") in the (see \ref cfg_generate_htmlhelp "GENERATE_HTMLHELP") in the
config file, then you need the Microsoft HTML help workshop. config file, then you need the Microsoft HTML help workshop.
You can download it at: You can download it from
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/htmlhelp/html/vsconHH1Start.asp <a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/htmlhelp/html/vsconHH1Start.asp">Microsoft</a>.
<li><a href="http://www.research.att.com/sw/tools/graphviz/"> <li><a href="http://www.research.att.com/sw/tools/graphviz/">
the Graph visualization toolkit version 1.8.10</a><br> the Graph visualization toolkit version 1.8.10</a><br>
......
...@@ -78,7 +78,7 @@ when the translator was updated. ...@@ -78,7 +78,7 @@ when the translator was updated.
<td>Chinese Traditional</td> <td>Chinese Traditional</td>
<td>Daniel YC Lin<br>Gary Lee</td> <td>Daniel YC Lin<br>Gary Lee</td>
<td>daniel at twpda dot com<br>garylee at ecosine dot com dot tw</td> <td>daniel at twpda dot com<br>garylee at ecosine dot com dot tw</td>
<td>1.3.8</td> <td>up-to-date</td>
</tr> </tr>
<tr bgcolor="#ffffff"> <tr bgcolor="#ffffff">
<td>Croatian</td> <td>Croatian</td>
...@@ -273,7 +273,7 @@ when the translator was updated. ...@@ -273,7 +273,7 @@ when the translator was updated.
Chinese & Li Daobing & {\tt\tiny lidaobing@gmail.com} & 1.4.1 \\ Chinese & Li Daobing & {\tt\tiny lidaobing@gmail.com} & 1.4.1 \\
~ & Wei Liu & {\tt\tiny liuwei@asiainfo.com} & ~ \\ ~ & Wei Liu & {\tt\tiny liuwei@asiainfo.com} & ~ \\
\hline \hline
Chinese Traditional & Daniel YC Lin & {\tt\tiny daniel@twpda.com} & 1.3.8 \\ Chinese Traditional & Daniel YC Lin & {\tt\tiny daniel@twpda.com} & up-to-date \\
~ & Gary Lee & {\tt\tiny garylee@ecosine.com.tw} & ~ \\ ~ & Gary Lee & {\tt\tiny garylee@ecosine.com.tw} & ~ \\
\hline \hline
Croatian & Boris Bralo & {\tt\tiny boris.bralo@zg.htnet.hr} & up-to-date \\ Croatian & Boris Bralo & {\tt\tiny boris.bralo@zg.htnet.hr} & up-to-date \\
......
/*! \page lists Lists /*! \page lists Lists
Doxygen has a number of ways to create lists of items. Doxygen provides a number of ways to create lists of items.
<b>Using dashes</b> <b>Using dashes</b>
By putting a number of column-aligned minus signs at the start of a By putting a number of column-aligned minus signs at the start of a
line, a bullet list will automatically be generated. line, a bullet list will automatically be generated.
Numbered lists can also be generated by using a minus followed by a hash. Numbered lists can also be generated by using a minus followed by a hash.
Nesting of lists is allowed.<p> Nesting of lists is allowed and is based on indentation of the items.<p>
Here is an example: Here is an example:
\verbatim \verbatim
/*! /*!
...@@ -38,8 +38,9 @@ Doxygen has a number of ways to create lists of items. ...@@ -38,8 +38,9 @@ Doxygen has a number of ways to create lists of items.
More text here. More text here.
If you use tabs within lists, please make sure that \ref cfg_tab_size "TAB_SIZE" in the If you use tabs for indentation within lists, please make sure
configuration file is set to the correct tab size. that \ref cfg_tab_size "TAB_SIZE" in the configuration file is set to
the correct tab size.
You can end a list by starting a new paragraph or You can end a list by starting a new paragraph or
by putting a dot (.) on an empty line at the same indent level as the by putting a dot (.) on an empty line at the same indent level as the
...@@ -98,7 +99,7 @@ Here is the above example with HTML commands: ...@@ -98,7 +99,7 @@ Here is the above example with HTML commands:
*/ */
\endverbatim \endverbatim
\note The indentation here is not important. \note In this case the indentation is not important.
<b>Using \\arg or \@li</b> <b>Using \\arg or \@li</b>
......
...@@ -26,11 +26,14 @@ for which you do not have the sources. See section \ref doxytag_usage ...@@ -26,11 +26,14 @@ for which you do not have the sources. See section \ref doxytag_usage
for more detailed usage information. for more detailed usage information.
Optionally, the executable \c doxywizard can be used, which is a Optionally, the executable \c doxywizard can be used, which is a
graphical front-end for editing the configuration file that is used by \ref doxywizard_usage "graphical front-end" for editing the configuration file
doxygen. that is used by doxygen and for running doxygen in a graphical environment.
For Mac OS X doxywizard will be started by clicking on the Doxygen application
icon.
The following figure shows the relation between the tools and the flow The following figure shows the relation between the tools and the flow
of information between them: of information between them (it looks complex but that's only because it
tries to be complete):
\image html infoflow.gif "Doxygen information flow" \image html infoflow.gif "Doxygen information flow"
\image latex infoflow.eps "Doxygen information flow" width=14cm \image latex infoflow.eps "Doxygen information flow" width=14cm
...@@ -55,7 +58,7 @@ name \<config-file\> already exists, doxygen will rename it to ...@@ -55,7 +58,7 @@ name \<config-file\> already exists, doxygen will rename it to
\<config-file\>.bak before generating the configuration template. \<config-file\>.bak before generating the configuration template.
If you use <code>-</code> (i.e. the minus sign) as the file name then If you use <code>-</code> (i.e. the minus sign) as the file name then
doxygen will try to read the configuration file from standard doxygen will try to read the configuration file from standard
input (<code>stdin</code>). input (<code>stdin</code>), which can be useful for scripting.
The configuration file has a format that is similar to that of a (simple) The configuration file has a format that is similar to that of a (simple)
Makefile. It contains of a number of assignments (tags) of the form: Makefile. It contains of a number of assignments (tags) of the form:
...@@ -78,8 +81,8 @@ and header files, you can leave ...@@ -78,8 +81,8 @@ and header files, you can leave
the current directory. the current directory.
If you have a larger project consisting of a source directory or tree If you have a larger project consisting of a source directory or tree
you should put the root directory or you should assign the root directory or
directories after the \ref cfg_input "INPUT" tag, and add one or more file directories to the \ref cfg_input "INPUT" tag, and add one or more file
patterns to the \ref cfg_file_patterns "FILE_PATTERNS" tag patterns to the \ref cfg_file_patterns "FILE_PATTERNS" tag
(for instance <code>*.cpp *.h</code>). Only files that match one of the (for instance <code>*.cpp *.h</code>). Only files that match one of the
patterns will be parsed (if the patterns are omitted a list of patterns will be parsed (if the patterns are omitted a list of
...@@ -92,17 +95,21 @@ To omit all \c test directories from a source tree for instance, one could use: ...@@ -92,17 +95,21 @@ To omit all \c test directories from a source tree for instance, one could use:
\verbatim EXCLUDE_PATTERNS = */test/* \verbatim EXCLUDE_PATTERNS = */test/*
\endverbatim \endverbatim
Doxygen normally parses files if they are C or C++ sources. If a file Doxygen looking at the file's extension to determine how to parse a file.
has a <code>.idl</code> or <code>.odl</code> extension it is treated as an If a file has an <code>.idl</code> or <code>.odl</code> extension it is
IDL file. If it has a <code>.java</code> extension it is treated as a file treated as an IDL file. If it has a <code>.java</code> extension it is
written in Java. Files ending with <code>.cs</code> are treated as C# files. treated as a file written in Java. Files ending with <code>.cs</code> are
Finally, files with the extensions <code>.php</code>, <code>.php4</code>, treated as C# files and the <code>.py</code> extension selects the
Python parser. Finally, files with the extensions <code>.php</code>, <code>.php4</code>,
<code>.inc</code> or <code>.phtml</code> are treated as PHP sources. <code>.inc</code> or <code>.phtml</code> are treated as PHP sources.
Any other extension is parsed as if it is a C/C++ file, where files that
end with <code>.m</code> are treated as Objective-C source files.
\anchor extract_all \anchor extract_all
If you start using doxygen for an existing project (thus without any If you start using doxygen for an existing project (thus without any
documentation that doxygen is aware of), you can still get an idea of documentation that doxygen is aware of), you can still get an idea of
what the documented result would be. To do so, you must set what the structure is and how the documented result would look like.
To do so, you must set
the \ref cfg_extract_all "EXTRACT_ALL" tag in the configuration file the \ref cfg_extract_all "EXTRACT_ALL" tag in the configuration file
to \c YES. Then, doxygen will pretend everything in your sources is documented. to \c YES. Then, doxygen will pretend everything in your sources is documented.
Please note that as a consequence warnings about undocumented members Please note that as a consequence warnings about undocumented members
...@@ -124,46 +131,91 @@ To generate the documentation you can now enter: ...@@ -124,46 +131,91 @@ To generate the documentation you can now enter:
doxygen <config-file> doxygen <config-file>
\endverbatim \endverbatim
Doxygen will create a \c html, \c rtf, \c latex and/or \c man directory inside Depending on your settings doxygen will create \c html, \c rtf,
the output directory. \c latex, \c xml and/or \c man directories inside the output directory.
As the names suggest these directories contain the As the names suggest these directories contain the
generated documentation in HTML, RTF, \f$\mbox{\LaTeX}\f$ and Unix-Man page generated documentation in HTML, RTF, \f$\mbox{\LaTeX}\f$, XML and
format. Unix-Man page format.
The default output directory is the directory in which \c doxygen The default output directory is the directory in which \c doxygen
is started. The directory to which the output is written can be changed is started. The root directory to which the output is written can be changed
using the \ref cfg_output_directory "OUTPUT_DIRECTORY", using the \ref cfg_output_directory "OUTPUT_DIRECTORY". The format specific
directory within the output directory can be selected using the
\ref cfg_html_output "HTML_OUTPUT", \ref cfg_rtf_output "RTF_OUTPUT", \ref cfg_html_output "HTML_OUTPUT", \ref cfg_rtf_output "RTF_OUTPUT",
\ref cfg_latex_output "LATEX_OUTPUT", and \ref cfg_man_output "MAN_OUTPUT" \ref cfg_latex_output "LATEX_OUTPUT", \ref cfg_xml_output "XML_OUTPUT",
and \ref cfg_man_output "MAN_OUTPUT"
tags of the configuration file. If the output directory does not exist, tags of the configuration file. If the output directory does not exist,
\c doxygen will try to create it for you. \c doxygen will try to create it for you (but it will \e not try to create
a whole path recursively, like <code>mkdir -p</code> does).
\subsection html_out HTML output
\addindex browser \addindex browser
The generated HTML documentation can be viewed by pointing a HTML browser The generated HTML documentation can be viewed by pointing a HTML browser
to the \c index.html file in the \c html directory. For the best results to the \c index.html file in the \c html directory. For the best results
a browser that supports cascading style sheets (CSS) should be used a browser that supports cascading style sheets (CSS) should be used
(I'm currently using Netscape 4.61 to test the generated output). (I'm using Mozilla, Safari, Konqueror, and sometimes IE6 to test the
\addindex LaTeX generated output).
Some of the features the HTML section (such as
\ref cfg_generate_treeview "GENERATE_TREEVIEW") require a browser that
supports DHTML and Javascript.
If you plan to use the search engine (see
\ref cfg_searchengine "SEARCHENGINE"), you should view the HTML output
via a PHP enable web server (e.g. apache with the PHP module installed).
\subsection latex_out LaTeX output
\addindex LaTeX
The generated \f$\mbox{\LaTeX}\f$ documentation must first be compiled by The generated \f$\mbox{\LaTeX}\f$ documentation must first be compiled by
a \f$\mbox{\LaTeX}\f$ compiler (I use teTeX distribution version 0.9 a \f$\mbox{\LaTeX}\f$ compiler (I use a recent teTeX distribution).
that contains \f$\mbox{\TeX}\f$ version 3.14159). To simplify the process To simplify the process of compiling the generated
of compiling the generated
documentation, \c doxygen writes a \c Makefile into the \c latex directory. documentation, \c doxygen writes a \c Makefile into the \c latex directory.
By typing \c make in the \c latex directory the dvi file \c refman.dvi By typing \c make in the \c latex directory the dvi file \c refman.dvi
will be generated (provided that you have a make tool called will be generated (provided that you have a make tool called
<code>make</code> of course). This file can then be viewed using \c xdvi or <code>make</code> of course). This file can then be viewed using \c xdvi or
converted into a PostScript file \c refman.ps by converted into a PostScript file \c refman.ps by
typing <code>make ps</code> (this requires <code>dvips</code>). typing <code>make ps</code> (this requires <code>dvips</code>).
To put 2 pages on one physical page use <code>make ps_2on1</code> instead. To put 2 pages on one physical page use <code>make ps_2on1</code> instead.
The resulting PostScript file can be send to a PostScript The resulting PostScript file can be send to a PostScript
printer. If you do not have a PostScript printer, you can try to use printer. If you do not have a PostScript printer, you can try to use
ghostscript to convert PostScript into something your printer understands. ghostscript to convert PostScript into something your printer understands.
Conversion to PDF is also possible if you have installed the ghostscript Conversion to PDF is also possible if you have installed the ghostscript
interpreter; just type <code>make pdf</code> (or <code>make pdf_2on1</code>). interpreter; just type <code>make pdf</code> (or <code>make pdf_2on1</code>).
To get the best results for PDF output you should set To get the best results for PDF output you should set
the \ref cfg_pdf_hyperlinks "PDF_HYPERLINKS" tag to \c YES. the \ref cfg_pdf_hyperlinks "PDF_HYPERLINKS"
and \ref cfg_use_pdflatex "USE_PDFLATEX" tags to \c YES.
\subsection rtf_out RTF output
\addindex RTF
Doxygen combines the RTF output to a single file called refman.rtf. This
file is optimized for importing into the Microsoft Word. Certain information
is encoded using field. To show the actual value you need to
select all (Edit - select all) and then toggle fields (right click and select
the option from the drop down menu).
\subsection xml_out XML output
\addindex XML
The XML output consists of a structured "dump" of the information gathered
by doxygen. Each compound (class/namespace/file/...) has its own XML file
and there is also an index file called index.xml.
A file called combine.xslt
XSLT script is also generated and can be used to combine all XML files
into a single file.
Doxygen also generates two XML schema files index.xsd
(for the index file) and compound.xsd (for the compound files).
This schema file describes the possible elements, their attributes and
how they are structured, i.e. it the describes the grammar of the XML
files and can be used for validation or to steer XSLT scripts.
In the addon/doxmlparser directory you can find a parser library for reading
the XML output produced by doxygen in an incremental way
(see addon/doxmlparser/include/doxmlintf.h for the interface of the library)
\subsection man_out Man page output
The generated man pages can be viewed using the \c man program. You do need The generated man pages can be viewed using the \c man program. You do need
to make sure the man directory is in the man path (see the \c MANPATH to make sure the man directory is in the man path (see the \c MANPATH
environment variable). Note that there are some limitations to the environment variable). Note that there are some limitations to the
...@@ -215,7 +267,9 @@ During parsing the following steps take place: ...@@ -215,7 +267,9 @@ During parsing the following steps take place:
<li> All resulting blank lines are treated as a paragraph separators. <li> All resulting blank lines are treated as a paragraph separators.
This saves you from placing new-paragraph commands yourself This saves you from placing new-paragraph commands yourself
in order to make the generated documentation readable. in order to make the generated documentation readable.
<li> Links are created for words corresponding to documented classes. <li> Links are created for words corresponding to documented classes
(unless the word is preceded by a \%; then the word will not be linked and
the \% sign is removed).
<li> Links to members are created when certain patterns are found in the <li> Links to members are created when certain patterns are found in the
text. See section \ref autolink text. See section \ref autolink
for more information on how the automatic link generation works. for more information on how the automatic link generation works.
......
...@@ -8,7 +8,7 @@ German, Greek, Hungarian, Indonesian, Italian, Japanese (+En), Korean ...@@ -8,7 +8,7 @@ German, Greek, Hungarian, Indonesian, Italian, Japanese (+En), Korean
(+En), Lithuanian, Norwegian, Polish, Portuguese, Romanian, Russian, (+En), Lithuanian, Norwegian, Polish, Portuguese, Romanian, Russian,
Serbian, Slovak, Slovene, Spanish, Swedish, and Ukrainian. Serbian, Slovak, Slovene, Spanish, Swedish, and Ukrainian.
Of them, 17 translators are up-to-date, 14 translators are based on Of them, 18 translators are up-to-date, 13 translators are based on
some adapter class, and 2 are English based. some adapter class, and 2 are English based.
---------------------------------------------------------------------- ----------------------------------------------------------------------
...@@ -20,6 +20,7 @@ still may be some details listed even for them: ...@@ -20,6 +20,7 @@ still may be some details listed even for them:
TranslatorAfrikaans TranslatorAfrikaans
TranslatorBrazilian -- Remove the obsolete methods (never used). TranslatorBrazilian -- Remove the obsolete methods (never used).
TranslatorCatalan TranslatorCatalan
TranslatorChinesetraditional -- Remove the obsolete methods (never used).
TranslatorCroatian TranslatorCroatian
TranslatorCzech TranslatorCzech
TranslatorDutch -- Remove the obsolete methods (never used). TranslatorDutch -- Remove the obsolete methods (never used).
...@@ -49,7 +50,6 @@ must be implemented to become up-to-date: ...@@ -49,7 +50,6 @@ must be implemented to become up-to-date:
TranslatorJapanese 1.3.9 7 methods to implement TranslatorJapanese 1.3.9 7 methods to implement
TranslatorDanish 1.3.9 7 methods to implement TranslatorDanish 1.3.9 7 methods to implement
TranslatorSpanish 1.3.8 8 methods to implement TranslatorSpanish 1.3.8 8 methods to implement
TranslatorChinesetraditional 1.3.8 8 methods to implement
TranslatorPortuguese 1.3.3 12 methods to implement TranslatorPortuguese 1.3.3 12 methods to implement
TranslatorSlovak 1.2.18 21 methods to implement TranslatorSlovak 1.2.18 21 methods to implement
TranslatorSlovene 1.2.16 23 methods to implement TranslatorSlovene 1.2.16 23 methods to implement
...@@ -99,21 +99,10 @@ TranslatorChinese (TranslatorAdapter_1_4_1) 1 method to implement ...@@ -99,21 +99,10 @@ TranslatorChinese (TranslatorAdapter_1_4_1) 1 method to implement
virtual QCString trOverloadText() virtual QCString trOverloadText()
TranslatorChinesetraditional (TranslatorAdapter_1_3_8) 8 methods to implement TranslatorChinesetraditional (Translator)
---------------------------- ----------------------------
Implements 184 of the required methods. Implements 192 of the required methods.
Missing methods (should be implemented):
virtual QCString trOverloadText()
virtual QCString trDirIndex()
virtual QCString trDirDocumentation()
virtual QCString trDirectories()
virtual QCString trDirDescription()
virtual QCString trSourceFile(QCString & filename)
virtual QCString trDirReference(const char * dirName)
virtual QCString trDir(bool first_capital, bool singular)
Obsolete methods (should be removed, never used): Obsolete methods (should be removed, never used):
......
...@@ -134,5 +134,9 @@ For patches please use ...@@ -134,5 +134,9 @@ For patches please use
one file please tar or zip everything, so I only have to save and download one file please tar or zip everything, so I only have to save and download
one file. one file.
\htmlonly
Return to the <a href="index.html">index</a>.
\endhtmlonly
*/ */
...@@ -21,13 +21,15 @@ all: class/html/index.html \ ...@@ -21,13 +21,15 @@ all: class/html/index.html \
tag/html/index.html \ tag/html/index.html \
group/html/index.html \ group/html/index.html \
diagrams/html/index.html \ diagrams/html/index.html \
memgrp/html/index.html memgrp/html/index.html \
docstring/html/index.html \
pyexample/html/index.html
clean: clean:
rm -rf class define enum file func page relates author \ rm -rf class define enum file func page relates author \
par overload example include qtstyle jdstyle structcmd \ par overload example include qtstyle jdstyle structcmd \
autolink tag restypedef afterdoc template tag group diagrams \ autolink tag restypedef afterdoc template tag group diagrams \
memgrp memgrp docstring pyexample
class/html/index.html: class.h class.cfg class/html/index.html: class.h class.cfg
$(DOXYGEN)/bin/doxygen class.cfg $(DOXYGEN)/bin/doxygen class.cfg
...@@ -97,7 +99,14 @@ group/html/index.html: group.cpp group.cfg ...@@ -97,7 +99,14 @@ group/html/index.html: group.cpp group.cfg
memgrp/html/index.html: memgrp.cpp memgrp.cfg memgrp/html/index.html: memgrp.cpp memgrp.cfg
$(DOXYGEN)/bin/doxygen memgrp.cfg $(DOXYGEN)/bin/doxygen memgrp.cfg
pyexample/html/index.html: pyexample.py pyexample.cfg
$(DOXYGEN)/bin/doxygen pyexample.cfg
docstring/html/index.html: docstring.py docstring.cfg
$(DOXYGEN)/bin/doxygen docstring.cfg
diagrams/html/index.html: diagrams_a.h diagrams_b.h diagrams_c.h diagrams_d.h diagrams_e.h diagrams.cfg diagrams/html/index.html: diagrams_a.h diagrams_b.h diagrams_c.h diagrams_d.h diagrams_e.h diagrams.cfg
ifneq ($(HAVE_DOT),) ifneq ($(HAVE_DOT),)
$(DOXYGEN)/bin/doxygen diagrams.cfg $(DOXYGEN)/bin/doxygen diagrams.cfg
endif endif
...@@ -22,10 +22,12 @@ all: class/html/index.html \ ...@@ -22,10 +22,12 @@ all: class/html/index.html \
tag/html/index.html \ tag/html/index.html \
group/html/index.html \ group/html/index.html \
diagrams/html/index.html \ diagrams/html/index.html \
memgrp/html/index.html memgrp/html/index.html \
docstring/html/index.html \
pyexample/html/index.html
clean: clean:
deltree /y class define enum file deltree /y class define enum file pyexample docstring
deltree /y func page relates author deltree /y func page relates author
deltree /y par overload example include qtstyle deltree /y par overload example include qtstyle
deltree /y jdstyle structcmd autolink resdefine deltree /y jdstyle structcmd autolink resdefine
...@@ -97,5 +99,12 @@ group/html/index.html: group.cpp group.cfg ...@@ -97,5 +99,12 @@ group/html/index.html: group.cpp group.cfg
memgrp/html/index.html: memgrp.cpp memgrp.cfg memgrp/html/index.html: memgrp.cpp memgrp.cfg
$(DOXYDIR)\doxygen memgrp.cfg $(DOXYDIR)\doxygen memgrp.cfg
pyexample/html/index.html: pyexample.py pyexample.cfg
$(DOXYDIR)\doxygen pyexample.cfg
docstring/html/index.html: docstring.py docstring.cfg
$(DOXYDIR)\doxygen docstring.cfg
diagrams/html/index.html: diagrams_a.h diagrams_b.h diagrams_c.h diagrams_d.h diagrams_e.h diagrams.cfg diagrams/html/index.html: diagrams_a.h diagrams_b.h diagrams_c.h diagrams_d.h diagrams_e.h diagrams.cfg
$(DOXYDIR)\doxygen diagrams.cfg $(DOXYDIR)\doxygen diagrams.cfg
PROJECT_NAME = "Python"
OUTPUT_DIRECTORY = docstring
GENERATE_LATEX = NO
GENERATE_MAN = NO
GENERATE_RTF = NO
OPTIMIZE_OUTPUT_JAVA = YES
INPUT = docstring.py
QUIET = YES
JAVADOC_AUTOBRIEF = YES
"""Documentation for this module.
More details.
"""
def func():
"""Documentation for a function.
More details.
"""
pass
class PyClass:
"""Documentation for a class.
More details.
"""
def __init__(self):
"""The constructor."""
self._memVar = 0;
def PyMethod(self):
"""Documentation for a method."""
pass
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
<type>void</type> <type>void</type>
<name>example</name> <name>example</name>
<anchorfile>class_test.html</anchorfile> <anchorfile>class_test.html</anchorfile>
<anchor>a0</anchor> <anchor>example_28_29</anchor>
<arglist>()</arglist> <arglist>()</arglist>
</member> </member>
</compound> </compound>
......
PROJECT_NAME = "Python"
OUTPUT_DIRECTORY = pyexample
GENERATE_LATEX = NO
GENERATE_MAN = NO
GENERATE_RTF = NO
OPTIMIZE_OUTPUT_JAVA = YES
INPUT = pyexample.py
QUIET = YES
JAVADOC_AUTOBRIEF = YES
## Documentation for this module.
#
# More details.
## Documentation for a function.
#
# More details.
def func():
pass
## Documentation for a class.
#
# More details.
class PyClass:
## The constructor.
def __init__(self):
self._memVar = 0;
## Documentation for a method.
# @param self The object pointer.
def PyMethod(self):
pass
## A class variable.
classVar = 0;
## @var _memVar
# a member variable
...@@ -25,7 +25,7 @@ template<class T> class Test<T *> : public Test<void *,200> ...@@ -25,7 +25,7 @@ template<class T> class Test<T *> : public Test<void *,200>
template<class T,int i> Test<T,i>::Test() {} template<class T,int i> Test<T,i>::Test() {}
/*! The copy constructor */ /*! The copy constructor */
template<class T,int i> Test<T,i>::Test(const Test<T,i> &t) {} template<class T,int i> Test<T,i>::Test(const Test &t) {}
/*! The constructor of the partial specilization */ /*! The constructor of the partial specilization */
template<class T> Test<T *>::Test() {} template<class T> Test<T *>::Test() {}
......
...@@ -1883,7 +1883,7 @@ void ClassDef::setTemplateArguments(ArgumentList *al) ...@@ -1883,7 +1883,7 @@ void ClassDef::setTemplateArguments(ArgumentList *al)
*/ */
bool ClassDef::hasNonReferenceSuperClass() bool ClassDef::hasNonReferenceSuperClass()
{ {
bool found=!isReference() && isLinkableInProject(); bool found=!isReference() && isLinkableInProject() && !isHidden();
if (found) if (found)
{ {
return TRUE; // we're done if this class is not a reference return TRUE; // we're done if this class is not a reference
...@@ -2778,6 +2778,7 @@ ClassDef *ClassDef::insertTemplateInstance(const QCString &fileName, ...@@ -2778,6 +2778,7 @@ ClassDef *ClassDef::insertTemplateInstance(const QCString &fileName,
fileName,startLine,name()+templSpec,ClassDef::Class); fileName,startLine,name()+templSpec,ClassDef::Class);
templateClass->setTemplateMaster(this); templateClass->setTemplateMaster(this);
templateClass->setOuterScope(getOuterScope()); templateClass->setOuterScope(getOuterScope());
templateClass->setHidden(isHidden());
m_templateInstances->insert(templSpec,templateClass); m_templateInstances->insert(templSpec,templateClass);
freshInstance=TRUE; freshInstance=TRUE;
} }
......
...@@ -320,12 +320,16 @@ CHARLIT (("'"\\[0-7]{1,3}"'")|("'"\\."'")|("'"[^' \\\n]{1,4}"'")) ...@@ -320,12 +320,16 @@ CHARLIT (("'"\\[0-7]{1,3}"'")|("'"\\."'")|("'"[^' \\\n]{1,4}"'"))
copyToOutput(yytext,yyleng); copyToOutput(yytext,yyleng);
BEGIN(CComment); BEGIN(CComment);
} }
<CComment>[\\@]("verbatim"|"latexonly"|"htmlonly"|"xmlonly"|"rtfonly"|"manonly"|"dot"|"code"|"f$"|"f[")/[ \r\t\n] { /* start of a verbatim block */ <CComment>[\\@]("verbatim"|"latexonly"|"htmlonly"|"xmlonly"|"rtfonly"|"manonly"|"dot"|"code"|"f$"|"f["|"f{")/[^a-z_A-Z0-9] { /* start of a verbatim block */
copyToOutput(yytext,yyleng); copyToOutput(yytext,yyleng);
if (yytext[2]=='[') if (yytext[2]=='[')
{ {
g_blockName="f]"; g_blockName="f]";
} }
else if (yytext[2]=='{')
{
g_blockName="f}";
}
else else
{ {
g_blockName=&yytext[1]; g_blockName=&yytext[1];
...@@ -336,7 +340,7 @@ CHARLIT (("'"\\[0-7]{1,3}"'")|("'"\\."'")|("'"[^' \\\n]{1,4}"'")) ...@@ -336,7 +340,7 @@ CHARLIT (("'"\\[0-7]{1,3}"'")|("'"\\."'")|("'"[^' \\\n]{1,4}"'"))
<Scan>. { /* any other character */ <Scan>. { /* any other character */
copyToOutput(yytext,yyleng); copyToOutput(yytext,yyleng);
} }
<Verbatim>[\\@]("endverbatim"|"endlatexonly"|"endhtmlonly"|"endxmlonly"|"endrtfonly"|"endmanonly"|"enddot"|"endcode"|"f$"|"f]") { /* end of verbatim block */ <Verbatim>[\\@]("endverbatim"|"endlatexonly"|"endhtmlonly"|"endxmlonly"|"endrtfonly"|"endmanonly"|"enddot"|"endcode"|"f$"|"f]"|"f}") { /* end of verbatim block */
copyToOutput(yytext,yyleng); copyToOutput(yytext,yyleng);
if (yytext[1]=='f') // end of formula if (yytext[1]=='f') // end of formula
{ {
......
...@@ -105,7 +105,6 @@ static bool handlePublic(const QCString &s); ...@@ -105,7 +105,6 @@ static bool handlePublic(const QCString &s);
static bool handlePublicSection(const QCString &s); static bool handlePublicSection(const QCString &s);
static bool handleInherit(const QCString &); static bool handleInherit(const QCString &);
typedef bool (*DocCmdFunc)(const QCString &name); typedef bool (*DocCmdFunc)(const QCString &name);
struct DocCmdMap struct DocCmdMap
...@@ -811,7 +810,11 @@ MAILADR [a-z_A-Z0-9.+\-]+"@"[a-z_A-Z0-9\-]+("."[a-z_A-Z0-9\-]+)+[a-z_A-Z0-9\-] ...@@ -811,7 +810,11 @@ MAILADR [a-z_A-Z0-9.+\-]+"@"[a-z_A-Z0-9\-]+("."[a-z_A-Z0-9\-]+)+[a-z_A-Z0-9\-]
addOutput(yytext); addOutput(yytext);
} }
<Comment>{DETAILEDCMD}/[^a-z_A-Z]* { // command that can end a brief description <Comment>{DETAILEDCMD}/[^a-z_A-Z]* { // command that can end a brief description
if (inContext!=OutputXRef) setOutput(OutputDoc); if (inContext!=OutputXRef)
{
briefEndsAtDot=FALSE;
setOutput(OutputDoc);
}
// continue with the same input // continue with the same input
REJECT; REJECT;
} }
...@@ -924,6 +927,7 @@ MAILADR [a-z_A-Z0-9.+\-]+"@"[a-z_A-Z0-9\-]+("."[a-z_A-Z0-9\-]+)+[a-z_A-Z0-9\-] ...@@ -924,6 +927,7 @@ MAILADR [a-z_A-Z0-9.+\-]+"@"[a-z_A-Z0-9\-]+("."[a-z_A-Z0-9\-]+)+[a-z_A-Z0-9\-]
if (briefEndsAtDot) if (briefEndsAtDot)
{ {
setOutput(OutputDoc); setOutput(OutputDoc);
briefEndsAtDot=FALSE;
} }
} }
<Comment>\n { // newline <Comment>\n { // newline
...@@ -1434,8 +1438,10 @@ MAILADR [a-z_A-Z0-9.+\-]+"@"[a-z_A-Z0-9\-]+("."[a-z_A-Z0-9\-]+)+[a-z_A-Z0-9\-] ...@@ -1434,8 +1438,10 @@ MAILADR [a-z_A-Z0-9.+\-]+"@"[a-z_A-Z0-9\-]+("."[a-z_A-Z0-9\-]+)+[a-z_A-Z0-9\-]
} }
<FormatBlock>"/*" { // start of a C-comment <FormatBlock>"/*" { // start of a C-comment
g_commentCount++; g_commentCount++;
addOutput(yytext);
} }
<FormatBlock>"*/" { // end of a C-comment <FormatBlock>"*/" { // end of a C-comment
addOutput(yytext);
g_commentCount--; g_commentCount--;
if (g_commentCount<0 && blockName!="verbatim") if (g_commentCount<0 && blockName!="verbatim")
{ {
......
...@@ -151,6 +151,7 @@ ...@@ -151,6 +151,7 @@
<xsd:complexType name="descriptionType" mixed="true"> <xsd:complexType name="descriptionType" mixed="true">
<xsd:sequence> <xsd:sequence>
<xsd:element name="title" type="xsd:string" minOccurs="0"/>
<xsd:element name="para" type="docParaType" minOccurs="0" maxOccurs="unbounded" /> <xsd:element name="para" type="docParaType" minOccurs="0" maxOccurs="unbounded" />
<xsd:element name="sect1" type="docSect1Type" minOccurs="0" maxOccurs="unbounded" /> <xsd:element name="sect1" type="docSect1Type" minOccurs="0" maxOccurs="unbounded" />
<xsd:element name="internal" type="docInternalType" minOccurs="0" /> <xsd:element name="internal" type="docInternalType" minOccurs="0" />
......
...@@ -151,6 +151,7 @@ ...@@ -151,6 +151,7 @@
"\n" "\n"
" <xsd:complexType name=\"descriptionType\" mixed=\"true\">\n" " <xsd:complexType name=\"descriptionType\" mixed=\"true\">\n"
" <xsd:sequence>\n" " <xsd:sequence>\n"
" <xsd:element name=\"title\" type=\"xsd:string\" minOccurs=\"0\"/> \n"
" <xsd:element name=\"para\" type=\"docParaType\" minOccurs=\"0\" maxOccurs=\"unbounded\" />\n" " <xsd:element name=\"para\" type=\"docParaType\" minOccurs=\"0\" maxOccurs=\"unbounded\" />\n"
" <xsd:element name=\"sect1\" type=\"docSect1Type\" minOccurs=\"0\" maxOccurs=\"unbounded\" />\n" " <xsd:element name=\"sect1\" type=\"docSect1Type\" minOccurs=\"0\" maxOccurs=\"unbounded\" />\n"
" <xsd:element name=\"internal\" type=\"docInternalType\" minOccurs=\"0\" />\n" " <xsd:element name=\"internal\" type=\"docInternalType\" minOccurs=\"0\" />\n"
......
...@@ -1472,14 +1472,6 @@ void Config::create() ...@@ -1472,14 +1472,6 @@ void Config::create()
"re-implements. \n", "re-implements. \n",
TRUE TRUE
); );
cb = addBool(
"DISTRIBUTE_GROUP_DOC",
"If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC \n"
"tag is set to YES, then doxygen will reuse the documentation of the first \n"
"member in the group (if any) for the other members of the group. By default \n"
"all members of a group must be documented explicitly.\n",
FALSE
);
cb = addBool( cb = addBool(
"SEPARATE_MEMBER_PAGES", "SEPARATE_MEMBER_PAGES",
"If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce \n" "If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce \n"
...@@ -1512,12 +1504,30 @@ void Config::create() ...@@ -1512,12 +1504,30 @@ void Config::create()
); );
cb = addBool( cb = addBool(
"OPTIMIZE_OUTPUT_JAVA", "OPTIMIZE_OUTPUT_JAVA",
"Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java sources \n" "Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java \n"
"only. Doxygen will then generate output that is more tailored for Java. \n" "sources only. Doxygen will then generate output that is more tailored for Java. \n"
"For instance, namespaces will be presented as packages, qualified scopes \n" "For instance, namespaces will be presented as packages, qualified scopes \n"
"will look different, etc. \n", "will look different, etc. \n",
FALSE FALSE
); );
cb = addBool(
"BUILTIN_STL_SUPPORT",
"If you use STL classes (i.e. std::string, std::vector, etc.) but do not want to \n"
"include (a tag file for) the STL sources as input, then you should \n"
"set this tag to YES in order to let doxygen match functions declarations and \n"
"definitions whose arguments contain STL classes (e.g. func(std::string); v.s. \n"
"func(std::string) {}). This also make the inheritance and collaboration \n"
"diagrams that involve STL classes more complete and accurate. \n",
FALSE
);
cb = addBool(
"DISTRIBUTE_GROUP_DOC",
"If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC \n"
"tag is set to YES, then doxygen will reuse the documentation of the first \n"
"member in the group (if any) for the other members of the group. By default \n"
"all members of a group must be documented explicitly.\n",
FALSE
);
cb = addBool( cb = addBool(
"SUBGROUPING", "SUBGROUPING",
"Set the SUBGROUPING tag to YES (the default) to allow class member groups of \n" "Set the SUBGROUPING tag to YES (the default) to allow class member groups of \n"
...@@ -1731,7 +1741,7 @@ void Config::create() ...@@ -1731,7 +1741,7 @@ void Config::create()
"version control system). Doxygen will invoke the program by executing (via \n" "version control system). Doxygen will invoke the program by executing (via \n"
"popen()) the command <command> <input-file>, where <command> is the value of \n" "popen()) the command <command> <input-file>, where <command> is the value of \n"
"the FILE_VERSION_FILTER tag, and <input-file> is the name of an input file \n" "the FILE_VERSION_FILTER tag, and <input-file> is the name of an input file \n"
"provided by doxygen. Whatever the progam writes to standard output \n" "provided by doxygen. Whatever the program writes to standard output \n"
"is used as the file version. See the manual for examples. \n" "is used as the file version. See the manual for examples. \n"
); );
cs->setWidgetType(ConfigString::File); cs->setWidgetType(ConfigString::File);
......
...@@ -52,7 +52,7 @@ static void addToMap(const char *name,Definition *d) ...@@ -52,7 +52,7 @@ static void addToMap(const char *name,Definition *d)
dl = new DefinitionList; dl = new DefinitionList;
Doxygen::symbolMap->append(symbolName,dl); Doxygen::symbolMap->append(symbolName,dl);
} }
//printf("******* adding symbol `%s'\n",symbolName.data()); //printf("******* adding symbol `%s' (%p)\n",symbolName.data(),d);
dl->append(d); dl->append(d);
d->setSymbolName(symbolName); d->setSymbolName(symbolName);
} }
...@@ -65,7 +65,7 @@ static void removeFromMap(Definition *d) ...@@ -65,7 +65,7 @@ static void removeFromMap(Definition *d)
if (index!=-1) symbolName=symbolName.mid(index+2); if (index!=-1) symbolName=symbolName.mid(index+2);
if (!symbolName.isEmpty()) if (!symbolName.isEmpty())
{ {
//printf("******* removing symbol `%s'\n",symbolName.data()); //printf("******* removing symbol `%s' (%p)\n",symbolName.data(),d);
DefinitionList *dl=Doxygen::symbolMap->find(symbolName); DefinitionList *dl=Doxygen::symbolMap->find(symbolName);
if (dl) if (dl)
{ {
...@@ -81,6 +81,7 @@ Definition::Definition(const char *df,int dl, ...@@ -81,6 +81,7 @@ Definition::Definition(const char *df,int dl,
const char *d,bool isSymbol) const char *d,bool isSymbol)
{ {
//QCString ns; //QCString ns;
//printf("Definition(%s) %p\n",name,this);
m_defFileName = df; m_defFileName = df;
int lastDot = m_defFileName.findRev('.'); int lastDot = m_defFileName.findRev('.');
if (lastDot!=-1) if (lastDot!=-1)
...@@ -118,6 +119,7 @@ Definition::Definition(const char *df,int dl, ...@@ -118,6 +119,7 @@ Definition::Definition(const char *df,int dl,
m_docLine=1; m_docLine=1;
m_docFile=(QCString)"<"+name+">"; m_docFile=(QCString)"<"+name+">";
m_isSymbol = isSymbol; m_isSymbol = isSymbol;
m_hidden = FALSE;
if (m_isSymbol) addToMap(name,this); if (m_isSymbol) addToMap(name,this);
} }
......
...@@ -167,6 +167,8 @@ class Definition ...@@ -167,6 +167,8 @@ class Definition
*/ */
void writeDocAnchorsToTagFile(); void writeDocAnchorsToTagFile();
bool isHidden() const { return m_hidden; }
// source references // source references
void setBodySegment(int bls,int ble); void setBodySegment(int bls,int ble);
void setBodyDef(FileDef *fd) { m_bodyDef=fd; } void setBodyDef(FileDef *fd) { m_bodyDef=fd; }
...@@ -200,6 +202,8 @@ class Definition ...@@ -200,6 +202,8 @@ class Definition
void writeNavigationPath(OutputList &ol) const; void writeNavigationPath(OutputList &ol) const;
virtual void writeQuickMemberLinks(OutputList &,MemberDef *) const {} virtual void writeQuickMemberLinks(OutputList &,MemberDef *) const {}
void setHidden(bool b) { m_hidden = b; }
protected: protected:
void setLocalName(const QCString name) { m_localName=name; } void setLocalName(const QCString name) { m_localName=name; }
...@@ -243,6 +247,7 @@ class Definition ...@@ -243,6 +247,7 @@ class Definition
QList<ListItemInfo> *m_xrefListItems; QList<ListItemInfo> *m_xrefListItems;
QCString m_symbolName; QCString m_symbolName;
bool m_isSymbol; bool m_isSymbol;
bool m_hidden;
QCString m_qualifiedName; QCString m_qualifiedName;
......
...@@ -543,10 +543,12 @@ static bool insideOL(DocNode *n) ...@@ -543,10 +543,12 @@ static bool insideOL(DocNode *n)
*/ */
static bool findDocsForMemberOrCompound(const char *commandName, static bool findDocsForMemberOrCompound(const char *commandName,
QString *pDoc, QString *pDoc,
QString *pBrief,
Definition **pDef) Definition **pDef)
{ {
//printf("findDocsForMemberOrCompound(%s)\n",commandName); //printf("findDocsForMemberOrCompound(%s)\n",commandName);
*pDoc=""; *pDoc="";
*pBrief="";
*pDef=0; *pDef=0;
QString cmdArg=substitute(commandName,"#","::"); QString cmdArg=substitute(commandName,"#","::");
int l=cmdArg.length(); int l=cmdArg.length();
...@@ -574,6 +576,7 @@ static bool findDocsForMemberOrCompound(const char *commandName, ...@@ -574,6 +576,7 @@ static bool findDocsForMemberOrCompound(const char *commandName,
if (found && md) if (found && md)
{ {
*pDoc=md->documentation(); *pDoc=md->documentation();
*pBrief=md->briefDescription();
*pDef=md; *pDef=md;
return TRUE; return TRUE;
} }
...@@ -594,6 +597,7 @@ static bool findDocsForMemberOrCompound(const char *commandName, ...@@ -594,6 +597,7 @@ static bool findDocsForMemberOrCompound(const char *commandName,
if (cd) // class if (cd) // class
{ {
*pDoc=cd->documentation(); *pDoc=cd->documentation();
*pBrief=cd->briefDescription();
*pDef=cd; *pDef=cd;
return TRUE; return TRUE;
} }
...@@ -601,6 +605,7 @@ static bool findDocsForMemberOrCompound(const char *commandName, ...@@ -601,6 +605,7 @@ static bool findDocsForMemberOrCompound(const char *commandName,
if (nd) // namespace if (nd) // namespace
{ {
*pDoc=nd->documentation(); *pDoc=nd->documentation();
*pBrief=nd->briefDescription();
*pDef=nd; *pDef=nd;
return TRUE; return TRUE;
} }
...@@ -608,6 +613,7 @@ static bool findDocsForMemberOrCompound(const char *commandName, ...@@ -608,6 +613,7 @@ static bool findDocsForMemberOrCompound(const char *commandName,
if (gd) // group if (gd) // group
{ {
*pDoc=gd->documentation(); *pDoc=gd->documentation();
*pBrief=gd->briefDescription();
*pDef=gd; *pDef=gd;
return TRUE; return TRUE;
} }
...@@ -615,6 +621,7 @@ static bool findDocsForMemberOrCompound(const char *commandName, ...@@ -615,6 +621,7 @@ static bool findDocsForMemberOrCompound(const char *commandName,
if (pd) // page if (pd) // page
{ {
*pDoc=pd->documentation(); *pDoc=pd->documentation();
*pBrief=pd->briefDescription();
*pDef=pd; *pDef=pd;
return TRUE; return TRUE;
} }
...@@ -623,6 +630,7 @@ static bool findDocsForMemberOrCompound(const char *commandName, ...@@ -623,6 +630,7 @@ static bool findDocsForMemberOrCompound(const char *commandName,
if (fd && !ambig) // file if (fd && !ambig) // file
{ {
*pDoc=fd->documentation(); *pDoc=fd->documentation();
*pBrief=fd->briefDescription();
*pDef=fd; *pDef=fd;
return TRUE; return TRUE;
} }
...@@ -1336,6 +1344,11 @@ static int internalValidatingParseDoc(DocNode *parent,QList<DocNode> &children, ...@@ -1336,6 +1344,11 @@ static int internalValidatingParseDoc(DocNode *parent,QList<DocNode> &children,
// first parse any number of paragraphs // first parse any number of paragraphs
bool isFirst=TRUE; bool isFirst=TRUE;
DocPara *lastPar=0; DocPara *lastPar=0;
if (!children.isEmpty() && children.last()->kind()==DocNode::Kind_Para)
{ // last child item was a paragraph
lastPar = (DocPara*)children.last();
isFirst=FALSE;
}
do do
{ {
DocPara *par = new DocPara(parent); DocPara *par = new DocPara(parent);
...@@ -1344,6 +1357,7 @@ static int internalValidatingParseDoc(DocNode *parent,QList<DocNode> &children, ...@@ -1344,6 +1357,7 @@ static int internalValidatingParseDoc(DocNode *parent,QList<DocNode> &children,
if (!par->isEmpty()) if (!par->isEmpty())
{ {
children.append(par); children.append(par);
if (lastPar) lastPar->markLast(FALSE);
lastPar=par; lastPar=par;
} }
else else
...@@ -1604,9 +1618,9 @@ void DocIncOperator::parse() ...@@ -1604,9 +1618,9 @@ void DocIncOperator::parse()
void DocCopy::parse() void DocCopy::parse()
{ {
QString doc; QString doc,brief;
Definition *def; Definition *def;
if (findDocsForMemberOrCompound(m_link,&doc,&def)) if (findDocsForMemberOrCompound(m_link,&doc,&brief,&def))
{ {
if (g_copyStack.findRef(def)==-1) // definition not parsed earlier if (g_copyStack.findRef(def)==-1) // definition not parsed earlier
{ {
...@@ -1622,6 +1636,7 @@ void DocCopy::parse() ...@@ -1622,6 +1636,7 @@ void DocCopy::parse()
g_styleStack.clear(); g_styleStack.clear();
g_nodeStack.clear(); g_nodeStack.clear();
g_copyStack.append(def); g_copyStack.append(def);
internalValidatingParseDoc(this,m_children,brief);
internalValidatingParseDoc(this,m_children,doc); internalValidatingParseDoc(this,m_children,doc);
g_copyStack.remove(def); g_copyStack.remove(def);
ASSERT(g_styleStack.isEmpty()); ASSERT(g_styleStack.isEmpty());
......
...@@ -394,6 +394,12 @@ class DocInclude : public DocNode ...@@ -394,6 +394,12 @@ class DocInclude : public DocNode
m_isExample(isExample), m_exampleFile(exampleFile) {} m_isExample(isExample), m_exampleFile(exampleFile) {}
Kind kind() const { return Kind_Include; } Kind kind() const { return Kind_Include; }
QString file() const { return m_file; } QString file() const { return m_file; }
QString extension() const { int i=m_file.findRev('.');
if (i!=-1)
return m_file.right(m_file.length()-i);
else
return "";
}
Type type() const { return m_type; } Type type() const { return m_type; }
QString text() const { return m_text; } QString text() const { return m_text; }
QString context() const { return m_context; } QString context() const { return m_context; }
......
...@@ -287,6 +287,7 @@ static bool readBoundingBoxEPS(const char *fileName,int *width,int *height) ...@@ -287,6 +287,7 @@ static bool readBoundingBoxEPS(const char *fileName,int *width,int *height)
return FALSE; return FALSE;
} }
#if 0
/*! returns TRUE if class cd is a leaf (i.e. has no visible children) /*! returns TRUE if class cd is a leaf (i.e. has no visible children)
*/ */
static bool isLeaf(ClassDef *cd) static bool isLeaf(ClassDef *cd)
...@@ -311,6 +312,7 @@ static bool isLeaf(ClassDef *cd) ...@@ -311,6 +312,7 @@ static bool isLeaf(ClassDef *cd)
} }
return TRUE; return TRUE;
} }
#endif
// since dot silently reproduces the input file when it does not // since dot silently reproduces the input file when it does not
// support the PNG format, we need to check the result. // support the PNG format, we need to check the result.
...@@ -1151,7 +1153,7 @@ void DotGfxHierarchyTable::addHierarchy(DotNode *n,ClassDef *cd,bool hideSuper) ...@@ -1151,7 +1153,7 @@ void DotGfxHierarchyTable::addHierarchy(DotNode *n,ClassDef *cd,bool hideSuper)
for ( ; (bcd=bcli.current()) ; ++bcli ) for ( ; (bcd=bcli.current()) ; ++bcli )
{ {
ClassDef *bClass=bcd->classDef; ClassDef *bClass=bcd->classDef;
//printf(" Trying super class=`%s' usedNodes=%d\n",bClass->name().data(),m_usedNodes->count()); //printf(" Trying sub class=`%s' usedNodes=%d\n",bClass->name().data(),m_usedNodes->count());
if (bClass->isVisibleInHierarchy() && hasVisibleRoot(bClass->baseClasses())) if (bClass->isVisibleInHierarchy() && hasVisibleRoot(bClass->baseClasses()))
{ {
DotNode *bn; DotNode *bn;
...@@ -1178,8 +1180,10 @@ void DotGfxHierarchyTable::addHierarchy(DotNode *n,ClassDef *cd,bool hideSuper) ...@@ -1178,8 +1180,10 @@ void DotGfxHierarchyTable::addHierarchy(DotNode *n,ClassDef *cd,bool hideSuper)
else else
{ {
QCString tmp_url=""; QCString tmp_url="";
if (bClass->isLinkable()) if (bClass->isLinkable() && !bClass->isHidden())
{
tmp_url=bClass->getReference()+"$"+bClass->getOutputFileBase(); tmp_url=bClass->getReference()+"$"+bClass->getOutputFileBase();
}
bn = new DotNode(m_curNodeNumber++, bn = new DotNode(m_curNodeNumber++,
bClass->displayName(), bClass->displayName(),
tmp_url.data() tmp_url.data()
...@@ -1218,8 +1222,10 @@ void DotGfxHierarchyTable::addClassList(ClassSDict *cl) ...@@ -1218,8 +1222,10 @@ void DotGfxHierarchyTable::addClassList(ClassSDict *cl)
) // root node in the forest ) // root node in the forest
{ {
QCString tmp_url=""; QCString tmp_url="";
if (cd->isLinkable()) if (cd->isLinkable() && !cd->isHidden())
{
tmp_url=cd->getReference()+"$"+cd->getOutputFileBase(); tmp_url=cd->getReference()+"$"+cd->getOutputFileBase();
}
//printf("Inserting root class %s\n",cd->name().data()); //printf("Inserting root class %s\n",cd->name().data());
DotNode *n = new DotNode(m_curNodeNumber++, DotNode *n = new DotNode(m_curNodeNumber++,
cd->displayName(), cd->displayName(),
...@@ -1353,7 +1359,7 @@ void DotClassGraph::addClass(ClassDef *cd,DotNode *n,int prot, ...@@ -1353,7 +1359,7 @@ void DotClassGraph::addClass(ClassDef *cd,DotNode *n,int prot,
QCString displayName=className; QCString displayName=className;
if (Config_getBool("HIDE_SCOPE_NAMES")) displayName=stripScope(displayName); if (Config_getBool("HIDE_SCOPE_NAMES")) displayName=stripScope(displayName);
QCString tmp_url; QCString tmp_url;
if (cd->isLinkable()) if (cd->isLinkable() && !cd->isHidden())
{ {
tmp_url=cd->getReference()+"$"+cd->getOutputFileBase(); tmp_url=cd->getReference()+"$"+cd->getOutputFileBase();
} }
...@@ -1376,7 +1382,8 @@ void DotClassGraph::addClass(ClassDef *cd,DotNode *n,int prot, ...@@ -1376,7 +1382,8 @@ void DotClassGraph::addClass(ClassDef *cd,DotNode *n,int prot,
n->addParent(bn); n->addParent(bn);
} }
m_usedNodes->insert(className,bn); m_usedNodes->insert(className,bn);
//printf(" add new child node `%s' to %s\n",className.data(),n->m_label.data()); //printf(" add new child node `%s' to %s hidden=%d url=%s\n",
// className.data(),n->m_label.data(),cd->isHidden(),tmp_url.data());
// we use <=, i.s.o < to cause one more level than intended which is used to // we use <=, i.s.o < to cause one more level than intended which is used to
// detect truncated nodes // detect truncated nodes
...@@ -1492,7 +1499,10 @@ DotClassGraph::DotClassGraph(ClassDef *cd,DotNode::GraphType t,int maxRecursionD ...@@ -1492,7 +1499,10 @@ DotClassGraph::DotClassGraph(ClassDef *cd,DotNode::GraphType t,int maxRecursionD
m_maxDistance = 0; m_maxDistance = 0;
m_recDepth = maxRecursionDepth; m_recDepth = maxRecursionDepth;
QCString tmp_url=""; QCString tmp_url="";
if (cd->isLinkable()) tmp_url=cd->getReference()+"$"+cd->getOutputFileBase(); if (cd->isLinkable() && !cd->isHidden())
{
tmp_url=cd->getReference()+"$"+cd->getOutputFileBase();
}
QCString className = cd->displayName(); QCString className = cd->displayName();
//if (cd->templateArguments()) //if (cd->templateArguments())
//{ //{
...@@ -1948,7 +1958,7 @@ void DotInclDepGraph::buildGraph(DotNode *n,FileDef *fd,int distance) ...@@ -1948,7 +1958,7 @@ void DotInclDepGraph::buildGraph(DotNode *n,FileDef *fd,int distance)
if (bfd) if (bfd)
{ {
in = bfd->absFilePath(); in = bfd->absFilePath();
doc = bfd->isLinkable(); doc = bfd->isLinkable() && bfd->isHidden();
src = bfd->generateSourceFile(); src = bfd->generateSourceFile();
} }
if (doc || src || !Config_getBool("HIDE_UNDOC_RELATIONS")) if (doc || src || !Config_getBool("HIDE_UNDOC_RELATIONS"))
......
This diff is collapsed.
...@@ -42,6 +42,7 @@ Entry::Entry() ...@@ -42,6 +42,7 @@ Entry::Entry()
tagInfo = 0; tagInfo = 0;
sli = 0; sli = 0;
relatesDup = FALSE; relatesDup = FALSE;
hidden = FALSE;
groupDocType = GROUPDOC_NORMAL; groupDocType = GROUPDOC_NORMAL;
reset(); reset();
} }
...@@ -90,6 +91,7 @@ Entry::Entry(const Entry &e) ...@@ -90,6 +91,7 @@ Entry::Entry(const Entry &e)
callGraph = e.callGraph; callGraph = e.callGraph;
objc = e.objc; objc = e.objc;
tagInfo = e.tagInfo; tagInfo = e.tagInfo;
hidden = e.hidden;
sublist = new QList<Entry>; sublist = new QList<Entry>;
sublist->setAutoDelete(TRUE); sublist->setAutoDelete(TRUE);
extends = new QList<BaseInfo>; extends = new QList<BaseInfo>;
...@@ -231,6 +233,7 @@ void Entry::reset() ...@@ -231,6 +233,7 @@ void Entry::reset()
explicitExternal = FALSE; explicitExternal = FALSE;
memSpec = 0; memSpec = 0;
objc = FALSE; objc = FALSE;
hidden = FALSE;
subGrouping = TRUE; subGrouping = TRUE;
protection = Public; protection = Public;
groupDocType = GROUPDOC_NORMAL; groupDocType = GROUPDOC_NORMAL;
...@@ -248,74 +251,7 @@ void Entry::reset() ...@@ -248,74 +251,7 @@ void Entry::reset()
int Entry::getSize() int Entry::getSize()
{ {
int size=sizeof(Entry); return sizeof(Entry);
size+=type.length()+1;
size+=name.length()+1;
size+=args.length()+1;
size+=bitfields.length()+1;
size+=exception.length()+1;
size+=program.length()+1;
size+=includeFile.length()+1;
size+=includeName.length()+1;
size+=doc.length()+1;
size+=docFile.length()+1;
size+=relates.length()+1;
size+=brief.length()+1;
size+=briefFile.length()+1;
size+=inbodyDocs.length()+1;
size+=inbodyFile.length()+1;
size+=inside.length()+1;
size+=fileName.length()+1;
size+=initializer.length()+1;
BaseInfo *bi=extends->first();
while (bi)
{
size+=sizeof(QLNode);
size+=bi->name.length()+1+sizeof(bi->prot)+sizeof(bi->virt);
bi=extends->next();
}
Grouping *g=groups->first();
while (g)
{
size+=sizeof(QLNode);
size+=g->groupname.length()+1;
size+=sizeof(g->pri);
g=groups->next();
}
Entry *e=sublist->first();
while (e)
{
size+=e->getSize();
e=sublist->next();
}
Argument *a=argList->first();
while (a)
{
size+=sizeof(Argument);
size+=a->type.length()+1
+a->name.length()+1
+a->defval.length()+1;
a=argList->next();
}
if (tArgLists)
{
ArgumentList *al=tArgLists->first();
while (al)
{
size+=sizeof(ArgumentList);
a=al->first();
while (a)
{
size+=sizeof(Argument);
size+=a->type.length()+1
+a->name.length()+1
+a->defval.length()+1;
a=al->next();
}
al=tArgLists->next();
}
}
return size;
} }
/*! the argument list is documented if one of its /*! the argument list is documented if one of its
......
...@@ -310,6 +310,7 @@ class Entry ...@@ -310,6 +310,7 @@ class Entry
TagInfo *tagInfo; //!< tag file info TagInfo *tagInfo; //!< tag file info
static int num; //!< counts the total number of entries static int num; //!< counts the total number of entries
bool objc; //!< Objective-C construct bool objc; //!< Objective-C construct
bool hidden; //!< does this represent an entity this is hidden from the output
enum enum
{ {
GROUPDOC_NORMAL, //!< defgroup GROUPDOC_NORMAL, //!< defgroup
......
...@@ -257,7 +257,7 @@ void HtmlDocVisitor::visit(DocInclude *inc) ...@@ -257,7 +257,7 @@ void HtmlDocVisitor::visit(DocInclude *inc)
{ {
case DocInclude::Include: case DocInclude::Include:
m_t << PREFRAG_START; m_t << PREFRAG_START;
Doxygen::parserManager->getParser(m_langExt) Doxygen::parserManager->getParser(inc->extension())
->parseCode(m_ci,inc->context(),inc->text().latin1(), ->parseCode(m_ci,inc->context(),inc->text().latin1(),
inc->isExample(),inc->exampleFile()); inc->isExample(),inc->exampleFile());
m_t << PREFRAG_END; m_t << PREFRAG_END;
...@@ -267,7 +267,7 @@ void HtmlDocVisitor::visit(DocInclude *inc) ...@@ -267,7 +267,7 @@ void HtmlDocVisitor::visit(DocInclude *inc)
m_t << PREFRAG_START; m_t << PREFRAG_START;
QFileInfo cfi( inc->file() ); QFileInfo cfi( inc->file() );
FileDef fd( cfi.dirPath(), cfi.fileName() ); FileDef fd( cfi.dirPath(), cfi.fileName() );
Doxygen::parserManager->getParser(m_langExt) Doxygen::parserManager->getParser(inc->extension())
->parseCode(m_ci,inc->context(), ->parseCode(m_ci,inc->context(),
inc->text().latin1(), inc->text().latin1(),
inc->isExample(), inc->isExample(),
......
...@@ -284,7 +284,7 @@ void writeClassTree(OutputList &ol,BaseClassList *bcl,bool hideSuper,int level) ...@@ -284,7 +284,7 @@ void writeClassTree(OutputList &ol,BaseClassList *bcl,bool hideSuper,int level)
//printf("Passed...\n"); //printf("Passed...\n");
bool hasChildren = !cd->visited && !hideSuper && classHasVisibleChildren(cd); bool hasChildren = !cd->visited && !hideSuper && classHasVisibleChildren(cd);
//printf("tree4: Has children %s: %d\n",cd->name().data(),hasChildren); //printf("tree4: Has children %s: %d\n",cd->name().data(),hasChildren);
if (cd->isLinkable()) if (cd->isLinkable() && !cd->isHidden())
{ {
//printf("Writing class %s\n",cd->displayName().data()); //printf("Writing class %s\n",cd->displayName().data());
ol.writeIndexItem(cd->getReference(),cd->getOutputFileBase(),cd->displayName()); ol.writeIndexItem(cd->getReference(),cd->getOutputFileBase(),cd->displayName());
...@@ -367,7 +367,7 @@ void writeClassTree(BaseClassList *cl,int level) ...@@ -367,7 +367,7 @@ void writeClassTree(BaseClassList *cl,int level)
} }
bool hasChildren = !cd->visited && classHasVisibleChildren(cd); bool hasChildren = !cd->visited && classHasVisibleChildren(cd);
//printf("tree2: Has children %s: %d\n",cd->name().data(),hasChildren); //printf("tree2: Has children %s: %d\n",cd->name().data(),hasChildren);
if (cd->isLinkable()) if (cd->isLinkable() && !cd->isHidden())
{ {
if (hasHtmlHelp) if (hasHtmlHelp)
{ {
...@@ -406,7 +406,7 @@ void writeClassTreeNode(ClassDef *cd,bool hasHtmlHelp,bool hasFtvHelp,bool &star ...@@ -406,7 +406,7 @@ void writeClassTreeNode(ClassDef *cd,bool hasHtmlHelp,bool hasFtvHelp,bool &star
} }
bool hasChildren = classHasVisibleChildren(cd); bool hasChildren = classHasVisibleChildren(cd);
//printf("node: Has children %s: %d\n",cd->name().data(),hasChildren); //printf("node: Has children %s: %d\n",cd->name().data(),hasChildren);
if (cd->isLinkable()) if (cd->isLinkable() && !cd->isHidden())
{ {
if (hasHtmlHelp) if (hasHtmlHelp)
{ {
...@@ -499,7 +499,7 @@ static void writeClassTreeForList(OutputList &ol,ClassSDict *cl,bool &started) ...@@ -499,7 +499,7 @@ static void writeClassTreeForList(OutputList &ol,ClassSDict *cl,bool &started)
} }
bool hasChildren = !cd->visited && classHasVisibleChildren(cd); bool hasChildren = !cd->visited && classHasVisibleChildren(cd);
//printf("list: Has children %s: %d\n",cd->name().data(),hasChildren); //printf("list: Has children %s: %d\n",cd->name().data(),hasChildren);
if (cd->isLinkable()) if (cd->isLinkable() && !cd->isHidden())
{ {
//printf("Writing class %s isLinkable()=%d isLinkableInProject()=%d cd->templateMaster()=%p\n", //printf("Writing class %s isLinkable()=%d isLinkableInProject()=%d cd->templateMaster()=%p\n",
// cd->displayName().data(),cd->isLinkable(),cd->isLinkableInProject(),cd->templateMaster()); // cd->displayName().data(),cd->isLinkable(),cd->isLinkableInProject(),cd->templateMaster());
...@@ -914,7 +914,7 @@ int countNamespaces() ...@@ -914,7 +914,7 @@ int countNamespaces()
NamespaceDef *nd; NamespaceDef *nd;
for (;(nd=nli.current());++nli) for (;(nd=nli.current());++nli)
{ {
if (nd->isLinkableInProject()) count++; if (nd->isLinkableInProject() && !nd->isHidden()) count++;
} }
return count; return count;
} }
...@@ -979,7 +979,7 @@ void writeNamespaceIndex(OutputList &ol) ...@@ -979,7 +979,7 @@ void writeNamespaceIndex(OutputList &ol)
NamespaceDef *nd; NamespaceDef *nd;
for (nli.toFirst();(nd=nli.current());++nli) for (nli.toFirst();(nd=nli.current());++nli)
{ {
if (nd->isLinkableInProject()) if (nd->isLinkableInProject() && !nd->isHidden())
{ {
if (first) if (first)
{ {
...@@ -1042,7 +1042,7 @@ int countAnnotatedClasses() ...@@ -1042,7 +1042,7 @@ int countAnnotatedClasses()
ClassDef *cd; ClassDef *cd;
for (;(cd=cli.current());++cli) for (;(cd=cli.current());++cli)
{ {
if (cd->isLinkableInProject() && cd->templateMaster()==0) if (cd->isLinkableInProject() && cd->templateMaster()==0 && !cd->isHidden())
{ {
//printf("Annotated class %s\n",cd->name().data()); //printf("Annotated class %s\n",cd->name().data());
count++; count++;
...@@ -1074,7 +1074,7 @@ void writeAnnotatedClassList(OutputList &ol) ...@@ -1074,7 +1074,7 @@ void writeAnnotatedClassList(OutputList &ol)
// see which elements are in use // see which elements are in use
for (cli.toFirst();(cd=cli.current());++cli) for (cli.toFirst();(cd=cli.current());++cli)
{ {
if (cd->isLinkableInProject() && cd->templateMaster()==0) if (cd->isLinkableInProject() && cd->templateMaster()==0 && !cd->isHidden())
{ {
int c = cd->displayName().at(0); int c = cd->displayName().at(0);
g_classIndexLetterUsed[CHL_All][c]=TRUE; g_classIndexLetterUsed[CHL_All][c]=TRUE;
...@@ -1108,7 +1108,7 @@ void writeAnnotatedClassList(OutputList &ol) ...@@ -1108,7 +1108,7 @@ void writeAnnotatedClassList(OutputList &ol)
for (cli.toFirst();(cd=cli.current());++cli) for (cli.toFirst();(cd=cli.current());++cli)
{ {
if (cd->isLinkableInProject() && cd->templateMaster()==0) if (cd->isLinkableInProject() && cd->templateMaster()==0 && !cd->isHidden())
{ {
QCString type=cd->compoundTypeString(); QCString type=cd->compoundTypeString();
ol.startIndexKey(); ol.startIndexKey();
...@@ -1159,7 +1159,7 @@ void writeAlphabeticalClassList(OutputList &ol) ...@@ -1159,7 +1159,7 @@ void writeAlphabeticalClassList(OutputList &ol)
QCString alphaLinks = "<p><div class=\"qindex\">"; QCString alphaLinks = "<p><div class=\"qindex\">";
for (;(cd=cli.current());++cli) for (;(cd=cli.current());++cli)
{ {
if (cd->isLinkableInProject() && cd->templateMaster()==0) if (cd->isLinkableInProject() && cd->templateMaster()==0 && !cd->isHidden())
{ {
int index = getPrefixIndex(cd->className()); int index = getPrefixIndex(cd->className());
//printf("name=%s index=%d\n",cd->className().data(),index); //printf("name=%s index=%d\n",cd->className().data(),index);
...@@ -1201,7 +1201,7 @@ void writeAlphabeticalClassList(OutputList &ol) ...@@ -1201,7 +1201,7 @@ void writeAlphabeticalClassList(OutputList &ol)
startLetter=0; startLetter=0;
for (cli.toFirst();(cd=cli.current());++cli) for (cli.toFirst();(cd=cli.current());++cli)
{ {
if (cd->isLinkableInProject() && cd->templateMaster()==0) if (cd->isLinkableInProject() && cd->templateMaster()==0 && !cd->isHidden())
{ {
int index = getPrefixIndex(cd->className()); int index = getPrefixIndex(cd->className());
if (toupper(cd->className().at(index))!=startLetter) if (toupper(cd->className().at(index))!=startLetter)
...@@ -1424,7 +1424,7 @@ void writeMemberList(OutputList &ol,bool useSections, ...@@ -1424,7 +1424,7 @@ void writeMemberList(OutputList &ol,bool useSections,
if ( if (
md->isLinkableInProject() && md->isLinkableInProject() &&
(cd=md->getClassDef()) && (cd=md->getClassDef()) &&
cd->isLinkableInProject() && cd->templateMaster()==0 && cd->isLinkableInProject() && cd->templateMaster()==0 && !cd->isHidden() &&
( (filter==CMHL_All && !(md->isFriend() && isFriendToHide)) || ( (filter==CMHL_All && !(md->isFriend() && isFriendToHide)) ||
(filter==CMHL_Functions && (md->isFunction() || md->isSlot() || md->isSignal())) || (filter==CMHL_Functions && (md->isFunction() || md->isSlot() || md->isSignal())) ||
(filter==CMHL_Variables && md->isVariable()) || (filter==CMHL_Variables && md->isVariable()) ||
...@@ -1481,7 +1481,7 @@ void writeMemberList(OutputList &ol,bool useSections, ...@@ -1481,7 +1481,7 @@ void writeMemberList(OutputList &ol,bool useSections,
if ( if (
md->isLinkableInProject() && md->isLinkableInProject() &&
prevName!=cd->displayName() && prevName!=cd->displayName() &&
cd->templateMaster()==0 cd->templateMaster()==0 && !cd->isHidden()
) )
{ {
if (count==0) if (count==0)
...@@ -2512,7 +2512,7 @@ void writeGraphInfo(OutputList &ol) ...@@ -2512,7 +2512,7 @@ void writeGraphInfo(OutputList &ol)
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
/*! /*!
* write groups as hierarchial trees * write groups as hierarchical trees
* \author KPW * \author KPW
*/ */
...@@ -3144,7 +3144,7 @@ void writeIndex(OutputList &ol) ...@@ -3144,7 +3144,7 @@ void writeIndex(OutputList &ol)
{ {
if (Doxygen::mainPage->title().lower()!="notitle") if (Doxygen::mainPage->title().lower()!="notitle")
{ {
ol.parseDoc(defFileName,defLine,Doxygen::mainPage,0,Doxygen::mainPage->title(),TRUE,FALSE); ol.docify(Doxygen::mainPage->title());
} }
} }
else else
......
...@@ -319,7 +319,7 @@ void LatexDocVisitor::visit(DocInclude *inc) ...@@ -319,7 +319,7 @@ void LatexDocVisitor::visit(DocInclude *inc)
m_t << "\n\n\\footnotesize\\begin{verbatim}"; m_t << "\n\n\\footnotesize\\begin{verbatim}";
QFileInfo cfi( inc->file() ); QFileInfo cfi( inc->file() );
FileDef fd( cfi.dirPath(), cfi.fileName() ); FileDef fd( cfi.dirPath(), cfi.fileName() );
Doxygen::parserManager->getParser(m_langExt) Doxygen::parserManager->getParser(inc->extension())
->parseCode(m_ci,inc->context(), ->parseCode(m_ci,inc->context(),
inc->text().latin1(), inc->text().latin1(),
inc->isExample(), inc->isExample(),
...@@ -329,7 +329,7 @@ void LatexDocVisitor::visit(DocInclude *inc) ...@@ -329,7 +329,7 @@ void LatexDocVisitor::visit(DocInclude *inc)
break; break;
case DocInclude::Include: case DocInclude::Include:
m_t << "\n\n\\footnotesize\\begin{verbatim}"; m_t << "\n\n\\footnotesize\\begin{verbatim}";
Doxygen::parserManager->getParser(m_langExt) Doxygen::parserManager->getParser(inc->extension())
->parseCode(m_ci,inc->context(), ->parseCode(m_ci,inc->context(),
inc->text().latin1(),inc->isExample(), inc->text().latin1(),inc->isExample(),
inc->exampleFile()); inc->exampleFile());
......
...@@ -235,7 +235,7 @@ void ManDocVisitor::visit(DocInclude *inc) ...@@ -235,7 +235,7 @@ void ManDocVisitor::visit(DocInclude *inc)
m_t << ".nf" << endl; m_t << ".nf" << endl;
QFileInfo cfi( inc->file() ); QFileInfo cfi( inc->file() );
FileDef fd( cfi.dirPath(), cfi.fileName() ); FileDef fd( cfi.dirPath(), cfi.fileName() );
Doxygen::parserManager->getParser(0/*TODO*/) Doxygen::parserManager->getParser(inc->extension())
->parseCode(m_ci,inc->context(), ->parseCode(m_ci,inc->context(),
inc->text().latin1(), inc->text().latin1(),
inc->isExample(), inc->isExample(),
...@@ -250,7 +250,7 @@ void ManDocVisitor::visit(DocInclude *inc) ...@@ -250,7 +250,7 @@ void ManDocVisitor::visit(DocInclude *inc)
if (!m_firstCol) m_t << endl; if (!m_firstCol) m_t << endl;
m_t << ".PP" << endl; m_t << ".PP" << endl;
m_t << ".nf" << endl; m_t << ".nf" << endl;
Doxygen::parserManager->getParser(0/*TODO*/) Doxygen::parserManager->getParser(inc->extension())
->parseCode(m_ci,inc->context(), ->parseCode(m_ci,inc->context(),
inc->text().latin1(),inc->isExample(), inc->text().latin1(),inc->isExample(),
inc->exampleFile()); inc->exampleFile());
......
...@@ -2006,9 +2006,36 @@ QCString MemberDef::getScopeString() const ...@@ -2006,9 +2006,36 @@ QCString MemberDef::getScopeString() const
return result; return result;
} }
static QCString escapeAnchor(const QCString &anchor)
{
QCString result;
int l = anchor.length(),i;
for (i=0;i<l;i++)
{
char c = anchor.at(i);
if ((c>='a' && c<='z') || (c>='A' && c<='Z'))
{
result+=c;
}
else
{
static char hexStr[]="0123456789ABCDEF";
char escChar[]={ '_', 0, 0, 0 };
escChar[1]=hexStr[c>>4];
escChar[2]=hexStr[c&0xf];
result+=escChar;
}
}
return result;
}
void MemberDef::setAnchor(const char *a) void MemberDef::setAnchor(const char *a)
{ {
anc=a; //anc=a;
a=a;
QCString memAnchor = name();
if (!args.isEmpty()) memAnchor+=args;
anc = escapeAnchor(memAnchor);
} }
void MemberDef::setGroupDef(GroupDef *gd,Grouping::GroupPri_t pri, void MemberDef::setGroupDef(GroupDef *gd,Grouping::GroupPri_t pri,
......
...@@ -166,7 +166,7 @@ void OutputList::parseDoc(const char *fileName,int startLine, ...@@ -166,7 +166,7 @@ void OutputList::parseDoc(const char *fileName,int startLine,
{ {
//printf("og->printDoc(extension=%s)\n", //printf("og->printDoc(extension=%s)\n",
// ctx?ctx->getDefFileExtension().data():"<null>"); // ctx?ctx->getDefFileExtension().data():"<null>");
if (og->isEnabled()) og->printDoc(root,ctx?ctx->getDefFileExtension():0); if (og->isEnabled()) og->printDoc(root,ctx?ctx->getDefFileExtension():QCString(""));
og=outputs->next(); og=outputs->next();
} }
......
...@@ -710,7 +710,7 @@ static void generateFunctionLink(CodeOutputInterface &ol,char *funcName) ...@@ -710,7 +710,7 @@ static void generateFunctionLink(CodeOutputInterface &ol,char *funcName)
return; return;
} }
static void findMemberLink(CodeOutputInterface &ol,const char *symName) static void findMemberLink(CodeOutputInterface &ol,char *symName)
{ {
//printf("Member reference: %s scope=%s member=%s\n", //printf("Member reference: %s scope=%s member=%s\n",
// yytext, // yytext,
...@@ -757,7 +757,7 @@ static void findMemberLink(CodeOutputInterface &ol,const char *symName) ...@@ -757,7 +757,7 @@ static void findMemberLink(CodeOutputInterface &ol,const char *symName)
} }
} }
//printf("sym %s not found\n",&yytext[5]); //printf("sym %s not found\n",&yytext[5]);
codify(yytext); codify(symName);
} }
static void startFontClass(const char *s) static void startFontClass(const char *s)
......
This diff is collapsed.
...@@ -404,7 +404,7 @@ void RTFDocVisitor::visit(DocInclude *inc) ...@@ -404,7 +404,7 @@ void RTFDocVisitor::visit(DocInclude *inc)
m_t << rtf_Style_Reset << getStyle("CodeExample"); m_t << rtf_Style_Reset << getStyle("CodeExample");
QFileInfo cfi( inc->file() ); QFileInfo cfi( inc->file() );
FileDef fd( cfi.dirPath(), cfi.fileName() ); FileDef fd( cfi.dirPath(), cfi.fileName() );
Doxygen::parserManager->getParser(m_langExt) Doxygen::parserManager->getParser(inc->extension())
->parseCode(m_ci,inc->context(), ->parseCode(m_ci,inc->context(),
inc->text().latin1(), inc->text().latin1(),
inc->isExample(), inc->isExample(),
...@@ -417,7 +417,7 @@ void RTFDocVisitor::visit(DocInclude *inc) ...@@ -417,7 +417,7 @@ void RTFDocVisitor::visit(DocInclude *inc)
m_t << "{" << endl; m_t << "{" << endl;
m_t << "\\par" << endl; m_t << "\\par" << endl;
m_t << rtf_Style_Reset << getStyle("CodeExample"); m_t << rtf_Style_Reset << getStyle("CodeExample");
Doxygen::parserManager->getParser(m_langExt) Doxygen::parserManager->getParser(inc->extension())
->parseCode(m_ci,inc->context(), ->parseCode(m_ci,inc->context(),
inc->text().latin1(),inc->isExample(), inc->text().latin1(),inc->isExample(),
inc->exampleFile()); inc->exampleFile());
......
...@@ -4040,9 +4040,20 @@ IDLATTR ("["[^\]]*"]"){BN}* ...@@ -4040,9 +4040,20 @@ IDLATTR ("["[^\]]*"]"){BN}*
<DocBlock>("@@"|"\\\\"){ID}/[^a-z_A-Z0-9] { // escaped command <DocBlock>("@@"|"\\\\"){ID}/[^a-z_A-Z0-9] { // escaped command
docBlock+=yytext; docBlock+=yytext;
} }
<DocBlock>{CMD}("verbatim"|"latexonly"|"htmlonly"|"xmlonly"|"dot"|"code")/[^a-z_A-Z0-9] { // verbatim command (which could contain nested comments!) <DocBlock>{CMD}("verbatim"|"latexonly"|"htmlonly"|"xmlonly"|"manonly"|"dot"|"code"|"f$"|"f["|"f{")/[^a-z_A-Z0-9] { // verbatim command (which could contain nested comments!)
docBlock+=yytext; docBlock+=yytext;
if (yytext[2]=='[')
{
docBlockName="f]";
}
else if (yytext[2]=='}')
{
docBlockName="f}";
}
else
{
docBlockName=&yytext[1]; docBlockName=&yytext[1];
}
BEGIN(DocCopyBlock); BEGIN(DocCopyBlock);
} }
<DocBlock>[^@*\/\\\n]+ { // any character that isn't special <DocBlock>[^@*\/\\\n]+ { // any character that isn't special
...@@ -4058,8 +4069,12 @@ IDLATTR ("["[^\]]*"]"){BN}* ...@@ -4058,8 +4069,12 @@ IDLATTR ("["[^\]]*"]"){BN}*
/* ---- Copy verbatim sections ------ */ /* ---- Copy verbatim sections ------ */
<DocCopyBlock>[\\@]("endverbatim"|"endlatexonly"|"endhtmlonly"|"endxmlonly"|"enddot"|"endcode")/[^a-z_A-Z0-9] { // end of verbatim block <DocCopyBlock>[\\@]("endverbatim"|"endlatexonly"|"endhtmlonly"|"endxmlonly"|"enddot"|"endcode"|"f$"|"f]"|"f}")/[^a-z_A-Z0-9] { // end of verbatim block
docBlock+=yytext; docBlock+=yytext;
if (yytext[1]=='f') // end of formula
{
BEGIN(DocBlock);
}
if (&yytext[4]==docBlockName) if (&yytext[4]==docBlockName)
{ {
BEGIN(DocBlock); BEGIN(DocBlock);
...@@ -4561,7 +4576,9 @@ static void parsePrototype(const QCString &text) ...@@ -4561,7 +4576,9 @@ static void parsePrototype(const QCString &text)
current->section = Entry::VARIABLEDOC_SEC; current->section = Entry::VARIABLEDOC_SEC;
// restore original scanner state // restore original scanner state
YY_BUFFER_STATE tmpState = YY_CURRENT_BUFFER;
yy_switch_to_buffer(orgState); yy_switch_to_buffer(orgState);
yy_delete_buffer(tmpState);
inputString = orgInputString; inputString = orgInputString;
inputPosition = orgInputPosition; inputPosition = orgInputPosition;
g_inputFromFile = orgInputFromFile; g_inputFromFile = orgInputFromFile;
......
...@@ -41,7 +41,7 @@ ...@@ -41,7 +41,7 @@
// Translator class (by the local maintainer) when the localized // Translator class (by the local maintainer) when the localized
// translator is made up-to-date again. // translator is made up-to-date again.
class TranslatorChinesetraditional : public TranslatorAdapter_1_3_8 class TranslatorChinesetraditional : public Translator
{ {
public: public:
...@@ -1527,6 +1527,72 @@ class TranslatorChinesetraditional : public TranslatorAdapter_1_3_8 ...@@ -1527,6 +1527,72 @@ class TranslatorChinesetraditional : public TranslatorAdapter_1_3_8
return "符合:"; return "符合:";
} }
//////////////////////////////////////////////////////////////////////////
// new since 1.3.8
//////////////////////////////////////////////////////////////////////////
/*! This is used in HTML as the title of page with source code for file filename
*/
virtual QCString trSourceFile(QCString& filename)
{
return filename + " 原始程式檔";
}
//////////////////////////////////////////////////////////////////////////
// new since 1.3.9
//////////////////////////////////////////////////////////////////////////
/*! This is used as the name of the chapter containing the directory
* hierarchy.
*/
virtual QCString trDirIndex()
{ return "目錄階層"; }
/*! This is used as the name of the chapter containing the documentation
* of the directories.
*/
virtual QCString trDirDocumentation()
{ return "目錄說明文件"; }
/*! This is used as the title of the directory index and also in the
* Quick links of a HTML page, to link to the directory hierarchy.
*/
virtual QCString trDirectories()
{ return "目錄"; }
/*! This returns a sentences that introduces the directory hierarchy.
* and the fact that it is sorted alphabetically per level
*/
virtual QCString trDirDescription()
{ return "這個目錄階層經過簡略的字母排序: ";
}
/*! This returns the title of a directory page. The name of the
* directory is passed via \a dirName.
*/
virtual QCString trDirReference(const char *dirName)
{ QCString result=dirName; result+=" 目錄參考文件"; return result; }
/*! This returns the word directory with or without starting capital
* (\a first_capital) and in sigular or plural form (\a singular).
*/
virtual QCString trDir(bool /*first_capital*/, bool /*singular*/)
{
return QCString("目錄");
}
//////////////////////////////////////////////////////////////////////////
// new since 1.4.1
//////////////////////////////////////////////////////////////////////////
/*! This text is added to the documentation when the \\overload command
* is used for a overloaded function.
*/
virtual QCString trOverloadText()
{
return "這是一個為了便利性所提供 overload 成員函數,"
"只有在接受的參數上,與前一個函數不同.";
}
}; };
#endif #endif
...@@ -1120,8 +1120,8 @@ ClassDef *getResolvedClassRec(Definition *scope, ...@@ -1120,8 +1120,8 @@ ClassDef *getResolvedClassRec(Definition *scope,
int count=0; int count=0;
for (dli.toFirst();(d=dli.current());++dli,++count) // foreach definition for (dli.toFirst();(d=dli.current());++dli,++count) // foreach definition
{ {
//printf(" found type %x name=%s (%d/%d)\n", //printf(" found type %x name=%s (%d/%d) d=%p\n",
// d->definitionType(),d->name().data(),count,dl->count()); // d->definitionType(),d->name().data(),count,dl->count(),d);
// only look at classes and members // only look at classes and members
if (d->definitionType()==Definition::TypeClass || if (d->definitionType()==Definition::TypeClass ||
...@@ -1135,6 +1135,8 @@ ClassDef *getResolvedClassRec(Definition *scope, ...@@ -1135,6 +1135,8 @@ ClassDef *getResolvedClassRec(Definition *scope,
{ {
// see if we are dealing with a class or a typedef // see if we are dealing with a class or a typedef
if (d->definitionType()==Definition::TypeClass) // d is a class if (d->definitionType()==Definition::TypeClass) // d is a class
{
if (!((ClassDef*)d)->isArtificial())
{ {
if (distance<minDistance) // found a definition that is "closer" if (distance<minDistance) // found a definition that is "closer"
{ {
...@@ -1164,6 +1166,7 @@ ClassDef *getResolvedClassRec(Definition *scope, ...@@ -1164,6 +1166,7 @@ ClassDef *getResolvedClassRec(Definition *scope,
bestTemplSpec.resize(0); bestTemplSpec.resize(0);
} }
} }
}
else if (d->definitionType()==Definition::TypeMember) else if (d->definitionType()==Definition::TypeMember)
{ {
MemberDef *md = (MemberDef *)d; MemberDef *md = (MemberDef *)d;
...@@ -2766,7 +2769,10 @@ static QCString getCanonicalTypeForIdentifier( ...@@ -2766,7 +2769,10 @@ static QCString getCanonicalTypeForIdentifier(
// fs?fs->name().data():"<none>" // fs?fs->name().data():"<none>"
// ); // );
//printf(">>>> word '%s' => '%s' templSpec=%s ts=%s\n",(word+templSpec).data(),cd?cd->qualifiedNameWithTemplateParameters().data():"<none>",templSpec.data(),ts.data()); //printf(">>>> word '%s' => '%s' templSpec=%s ts=%s\n",
// (word+templSpec).data(),
// cd?cd->qualifiedNameWithTemplateParameters().data():"<none>",
// templSpec.data(),ts.data());
if (cd) // known type if (cd) // known type
{ {
//result = cd->qualifiedNameWithTemplateParameters(); //result = cd->qualifiedNameWithTemplateParameters();
...@@ -5148,7 +5154,7 @@ static void latin1ToLatex(QTextStream &t,unsigned char c) ...@@ -5148,7 +5154,7 @@ static void latin1ToLatex(QTextStream &t,unsigned char c)
case 252: t << "\\\"{u}"; break; case 252: t << "\\\"{u}"; break;
case 253: t << "\\'{y}"; break; case 253: t << "\\'{y}"; break;
case 255: t << "\\\"{y}"; break; case 255: t << "\\\"{y}"; break;
default: t << c; default: t << (char)c;
} }
} }
...@@ -5161,35 +5167,35 @@ static void latin2ToLatex(QTextStream &t,unsigned char c) ...@@ -5161,35 +5167,35 @@ static void latin2ToLatex(QTextStream &t,unsigned char c)
switch (c) switch (c)
{ {
case 0xA1: t << "\\k{A}"; break; case 0xA1: t << "\\k{A}"; break;
case 0xA2: t << c; break; case 0xA2: t << (char)c; break;
case 0xA3: t << "\\L{}"; break; case 0xA3: t << "\\L{}"; break;
case 0xA4: t << c; break; case 0xA4: t << (char)c; break;
case 0xA5: t << c; break; case 0xA5: t << (char)c; break;
case 0xA6: t << "\\'{S}"; break; case 0xA6: t << "\\'{S}"; break;
case 0xA7: t << c; break; case 0xA7: t << (char)c; break;
case 0xA8: t << c; break; case 0xA8: t << (char)c; break;
case 0xA9: t << "\\v{S}"; break; case 0xA9: t << "\\v{S}"; break;
case 0xAA: t << "\\c{S}"; break; case 0xAA: t << "\\c{S}"; break;
case 0xAB: t << "\\v{T}"; break; case 0xAB: t << "\\v{T}"; break;
case 0xAC: t << "\\'{Z}"; break; case 0xAC: t << "\\'{Z}"; break;
case 0xAD: t << c; break; case 0xAD: t << (char)c; break;
case 0xAE: t << "\\v{Z}"; break; case 0xAE: t << "\\v{Z}"; break;
case 0xAF: t << "\\.{Z}"; break; case 0xAF: t << "\\.{Z}"; break;
case 0xB0: t << c; break; case 0xB0: t << (char)c; break;
case 0xB1: t << "\\k{a}"; break; case 0xB1: t << "\\k{a}"; break;
case 0xB2: t << c; break; case 0xB2: t << (char)c; break;
case 0xB3: t << "\\l{}"; break; case 0xB3: t << "\\l{}"; break;
case 0xB4: t << c; break; case 0xB4: t << (char)c; break;
case 0xB5: t << c; break; case 0xB5: t << (char)c; break;
case 0xB6: t << "\\'{s}"; break; case 0xB6: t << "\\'{s}"; break;
case 0xB7: t << c; break; case 0xB7: t << (char)c; break;
case 0xB8: t << c; break; case 0xB8: t << (char)c; break;
case 0xB9: t << "\\v{s}"; break; case 0xB9: t << "\\v{s}"; break;
case 0xBA: t << "\\c{s}"; break; case 0xBA: t << "\\c{s}"; break;
case 0xBB: t << "\\v{t}"; break; case 0xBB: t << "\\v{t}"; break;
case 0xBC: t << "\\'{z}"; break; case 0xBC: t << "\\'{z}"; break;
case 0xBD: t << c; break; case 0xBD: t << (char)c; break;
case 0xBE: t << "\\v{z}"; break; case 0xBE: t << "\\v{z}"; break;
case 0xBF: t << "\\.{z}"; break; case 0xBF: t << "\\.{z}"; break;
...@@ -5217,9 +5223,9 @@ static void latin2ToLatex(QTextStream &t,unsigned char c) ...@@ -5217,9 +5223,9 @@ static void latin2ToLatex(QTextStream &t,unsigned char c)
case 0xD4: t << "\\^{O}"; break; case 0xD4: t << "\\^{O}"; break;
case 0xD5: t << "\\H{O}"; break; case 0xD5: t << "\\H{O}"; break;
case 0xD6: t << "\\\"{O}"; break; case 0xD6: t << "\\\"{O}"; break;
case 0xD7: t << c; break; case 0xD7: t << (char)c; break;
case 0xD8: t << "\\v{R}"; break; case 0xD8: t << "\\v{R}"; break;
case 0xD9: t << c; break; case 0xD9: t << (char)c; break;
case 0xDA: t << "\\'{U}"; break; case 0xDA: t << "\\'{U}"; break;
case 0xDB: t << "\\H{U}"; break; case 0xDB: t << "\\H{U}"; break;
case 0xDC: t << "\\\"{U}"; break; case 0xDC: t << "\\\"{U}"; break;
...@@ -5230,7 +5236,7 @@ static void latin2ToLatex(QTextStream &t,unsigned char c) ...@@ -5230,7 +5236,7 @@ static void latin2ToLatex(QTextStream &t,unsigned char c)
case 0xE0: t << "\\'{r}"; break; case 0xE0: t << "\\'{r}"; break;
case 0xE1: t << "\\'{a}"; break; case 0xE1: t << "\\'{a}"; break;
case 0xE2: t << "\\^{a}"; break; case 0xE2: t << "\\^{a}"; break;
case 0xE3: t << c; break; case 0xE3: t << (char)c; break;
case 0xE4: t << "\\\"{a}"; break; case 0xE4: t << "\\\"{a}"; break;
case 0xE5: t << "\\'{l}"; break; case 0xE5: t << "\\'{l}"; break;
case 0xE6: t << "\\'{c}"; break; case 0xE6: t << "\\'{c}"; break;
...@@ -5251,17 +5257,17 @@ static void latin2ToLatex(QTextStream &t,unsigned char c) ...@@ -5251,17 +5257,17 @@ static void latin2ToLatex(QTextStream &t,unsigned char c)
case 0xF4: t << "\\^{o}"; break; case 0xF4: t << "\\^{o}"; break;
case 0xF5: t << "\\H{o}"; break; case 0xF5: t << "\\H{o}"; break;
case 0xF6: t << "\\\"{o}"; break; case 0xF6: t << "\\\"{o}"; break;
case 0xF7: t << c; break; case 0xF7: t << (char)c; break;
case 0xF8: t << "\\v{r}"; break; case 0xF8: t << "\\v{r}"; break;
case 0xF9: t << c; break; case 0xF9: t << (char)c; break;
case 0xFA: t << "\\'{u}"; break; case 0xFA: t << "\\'{u}"; break;
case 0xFB: t << "\\H{u}"; break; case 0xFB: t << "\\H{u}"; break;
case 0xFC: t << "\\\"{u}"; break; case 0xFC: t << "\\\"{u}"; break;
case 0xFD: t << "\\'{y}"; break; case 0xFD: t << "\\'{y}"; break;
case 0xFE: t << c; break; case 0xFE: t << (char)c; break;
case 0xFF: t << c; break; case 0xFF: t << (char)c; break;
default: t << c; default: t << (char)c;
} }
} }
...@@ -5275,6 +5281,7 @@ void filterLatexString(QTextStream &t,const char *str, ...@@ -5275,6 +5281,7 @@ void filterLatexString(QTextStream &t,const char *str,
theTranslator->idLanguage()=="korean-en"; theTranslator->idLanguage()=="korean-en";
static bool isRussian = theTranslator->idLanguage()=="russian"; static bool isRussian = theTranslator->idLanguage()=="russian";
static bool isUkrainian = theTranslator->idLanguage()=="ukrainian"; static bool isUkrainian = theTranslator->idLanguage()=="ukrainian";
static bool isSlovene = theTranslator->idLanguage()=="solvene";
static bool isChinese = theTranslator->idLanguage()=="chinese" || static bool isChinese = theTranslator->idLanguage()=="chinese" ||
theTranslator->idLanguage()=="chinese-traditional"; theTranslator->idLanguage()=="chinese-traditional";
static bool isLatin2 = theTranslator->idLanguageCharset()=="iso-8859-2"; static bool isLatin2 = theTranslator->idLanguageCharset()=="iso-8859-2";
...@@ -5382,7 +5389,7 @@ void filterLatexString(QTextStream &t,const char *str, ...@@ -5382,7 +5389,7 @@ void filterLatexString(QTextStream &t,const char *str,
t << (char)c; t << (char)c;
} }
} }
else if (isCzech || isRussian || isUkrainian) else if (isCzech || isRussian || isUkrainian || isSlovene)
{ {
if (c>=128) if (c>=128)
{ {
......
...@@ -221,7 +221,7 @@ void XmlDocVisitor::visit(DocInclude *inc) ...@@ -221,7 +221,7 @@ void XmlDocVisitor::visit(DocInclude *inc)
m_t << "<programlisting>"; m_t << "<programlisting>";
QFileInfo cfi( inc->file() ); QFileInfo cfi( inc->file() );
FileDef fd( cfi.dirPath(), cfi.fileName() ); FileDef fd( cfi.dirPath(), cfi.fileName() );
Doxygen::parserManager->getParser(m_langExt) Doxygen::parserManager->getParser(inc->extension())
->parseCode(m_ci,inc->context(), ->parseCode(m_ci,inc->context(),
inc->text().latin1(), inc->text().latin1(),
inc->isExample(), inc->isExample(),
...@@ -231,7 +231,7 @@ void XmlDocVisitor::visit(DocInclude *inc) ...@@ -231,7 +231,7 @@ void XmlDocVisitor::visit(DocInclude *inc)
break; break;
case DocInclude::Include: case DocInclude::Include:
m_t << "<programlisting>"; m_t << "<programlisting>";
Doxygen::parserManager->getParser(m_langExt) Doxygen::parserManager->getParser(inc->extension())
->parseCode(m_ci,inc->context(), ->parseCode(m_ci,inc->context(),
inc->text().latin1(), inc->text().latin1(),
inc->isExample(), inc->isExample(),
......
...@@ -1588,7 +1588,7 @@ static void generateXMLForPage(PageDef *pd,QTextStream &ti,bool isExample) ...@@ -1588,7 +1588,7 @@ static void generateXMLForPage(PageDef *pd,QTextStream &ti,bool isExample)
t << " <compoundname>" << convertToXML(pd->name()) t << " <compoundname>" << convertToXML(pd->name())
<< "</compoundname>" << endl; << "</compoundname>" << endl;
SectionInfo *si = Doxygen::sectionDict.find(pageName); SectionInfo *si = Doxygen::sectionDict.find(pd->name());
if (si) if (si)
{ {
t << " <title>" << convertToXML(si->title) << "</title>" << endl; t << " <title>" << convertToXML(si->title) << "</title>" << endl;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment