summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/classdef.cpp246
-rw-r--r--src/classdef.h11
-rw-r--r--src/code.l28
-rw-r--r--src/config.h2
-rw-r--r--src/config.l80
-rw-r--r--src/definition.cpp30
-rw-r--r--src/definition.h12
-rw-r--r--src/diagram.cpp4
-rw-r--r--src/doxygen.cpp259
-rw-r--r--src/doxygen.h14
-rw-r--r--src/doxygen.pro2
-rw-r--r--src/doxytag.l3
-rw-r--r--src/entry.cpp19
-rw-r--r--src/entry.h1
-rw-r--r--src/filedef.cpp38
-rw-r--r--src/filedef.h3
-rw-r--r--src/groupdef.cpp19
-rw-r--r--src/groupdef.h3
-rw-r--r--src/htmlgen.cpp300
-rw-r--r--src/htmlgen.h24
-rw-r--r--src/index.cpp230
-rw-r--r--src/index.h16
-rw-r--r--src/latexgen.cpp78
-rw-r--r--src/latexgen.h13
-rw-r--r--src/mangen.cpp2
-rw-r--r--src/mangen.h5
-rw-r--r--src/memberdef.cpp26
-rw-r--r--src/memberdef.h5
-rw-r--r--src/memberlist.cpp5
-rw-r--r--src/namespacedef.cpp59
-rw-r--r--src/namespacedef.h8
-rw-r--r--src/outputgen.h5
-rw-r--r--src/outputlist.h10
-rw-r--r--src/pre.l4
-rw-r--r--src/scanner.h1
-rw-r--r--src/scanner.l167
-rw-r--r--src/section.h49
-rw-r--r--src/tag.l52
-rw-r--r--src/translator.h317
-rw-r--r--src/translator_fr.h7
-rw-r--r--src/translator_nl.h158
-rw-r--r--src/translator_se.h96
-rw-r--r--src/util.cpp525
-rw-r--r--src/util.h6
44 files changed, 2170 insertions, 772 deletions
diff --git a/src/classdef.cpp b/src/classdef.cpp
index 079252d..50cd54c 100644
--- a/src/classdef.cpp
+++ b/src/classdef.cpp
@@ -37,7 +37,7 @@ static QString stripExtension(const char *fName)
}
// constructs a new class definition
-ClassDef::ClassDef(const char *nm,int ct,const char *ref,const char *fName)
+ClassDef::ClassDef(const char *nm,CompoundType ct,const char *ref,const char *fName)
: Definition(removeRedundantWhiteSpace(nm))
{
//name=n;
@@ -155,7 +155,7 @@ void ClassDef::insertMember(const MemberDef *md)
if (md->isFriend() || md->protection()!=Private || extractPrivateFlag)
{
MemberInfo *mi = new MemberInfo((MemberDef *)md,Public,Normal);
- MemberNameInfo *mni;
+ MemberNameInfo *mni=0;
if ((mni=(*allMemberNameInfoDict)[md->name()]))
{
mni->append(mi);
@@ -232,8 +232,9 @@ void ClassDef::writeDocumentation(OutputList &ol)
pageTitle+=pageType+" Reference";
startFile(ol,fileName,pageTitle);
startTitle(ol);
- ol.docify(name()+" "+pageType.right(pageType.length()-1)+" ");
- parseDoc(ol,0,0,theTranslator->trReference());
+ //ol.docify(name()+" "+pageType.right(pageType.length()-1)+" ");
+ //parseText(ol,theTranslator->trReference());
+ parseText(ol,theTranslator->trCompoundReference(name(),compType));
endTitle(ol,name());
// write brief description
@@ -244,8 +245,8 @@ void ClassDef::writeDocumentation(OutputList &ol)
ol+=briefOutput;
ol.writeString(" \n");
ol.disableAllBut(OutputGenerator::Html);
- ol.startTextLink(0,"details");
- parseDoc(ol,0,0,theTranslator->trMore());
+ ol.startTextLink(0,"_details");
+ parseText(ol,theTranslator->trMore());
ol.endTextLink();
ol.enableAll();
}
@@ -286,7 +287,41 @@ void ClassDef::writeDocumentation(OutputList &ol)
int count;
if ((count=inherits->count())>0)
{
- parseDoc(ol,0,0,theTranslator->trInherits()+" ");
+ //parseText(ol,theTranslator->trInherits()+" ");
+
+ QString inheritLine = theTranslator->trInheritsList(inherits->count());
+ QRegExp marker("@[0-9]+");
+ int index=0,newIndex,matchLen;
+ // now replace all markers in inheritLine with links to the classes
+ while ((newIndex=marker.match(inheritLine,index,&matchLen))!=-1)
+ {
+ parseText(ol,inheritLine.mid(index,newIndex-index));
+ bool ok;
+ uint entryIndex = inheritLine.mid(newIndex+1,matchLen-1).toUInt(&ok);
+ BaseClassDef *bcd=inherits->at(entryIndex);
+ if (ok && bcd)
+ {
+ ClassDef *cd=bcd->classDef;
+ if (cd->hasDocumentation() || cd->isReference())
+ {
+ if (genTagFile.length()>0) tagFile << cd->getOutputFileBase() << "?";
+ ol.writeObjectLink(cd->getReference(),cd->getOutputFileBase(),0,cd->name()+bcd->templSpecifiers);
+ }
+ else
+ {
+ ol.docify(cd->name());
+ }
+ }
+ else
+ {
+ err("Error: invalid marker %d in inherits list!\n",entryIndex);
+ }
+ index=newIndex+matchLen;
+ }
+ parseText(ol,inheritLine.right(inheritLine.length()-index));
+ ol.newParagraph();
+
+#if 0
BaseClassDef *bcd=inherits->first();
while (bcd)
{
@@ -305,13 +340,13 @@ void ClassDef::writeDocumentation(OutputList &ol)
if (bcd)
{
if (inherits->at()==count-1)
- parseDoc(ol,0,0," "+theTranslator->trAnd()+" ");
+ parseText(ol," "+theTranslator->trAnd()+" ");
else
ol.writeString(", ");
}
}
ol.writeString(".");
- ol.newParagraph();
+#endif
}
if (genTagFile.length()>0) tagFile << " \"" << fileName << ".html\"\n";
@@ -319,7 +354,36 @@ void ClassDef::writeDocumentation(OutputList &ol)
// write subclasses
if ((count=inheritedBy->count())>0)
{
- parseDoc(ol,0,0,theTranslator->trInheritedBy()+" ");
+ QString inheritLine = theTranslator->trInheritedByList(inheritedBy->count());
+ QRegExp marker("@[0-9]+");
+ int index=0,newIndex,matchLen;
+ // now replace all markers in inheritLine with links to the classes
+ while ((newIndex=marker.match(inheritLine,index,&matchLen))!=-1)
+ {
+ parseText(ol,inheritLine.mid(index,newIndex-index));
+ bool ok;
+ uint entryIndex = inheritLine.mid(newIndex+1,matchLen-1).toUInt(&ok);
+ BaseClassDef *bcd=inheritedBy->at(entryIndex);
+ if (ok && bcd)
+ {
+ ClassDef *cd=bcd->classDef;
+ if (cd->hasDocumentation() || cd->isReference())
+ {
+ ol.writeObjectLink(cd->getReference(),cd->getOutputFileBase(),0,cd->name());
+ }
+ else
+ {
+ ol.docify(cd->name());
+ }
+ writeInheritanceSpecifier(ol,bcd);
+ }
+ index=newIndex+matchLen;
+ }
+ parseText(ol,inheritLine.right(inheritLine.length()-index));
+ ol.newParagraph();
+
+#if 0
+ parseText(ol,theTranslator->trInheritedBy()+" ");
BaseClassDef *bcd=inheritedBy->first();
while (bcd)
{
@@ -337,13 +401,14 @@ void ClassDef::writeDocumentation(OutputList &ol)
if (bcd)
{
if (inheritedBy->at()==count-1)
- parseDoc(ol,0,0," "+theTranslator->trAnd()+" ");
+ parseText(ol," "+theTranslator->trAnd()+" ");
else
ol.writeString(", ");
}
}
ol.writeString(".");
ol.newParagraph();
+#endif
}
if (classDiagramFlag) ol.enableAll();
@@ -376,7 +441,7 @@ void ClassDef::writeDocumentation(OutputList &ol)
ClassDiagram diagram(this); // create a diagram of this class.
ol.startClassDiagram();
ol.disable(OutputGenerator::Man);
- parseDoc(ol,name(),0,theTranslator->trClassDiagram(name()));
+ parseText(ol,theTranslator->trClassDiagram(name()));
ol.enable(OutputGenerator::Man);
ol.endClassDiagram(diagram,fileName,name());
}
@@ -386,40 +451,45 @@ void ClassDef::writeDocumentation(OutputList &ol)
{
ol.disableAllBut(OutputGenerator::Html);
ol.startTextLink(memListFileName,0);
- parseDoc(ol,0,0,theTranslator->trListOfAllMembers());
+ parseText(ol,theTranslator->trListOfAllMembers());
ol.endTextLink();
ol.enableAll();
}
// write member groups
- writeMemberDecs(ol,this,0,0,"Public Members",0,&pubMembers);
- writeMemberDecs(ol,this,0,0,"Public Slots",0,&pubSlots);
- writeMemberDecs(ol,this,0,0,"Signals",0,&signals);
- writeMemberDecs(ol,this,0,0,"Static Public Members",0,&pubStaticMembers);
- writeMemberDecs(ol,this,0,0,"Protected Members",0,&proMembers);
- writeMemberDecs(ol,this,0,0,"Protected Slots",0,&proSlots);
- writeMemberDecs(ol,this,0,0,"Static Protected Members",0,&proStaticMembers);
+ ol.startMemberSections();
+ writeMemberDecs(ol,this,0,0,theTranslator->trPublicMembers(),0,&pubMembers);
+ writeMemberDecs(ol,this,0,0,theTranslator->trPublicSlots(),0,&pubSlots);
+ writeMemberDecs(ol,this,0,0,theTranslator->trSignals(),0,&signals);
+ writeMemberDecs(ol,this,0,0,theTranslator->trStaticPublicMembers(),0,&pubStaticMembers);
+ writeMemberDecs(ol,this,0,0,theTranslator->trProtectedMembers(),0,&proMembers);
+ writeMemberDecs(ol,this,0,0,theTranslator->trProtectedSlots(),0,&proSlots);
+ writeMemberDecs(ol,this,0,0,theTranslator->trStaticProtectedMembers(),0,&proStaticMembers);
if (extractPrivateFlag)
{
- writeMemberDecs(ol,this,0,0,"Private Members",0,&priMembers);
- writeMemberDecs(ol,this,0,0,"Private Slots",0,&priSlots);
- writeMemberDecs(ol,this,0,0,"Static Private Members",0,&priStaticMembers);
+ writeMemberDecs(ol,this,0,0,theTranslator->trPrivateMembers(),0,&priMembers);
+ writeMemberDecs(ol,this,0,0,theTranslator->trPrivateSlots(),0,&priSlots);
+ writeMemberDecs(ol,this,0,0,theTranslator->trStaticPrivateMembers(),0,&priStaticMembers);
}
- writeMemberDecs(ol,this,0,0,"Friends",0,&friends);
+ writeMemberDecs(ol,this,0,0,theTranslator->trFriends(),0,&friends);
writeMemberDecs(ol,this,0,0,
theTranslator->trRelatedFunctions(),
theTranslator->trRelatedSubscript(),
&related
);
+ ol.endMemberSections();
// write detailed description
bool exampleFlag=hasExamples();
if (!briefDescription().isEmpty() || !documentation().isEmpty() || exampleFlag)
{
ol.writeRuler();
- ol.writeAnchor("details");
+ bool latexOn = ol.isEnabled(OutputGenerator::Latex);
+ if (latexOn) ol.disable(OutputGenerator::Latex);
+ ol.writeAnchor("_details");
+ if (latexOn) ol.enable(OutputGenerator::Latex);
ol.startGroupHeader();
- parseDoc(ol,0,0,theTranslator->trDetailedDescription());
+ parseText(ol,theTranslator->trDetailedDescription());
ol.endGroupHeader();
if (tempArgs) // class is a template
{
@@ -460,11 +530,11 @@ void ClassDef::writeDocumentation(OutputList &ol)
{
ol.startDescList();
ol.startBold();
- parseDoc(ol,0,0,theTranslator->trExamples()+": ");
+ parseText(ol,theTranslator->trExamples()+": ");
ol.endBold();
ol.endDescTitle();
ol.writeDescItem();
- writeExample(ol);
+ writeExample(ol,exampleList);
//ol.endDescItem();
ol.endDescList();
}
@@ -489,7 +559,7 @@ void ClassDef::writeDocumentation(OutputList &ol)
{
ol.writeRuler();
ol.startGroupHeader();
- parseDoc(ol,0,0,theTranslator->trMemberTypedefDocumentation());
+ parseText(ol,theTranslator->trMemberTypedefDocumentation());
ol.endGroupHeader();
writeMemberDocs(ol,&pubMembers,name(),MemberDef::Typedef);
@@ -507,7 +577,7 @@ void ClassDef::writeDocumentation(OutputList &ol)
{
ol.writeRuler();
ol.startGroupHeader();
- parseDoc(ol,0,0,theTranslator->trMemberEnumerationDocumentation());
+ parseText(ol,theTranslator->trMemberEnumerationDocumentation());
ol.endGroupHeader();
writeMemberDocs(ol,&pubMembers,name(),MemberDef::Enumeration);
@@ -525,7 +595,7 @@ void ClassDef::writeDocumentation(OutputList &ol)
{
ol.writeRuler();
ol.startGroupHeader();
- parseDoc(ol,0,0,theTranslator->trEnumerationValueDocumentation());
+ parseText(ol,theTranslator->trEnumerationValueDocumentation());
ol.endGroupHeader();
writeMemberDocs(ol,&pubMembers,name(),MemberDef::EnumValue);
@@ -548,7 +618,7 @@ void ClassDef::writeDocumentation(OutputList &ol)
{
ol.writeRuler();
ol.startGroupHeader();
- parseDoc(ol,0,0,theTranslator->trMemberFunctionDocumentation());
+ parseText(ol,theTranslator->trMemberFunctionDocumentation());
ol.endGroupHeader();
writeMemberDocs(ol,&pubMembers,name(),MemberDef::Function);
@@ -570,7 +640,7 @@ void ClassDef::writeDocumentation(OutputList &ol)
{
ol.writeRuler();
ol.startGroupHeader();
- parseDoc(ol,0,0,theTranslator->trRelatedFunctionDocumentation());
+ parseText(ol,theTranslator->trRelatedFunctionDocumentation());
ol.endGroupHeader();
writeMemberDocs(ol,&friends,name(),MemberDef::Friend);
writeMemberDocs(ol,&related,name(),MemberDef::Function);
@@ -586,7 +656,7 @@ void ClassDef::writeDocumentation(OutputList &ol)
{
ol.writeRuler();
ol.startGroupHeader();
- parseDoc(ol,0,0,theTranslator->trMemberDataDocumentation());
+ parseText(ol,theTranslator->trMemberDataDocumentation());
ol.endGroupHeader();
writeMemberDocs(ol,&pubMembers,name(),MemberDef::Variable);
@@ -603,41 +673,57 @@ void ClassDef::writeDocumentation(OutputList &ol)
// write the list of used files (Html and LaTeX only)
ol.disable(OutputGenerator::Man);
ol.writeRuler();
- parseDoc(ol,0,0,
- theTranslator->trGeneratedFrom(pageType.lower(),
+ parseText(ol,theTranslator->trGeneratedFrom(pageType.lower(),
files.count()==1));
- ol.startItemList();
-
+
+ bool first=TRUE;
const char *file = files.first();
while (file)
{
- QFileInfo fi(file);
- ol.writeListItem();
- FileDef *fd;
bool ambig;
- if ((fd=findFileDef(&inputNameDict,fi.absFilePath(),ambig))
- && fd->hasDocumentation())
- {
- ol.writeObjectLink(fd->getReference(),fd->diskName(),0,
- fi.fileName());
- }
- else
+ FileDef *fd=findFileDef(&inputNameDict,file,ambig);
+ if (fd)
{
- ol.docify(fi.fileName());
+ if (first)
+ {
+ first=FALSE;
+ ol.startItemList();
+ }
+
+ ol.writeListItem();
+ QString path=fd->getPath().copy();
+ if (fullPathNameFlag)
+ {
+ // strip part of the path
+ if (path.left(stripFromPath.length())==stripFromPath)
+ {
+ path=path.right(path.length()-stripFromPath.length());
+ }
+ ol.docify(path);
+ }
+
+ if (fd->hasDocumentation())
+ {
+ ol.writeObjectLink(fd->getReference(),fd->getOutputFileBase(),0,
+ fd->name());
+ }
+ else
+ {
+ ol.docify(fd->name());
+ }
}
file=files.next();
}
+ if (!first) ol.endItemList();
- ol.endItemList();
- ol.enable(OutputGenerator::Man);
-
// write Author section (Man only)
+ ol.enable(OutputGenerator::Man);
ol.disableAllBut(OutputGenerator::Man);
ol.writeString("\n");
ol.startGroupHeader();
- parseDoc(ol,0,0,theTranslator->trAuthor());
+ parseText(ol,theTranslator->trAuthor());
ol.endGroupHeader();
- parseDoc(ol,0,0,theTranslator->trGeneratedAutomatically(projectName));
+ parseText(ol,theTranslator->trGeneratedAutomatically(projectName));
ol.enableAll();
endFile(ol);
@@ -651,13 +737,11 @@ void ClassDef::writeMemberList(OutputList &ol)
ol.disableAllBut(OutputGenerator::Html);
startFile(ol,memListFileName,theTranslator->trMemberList());
startTitle(ol);
- parseDoc(ol,name(),0,name()+" "+theTranslator->trMemberList());
+ parseText(ol,name()+" "+theTranslator->trMemberList());
endTitle(ol,0);
- parseDoc(ol,0,0,theTranslator->trThisIsTheListOfAllMembers());
- ol.writeString(" ");
+ parseText(ol,theTranslator->trThisIsTheListOfAllMembers());
ol.writeObjectLink(reference,fileName,0,name());
- ol.writeString(", ");
- parseDoc(ol,0,0,theTranslator->trIncludingInheritedMembers());
+ parseText(ol,theTranslator->trIncludingInheritedMembers());
ol.startItemList();
@@ -702,14 +786,14 @@ void ClassDef::writeMemberList(OutputList &ol)
{
QString name=mi->ambiguityResolutionScope+md->name();
ol.writeListItem();
- ol.writeObjectLink(cd->getReference(),cd->classFile(),
+ ol.writeObjectLink(cd->getReference(),cd->getOutputFileBase(),
md->anchor(),name);
if ( md->isFunction() || md->isSignal() || md->isSlot() )
ol.docify(md->argsString());
else if (md->isEnumerate())
- parseDoc(ol,0,0," "+theTranslator->trEnumName());
+ parseText(ol," "+theTranslator->trEnumName());
else if (md->isEnumValue())
- parseDoc(ol,0,0," "+theTranslator->trEnumValue());
+ parseText(ol," "+theTranslator->trEnumValue());
else if (md->isTypedef())
ol.docify(" typedef");
else if (md->isFriend() && !strcmp(md->typeString(),"friend class"))
@@ -725,16 +809,16 @@ void ClassDef::writeMemberList(OutputList &ol)
if ( md->isFunction() || md->isSignal() || md->isSlot() )
ol.docify(md->argsString());
else if (md->isEnumerate())
- parseDoc(ol,0,0," "+theTranslator->trEnumName());
+ parseText(ol," "+theTranslator->trEnumName());
else if (md->isEnumValue())
- parseDoc(ol,0,0," "+theTranslator->trEnumValue());
+ parseText(ol," "+theTranslator->trEnumValue());
else if (md->isTypedef())
ol.docify(" typedef");
ol.writeString(" (");
- parseDoc(ol,0,0,theTranslator->trDefinedIn()+" ");
+ parseText(ol,theTranslator->trDefinedIn()+" ");
if (cd->isVisible())
{
- ol.writeObjectLink(cd->getReference(),cd->classFile(),0,cd->name());
+ ol.writeObjectLink(cd->getReference(),cd->getOutputFileBase(),0,cd->name());
}
else
{
@@ -792,9 +876,9 @@ void ClassDef::writeIncludeFile(OutputList &ol)
startTitle(ol);
QString n=incName.copy();
if (incName.isNull()) n=incFile->name();
- parseDoc(ol,0,0,n);
+ parseText(ol,n);
endTitle(ol,0);
- parseDoc(ol,0,0,theTranslator->trVerbatimText(incFile->name()));
+ parseText(ol,theTranslator->trVerbatimText(incFile->name()));
ol.writeRuler();
ol.startCodeFragment();
parseCode(ol,n,fileToString(incFile->absFilePath()),FALSE,0);
@@ -829,9 +913,31 @@ bool ClassDef::hasExamples()
return exampleList->count()>0;
}
+#if 0
// write the list of all examples that are use this class.
void ClassDef::writeExample(OutputList &ol)
{
+ QString exampleLine=theTranslator->trWriteList(exampleList->count());
+
+ QRegExp marker("@[0-9]+");
+ int index=0,newIndex,matchLen;
+ // now replace all markers in inheritLine with links to the classes
+ while ((newIndex=marker.match(exampleLine,index,&matchLen))!=-1)
+ {
+ bool ok;
+ parseText(ol,exampleLine.mid(index,newIndex-index));
+ uint entryIndex = exampleLine.mid(newIndex+1,matchLen-1).toUInt(&ok);
+ Example *e=exampleList->at(entryIndex);
+ if (ok && e)
+ {
+ ol.writeObjectLink(0,e->file,e->anchor,e->name);
+ }
+ index=newIndex+matchLen;
+ }
+ parseText(ol,exampleLine.right(exampleLine.length()-index));
+ ol.writeString(".");
+
+#if 0
Example *e=exampleList->first();
while (e)
{
@@ -840,13 +946,15 @@ void ClassDef::writeExample(OutputList &ol)
if (e)
{
if (exampleList->at()==(int)exampleList->count()-1)
- parseDoc(ol,0,0," "+theTranslator->trAnd()+" ");
+ parseText(ol," "+theTranslator->trAnd()+" ");
else
ol.writeString(", ");
}
}
ol.writeString(".");
+#endif
}
+#endif
void ClassDef::setTemplateArguments(ArgumentList *al)
{
diff --git a/src/classdef.h b/src/classdef.h
index 8fe0f21..d5fc466 100644
--- a/src/classdef.h
+++ b/src/classdef.h
@@ -49,10 +49,11 @@ class ClassDef : public Definition
Union=Entry::UNION_SEC
};
- ClassDef(const char *name,int ct,const char *ref=0,const char *fName=0);
+ ClassDef(const char *name,CompoundType ct,const char *ref=0,const char *fName=0);
~ClassDef();
- QString classFile() const { return fileName; }
- int compoundType() const { return compType; }
+ //QString classFile() const { return fileName; }
+ QString getOutputFileBase() const { return fileName; }
+ CompoundType compoundType() const { return compType; }
const char *memberListFileName() const { return memListFileName; }
void insertBaseClass(ClassDef *,Protection p,Specifier s,const char *t=0);
BaseClassList *baseClasses() { return inherits; }
@@ -75,7 +76,7 @@ class ClassDef : public Definition
void writeIncludeFile(OutputList &ol);
bool addExample(const char *anchor,const char *name, const char *file);
bool hasExamples();
- void writeExample(OutputList &ol);
+ //void writeExample(OutputList &ol);
void setProtection(Protection p) { prot=p; }
Protection protection() const { return prot; }
bool isVisible()
@@ -130,7 +131,7 @@ class ClassDef : public Definition
QString reference;
ExampleList *exampleList;
ExampleDict *exampleDict;
- int compType;
+ CompoundType compType;
Protection prot;
};
diff --git a/src/code.l b/src/code.l
index 8bff410..dd5ec0c 100644
--- a/src/code.l
+++ b/src/code.l
@@ -173,16 +173,19 @@ static void generateClassLink(OutputList &ol,const char *clName)
if (exampleBlock)
{
QString anchor;
- anchor.sprintf("a%d",anchorCount);
+ anchor.sprintf("_a%d",anchorCount);
//printf("addExampleClass(%s,%s,%s)\n",anchor.data(),exampleName.data(),
// exampleFile.data());
if (cd->addExample(anchor,exampleName,exampleFile))
{
+ bool latexOn = ol.isEnabled(OutputGenerator::Latex);
+ if (latexOn) ol.disable(OutputGenerator::Latex);
ol.writeAnchor(anchor);
+ if (latexOn) ol.enable(OutputGenerator::Latex);
anchorCount++;
}
}
- ol.writeCodeLink(cd->getReference(),cd->classFile(),0,className);
+ ol.writeCodeLink(cd->getReference(),cd->getOutputFileBase(),0,className);
}
else
{
@@ -193,13 +196,14 @@ static void generateClassLink(OutputList &ol,const char *clName)
static bool getLink(const char *className,
const char *memberName,OutputList &result)
{
- MemberDef *md;
- ClassDef *cd;
- FileDef *fd;
+ MemberDef *md;
+ ClassDef *cd;
+ FileDef *fd;
+ NamespaceDef *nd;
QString m=memberName;
QString c=className;
//printf("Trying `%s'::`%s'\n",c.data(),m.data());
- if (getDefs(m,c,"()",md,cd,fd) &&
+ if (getDefs(m,c,"()",md,cd,fd,nd) &&
(md->hasDocumentation() || md->isReference()))
{
//printf("Found!\n");
@@ -217,13 +221,19 @@ static bool getLink(const char *className,
}
if (cd)
{
- result.writeCodeLink(cd->getReference(),cd->classFile(),
+ result.writeCodeLink(cd->getReference(),cd->getOutputFileBase(),
+ md->anchor(),memberName);
+ return TRUE;
+ }
+ else if (nd)
+ {
+ result.writeCodeLink(nd->getReference(),nd->getOutputFileBase(),
md->anchor(),memberName);
return TRUE;
}
else if (fd)
{
- result.writeCodeLink(fd->getReference(),fd->diskName(),
+ result.writeCodeLink(fd->getReference(),fd->getOutputFileBase(),
md->anchor(),memberName);
return TRUE;
}
@@ -363,7 +373,7 @@ ID [a-z_A-Z][a-z_A-Z0-9]*
if ((fd=findFileDef(&inputNameDict,yytext,ambig)) &&
fd->hasDocumentation())
{
- code->writeCodeLink(0,fd->diskName(),0,yytext);
+ code->writeCodeLink(0,fd->getOutputFileBase(),0,yytext);
}
else
{
diff --git a/src/config.h b/src/config.h
index 6269e85..492f356 100644
--- a/src/config.h
+++ b/src/config.h
@@ -41,6 +41,7 @@ extern QString genTagFile; // the tag file to generate
extern QString inputFilter; // a filter command that is applied to input files
extern QString paperType; // the page type to generate docs for
extern QString stripFromPath; // the string to strip from the file path
+extern QString manExtension; // extension the man page files
extern QStrList includePath; // list of include paths
extern QStrList examplePath; // list of example paths
extern QStrList inputSources; // list of input files
@@ -76,5 +77,6 @@ extern bool repeatBriefFlag; // repeat brief descriptions.
extern bool internalDocsFlag; // determines what happens to internal docs.
extern bool caseSensitiveNames; // determines if output can be mixed case.
extern bool verbatimHeaderFlag; // enable/disable generation of verb headers.
+extern bool htmlAlignMemberFlag; // align members in HTML using tables.
#endif
diff --git a/src/config.l b/src/config.l
index 232f531..0545f32 100644
--- a/src/config.l
+++ b/src/config.l
@@ -62,6 +62,7 @@ QString inputFilter;
QString paperType;
QString outputLanguage;
QString stripFromPath;
+QString manExtension;
QStrList includePath;
QStrList examplePath;
QStrList inputSources;
@@ -72,31 +73,32 @@ QStrList tagFileList;
QStrList extDocPathList;
QStrList predefined;
QStrList extraPackageList;
-bool quietFlag = FALSE;
-bool warningFlag = FALSE;
-bool recursiveFlag = FALSE;
-bool allExtFlag = FALSE;
-bool searchEngineFlag = FALSE;
-bool extractAllFlag = FALSE;
-bool extractPrivateFlag = FALSE;
-bool noIndexFlag = FALSE;
-bool hideMemberFlag = FALSE;
-bool hideClassFlag = FALSE;
-bool macroExpansionFlag = FALSE;
-bool onlyPredefinedFlag = FALSE;
-bool fullPathNameFlag = FALSE;
-bool compactLatexFlag = FALSE;
-bool internalDocsFlag = FALSE;
-bool caseSensitiveNames = FALSE;
-bool generateHtml = TRUE;
-bool generateLatex = TRUE;
-bool generateMan = TRUE;
-bool preprocessingFlag = TRUE;
-bool briefMemDescFlag = TRUE;
-bool searchIncludeFlag = TRUE;
-bool classDiagramFlag = TRUE;
-bool repeatBriefFlag = TRUE;
-bool verbatimHeaderFlag = TRUE;
+bool quietFlag = FALSE;
+bool warningFlag = FALSE;
+bool recursiveFlag = FALSE;
+bool allExtFlag = FALSE;
+bool searchEngineFlag = FALSE;
+bool extractAllFlag = FALSE;
+bool extractPrivateFlag = FALSE;
+bool noIndexFlag = FALSE;
+bool hideMemberFlag = FALSE;
+bool hideClassFlag = FALSE;
+bool macroExpansionFlag = FALSE;
+bool onlyPredefinedFlag = FALSE;
+bool fullPathNameFlag = FALSE;
+bool compactLatexFlag = FALSE;
+bool internalDocsFlag = FALSE;
+bool caseSensitiveNames = FALSE;
+bool generateHtml = TRUE;
+bool generateLatex = TRUE;
+bool generateMan = TRUE;
+bool preprocessingFlag = TRUE;
+bool briefMemDescFlag = TRUE;
+bool searchIncludeFlag = TRUE;
+bool classDiagramFlag = TRUE;
+bool repeatBriefFlag = TRUE;
+bool verbatimHeaderFlag = TRUE;
+bool htmlAlignMemberFlag = TRUE;
/* -----------------------------------------------------------------
*
@@ -162,7 +164,8 @@ static int yyread(char *buf,int max_size)
<Start>"INPUT_FILTER"[ \t]*"=" { BEGIN(GetString); s=&inputFilter; }
<Start>"PAPER_TYPE"[ \t]*"=" { BEGIN(GetString); s=&paperType; }
<Start>"OUTPUT_LANGUAGE"[ \t]*"=" { BEGIN(GetString); s=&outputLanguage; }
-<Start>"STRIP_FROM_PATH"[ \t]*"=" { BEGIN(GetString); s=&stripFromPath; }
+<Start>"STRIP_FROM_PATH"[ \t]*"=" { BEGIN(GetString); s=&stripFromPath; }
+<Start>"MAN_EXTENSION"[ \t]*"=" { BEGIN(GetString); s=&manExtension; }
<Start>"INCLUDE_PATH"[ \t]*"=" { BEGIN(GetStrList); l=&includePath; elemStr=""; }
<Start>"EXAMPLE_PATH"[ \t]*"=" { BEGIN(GetStrList); l=&examplePath; elemStr=""; }
<Start>"INPUT"[ \t]*"=" { BEGIN(GetStrList); l=&inputSources; elemStr=""; }
@@ -198,6 +201,7 @@ static int yyread(char *buf,int max_size)
<Start>"INTERNAL_DOCS"[ \t]*"=" { BEGIN(GetBool); b=&internalDocsFlag; }
<Start>"CASE_SENSE_NAMES"[ \t]*"=" { BEGIN(GetBool); b=&caseSensitiveNames; }
<Start>"VERBATIM_HEADERS"[ \t]*"=" { BEGIN(GetBool); b=&verbatimHeaderFlag; }
+<Start>"HTML_ALIGN_MEMBERS"[ \t]*"=" { BEGIN(GetBool); b=&htmlAlignMemberFlag; }
<Start>[a-z_A-Z0-9]+ { err("Warning: ignoring unknown tag `%s' at line %d\n",yytext,yyLineNr); }
<GetString,GetBool>\n { yyLineNr++; BEGIN(Start); }
<GetStrList>\n {
@@ -636,6 +640,15 @@ void writeTemplateConfig(QFile *f,bool sl)
if (!sl)
{
t << "\n";
+ t << "# If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes,\n";
+ t << "# files or namespaces will be aligned in HTML using tables. If set to\n";
+ t << "# NO a bullet list will be used.\n";
+ t << "\n";
+ }
+ t << "HTML_ALIGN_MEMBERS = YES\n";
+ if (!sl)
+ {
+ t << "\n";
t << "#---------------------------------------------------------------------------\n";
t << "# configuration options related to the LaTeX output\n";
t << "#---------------------------------------------------------------------------\n";
@@ -704,6 +717,15 @@ void writeTemplateConfig(QFile *f,bool sl)
if (!sl)
{
t << "\n";
+ t << "# The MAN_EXTENSION tag determines the extension that is added to\n";
+ t << "# the generated man pages (default is the subroutine's section .3)\n";
+ t << "\n";
+ }
+ t << "MAN_EXTENSION = .3\n";
+
+ if (!sl)
+ {
+ t << "\n";
t << "#---------------------------------------------------------------------------\n";
t << "# Configuration options related to the preprocessor \n";
t << "#---------------------------------------------------------------------------\n";
@@ -870,6 +892,12 @@ void checkConfig()
// projectName[0]=toupper(projectName[0]);
//}
+ // set default man page extension if non is given by the user
+ if (manExtension.isEmpty())
+ {
+ manExtension=".3";
+ }
+
paperType = paperType.lower().stripWhiteSpace();
if (paperType.isEmpty())
{
diff --git a/src/definition.cpp b/src/definition.cpp
index 535612b..328bebe 100644
--- a/src/definition.cpp
+++ b/src/definition.cpp
@@ -16,6 +16,17 @@
#include <ctype.h>
#include "definition.h"
+#include "doxygen.h"
+
+Definition::Definition(const char *name,const char *b,const char *d)
+{
+ n=name; brief=b; doc=d; sectionList=0;
+}
+
+Definition::~Definition()
+{
+ delete sectionList;
+}
QString Definition::nameToFile(const char *name)
{
@@ -42,3 +53,22 @@ QString Definition::nameToFile(const char *name)
}
return result;
}
+
+void Definition::addSectionsToDefinition(QList<QString> *anchorList)
+{
+ if (!anchorList) return;
+ QString *s=anchorList->first();
+ while (s)
+ {
+ SectionInfo *si=0;
+ if (!s->isEmpty() && (si=sectionDict[*s]))
+ {
+ //printf("Add section `%s' to definition `%s'\n",
+ // si->label.data(),n.data());
+ if (sectionList==0) sectionList = new SectionList;
+ sectionList->append(si);
+ si->definition = this;
+ }
+ s=anchorList->next();
+ }
+}
diff --git a/src/definition.h b/src/definition.h
index 2dbee89..48301bc 100644
--- a/src/definition.h
+++ b/src/definition.h
@@ -18,19 +18,22 @@
#define DEFINITION_H
#include <qstring.h>
+#include <qlist.h>
#include "config.h"
+#include "section.h"
/*! The common base class of all definitions. */
class Definition
{
public:
//! create a new definition
- Definition(const char *name,const char *b=0,const char *d=0)
- { n=name; brief=b; doc=d; }
+ Definition(const char *name,const char *b=0,const char *d=0);
//! destroys the definition
- virtual ~Definition() {}
+ virtual ~Definition();
//! returns the name of the definition
QString name() const { return n; }
+ //! returns the base name of the output file that contains this definition.
+ virtual QString getOutputFileBase() const = 0;
//! returns the detailed description of this definition
QString documentation() const { return doc; }
//! returns the brief description of this definition
@@ -55,10 +58,13 @@ class Definition
{ return !doc.isNull() || !brief.isNull() || extractAllFlag; }
QString nameToFile(const char *name);
+ void addSectionsToDefinition(QList<QString> *anchorList);
+
private:
QString n; // name of the definition
QString brief; // brief description
QString doc; // detailed description
+ SectionList *sectionList; // list of all sections
};
#endif
diff --git a/src/diagram.cpp b/src/diagram.cpp
index 0fd30a5..87d5488 100644
--- a/src/diagram.cpp
+++ b/src/diagram.cpp
@@ -152,7 +152,7 @@ static void writeMapArea(QTextStream &t,ClassDef *cd,int x,int y,int w,int h)
{
t << "<area ";
if (cd->getReference()) t << "doxygen=\"" << cd->getReference() << ":\" ";
- t << "href=\"" << cd->classFile() << ".html\" ";
+ t << "href=\"" << cd->getOutputFileBase() << ".html\" ";
t << "ALT=\"" << cd->name();
t << "\" shape=\"rect\" coords=\"" << x << "," << y << ",";
t << x+w << "," << y+h << "\">" << endl;
@@ -187,7 +187,7 @@ QString DiagramItem::label() const
QString DiagramItem::fileName() const
{
- return classDef->classFile();
+ return classDef->getOutputFileBase();
}
int DiagramItem::avgChildPos() const
diff --git a/src/doxygen.cpp b/src/doxygen.cpp
index 3d641ef..8c11c0b 100644
--- a/src/doxygen.cpp
+++ b/src/doxygen.cpp
@@ -60,6 +60,7 @@ PageList exampleList; // list of all example files
PageList pageList; // list of all related documentation pages
MemberNameList memberNameList; // list of class member + related functions
MemberNameList functionNameList; // list of all unrelated functions
+//MemberNameList namespaceNameList; // list of namespace members;
FileNameList inputNameList; // list of all input files
StringList inputFiles;
FileList includeFiles;
@@ -71,8 +72,9 @@ PageDict pageDict(1009); // dictionary of all doc pages
PageDict exampleDict(1009); // dictionary of all examples
ClassDict classDict(1009); // dictionary of all documented classes
NamespaceDict namespaceDict(257); // dictionary of all documented namespaces
-MemberNameDict memberNameDict(10007); // dictionary of all member names
+MemberNameDict memberNameDict(10007); // dictionary of all class member names
MemberNameDict functionNameDict(10007); // dictionary of all functions
+//MemberNameDict namespaceNameDict(10007);// dictionaty of all namespace member names
StringDict substituteDict(1009); // dictionary of class name substitutes
SectionDict sectionDict(257); // dictionary of all page sections
FileNameDict inputNameDict(1009); // dictionary of sections
@@ -100,6 +102,7 @@ int documentedMembers;
int documentedFiles;
int documentedGroups;
int documentedNamespaces;
+int documentedNamespaceMembers;
QTextStream tagFile;
@@ -140,6 +143,7 @@ void buildGroupList(Entry *root)
gd = new GroupDef(root->name,root->type);
gd->setBriefDescription(root->brief);
gd->setDocumentation(root->doc);
+ gd->addSectionsToDefinition(root->anchors);
groupList.inSort(gd);
groupDict.insert(root->name,gd);
}
@@ -207,6 +211,7 @@ void buildFileList(Entry *root)
{
fd->setDocumentation(root->doc);
fd->setBriefDescription(root->brief);
+ fd->addSectionsToDefinition(root->anchors);
QListIterator<QString> sli(*root->groups);
QString *s;
for (;(s=sli.current());++sli)
@@ -290,7 +295,7 @@ void addIncludeFile(ClassDef *cd,FileDef *ifd,Entry *root)
cd->setIncludeFile(fd);
// set include supplied name
cd->setIncludeName(root->includeName);
- fd->setIncludeName((QString)cd->classFile()+"-include");
+ fd->setIncludeName(cd->getOutputFileBase()+"-include");
if (includeDict[fd->absFilePath()]==0) // include not inserted earlier
{
includeFiles.inSort(fd);
@@ -409,6 +414,7 @@ void buildClassList(Entry *root)
{
cd->setDocumentation(root->doc);
cd->setBriefDescription(root->brief);
+ cd->addSectionsToDefinition(root->anchors);
cd->setName(fullName); // change name to match docs
}
}
@@ -429,7 +435,7 @@ void buildClassList(Entry *root)
)
// new class
{
- int sec=ClassDef::Class;
+ ClassDef::CompoundType sec=ClassDef::Class;
switch(root->section)
{
case Entry::UNION_SEC:
@@ -445,6 +451,7 @@ void buildClassList(Entry *root)
//printf("new ClassDef tempArgList=%p\n",root->tArgList);
cd->setTemplateArguments(root->tArgList);
cd->setProtection(root->protection);
+ cd->addSectionsToDefinition(root->anchors);
QListIterator<QString> sli(*root->groups);
QString *s;
@@ -519,6 +526,7 @@ void buildNamespaceList(Entry *root)
{
nd->setDocumentation(root->doc);
nd->setName(fullName); // change name to match docs
+ nd->addSectionsToDefinition(root->anchors);
}
else if (!nd->documentation().isEmpty() && root->doc.length()>0)
{
@@ -539,14 +547,16 @@ void buildNamespaceList(Entry *root)
}
}
}
- else if (root->doc.length()>0 ||
+ else /* if (root->doc.length()>0 ||
root->brief.length()>0 ||
extractAllFlag
- )
+ )
+ */
{
NamespaceDef *nd=new NamespaceDef(fullName);
nd->setDocumentation(root->doc); // copy docs to definition
nd->setBriefDescription(root->brief);
+ nd->addSectionsToDefinition(root->anchors);
QListIterator<QString> sli(*root->groups);
QString *s;
@@ -639,12 +649,14 @@ void buildVarList(Entry *root)
bool stat=root->stat;
ClassDef *cd=0;
Entry *p = root->parent;
- while ((p->section & Entry::COMPOUND_MASK))
+ while ((p->section & Entry::COMPOUND_MASK) ||
+ p->section==Entry::NAMESPACE_SEC)
{
if (p->name.length()>0 && p->name[0]!='@')
{
if (!scope.isEmpty()) scope.prepend("::");
scope.prepend(p->name);
+ break;
}
p=p->parent;
}
@@ -652,6 +664,7 @@ void buildVarList(Entry *root)
//printf("scope=%s\n",scope.data());
int ni;
+#if 0
if ((ni=root->name.findRev("::"))!=-1)
{
if (scope.length()>0) scope+="::";
@@ -659,8 +672,18 @@ void buildVarList(Entry *root)
name=root->name.right(root->name.length()-ni-2);
stat=TRUE;
}
+#endif
+
+ if ((ni=root->name.findRev("::"))!=-1) goto nextMember;
+ /* skip this member, because it is a
+ * static variable definition (always?), which will be
+ * found in a class scope as well, but then we know the
+ * correct protection level, so only then it will be
+ * inserted in the correct list!
+ */
MemberDef::MemberType mtype;
+// NamespaceDef *nd = 0;
QString type=root->type.stripWhiteSpace();
if (type=="@")
mtype=MemberDef::EnumValue;
@@ -715,11 +738,28 @@ void buildVarList(Entry *root)
if (mn)
{
MemberDef *md=mn->first();
- while (md)
+ while (md && !found)
{
if (md->memberClass()==cd) // member already in the scope
{
addMemberDocs(root,md,def,FALSE);
+
+#if 0
+ // always trust the most protected scope, so adjust if needed
+ // This is needed to properly place static private variables,
+ // which are defined in a `public' scope.
+ printf("Checking protection level\n");
+ if (root->protection==Private || md->protection()!=Private)
+ {
+ printf("Set to private\n");
+ md->setProtection(Private);
+ }
+ else if (root->protection==Protected && md->protection()==Public)
+ {
+ printf("Set to protected\n");
+ md->setProtection(Protected);
+ }
+#endif
found=TRUE;
}
md=mn->next();
@@ -737,6 +777,7 @@ void buildVarList(Entry *root)
md->setDocumentation(root->doc);
md->setBriefDescription(root->brief);
md->setDefinition(def);
+ md->addSectionsToDefinition(root->anchors);
// add the member to the global list
if (mn)
@@ -761,6 +802,56 @@ void buildVarList(Entry *root)
cd->insertUsedFile(root->fileName);
}
}
+#if 0
+ else if (scope.length()>0 && name.length()>0 && (nd=namespaceDict[scope]))
+ {
+ Debug::print(Debug::Variables,0,
+ " namespace variable:\n"
+ " type=`%s' scope=`%s' name=`%s' args=`%s' prot=`%d\n",
+ root->type.data(),
+ scope.data(),
+ name.data(),
+ root->args.data(),
+ root->protection
+ );
+ // new global variable, enum value or typedef
+ MemberDef *md=new MemberDef(root->type,name,root->args,0,
+ Public, Normal,root->stat,FALSE,
+ mtype,0,0);
+ md->setDefFile(root->fileName);
+ md->setDefLine(root->startLine);
+ md->setDocumentation(root->doc);
+ md->setBriefDescription(root->brief);
+ md->addSectionsToDefinition(root->anchors);
+ QString def;
+ nd->insertMember(md);
+ md->setNamespace(nd);
+ if (root->type.length()>0)
+ {
+ def=root->type+" "+nd->name()+"::"+name+root->args;
+ }
+ else
+ {
+ def=nd->name()+"::"+name+root->args;
+ }
+ if (def.left(7)=="static ") def=def.right(def.length()-7);
+ md->setDefinition(def);
+
+ MemberName *mn;
+ // add member definition to the list of globals
+ if ((mn=namespaceNameDict[name]))
+ {
+ mn->inSort(md);
+ }
+ else
+ {
+ mn = new MemberName(name);
+ mn->inSort(md);
+ namespaceNameDict.insert(name,mn);
+ namespaceNameList.inSort(mn);
+ }
+ }
+#endif
else if (name.length()>0) // global variable
{
Debug::print(Debug::Variables,0,
@@ -781,6 +872,7 @@ void buildVarList(Entry *root)
md->setDefLine(root->startLine);
md->setDocumentation(root->doc);
md->setBriefDescription(root->brief);
+ md->addSectionsToDefinition(root->anchors);
QString def;
// see if the function is inside a namespace
@@ -850,6 +942,7 @@ void buildVarList(Entry *root)
}
}
}
+nextMember:
EntryListIterator eli(*root->sublist);
Entry *e;
for (;(e=eli.current());++eli)
@@ -925,6 +1018,7 @@ void buildMemberList(Entry *root)
md->setDefLine(root->startLine);
md->setDocumentation(root->doc);
md->setBriefDescription(root->brief);
+ md->addSectionsToDefinition(root->anchors);
QString def;
if (root->relates.length()>0 || isFriend)
{
@@ -1048,6 +1142,7 @@ void buildMemberList(Entry *root)
{
md->setBriefDescription(root->brief);
}
+ md->addSectionsToDefinition(root->anchors);
}
md=mn->next();
}
@@ -1067,6 +1162,7 @@ void buildMemberList(Entry *root)
md->setDocumentation(root->doc);
md->setBriefDescription(root->brief);
md->setPrototype(root->proto);
+ md->addSectionsToDefinition(root->anchors);
QString def;
if (root->type.length()>0)
{
@@ -1357,8 +1453,9 @@ void computeClassRelations(Entry *root)
}
else // base class not documented
{
- //printf("Found undocumented base class %s\n",bi->name.data());
NamespaceDef *nd=cd->getNamespace();
+ //printf("Found undocumented base class `%s' namespace scope=`%s'\n",
+ // bi->name.data(),nd ? nd->name().data() : "<none>");
if (nd && (baseClass=getClass(nd->name()+"::"+baseClassName)))
// class is defined inside namespace
{
@@ -1369,7 +1466,7 @@ void computeClassRelations(Entry *root)
}
else // undocumented base class
{
- baseClass=new ClassDef(bi->name,Entry::CLASS_SEC);
+ baseClass=new ClassDef(bi->name,ClassDef::Class);
// add base class to this class
cd->insertBaseClass(baseClass,bi->prot,bi->virt,templSpec);
// add this class as super class to the base class
@@ -1523,6 +1620,7 @@ void addMemberDocs(Entry *root,MemberDef *md, const char *funcDecl,
}
md->setDefFile(root->fileName);
md->setDefLine(root->startLine);
+ md->addSectionsToDefinition(root->anchors);
if (cd) cd->insertUsedFile(root->fileName);
}
@@ -1676,21 +1774,23 @@ void findMember(Entry *root,QString funcDecl,QString related,bool overloaded,
else
scopeName=related.copy();
}
- else if (scopeName.isEmpty() && related.isEmpty() && root->parent &&
+ else if (/*scopeName.isEmpty() &&*/ related.isEmpty() && root->parent &&
!root->parent->name.isNull())
{
Entry *p=root->parent;
while (p) // get full scope as class name
{
+ //printf("++++++ scope=`%s'\n",p->name.data());
if (((p->section & Entry::COMPOUND_MASK) ||
p->section == Entry::NAMESPACE_SEC
) && !p->name.isEmpty() && p->name[0]!='@'
)
{
+ if (scopeName.left(p->name.length())==p->name)
+ break; // scope already present, so stop now
+ // prepend name to scope
if (!scopeName.isEmpty()) scopeName.prepend("::");
scopeName.prepend(p->name);
- break; // stop here because the class name already contains
- // the whole scope!
}
p=p->parent;
}
@@ -1906,6 +2006,7 @@ void findMember(Entry *root,QString funcDecl,QString related,bool overloaded,
md->setDefFile(root->fileName);
md->setDefLine(root->startLine);
md->setPrototype(root->proto);
+ md->addSectionsToDefinition(root->anchors);
mn->inSort(md);
cd->insertMember(md);
cd->insertUsedFile(root->fileName);
@@ -1970,6 +2071,7 @@ void findMember(Entry *root,QString funcDecl,QString related,bool overloaded,
md->setDefFile(root->fileName);
md->setDefLine(root->startLine);
md->setPrototype(root->proto);
+ md->addSectionsToDefinition(root->anchors);
mn->inSort(md);
cd->insertMember(md);
cd->insertUsedFile(root->fileName);
@@ -2014,7 +2116,7 @@ void findMember(Entry *root,QString funcDecl,QString related,bool overloaded,
void findMemberDocumentation(Entry *root)
{
int i,l;
- QRegExp re("([a-zA-Z0-9: ]*[ *]+[ ]*");
+ QRegExp re("([a-zA-Z0-9: ]*\\*+[ \\*]*");
Debug::print(Debug::FindMembers,0,
"root->type=`%s' root->name=`%s' root->args=`%s'\n",
root->type.data(),root->name.data(),root->args.data()
@@ -2026,7 +2128,7 @@ void findMemberDocumentation(Entry *root)
root->type=root->type.left(i+l);
isFunc=FALSE;
}
- else if (root->name.find(re)!=-1 && root->name.find("operator")!=-1)
+ else if (root->name.find(re)!=-1 && root->name.find("operator")==-1)
// func ptr entered with \fn, \var or \typedef
{
isFunc=FALSE;
@@ -2151,6 +2253,7 @@ void findEnums(Entry *root)
if (!isGlobal) md->setMemberClass(cd); else md->setFileDef(fd);
md->setDefFile(root->fileName);
md->setDefLine(root->startLine);
+ md->addSectionsToDefinition(root->anchors);
if (nd)
{
md->setDefinition(nd->name()+"::"+name);
@@ -2301,6 +2404,7 @@ void findEnumDocumentation(Entry *root)
{
md->setBriefDescription(root->brief);
}
+ md->addSectionsToDefinition(root->anchors);
found=TRUE;
}
md=mn->next();
@@ -2319,6 +2423,7 @@ void findEnumDocumentation(Entry *root)
{
md->setDocumentation(root->doc);
md->setBriefDescription(root->brief);
+ md->addSectionsToDefinition(root->anchors);
found=TRUE;
}
}
@@ -2338,6 +2443,49 @@ void findEnumDocumentation(Entry *root)
}
}
+// seach for each enum (member or function) in mnl if it has documented
+// enum values.
+static void findDEV(const MemberNameList &mnl)
+{
+ MemberName *mn;
+ MemberNameListIterator mnli(mnl);
+ // for each member name
+ for (mnli.toFirst();(mn=mnli.current());++mnli)
+ {
+ MemberDef *md;
+ MemberNameIterator mni(*mn);
+ // for each member definition
+ for (mni.toFirst();(md=mni.current());++mni)
+ {
+ if (md->isEnumerate()) // member is an enum
+ {
+ QList<MemberDef> *fmdl = md->enumFieldList();
+ int documentedEnumValues=0;
+ if (fmdl) // enum has values
+ {
+ MemberDef *fmd=fmdl->first();
+ // for each enum value
+ while (fmd)
+ {
+ if (fmd->hasDocumentation()) documentedEnumValues++;
+ fmd=fmdl->next();
+ }
+ }
+ // at least one enum value is documented
+ if (documentedEnumValues>0) md->setDocumentedEnumValues(TRUE);
+ }
+ }
+ }
+}
+
+// seach for each enum (member or function) if it has documented enum
+// values.
+void findDocumentedEnumValues()
+{
+ findDEV(memberNameList);
+ findDEV(functionNameList);
+}
+
//----------------------------------------------------------------------
// recursive function:
// returns TRUE iff class definition `bcd' represents an (in)direct base
@@ -2695,6 +2843,7 @@ void findDefineDocumentation(Entry *root)
md->setDocumentation(root->doc);
if (md->briefDescription().isEmpty())
md->setBriefDescription(root->brief);
+ md->addSectionsToDefinition(root->anchors);
}
md=mn->next();
}
@@ -2715,6 +2864,7 @@ void findDefineDocumentation(Entry *root)
md->setDocumentation(root->doc);
if (md->briefDescription().isEmpty())
md->setBriefDescription(root->brief);
+ md->addSectionsToDefinition(root->anchors);
}
}
md=mn->next();
@@ -2769,6 +2919,7 @@ void buildPageList(Entry *root)
baseName=baseName.left(baseName.length()-5);
pi=new PageInfo(baseName, root->doc,
root->args.stripWhiteSpace());
+ setFileNameForSections(root->anchors,root->name);
pageList.append(pi);
pageDict.insert(baseName,pi);
if (pi->title.length()>0)
@@ -2779,8 +2930,11 @@ void buildPageList(Entry *root)
else
pageName=pi->name.lower();
//outputList->writeTitle(pi->name,pi->title);
- SectionInfo *si=new SectionInfo(pageName+".html",
- pi->name,pi->title,FALSE);
+
+ // a page name is a label as well!
+ SectionInfo *si=new SectionInfo(
+ pi->name,pi->title,SectionInfo::Section);
+ si->fileName=pageName+".html";
//printf("Adding section info %s\n",pi->name.data());
sectionDict.insert(pi->name,si);
}
@@ -2796,6 +2950,26 @@ void buildPageList(Entry *root)
}
//----------------------------------------------------------------------------
+
+void resolveUserReferences()
+{
+ QDictIterator<SectionInfo> sdi(sectionDict);
+ SectionInfo *si;
+ for (;(si=sdi.current());++sdi)
+ {
+ if (si->definition)
+ {
+ //printf("si=`%s' def=`%s' file=`%s'\n",
+ // si->label.data(),
+ // si->definition->name().data(),
+ // si->definition->getOutputFileBase().data());
+ si->fileName=si->definition->getOutputFileBase().copy();
+ }
+ }
+}
+
+
+//----------------------------------------------------------------------------
// generate all separate documentation pages
void generatePageDocs()
@@ -2803,14 +2977,7 @@ void generatePageDocs()
PageInfo *pi=pageList.first();
while (pi)
{
- if (!pi->title.isEmpty())
- {
- msg("Generating docs for page %s...\n",pi->title.data());
- }
- else
- {
- msg("Generating docs for page %s...\n",pi->name.data());
- }
+ msg("Generating docs for page %s...\n",pi->name.data());
outputList->disable(OutputGenerator::Man);
QString pageName;
if (caseSensitiveNames)
@@ -2850,6 +3017,7 @@ void buildExampleList(Entry *root)
else
{
PageInfo *pi=new PageInfo(root->name,root->doc,root->args);
+ setFileNameForSections(root->anchors,root->name);
exampleList.inSort(pi);
exampleDict.insert(root->name,pi);
}
@@ -3166,6 +3334,7 @@ void readFiles(BufStr &output)
s=inputFiles.next();
}
// *p++='\0';
+ output.addChar('\n'); /* to prevent problems under Windows ? */
output.addChar(0);
//printf("Output after preprocessing:\n---------\n%s\n----------\n",output.data());
//printf("Final length = %d\n",p-output.data());
@@ -3206,7 +3375,7 @@ int readDir(QFileInfo *fi,
else if (cfi->isFile() &&
patternMatch(cfi,patList) && !patternMatch(cfi,exclPatList))
{
- totalSize+=cfi->size()+cfi->absFilePath().length()+3;
+ totalSize+=cfi->size()+cfi->absFilePath().length()+4;
QString name=cfi->fileName();
if (fnDict)
{
@@ -3306,7 +3475,7 @@ int readFileOrDirectory(const char *s,
}
else if (fi.isFile())
{
- totalSize+=fi.size()+fi.absFilePath().length()+3; //readFile(&fi,fiList,input);
+ totalSize+=fi.size()+fi.absFilePath().length()+4; //readFile(&fi,fiList,input);
//fiList->inSort(new FileInfo(fi));
QString name=fi.fileName();
if (fnDict)
@@ -3646,16 +3815,19 @@ int main(int argc,char **argv)
msg("Searching for enumerations...\n");
findEnums(root);
findEnumDocumentation(root);
-
// msg("Searching for function prototypes...\n");
// findPrototypes(root); // may introduce new members !
msg("Searching for member function documentation...\n");
findMemberDocumentation(root); // may introduce new members !
+
msg("Freeing entry tree\n");
delete root;
+ msg("Determining which enums are documented\n");
+ findDocumentedEnumValues();
+
msg("Computing member references...\n");
computeMemberReferences();
@@ -3678,18 +3850,22 @@ int main(int argc,char **argv)
// If the result is 0 we do not generate the lists and omit the
// corresponding links in the index.
msg("Counting data structures...\n");
- annotatedClasses = countAnnotatedClasses();
- hierarchyClasses = countClassHierarchy();
- documentedMembers = countMemberList();
- documentedFunctions = countFunctionList();
- documentedFiles = countFileList();
- documentedGroups = countGroupList();
- documentedNamespaces = countNamespaceList();
+ annotatedClasses = countAnnotatedClasses();
+ hierarchyClasses = countClassHierarchy();
+ documentedMembers = countClassMembers();
+ documentedFunctions = countFileMembers();
+ documentedFiles = countFiles();
+ documentedGroups = countGroups();
+ documentedNamespaces = countNamespaces();
+ documentedNamespaceMembers = countNamespaceMembers();
// compute the shortest possible names of all files
// without loosing the uniqueness of the file names.
msg("Generating disk names...\n");
inputNameList.generateDiskNames();
+
+ msg("Resolving user defined references...\n");
+ resolveUserReferences();
msg("Generating example documentation...\n");
generateExampleDocs();
@@ -3715,9 +3891,12 @@ int main(int argc,char **argv)
msg("Generating example index...\n");
writeExampleIndex(*outputList);
- msg("Generating function index...\n");
- writeFunctionIndex(*outputList);
+ msg("Generating file member index...\n");
+ writeFileMemberIndex(*outputList);
+ msg("Generating namespace member index...\n");
+ writeNamespaceMemberIndex(*outputList);
+
// msg("Generating define index...\n");
// writeDefineIndex(*outputList);
@@ -3730,17 +3909,17 @@ int main(int argc,char **argv)
msg("Generating style sheet...\n");
outputList->writeStyleInfo(0); // write first part
outputList->disableAllBut(OutputGenerator::Latex);
- parseDoc(*outputList,0,0,
+ parseText(*outputList,
theTranslator->trGeneratedAt(dateToString(TRUE),projectName)
);
outputList->writeStyleInfo(1); // write second part
- parseDoc(*outputList,0,0, theTranslator->trWrittenBy());
+ parseText(*outputList,theTranslator->trWrittenBy());
outputList->writeStyleInfo(2); // write third part
- parseDoc(*outputList,0,0,
+ parseText(*outputList,
theTranslator->trGeneratedAt(dateToString(TRUE),projectName)
);
outputList->writeStyleInfo(3); // write fourth part
- parseDoc(*outputList,0,0, theTranslator->trWrittenBy());
+ parseText(*outputList,theTranslator->trWrittenBy());
outputList->writeStyleInfo(4); // write last part
outputList->enableAll();
diff --git a/src/doxygen.h b/src/doxygen.h
index 05ca854..005ac7e 100644
--- a/src/doxygen.h
+++ b/src/doxygen.h
@@ -28,6 +28,7 @@
#include "define.h"
#include "namespacedef.h"
#include "formula.h"
+#include "section.h"
struct PageInfo
{
@@ -72,23 +73,12 @@ class BufStr : public QString
const int spareRoom; // 10Kb extra room to avoid frequent resizing
};
-struct SectionInfo
-{
- SectionInfo(const char *n,const char *l,const char *t,bool sub)
- { pageName=n; label=l; title=t; isSubsection=sub; }
- QString pageName;
- QString label;
- QString title;
- bool isSubsection;
-};
-
typedef QList<QString> StringList;
typedef QDict<MemberDef> MemberDict;
typedef QDict<ClassDef> ClassDict;
typedef QDict<FileDef> FileDict;
typedef QDict<QString> StringDict;
typedef QDict<PageInfo> PageDict;
-typedef QDict<SectionInfo> SectionDict;
typedef QDict<GroupDef> GroupDict;
extern const char * getOverloadDocs();
@@ -118,6 +108,7 @@ extern FileList includeFiles;
extern StringDict typedefDict;
extern GroupList groupList;
extern NamespaceList namespaceList;
+extern NamespaceDict namespaceDict;
extern FormulaList formulaList;
extern FormulaDict formulaDict;
extern FormulaDict formulaNameDict;
@@ -130,5 +121,6 @@ extern int documentedDefines;
extern int documentedFiles;
extern int documentedGroups;
extern int documentedNamespaces;
+extern int documentedNamespaceMembers;
#endif
diff --git a/src/doxygen.pro b/src/doxygen.pro
index e6dd3c0..21e2ea5 100644
--- a/src/doxygen.pro
+++ b/src/doxygen.pro
@@ -14,7 +14,7 @@
# TMake project file for doxygen
TEMPLATE = doxygen.t
-CONFIG = console qt warn_on release #debug
+CONFIG = console qt warn_on release #debug
HEADERS = doxygen.h scanner.h classdef.h classlist.h memberdef.h \
membername.h index.h memberlist.h definition.h \
entry.h logos.h instdox.h message.h code.h \
diff --git a/src/doxytag.l b/src/doxytag.l
index 4f9fac1..0c70dc6 100644
--- a/src/doxytag.l
+++ b/src/doxytag.l
@@ -251,7 +251,8 @@ QString unhtmlify(const char *str)
}
<SearchWords>[a-z_A-Z0-9]+ {
docAnchor = yytext;
- if (docAnchor=="details")
+ if (docAnchor=="details" ||
+ docAnchor=="_details")
{
docRefName=className.copy();
addReference();
diff --git a/src/entry.cpp b/src/entry.cpp
index 2520fa3..51724ce 100644
--- a/src/entry.cpp
+++ b/src/entry.cpp
@@ -29,6 +29,8 @@ Entry::Entry()
extends->setAutoDelete(TRUE);
groups = new QList<QString>;
groups->setAutoDelete(TRUE);
+ anchors = new QList<QString>;
+ anchors->setAutoDelete(TRUE);
argList = new ArgumentList;
argList->setAutoDelete(TRUE);
//printf("Entry::Entry() tArgList=0\n");
@@ -66,6 +68,8 @@ Entry::Entry(const Entry &e)
extends->setAutoDelete(TRUE);
groups = new QList<QString>;
groups->setAutoDelete(TRUE);
+ anchors = new QList<QString>;
+ anchors->setAutoDelete(TRUE);
argList = new ArgumentList;
argList->setAutoDelete(TRUE);
//printf("Entry::Entry(copy) tArgList=0\n");
@@ -94,6 +98,12 @@ Entry::Entry(const Entry &e)
{
groups->append(new QString(*s));
}
+
+ QListIterator<QString> sli2(*e.anchors);
+ for (;(s=sli2.current());++sli2)
+ {
+ anchors->append(new QString(*s));
+ }
// deep copy argument list
QListIterator<Argument> ali(*e.argList);
@@ -128,6 +138,7 @@ Entry::~Entry()
delete sublist;
delete extends;
delete groups;
+ delete anchors;
delete argList;
//printf("Entry::~Entry() tArgList=%p\n",tArgList);
delete tArgList;
@@ -177,6 +188,7 @@ void Entry::reset()
sublist->clear();
extends->clear();
groups->clear();
+ anchors->clear();
argList->clear();
if (tArgList) { delete tArgList; tArgList=0; }
}
@@ -211,6 +223,13 @@ int Entry::getSize()
size+=s->length()+1;
s=groups->next();
}
+ s=anchors->first();
+ while (s)
+ {
+ size+=sizeof(QLNode);
+ size+=s->length()+1;
+ s=anchors->next();
+ }
Entry *e=sublist->first();
while (e)
{
diff --git a/src/entry.h b/src/entry.h
index 40624d8..a302955 100644
--- a/src/entry.h
+++ b/src/entry.h
@@ -140,6 +140,7 @@ class Entry
QList<Entry> *sublist; // entries that are children of this one
QList<BaseInfo> *extends; // list of base classes
QList<QString> *groups; // list of groups this entry belongs to
+ QList<QString> *anchors; // list of anchors defined in this entry
QString fileName; // file this entry was extracted from
int startLine; // start line of entry in the source
int num;
diff --git a/src/filedef.cpp b/src/filedef.cpp
index 54266a5..7921bf7 100644
--- a/src/filedef.cpp
+++ b/src/filedef.cpp
@@ -69,7 +69,7 @@ void FileDef::writeDocumentation(OutputList &ol)
QString pageTitle=name()+" File Reference";
startFile(ol,diskname,pageTitle);
startTitle(ol);
- ol.docify(pageTitle);
+ parseText(ol,theTranslator->trFileReference(name()));
endTitle(ol,name());
//ol.newParagraph();
@@ -86,8 +86,8 @@ void FileDef::writeDocumentation(OutputList &ol)
ol+=briefOutput;
ol.writeString(" \n");
ol.disableAllBut(OutputGenerator::Html);
- ol.startTextLink(0,"details");
- parseDoc(ol,0,0,theTranslator->trMore());
+ ol.startTextLink(0,"_details");
+ parseText(ol,theTranslator->trMore());
ol.endTextLink();
ol.enableAll();
}
@@ -96,6 +96,7 @@ void FileDef::writeDocumentation(OutputList &ol)
ol.enable(OutputGenerator::Man);
ol.writeSynopsis();
+ ol.startMemberSections();
if (classList->count()>0)
{
ClassDef *cd=classList->first();
@@ -111,7 +112,7 @@ void FileDef::writeDocumentation(OutputList &ol)
if (!found)
{
ol.startMemberHeader();
- parseDoc(ol,0,0,theTranslator->trCompounds());
+ parseText(ol,theTranslator->trCompounds());
ol.endMemberHeader();
ol.startMemberList();
found=TRUE;
@@ -124,10 +125,11 @@ void FileDef::writeDocumentation(OutputList &ol)
case ClassDef::Union: ol.writeString("union"); break;
}
ol.writeString(" ");
+ ol.insertMemberAlign();
if (cd->hasDocumentation())
{
ol.writeObjectLink(cd->getReference(),
- cd->classFile(),
+ cd->getOutputFileBase(),
0,
cd->name()
);
@@ -146,6 +148,7 @@ void FileDef::writeDocumentation(OutputList &ol)
}
writeMemberDecs(ol,0,0,this,0,0,memList);
+ ol.endMemberSections();
//doc=doc.stripWhiteSpace();
//int bl=brief.length();
@@ -153,9 +156,12 @@ void FileDef::writeDocumentation(OutputList &ol)
if (!briefDescription().isEmpty() || !documentation().isEmpty())
{
ol.writeRuler();
- ol.writeAnchor("details");
+ bool latexOn = ol.isEnabled(OutputGenerator::Latex);
+ if (latexOn) ol.disable(OutputGenerator::Latex);
+ ol.writeAnchor("_details");
+ if (latexOn) ol.enable(OutputGenerator::Latex);
ol.startGroupHeader();
- parseDoc(ol,0,0,theTranslator->trDetailedDescription());
+ parseText(ol,theTranslator->trDetailedDescription());
ol.endGroupHeader();
if (!briefDescription().isEmpty())
{
@@ -177,7 +183,7 @@ void FileDef::writeDocumentation(OutputList &ol)
{
ol.writeRuler();
ol.startGroupHeader();
- parseDoc(ol,0,0,theTranslator->trDefineDocumentation());
+ parseText(ol,theTranslator->trDefineDocumentation());
ol.endGroupHeader();
writeMemberDocs(ol,memList,name(),MemberDef::Define);
}
@@ -186,7 +192,7 @@ void FileDef::writeDocumentation(OutputList &ol)
{
ol.writeRuler();
ol.startGroupHeader();
- parseDoc(ol,0,0,theTranslator->trFunctionPrototypeDocumentation());
+ parseText(ol,theTranslator->trFunctionPrototypeDocumentation());
ol.endGroupHeader();
writeMemberDocs(ol,memList,name(),MemberDef::Prototype);
}
@@ -195,7 +201,7 @@ void FileDef::writeDocumentation(OutputList &ol)
{
ol.writeRuler();
ol.startGroupHeader();
- parseDoc(ol,0,0,theTranslator->trTypedefDocumentation());
+ parseText(ol,theTranslator->trTypedefDocumentation());
ol.endGroupHeader();
writeMemberDocs(ol,memList,name(),MemberDef::Typedef);
}
@@ -204,7 +210,7 @@ void FileDef::writeDocumentation(OutputList &ol)
{
ol.writeRuler();
ol.startGroupHeader();
- parseDoc(ol,0,0,theTranslator->trEnumerationTypeDocumentation());
+ parseText(ol,theTranslator->trEnumerationTypeDocumentation());
ol.endGroupHeader();
writeMemberDocs(ol,memList,name(),MemberDef::Enumeration);
}
@@ -213,7 +219,7 @@ void FileDef::writeDocumentation(OutputList &ol)
{
ol.writeRuler();
ol.startGroupHeader();
- parseDoc(ol,0,0,theTranslator->trEnumerationValueDocumentation());
+ parseText(ol,theTranslator->trEnumerationValueDocumentation());
ol.endGroupHeader();
writeMemberDocs(ol,memList,name(),MemberDef::EnumValue);
}
@@ -222,7 +228,7 @@ void FileDef::writeDocumentation(OutputList &ol)
{
ol.writeRuler();
ol.startGroupHeader();
- parseDoc(ol,0,0,theTranslator->trFunctionDocumentation());
+ parseText(ol,theTranslator->trFunctionDocumentation());
ol.endGroupHeader();
writeMemberDocs(ol,memList,name(),MemberDef::Function);
}
@@ -231,7 +237,7 @@ void FileDef::writeDocumentation(OutputList &ol)
{
ol.writeRuler();
ol.startGroupHeader();
- parseDoc(ol,0,0,theTranslator->trVariableDocumentation());
+ parseText(ol,theTranslator->trVariableDocumentation());
ol.endGroupHeader();
writeMemberDocs(ol,memList,name(),MemberDef::Variable);
}
@@ -239,9 +245,9 @@ void FileDef::writeDocumentation(OutputList &ol)
// write Author section (Man only)
ol.disableAllBut(OutputGenerator::Man);
ol.startGroupHeader();
- parseDoc(ol,0,0,theTranslator->trAuthor());
+ parseText(ol,theTranslator->trAuthor());
ol.endGroupHeader();
- parseDoc(ol,0,0,theTranslator->trGeneratedAutomatically(projectName));
+ parseText(ol,theTranslator->trGeneratedAutomatically(projectName));
ol.enableAll();
endFile(ol);
}
diff --git a/src/filedef.h b/src/filedef.h
index 36ce9cb..ca95e20 100644
--- a/src/filedef.h
+++ b/src/filedef.h
@@ -62,7 +62,8 @@ class FileDef : public Definition
}
/*! Returns nameString with all slashes replaced by underscores. */
- const char *diskName() const { return diskname; }
+ //const char *diskName() const { return diskname; }
+ QString getOutputFileBase() const { return diskname; }
/*! Returns the absolute path including the file name. */
QString absFilePath() const { return filepath; }
diff --git a/src/groupdef.cpp b/src/groupdef.cpp
index 6a2d79b..924199e 100644
--- a/src/groupdef.cpp
+++ b/src/groupdef.cpp
@@ -90,20 +90,20 @@ void GroupDef::writeDocumentation(OutputList &ol)
ol+=briefOutput;
ol.writeString(" \n");
ol.disable(OutputGenerator::Latex);
- ol.startTextLink(0,"details");
- parseDoc(ol,0,0,theTranslator->trMore());
+ ol.startTextLink(0,"_details");
+ parseText(ol,theTranslator->trMore());
ol.enable(OutputGenerator::Latex);
}
if (fileList->count()>0)
{
ol.startMemberHeader();
- parseDoc(ol,0,0,theTranslator->trFiles());
+ parseText(ol,theTranslator->trFiles());
ol.endMemberHeader();
ol.startIndexList();
FileDef *fd=fileList->first();
while (fd)
{
- ol.writeStartAnnoItem("file ",fd->diskName(),0,fd->name());
+ ol.writeStartAnnoItem("file ",fd->getOutputFileBase(),0,fd->name());
ol.writeEndAnnoItem(fd->name());
fd=fileList->next();
}
@@ -112,7 +112,7 @@ void GroupDef::writeDocumentation(OutputList &ol)
if (classList->count()>0)
{
ol.startMemberHeader();
- parseDoc(ol,0,0,theTranslator->trCompounds());
+ parseText(ol,theTranslator->trCompounds());
ol.endMemberHeader();
ol.startIndexList();
ClassDef *cd=classList->first();
@@ -125,7 +125,7 @@ void GroupDef::writeDocumentation(OutputList &ol)
case ClassDef::Struct: type="struct"; break;
case ClassDef::Union: type="union"; break;
}
- ol.writeStartAnnoItem(type,cd->classFile(),0,cd->name());
+ ol.writeStartAnnoItem(type,cd->getOutputFileBase(),0,cd->name());
ol.writeEndAnnoItem(cd->name());
cd=classList->next();
}
@@ -136,9 +136,12 @@ void GroupDef::writeDocumentation(OutputList &ol)
if (!briefDescription().isEmpty() || !documentation().isEmpty())
{
ol.writeRuler();
- ol.writeAnchor("details");
+ bool latexOn = ol.isEnabled(OutputGenerator::Latex);
+ if (latexOn) ol.disable(OutputGenerator::Latex);
+ ol.writeAnchor("_details");
+ if (latexOn) ol.enable(OutputGenerator::Latex);
ol.startGroupHeader();
- parseDoc(ol,0,0,theTranslator->trDetailedDescription());
+ parseText(ol,theTranslator->trDetailedDescription());
ol.endGroupHeader();
// repeat brief description
if (!briefDescription().isEmpty())
diff --git a/src/groupdef.h b/src/groupdef.h
index 421b701..a8bc562 100644
--- a/src/groupdef.h
+++ b/src/groupdef.h
@@ -35,7 +35,8 @@ class GroupDef : public Definition
public:
GroupDef(const char *name,const char *title);
~GroupDef();
- const char *groupFile() const { return fileName; }
+ //const char *groupFile() const { return fileName; }
+ QString getOutputFileBase() const { return fileName; }
const char *groupTitle() const { return title; }
void addFile(const FileDef *def);
void addClass(const ClassDef *def);
diff --git a/src/htmlgen.cpp b/src/htmlgen.cpp
index 4ab337f..8c5b50a 100644
--- a/src/htmlgen.cpp
+++ b/src/htmlgen.cpp
@@ -51,77 +51,10 @@ void HtmlGenerator::init()
writeLogo(htmlOutputDir);
}
-//void HtmlGenerator::generateExternalIndex()
-//{
-// //printf("Generating external index...\n");
-// QFile f;
-// f.setName(htmlOutputDir+"/header.html");
-// if (f.open(IO_WriteOnly))
-// {
-// QTextStream tt(&f);
-// if (header.length()==0)
-// {
-// tt << "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN\">\n"
-// "<html><head><meta name=\"robots\" content=\"noindex\">\n"
-// "<title>Doxysearch</title>\n"
-// "</head><body bgcolor=\"#ffffff\">\n";
-// }
-// else
-// {
-// tt << header;
-// }
-// if (!noIndexFlag)
-// {
-// tt << "<center>";
-// if (documentedGroups>0)
-// tt << "<a doxygen=\"_doc:\" href=\"/modules.html\">Modules</a> &nbsp; ";
-// if (hierarchyClasses>0)
-// tt << "<a doxygen=\"_doc:\" href=\"/hierarchy.html\">Class hierarchy</a> &nbsp; ";
-// if (annotatedClasses>0)
-// tt << "<a doxygen=\"_doc:\" href=\"/annotated.html\">Compound list</a> &nbsp; ";
-// if (documentedFiles>0)
-// tt << "<a doxygen=\"_doc:\" href=\"/files.html\">File list</a> &nbsp; ";
-// if (includeFiles.count()>0)
-// tt << "<a doxygen=\"_doc:\" href=\"/headers.html\">Header files</a> &nbsp; ";
-// if (documentedMembers>0)
-// tt << "<a doxygen=\"_doc:\" href=\"/functions.html\">Compound Members</a> &nbsp; ";
-// if (documentedFunctions>0)
-// tt << "<a doxygen=\"_doc:\" href=\"/globals.html\">File Members</a> &nbsp; ";
-// if (pageList.count()>0)
-// tt << "<a doxygen=\"_doc:\" href=\"/pages.html\">Related Pages</a> &nbsp; ";
-// if (exampleList.count()>0)
-// tt << "<a doxygen=\"_doc:\" href=\"/examples.html\">Examples</a> &nbsp; ";
-// if (searchEngineFlag)
-// tt << "<a doxygen=\"_cgi:\" href=\"\">Search</a>";
-// tt << endl << "</center><hr>" << endl;
-// }
-// }
-// f.close();
-//
-// f.setName(htmlOutputDir+"/footer.html");
-// if (f.open(IO_WriteOnly))
-// {
-// QTextStream tt(&f);
-// if (footer.length()==0)
-// {
-// tt << "<hr><address><small>Generated at " << dateToString(TRUE);
-// if (projectName.length()>0) tt << " for " << projectName;
-// tt << " by <a href=\"http://www.stack.nl/~dimitri/doxygen/index.html\">"
-// "doxygen</a>&nbsp; written by <a href="
-// "\"mailto:dimitri@stack.nl\">Dimitri van Heesch</a>, &copy; "
-// "1997-1999</small></address>\n</body>\n</html>\n";
-// }
-// else
-// {
-// tt << footer;
-// }
-// }
-// f.close();
-//}
-
void HtmlGenerator::startFile(const char *name,const char *title,bool external)
{
QString fileName=name;
+ lastTitle=title;
if (fileName.right(5)!=".html") fileName+=".html";
startPlainFile(fileName);
if (header.length()==0)
@@ -139,34 +72,14 @@ void HtmlGenerator::startFile(const char *name,const char *title,bool external)
}
else
{
- t << header;
+ t << substitute(
+ substitute(
+ substitute(header,"$title",lastTitle),
+ "$datetime",dateToString(TRUE)
+ ),
+ "$date",dateToString(FALSE)
+ );
}
-
-// if (!noIndexFlag)
-// {
-// t << "<center>";
-// if (documentedGroups>0)
-// t << "<a href=\"modules.html\">Modules</a> &nbsp; ";
-// if (hierarchyClasses>0)
-// t << "<a href=\"hierarchy.html\">Class hierarchy</a> &nbsp; ";
-// if (annotatedClasses>0)
-// t << "<a href=\"annotated.html\">Compound list</a> &nbsp; ";
-// if (documentedFiles>0)
-// t << "<a href=\"files.html\">File list</a> &nbsp; ";
-// if (includeFiles.count()>0)
-// t << "<a href=\"headers.html\">Header files</a> &nbsp; ";
-// if (documentedMembers>0)
-// t << "<a href=\"functions.html\">Compound Members</a> &nbsp; ";
-// if (documentedFunctions>0)
-// t << "<a href=\"globals.html\">File Members</a> &nbsp; ";
-// if (pageList.count()>0)
-// t << "<a href=\"pages.html\">Related Pages</a> &nbsp; ";
-// if (exampleList.count()>0)
-// t << "<a href=\"examples.html\">Examples</a> &nbsp; ";
-// if (searchEngineFlag)
-// t << "<a doxygen=\"_cgi:\" href=\"\">Search</a>";
-// t << endl << "</center><hr>" << endl;
-// }
}
void HtmlGenerator::startQuickIndexItem(const char *s,const char *l)
@@ -189,7 +102,13 @@ void HtmlGenerator::writeFooter(int part,bool external)
if (footer.length()==0)
t << "<hr><address><small>";
else
- t << footer;
+ t << substitute(
+ substitute(
+ substitute(footer,"$title",lastTitle),
+ "$datetime",dateToString(TRUE)
+ ),
+ "$date",dateToString(FALSE)
+ );
break;
case 1:
if (footer.length()==0)
@@ -219,24 +138,6 @@ void HtmlGenerator::writeFooter(int part,bool external)
void HtmlGenerator::endFile()
{
-// if (footer.length()==0)
-// {
-// t << "<hr><address><small>Generated at " << dateToString(TRUE);
-// if (projectName.length()>0)
-// {
-// t << " for ";
-// docify(projectName);
-// }
-// t << " by <a href=\"http://www.stack.nl/~dimitri/doxygen/index.html\">"
-// "<img src=\"doxygen.gif\" alt=\"doxygen\" align=center border=0 "
-// "width=118 height=53></a>&nbsp; written by <a href="
-// "\"mailto:dimitri@stack.nl\">Dimitri van Heesch</a>, &copy; "
-// "1997-1999</small></address>\n</body>\n</html>\n";
-// }
-// else
-// {
-// t << footer;
-// }
endPlainFile();
}
@@ -250,45 +151,6 @@ void HtmlGenerator::endProjectNumber()
t << "</h3>";
}
-//void HtmlGenerator::writeIndex()
-//{
-// startFile("index.html","Main Index");
-// t << "<h1 align=center>";
-// docify(projectName);
-// t << " Documentation</h1>"
-// << "<p>" << endl << "<p>" << endl;
-// if (!projectNumber.isEmpty())
-// {
-// t << "<h3 align=center>";
-// docify(projectNumber);
-// t << "</h3>\n<p>\n<p>\n";
-// }
-// if (noIndexFlag)
-// {
-// t << "<ul>" << endl;
-// if (hierarchyClasses>0)
-// t << "<li><a href=\"hierarchy.html\">Class hierarchy</a>" << endl;
-// if (annotatedClasses>0)
-// t << "<li><a href=\"annotated.html\">Compound list</a>" << endl;
-// if (documentedFiles>0)
-// t << "<li><a href=\"files.html\">File list</a>" << endl;
-// if (includeFiles.count()>0)
-// t << "<li><a href=\"headers.html\">Header files</a>" << endl;
-// if (documentedMembers>0)
-// t << "<li><a href=\"functions.html\">Compound Members</a>" << endl;
-// if (documentedFunctions>0)
-// t << "<li><a href=\"globals.html\">File Members</a>" << endl;
-// if (pageList.count()>0)
-// t << "<li><a href=\"pageList.html\">Related Pages</a>" << endl;
-// if (exampleList.count()>0)
-// t << "<li><a href=\"examples.html\">Examples</a>" << endl;
-// if (searchEngineFlag)
-// t << "<li><a doxygen=\"_cgi:\" href=\"\">Search</a>" << endl;
-// t << "</ul>" << endl;
-// }
-// endFile();
-//}
-
void HtmlGenerator::writeStyleInfo(int part)
{
if (part==0)
@@ -414,9 +276,9 @@ void HtmlGenerator::writeSectionRef(const char *name,const char *lab,
{
QString refName=name;
if (refName.right(5)!=".html") refName+=".html";
- t << "&quot;<a href=\"" << refName << "#" << lab << "\">";
+ t << "<a href=\"" << refName << "#" << lab << "\">";
docify(title);
- t << "</a>&quot;";
+ t << "</a>";
}
void HtmlGenerator::writeSectionRefItem(const char *name,const char *lab,
@@ -429,12 +291,12 @@ void HtmlGenerator::writeSectionRefItem(const char *name,const char *lab,
t << "</a>";
}
-//void HtmlGenerator::docify(const char *str)
-//{
-// docifyStatic(t,str);
-//}
+void HtmlGenerator::writeSectionRefAnchor(const char *name,const char *lab,
+ const char *title)
+{
+ writeSectionRef(name,lab,title);
+}
-//void HtmlGenerator::docifyStatic(QTextStream &t,const char *str)
void HtmlGenerator::docify(const char *str)
{
if (str)
@@ -510,3 +372,121 @@ void HtmlGenerator::writeFormula(const char *n,const char *text)
t << "<img align=\"top\" src=\"" << n << "\">" << endl;
if (text && text[0]=='\\') t << "</center></p>" << endl;
}
+
+void HtmlGenerator::startMemberList()
+{
+ if (htmlAlignMemberFlag)
+ {
+ //t << endl << "<p><table border=0 cellspacing=2 cellpadding=0>" << endl;
+ }
+ else
+ {
+ t << "<ul>" << endl;
+ }
+}
+
+void HtmlGenerator::endMemberList()
+{
+ if (htmlAlignMemberFlag)
+ {
+ //t << "</table>" << endl;
+ }
+ else
+ {
+ t << "</ul>" << endl;
+ }
+}
+
+void HtmlGenerator::startMemberItem()
+{
+ if (htmlAlignMemberFlag)
+ {
+ t << "<tr><td align=right valign=top>";
+ }
+ else
+ {
+ t << "<li>";
+ }
+}
+
+void HtmlGenerator::insertMemberAlign()
+{
+ if (htmlAlignMemberFlag)
+ {
+ t << "</td><td valign=top>";
+ }
+}
+
+void HtmlGenerator::endMemberItem()
+{
+ if (htmlAlignMemberFlag)
+ {
+ t << "</td></tr>";
+ }
+ t << endl;
+}
+
+void HtmlGenerator::startMemberDescription()
+{
+ if (htmlAlignMemberFlag)
+ {
+ t << "<tr><td></td><td><font size=-1><em>";
+ }
+ else
+ {
+ t << "<dl class=\"el\"><dd><font size=-1><em>";
+ }
+}
+
+void HtmlGenerator::endMemberDescription()
+{
+ if (htmlAlignMemberFlag)
+ {
+ t << "</em></font><br><br></td></tr>" << endl;
+ }
+ else
+ {
+ t << "</em></font></dl>";
+ }
+}
+
+void HtmlGenerator::startMemberSections()
+{
+ if (htmlAlignMemberFlag)
+ {
+ t << "<table border=0 cellpadding=0 cellspacing=1>" << endl;
+ }
+}
+
+void HtmlGenerator::endMemberSections()
+{
+ if (htmlAlignMemberFlag)
+ {
+ t << "</table>" << endl;
+ }
+}
+
+void HtmlGenerator::startMemberHeader()
+{
+ if (htmlAlignMemberFlag)
+ {
+ t << "<tr><td colspan=2><br><h2>";
+ }
+ else
+ {
+ startGroupHeader();
+ }
+}
+
+void HtmlGenerator::endMemberHeader()
+{
+ if (htmlAlignMemberFlag)
+ {
+ t << "</h2></td></tr>" << endl;
+ }
+ else
+ {
+ endGroupHeader();
+ }
+}
+
diff --git a/src/htmlgen.h b/src/htmlgen.h
index c8a5223..556a334 100644
--- a/src/htmlgen.h
+++ b/src/htmlgen.h
@@ -81,18 +81,23 @@ class HtmlGenerator : public OutputGenerator
void endGroupHeader();
void writeListItem() { t << "<li>"; }
- void startMemberHeader() { startGroupHeader(); }
- void endMemberHeader() { endGroupHeader(); }
- void startMemberList() { t << "<ul>" << endl; }
- void endMemberList() { t << "</ul>" << endl; }
- void startMemberItem() { t << "<li>"; }
- void endMemberItem() { t << endl; }
+ void startMemberSections();
+ void endMemberSections();
+ void startMemberHeader();
+ void endMemberHeader();
+ void startMemberList();
+ void endMemberList();
+ void startMemberItem();
+ void insertMemberAlign();
+ void endMemberItem();
+ void startMemberDescription();
+ void endMemberDescription();
void writeRuler() { t << "<hr>"; }
void writeAnchor(const char *name)
{ t << "<a name=\"" << name <<"\"></a>"; }
void startCodeFragment() { t << "<div class=\"fragment\"><pre>"; }
- void endCodeFragment() { t << "</div></pre>"; }
+ void endCodeFragment() { t << "</pre></div>"; }
void writeBoldString(const char *text)
{ t << "<b>"; docify(text); t << "</b>"; }
void startEmphasis() { t << "<em>"; }
@@ -111,6 +116,7 @@ class HtmlGenerator : public OutputGenerator
void writeDoxyAnchor(const char *clName,const char *anchor,
const char *name);
void writeLatexSpacing() {}
+ void writeLatexLabel(const char *,const char *) {}
void writeStartAnnoItem(const char *type,const char *file,
const char *path,const char *name);
void writeEndAnnoItem(const char *) { t << endl; }
@@ -139,8 +145,6 @@ class HtmlGenerator : public OutputGenerator
void writeGrave(char c) { t << "&" << c << "grave;"; }
void writeCirc(char c) { t << "&" << c << "circ;"; }
void writeTilde(char c) { t << "&" << c << "tilde;"; }
- void startMemberDescription() { t << "<dl class=\"el\"><dd><font size=-1><em>"; }
- void endMemberDescription() { t << "</em></font></dl>"; }
void startDescList() { t << "<dl compact><dt>" << endl; }
void endDescTitle() {}
void writeDescItem() { t << "<dd>" << endl; }
@@ -148,6 +152,7 @@ class HtmlGenerator : public OutputGenerator
void writeSection(const char *,const char *,bool);
void writeSectionRef(const char *,const char *,const char *);
void writeSectionRefItem(const char *,const char *,const char *);
+ void writeSectionRefAnchor(const char *,const char *,const char *);
void addToIndex(const char *,const char *) {}
void startIndent() { t << "<div class=\"in\">" << endl; }
void endIndent() { t << "</div>" << endl; }
@@ -166,6 +171,7 @@ class HtmlGenerator : public OutputGenerator
private:
QString header;
QString footer;
+ QString lastTitle;
HtmlGenerator &operator=(const HtmlGenerator &g);
HtmlGenerator(const HtmlGenerator &g);
diff --git a/src/index.cpp b/src/index.cpp
index d472542..dcd457f 100644
--- a/src/index.cpp
+++ b/src/index.cpp
@@ -147,7 +147,7 @@ void writeClassTree(OutputList &ol,BaseClassList *bcl,bool hideSuper)
//printf("Passed...\n");
if (cd->hasDocumentation() || cd->isReference())
{
- ol.writeIndexItem(cd->getReference(),cd->classFile(),cd->name());
+ ol.writeIndexItem(cd->getReference(),cd->getOutputFileBase(),cd->name());
if (cd->isReference())
{
ol.startTypewriter();
@@ -191,7 +191,7 @@ void writeClassHierarchy(OutputList &ol)
}
if (cd->hasDocumentation() || cd->isReference())
{
- ol.writeIndexItem(cd->getReference(),cd->classFile(),cd->name());
+ ol.writeIndexItem(cd->getReference(),cd->getOutputFileBase(),cd->name());
if (cd->isReference())
{
ol.startTypewriter();
@@ -236,9 +236,9 @@ void writeHierarchicalIndex(OutputList &ol)
ol.disable(OutputGenerator::Man);
startFile(ol,"hierarchy","Hierarchical Index");
startTitle(ol);
- parseDoc(ol,0,0,projectName+" "+theTranslator->trClassHierarchy());
+ parseText(ol,projectName+" "+theTranslator->trClassHierarchy());
endTitle(ol,0);
- parseDoc(ol,0,0,theTranslator->trClassHierarchyDescription());
+ parseText(ol,theTranslator->trClassHierarchyDescription());
ol.newParagraph();
writeClassHierarchy(ol);
endFile(ol);
@@ -247,7 +247,7 @@ void writeHierarchicalIndex(OutputList &ol)
//----------------------------------------------------------------------------
-int countFileList()
+int countFiles()
{
int count=0;
FileNameListIterator fnli(inputNameList);
@@ -272,10 +272,10 @@ void writeFileIndex(OutputList &ol)
ol.disable(OutputGenerator::Man);
startFile(ol,"files","File Index");
startTitle(ol);
- parseDoc(ol,0,0,projectName+" "+theTranslator->trFileList());
+ parseText(ol,projectName+" "+theTranslator->trFileList());
endTitle(ol,0);
ol.newParagraph();
- parseDoc(ol,0,0,theTranslator->trFileListDescription(extractAllFlag));
+ parseText(ol,theTranslator->trFileListDescription(extractAllFlag));
ol.newParagraph();
ol.startIndexList();
@@ -299,7 +299,7 @@ void writeFileIndex(OutputList &ol)
}
ol.writeStartAnnoItem("file",
- fd->diskName(),
+ fd->getOutputFileBase(),
path,
fd->name()
);
@@ -314,7 +314,7 @@ void writeFileIndex(OutputList &ol)
else
{
ol.startEmphasis();
- parseDoc(ol,0,0,theTranslator->trNoDescriptionAvailable());
+ parseText(ol,theTranslator->trNoDescriptionAvailable());
ol.endEmphasis();
}
ol.docify(")");
@@ -330,15 +330,14 @@ void writeFileIndex(OutputList &ol)
}
//----------------------------------------------------------------------------
-
-int countNamespaceList()
+int countNamespaces()
{
int count=0;
NamespaceListIterator nli(namespaceList);
NamespaceDef *nd;
for (;(nd=nli.current());++nli)
{
- if (nd->hasDocumentation()) count++;
+ if (!nd->getReference() && nd->hasDocumentation()) count++;
}
return count;
}
@@ -351,19 +350,19 @@ void writeNamespaceIndex(OutputList &ol)
ol.disable(OutputGenerator::Man);
startFile(ol,"namespaces","Namespace Index");
startTitle(ol);
- parseDoc(ol,0,0,projectName+" "+theTranslator->trNamespaceList());
+ parseText(ol,projectName+" "+theTranslator->trNamespaceList());
endTitle(ol,0);
ol.newParagraph();
- parseDoc(ol,0,0,theTranslator->trNamespaceListDescription(extractAllFlag));
+ parseText(ol,theTranslator->trNamespaceListDescription(extractAllFlag));
ol.newParagraph();
ol.startIndexList();
NamespaceDef *nd=namespaceList.first();
while (nd)
{
- if (nd->hasDocumentation())
+ if (!nd->getReference() && nd->hasDocumentation())
{
- ol.writeStartAnnoItem("namespace",nd->namespaceFile(),0,nd->name());
+ ol.writeStartAnnoItem("namespace",nd->getOutputFileBase(),0,nd->name());
ol.docify(" (");
if (nd->briefDescription())
{
@@ -375,7 +374,7 @@ void writeNamespaceIndex(OutputList &ol)
else
{
ol.startEmphasis();
- parseDoc(ol,0,0,theTranslator->trNoDescriptionAvailable());
+ parseText(ol,theTranslator->trNoDescriptionAvailable());
ol.endEmphasis();
}
ol.docify(")");
@@ -433,7 +432,7 @@ void writeAnnotatedClassList(OutputList &ol)
case ClassDef::Union: type="union"; break;
default: type="unknown"; break; // an error
}
- ol.writeStartAnnoItem(type,cd->classFile(),0,cd->name());
+ ol.writeStartAnnoItem(type,cd->getOutputFileBase(),0,cd->name());
ol.docify(" (");
if (cd->briefDescription())
{
@@ -445,7 +444,7 @@ void writeAnnotatedClassList(OutputList &ol)
else
{
ol.startEmphasis();
- parseDoc(ol,0,0,theTranslator->trNoDescriptionAvailable());
+ parseText(ol,theTranslator->trNoDescriptionAvailable());
ol.endEmphasis();
}
ol.docify(")");
@@ -466,9 +465,9 @@ void writeAnnotatedIndex(OutputList &ol)
ol.disable(OutputGenerator::Man);
startFile(ol,"annotated","Annotated Index");
startTitle(ol);
- parseDoc(ol,0,0,projectName+" "+theTranslator->trCompoundList());
+ parseText(ol,projectName+" "+theTranslator->trCompoundList());
endTitle(ol,0);
- parseDoc(ol,0,0,theTranslator->trCompoundListDescription());
+ parseText(ol,theTranslator->trCompoundListDescription());
writeAnnotatedClassList(ol);
endFile(ol);
ol.enable(OutputGenerator::Man);
@@ -522,7 +521,7 @@ void writeMemberList(OutputList &ol)
ol.docify(": ");
else
ol.docify(", ");
- ol.writeObjectLink(cd->getReference(),cd->classFile(),md->anchor(),
+ ol.writeObjectLink(cd->getReference(),cd->getOutputFileBase(),md->anchor(),
cd->name());
count++;
prevName=cd->name();
@@ -537,7 +536,7 @@ void writeMemberList(OutputList &ol)
//----------------------------------------------------------------------------
-int countMemberList()
+int countClassMembers()
{
int count=0;
MemberName *mn=memberNameList.first();
@@ -575,9 +574,9 @@ void writeMemberIndex(OutputList &ol)
ol.disable(OutputGenerator::Latex);
startFile(ol,"functions","Compound Member Index");
startTitle(ol);
- parseDoc(ol,0,0,projectName+" "+theTranslator->trCompoundMembers());
+ parseText(ol,projectName+" "+theTranslator->trCompoundMembers());
endTitle(ol,0);
- parseDoc(ol,0,0,theTranslator->trCompoundMembersDescription(extractAllFlag));
+ parseText(ol,theTranslator->trCompoundMembersDescription(extractAllFlag));
writeMemberList(ol);
endFile(ol);
ol.enable(OutputGenerator::Latex);
@@ -586,7 +585,7 @@ void writeMemberIndex(OutputList &ol)
//----------------------------------------------------------------------------
-void writeFunctionList(OutputList &ol)
+void writeFileMemberList(OutputList &ol)
{
ol.startItemList();
MemberName *mn=functionNameList.first();
@@ -639,7 +638,7 @@ void writeFunctionList(OutputList &ol)
//if ((s=baseName.findRev("/"))!=-1)
// baseName=baseName.right(baseName.length()-s-1);
ol.writeObjectLink(fd->getReference(),
- fd->diskName(),md->anchor(), baseName);
+ fd->getOutputFileBase(),md->anchor(), baseName);
count++;
prevName=fd->name();
}
@@ -653,7 +652,89 @@ void writeFunctionList(OutputList &ol)
//----------------------------------------------------------------------------
-int countFunctionList()
+void writeNamespaceMemberList(OutputList &ol)
+{
+ ol.startItemList();
+ MemberName *mn=functionNameList.first();
+ while (mn)
+ {
+ MemberDef *md=mn->first();
+ bool found=FALSE;
+ while (md && !found)
+ {
+ NamespaceDef *nd=md->getNamespace();
+ if (nd && nd->hasDocumentation() &&
+ !md->isReference() &&
+ md->hasDocumentation() &&
+ !md->name().isEmpty() &&
+ md->name()[0]!='@') found=TRUE;
+ else
+ md=mn->next();
+ }
+ if (found) // member is documented and in a documented namespace
+ {
+ ol.writeListItem();
+ ol.docify(md->name());
+ if (md->isFunction()) ol.docify("()");
+ ol.writeString("\n");
+
+ int count=0;
+ md=mn->first();
+ QString prevName;
+ while (md)
+ {
+ NamespaceDef *nd=md->getNamespace();
+ if (nd && nd->hasDocumentation() &&
+ !md->isReference() &&
+ md->hasDocumentation() &&
+ !md->name().isEmpty() && md->name()[0]!='@'
+ )
+ {
+ if (count==0)
+ ol.docify(": ");
+ else
+ ol.docify(", ");
+ ol.writeObjectLink(nd->getReference(),nd->getOutputFileBase(),
+ md->anchor(),nd->name());
+ count++;
+ }
+ md=mn->next();
+ }
+ }
+ mn=functionNameList.next();
+ }
+ ol.endItemList();
+}
+
+//----------------------------------------------------------------------------
+
+int countNamespaceMembers()
+{
+ int count=0;
+ MemberName *mn=functionNameList.first();
+ while (mn)
+ {
+ MemberDef *md=mn->first();
+ bool found=FALSE;
+ while (md && !found)
+ {
+ if (md->getNamespace() &&
+ !md->isReference() && md->hasDocumentation() &&
+ !md->name().isEmpty() && md->name()[0]!='@'
+ )
+ found=TRUE;
+ else
+ md=mn->next();
+ }
+ if (found) count++;
+ mn=functionNameList.next();
+ }
+ return count;
+}
+
+//----------------------------------------------------------------------------
+
+int countFileMembers()
{
int count=0;
MemberName *mn=functionNameList.first();
@@ -665,7 +746,7 @@ int countFunctionList()
while (md && !found)
{
if (!md->isReference() && md->hasDocumentation() &&
- md->name()[0]!='@' &&
+ !md->name().isEmpty() && md->name()[0]!='@' &&
(((fd=md->getFileDef()) && fd->hasDocumentation())
||
((fd=md->getFileDec()) && fd->hasDocumentation())
@@ -683,17 +764,35 @@ int countFunctionList()
//----------------------------------------------------------------------------
-void writeFunctionIndex(OutputList &ol)
+void writeFileMemberIndex(OutputList &ol)
{
if (documentedFunctions==0) return;
ol.disable(OutputGenerator::Man);
ol.disable(OutputGenerator::Latex);
startFile(ol,"globals","File Member Index");
startTitle(ol);
- parseDoc(ol,0,0,projectName+" "+theTranslator->trFileMembers());
+ parseText(ol,projectName+" "+theTranslator->trFileMembers());
endTitle(ol,0);
- parseDoc(ol,0,0,theTranslator->trFileMembersDescription(extractAllFlag));
- writeFunctionList(ol);
+ parseText(ol,theTranslator->trFileMembersDescription(extractAllFlag));
+ writeFileMemberList(ol);
+ endFile(ol);
+ ol.enable(OutputGenerator::Latex);
+ ol.enable(OutputGenerator::Man);
+}
+
+//----------------------------------------------------------------------------
+
+void writeNamespaceMemberIndex(OutputList &ol)
+{
+ if (documentedNamespaceMembers==0) return;
+ ol.disable(OutputGenerator::Man);
+ ol.disable(OutputGenerator::Latex);
+ startFile(ol,"namespacemembers","Namespace Member Index");
+ startTitle(ol);
+ parseText(ol,projectName+" "+theTranslator->trNamespaceMembers());
+ endTitle(ol,0);
+ parseText(ol,theTranslator->trNamespaceMemberDescription(extractAllFlag));
+ writeNamespaceMemberList(ol);
endFile(ol);
ol.enable(OutputGenerator::Latex);
ol.enable(OutputGenerator::Man);
@@ -736,9 +835,9 @@ void writeHeaderIndex(OutputList &ol)
ol.disable(OutputGenerator::Latex);
startFile(ol,"headers","Header File Index");
startTitle(ol);
- parseDoc(ol,0,0,projectName+" "+theTranslator->trHeaderFiles());
+ parseText(ol,projectName+" "+theTranslator->trHeaderFiles());
endTitle(ol,0);
- parseDoc(ol,0,0,theTranslator->trHeaderFilesDescription());
+ parseText(ol,theTranslator->trHeaderFilesDescription());
writeHeaderFileList(ol);
endFile(ol);
ol.enable(OutputGenerator::Latex);
@@ -753,9 +852,9 @@ void writeExampleIndex(OutputList &ol)
ol.disable(OutputGenerator::Man);
startFile(ol,"examples","Example Index");
startTitle(ol);
- parseDoc(ol,0,0,projectName+" "+theTranslator->trExamples());
+ parseText(ol,projectName+" "+theTranslator->trExamples());
endTitle(ol,0);
- parseDoc(ol,0,0,theTranslator->trExamplesDescription());
+ parseText(ol,theTranslator->trExamplesDescription());
ol.startIndexList();
PageInfo *pi=exampleList.first();
while (pi)
@@ -788,18 +887,25 @@ void writePageIndex(OutputList &ol)
startTitle(ol);
ol.docify(projectName+" "+theTranslator->trRelatedPages());
endTitle(ol,0);
- parseDoc(ol,0,0,theTranslator->trRelatedPagesDescription());
+ parseText(ol,theTranslator->trRelatedPagesDescription());
ol.startIndexList();
PageInfo *pi=pageList.first();
while (pi)
{
- QString pageName;
+ QString pageName,pageTitle;
+
if (caseSensitiveNames)
pageName=pi->name.copy();
else
pageName=pi->name.lower();
+
+ if (pi->title.isEmpty())
+ pageTitle=pi->name;
+ else
+ pageTitle=pi->title;
+
ol.writeListItem();
- ol.writeObjectLink(0,pageName,0,pi->name);
+ ol.writeObjectLink(0,pageName,0,pageTitle);
ol.writeString("\n");
pi=pageList.next();
}
@@ -810,7 +916,7 @@ void writePageIndex(OutputList &ol)
//----------------------------------------------------------------------------
-int countGroupList()
+int countGroups()
{
int count=0;
GroupListIterator gli(groupList);
@@ -835,7 +941,7 @@ void writeGroupList(OutputList &ol)
if (gd->countMembers()>0)
{
ol.startDescItem();
- ol.startTextLink(gd->groupFile(),0);
+ ol.startTextLink(gd->getOutputFileBase(),0);
parseDoc(ol,0,0,gd->groupTitle());
ol.endTextLink();
ol.endDescItem();
@@ -854,9 +960,9 @@ void writeGroupIndex(OutputList &ol)
ol.disable(OutputGenerator::Man);
startFile(ol,"modules","Module Index");
startTitle(ol);
- parseDoc(ol,0,0,projectName+" "+theTranslator->trModules());
+ parseText(ol,projectName+" "+theTranslator->trModules());
endTitle(ol,0);
- parseDoc(ol,0,0,theTranslator->trModulesDescription());
+ parseText(ol,theTranslator->trModulesDescription());
writeGroupList(ol);
endFile(ol);
ol.enable(OutputGenerator::Man);
@@ -880,7 +986,7 @@ void writeIndex(OutputList &ol)
ol.startFile("index","Main Index",FALSE);
if (!noIndexFlag) writeQuickLinks(ol,TRUE);
ol.startTitleHead();
- parseDoc(ol,0,0,projPrefix+theTranslator->trDocumentation());
+ parseText(ol,projPrefix+theTranslator->trDocumentation());
ol.endTitleHead(0);
ol.newParagraph();
if (!projectNumber.isEmpty())
@@ -897,7 +1003,7 @@ void writeIndex(OutputList &ol)
ol.enable(OutputGenerator::Latex);
ol.startFile("refman",0,FALSE);
ol.startIndexSection(isTitlePageStart);
- parseDoc(ol,0,0,projPrefix+theTranslator->trReferenceManual());
+ parseText(ol,projPrefix+theTranslator->trReferenceManual());
if (!projectNumber.isEmpty())
{
ol.startProjectNumber();
@@ -906,60 +1012,72 @@ void writeIndex(OutputList &ol)
}
ol.endIndexSection(isTitlePageStart);
ol.startIndexSection(isTitlePageAuthor);
- parseDoc(ol,0,0,theTranslator->trGeneratedBy());
+ parseText(ol,theTranslator->trGeneratedBy());
ol.endIndexSection(isTitlePageAuthor);
if (documentedGroups>0)
{
ol.startIndexSection(isModuleIndex);
- parseDoc(ol,0,0,projPrefix+theTranslator->trModuleIndex());
+ parseText(ol,projPrefix+theTranslator->trModuleIndex());
ol.endIndexSection(isModuleIndex);
}
+ if (documentedNamespaces>0)
+ {
+ ol.startIndexSection(isNamespaceIndex);
+ parseText(ol,projPrefix+theTranslator->trNamespaceIndex());
+ ol.endIndexSection(isNamespaceIndex);
+ }
if (hierarchyClasses>0)
{
ol.startIndexSection(isClassHierarchyIndex);
- parseDoc(ol,0,0,projPrefix+theTranslator->trHierarchicalIndex());
+ parseText(ol,projPrefix+theTranslator->trHierarchicalIndex());
ol.endIndexSection(isClassHierarchyIndex);
}
if (annotatedClasses>0)
{
ol.startIndexSection(isCompoundIndex);
- parseDoc(ol,0,0,projPrefix+theTranslator->trCompoundIndex());
+ parseText(ol,projPrefix+theTranslator->trCompoundIndex());
ol.endIndexSection(isCompoundIndex);
}
if (documentedFiles>0)
{
ol.startIndexSection(isFileIndex);
- parseDoc(ol,0,0,projPrefix+theTranslator->trFileIndex());
+ parseText(ol,projPrefix+theTranslator->trFileIndex());
ol.endIndexSection(isFileIndex);
}
if (documentedGroups>0)
{
ol.startIndexSection(isModuleDocumentation);
- parseDoc(ol,0,0,projPrefix+theTranslator->trModuleDocumentation());
+ parseText(ol,projPrefix+theTranslator->trModuleDocumentation());
ol.endIndexSection(isModuleDocumentation);
}
+ if (documentedNamespaces>0)
+ {
+ ol.startIndexSection(isNamespaceDocumentation);
+ parseText(ol,projPrefix+theTranslator->trNamespaceDocumentation());
+ ol.endIndexSection(isNamespaceDocumentation);
+ }
if (annotatedClasses>0)
{
ol.startIndexSection(isClassDocumentation);
- parseDoc(ol,0,0,projPrefix+theTranslator->trClassDocumentation());
+ parseText(ol,projPrefix+theTranslator->trClassDocumentation());
ol.endIndexSection(isClassDocumentation);
}
if (documentedFiles>0)
{
ol.startIndexSection(isFileDocumentation);
- parseDoc(ol,0,0,projPrefix+theTranslator->trFileDocumentation());
+ parseText(ol,projPrefix+theTranslator->trFileDocumentation());
ol.endIndexSection(isFileDocumentation);
}
if (exampleList.count()>0)
{
ol.startIndexSection(isExampleDocumentation);
- parseDoc(ol,0,0,projPrefix+theTranslator->trExampleDocumentation());
+ parseText(ol,projPrefix+theTranslator->trExampleDocumentation());
ol.endIndexSection(isExampleDocumentation);
}
if (pageList.count()>0)
{
ol.startIndexSection(isPageDocumentation);
- parseDoc(ol,0,0,projPrefix+theTranslator->trPageDocumentation());
+ parseText(ol,projPrefix+theTranslator->trPageDocumentation());
ol.endIndexSection(isPageDocumentation);
}
ol.endIndexSection(isEndIndex);
diff --git a/src/index.h b/src/index.h
index 5b3cc67..0091f6a 100644
--- a/src/index.h
+++ b/src/index.h
@@ -25,10 +25,12 @@ enum IndexSections
isTitlePageStart,
isTitlePageAuthor,
isModuleIndex,
+ isNamespaceIndex,
isClassHierarchyIndex,
isCompoundIndex,
isFileIndex,
isModuleDocumentation,
+ isNamespaceDocumentation,
isClassDocumentation,
isFileDocumentation,
isExampleDocumentation,
@@ -50,16 +52,18 @@ void writeHeaderIndex(OutputList &ol);
void writeHeaderFileList(OutputList &ol);
void writeExampleIndex(OutputList &ol);
void writePageIndex(OutputList &ol);
-void writeFunctionIndex(OutputList &ol);
+void writeFileMemberIndex(OutputList &ol);
void writeGroupIndex(OutputList &ol);
void writeNamespaceIndex(OutputList &ol);
+void writeNamespaceMemberIndex(OutputList &ol);
int countClassHierarchy();
-int countMemberList();
-int countFunctionList();
-int countFileList();
-int countGroupList();
-int countNamespaceList();
+int countClassMembers();
+int countFileMembers();
+int countFiles();
+int countGroups();
+int countNamespaces();
int countAnnotatedClasses();
+int countNamespaceMembers();
#endif
diff --git a/src/latexgen.cpp b/src/latexgen.cpp
index 50ec496..2f2f62b 100644
--- a/src/latexgen.cpp
+++ b/src/latexgen.cpp
@@ -172,6 +172,10 @@ void LatexGenerator::startIndexSection(IndexSections is)
if (compactLatexFlag) t << "\\section"; else t << "\\chapter";
t << "{"; //Module Index}\n"
break;
+ case isNamespaceIndex:
+ if (compactLatexFlag) t << "\\section"; else t << "\\chapter";
+ t << "{"; //Namespace Index}\"
+ break;
case isClassHierarchyIndex:
if (compactLatexFlag) t << "\\section"; else t << "\\chapter";
t << "{"; //Hierarchical Index}\n"
@@ -200,17 +204,28 @@ void LatexGenerator::startIndexSection(IndexSections is)
}
}
break;
+ case isNamespaceDocumentation:
+ {
+ NamespaceDef *nd=namespaceList.first();
+ bool found=FALSE;
+ while (nd && !found)
+ {
+ if (nd->hasDocumentation())
+ {
+ if (compactLatexFlag) t << "\\section"; else t << "\\chapter";
+ t << "{"; // Namespace Documentation}\n":
+ found=TRUE;
+ }
+ nd=namespaceList.next();
+ }
+ }
+ break;
case isClassDocumentation:
{
ClassDef *cd=classList.first();
bool found=FALSE;
while (cd && !found)
{
- //if (cd->classFile()[0]!='@' && !cd->getReference() &&
- // (cd->hasDocumentation() || !hideClassFlag) &&
- // (cd->protection()!=Private || extractPrivateFlag)
- // )
-
if (!cd->isReference() && cd->isVisible())
{
if (compactLatexFlag) t << "\\section"; else t << "\\chapter";
@@ -282,6 +297,9 @@ void LatexGenerator::endIndexSection(IndexSections is)
case isModuleIndex:
t << "}\n\\input{modules}\n";
break;
+ case isNamespaceIndex:
+ t << "}\n\\input{namespaces}\n";
+ break;
case isClassHierarchyIndex:
t << "}\n\\input{hierarchy}\n";
break;
@@ -299,7 +317,7 @@ void LatexGenerator::endIndexSection(IndexSections is)
{
if (gd->hasDocumentation() || gd->countMembers()>0)
{
- t << "}\n\\input{" << gd->groupFile() << "}\n";
+ t << "}\n\\input{" << gd->getOutputFileBase() << "}\n";
found=TRUE;
}
gd=groupList.next();
@@ -309,12 +327,36 @@ void LatexGenerator::endIndexSection(IndexSections is)
if (gd->hasDocumentation() || gd->countMembers()>0)
{
if (compactLatexFlag) t << "\\input"; else t << "\\include";
- t << "{" << gd->groupFile() << "}\n";
+ t << "{" << gd->getOutputFileBase() << "}\n";
}
gd=groupList.next();
}
}
break;
+ case isNamespaceDocumentation:
+ {
+ NamespaceDef *nd=namespaceList.first();
+ bool found=FALSE;
+ while (nd && !found)
+ {
+ if (nd->hasDocumentation() || nd->countMembers()>0)
+ {
+ t << "}\n\\input{" << nd->getOutputFileBase() << "}\n";
+ found=TRUE;
+ }
+ nd=namespaceList.next();
+ }
+ while (nd)
+ {
+ if (nd->hasDocumentation() || nd->countMembers()>0)
+ {
+ if (compactLatexFlag) t << "\\input"; else t << "\\include";
+ t << "{" << nd->getOutputFileBase() << "}\n";
+ }
+ nd=namespaceList.next();
+ }
+ }
+ break;
case isClassDocumentation:
{
ClassDef *cd=classList.first();
@@ -327,7 +369,7 @@ void LatexGenerator::endIndexSection(IndexSections is)
// )
if (!cd->isReference() && cd->isVisible())
{
- t << "}\n\\input{" << cd->classFile() << "}\n";
+ t << "}\n\\input{" << cd->getOutputFileBase() << "}\n";
found=TRUE;
}
cd=classList.next();
@@ -341,7 +383,7 @@ void LatexGenerator::endIndexSection(IndexSections is)
if (!cd->isReference() && cd->isVisible())
{
if (compactLatexFlag) t << "\\input"; else t << "\\include";
- t << "{" << cd->classFile() << "}\n";
+ t << "{" << cd->getOutputFileBase() << "}\n";
}
cd=classList.next();
}
@@ -360,13 +402,13 @@ void LatexGenerator::endIndexSection(IndexSections is)
{
if (isFirst)
{
- t << "}\n\\input{" << fd->diskName() << "}\n";
+ t << "}\n\\input{" << fd->getOutputFileBase() << "}\n";
isFirst=FALSE;
}
else
{
if (compactLatexFlag) t << "\\input" ; else t << "\\include";
- t << "{" << fd->diskName() << "}\n";
+ t << "{" << fd->getOutputFileBase() << "}\n";
}
}
fd=fn->next();
@@ -670,6 +712,11 @@ void LatexGenerator::writeDoxyAnchor(const char *clname,const char *anchor,const
t << "}" << endl;
}
+void LatexGenerator::writeLatexLabel(const char *clName,const char *anchor)
+{
+ writeDoxyAnchor(clName,anchor,0);
+}
+
void LatexGenerator::addToIndex(const char *s1,const char *s2)
{
if (s1)
@@ -709,6 +756,15 @@ void LatexGenerator::writeSectionRefItem(const char *,const char *lab,
t << "}{\\ref{" << lab << "}}" << endl;
}
+void LatexGenerator::writeSectionRefAnchor(const char *,const char *lab,
+ const char *title)
+{
+ startBold();
+ docify(title);
+ endBold();
+ t << " (p. \\pageref{" << lab << "})" << endl;
+}
+
//void LatexGenerator::docify(const char *str)
//{
// docifyStatic(t,str);
diff --git a/src/latexgen.h b/src/latexgen.h
index 5a3dd1c..5cabe66 100644
--- a/src/latexgen.h
+++ b/src/latexgen.h
@@ -79,17 +79,20 @@ class LatexGenerator : public OutputGenerator
void endGroupHeader();
void writeListItem() { t << "\\item " << endl; }
+ void startMemberSections() {}
+ void endMemberSections() {}
void startMemberHeader() { startGroupHeader(); }
void endMemberHeader() { endGroupHeader(); }
void startMemberList() { t << "\\begin{CompactItemize}" << endl; }
void endMemberList() { t << "\\end{CompactItemize}" << endl; }
void startMemberItem() { t << "\\item " << endl; }
void endMemberItem() { t << endl; }
+ void insertMemberAlign() {}
void writeRuler() { t << "\\vspace{0.4cm}\\hrule\\vspace{0.2cm}"; }
- void writeAnchor(const char *) {}
+ void writeAnchor(const char *name) { t << "\\label{" << name << "}" << endl; }
void startCodeFragment() { t << "\\small\\begin{verbatim}"; }
- void endCodeFragment() { t << "\\end{verbatim}\\normalsize "; }
+ void endCodeFragment() { t << "\\end{verbatim}\\normalsize " << endl; }
void writeBoldString(const char *text)
{ t << "{\\bf "; docify(text); t << "}"; }
void startEmphasis() { t << "{\\em "; }
@@ -99,13 +102,14 @@ class LatexGenerator : public OutputGenerator
void startDescription() { t << "\\begin{description}" << endl; }
void endDescription() { t << "\\end{description}" << endl; }
void startDescItem() { t << "\\item["; }
- void endDescItem() { t << "]"; }
+ void endDescItem() { t << "]" << endl; }
void lineBreak() { t << "\\par\n"; }
void startMemberDoc(const char *,const char *,const char *);
void endMemberDoc() { t << "}"; }
void writeDoxyAnchor(const char *,const char *,const char *);
void writeChar(char c);
void writeLatexSpacing() { t << "\\hspace{0.3cm}"; }
+ void writeLatexLabel(const char *scope,const char *anchor);
void writeStartAnnoItem(const char *type,const char *file,
const char *path,const char *name);
void writeEndAnnoItem(const char *name);
@@ -148,11 +152,12 @@ class LatexGenerator : public OutputGenerator
void endMemberDescription() { t << "\\item\\end{CompactList}"; }
void startDescList() { t << "\\begin{Desc}\\item["; }
void endDescTitle() { t << "]"; }
- void writeDescItem() { t << "\\par "; }
+ void writeDescItem() { t << "\\par" << endl; }
void endDescList() { t << "\\end{Desc}"; }
void writeSection(const char *,const char *,bool);
void writeSectionRef(const char *,const char *,const char *);
void writeSectionRefItem(const char *,const char *,const char *);
+ void writeSectionRefAnchor(const char *,const char *,const char *);
void addToIndex(const char *,const char *);
void startIndent() {}
void endIndent() {}
diff --git a/src/mangen.cpp b/src/mangen.cpp
index 55bf8c7..d1bc4c6 100644
--- a/src/mangen.cpp
+++ b/src/mangen.cpp
@@ -78,7 +78,7 @@ void ManGenerator::startFile(const char *name,const char *,bool)
{
fileName=fileName.left(i);
}
- if (fileName.right(2)!=".3") fileName+=".3";
+ if (fileName.right(2)!=manExtension) fileName+=manExtension;
startPlainFile(fileName);
firstCol=TRUE;
}
diff --git a/src/mangen.h b/src/mangen.h
index d091782..bcc9034 100644
--- a/src/mangen.h
+++ b/src/mangen.h
@@ -77,8 +77,11 @@ class ManGenerator : public OutputGenerator
void endTypewriter() { t << "\\fR"; firstCol=FALSE; }
void startGroupHeader();
void endGroupHeader();
+ void startMemberSections() {}
+ void endMemberSections() {}
void startMemberHeader();
void endMemberHeader();
+ void insertMemberAlign() {}
void writeListItem();
void startMemberList() { t << "\n.in +1c"; firstCol=FALSE; }
void endMemberList() { t << "\n.in -1c"; firstCol=FALSE; }
@@ -107,6 +110,7 @@ class ManGenerator : public OutputGenerator
void endMemberDoc() {}
void writeDoxyAnchor(const char *clName,const char *anchor,const char *name);
void writeLatexSpacing() {}
+ void writeLatexLabel(const char *,const char *) {}
void writeStartAnnoItem(const char *type,const char *file,
const char *path,const char *name);
void writeEndAnnoItem(const char *) { t << endl; firstCol=TRUE; }
@@ -144,6 +148,7 @@ class ManGenerator : public OutputGenerator
void writeSection(const char *,const char *,bool) {}
void writeSectionRef(const char *,const char *,const char *) {}
void writeSectionRefItem(const char *,const char *,const char *) {}
+ void writeSectionRefAnchor(const char *,const char *,const char *) {}
void addToIndex(const char *,const char *) {}
void startIndent() {}
void endIndent() {}
diff --git a/src/memberdef.cpp b/src/memberdef.cpp
index f96a2d6..bd440c3 100644
--- a/src/memberdef.cpp
+++ b/src/memberdef.cpp
@@ -20,6 +20,7 @@
#include "membername.h"
#include "doxygen.h"
#include "util.h"
+#include "message.h"
/*! Creates a new member definition.
* Members can be function/variables/enums/etc. inside a class or inside a
@@ -159,7 +160,7 @@ bool MemberDef::hasExamples()
return exampleList->count()>0;
}
-
+#if 0
void MemberDef::writeExample(OutputList &ol)
{
Example *e=exampleList->first();
@@ -177,4 +178,27 @@ void MemberDef::writeExample(OutputList &ol)
}
ol.writeString(".");
}
+#endif
+QString MemberDef::getOutputFileBase() const
+{
+ if (classDef)
+ {
+ return classDef->getOutputFileBase();
+ }
+ else if (fileDef)
+ {
+ return fileDef->getOutputFileBase();
+ }
+ else if (fileDec)
+ {
+ return fileDec->getOutputFileBase();
+ }
+ else if (nspace)
+ {
+ return nspace->getOutputFileBase();
+ }
+ warn("Warning: Internal inconsistency: member %s does not belong to any\n"
+ " container!\n",name().data());
+ return "dummy";
+}
diff --git a/src/memberdef.h b/src/memberdef.h
index fba76f8..67a9aa9 100644
--- a/src/memberdef.h
+++ b/src/memberdef.h
@@ -55,6 +55,7 @@ class MemberDef : public Definition
const ArgumentList *al);
~MemberDef();
+ QString getOutputFileBase() const;
const char *declaration() const { return decl; }
const char *definition() const { return def; }
const char *typeString() const { return type; }
@@ -72,6 +73,7 @@ class MemberDef : public Definition
void setFileDef(FileDef *fd) { fileDef=fd; }
void setFileDec(FileDef *fd) { fileDec=fd; }
void setAnchor(const char *a) { ref=a; }
+ void setProtection(Protection p) { prot=p; }
FileDef *getFileDef() { return fileDef; }
FileDef *getFileDec() { return fileDec; }
void setMemberClass(ClassDef *cd) { classDef=cd; }
@@ -105,8 +107,9 @@ class MemberDef : public Definition
// example related members
bool addExample(const char *anchor,const char *name,const char *file);
- void writeExample(OutputList &ol);
+ //void writeExample(OutputList &ol);
bool hasExamples();
+ ExampleList *getExampleList() const { return exampleList; }
// prototype related members
const char *getDefFile() { return defFile; }
diff --git a/src/memberlist.cpp b/src/memberlist.cpp
index 4d7cc73..e9fa8b0 100644
--- a/src/memberlist.cpp
+++ b/src/memberlist.cpp
@@ -43,7 +43,10 @@ void MemberList::countDecMembers()
if ((!hideMemberFlag || md->hasDocumentation()) &&
(!hideMemberFlag || !md->documentation().isEmpty() ||
briefMemDescFlag || repeatBriefFlag
- ) || extractAllFlag
+ ) || extractAllFlag ||
+ (md->isEnumerate() &&
+ md->hasDocumentedEnumValues()
+ )
)
{
switch(md->memberType())
diff --git a/src/namespacedef.cpp b/src/namespacedef.cpp
index 9d055b2..bde86c6 100644
--- a/src/namespacedef.cpp
+++ b/src/namespacedef.cpp
@@ -22,12 +22,14 @@
#include "classdef.h"
#include "classlist.h"
#include "memberlist.h"
+#include "doxygen.h"
-NamespaceDef::NamespaceDef(const char *name) : Definition(name)
+NamespaceDef::NamespaceDef(const char *name,const char *ref) : Definition(name)
{
fileName="namespace_"+nameToFile(name);
classList = new ClassList;
memList = new MemberList;
+ reference=ref;
}
NamespaceDef::~NamespaceDef()
@@ -61,18 +63,21 @@ void NamespaceDef::writeDocumentation(OutputList &ol)
QString pageTitle=name()+" Namespace Reference";
startFile(ol,fileName,pageTitle);
startTitle(ol);
- ol.docify(pageTitle);
+ //ol.docify(pageTitle);
+ parseText(ol,theTranslator->trNamespaceReference(name()));
endTitle(ol,name());
+ if (genTagFile.length()>0) tagFile << "%" << name() << ":\n";
+
OutputList briefOutput(&ol);
if (briefDescription())
{
- parseDoc(briefOutput,0,0,briefDescription());
+ parseDoc(briefOutput,name(),0,briefDescription());
ol+=briefOutput;
ol.writeString(" \n");
ol.disableAllBut(OutputGenerator::Html);
- ol.startTextLink(0,"details");
- parseDoc(ol,0,0,theTranslator->trMore());
+ ol.startTextLink(0,"_details");
+ parseText(ol,theTranslator->trMore());
ol.endTextLink();
ol.enableAll();
}
@@ -81,6 +86,7 @@ void NamespaceDef::writeDocumentation(OutputList &ol)
ol.enable(OutputGenerator::Man);
ol.writeSynopsis();
+ ol.startMemberSections();
if (classList->count()>0)
{
ClassDef *cd=classList->first();
@@ -92,7 +98,7 @@ void NamespaceDef::writeDocumentation(OutputList &ol)
if (!found)
{
ol.startMemberHeader();
- parseDoc(ol,0,0,theTranslator->trCompounds());
+ parseText(ol,theTranslator->trCompounds());
ol.endMemberHeader();
ol.startMemberList();
found=TRUE;
@@ -111,13 +117,14 @@ void NamespaceDef::writeDocumentation(OutputList &ol)
case ClassDef::Union: ol.writeString("union"); break;
}
ol.writeString(" ");
+ ol.insertMemberAlign();
if (cd->hasDocumentation())
{
ol.writeObjectLink(cd->getReference(),
- cd->classFile(),
- 0,
- clName
- );
+ cd->getOutputFileBase(),
+ 0,
+ clName
+ );
}
else
{
@@ -133,13 +140,17 @@ void NamespaceDef::writeDocumentation(OutputList &ol)
}
writeMemberDecs(ol,0,this,0,0,0,memList);
+ ol.endMemberSections();
if (!briefDescription().isEmpty() || !documentation().isEmpty())
{
ol.writeRuler();
- ol.writeAnchor("details");
+ bool latexOn = ol.isEnabled(OutputGenerator::Latex);
+ if (latexOn) ol.disable(OutputGenerator::Latex);
+ ol.writeAnchor("_details");
+ if (latexOn) ol.enable(OutputGenerator::Latex);
ol.startGroupHeader();
- parseDoc(ol,0,0,theTranslator->trDetailedDescription());
+ parseText(ol,theTranslator->trDetailedDescription());
ol.endGroupHeader();
if (!briefDescription().isEmpty())
{
@@ -148,7 +159,7 @@ void NamespaceDef::writeDocumentation(OutputList &ol)
}
if (!documentation().isEmpty())
{
- parseDoc(ol,0,0,documentation()+"\n");
+ parseDoc(ol,name(),0,documentation()+"\n");
ol.newParagraph();
}
}
@@ -159,7 +170,7 @@ void NamespaceDef::writeDocumentation(OutputList &ol)
{
ol.writeRuler();
ol.startGroupHeader();
- parseDoc(ol,0,0,theTranslator->trFunctionPrototypeDocumentation());
+ parseText(ol,theTranslator->trFunctionPrototypeDocumentation());
ol.endGroupHeader();
writeMemberDocs(ol,memList,name(),MemberDef::Prototype);
}
@@ -168,7 +179,7 @@ void NamespaceDef::writeDocumentation(OutputList &ol)
{
ol.writeRuler();
ol.startGroupHeader();
- parseDoc(ol,0,0,theTranslator->trTypedefDocumentation());
+ parseText(ol,theTranslator->trTypedefDocumentation());
ol.endGroupHeader();
writeMemberDocs(ol,memList,name(),MemberDef::Typedef);
}
@@ -177,7 +188,7 @@ void NamespaceDef::writeDocumentation(OutputList &ol)
{
ol.writeRuler();
ol.startGroupHeader();
- parseDoc(ol,0,0,theTranslator->trEnumerationTypeDocumentation());
+ parseText(ol,theTranslator->trEnumerationTypeDocumentation());
ol.endGroupHeader();
writeMemberDocs(ol,memList,name(),MemberDef::Enumeration);
}
@@ -186,7 +197,7 @@ void NamespaceDef::writeDocumentation(OutputList &ol)
{
ol.writeRuler();
ol.startGroupHeader();
- parseDoc(ol,0,0,theTranslator->trEnumerationValueDocumentation());
+ parseText(ol,theTranslator->trEnumerationValueDocumentation());
ol.endGroupHeader();
writeMemberDocs(ol,memList,name(),MemberDef::EnumValue);
}
@@ -195,7 +206,7 @@ void NamespaceDef::writeDocumentation(OutputList &ol)
{
ol.writeRuler();
ol.startGroupHeader();
- parseDoc(ol,0,0,theTranslator->trFunctionDocumentation());
+ parseText(ol,theTranslator->trFunctionDocumentation());
ol.endGroupHeader();
writeMemberDocs(ol,memList,name(),MemberDef::Function);
}
@@ -204,7 +215,7 @@ void NamespaceDef::writeDocumentation(OutputList &ol)
{
ol.writeRuler();
ol.startGroupHeader();
- parseDoc(ol,0,0,theTranslator->trVariableDocumentation());
+ parseText(ol,theTranslator->trVariableDocumentation());
ol.endGroupHeader();
writeMemberDocs(ol,memList,name(),MemberDef::Variable);
}
@@ -212,9 +223,15 @@ void NamespaceDef::writeDocumentation(OutputList &ol)
// write Author section (Man only)
ol.disableAllBut(OutputGenerator::Man);
ol.startGroupHeader();
- parseDoc(ol,0,0,theTranslator->trAuthor());
+ parseText(ol,theTranslator->trAuthor());
ol.endGroupHeader();
- parseDoc(ol,0,0,theTranslator->trGeneratedAutomatically(projectName));
+ parseText(ol,theTranslator->trGeneratedAutomatically(projectName));
ol.enableAll();
endFile(ol);
}
+
+int NamespaceDef::countMembers()
+{
+ memList->countDocMembers();
+ return memList->totalCount()+classList->count();
+}
diff --git a/src/namespacedef.h b/src/namespacedef.h
index 9da6b2c..f888f43 100644
--- a/src/namespacedef.h
+++ b/src/namespacedef.h
@@ -31,16 +31,20 @@ class MemberDef;
class NamespaceDef : public Definition
{
public:
- NamespaceDef(const char *name);
+ NamespaceDef(const char *name,const char *ref=0);
~NamespaceDef();
- QString namespaceFile() const { return fileName; }
+ //QString namespaceFile() const { return fileName; }
+ QString getOutputFileBase() const { return fileName; }
void insertUsedFile(const char *fname);
void writeDocumentation(OutputList &ol);
void insertClass(ClassDef *cd);
void insertMember(MemberDef *md);
void computeAnchors();
+ int countMembers();
+ const char *getReference() { return reference; }
private:
+ QString reference;
QString fileName;
QStrList files;
ClassList *classList;
diff --git a/src/outputgen.h b/src/outputgen.h
index 457dd80..5b9f981 100644
--- a/src/outputgen.h
+++ b/src/outputgen.h
@@ -84,12 +84,15 @@ class OutputGenerator
virtual void endGroupHeader() = 0;
virtual void writeListItem() = 0;
+ virtual void startMemberSections() = 0;
+ virtual void endMemberSections() = 0;
virtual void startMemberHeader() = 0;
virtual void endMemberHeader() = 0;
virtual void startMemberList() = 0;
virtual void endMemberList() = 0;
virtual void startMemberItem() = 0;
virtual void endMemberItem() = 0;
+ virtual void insertMemberAlign() = 0;
virtual void writeRuler() = 0;
virtual void writeAnchor(const char *name) = 0;
@@ -103,6 +106,7 @@ class OutputGenerator
virtual void endMemberDoc() = 0;
virtual void writeDoxyAnchor(const char *clName,const char *anchor,const char *name) = 0;
virtual void writeLatexSpacing() = 0;
+ virtual void writeLatexLabel(const char *clName,const char *anchor) = 0;
virtual void writeStartAnnoItem(const char *type,const char *file,
const char *path,const char *name) = 0;
virtual void writeEndAnnoItem(const char *name) = 0;
@@ -144,6 +148,7 @@ class OutputGenerator
virtual void writeSection(const char *,const char *,bool) = 0;
virtual void writeSectionRef(const char *,const char *,const char *) = 0;
virtual void writeSectionRefItem(const char *,const char *,const char *) = 0;
+ virtual void writeSectionRefAnchor(const char *,const char *,const char *) = 0;
virtual void lineBreak() = 0;
virtual void addToIndex(const char *s1,const char *s2) = 0;
virtual void startIndent() = 0;
diff --git a/src/outputlist.h b/src/outputlist.h
index 2c57dad..6f73271 100644
--- a/src/outputlist.h
+++ b/src/outputlist.h
@@ -129,6 +129,10 @@ class OutputList
{ forall(&OutputGenerator::endGroupHeader); }
void writeListItem()
{ forall(&OutputGenerator::writeListItem); }
+ void startMemberSections()
+ { forall(&OutputGenerator::startMemberSections); }
+ void endMemberSections()
+ { forall(&OutputGenerator::endMemberSections); }
void startMemberHeader()
{ forall(&OutputGenerator::startMemberHeader); }
void endMemberHeader()
@@ -141,6 +145,8 @@ class OutputList
{ forall(&OutputGenerator::startMemberItem); }
void endMemberItem()
{ forall(&OutputGenerator::endMemberItem); }
+ void insertMemberAlign()
+ { forall(&OutputGenerator::insertMemberAlign); }
void writeRuler()
{ forall(&OutputGenerator::writeRuler); }
void writeAnchor(const char *name)
@@ -165,6 +171,8 @@ class OutputList
{ forall(&OutputGenerator::writeDoxyAnchor,clName,anchor,name); }
void writeLatexSpacing()
{ forall(&OutputGenerator::writeLatexSpacing); }
+ void writeLatexLabel(const char *scope,const char *anchor)
+ { forall(&OutputGenerator::writeLatexLabel,scope,anchor); }
void startDescription()
{ forall(&OutputGenerator::startDescription); }
void endDescription()
@@ -251,6 +259,8 @@ class OutputList
{ forall(&OutputGenerator::writeSectionRef,page,lab,title); }
void writeSectionRefItem(const char *page,const char *lab, const char *title)
{ forall(&OutputGenerator::writeSectionRefItem,page,lab,title); }
+ void writeSectionRefAnchor(const char *page,const char *lab, const char *title)
+ { forall(&OutputGenerator::writeSectionRefAnchor,page,lab,title); }
void addToIndex(const char *s1,const char *s2)
{ forall(&OutputGenerator::addToIndex,s1,s2); }
void writeSynopsis()
diff --git a/src/pre.l b/src/pre.l
index 92f7553..bc74cf1 100644
--- a/src/pre.l
+++ b/src/pre.l
@@ -1160,11 +1160,11 @@ BN [ \t\r\n]
<SkipCommand>.
<SkipLine>[^/\n]+
<SkipLine>.
-<SkipLine>"//" {
+<SkipLine,SkipCommand,SkipCPPBlock>"//" {
lastCPPContext=YY_START;
BEGIN(RemoveCPPComment);
}
-<SkipLine>"/*" {
+<SkipLine,SkipCommand,SkipCPPBlock>"/*" {
lastCContext=YY_START;
BEGIN(RemoveCComment);
}
diff --git a/src/scanner.h b/src/scanner.h
index 59d5966..acebd5f 100644
--- a/src/scanner.h
+++ b/src/scanner.h
@@ -31,4 +31,5 @@ extern void parseDoc(OutputList &ol,const char *clName, const char *memName,
const QString &docString);
extern void parseExample(OutputList &ol,const QString &docString,
const char *fileName);
+extern void parseText(OutputList &ol,const QString &txtString);
#endif
diff --git a/src/scanner.l b/src/scanner.l
index 0beadae..9737ff1 100644
--- a/src/scanner.l
+++ b/src/scanner.l
@@ -76,6 +76,7 @@ static int lastCodeState;
static int lastAfterDocContext;
static int lastGroupContext;
static int lastFormulaContext;
+static int lastAnchorContext;
static int nextDefContext;
static Protection protection;
static Protection baseProt;
@@ -120,7 +121,8 @@ static char afterDocTerminator;
static int tmpDocType;
static QString sectionLabel;
static QString sectionTitle;
-static bool isSubsection;
+static SectionInfo::SectionType
+ sectionType;
static QString funcPtrType;
static QString templateStr;
static QString baseName;
@@ -184,7 +186,6 @@ static void initParser()
inParBlock = FALSE;
firstSeeArg = FALSE;
javaDocSee = FALSE;
- isSubsection = FALSE;
}
//-----------------------------------------------------------------------------
@@ -532,12 +533,19 @@ static void addSection()
{
//printf("New section pageName=%s label=%s title=%s\n",
// current->name.data(),sectionLabel.data(),sectionTitle.data());
- SectionInfo *si=new SectionInfo(current->name,
- sectionLabel,sectionTitle,isSubsection);
- sectionDict.insert(sectionLabel,si);
+ if (sectionLabel.isEmpty()) return;
+ if (sectionDict[sectionLabel]==0)
+ {
+ SectionInfo *si=new SectionInfo(sectionLabel,sectionTitle,sectionType);
+ sectionDict.insert(sectionLabel,si);
+ current->anchors->append(new QString(sectionLabel));
+ }
+ else
+ {
+ warn("Warning: Duplicate label %s found!\n",sectionLabel.data());
+ }
}
-
// Adds a formula text to the list/dictionary of formulas if it was
// not already added. Returns the label of the formula.
static QString addFormula()
@@ -710,6 +718,7 @@ VAR [vV][aA][rR]
%x MemberSpec
%x MemberSpecSkip
%x SkipVerbatim
+%x Text
%x DocScan
%x DocParam
%x DocException
@@ -742,6 +751,8 @@ VAR [vV][aA][rR]
%x DocVerbInc
%x DocIndexWord
%x DocRef
+%x DocRefArg
+%x DocRefArgStart
%x DocRefItem
%x DocRefItemName
%x SectionLabel
@@ -756,6 +767,7 @@ VAR [vV][aA][rR]
%x DocSkipHtmlComment
%x ReadFormulaShort
%x ReadFormulaLong
+%x AnchorLabel
%%
@@ -798,13 +810,13 @@ VAR [vV][aA][rR]
<DocScan>"<!--" { BEGIN(DocSkipHtmlComment); }
<DocSkipHtmlComment>"--"[!]?">" { BEGIN(DocScan); }
<DocSkipHtmlComment>.
-<DocScan>"&copy;" { outDoc->writeCopyright(); }
-<DocScan>"&quot;" { outDoc->writeQuote(); }
-<DocScan>"&"[AEIOUYaeiouy]"uml;" { outDoc->writeUmlaut(yytext[1]); }
-<DocScan>"&"[AEIOUYaeiouy]"acute;" { outDoc->writeAcute(yytext[1]); }
-<DocScan>"&"[AEIOUaeiou]"grave;" { outDoc->writeGrave(yytext[1]); }
-<DocScan>"&"[AEIOUaeiou]"circ;" { outDoc->writeCirc(yytext[1]); }
-<DocScan>"&"[ANOano]"tilde;" { outDoc->writeTilde(yytext[1]); }
+<DocScan,Text>"&copy;" { outDoc->writeCopyright(); }
+<DocScan,Text>"&quot;" { outDoc->writeQuote(); }
+<DocScan,Text>"&"[AEIOUYaeiouy]"uml;" { outDoc->writeUmlaut(yytext[1]); }
+<DocScan,Text>"&"[AEIOUYaeiouy]"acute;" { outDoc->writeAcute(yytext[1]); }
+<DocScan,Text>"&"[AEIOUaeiou]"grave;" { outDoc->writeGrave(yytext[1]); }
+<DocScan,Text>"&"[AEIOUaeiou]"circ;" { outDoc->writeCirc(yytext[1]); }
+<DocScan,Text>"&"[ANOano]"tilde;" { outDoc->writeTilde(yytext[1]); }
<DocScan,DocHtmlScan,DocLatexScan>"$("[a-z_A-Z]+")" {
QString envvar=&yytext[2];
envvar=envvar.left(envvar.length()-1);
@@ -914,7 +926,7 @@ VAR [vV][aA][rR]
outDoc->writeFormula(formName,formula->getFormulaText());
}
}
-<DocIndexWord>[^\n\t ]+ {
+<DocIndexWord>[^\n]+ {
//printf("Adding %s to index\n",yytext);
outDoc->addToIndex(yytext,0);
BEGIN(DocScan);
@@ -1124,7 +1136,7 @@ VAR [vV][aA][rR]
outDoc->docify(" - ");
BEGIN(DocScan);
}
-<DocScan>("\\"|"@")"section "{ID}"\n" {
+<DocScan>"\\section "{ID}"\n" {
QString secName=&yytext[9]; // skip "\section "
secName=secName.left(secName.length()-1); // remove \n
//printf("SectionName %s found\n",secName.data());
@@ -1132,7 +1144,17 @@ VAR [vV][aA][rR]
if ((sec=sectionDict[secName]))
{
//printf("Title %s\n",sec->title.data());
- outDoc->writeSection(sec->label,sec->title,sec->isSubsection);
+ outDoc->writeSection(sec->label,sec->title,
+ sec->type==SectionInfo::Subsection);
+ }
+ }
+<DocScan>"\\anchor "{ID}"\n" {
+ QString secName=&yytext[8];
+ secName=secName.left(secName.length()-1);
+ SectionInfo *sec;
+ if ((sec=sectionDict[secName]))
+ {
+ outDoc->writeAnchor(sec->label);
}
}
<DocScan>"\\ref" {
@@ -1146,7 +1168,19 @@ VAR [vV][aA][rR]
SectionInfo *sec;
if ((sec=sectionDict[ref]))
{
- outDoc->writeSectionRef(sec->pageName,sec->label,sec->title);
+ QString text;
+ if (sec->title.isEmpty())
+ text=sec->label;
+ else
+ text=sec->title;
+ if (sec->type==SectionInfo::Anchor)
+ {
+ outDoc->writeSectionRefAnchor(sec->fileName,sec->label,text);
+ }
+ else
+ {
+ outDoc->writeSectionRef(sec->fileName,sec->label,text);
+ }
}
else
{
@@ -1155,6 +1189,35 @@ VAR [vV][aA][rR]
}
BEGIN(DocScan);
}
+<DocRefName>{ID}/{B}+"\"" {
+ sectionRef=yytext;
+ BEGIN(DocRefArgStart);
+ }
+<DocRefArgStart>"\"" {
+ BEGIN(DocRefArg);
+ }
+<DocRefArg>[^\"\n]+[\n\"] {
+ yytext[yyleng-1]='\0';
+ QString text=substitute(yytext,"\\\\","\\");
+ SectionInfo *sec;
+ if ((sec=sectionDict[sectionRef]))
+ {
+ if (sec->type==SectionInfo::Anchor)
+ {
+ outDoc->writeSectionRefAnchor(sec->fileName,sec->label,text);
+ }
+ else
+ {
+ outDoc->writeSectionRef(sec->fileName,sec->label,text);
+ }
+ }
+ else
+ {
+ warn("Warning: reference to unknown section %s!\n",sectionRef.data());
+ outDoc->writeBoldString("unknown reference!");
+ }
+ BEGIN(DocScan);
+ }
<DocRefItem>{ID} {
sectionRef=yytext;
BEGIN(DocRefItemName);
@@ -1163,7 +1226,7 @@ VAR [vV][aA][rR]
SectionInfo *sec;
if ((sec=sectionDict[sectionRef]))
{
- outDoc->writeSectionRefItem(sec->pageName,sec->label,yytext);
+ outDoc->writeSectionRefItem(sec->fileName,sec->label,yytext);
}
else
{
@@ -1271,6 +1334,10 @@ VAR [vV][aA][rR]
<DocKeyEnd>("\\"|"@")"until"{BN}+ { BEGIN(DocUntilKey); }
<DocKeyEnd>("\\"|"@")"skipline"{BN}+ { BEGIN(DocSkiplineKey); }
<DocKeyEnd>\n
+<DocKeyEnd><<EOF>> {
+ if (!firstLine) outDoc->endCodeFragment();
+ yyterminate();
+ }
<DocKeyEnd>. {
unput(*yytext);
if (!firstLine) outDoc->endCodeFragment();
@@ -1462,7 +1529,7 @@ VAR [vV][aA][rR]
<DocScan>{BN}+ {
outDoc->writeChar(' ');
}
-<DocCode,DocEmphasis,DocBold,DocScan>. {
+<DocCode,DocEmphasis,DocBold,DocScan,Text>. {
outDoc->writeChar(*yytext);
}
<NextSemi>"{" { BEGIN(SkipBlock); }
@@ -1472,6 +1539,9 @@ VAR [vV][aA][rR]
else
BEGIN( NextSemi ) ;
}
+<NextSemi>"'"\\[0-7]{1,3}"'"
+<NextSemi>"'"\\."'"
+<NextSemi>"'"."'"
<NextSemi>\" {
lastStringContext=NextSemi;
BEGIN(SkipString);
@@ -1556,6 +1626,9 @@ VAR [vV][aA][rR]
/*
<FindMembers>"inline"
*/
+<FindMembers>{BN}+ {
+ lineCount();
+ }
<FindMembers>{B}*"static"{BN}+ { //current->type += " static ";
current->stat = TRUE;
lineCount();
@@ -2081,8 +2154,8 @@ VAR [vV][aA][rR]
}
<MemberSpecSkip>"," { BEGIN(MemberSpec); }
<MemberSpecSkip>";" { unput(';'); BEGIN(MemberSpec); }
-<Curly>\n { current->program += yytext ;
- yyLineNr++ ;
+<Curly>{BN}+ { current->program += yytext ;
+ lineCount() ;
}
<Curly>. { current->program += yytext ; }
@@ -2404,7 +2477,9 @@ VAR [vV][aA][rR]
//BEGIN( FindMembers ) ;
BEGIN( lastCurlyContext ) ;
}
-<SkipCurly>\'.\'
+<SkipCurly>"'"\\[0-7]{1,3}"'"
+<SkipCurly>"'"\\."'"
+<SkipCurly>"'"."'"
<SkipCurly>\" {
lastStringContext=SkipCurly;
BEGIN( SkipString );
@@ -2538,15 +2613,16 @@ VAR [vV][aA][rR]
);
BEGIN( Curly ) ;
}
-<Comment>\n { current->program += yytext ;
- yyLineNr++ ;
+<Comment>{BN}+ { current->program += yytext ;
+ lineCount() ;
}
<Comment>"/*" { current->program += yytext ; }
<Comment>"//" { current->program += yytext ; }
-<Comment>. { current->program += *yytext ; }
+<Comment>[^\n\*]+ { current->program += yytext ; }
<Comment>.*"*/" { current->program += yytext ;
BEGIN( Curly ) ;
}
+<Comment>. { current->program += *yytext ; }
<FindMembers,FindFields,MemberSpec,FuncQual,SkipCurly,Operator>("//"{B}*)?"/*!" {
removeSlashes=(yytext[1]=='/');
@@ -2596,7 +2672,7 @@ VAR [vV][aA][rR]
current->inside = current_root->name+"::";
BEGIN( LineDoc );
}
-<FindMembers>"extern"{BN}+"\"C"("++")?"\""{BN}+("{")?
+<FindMembers>"extern"{BN}+"\"C"("++")?"\""{BN}*("{")?
<FindMembers>"{" {
current->type.resize(0);
current->name.resize(0);
@@ -2846,13 +2922,18 @@ VAR [vV][aA][rR]
current->doc+=yytext;
}
<PageDoc>("\\"|"@")"section"{B}+ {
- isSubsection=FALSE;
+ sectionType=SectionInfo::Section;
BEGIN(SectionLabel);
}
<PageDoc>("\\"|"@")"subsection"{B}+ {
- isSubsection=TRUE;
+ sectionType=SectionInfo::Subsection;
BEGIN(SectionLabel);
}
+<Doc,PageDoc,JavaDoc,ClassDoc>("\\"|"@")anchor{B}+ {
+ lastAnchorContext = YY_START;
+ sectionType=SectionInfo::Anchor;
+ BEGIN(AnchorLabel);
+ }
<Doc,PageDoc,JavaDoc,ClassDoc>"\\\\verbatim"/[^a-z_A-Z0-9] {
current->doc+="\\\\verbatim";
}
@@ -2861,6 +2942,9 @@ VAR [vV][aA][rR]
current->doc+="\\verbatim";
BEGIN(SkipVerbatim);
}
+<Doc,PageDoc,JavaDoc,ClassDoc>"\\addindex"{B}+[^\n]+ {
+ current->doc+=yytext;
+ }
<Doc,PageDoc,JavaDoc,ClassDoc>"\\\\code"/[^a-z_A-Z0-9] {
current->doc+="\\\\code";
}
@@ -2928,7 +3012,13 @@ VAR [vV][aA][rR]
<SkipCode>. {
current->doc+=*yytext;
}
-<SectionLabel>[a-z_A-Z0-9]+ {
+<AnchorLabel>{ID} {
+ sectionLabel=yytext;
+ addSection();
+ current->doc += "\\anchor "+sectionLabel+"\n";
+ BEGIN(lastAnchorContext);
+ }
+<SectionLabel>{ID} {
sectionLabel=yytext;
sectionTitle.resize(0);
BEGIN(SectionTitle);
@@ -3220,15 +3310,18 @@ void scanString(const char *s)
{
const char *oldInputString = inputString;
int oldInputPosition = inputPosition;
+ int oldRule = YY_START;
YY_BUFFER_STATE oldBuffer = YY_CURRENT_BUFFER;
yy_switch_to_buffer(yy_create_buffer(scanYYin, YY_BUF_SIZE));
inputString = s;
inputPosition = 0;
+ BEGIN( Text );
scanYYlex();
yy_delete_buffer(YY_CURRENT_BUFFER);
yy_switch_to_buffer(oldBuffer);
inputString = oldInputString;
inputPosition = oldInputPosition;
+ BEGIN( oldRule );
}
//----------------------------------------------------------------------------
@@ -3308,6 +3401,7 @@ void parseMain(Entry *rt)
global_root = rt;
current = new Entry;
inputString = rt->program;
+ //printf("parseDoc=`%s'\n",inputString);
inputPosition = 0;
ifCount=0;
scanYYrestart( scanYYin );
@@ -3367,6 +3461,21 @@ void parseDoc(OutputList &ol,const char *clName,
//----------------------------------------------------------------------------
+void parseText(OutputList &ol,const QString &txtString)
+{
+ inputString = txtString;
+ outDoc = new OutputList(&ol);
+ inputPosition = 0;
+ scanYYrestart( scanYYin );
+ BEGIN( Text );
+ scanYYlex();
+ ol+=*outDoc;
+ delete outDoc;
+ return;
+}
+
+//----------------------------------------------------------------------------
+
void parseExample(OutputList &ol,const QString &docString,
const char *fileName)
{
diff --git a/src/section.h b/src/section.h
new file mode 100644
index 0000000..fc287ae
--- /dev/null
+++ b/src/section.h
@@ -0,0 +1,49 @@
+/******************************************************************************
+ *
+ * $Id$
+ *
+ *
+ * Copyright (C) 1997-1999 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * All output generated with Doxygen is not covered by this license.
+ *
+ */
+
+#ifndef SECTION_H
+#define SECTION_H
+
+#include <qlist.h>
+#include <qdict.h>
+#include <qstring.h>
+
+class Definition;
+
+struct SectionInfo
+{
+ enum SectionType { Section, Subsection, Anchor };
+ SectionInfo(const char *l,const char *t,SectionType st)
+ { label=l; title=t; type=st; definition=0; }
+ QString fileName;
+ QString label;
+ QString title;
+ SectionType type;
+ Definition *definition;
+};
+
+class SectionList : public QList<SectionInfo>
+{
+};
+
+class SectionDict : public QDict<SectionInfo>
+{
+ public:
+ SectionDict(int size) : QDict<SectionInfo>(size) {}
+};
+
+#endif
diff --git a/src/tag.l b/src/tag.l
index edc5cf1..9a6aa02 100644
--- a/src/tag.l
+++ b/src/tag.l
@@ -25,6 +25,7 @@
#include "classdef.h"
#include "filedef.h"
+#include "namespacedef.h"
#include "memberdef.h"
#include "doxygen.h"
#include "util.h"
@@ -36,12 +37,14 @@
static int yyLineNr;
static QString className;
static QString fileName;
+static QString namespaceName;
static QString tagName;
static QString memberName;
static QString anchorName;
static QString argString;
static ClassDef *cd;
static FileDef *fd;
+static NamespaceDef *nd;
static void addClass(const char *name,const char *fileName)
{
@@ -50,6 +53,7 @@ static void addClass(const char *name,const char *fileName)
{
cd = new ClassDef(name,ClassDef::Class,tagName,fileName);
fd = 0;
+ nd = 0;
classList.inSort(cd);
classDict.insert(className,cd);
}
@@ -72,10 +76,27 @@ static void addFile(const char *name)
inputNameDict.insert(name,mn);
}
cd = 0;
+ nd = 0;
//fileList.inSort(fd);
//fileDict.insert(fileName,fd);
}
+static void addNamespace(const char *name)
+{
+ if ((nd=namespaceDict[name])==0)
+ {
+ // TODO: we assume that each namespace is limited to a single tagfile.
+ // since namespace are open, this need not to be the case. As a result
+ // namespace may contain members that are located in
+ // different namespaces!
+ nd = new NamespaceDef(name,tagName);
+ namespaceList.inSort(nd);
+ namespaceDict.insert(name,nd);
+ }
+ cd = 0;
+ fd = 0;
+}
+
static void addMember(const char *name,const char *anchor,const char *args)
{
//printf("adding member %s\n",name);
@@ -87,21 +108,24 @@ static void addMember(const char *name,const char *anchor,const char *args)
md=new MemberDef(0,name,args,0,Public,Normal,FALSE,FALSE,
MemberDef::Function,0,0);
md->setReference(anchor);
- if (cd)
+ if (cd) // member of a class
{
- //md=new MemberDef(cd,name,args,anchor,tagName);
md->setMemberClass(cd);
cd->insertMember(md);
- //printf("Adding member %s %s to class\n",name,args);
mnd=&memberNameDict;
mnl=&memberNameList;
}
- else
+ else if (nd) // member of a namespace
+ {
+ md->setNamespace(nd);
+ nd->insertMember(md);
+ mnd=&functionNameDict;
+ mnl=&functionNameList;
+ }
+ else // member of a file
{
- //md=new MemberDef(&unrelatedClass,name,args,anchor,tagName);
md->setFileDef(fd);
fd->insertMember(md);
- //printf("Adding global member %s %s\n",name,args);
mnd=&functionNameDict;
mnl=&functionNameList;
}
@@ -130,6 +154,7 @@ static void addMember(const char *name,const char *anchor,const char *args)
ID [a-z_A-Z][a-z_A-Z0-9]*
FILE [a-z_A-Z0-9\.\-\+\:\\\/]+
+SCOPE ({ID}"::")*{ID}
%x Pass1
%x Pass2
@@ -139,18 +164,22 @@ FILE [a-z_A-Z0-9\.\-\+\:\\\/]+
%x ClassName1
%x ClassName2
%x FileName
+%x NamespaceName
%x BaseClasses
%x ClassFile1
%x ClassFile2
%%
-<Pass1>^">" {
+<Pass1>^">" { // start of a class
BEGIN(ClassName1);
}
-<Pass1>^"&" {
+<Pass1>^"&" { // start of a file
BEGIN(FileName);
}
+<Pass1>^"%" { // start of a namespace
+ BEGIN(NamespaceName);
+ }
<Pass1>^[~a-z_A-Z][^ \n]*/" " {
memberName=yytext;
BEGIN(AnchorName);
@@ -175,7 +204,12 @@ FILE [a-z_A-Z0-9\.\-\+\:\\\/]+
addFile(yytext);
BEGIN(Pass1);
}
-<ClassName1>{ID}/":" {
+<NamespaceName>{SCOPE}/":" {
+ namespaceName=yytext;
+ addNamespace(yytext);
+ BEGIN(Pass1);
+ }
+<ClassName1>{SCOPE}/":" {
className=yytext;
BEGIN(ClassFile1);
}
diff --git a/src/translator.h b/src/translator.h
index 55b6eaf..6f69c9b 100644
--- a/src/translator.h
+++ b/src/translator.h
@@ -18,32 +18,67 @@
#define TRANSLATOR_H
#include <qstring.h>
+#include "classdef.h"
+#include "util.h"
class Translator
{
public:
- virtual QString latexBabelPackage()
- { return ""; }
- virtual QString trInherits()
+ //--------------------------------------------------------------------
+ // NOTICE:
+ // the following functions are now obsolete: these are no longer used and
+ // will disappear in future versions. You do not have to translate them!
+ virtual QString trInherits()
{ return "Inherits"; }
- virtual QString trAnd()
+ virtual QString trAnd()
{ return "and"; }
- virtual QString trInheritedBy()
+ virtual QString trInheritedBy()
{ return "Inherited By"; }
+ virtual QString trReference()
+ { return "Reference"; }
+ virtual QString trReimplementedFrom()
+ { return "Reimplemented from"; }
+ virtual QString trReimplementedIn()
+ { return "Reimplemented in"; }
+ virtual QString trIncludeFile()
+ { return "Include File"; }
+ virtual QString trNamespaces()
+ { return "Namespace List"; }
+ // end of obsolete functions
+ //--------------------------------------------------------------------
+
+ virtual QString latexBabelPackage()
+ // returns the name of the package that is included by LaTeX
+ { return ""; }
+
virtual QString trRelatedFunctions()
+ // used in the compound documentation before a list of related functions.
{ return "Related Functions"; }
+
virtual QString trRelatedSubscript()
+ // subscript for the related functions.
{ return "(Note that these are not member functions.)"; }
+
virtual QString trDetailedDescription()
+ // header that is put before the detailed description of files, classes and namespaces.
{ return "Detailed Description"; }
+
virtual QString trMemberTypedefDocumentation()
+ // header that is put before the list of typedefs.
{ return "Member Typedef Documentation"; }
+
virtual QString trMemberEnumerationDocumentation()
+ // header that is put before the list of enumerations.
{ return "Member Enumeration Documentation"; }
+
virtual QString trMemberFunctionDocumentation()
+ // header that is put before the list of member functions.
{ return "Member Function Documentation"; }
+
virtual QString trMemberDataDocumentation()
+ // header that is put before the list of member attributes.
{ return "Member Data Documentation"; }
+
virtual QString trGeneratedFrom(const char *s,bool single)
{ // here s is one of " Class", " Struct" or " Union"
// single is true implies a single file
@@ -52,62 +87,92 @@ class Translator
if (single) result+=":"; else result+="s:";
return result;
}
- virtual QString trMore()
+
+ virtual QString trMore()
+ // this is the text of a link put after brief descriptions.
{ return "More..."; }
- virtual QString trReference()
- { return "Reference"; }
+
virtual QString trListOfAllMembers()
+ // put in the class documentation
{ return "List of all members."; }
+
virtual QString trMemberList()
+ // used as the title of the "list of all members" page of a class
{ return "Member List"; }
+
virtual QString trThisIsTheListOfAllMembers()
- { return "This is the complete list of members for"; }
+ // this is the first part of a sentence that is followed by a class name
+ { return "This is the complete list of members for "; }
virtual QString trIncludingInheritedMembers()
- { return "including all inherited members."; }
+ // this is the remainder of the sentence after the class name
+ { return ", including all inherited members."; }
+
virtual QString trGeneratedAutomatically(const char *s)
+ // this is put at the author sections at the bottom of man pages.
+ // parameter s is name of the project name.
{ QString result="Generated automatically by Doxygen";
if (s) result+=(QString)" for "+s;
result+=" from the source code.";
return result;
}
+
virtual QString trEnumName()
+ // put after an enum name in the list of all members
{ return "enum name"; }
+
virtual QString trEnumValue()
+ // put after an enum value in the list of all members
{ return "enum value"; }
+
virtual QString trDefinedIn()
+ // put after an undocumented member in the list of all members
{ return "defined in"; }
- virtual QString trIncludeFile()
- { return "Include File"; }
+
virtual QString trVerbatimText(const char *f)
+ // put as in introduction in the verbatim header file of a class.
+ // parameter f is the name of the include file.
{ return (QString)"This is the verbatim text of the "+f+" include file."; }
-
+ // quick reference sections
virtual QString trModules()
+ // This is put above each page as a link to the list of all groups of
+ // compounds or files (see the \group command).
{ return "Modules"; }
virtual QString trClassHierarchy()
+ // This is put above each page as a link to the class hierarchy
{ return "Class Hierarchy"; }
virtual QString trCompoundList()
+ // This is put above each page as a link to the list of annotated classes
{ return "Compound List"; }
virtual QString trFileList()
+ // This is put above each page as a link to the list of documented files
{ return "File List"; }
virtual QString trHeaderFiles()
+ // This is put above each page as a link to the list of all verbatim headers
{ return "Header Files"; }
virtual QString trCompoundMembers()
+ // This is put above each page as a link to all members of compounds.
{ return "Compound Members"; }
virtual QString trFileMembers()
+ // This is put above each page as a link to all members of files.
{ return "File Members"; }
virtual QString trRelatedPages()
+ // This is put above each page as a link to all related pages.
{ return "Related Pages"; }
virtual QString trExamples()
+ // This is put above each page as a link to all examples.
{ return "Examples"; }
virtual QString trSearch()
+ // This is put above each page as a link to the search engine.
{ return "Search"; }
-
+
virtual QString trClassHierarchyDescription()
+ // This is an introduction to the class hierarchy.
{ return "This inheritance list is sorted roughly, "
"but not completely, alphabetically:";
}
virtual QString trFileListDescription(bool extractAll)
+ // This is an introduction to the list with all files.
{
QString result="Here is a list of all ";
if (!extractAll) result+="documented ";
@@ -115,10 +180,12 @@ class Translator
return result;
}
virtual QString trCompoundListDescription()
+ // This is an introduction to the annotated compound list
{ return "Here are the classes, structs and "
"unions with brief descriptions:";
}
virtual QString trCompoundMembersDescription(bool extractAll)
+ // This is an introduction to the page with all class members
{
QString result="Here is a list of all ";
if (!extractAll) result+="documented ";
@@ -130,6 +197,7 @@ class Translator
return result;
}
virtual QString trFileMembersDescription(bool extractAll)
+ // This is an introduction to the page with all file members
{
QString result="Here is a list of all ";
if (!extractAll) result+="documented ";
@@ -141,76 +209,134 @@ class Translator
return result;
}
virtual QString trHeaderFilesDescription()
+ // This is an introduction to the page with the list of all header files
{ return "Here are the header files that make up the API:"; }
virtual QString trExamplesDescription()
+ // This is an introduction to the page with the list of all examples
{ return "Here is a list of all examples:"; }
virtual QString trRelatedPagesDescription()
+ // This is an introduction to the page with the list of related pages
{ return "Here is a list of all related documentation pages:"; }
virtual QString trModulesDescription()
+ // This is an introduction to the page with the list of class/file groups
{ return "Here is a list of all modules:"; }
virtual QString trNoDescriptionAvailable()
+ // This sentences is used in the annotated class/file lists if no brief
+ // description is given.
{ return "No description available"; }
+ // index titles (the project name is prepended for these)
virtual QString trDocumentation()
+ // This is used in HTML as the title of index.html.
{ return "Documentation"; }
virtual QString trModuleIndex()
+ // This is used in LaTeX as the title of the chapter with the
+ // index of all groups.
{ return "Module Index"; }
virtual QString trHierarchicalIndex()
+ // This is used in LaTeX as the title of the chapter with the
+ // class hierarchy.
{ return "Hierarchical Index"; }
virtual QString trCompoundIndex()
+ // This is used in LaTeX as the title of the chapter with the
+ // annotated compound index
{ return "Compound Index"; }
virtual QString trFileIndex()
+ // This is used in LaTeX as the title of the chapter with the
+ // list of all files.
{ return "File Index"; }
virtual QString trModuleDocumentation()
+ // This is used in LaTeX as the title of the chapter containing
+ // the documentation of all groups.
{ return "Module Documentation"; }
virtual QString trClassDocumentation()
+ // This is used in LaTeX as the title of the chapter containing
+ // the documentation of all classes, structs and unions.
{ return "Class Documentation"; }
virtual QString trFileDocumentation()
+ // This is used in LaTeX as the title of the chapter containing
+ // the documentation of all files.
{ return "File Documentation"; }
virtual QString trExampleDocumentation()
+ // This is used in LaTeX as the title of the chapter containing
+ // the documentation of all examples.
{ return "Example Documentation"; }
virtual QString trPageDocumentation()
+ // This is used in LaTeX as the title of the chapter containing
+ // the documentation of all related pages.
{ return "Page Documentation"; }
virtual QString trReferenceManual()
+ // This is used in LaTeX as the title of the document
{ return "Reference Manual"; }
virtual QString trDefines()
+ // This is used in the documentation of a file as a header before the
+ // list of defines
{ return "Defines"; }
virtual QString trFuncProtos()
+ // This is used in the documentation of a file as a header before the
+ // list of function prototypes
{ return "Function Prototypes"; }
virtual QString trTypedefs()
+ // This is used in the documentation of a file as a header before the
+ // list of typedefs
{ return "Typedefs"; }
virtual QString trEnumerations()
+ // This is used in the documentation of a file as a header before the
+ // list of enumerations
{ return "Enumerations"; }
virtual QString trFunctions()
+ // This is used in the documentation of a file as a header before the
+ // list of (global) functions
{ return "Functions"; }
virtual QString trVariables()
+ // This is used in the documentation of a file as a header before the
+ // list of (global) variables
{ return "Variables"; }
virtual QString trEnumerationValues()
+ // This is used in the documentation of a file as a header before the
+ // list of (global) variables
{ return "Enumeration values"; }
- virtual QString trReimplementedFrom()
- { return "Reimplemented from"; }
- virtual QString trReimplementedIn()
- { return "Reimplemented in"; }
+
virtual QString trAuthor()
+ // This is used in man pages as the author section.
{ return "Author"; }
+
virtual QString trDefineDocumentation()
+ // This is used in the documentation of a file before the list of
+ // documentation blocks for defines
{ return "Define Documentation"; }
virtual QString trFunctionPrototypeDocumentation()
+ // This is used in the documentation of a file/namespace before the list
+ // of documentation blocks for function prototypes
{ return "Function Prototype Documentation"; }
virtual QString trTypedefDocumentation()
+ // This is used in the documentation of a file/namespace before the list
+ // of documentation blocks for typedefs
{ return "Typedef Documentation"; }
virtual QString trEnumerationTypeDocumentation()
+ // This is used in the documentation of a file/namespace before the list
+ // of documentation blocks for enumeration types
{ return "Enumeration Type Documentation"; }
virtual QString trEnumerationValueDocumentation()
+ // This is used in the documentation of a file/namespace before the list
+ // of documentation blocks for enumeration values
{ return "Enumeration Value Documentation"; }
virtual QString trFunctionDocumentation()
+ // This is used in the documentation of a file/namespace before the list
+ // of documentation blocks for functions
{ return "Function Documentation"; }
virtual QString trVariableDocumentation()
+ // This is used in the documentation of a file/namespace before the list
+ // of documentation blocks for variables
{ return "Variable Documentation"; }
virtual QString trCompounds()
+ // This is used in the documentation of a file/namespace/group before
+ // the list of links to documented compounds
{ return "Compounds"; }
virtual QString trFiles()
+ // This is used in the documentation of a group before the list of
+ // links to documented files
{ return "Files"; }
virtual QString trGeneratedAt(const char *date,const char *projName)
@@ -226,42 +352,56 @@ class Translator
}
virtual QString trClassDiagram(const char *clName)
+ // this text is put before a class diagram
{
return (QString)"Class diagram for "+clName;
}
virtual QString trForInternalUseOnly()
+ // this text is generated when the \internal command is used.
{ return "For internal use only."; }
virtual QString trReimplementedForInternalReasons()
+ // this text is generated when the \reimp command is used.
{ return "Reimplemented for internal reasons; the API is not affected."; }
virtual QString trWarning()
+ // this text is generated when the \warning command is used.
{ return "Warning"; }
virtual QString trBugsAndLimitations()
+ // this text is generated when the \bug command is used.
{ return "Bugs and limitations"; }
virtual QString trVersion()
+ // this text is generated when the \version command is used.
{ return "Version"; }
virtual QString trDate()
+ // this text is generated when the \date command is used.
{ return "Date"; }
virtual QString trAuthors()
+ // this text is generated when the \author command is used.
{ return "Author(s)"; }
virtual QString trReturns()
+ // this text is generated when the \return command is used.
{ return "Returns"; }
virtual QString trSeeAlso()
+ // this text is generated when the \sa command is used.
{ return "See also"; }
virtual QString trParameters()
+ // this text is generated when the \param command is used.
{ return "Parameters"; }
virtual QString trExceptions()
+ // this text is generated when the \exception command is used.
{ return "Exceptions"; }
+
virtual QString trGeneratedBy()
+ // this text is used in the title page of a LaTeX document.
{ return "Generated by"; }
// new since 0.49-990307
- virtual QString trNamespaces()
- { return "Namespaces"; }
virtual QString trNamespaceList()
+ // used as the title of page containing all the index of all namespaces.
{ return "Namespace List"; }
virtual QString trNamespaceListDescription(bool extractAll)
+ // used as an introduction to the namespace list
{
QString result="Here is a list of all ";
if (!extractAll) result+="documented ";
@@ -269,12 +409,147 @@ class Translator
return result;
}
virtual QString trFriends()
+ // used in the class documentation as a header before the list of all
+ // friends of a class
{ return "Friends"; }
- // new since 0.49-990405
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990405
+//////////////////////////////////////////////////////////////////////////
virtual QString trRelatedFunctionDocumentation()
+ // used in the class documentation as a header before the list of all
+ // related classes
{ return "Friends And Related Function Documentation"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990425
+//////////////////////////////////////////////////////////////////////////
+
+ virtual QString trCompoundReference(const char *clName,
+ ClassDef::CompoundType compType)
+ // used as the title of the HTML page of a class/struct/union
+ {
+ QString result=(QString)clName+" ";
+ switch(compType)
+ {
+ case ClassDef::Class: result+=" Class"; break;
+ case ClassDef::Struct: result+=" Struct"; break;
+ case ClassDef::Union: result+=" Union"; break;
+ }
+ result+=" Reference";
+ return result;
+ }
+ virtual QString trFileReference(const char *fileName)
+ // used as the title of the HTML page of a file
+ {
+ QString result=fileName;
+ result+=" File Reference";
+ return result;
+ }
+ virtual QString trNamespaceReference(const char *namespaceName)
+ // used as the title of the HTML page of a namespace
+ {
+ QString result=namespaceName;
+ result+=" Namespace Reference";
+ return result;
+ }
+
+ // these are for the member sections of a class, struct or union
+ virtual QString trPublicMembers()
+ { return "Public Members"; }
+ virtual QString trPublicSlots()
+ { return "Public Slots"; }
+ virtual QString trSignals()
+ { return "Signals"; }
+ virtual QString trStaticPublicMembers()
+ { return "Static Public Members"; }
+ virtual QString trProtectedMembers()
+ { return "Protected Members"; }
+ virtual QString trProtectedSlots()
+ { return "Protected Slots"; }
+ virtual QString trStaticProtectedMembers()
+ { return "Static Protected Members"; }
+ virtual QString trPrivateMembers()
+ { return "Private Members"; }
+ virtual QString trPrivateSlots()
+ { return "Private Slots"; }
+ virtual QString trStaticPrivateMembers()
+ { return "Static Private Members"; }
+ // end of member sections
+
+ virtual QString trWriteList(int numEntries)
+ {
+ // this function is used to produce a comma-separated list of items.
+ // use generateMarker(i) to indicate where item i should be put.
+ QString result;
+ int i;
+ // the inherits list contain `numEntries' classes
+ for (i=0;i<numEntries;i++)
+ {
+ // use generateMarker to generate placeholders for the class links!
+ result+=generateMarker(i); // generate marker for entry i in the list
+ // (order is left to right)
+
+ if (i!=numEntries-1) // not the last entry, so we need a separator
+ {
+ if (i<numEntries-2) // not the fore last entry
+ result+=", ";
+ else // the fore last entry
+ result+=", and ";
+ }
+ }
+ return result;
+ }
+
+ virtual QString trInheritsList(int numEntries)
+ // used in class documentation to produce a list of base classes,
+ // if class diagrams are disabled.
+ {
+ return "Inherits "+trWriteList(numEntries)+".";
+ }
+ virtual QString trInheritedByList(int numEntries)
+ // used in class documentation to produce a list of super classes,
+ // if class diagrams are disabled.
+ {
+ return "Inherited by "+trWriteList(numEntries)+".";
+ }
+ virtual QString trReimplementedFromList(int numEntries)
+ // used in member documentation blocks to produce a list of
+ // members that are hidden by this one.
+ {
+ return "Reimplemented from "+trWriteList(numEntries)+".";
+ }
+ virtual QString trReimplementedInList(int numEntries)
+ {
+ // used in member documentation blocks to produce a list of
+ // all member that overwrite the implementation of this member.
+ return "Reimplemented in "+trWriteList(numEntries)+".";
+ }
+
+ virtual QString trNamespaceMembers()
+ // This is put above each page as a link to all members of namespaces.
+ { return "Namespace Members"; }
+ virtual QString trNamespaceMemberDescription(bool extractAll)
+ // This is an introduction to the page with all namespace members
+ {
+ QString result="Here is a list of all ";
+ if (!extractAll) result+="documented ";
+ result+="namespace members with links to ";
+ if (extractAll)
+ result+="the namespace documentation for each member:";
+ else
+ result+="the namespaces they belong to:";
+ return result;
+ }
+ virtual QString trNamespaceIndex()
+ // This is used in LaTeX as the title of the chapter with the
+ // index of all namespaces.
+ { return "Namespace Index"; }
+ virtual QString trNamespaceDocumentation()
+ // This is used in LaTeX as the title of the chapter containing
+ // the documentation of all namespaces.
+ { return "Namespace Documentation"; }
};
#endif
diff --git a/src/translator_fr.h b/src/translator_fr.h
index cd78053..319f156 100644
--- a/src/translator_fr.h
+++ b/src/translator_fr.h
@@ -255,7 +255,7 @@ class TranslatorFrench : public Translator
virtual QString trNamespaces()
{ return "Namespaces"; }
virtual QString trNamespaceList()
- { return "List des Namespaces"; }
+ { return "Liste des Namespaces"; }
virtual QString trNamespaceListDescription(bool extractAll)
{
QString result="Liste de tous les namespaces ";
@@ -265,6 +265,11 @@ class TranslatorFrench : public Translator
}
virtual QString trFriends()
{ return "Friends"; }
+
+ // new since 0.49-990405
+
+ virtual QString trRelatedFunctionDocumentation()
+ { return "Documentation des fonctions amies et associées"; }
};
#endif
diff --git a/src/translator_nl.h b/src/translator_nl.h
index 25e7ed4..c9a96bc 100644
--- a/src/translator_nl.h
+++ b/src/translator_nl.h
@@ -24,12 +24,6 @@ class TranslatorDutch : public Translator
public:
QString latexBabelPackage()
{ return "dutch"; }
- QString trInherits()
- { return "Erft over van"; }
- QString trAnd()
- { return "en"; }
- QString trInheritedBy()
- { return "Wordt overge&euml;rfd door"; }
QString trRelatedFunctions()
{ return "Gerelateerde functies"; }
QString trRelatedSubscript()
@@ -55,8 +49,6 @@ class TranslatorDutch : public Translator
}
QString trMore()
{ return "Meer..."; }
- QString trReference()
- { return "Referentie"; }
QString trListOfAllMembers()
{ return "Lijst van alle members."; }
QString trMemberList()
@@ -64,7 +56,7 @@ class TranslatorDutch : public Translator
QString trThisIsTheListOfAllMembers()
{ return "Dit is de complete lijst van alle members voor"; }
QString trIncludingInheritedMembers()
- { return "inclusief alle overge&euml;rfde members."; }
+ { return ", inclusief alle overge&euml;rfde members."; }
QString trGeneratedAutomatically(const char *s)
{ QString result="Automatisch gegenereerd door Doxygen";
if (s) result+=(QString)" voor "+s;
@@ -77,8 +69,6 @@ class TranslatorDutch : public Translator
{ return "enum waarde"; }
QString trDefinedIn()
{ return "gedefinieerd in"; }
- QString trIncludeFile()
- { return "Include File"; }
QString trVerbatimText(const char *f)
{ return (QString)"Dit is de letterlijke tekst van de include file "+f+"."; }
QString trModules()
@@ -182,10 +172,6 @@ class TranslatorDutch : public Translator
{ return "Variabelen"; }
QString trEnumerationValues()
{ return "Enumeratie waarden"; }
- QString trReimplementedFrom()
- { return "Nieuwe implementatie van"; }
- QString trReimplementedIn()
- { return "Opnieuw ge&iuml;mplementeerd in"; }
QString trAuthor()
{ return "auteur"; }
QString trDefineDocumentation()
@@ -246,10 +232,10 @@ class TranslatorDutch : public Translator
QString trGeneratedBy()
{ return "Gegenereerd door"; }
- // new since 0.49-990307
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990307
+//////////////////////////////////////////////////////////////////////////
- QString trNamespaces()
- { return "Namespaces"; }
QString trNamespaceList()
{ return "Namespace Lijst"; }
QString trNamespaceListDescription(bool extractAll)
@@ -261,6 +247,142 @@ class TranslatorDutch : public Translator
}
QString trFriends()
{ return "Friends"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990405
+//////////////////////////////////////////////////////////////////////////
+
+ QString trRelatedFunctionDocumentation()
+ { return "Documentatie van friends en gerelateerde functies"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990425
+//////////////////////////////////////////////////////////////////////////
+
+ virtual QString trCompoundReference(const char *clName,
+ ClassDef::CompoundType compType)
+ // used as the title of the HTML page of a class/struct/union
+ {
+ QString result=(QString)clName+" ";
+ switch(compType)
+ {
+ case ClassDef::Class: result+=" Class"; break;
+ case ClassDef::Struct: result+=" Struct"; break;
+ case ClassDef::Union: result+=" Union"; break;
+ }
+ result+=" Referentie";
+ return result;
+ }
+ virtual QString trFileReference(const char *fileName)
+ // used as the title of the HTML page of a file
+ {
+ QString result=fileName;
+ result+=" File Referentie";
+ return result;
+ }
+ virtual QString trNamespaceReference(const char *namespaceName)
+ // used as the title of the HTML page of a namespace
+ {
+ QString result=namespaceName;
+ result+=" Namespace Referentie";
+ return result;
+ }
+
+ // these are for the member sections of a class, struct or union
+ virtual QString trPublicMembers()
+ { return "Public Members"; }
+ virtual QString trPublicSlots()
+ { return "Public Slots"; }
+ virtual QString trSignals()
+ { return "Signals"; }
+ virtual QString trStaticPublicMembers()
+ { return "Static Public Members"; }
+ virtual QString trProtectedMembers()
+ { return "Protected Members"; }
+ virtual QString trProtectedSlots()
+ { return "Protected Slots"; }
+ virtual QString trStaticProtectedMembers()
+ { return "Static Protected Members"; }
+ virtual QString trPrivateMembers()
+ { return "Private Members"; }
+ virtual QString trPrivateSlots()
+ { return "Private Slots"; }
+ virtual QString trStaticPrivateMembers()
+ { return "Static Private Members"; }
+ // end of member sections
+
+ virtual QString trWriteList(int numEntries)
+ {
+ // this function is used to produce a comma-separated list of items.
+ // use generateMarker(i) to indicate where item i should be put.
+ QString result;
+ int i;
+ // the inherits list contain `numEntries' classes
+ for (i=0;i<numEntries;i++)
+ {
+ // use generateMarker to generate placeholders for the class links!
+ result+=generateMarker(i); // generate marker for entry i in the list
+ // (order is left to right)
+
+ if (i!=numEntries-1) // not the last entry, so we need a separator
+ {
+ if (i<numEntries-2) // not the fore last entry
+ result+=", ";
+ else // the fore last entry
+ result+=" en ";
+ }
+ }
+ return result;
+ }
+
+ virtual QString trInheritsList(int numEntries)
+ // used in class documentation to produce a list of base classes,
+ // if class diagrams are disabled.
+ {
+ return "Erft over van "+trWriteList(numEntries)+".";
+ }
+ virtual QString trInheritedByList(int numEntries)
+ // used in class documentation to produce a list of super classes,
+ // if class diagrams are disabled.
+ {
+ return "Wordt overge&euml;rfd door "+trWriteList(numEntries)+".";
+ }
+ virtual QString trReimplementedFromList(int numEntries)
+ // used in member documentation blocks to produce a list of
+ // members that are hidden by this one.
+ {
+ return "Nieuwe implementatie van "+trWriteList(numEntries)+".";
+ }
+ virtual QString trReimplementedInList(int numEntries)
+ {
+ // used in member documentation blocks to produce a list of
+ // all member that overwrite the implementation of this member.
+ return "Opnieuw ge&iuml;mplementeerd in "+trWriteList(numEntries)+".";
+ }
+
+ virtual QString trNamespaceMembers()
+ // This is put above each page as a link to all members of namespaces.
+ { return "Namespace Members"; }
+ virtual QString trNamespaceMemberDescription(bool extractAll)
+ // This is an introduction to the page with all namespace members
+ {
+ QString result="Hier is een lijst van alle ";
+ if (!extractAll) result+="gedocumenteerde ";
+ result+="namespace members met links naar ";
+ if (extractAll)
+ result+="de namespace documentatie voor iedere member:";
+ else
+ result+="de namespaces waartoe ze behoren:";
+ return result;
+ }
+ virtual QString trNamespaceIndex()
+ // This is used in LaTeX as the title of the chapter with the
+ // index of all namespaces.
+ { return "Namespace Index"; }
+ virtual QString trNamespaceDocumentation()
+ // This is used in LaTeX as the title of the chapter containing
+ // the documentation of all namespaces.
+ { return "Namespace Documentatie"; }
};
#endif
diff --git a/src/translator_se.h b/src/translator_se.h
index 15b6c18..4f24e0f 100644
--- a/src/translator_se.h
+++ b/src/translator_se.h
@@ -14,6 +14,14 @@
*
*/
+/*-------------------------------------------------------------------------
+Svensk översättning av:
+Samuel Hägglund <sahag96@ite.mh.se>
+Xet Erixon <xet@xeqt.com>
+
+Skicka gärna synpunkter.
+--------------------------------------------------------------------------*/
+
#ifndef TRANSLATOR_SE_H
#define TRANSLATOR_SE_H
@@ -35,34 +43,32 @@ class TranslatorSwedish : public Translator
QString trRelatedSubscript()
{ return "(Observera att dessa inte är medlemsfunktioner)"; }
QString trDetailedDescription()
- { return "Utökad beskrivning"; }
+ { return "Detaljerad beskrivning"; }
QString trMemberTypedefDocumentation()
- { return "Har inte en aning..."; }
+ { return "Dokumentation över typdefinierade medlemmar"; }
QString trMemberEnumerationDocumentation()
- { return "Uppräknad dokumentation???"; }
- QString trEnumerationValueDocumentation()
- { return "Documentatie van enumeratie waarden"; }
+ { return "Dokumentation över egenuppräknande medlemmar"; }
QString trMemberFunctionDocumentation()
- { return "Dokumentation av medlemsfunktioner"; }
+ { return "Dokumentation över medlemsfunktioner"; }
QString trMemberDataDocumentation()
- { return "Dokumentation av datamedlemmar"; }
+ { return "Dokumentation över datamedlemmar"; }
QString trGeneratedFrom(const char *s,bool single)
{
- QString result=(QString)"Dokumentationen för detta"+s+
- " är skapad ur följande fil";
- if (single) result+=":"; else result+="s:";
+ QString result=(QString)"Dokumentationen för denna"+s+
+ " är skapad utifrån följande fil";
+ if (single) result+=":"; else result+="er:";
return result;
}
QString trMore()
- { return "Fler..."; }
+ { return "Mer..."; }
QString trReference()
- { return "Hänvisning?"; }
+ { return "Referens"; }
QString trListOfAllMembers()
{ return "Lista över alla medlemmar."; }
QString trMemberList()
{ return "Medlemslista"; }
QString trThisIsTheListOfAllMembers()
- { return "Det här är en fullständig lista av medlemmar för?"; }
+ { return "Det här är en fullständig lista över medlemmar för"; }
QString trIncludingInheritedMembers()
{ return "med alla ärvda medlemmar."; }
QString trGeneratedAutomatically(const char *s)
@@ -72,29 +78,29 @@ class TranslatorSwedish : public Translator
return result;
}
QString trEnumName()
- { return "enum namn?"; }
+ { return "enum namn"; }
QString trEnumValue()
- { return "enum värde?"; }
+ { return "enum värde"; }
QString trDefinedIn()
{ return "deklarerad i"; }
QString trIncludeFile()
- { return "Include Fil"; }
+ { return "Inkluderingsfil"; }
QString trVerbatimText(const char *f)
- { return (QString)"Detta är den ordagranna texten av "+f+" include fil."; }
+ { return (QString)"Detta är den ordagranna texten från inkluderingsfilen"+f; }
QString trModules()
- { return "Moduler?"; }
+ { return "Moduler"; }
QString trClassHierarchy()
- { return "Klasshierarki?"; }
+ { return "Klasshierarki"; }
QString trCompoundList()
- { return "Inhägnad lista???"; }
+ { return "Sammansatt klasslista"; }
QString trFileList()
{ return "Fillista"; }
QString trHeaderFiles()
{ return "Headerfiler"; }
QString trCompoundMembers()
- { return "Inhägnade medlemmar??"; }
+ { return "Sammansatta klassmedlemmar"; }
QString trFileMembers()
- { return "Filmedlemmar???"; }
+ { return "Filmedlemmar"; }
QString trRelatedPages()
{ return "Besläktade sidor"; }
QString trExamples()
@@ -102,8 +108,8 @@ class TranslatorSwedish : public Translator
QString trSearch()
{ return "Sök"; }
QString trClassHierarchyDescription()
- { return "Denna lista över arv är grovsorterad, men inte helt "
- "i alfabetisk ordning:";
+ { return "Denna lista över arv är grovt, men inte helt, "
+ "sorterad i alfabetisk ordning:";
}
QString trFileListDescription(bool extractAll)
{
@@ -113,8 +119,8 @@ class TranslatorSwedish : public Translator
return result;
}
QString trCompoundListDescription()
- { return "Här följer klasserna, structs och "
- "unions? med en kort beskrivning:";
+ { return "Här följer klasserna, structerna och "
+ "unionerna med en kort beskrivning:";
}
QString trCompoundMembersDescription(bool extractAll)
{
@@ -129,18 +135,18 @@ class TranslatorSwedish : public Translator
{
QString result="Här följer en lista över alla ";
if (!extractAll) result+="dokumenterade ";
- result+="filmedlemmar? med länkar till ";
+ result+="filmedlemmar med länkar till ";
if (extractAll) result+="dokumentationsfilen för varje medlem:";
else result+="filerna som de tillhör:";
return result;
}
QString trHeaderFilesDescription()
- { return "Här följer headerfilerna som API:n består av???:"; }
+ { return "Här följer headerfilerna som API:n består av:"; }
QString trExamplesDescription()
{ return "Här följer en lista med alla exempel:"; }
QString trRelatedPagesDescription()
- { return "Här följer en lista med alla relevanta? dokumentationssidor:"; }
- QString trModulesDescription()
+ { return "Här följer en lista över alla relaterade dokumentationssidor:";
+} QString trModulesDescription()
{ return "Här följer en lista över alla moduler:"; }
QString trNoDescriptionAvailable()
{ return "Beskrivning saknas"; }
@@ -148,11 +154,11 @@ class TranslatorSwedish : public Translator
QString trDocumentation()
{ return "Dokumentation"; }
QString trModuleIndex()
- { return "Module Index"; }
+ { return "Modul Index"; }
QString trHierarchicalIndex()
{ return "Hierarkiskt Index"; }
QString trCompoundIndex()
- { return "Compound Index"; }
+ { return "Sammansatt Index"; }
QString trFileIndex()
{ return "Fil Index"; }
QString trModuleDocumentation()
@@ -169,39 +175,41 @@ class TranslatorSwedish : public Translator
{ return "Uppslagsbok"; }
QString trDefines()
- { return "Definerar"; }
+ { return "Definitioner"; }
QString trFuncProtos()
{ return "Funktionsprototyper"; }
QString trTypedefs()
- { return "Typedefs"; }
+ { return "Typdefinitioner"; }
QString trEnumerations()
- { return "Uppräkning???"; }
+ { return "Egenuppräknande typer"; }
QString trFunctions()
{ return "Funktioner"; }
QString trVariables()
{ return "Variabler"; }
QString trEnumerationValues()
- { return "Enum värden??"; }
+ { return "Egenuppräknade värden"; }
QString trReimplementedFrom()
- { return "Återanvänd från???"; }
+ { return "Återanvänd från"; }
QString trReimplementedIn()
- { return "Återanvänd i??"; }
+ { return "Återanvänd i"; }
QString trAuthor()
{ return "Författare"; }
QString trDefineDocumentation()
- { return "Definiera dokumentation"; }
+ { return "Dokumentation över definitioner"; }
QString trFunctionPrototypeDocumentation()
{ return "Dokumentation över funktionsprototyper"; }
QString trTypedefDocumentation()
- { return "Dokumentation över typedefs"; }
+ { return "Dokumentation över typdefinitioner"; }
QString trEnumerationTypeDocumentation()
- { return "Dokumentation över enum typer"; }
+ { return "Dokumentation över egenuppräknande typer (enum)"; }
+ QString trEnumerationValueDocumentation()
+ { return "Dokumentation över egenuppräknande typers värden"; }
QString trFunctionDocumentation()
{ return "Dokumentation över funktioner"; }
QString trVariableDocumentation()
{ return "Dokumentation över variabler"; }
QString trCompounds()
- { return "Compounds??"; }
+ { return "Sammansättning"; }
QString trFiles()
{ return "Filer"; }
QString trGeneratedAt(const char *date,const char *projName)
@@ -217,12 +225,12 @@ class TranslatorSwedish : public Translator
}
QString trClassDiagram(const char *clName)
{
- return (QString)"Klass diagram för "+clName;
+ return (QString)"Klass-diagram för "+clName;
}
QString trForInternalUseOnly()
{ return "Endast för internt bruk."; }
QString trReimplementedForInternalReasons()
- { return "Omskriven av interna orsaker???; "
+ { return "Omskriven av intern anledning ; "
"API:n påverkas inte.";
}
QString trWarning()
diff --git a/src/util.cpp b/src/util.cpp
index 6b4578d..9064b2e 100644
--- a/src/util.cpp
+++ b/src/util.cpp
@@ -37,6 +37,12 @@ bool isId(char c)
return c=='_' || isalnum(c);
}
+QString generateMarker(int id)
+{
+ QString result;
+ result.sprintf("@%d\n",id);
+ return result;
+}
// try to determine if this files is a source or a header file by looking
// at the extension (5 variations are allowed in both upper and lower case)
@@ -197,6 +203,7 @@ static void linkifyText(OutputList &ol,const char *clName,const char *name,const
ClassDef *cd=0;
FileDef *fd=0;
MemberDef *md=0;
+ NamespaceDef *nd=0;
// check if `word' is a documented class name
if (word.length()>0 && word!=name && word!=clName)
@@ -206,24 +213,29 @@ static void linkifyText(OutputList &ol,const char *clName,const char *name,const
// add link to the result
if (cd->isVisible())
{
- result.writeObjectLink(cd->getReference(),cd->classFile(),0,word);
+ result.writeObjectLink(cd->getReference(),cd->getOutputFileBase(),0,word);
}
else
{
result.docify(word);
}
}
- else if (getDefs(word,clName,0,md,cd,fd) && md->hasDocumentation())
+ else if (getDefs(word,clName,0,md,cd,fd,nd) && md->hasDocumentation())
{
if (cd && cd->isVisible() && !md->isFunction()) // word is a member of cd
{
result.writeObjectLink(cd->getReference(),
- cd->classFile(),md->anchor(),word);
+ cd->getOutputFileBase(),md->anchor(),word);
+ }
+ else if (nd && nd->hasDocumentation())
+ {
+ result.writeObjectLink(nd->getReference(),
+ nd->getOutputFileBase(),md->anchor(),word);
}
else if (fd && fd->hasDocumentation()) // word is a global in file fd
{
result.writeObjectLink(fd->getReference(),
- fd->diskName(),md->anchor(),word);
+ fd->getOutputFileBase(),md->anchor(),word);
}
else // add word to the result
{
@@ -313,6 +325,28 @@ static void writeDefArgumentList(OutputList &ol,ClassDef *cd,
}
}
+void writeExample(OutputList &ol,ExampleList *el)
+{
+ QString exampleLine=theTranslator->trWriteList(el->count());
+
+ QRegExp marker("@[0-9]+");
+ int index=0,newIndex,matchLen;
+ // now replace all markers in inheritLine with links to the classes
+ while ((newIndex=marker.match(exampleLine,index,&matchLen))!=-1)
+ {
+ bool ok;
+ parseText(ol,exampleLine.mid(index,newIndex-index));
+ uint entryIndex = exampleLine.mid(newIndex+1,matchLen-1).toUInt(&ok);
+ Example *e=el->at(entryIndex);
+ if (ok && e) ol.writeObjectLink(0,e->file,e->anchor,e->name);
+ index=newIndex+matchLen;
+ }
+ parseText(ol,exampleLine.right(exampleLine.length()-index));
+ ol.writeString(".");
+}
+
+
+
QString argListToString(ArgumentList *al)
{
QString result;
@@ -335,11 +369,14 @@ static void writeLink(OutputList &ol,ClassDef *cd,NamespaceDef *nd,
FileDef *fd,MemberDef *md,const char *name)
{
if (nd)
- ol.writeObjectLink(0 /*TODO: references */,nd->namespaceFile(),md->anchor(),name);
+ ol.writeObjectLink(nd->getReference(),nd->getOutputFileBase(),
+ md->anchor(),name);
else if (fd)
- ol.writeObjectLink(fd->getReference(),fd->diskName(),md->anchor(),name);
+ ol.writeObjectLink(fd->getReference(),fd->getOutputFileBase(),
+ md->anchor(),name);
else
- ol.writeObjectLink(cd->getReference(),cd->classFile(),md->anchor(),name);
+ ol.writeObjectLink(cd->getReference(),cd->getOutputFileBase(),
+ md->anchor(),name);
}
static void warnForUndocumentedMember(MemberDef *md)
@@ -388,77 +425,84 @@ void writeQuickLinks(OutputList &ol,bool compact,bool ext)
{
if (!compact) ol.writeListItem();
ol.startQuickIndexItem(extLink,absPath+"modules.html");
- parseDoc(ol,0,0,theTranslator->trModules());
+ parseText(ol,theTranslator->trModules());
ol.endQuickIndexItem();
}
if (documentedNamespaces>0)
{
if (!compact) ol.writeListItem();
ol.startQuickIndexItem(extLink,absPath+"namespaces.html");
- parseDoc(ol,0,0,theTranslator->trNamespaces());
+ parseText(ol,theTranslator->trNamespaceList());
ol.endQuickIndexItem();
}
if (hierarchyClasses>0)
{
if (!compact) ol.writeListItem();
ol.startQuickIndexItem(extLink,absPath+"hierarchy.html");
- parseDoc(ol,0,0,theTranslator->trClassHierarchy());
+ parseText(ol,theTranslator->trClassHierarchy());
ol.endQuickIndexItem();
}
if (annotatedClasses>0)
{
if (!compact) ol.writeListItem();
ol.startQuickIndexItem(extLink,absPath+"annotated.html");
- parseDoc(ol,0,0,theTranslator->trCompoundList());
+ parseText(ol,theTranslator->trCompoundList());
ol.endQuickIndexItem();
}
if (documentedFiles>0)
{
if (!compact) ol.writeListItem();
ol.startQuickIndexItem(extLink,absPath+"files.html");
- parseDoc(ol,0,0,theTranslator->trFileList());
+ parseText(ol,theTranslator->trFileList());
ol.endQuickIndexItem();
}
if (includeFiles.count()>0 && verbatimHeaderFlag)
{
if (!compact) ol.writeListItem();
ol.startQuickIndexItem(extLink,absPath+"headers.html");
- parseDoc(ol,0,0,theTranslator->trHeaderFiles());
+ parseText(ol,theTranslator->trHeaderFiles());
ol.endQuickIndexItem();
}
+ if (documentedNamespaceMembers>0)
+ {
+ if (!compact) ol.writeListItem();
+ ol.startQuickIndexItem(extLink,absPath+"namespacemembers.html");
+ parseText(ol,theTranslator->trNamespaceMembers());
+ ol.endQuickIndexItem();
+ }
if (documentedMembers>0)
{
if (!compact) ol.writeListItem();
ol.startQuickIndexItem(extLink,absPath+"functions.html");
- parseDoc(ol,0,0,theTranslator->trCompoundMembers());
+ parseText(ol,theTranslator->trCompoundMembers());
ol.endQuickIndexItem();
}
if (documentedFunctions>0)
{
if (!compact) ol.writeListItem();
ol.startQuickIndexItem(extLink,absPath+"globals.html");
- parseDoc(ol,0,0,theTranslator->trFileMembers());
+ parseText(ol,theTranslator->trFileMembers());
ol.endQuickIndexItem();
}
if (pageList.count()>0)
{
if (!compact) ol.writeListItem();
ol.startQuickIndexItem(extLink,absPath+"pages.html");
- parseDoc(ol,0,0,theTranslator->trRelatedPages());
+ parseText(ol,theTranslator->trRelatedPages());
ol.endQuickIndexItem();
}
if (exampleList.count()>0)
{
if (!compact) ol.writeListItem();
ol.startQuickIndexItem(extLink,absPath+"examples.html");
- parseDoc(ol,0,0,theTranslator->trExamples());
+ parseText(ol,theTranslator->trExamples());
ol.endQuickIndexItem();
}
if (searchEngineFlag)
{
if (!compact) ol.writeListItem();
ol.startQuickIndexItem("_cgi:","");
- parseDoc(ol,0,0,theTranslator->trSearch());
+ parseText(ol,theTranslator->trSearch());
ol.endQuickIndexItem();
}
if (compact)
@@ -489,7 +533,7 @@ void endFile(OutputList &ol,bool external)
ol.writeFooter(0,external); // write the footer
if (footerFile.length()==0)
{
- parseDoc(ol,0,0,theTranslator->trGeneratedAt(
+ parseText(ol,theTranslator->trGeneratedAt(
dateToString(TRUE),
projectName
));
@@ -497,7 +541,7 @@ void endFile(OutputList &ol,bool external)
ol.writeFooter(1,external); // write the link to the picture
if (footerFile.length()==0)
{
- parseDoc(ol,0,0,theTranslator->trWrittenBy());
+ parseText(ol,theTranslator->trWrittenBy());
}
ol.writeFooter(2,external); // end the footer
if (latexEnabled) ol.enable(OutputGenerator::Latex);
@@ -516,7 +560,7 @@ static void writeMemberDef(OutputList &ol, ClassDef *cd, NamespaceDef *nd,
md->documentation().isEmpty() &&
!briefMemDescFlag &&
!repeatBriefFlag
- )
+ )
) return;
QString type=md->typeString();
QRegExp r("@[0-9]+");
@@ -539,14 +583,24 @@ static void writeMemberDef(OutputList &ol, ClassDef *cd, NamespaceDef *nd,
else if (fd) cname=fd->name();
// If there is no detailed description we need to write the anchor here.
- if (!md->detailsAreVisible() && !extractAllFlag)
+ bool detailsVisible = md->detailsAreVisible();
+ if (!detailsVisible && !extractAllFlag)
{
- ol.writeDoxyAnchor(cname,md->anchor(),md->name());
+ QString doxyName=md->name().copy();
+ if (!cname.isEmpty()) doxyName.prepend(cname+"::");
+ ol.writeDoxyAnchor(cname,md->anchor(),doxyName);
ol.addToIndex(md->name(),cname);
ol.addToIndex(cname,md->name());
ol.docify("\n");
}
-
+ else if (!detailsVisible) // when extractAll it true we have to write
+ // a index reference and label in LaTeX because
+ // detailed section not shown in LaTeX
+ {
+ ol.addToIndex(md->name(),cname);
+ ol.addToIndex(cname,md->name());
+ ol.writeLatexLabel(cname,md->anchor());
+ }
ol.startMemberItem();
// write type
@@ -564,6 +618,8 @@ static void writeMemberDef(OutputList &ol, ClassDef *cd, NamespaceDef *nd,
QString name=md->name().copy();
if (type.length()>0) ol.writeString(" ");
+ ol.insertMemberAlign();
+
// write name
if ( extractAllFlag ||
(md->briefDescription().isEmpty() || !briefMemDescFlag) &&
@@ -610,7 +666,7 @@ static void writeMemberDef(OutputList &ol, ClassDef *cd, NamespaceDef *nd,
ol.docify(" ");
ol.startTextLink(0,md->anchor());
//ol.writeObjectLink(0,0,md->anchor()," More...");
- parseDoc(ol,0,0,theTranslator->trMore());
+ parseText(ol,theTranslator->trMore());
ol.endTextLink();
ol.startEmphasis();
ol.enableAll();
@@ -634,11 +690,13 @@ void writeMemberDecs(OutputList &ol,ClassDef *cd,NamespaceDef *nd, FileDef *fd,
if (title)
{
ol.startMemberHeader();
- parseDoc(ol,0,0,title);
+ parseText(ol,title);
ol.endMemberHeader();
}
- if (subtitle) ol.writeString(subtitle);
-
+ if (subtitle)
+ {
+ parseText(ol,subtitle);
+ }
if (!fd && !nd) ol.startMemberList();
MemberDef *md;
@@ -646,7 +704,7 @@ void writeMemberDecs(OutputList &ol,ClassDef *cd,NamespaceDef *nd, FileDef *fd,
if (fd && ml->defineCount()>0)
{
ol.startMemberHeader();
- parseDoc(ol,0,0,theTranslator->trDefines());
+ parseText(ol,theTranslator->trDefines());
ol.endMemberHeader();
ol.startMemberList();
MemberListIterator mli(*ml);
@@ -663,7 +721,7 @@ void writeMemberDecs(OutputList &ol,ClassDef *cd,NamespaceDef *nd, FileDef *fd,
if ((fd || nd) && ml->protoCount()>0)
{
ol.startMemberHeader();
- parseDoc(ol,0,0,theTranslator->trFuncProtos());
+ parseText(ol,theTranslator->trFuncProtos());
ol.startMemberList();
MemberListIterator mli(*ml);
for ( ; (md=mli.current()); ++mli )
@@ -678,7 +736,7 @@ void writeMemberDecs(OutputList &ol,ClassDef *cd,NamespaceDef *nd, FileDef *fd,
if (fd || nd)
{
ol.startMemberHeader();
- parseDoc(ol,0,0,theTranslator->trTypedefs());
+ parseText(ol,theTranslator->trTypedefs());
ol.endMemberHeader();
//ol.writeMemberHeader("Typedefs");
ol.startMemberList();
@@ -697,36 +755,21 @@ void writeMemberDecs(OutputList &ol,ClassDef *cd,NamespaceDef *nd, FileDef *fd,
if (fd || nd)
{
ol.startMemberHeader();
- parseDoc(ol,0,0,theTranslator->trEnumerations());
+ parseText(ol,theTranslator->trEnumerations());
ol.endMemberHeader();
ol.startMemberList();
}
MemberListIterator mli(*ml);
for ( ; (md=mli.current()) ; ++mli )
{
- bool hasDocs=md->hasDocumentation();
+ /*bool hasDocs=md->hasDocumentation();*/
QString type=md->typeString();
type=type.stripWhiteSpace();
- if (md->isEnumerate() && (hasDocs || !hideMemberFlag))
+ if (md->isEnumerate() /*&& (hasDocs || !hideMemberFlag)*/)
{
- // see if there are any documented enum values
- // we need this info to decide if we need to generate a link.
- QList<MemberDef> *fmdl=md->enumFieldList();
- int documentedEnumValues=0;
- if (fmdl)
- {
- MemberDef *fmd=fmdl->first();
- while (fmd)
- {
- if (fmd->hasDocumentation()) documentedEnumValues++;
- fmd=fmdl->next();
- }
- }
- if (documentedEnumValues>0) md->setDocumentedEnumValues(TRUE);
-
if (!hideMemberFlag || // do not hide undocumented members or
!md->documentation().isEmpty() || // member has detailed descr. or
- documentedEnumValues>0 || // member has documented enum vales.
+ md->hasDocumentedEnumValues() || // member has documented enum vales.
briefMemDescFlag || // brief descr. is shown or
repeatBriefFlag // brief descr. is repeated.
)
@@ -739,7 +782,7 @@ void writeMemberDecs(OutputList &ol,ClassDef *cd,NamespaceDef *nd, FileDef *fd,
{
if (extractAllFlag ||
(md->briefDescription().isEmpty() || !briefMemDescFlag) &&
- (!md->documentation().isEmpty() || documentedEnumValues>0 ||
+ (!md->documentation().isEmpty() || md->hasDocumentedEnumValues() ||
(!md->briefDescription().isEmpty() &&
!briefMemDescFlag &&
repeatBriefFlag
@@ -760,6 +803,7 @@ void writeMemberDecs(OutputList &ol,ClassDef *cd,NamespaceDef *nd, FileDef *fd,
}
typeDecl.docify("{ ");
+ QList<MemberDef> *fmdl=md->enumFieldList();
if (fmdl)
{
MemberDef *fmd=fmdl->first();
@@ -798,6 +842,7 @@ void writeMemberDecs(OutputList &ol,ClassDef *cd,NamespaceDef *nd, FileDef *fd,
{
ol.startMemberItem();
ol.writeString("enum ");
+ ol.insertMemberAlign();
ol+=typeDecl;
ol.endMemberItem();
//QString brief=md->briefDescription();
@@ -807,14 +852,14 @@ void writeMemberDecs(OutputList &ol,ClassDef *cd,NamespaceDef *nd, FileDef *fd,
ol.startMemberDescription();
parseDoc(ol,cd?cd->name().data():0,
md->name().data(),md->briefDescription());
- if (!md->documentation().isEmpty() || documentedEnumValues>0)
+ if (!md->documentation().isEmpty() || md->hasDocumentedEnumValues())
{
ol.disableAllBut(OutputGenerator::Html);
ol.endEmphasis();
ol.docify(" ");
ol.startTextLink(0,md->anchor());
//ol.writeObjectLink(0,0,md->anchor()," More...");
- parseDoc(ol,0,0,theTranslator->trMore());
+ parseText(ol,theTranslator->trMore());
ol.endTextLink();
ol.startEmphasis();
ol.enableAll();
@@ -838,7 +883,7 @@ void writeMemberDecs(OutputList &ol,ClassDef *cd,NamespaceDef *nd, FileDef *fd,
if (fd || nd)
{
ol.startMemberHeader();
- parseDoc(ol,0,0,theTranslator->trFunctions());
+ parseText(ol,theTranslator->trFunctions());
ol.endMemberHeader();
ol.startMemberList();
}
@@ -873,6 +918,7 @@ void writeMemberDecs(OutputList &ol,ClassDef *cd,NamespaceDef *nd, FileDef *fd,
{
ol.startMemberItem();
ol.docify("class ");
+ ol.insertMemberAlign();
ol.writeObjectLink(0,0,md->anchor(),md->name());
ol.endMemberItem();
}
@@ -880,13 +926,15 @@ void writeMemberDecs(OutputList &ol,ClassDef *cd,NamespaceDef *nd, FileDef *fd,
{
ol.startMemberItem();
ol.docify("class ");
- ol.writeObjectLink(cd->getReference(),cd->classFile(),0,cd->name());
+ ol.insertMemberAlign();
+ ol.writeObjectLink(cd->getReference(),cd->getOutputFileBase(),0,cd->name());
ol.endMemberItem();
}
else if (!hideMemberFlag) // no documentation
{
ol.startMemberItem();
ol.docify("class ");
+ ol.insertMemberAlign();
ol.writeBoldString(md->name());
ol.endMemberItem();
}
@@ -901,7 +949,7 @@ void writeMemberDecs(OutputList &ol,ClassDef *cd,NamespaceDef *nd, FileDef *fd,
if (fd || nd)
{
ol.startMemberHeader();
- parseDoc(ol,0,0,theTranslator->trVariables());
+ parseText(ol,theTranslator->trVariables());
ol.endMemberHeader();
ol.startMemberList();
}
@@ -1109,11 +1157,11 @@ void writeMemberDocs(OutputList &ol,MemberList *ml,const char *scopeName,
{
ol.newParagraph();
ol.startBold();
- parseDoc(ol,0,0,theTranslator->trEnumerationValues());
+ parseText(ol,theTranslator->trEnumerationValues());
//ol.writeBoldString("Enumeration values:");
ol.docify(":");
ol.endBold();
- ol.startMemberList();
+ ol.startItemList();
}
ol.writeDoxyAnchor(cname,fmd->anchor(),fmd->name());
ol.addToIndex(fmd->name(),cname);
@@ -1141,7 +1189,7 @@ void writeMemberDocs(OutputList &ol,MemberList *ml,const char *scopeName,
fmd=fmdl->next();
}
}
- if (!first) { ol.endMemberList(); ol.writeChar('\n'); }
+ if (!first) { ol.endItemList(); ol.writeChar('\n'); }
}
MemberDef *bmd=md->reimplements();
@@ -1159,33 +1207,49 @@ void writeMemberDocs(OutputList &ol,MemberList *ml,const char *scopeName,
// write class that contains a member that is reimplemented by this one
ClassDef *bcd = bmd->memberClass();
ol.newParagraph();
- parseDoc(ol,0,0,theTranslator->trReimplementedFrom());
- //ol.writeString("Reimplemented from ");
- ol.docify(" ");
- if (bmd->hasDocumentation())
+ //parseText(ol,theTranslator->trReimplementedFrom());
+ //ol.docify(" ");
+
+ QString reimplFromLine = theTranslator->trReimplementedFromList(1);
+ int markerPos = reimplFromLine.find("@0");
+ if (markerPos!=-1) // should always pass this.
{
- ol.writeObjectLink(bcd->getReference(),bcd->classFile(),
- bmd->anchor(),bcd->name());
- if (
- !bcd->isReference() &&
- //(bcd->hasDocumentation() || !hideClassFlag) &&
- //(bcd->protection()!=Private || extractPrivateFlag)
- bcd->isVisible()
- /*&& bmd->detailsAreVisible()*/
- ) ol.writePageRef(bcd->name(),bmd->anchor());
+ parseText(ol,reimplFromLine.left(markerPos)); //text left from marker
+ if (bmd->hasDocumentation() &&
+ (bmd->protection()!=Private || extractPrivateFlag)
+ ) // replace marker with link
+ {
+ ol.writeObjectLink(bcd->getReference(),bcd->getOutputFileBase(),
+ bmd->anchor(),bcd->name());
+ if (
+ !bcd->isReference() &&
+ //(bcd->hasDocumentation() || !hideClassFlag) &&
+ //(bcd->protection()!=Private || extractPrivateFlag)
+ bcd->isVisible()
+ /*&& bmd->detailsAreVisible()*/
+ ) ol.writePageRef(bcd->name(),bmd->anchor());
+ }
+ else
+ {
+ ol.writeObjectLink(bcd->getReference(),bcd->getOutputFileBase(),
+ 0,bcd->name());
+ if (
+ !bcd->isReference() &&
+ //(bcd->hasDocumentation() || !hideClassFlag) &&
+ //(bcd->protection()!=Private || extractPrivateFlag)
+ bcd->isVisible()
+ ) ol.writePageRef(bcd->name(),0);
+ }
+ parseText(ol,reimplFromLine.right(
+ reimplFromLine.length()-markerPos-2)); // text right from marker
+
}
else
{
- ol.writeObjectLink(bcd->getReference(),bcd->classFile(),
- 0,bcd->name());
- if (
- !bcd->isReference() &&
- //(bcd->hasDocumentation() || !hideClassFlag) &&
- //(bcd->protection()!=Private || extractPrivateFlag)
- bcd->isVisible()
- ) ol.writePageRef(bcd->name(),0);
+ err("Error: translation error: no marker in trReimplementsFromList()\n");
}
- ol.writeString(".");
+
+ //ol.writeString(".");
}
MemberList *bml=md->reimplementedBy();
int count;
@@ -1193,16 +1257,53 @@ void writeMemberDocs(OutputList &ol,MemberList *ml,const char *scopeName,
{
// write the list of classes that overwrite this member
ol.newParagraph();
- parseDoc(ol,0,0,theTranslator->trReimplementedIn());
+ //parseText(ol,theTranslator->trReimplementedIn());
//ol.writeString("Reimplemented in ");
- ol.docify(" ");
+ //ol.docify(" ");
+
+ QString reimplInLine =
+ theTranslator->trReimplementedInList(bml->count());
+ QRegExp marker("@[0-9]+");
+ int index=0,newIndex,matchLen;
+ // now replace all markers in reimplInLine with links to the classes
+ while ((newIndex=marker.match(reimplInLine,index,&matchLen))!=-1)
+ {
+ parseText(ol,reimplInLine.mid(index,newIndex-index));
+ bool ok;
+ uint entryIndex = reimplInLine.mid(newIndex+1,matchLen-1).toUInt(&ok);
+ bmd=bml->at(entryIndex);
+ if (ok && bmd) // write link for marker
+ {
+ ClassDef *bcd = bmd->memberClass();
+ if (bmd->hasDocumentation() &&
+ (bmd->protection()!=Private || extractPrivateFlag)
+ )
+ {
+ ol.writeObjectLink(bcd->getReference(),bcd->getOutputFileBase(),
+ bmd->anchor(),bcd->name());
+ if (!bcd->isReference() && bcd->isVisible())
+ ol.writePageRef(bcd->name(),bmd->anchor());
+ }
+ else
+ {
+ ol.writeObjectLink(bcd->getReference(),bcd->getOutputFileBase(),
+ 0,bcd->name());
+ if (!bcd->isReference() && bcd->isVisible())
+ ol.writePageRef(bcd->name(),0);
+ }
+ }
+ index=newIndex+matchLen;
+ }
+ parseText(ol,reimplInLine.right(reimplInLine.length()-index));
+
+#if 0
bmd=bml->first();
while (bmd)
{
ClassDef *bcd = bmd->memberClass();
if (bmd->hasDocumentation())
{
- ol.writeObjectLink(bcd->getReference(),bcd->classFile(),
+ ol.writeObjectLink(bcd->getReference(),bcd->getOutputFileBase(),
bmd->anchor(),bcd->name());
if (
!bcd->isReference() &&
@@ -1214,7 +1315,7 @@ void writeMemberDocs(OutputList &ol,MemberList *ml,const char *scopeName,
}
else
{
- ol.writeObjectLink(bcd->getReference(),bcd->classFile(),
+ ol.writeObjectLink(bcd->getReference(),bcd->getOutputFileBase(),
0,bcd->name());
if (
!bcd->isReference() &&
@@ -1228,24 +1329,25 @@ void writeMemberDocs(OutputList &ol,MemberList *ml,const char *scopeName,
{
if (bml->at()==count-1)
//ol.writeString(" and ");
- parseDoc(ol,0,0," "+theTranslator->trAnd()+" ");
+ parseText(ol," "+theTranslator->trAnd()+" ");
else
ol.writeString(", ");
}
}
ol.writeString(".");
+#endif
}
// write the list of examples that use this member
if (md->hasExamples())
{
ol.startDescList();
ol.startBold();
- parseDoc(ol,0,0,theTranslator->trExamples()+": ");
+ parseText(ol,theTranslator->trExamples()+": ");
//ol.writeBoldString("Examples: ");
ol.endBold();
ol.endDescTitle();
ol.writeDescItem();
- md->writeExample(ol);
+ writeExample(ol,md->getExampleList());
//ol.endDescItem();
ol.endDescList();
}
@@ -1388,8 +1490,7 @@ static QString trimTemplateSpecifiers(const QString &className,const QString &s)
// removes the (one and only) occurrence of name:: from s.
static QString trimScope(const QString &name,const QString &s)
{
- int spos;
- spos=s.find(name+"::");
+ int spos=s.find(name+"::");
if (spos!=-1)
{
return s.left(spos)+s.right(s.length()-spos-name.length()-2);
@@ -1486,8 +1587,12 @@ bool matchArguments(ArgumentList *srcAl,ArgumentList *dstAl,
{
srcAType=trimScope(className,srcAType);
dstAType=trimScope(className,dstAType);
- ClassDef *cd=getClass(className);
- if (cd->baseClasses()->count()>0)
+ ClassDef *cd;
+ if (!namespaceName.isEmpty())
+ cd=getClass(namespaceName+"::"+className);
+ else
+ cd=getClass(className);
+ if (cd && cd->baseClasses()->count()>0)
{
srcAType=trimBaseClassScope(cd->baseClasses(),srcAType);
dstAType=trimBaseClassScope(cd->baseClasses(),dstAType);
@@ -1703,17 +1808,19 @@ void mergeArguments(ArgumentList *srcAl,ArgumentList *dstAl)
// returns TRUE if the class and member both could be found
bool getDefs(const QString &memberName,const QString &className,
- const char *args,MemberDef *&md, ClassDef *&cd, FileDef *&fd)
+ const char *args,
+ MemberDef *&md, ClassDef *&cd, FileDef *&fd,NamespaceDef *&nd)
{
//printf("Search for %s::%s %s\n",className.data(),memberName.data(),args);
- fd=0; md=0; cd=0;
+ fd=0, md=0, cd=0, nd=0;
if (memberName.length()==0) return FALSE;
MemberName *mn;
if ((mn=memberNameDict[memberName]) && className.length()>0)
{
//printf(" >member name found\n");
ClassDef *fcd=0;
- if ((fcd=getClass(className)))
+ //printf("className=%s\n",className.data());
+ if ((fcd=getClass(className)) && fcd->hasDocumentation())
{
//printf(" >member class found\n");
MemberDef *mmd=mn->first();
@@ -1744,7 +1851,6 @@ bool getDefs(const QString &memberName,const QString &className,
mdist=m;
cd=mcd;
md=mmd;
- fd=0;
}
}
if (argList)
@@ -1778,7 +1884,6 @@ bool getDefs(const QString &memberName,const QString &className,
mdist=m;
cd=mcd;
md=mmd;
- fd=0;
}
}
mmd=mn->next();
@@ -1788,11 +1893,28 @@ bool getDefs(const QString &memberName,const QString &className,
return mdist<maxInheritanceDepth;
}
}
- else // maybe an unrelated member ?
+ else // maybe an namespace or file member ?
{
MemberName *mn;
- if ((mn=functionNameDict[memberName]))
+ if ((mn=functionNameDict[memberName])) // name is known
{
+ NamespaceDef *fnd=0;
+ if (className.length()>0 && (fnd=namespaceDict[className]) &&
+ fnd->hasDocumentation())
+ { // inside a namespace
+ MemberDef *mmd=mn->first();
+ while (mmd)
+ {
+ if (mmd->getNamespace()==fnd && mmd->hasDocumentation())
+ { // namespace is found
+ nd=fnd;
+ md=mmd;
+ return TRUE;
+ }
+ mmd=mn->next();
+ }
+ }
+ // maybe a file member (e.g. global function or variable)
md=mn->first();
while (md)
{
@@ -1801,7 +1923,6 @@ bool getDefs(const QString &memberName,const QString &className,
fd=md->getFileDef();
if (fd && fd->hasDocumentation())
{
- cd=0;
return TRUE;
}
}
@@ -1828,12 +1949,18 @@ void generateClassRef(OutputList &ol,const char *clName,const char *linkTxt)
ol.docify(linkText);
return;
}
- ClassDef *cd;
+ ClassDef *cd=0;
+ NamespaceDef *nd=0;
if ((cd=getClass(className)) && cd->isVisible())
{
- ol.writeObjectLink(cd->getReference(),cd->classFile(),0,linkText);
+ ol.writeObjectLink(cd->getReference(),cd->getOutputFileBase(),0,linkText);
if (!cd->isReference()) ol.writePageRef(cd->name(),0);
}
+ else if ((nd=namespaceDict[className]) && nd->hasDocumentation())
+ {
+ ol.writeObjectLink(nd->getReference(),nd->getOutputFileBase(),0,linkText);
+ ol.writePageRef(nd->name(),0);
+ }
else
ol.docify(linkText);
}
@@ -1887,8 +2014,11 @@ void generateRef(OutputList &ol,const char *clName,
}
// extract scope
- QString scopeStr;
- if (scopePos>0) scopeStr=tmpName.left(scopePos); else scopeStr=clName;
+ QString scopeContext=clName;
+ QString scopeUser;
+ if (scopePos>0) scopeUser=tmpName.left(scopePos);
+
+ //printf("scopeContext=%s scopeUser=%s\n",scopeContext.data(),scopeUser.data());
// extract name
int startNamePos=scopePos!=-1 ? scopePos+2 : 0;
@@ -1898,96 +2028,115 @@ void generateRef(OutputList &ol,const char *clName,
// extract arguments
QString argsStr;
if (bracePos!=-1) argsStr=tmpName.right(tmpName.length()-bracePos);
-
- bool explicitLink=TRUE;
+
// create a default link text if none was explicitly given
+ bool explicitLink=TRUE;
if (linkText.isNull())
{
- if (!scopeStr.isNull() && scopePos>0) linkText=scopeStr+"::";
+ if (!scopeUser.isEmpty()) linkText=scopeUser+"::";
linkText+=nameStr;
explicitLink=FALSE;
}
-
//printf("scope=`%s' name=`%s' arg=`%s' linkText=`%s'\n",
// scopeStr.data(),nameStr.data(),argsStr.data(),linkText.data());
//Define *d=0;
- MemberDef *md;
- ClassDef *cd;
- FileDef *fd;
- // check if nameStr is a member or global.
- if (getDefs(nameStr,scopeStr,argsStr,md,cd,fd))
- {
- QString anchor = md->hasDocumentation() ? md->anchor() : 0;
- QString cName,aName;
- if (cd) // nameStr is a member of cd
- {
- //printf("addObjectLink(%s,%s,%s,%s)\n",cd->getReference(),
- // cd->classFile(),anchor.data(),resultName.stripWhiteSpace().data());
- ol.writeObjectLink(cd->getReference(),
- cd->classFile(),anchor,
- linkText.stripWhiteSpace());
- cName=cd->name();
- aName=md->anchor();
- }
- else if (fd) // nameStr is a global in file fd
- {
- //printf("addFileLink(%s,%s,%s)\n",fd->diskName(),anchor.data(),
- // resultName.stripWhiteSpace().data());
- ol.writeObjectLink(fd->getReference(),fd->diskName(),
- anchor, linkText.stripWhiteSpace());
- cName=fd->name();
- aName=md->anchor();
- }
- else // should not be reached
+ MemberDef *md = 0;
+ ClassDef *cd = 0;
+ FileDef *fd = 0;
+ NamespaceDef *nd = 0;
+ int scopeOffset=scopeContext.length();
+ do
+ {
+ QString totalScope=scopeUser.copy();
+ if (scopeOffset>0)
{
- //printf("add no link fd=cd=0\n");
- ol.docify(linkText);
+ if (!totalScope.isEmpty()) totalScope.prepend("::");
+ totalScope.prepend(scopeContext.left(scopeOffset));
}
-
- // for functions we add the arguments if explicitly specified or else "()"
- if (!rt && (md->isFunction() || md->isPrototype() || md->isSignal() || md->isSlot()))
+ //printf("Try with totalScope=`%s'\n",totalScope.data());
+ // check if nameStr is a member or global.
+ if (getDefs(nameStr,totalScope,argsStr,md,cd,fd,nd))
{
- if (argsStr.isNull())
- ol.writeString("()");
- else
- ol.docify(argsStr);
- }
-
- // generate the page reference (for LaTeX)
- if (cName.length()>0 || aName.length()>0)
- {
- if (/*md->detailsAreVisible() &&*/
- (
- (cd && !cd->isReference() &&
- // (cd->hasDocumentation() || !hideClassFlag) &&
- // (cd->protection()!=Private || extractPrivateFlag)
- cd->isVisible()
- ) ||
- (fd && !fd->isReference())
- )
- ) ol.writePageRef(cName,aName);
+ QString anchor = md->hasDocumentation() ? md->anchor() : 0;
+ QString cName,aName;
+ if (cd) // nameStr is a member of cd
+ {
+ //printf("addObjectLink(%s,%s,%s,%s)\n",cd->getReference(),
+ // cd->getOutputFileBase(),anchor.data(),resultName.stripWhiteSpace().data());
+ ol.writeObjectLink(cd->getReference(),cd->getOutputFileBase(),
+ anchor,linkText.stripWhiteSpace());
+ cName=cd->name();
+ aName=md->anchor();
+ }
+ else if (nd) // nameStr is a member of nd
+ {
+ ol.writeObjectLink(nd->getReference(),nd->getOutputFileBase(),
+ anchor,linkText.stripWhiteSpace());
+ cName=nd->name();
+ aName=md->anchor();
+ }
+ else if (fd) // nameStr is a global in file fd
+ {
+ //printf("addFileLink(%s,%s,%s)\n",fd->getOutputFileBase(),anchor.data(),
+ // resultName.stripWhiteSpace().data());
+ ol.writeObjectLink(fd->getReference(),fd->getOutputFileBase(),
+ anchor,linkText.stripWhiteSpace());
+ cName=fd->name();
+ aName=md->anchor();
+ }
+ else // should not be reached
+ {
+ //printf("add no link fd=cd=0\n");
+ ol.docify(linkText);
+ }
+
+ // for functions we add the arguments if explicitly specified or else "()"
+ if (!rt && (md->isFunction() || md->isPrototype() || md->isSignal() || md->isSlot()))
+ {
+ if (argsStr.isNull())
+ ol.writeString("()");
+ else
+ ol.docify(argsStr);
+ }
+
+ // generate the page reference (for LaTeX)
+ if (cName.length()>0 || aName.length()>0)
+ {
+ if (
+ (cd && !cd->isReference() && cd->isVisible()) ||
+ (fd && !fd->isReference()) ||
+ (nd /* TODO: && !nd->isReference() */)
+ )
+ {
+ ol.writePageRef(cName,aName);
+ }
+ }
+ return;
}
- }
-// else if (!nameStr.isNull() && (d=defineDict[nameStr]))
-// // check if nameStr is perhaps a define
-// {
-// if (d->hasDocumentation() && d->fileDef)
-// {
-// ol.writeObjectLink(0,d->fileDef->diskName(),d->anchor,
-// linkText.stripWhiteSpace());
-// if (!explicitLink) ol.docify(argsStr);
-// }
-// }
- else // nameStr is a false alarm or a typo.
+ // else if (!nameStr.isNull() && (d=defineDict[nameStr]))
+ // // check if nameStr is perhaps a define
+ // {
+ // if (d->hasDocumentation() && d->fileDef)
+ // {
+ // ol.writeObjectLink(0,d->fileDef->getOutputFileBase(),d->anchor,
+ // linkText.stripWhiteSpace());
+ // if (!explicitLink) ol.docify(argsStr);
+ // }
+ // }
+ if (scopeOffset==0)
+ scopeOffset=-1;
+ else if ((scopeOffset=scopeContext.findRev("::",scopeOffset-1))==-1)
+ scopeOffset=0;
+ } while (scopeOffset>=0);
+
+ // nothing found
+ if (rt)
+ ol.docify(rt);
+ else
{
- if (rt)
- ol.docify(rt);
- else
- {
- ol.docify(linkText);
- if (!argsStr.isNull()) ol.docify(argsStr);
- }
+ ol.docify(linkText);
+ if (!argsStr.isNull()) ol.docify(argsStr);
}
return;
}
@@ -2016,7 +2165,7 @@ void generateLink(OutputList &ol,const char *clName,
else if ((fd=findFileDef(&inputNameDict,linkRef,ambig))
&& fd->hasDocumentation())
// link to documented input file
- ol.writeObjectLink(fd->getReference(),fd->diskName(),0,lt);
+ ol.writeObjectLink(fd->getReference(),fd->getOutputFileBase(),0,lt);
else // probably a class or member reference
generateRef(ol,clName,lr,inSeeBlock,lt);
}
@@ -2030,7 +2179,7 @@ void generateFileRef(OutputList &ol,const char *name,const char *text)
if ((fd=findFileDef(&inputNameDict,name,ambig)) &&
fd->hasDocumentation())
// link to documented input file
- ol.writeObjectLink(fd->getReference(),fd->diskName(),0,linkText);
+ ol.writeObjectLink(fd->getReference(),fd->getOutputFileBase(),0,linkText);
else
ol.docify(linkText);
}
@@ -2172,3 +2321,17 @@ void showFileDefMatches(const FileNameDict *fnDict,const char *n)
}
}
+//----------------------------------------------------------------------
+
+void setFileNameForSections(QList<QString> *anchorList,const char *fileName)
+{
+ if (!anchorList) return;
+ QString *s=anchorList->first();
+ while (s)
+ {
+ SectionInfo *si;
+ if (!s->isEmpty() && (si=sectionDict[*s])) si->fileName=fileName;
+ s=anchorList->next();
+ }
+}
+
diff --git a/src/util.h b/src/util.h
index 9dfd097..a6481cc 100644
--- a/src/util.h
+++ b/src/util.h
@@ -46,7 +46,8 @@ extern QString dateToString(bool);
//extern OutputList linkifyText(const char *clName,const char *name,
// const char *text);
extern bool getDefs(const QString &memberName,const QString &className,
- const char *, MemberDef *&md, ClassDef *&cd,FileDef *&fd);
+ const char *, MemberDef *&md, ClassDef *&cd,FileDef *&fd,
+ NamespaceDef *&nd);
extern void generateRef(OutputList &ol,const char *,
const char *,bool inSeeBlock,const char * =0);
extern void generateLink(OutputList &ol,const char *,
@@ -78,5 +79,8 @@ void startFile(OutputList &ol,const char *name,
void endFile(OutputList &ol,bool external=FALSE);
void writeQuickLinks(OutputList &ol,bool compact,bool external=FALSE);
QString argListToString(ArgumentList *al);
+QString generateMarker(int id);
+void writeExample(OutputList &ol,ExampleList *el);
+void setFileNameForSections(QList<QString> *anchorList,const char *fileName);
#endif