diff options
author | dimitri <dimitri@afe2bf4a-e733-0410-8a33-86f594647bc7> | 2001-03-11 19:23:58 (GMT) |
---|---|---|
committer | dimitri <dimitri@afe2bf4a-e733-0410-8a33-86f594647bc7> | 2001-03-11 19:23:58 (GMT) |
commit | f280bea9dedf210e59b80f486bb016e348a387a6 (patch) | |
tree | f24fc61bb67f6c2a6757d0317c8493af462e5f9d /src | |
parent | 6b40e3de857d42921d0e6b736d9768d95e948da9 (diff) | |
download | Doxygen-f280bea9dedf210e59b80f486bb016e348a387a6.zip Doxygen-f280bea9dedf210e59b80f486bb016e348a387a6.tar.gz Doxygen-f280bea9dedf210e59b80f486bb016e348a387a6.tar.bz2 |
Release-1.2.6
Diffstat (limited to 'src')
-rw-r--r-- | src/classdef.cpp | 26 | ||||
-rw-r--r-- | src/classdef.h | 160 | ||||
-rw-r--r-- | src/diagram.cpp | 4 | ||||
-rw-r--r-- | src/doc.l | 33 | ||||
-rw-r--r-- | src/dot.cpp | 12 | ||||
-rw-r--r-- | src/doxygen.cpp | 26 | ||||
-rw-r--r-- | src/doxysearch.cpp | 8 | ||||
-rw-r--r-- | src/doxytag.l | 5 | ||||
-rw-r--r-- | src/htmlgen.cpp | 10 | ||||
-rw-r--r-- | src/htmlgen.h | 4 | ||||
-rw-r--r-- | src/index.cpp | 18 | ||||
-rw-r--r-- | src/latexgen.cpp | 374 | ||||
-rw-r--r-- | src/latexgen.h | 13 | ||||
-rw-r--r-- | src/mangen.cpp | 7 | ||||
-rw-r--r-- | src/mangen.h | 5 | ||||
-rw-r--r-- | src/outputgen.h | 14 | ||||
-rw-r--r-- | src/outputlist.h | 8 | ||||
-rw-r--r-- | src/packagedef.cpp | 3 | ||||
-rw-r--r-- | src/packagedef.h | 2 | ||||
-rw-r--r-- | src/rtfgen.cpp | 31 | ||||
-rw-r--r-- | src/rtfgen.h | 4 | ||||
-rw-r--r-- | src/scanner.l | 24 | ||||
-rw-r--r-- | src/tagreader.cpp | 53 | ||||
-rw-r--r-- | src/translator.h | 26 | ||||
-rw-r--r-- | src/translator_de.h | 8 | ||||
-rw-r--r-- | src/translator_fr.h | 6 |
26 files changed, 565 insertions, 319 deletions
diff --git a/src/classdef.cpp b/src/classdef.cpp index a84d03f..b335af7 100644 --- a/src/classdef.cpp +++ b/src/classdef.cpp @@ -138,11 +138,11 @@ void ClassDef::insertBaseClass(ClassDef *cd,const char *n,Protection p, inherits->append(new BaseClassDef(cd,n,p,s,t)); } -// inserts a super class in the inherited list -void ClassDef::insertSuperClass(ClassDef *cd,Protection p, +// inserts a sub class in the inherited list +void ClassDef::insertSubClass(ClassDef *cd,Protection p, Specifier s,const char *t) { - //printf("*** insert super class %s into %s\n",cd->name().data(),name().data()); + //printf("*** insert sub class %s into %s\n",cd->name().data(),name().data()); inheritedBy->inSort(new BaseClassDef(cd,0,p,s,t)); } @@ -732,7 +732,7 @@ void ClassDef::writeDocumentation(OutputList &ol) if (Config::classDiagramFlag) ol.disableAllBut(OutputGenerator::Man); - // write superclasses + // write subclasses int count; if ((count=inherits->count())>0) { @@ -856,7 +856,9 @@ void ClassDef::writeDocumentation(OutputList &ol) ol.pushGeneratorState(); ol.disableAllBut(OutputGenerator::Html); ol.writeString("<center><font size=\"2\">["); - ol.writeHtmlLink("graph_legend.html",theTranslator->trLegend()); + ol.startHtmlLink("graph_legend.html"); + ol.docify(theTranslator->trLegend()); + ol.endHtmlLink(); ol.writeString("]</font></center>"); ol.popGeneratorState(); } @@ -889,7 +891,9 @@ void ClassDef::writeDocumentation(OutputList &ol) ol.pushGeneratorState(); ol.disableAllBut(OutputGenerator::Html); ol.writeString("<center><font size=\"2\">["); - ol.writeHtmlLink("graph_legend.html",theTranslator->trLegend()); + ol.startHtmlLink("graph_legend.html"); + ol.docify(theTranslator->trLegend()); + ol.endHtmlLink(); ol.writeString("]</font></center>"); ol.popGeneratorState(); } @@ -1465,7 +1469,7 @@ bool ClassDef::isLinkableInProject() /*! the class is visible in a class diagram, or class hierarchy */ bool ClassDef::isVisibleInHierarchy() -{ return // show all classes or a superclass is visible +{ return // show all classes or a subclass is visible (Config::allExtFlag || hasNonReferenceSuperClass()) && // and not an annonymous compound name().find('@')==-1 && @@ -1501,7 +1505,7 @@ bool ClassDef::isBaseClass(ClassDef *bcd) /*! * recusively merges the `all members' lists of a class base * with that of this class. Must only be called for classes without - * superclasses! + * subclasses! */ void ClassDef::mergeMembers() @@ -1527,7 +1531,7 @@ void ClassDef::mergeMembers() MemberNameInfo *dstMni; if ((dstMni=dstMnd->find(srcMni->memberName()))) // a member with that name is already in the class. - // the member may hide or reimplement the one in the super class + // the member may hide or reimplement the one in the sub class // or there may be another path to the base class that is already // visited via another branch in the class hierarchy. { @@ -1643,13 +1647,13 @@ void ClassDef::mergeMembers() } } } - else // base class has a member that is not in the super class => copy + else // base class has a member that is not in the sub class => copy { // create a deep copy of the list (only the MemberInfo's will be // copied, not the actual MemberDef's) MemberNameInfo *newMni = new MemberNameInfo(srcMni->memberName()); - // copy the member(s) from the base to the super class + // copy the member(s) from the base to the sub class MemberNameInfoIterator mnii(*srcMni); MemberInfo *mi; for (;(mi=mnii.current());++mnii) diff --git a/src/classdef.h b/src/classdef.h index 12cf575..c02fd89 100644 --- a/src/classdef.h +++ b/src/classdef.h @@ -48,92 +48,118 @@ struct IncludeInfo; /*! \brief This class contains all information about a compound. * - * A compound can be a class, struct, union, interface, or exception + * A compound can be a class, struct, union, interface, or exception. + * \note This class should be renamed to CompoundDef */ class ClassDef : public Definition { public: + /*! \name Public API + * \{ + */ + + /*! The various compound types */ enum CompoundType { Class=Entry::CLASS_SEC, Struct=Entry::STRUCT_SEC, Union=Entry::UNION_SEC, Interface=Entry::INTERFACE_SEC, Exception=Entry::EXCEPTION_SEC }; - ClassDef(const char *fileName,int startLine, - const char *name,CompoundType ct, - const char *ref=0,const char *fName=0); - ~ClassDef(); DefType definitionType() { return TypeClass; } QCString getOutputFileBase() const { return fileName; } + + /*! Returns the name as it is appears in the documentation */ QCString displayName() const; + + /*! Returns the type of compound this is */ CompoundType compoundType() const { return compType; } + + /*! Returns the type of compound as a string */ QCString compoundTypeString() const; - void insertBaseClass(ClassDef *,const char *name,Protection p,Specifier s,const char *t=0); + + /*! Returns the list of base classes from which this class directly + * inherits. + */ BaseClassList *baseClasses() { return inherits; } - void insertSuperClass(ClassDef *,Protection p,Specifier s,const char *t=0); - BaseClassList *superClasses() { return inheritedBy; } - void setIncludeFile(FileDef *fd,const char *incName,bool local); + + /*! Returns the list of sub classes that directly inherit from this class + */ + BaseClassList *subClasses() { return inheritedBy; } + + /*! Returns a list of all members. This includes any inherited members. + * Members are sorted alphabetically. + */ MemberNameInfoList *memberNameInfoList() { return allMemberNameInfoList; } + + /*! Returns a dictionary of all members. This includes any inherited + * members. Members are sorted alphabetically. + */ MemberNameInfoDict *memberNameInfoDict() { return allMemberNameInfoDict; } - void insertMember(MemberDef *); - void insertUsedFile(const char *); - void computeAnchors(); - void computeMemberGroups(); - void setAnchor(MemberDef *); - void dumpMembers(); + void writeDocumentation(OutputList &ol); void writeMemberList(OutputList &ol); void writeDeclaration(OutputList &ol,MemberDef *md,bool inGroup); - bool addExample(const char *anchor,const char *name, const char *file); - bool hasExamples(); - void setProtection(Protection p) { prot=p; } + + /*! Return the protection level (Public,Protected,Private) in which + * this compound was found. + */ Protection protection() const { return prot; } + + /*! returns TRUE iff a link is possible to an item within this project. + */ bool isLinkableInProject(); - /*! a link to this class is possible (either within this project, - * or as a cross-reference to another project + + /*! return TRUE iff a link to this class is possible (either within + * this project, or as a cross-reference to another project). */ bool isLinkable() { return isLinkableInProject() || isReference(); } - bool hasNonReferenceSuperClass(); + /*! the class is visible in a class diagram, or class hierarchy */ bool isVisibleInHierarchy(); - // template argument functions + /*! Returns the template arguments of this class + * Will return 0 if not applicable. + */ ArgumentList *templateArguments() const { return tempArgs; } + + /*! Returns the template arguments that this nested class "inherits" + * from its outer class (doxygen assumes there is only one!). + * Will return 0 if not applicable. + */ ArgumentList *outerTemplateArguments() const; - void setTemplateArguments(ArgumentList *al); - //QCString getTemplateNameString(); + /*! Returns the namespace this compound is in, or 0 if it has a global + * scope. + */ NamespaceDef *getNamespaceDef() { return nspace; } - FileDef *getFileDef() const { return fileDef; } + + /*! Returns the file in which this compound's definition can be found. + * Should not return 0 (but it might be a good idea to check anyway). + */ + FileDef *getFileDef() const { return fileDef; } + + /*! Returns the Java package this class is in or 0 if not applicable. + */ + PackageDef *packageDef() const; - void setNamespace(NamespaceDef *nd) { nspace = nd; } - void setFileDef(FileDef *fd) { fileDef=fd; } - void mergeMembers(); + /*! Returns TRUE iff \a bcd is a direct or indirect base class of this + * class. This function will recusively traverse all branches of the + * inheritance tree. + */ bool isBaseClass(ClassDef *bcd); - void determineImplUsageRelation(); - void determineIntfUsageRelation(); + UsesClassDict *usedImplementationClasses() const { return usesImplClassDict; } + UsesClassDict *usedInterfaceClasses() const { return usesIntfClassDict; } - void setSubGrouping(bool enabled) { subGrouping = enabled; } - - bool visited; - - void addMembersToMemberGroup(); - void distributeMemberGroupDocumentation(); - - //void generateXML(QTextStream &t); - //void generateXMLSection(QTextStream &t,MemberList *ml,const char *type); - - PackageDef *packageDef() const; /* member lists by protection */ MemberList pubMembers; @@ -170,9 +196,60 @@ class ClassDef : public Definition MemberList variableMembers; MemberList propertyMembers; + /*! \} */ + + /*! \name Doxygen internal API + * \{ + */ + void insertBaseClass(ClassDef *,const char *name,Protection p,Specifier s,const char *t=0); + void insertSubClass(ClassDef *,Protection p,Specifier s,const char *t=0); + void setIncludeFile(FileDef *fd,const char *incName,bool local); + void insertMember(MemberDef *); + void insertUsedFile(const char *); + void computeAnchors(); + void computeMemberGroups(); + void setAnchor(MemberDef *); + void dumpMembers(); + bool addExample(const char *anchor,const char *name, const char *file); + void addMembersToMemberGroup(); + void distributeMemberGroupDocumentation(); + void setNamespace(NamespaceDef *nd) { nspace = nd; } + void setTemplateArguments(ArgumentList *al); + void mergeMembers(); + void setFileDef(FileDef *fd) { fileDef=fd; } + void determineImplUsageRelation(); + void determineIntfUsageRelation(); + void setSubGrouping(bool enabled) { subGrouping = enabled; } + void setProtection(Protection p) { prot=p; } + + /*! Creates a new compound definition. + * \param fileName full path and file name in which this compound was + * found. + * \param startLine line number where the definition of this compound + * starts. + * \param name the name of this compound (including scope) + * \param ct the kind of Compound + * \param ref the tag file from which this compound is extracted + * or 0 if the compound doesn't come from a tag file + * \param fName the file name as found in the tag file. + * This overwrites the file that doxygen normally + * generates based on the compound type & name. + */ + ClassDef(const char *fileName,int startLine, + const char *name,CompoundType ct, + const char *ref=0,const char *fName=0); + /*! Destroys a compound definition. */ + ~ClassDef(); + + bool visited; + protected: void addUsedInterfaceClasses(MemberDef *md,const char *typeStr); void addMemberListToGroup(MemberList *); + bool hasExamples(); + bool hasNonReferenceSuperClass(); + + /*! \} */ private: QCString fileName; // HTML containing the class docs @@ -184,7 +261,6 @@ class ClassDef : public Definition BaseClassList *inheritedBy; NamespaceDef *nspace; // the namespace this class is in - /* user defined member groups */ MemberGroupList *memberGroupList; MemberGroupDict *memberGroupDict; diff --git a/src/diagram.cpp b/src/diagram.cpp index a499097..681fc89 100644 --- a/src/diagram.cpp +++ b/src/diagram.cpp @@ -249,8 +249,8 @@ void DiagramRow::insertClass(DiagramItem *parent,ClassDef *cd,bool doBases, if (parent) parent->addChild(di); di->move(count()*gridWidth,level*gridHeight); append(di); - BaseClassList *bcl=doBases ? cd->baseClasses() : cd->superClasses(); - /* there are base/super classes */ + BaseClassList *bcl=doBases ? cd->baseClasses() : cd->subClasses(); + /* there are base/sub classes */ int count=0; BaseClassDef *bcd=bcl->first(); while (bcd) @@ -88,6 +88,7 @@ static bool inWarningBlock; static bool inRemarkBlock; static bool inAttentionBlock; static bool inParBlock; +static bool insideHtmlLink; static QCString sectionRef; static bool insideVerbatim = FALSE; static bool insidePre = FALSE; @@ -134,6 +135,7 @@ static void initParser() inRemarkBlock = FALSE; inAttentionBlock = FALSE; inParBlock = FALSE; + insideHtmlLink = FALSE; } //----------------------------------------------------------------------------- @@ -840,8 +842,7 @@ OPMASK ({B}*{OPNORM}({OPARG}?))|({OPCAST}{OPARG}) %x DocDontInclude %x DocHtmlLink %x DocHtmlAnchor -%x DocHtmlHref1 -%x DocHtmlHref2 +%x DocHtmlHref %x DocSkiplineKey %x DocSkipKey %x DocLineKey @@ -889,6 +890,7 @@ OPMASK ({B}*{OPNORM}({OPARG}?))|({OPCAST}{OPARG}) <DocScan,Text>"&"[AEIOUaeiou]"circ;" { outDoc->writeCirc(yytext[1]); } <DocScan,Text>"&"[ANOano]"tilde;" { outDoc->writeTilde(yytext[1]); } <DocScan,Text>"ß" { outDoc->writeSharpS(); } +<DocScan,Text>"&"[cC]"cedil;" { outDoc->writeCCedil(yytext[1]); } <DocScan,Text>"&[aA]ring;" { outDoc->writeRing(yytext[1]); } <DocScan,DocHtmlScan,DocLatexScan>"$("[a-z_A-Z]+")" { QCString envvar=&yytext[2]; @@ -1784,7 +1786,10 @@ OPMASK ({B}*{OPNORM}({OPARG}?))|({OPCAST}{OPARG}) removeRedundantWhiteSpace(oName),inSeeBlock); BEGIN(DocScan); } -<DocScan>("http:"|"https:"|"ftp:"|"file:"){URLMASK} { outDoc->writeHtmlLink(yytext,yytext); } +<DocScan>("http:"|"https:"|"ftp:"|"file:"){URLMASK} { outDoc->startHtmlLink(yytext); + outDoc->docify(yytext); + outDoc->endHtmlLink(); + } <DocScan>[a-zA-Z_0-9\.\-]+"@"[0-9a-z_A-Z\.\-]+ { outDoc->writeMailLink(yytext); } <DocScan>{FILESCHAR}*{FILEECHAR}+/".\\n" { // special exception that is otherwise matches by FILEMASK generateRef(*outDoc,className,yytext,inSeeBlock); @@ -2036,7 +2041,12 @@ OPMASK ({B}*{OPNORM}({OPARG}?))|({OPCAST}{OPARG}) <DocScan>"<"{BR}{ATTR}">" { outDoc->lineBreak(); } <DocScan>"<"{I}{ATTR}">" { outDoc->startEmphasis(); } <DocScan>"</"{I}{ATTR}">" { outDoc->endEmphasis(); } -<DocScan>"</"{A}{ATTR}">" +<DocScan>"</"{A}{ATTR}">" { if (insideHtmlLink) + { + outDoc->endHtmlLink(); + insideHtmlLink=FALSE; + } + } <DocScan>"<"{A} { BEGIN(DocHtmlLink); } <DocScan>"<"{BOLD}{ATTR}">" { outDoc->startBold(); } <DocScan>"</"{BOLD}{ATTR}">" { outDoc->endBold(); } @@ -2055,16 +2065,15 @@ OPMASK ({B}*{OPNORM}({OPARG}?))|({OPCAST}{OPARG}) <DocHtmlLink>{HREF}{BN}*"="{BN}*("\""?) { htmlUrl.resize(0); htmlText.resize(0); - BEGIN(DocHtmlHref1); } -<DocHtmlHref1>{URLMASK} { + BEGIN(DocHtmlHref); + } +<DocHtmlHref>{URLMASK} { htmlUrl=yytext; } -<DocHtmlHref1>">" { BEGIN(DocHtmlHref2); } -<DocHtmlHref2>[^<]* { htmlText+=yytext; } -<DocHtmlHref2>"<" { - outDoc->writeHtmlLink(htmlUrl,htmlText); - unput(*yytext); - BEGIN(DocScan); +<DocHtmlHref>">" { + outDoc->startHtmlLink(htmlUrl); + insideHtmlLink=TRUE; + BEGIN(DocScan); } <DocHtmlLink,DocHtmlAnchor>">" { BEGIN(DocScan); } <DocScan>{CMD}("\\"|"@"|"<"|">"|"&"|"$"|"#"|"%") { diff --git a/src/dot.cpp b/src/dot.cpp index 7b3309c..f060f88 100644 --- a/src/dot.cpp +++ b/src/dot.cpp @@ -154,7 +154,7 @@ static bool readBoundingBoxEPS(const char *fileName,int *width,int *height) */ static bool isLeaf(ClassDef *cd) { - BaseClassList *bcl = cd->superClasses(); + BaseClassList *bcl = cd->subClasses(); if (bcl->count()>0) // class has children, check their visibility { BaseClassListIterator bcli(*bcl); @@ -613,7 +613,7 @@ void DotGfxHierarchyTable::writeGraph(QTextStream &out,const char *path) void DotGfxHierarchyTable::addHierarchy(DotNode *n,ClassDef *cd,bool hideSuper) { //printf("addHierarchy `%s' baseClasses=%d\n",cd->name().data(),cd->baseClasses()->count()); - BaseClassListIterator bcli(*cd->superClasses()); + BaseClassListIterator bcli(*cd->subClasses()); BaseClassDef *bcd; for ( ; (bcd=bcli.current()) ; ++bcli ) { @@ -673,7 +673,7 @@ void DotGfxHierarchyTable::addHierarchy(DotNode *n,ClassDef *cd,bool hideSuper) bn->addParent(n); m_usedNodes->insert(bClass->name(),bn); // add node to the used list } - if (!bClass->visited && !hideSuper && bClass->superClasses()->count()>0) + if (!bClass->visited && !hideSuper && bClass->subClasses()->count()>0) { bool wasVisited=bClass->visited; bClass->visited=TRUE; @@ -698,7 +698,7 @@ DotGfxHierarchyTable::DotGfxHierarchyTable() ClassDef *cd; for (cli.toLast();(cd=cli.current());--cli) { - //printf("Trying %s superClasses=%d\n",cd->name().data(),cd->superClasses()->count()); + //printf("Trying %s subClasses=%d\n",cd->name().data(),cd->subClasses()->count()); if (!hasVisibleRoot(cd->baseClasses())) { if (cd->isVisibleInHierarchy()) // root class in the graph @@ -715,7 +715,7 @@ DotGfxHierarchyTable::DotGfxHierarchyTable() //m_usedNodes->clear(); m_usedNodes->insert(cd->name(),n); m_rootNodes->insert(0,n); - if (!cd->visited && cd->superClasses()->count()>0) + if (!cd->visited && cd->subClasses()->count()>0) { addHierarchy(n,cd,cd->visited); cd->visited=TRUE; @@ -846,7 +846,7 @@ void DotClassGraph::addClass(ClassDef *cd,DotNode *n,int prot, void DotClassGraph::buildGraph(ClassDef *cd,DotNode *n,int distance,bool base) { - BaseClassListIterator bcli(base ? *cd->baseClasses() : *cd->superClasses()); + BaseClassListIterator bcli(base ? *cd->baseClasses() : *cd->subClasses()); BaseClassDef *bcd; for ( ; (bcd=bcli.current()) ; ++bcli ) { diff --git a/src/doxygen.cpp b/src/doxygen.cpp index dc95b83..3098a0a 100644 --- a/src/doxygen.cpp +++ b/src/doxygen.cpp @@ -732,6 +732,7 @@ static void buildClassList(Entry *root) cd->setTemplateArguments(root->tArgList); cd->setProtection(root->protection); cd->addSectionsToDefinition(root->anchors); + // file definition containing the class cd cd->setBodySegment(root->bodyLine,root->endBodyLine); cd->setBodyDef(fd); @@ -1541,8 +1542,8 @@ void buildVarList(Entry *root) { if (!pScope.isEmpty() && (pcd=getClass(pScope))) { - Protection p = (Protection)QMAX((int)root->protection,(int)cd->protection()); - md=addVariableToClass(root,pcd,mtype,pScope,name,TRUE,indentDepth,0,p); + //Protection p = (Protection)QMAX((int)root->protection,(int)cd->protection()); + md=addVariableToClass(root,pcd,mtype,pScope,name,TRUE,indentDepth,0,root->protection); } else // annonymous scope inside namespace or file => put variable in the global scope { @@ -2379,7 +2380,7 @@ static bool findBaseClassRelation(Entry *root,ClassDef *cd, if (baseClassIsTypeDef) usedName=bi->name; cd->insertBaseClass(baseClass,usedName,bi->prot,bi->virt,templSpec); // add this class as super class to the base class - baseClass->insertSuperClass(cd,bi->prot,bi->virt,templSpec); + baseClass->insertSubClass(cd,bi->prot,bi->virt,templSpec); return TRUE; } else if (scopeOffset==0 && insertUndocumented) @@ -2393,7 +2394,7 @@ static bool findBaseClassRelation(Entry *root,ClassDef *cd, // add base class to this class cd->insertBaseClass(baseClass,bi->name,bi->prot,bi->virt,templSpec); // add this class as super class to the base class - baseClass->insertSuperClass(cd,bi->prot,bi->virt,templSpec); + baseClass->insertSubClass(cd,bi->prot,bi->virt,templSpec); // the undocumented base was found in this file baseClass->insertUsedFile(root->fileName); // add class to the list @@ -2586,8 +2587,8 @@ static void addTodoTestBugReferences() Definition *d=md->getClassDef(); QCString scopeName; if (d) scopeName=d->name(); - if (d==0) d=md->getFileDef(); if (d==0) d=md->getGroupDef(); + if (d==0) d=md->getFileDef(); // TODO: i18n this QCString memLabel="member"; if (Config::optimizeForCFlag) memLabel="field"; @@ -2607,8 +2608,8 @@ static void addTodoTestBugReferences() Definition *d=md->getNamespaceDef(); QCString scopeName; if (d) scopeName=d->name(); - if (d==0) d=md->getBodyDef(); if (d==0) d=md->getGroupDef(); + if (d==0) d=md->getFileDef(); // TODO: i18n this QCString memLabel="member"; if (Config::optimizeForCFlag) memLabel="global"; @@ -3348,7 +3349,7 @@ static void findMember(Entry *root,QCString funcDecl,QCString related,bool overl " related=`%s'\n" " exceptions=`%s'\n" " isRelated=%d\n" - " isFiend=%d\n" + " isFriend=%d\n" " isFunc=%d\n\n", namespaceName.data(),className.data(),classTempList.data(), funcType.data(),funcName.data(),funcArgs.data(),funcTempList.data(), @@ -4298,7 +4299,7 @@ static void buildCompleteMemberLists() for (cli.toFirst();(cd=cli.current());++cli) { if (!cd->isReference() && // not an external class - cd->superClasses()->count()==0 && // is a root of the hierarchy + cd->subClasses()->count()==0 && // is a root of the hierarchy cd->baseClasses()->count()>0) // and has at least one base class { cd->mergeMembers(); @@ -4792,7 +4793,12 @@ static void buildPackageList(Entry *root) PackageDef *pd=0; if (!root->name.isEmpty() && (pd=Doxygen::packageDict.find(root->name))==0) { - pd = new PackageDef(root->fileName,root->startLine,root->name); + QCString tagName; + if (root->tagInfo) + { + tagName=root->tagInfo->tagName; + } + pd = new PackageDef(root->fileName,root->startLine,root->name,tagName); Doxygen::packageDict.inSort(root->name,pd); } if (pd) @@ -6207,7 +6213,9 @@ void generateOutput() * Check/create output directorties * **************************************************************************/ if (Config::outputDir.isEmpty()) + { Config::outputDir=QDir::currentDirPath(); + } else { QDir dir(Config::outputDir); diff --git a/src/doxysearch.cpp b/src/doxysearch.cpp index ddbdedd..c4e69b3 100644 --- a/src/doxysearch.cpp +++ b/src/doxysearch.cpp @@ -509,7 +509,7 @@ void generateResults(SearchResults *sr) "</center></td></tr>\n",page+1,numPages); printf(" <tr bgcolor=#ffffff>\n" " <td colspan=2>\n" - " <dl compact>\n"); + " <table border=\"0\" cellspacing=\"2\" cellpadding=\"2\">\n"); int i; for (i=0 ; i < resultCount && pageEntries > 0; i++) { @@ -526,8 +526,8 @@ void generateResults(SearchResults *sr) readString(f,htmlName,MAXSTRLEN); int rank=(int)(d->rank*100+0.5); if (rank==0) rank++; - printf(" <dt><b><font color=#%2x00%2x>%d</font></b>" - "<dd><a href=\"%s/%s\">%s</a>\n", + printf(" <tr><td align=\"right\"><b><font color=#%2x00%2x>%d</font></b>" + "</td><td><a href=\"%s/%s\">%s</a></td></tr>\n", rank*2+55, 255-rank*2, rank, d->fileInfo->url, htmlName, linkName); pageEntries--; @@ -537,7 +537,7 @@ void generateResults(SearchResults *sr) skipEntries--; } } - printf(" </dl>\n" + printf(" </table>\n" " </td>\n" " </tr>\n" " <tr><td colspan=2 bgcolor=\"#4040c0\"><center> "); diff --git a/src/doxytag.l b/src/doxytag.l index e2f3a55..95e7cbe 100644 --- a/src/doxytag.l +++ b/src/doxytag.l @@ -287,7 +287,10 @@ QCString unhtmlify(const char *str) <SearchRefName>"\" doxytag=\"" { BEGIN( ReadRefName ); } -<SearchRefName>"\"></a>" { +<SearchRefName>"\"></a><a" { // HACK: avoid finding links in code fragments + BEGIN( Start ); + } +<SearchRefName>"\"></a>" { // HACK: deal with Qt code if (nameBug) BEGIN( Start ); else diff --git a/src/htmlgen.cpp b/src/htmlgen.cpp index a0a46d7..7955af7 100644 --- a/src/htmlgen.cpp +++ b/src/htmlgen.cpp @@ -171,8 +171,7 @@ void HtmlGenerator::startFile(const char *name,const char *title,bool external) { t << substituteKeywords(g_header,lastTitle); } - t << "<!-- Generated by Doxygen " << versionString << " on " - << dateToString(TRUE) << " -->" << endl; + t << "<!-- Generated by Doxygen " << versionString << " -->" << endl; } void HtmlGenerator::startQuickIndexItem(const char *s,const char *l) @@ -436,14 +435,17 @@ void HtmlGenerator::endTextLink() t << "</a>"; } -void HtmlGenerator::writeHtmlLink(const char *url,const char *text) +void HtmlGenerator::startHtmlLink(const char *url) { t << "<a "; if (Config::ftvHelpFlag) t << "target=\"top\" "; t << "href=\""; if (url) t << url; t << "\">"; - docify(text); +} + +void HtmlGenerator::endHtmlLink() +{ t << "</a>"; } diff --git a/src/htmlgen.h b/src/htmlgen.h index baa73a3..14e427b 100644 --- a/src/htmlgen.h +++ b/src/htmlgen.h @@ -81,7 +81,8 @@ class HtmlGenerator : public OutputGenerator const char *anchor,const char *name); void startTextLink(const char *file,const char *anchor); void endTextLink(); - void writeHtmlLink(const char *url,const char *text); + void startHtmlLink(const char *url); + void endHtmlLink(); void writeMailLink(const char *url); void startTypewriter() { t << "<code>"; } void endTypewriter() { t << "</code>"; } @@ -172,6 +173,7 @@ class HtmlGenerator : public OutputGenerator void writeTilde(char c) { t << "&" << c << "tilde;"; } void writeRing(char c) { t << "&" << c << "ring;"; } void writeSharpS() { t << "ß"; } + void writeCCedil(char c) { t << "&" << c << "cedil;"; } void startDescList() { t << "<dl compact><dt>" << endl; } void endDescList() { t << "</dl>"; } void startParamList() { startDescList(); } diff --git a/src/index.cpp b/src/index.cpp index 723ec79..f11fb3f 100644 --- a/src/index.cpp +++ b/src/index.cpp @@ -359,7 +359,7 @@ void writeClassTree(OutputList &ol,BaseClassList *bcl,bool hideSuper) started=TRUE; } //printf("Passed...\n"); - bool hasChildren = !cd->visited && !hideSuper && cd->superClasses()->count()>0; + bool hasChildren = !cd->visited && !hideSuper && cd->subClasses()->count()>0; if (cd->isLinkable()) { ol.writeIndexItem(cd->getReference(),cd->getOutputFileBase(),cd->displayName()); @@ -395,7 +395,7 @@ void writeClassTree(OutputList &ol,BaseClassList *bcl,bool hideSuper) //printf("Class %s at %p visited=%d\n",cd->name().data(),cd,cd->visited); bool wasVisited=cd->visited; cd->visited=TRUE; - writeClassTree(ol,cd->superClasses(),wasVisited); + writeClassTree(ol,cd->subClasses(),wasVisited); } } } @@ -438,7 +438,7 @@ void writeClassTree(BaseClassList *cl) if (hasFtvHelp) ftvHelp->incContentsDepth(); started=TRUE; } - bool hasChildren = cd->superClasses()->count()>0; + bool hasChildren = cd->subClasses()->count()>0; if (cd->isLinkable()) { if (hasHtmlHelp) @@ -452,7 +452,7 @@ void writeClassTree(BaseClassList *cl) } if (hasChildren) { - writeClassTree(cd->superClasses()); + writeClassTree(cd->subClasses()); } cd->visited=TRUE; } @@ -492,7 +492,7 @@ void writeClassTree(ClassList *cl) { started=TRUE; } - bool hasChildren = cd->superClasses()->count()>0; + bool hasChildren = cd->subClasses()->count()>0; if (cd->isLinkable()) { if (hasHtmlHelp) @@ -506,7 +506,7 @@ void writeClassTree(ClassList *cl) } if (hasChildren) { - writeClassTree(cd->superClasses()); + writeClassTree(cd->subClasses()); } cd->visited=TRUE; } @@ -553,7 +553,7 @@ void writeClassHierarchy(OutputList &ol) if (hasFtvHelp) ftvHelp->incContentsDepth(); started=TRUE; } - bool hasChildren = !cd->visited && cd->superClasses()->count()>0; + bool hasChildren = !cd->visited && cd->subClasses()->count()>0; if (cd->isLinkable()) { ol.writeIndexItem(cd->getReference(),cd->getOutputFileBase(),cd->displayName()); @@ -586,7 +586,7 @@ void writeClassHierarchy(OutputList &ol) } if (hasChildren) { - writeClassTree(ol,cd->superClasses(),cd->visited); + writeClassTree(ol,cd->subClasses(),cd->visited); cd->visited=TRUE; } } @@ -610,7 +610,7 @@ int countClassHierarchy() ClassListIterator cli(Doxygen::classList); for ( ; cli.current(); ++cli) { - if (cli.current()->superClasses()->count()>0) count++; + if (cli.current()->subClasses()->count()>0) count++; } return count; } diff --git a/src/latexgen.cpp b/src/latexgen.cpp index 7e8cf22..cd07ac8 100644 --- a/src/latexgen.cpp +++ b/src/latexgen.cpp @@ -30,24 +30,24 @@ #include "dot.h" #include "page.h" -static QCString filterTitle(const char *s) -{ - QCString tmp=s,result; - uint i;for (i=0;i<tmp.length();i++) - { - char c=tmp.at(i); - switch(c) - { - case '#': result+="\\#"; break; - case '"': result+="\\\""; break; - case '%': result+="\\%"; break; - case '[': result+="{"; break; - case ']': result+="}"; break; - default: result+=c; break; - } - } - return result; -} +//static QCString filterTitle(const char *s) +//{ +// QCString tmp=s,result; +// uint i;for (i=0;i<tmp.length();i++) +// { +// char c=tmp.at(i); +// switch(c) +// { +// case '#': result+="\\#"; break; +// case '"': result+="\\\""; break; +// case '%': result+="\\%"; break; +// case '[': result+="{"; break; +// case ']': result+="}"; break; +// default: result+=c; break; +// } +// } +// return result; +//} static QCString escapeLabelName(const char *s) { @@ -98,6 +98,7 @@ LatexGenerator::LatexGenerator() : OutputGenerator() //printf("LatexGenerator::LatexGenerator() insideTabbing=FALSE\n"); insideTabbing=FALSE; firstDescItem=TRUE; + insidePre=FALSE; } LatexGenerator::~LatexGenerator() @@ -116,6 +117,7 @@ void LatexGenerator::append(const OutputGenerator *g) col+=((LatexGenerator *)g)->col; insideTabbing=insideTabbing || ((LatexGenerator *)g)->insideTabbing; firstDescItem = ((LatexGenerator *)g)->firstDescItem; + insidePre = insidePre || ((LatexGenerator *)g)->insidePre; //printf("LatexGenerator::append(%s) insideTabbing=%s\n", g->getContents().data(), // insideTabbing ? "TRUE" : "FALSE" ); } @@ -124,6 +126,7 @@ OutputGenerator *LatexGenerator::copy() { LatexGenerator *result = new LatexGenerator; result->insideTabbing=insideTabbing; + result->insidePre=insidePre; return result; } @@ -864,7 +867,7 @@ void LatexGenerator::writeIndexItem(const char *ref,const char *fn, //} -void LatexGenerator::writeHtmlLink(const char *url,const char *text) +void LatexGenerator::startHtmlLink(const char *url) { if (Config::pdfHyperFlag) { @@ -873,7 +876,10 @@ void LatexGenerator::writeHtmlLink(const char *url,const char *text) t << "}"; } t << "{\\tt "; - docify(text); +} + +void LatexGenerator::endHtmlLink() +{ t << "}"; } @@ -1026,7 +1032,7 @@ void LatexGenerator::endMemberHeader() void LatexGenerator::startMemberDoc(const char *clname, const char *memname, const char *, - const char *title) + const char *) { if (memname && memname[0]!='@') { @@ -1053,7 +1059,13 @@ void LatexGenerator::startMemberDoc(const char *clname, t << "}" << endl; } if (Config::compactLatexFlag) t << "\\paragraph"; else t << "\\subsubsection"; - if (Config::pdfHyperFlag && title) t << "[" << filterTitle(title) << "]"; + if (Config::pdfHyperFlag && memname) + { + t << "["; + escapeMakeIndexChars(this,t,memname); + //filterTitle(title) + t << "]"; + } t << "{\\setlength{\\rightskip}{0pt plus 5cm}"; } @@ -1127,7 +1139,14 @@ void LatexGenerator::startSection(const char *lab,const char *,bool sub) t << "\\hypertarget{" << lab << "}{}"; } t << "\\"; - if (sub) t << "subsection{"; else t << "section{"; + if (Config::compactLatexFlag) + { + if (sub) t << "subsubsection{"; else t << "subsection{"; + } + else + { + if (sub) t << "subsection{"; else t << "section{"; + } } void LatexGenerator::endSection(const char *lab,bool) @@ -1200,7 +1219,6 @@ void LatexGenerator::docify(const char *str) static bool isJapanese = theTranslator->idLanguage()=="japanese"; static bool isKorean = theTranslator->idLanguage()=="korean"; static bool isRussian = theTranslator->idLanguage()=="russian"; - static bool isGerman = theTranslator->idLanguage()=="german"; if (str) { const unsigned char *p=(const unsigned char *)str; @@ -1209,159 +1227,169 @@ void LatexGenerator::docify(const char *str) while (*p) { c=*p++; - switch(c) + if (insidePre) { - case '#': t << "\\#"; break; - case '$': t << "\\$"; break; - case '%': t << "\\%"; break; - case '^': t << "$^\\wedge$"; break; - case '&': t << "\\&"; break; - case '*': t << "$\\ast$"; break; - case '_': t << "\\_"; - if (!insideTabbing) t << "\\-"; - break; - case '{': t << "\\{"; break; - case '}': t << "\\}"; break; - case '<': t << "$<$"; break; - case '>': t << "$>$"; break; - case '|': t << "$|$"; break; - case '~': t << "$\\sim$"; break; - case '[': if (Config::pdfHyperFlag) - t << "\\mbox{[}"; - else - t << "["; - break; - case ']': if (pc=='[') t << "$\\,$"; - if (Config::pdfHyperFlag) - t << "\\mbox{]}"; - else - t << "]"; - break; - case '-': if (*p=='>') - { t << " $\\rightarrow$ "; p++; } - else + switch(c) + { + case '\\': t << "\\(\\backslash\\)"; break; + case '{': t << "\\{"; break; + case '}': t << "\\}"; break; + default: t << (char)c; break; + } + } + else + { + switch(c) + { + case '#': t << "\\#"; break; + case '$': t << "\\$"; break; + case '%': t << "\\%"; break; + case '^': t << "$^\\wedge$"; break; + case '&': t << "\\&"; break; + case '*': t << "$\\ast$"; break; + case '_': t << "\\_"; + if (!insideTabbing) t << "\\-"; + break; + case '{': t << "\\{"; break; + case '}': t << "\\}"; break; + case '<': t << "$<$"; break; + case '>': t << "$>$"; break; + case '|': t << "$|$"; break; + case '~': t << "$\\sim$"; break; + case '[': if (Config::pdfHyperFlag) + t << "\\mbox{[}"; + else + t << "["; + break; + case ']': if (pc=='[') t << "$\\,$"; + if (Config::pdfHyperFlag) + t << "\\mbox{]}"; + else + t << "]"; + break; + case '-': if (*p=='>') + { t << " $\\rightarrow$ "; p++; } + else { t << (char)c; } - break; - case '\\': if (*p=='<') - { t << "$<$"; p++; } - else if (*p=='>') + break; + case '\\': if (*p=='<') + { t << "$<$"; p++; } + else if (*p=='>') { t << "$>$"; p++; } - else + else { t << "$\\backslash$"; } - break; - case '"': if (isGerman) // " has a special meaning if German - // - Thomas Vesper - { t << "\\char`\\\"{}"; } - else - { t << (char)c; } - break; - - default: - if (isJapanese || isKorean) - { // Japanese language uses wide characters - if (c>=128) - { - t << (char)c; - if (*p) - { - c = *p++; - t << (char)c; - } - } - else // ascii char => see if we can insert a hypenation hint - { - if (isupper(c) && islower(pc) && !insideTabbing) t << "\\-"; - t << (char)c; - } - } - else if (isCzech || isRussian) - { - if (c>=128) - { - t << (char)c; - } - else // ascii char => see if we can insert a hypenation hint - { - if (isupper(c) && islower(pc) && !insideTabbing) t << "\\-"; - t << (char)c; - } - } - else // language is other than Czech, Russian or Japanese - { - switch(c) - { - // the Latin-1 characters - case 161: t << "!`"; break; - case 181: t << "$\\mu$"; break; - case 191: t << "?`"; break; - case 192: t << "\\`{A}"; break; - case 193: t << "\\'{A}"; break; - case 194: t << "\\^{A}"; break; - case 195: t << "\\~{A}"; break; - case 196: t << "\\\"{A}"; break; - case 197: t << "\\AA{}"; break; - case 198: t << "\\AE{}"; break; - case 199: t << "\\c{C}"; break; - case 200: t << "\\`{E}"; break; - case 201: t << "\\'{E}"; break; - case 202: t << "\\^{E}"; break; - case 203: t << "\\\"{E}"; break; - case 204: t << "\\`{I}"; break; - case 205: t << "\\'{I}"; break; - case 206: t << "\\^{I}"; break; - case 207: t << "\\\"{I}"; break; - case 208: t << "D "; break; // anyone know the real code? - case 209: t << "\\~{N}"; break; - case 210: t << "\\`{O}"; break; - case 211: t << "\\'{O}"; break; - case 212: t << "\\^{O}"; break; - case 213: t << "\\~{O}"; break; - case 214: t << "\\\"{O}"; break; - case 215: t << "$\\times$"; break; - case 216: t << "\\O"; break; - case 217: t << "\\`{U}"; break; - case 218: t << "\\'{U}"; break; - case 219: t << "\\^{U}"; break; - case 220: t << "\\\"{U}"; break; - case 221: t << "\\'{Y}"; break; - case 223: t << "\\ss{}"; break; - case 224: t << "\\`{a}"; break; - case 225: t << "\\'{a}"; break; - case 226: t << "\\^{a}"; break; - case 227: t << "\\~{a}"; break; - case 228: t << "\\\"{a}"; break; - case 229: t << "\\aa{}"; break; - case 230: t << "\\ae{}"; break; - case 231: t << "\\c{c}"; break; - case 232: t << "\\`{e}"; break; - case 233: t << "\\'{e}"; break; - case 234: t << "\\^{e}"; break; - case 235: t << "\\\"{e}"; break; - case 236: t << "\\`{\\i}"; break; - case 237: t << "\\'{\\i}"; break; - case 238: t << "\\^{\\i}"; break; - case 239: t << "\\\"{\\i}"; break; - case 241: t << "\\~{n}"; break; - case 242: t << "\\`{o}"; break; - case 243: t << "\\'{o}"; break; - case 244: t << "\\^{o}"; break; - case 245: t << "\\~{o}"; break; - case 246: t << "\\\"{o}"; break; - case 248: t << "\\o{}"; break; - case 249: t << "\\`{u}"; break; - case 250: t << "\\'{u}"; break; - case 251: t << "\\^{u}"; break; - case 252: t << "\\\"{u}"; break; - case 253: t << "\\'{y}"; break; - case 255: t << "\\\"{y}"; break; - default: // normal ascii char - { - // see if we can insert an hyphenation hint - if (isupper(c) && islower(pc) && !insideTabbing) t << "\\-"; - t << (char)c; - } - } - } + break; + case '"': { t << "\\char`\\\"{}"; } + break; + + default: + + if (isJapanese || isKorean) + { // Japanese language uses wide characters + if (c>=128) + { + t << (char)c; + if (*p) + { + c = *p++; + t << (char)c; + } + } + else // ascii char => see if we can insert a hypenation hint + { + if (isupper(c) && islower(pc) && !insideTabbing) t << "\\-"; + t << (char)c; + } + } + else if (isCzech || isRussian) + { + if (c>=128) + { + t << (char)c; + } + else // ascii char => see if we can insert a hypenation hint + { + if (isupper(c) && islower(pc) && !insideTabbing) t << "\\-"; + t << (char)c; + } + } + else // language is other than Czech, Russian or Japanese + { + switch(c) + { + // the Latin-1 characters + case 161: t << "!`"; break; + case 181: t << "$\\mu$"; break; + case 191: t << "?`"; break; + case 192: t << "\\`{A}"; break; + case 193: t << "\\'{A}"; break; + case 194: t << "\\^{A}"; break; + case 195: t << "\\~{A}"; break; + case 196: t << "\\\"{A}"; break; + case 197: t << "\\AA{}"; break; + case 198: t << "\\AE{}"; break; + case 199: t << "\\c{C}"; break; + case 200: t << "\\`{E}"; break; + case 201: t << "\\'{E}"; break; + case 202: t << "\\^{E}"; break; + case 203: t << "\\\"{E}"; break; + case 204: t << "\\`{I}"; break; + case 205: t << "\\'{I}"; break; + case 206: t << "\\^{I}"; break; + case 207: t << "\\\"{I}"; break; + case 208: t << "D "; break; // anyone know the real code? + case 209: t << "\\~{N}"; break; + case 210: t << "\\`{O}"; break; + case 211: t << "\\'{O}"; break; + case 212: t << "\\^{O}"; break; + case 213: t << "\\~{O}"; break; + case 214: t << "\\\"{O}"; break; + case 215: t << "$\\times$"; break; + case 216: t << "\\O"; break; + case 217: t << "\\`{U}"; break; + case 218: t << "\\'{U}"; break; + case 219: t << "\\^{U}"; break; + case 220: t << "\\\"{U}"; break; + case 221: t << "\\'{Y}"; break; + case 223: t << "\\ss{}"; break; + case 224: t << "\\`{a}"; break; + case 225: t << "\\'{a}"; break; + case 226: t << "\\^{a}"; break; + case 227: t << "\\~{a}"; break; + case 228: t << "\\\"{a}"; break; + case 229: t << "\\aa{}"; break; + case 230: t << "\\ae{}"; break; + case 231: t << "\\c{c}"; break; + case 232: t << "\\`{e}"; break; + case 233: t << "\\'{e}"; break; + case 234: t << "\\^{e}"; break; + case 235: t << "\\\"{e}"; break; + case 236: t << "\\`{\\i}"; break; + case 237: t << "\\'{\\i}"; break; + case 238: t << "\\^{\\i}"; break; + case 239: t << "\\\"{\\i}"; break; + case 241: t << "\\~{n}"; break; + case 242: t << "\\`{o}"; break; + case 243: t << "\\'{o}"; break; + case 244: t << "\\^{o}"; break; + case 245: t << "\\~{o}"; break; + case 246: t << "\\\"{o}"; break; + case 248: t << "\\o{}"; break; + case 249: t << "\\`{u}"; break; + case 250: t << "\\'{u}"; break; + case 251: t << "\\^{u}"; break; + case 252: t << "\\\"{u}"; break; + case 253: t << "\\'{y}"; break; + case 255: t << "\\\"{y}"; break; + default: // normal ascii char + { + // see if we can insert an hyphenation hint + if (isupper(c) && islower(pc) && !insideTabbing) t << "\\-"; + t << (char)c; + } + } + } + } } pc = c; } diff --git a/src/latexgen.h b/src/latexgen.h index b000c27..0c6ed8e 100644 --- a/src/latexgen.h +++ b/src/latexgen.h @@ -78,7 +78,8 @@ class LatexGenerator : public OutputGenerator const char *anchor,const char *text); void startTextLink(const char *,const char *); void endTextLink(); - void writeHtmlLink(const char *,const char *); + void startHtmlLink(const char *); + void endHtmlLink(); void writeMailLink(const char *); void startTypewriter() { t << "{\\tt "; } void endTypewriter() { t << "}"; } @@ -110,8 +111,12 @@ class LatexGenerator : public OutputGenerator void writeAnchor(const char *fileName,const char *name); void startCodeFragment() { t << "\\footnotesize\\begin{verbatim}"; } void endCodeFragment() { t << "\\end{verbatim}\\normalsize " << endl; } - void startPreFragment() { t << "\\small\\begin{alltt}"; } - void endPreFragment() { t << "\\end{alltt}\\normalsize " << endl; } + void startPreFragment() { t << "\\small\\begin{alltt}"; + insidePre=TRUE; + } + void endPreFragment() { t << "\\end{alltt}\\normalsize " << endl; + insidePre=FALSE; + } void startCodeLine() { col=0; } void endCodeLine() { codify("\n"); } //void writeBoldString(const char *text) @@ -174,6 +179,7 @@ class LatexGenerator : public OutputGenerator void writeTilde(char c) { t << "\\~{" << c << "}"; } void writeRing(char c) { t << "\\" << c << c; } void writeSharpS() { t << "\"s"; } + void writeCCedil(char c) { t << "\\c{" << c << "}"; } void startMemberDescription() { t << "\\begin{CompactList}\\small\\item\\em "; } void endMemberDescription() { t << "\\item\\end{CompactList}"; } void startDescList() { t << "\\begin{Desc}\n\\item["; } @@ -244,6 +250,7 @@ class LatexGenerator : public OutputGenerator int col; bool insideTabbing; bool firstDescItem; + bool insidePre; }; #endif diff --git a/src/mangen.cpp b/src/mangen.cpp index 63cbed0..36e2334 100644 --- a/src/mangen.cpp +++ b/src/mangen.cpp @@ -171,9 +171,12 @@ void ManGenerator::writeCodeLink(const char *,const char *, docify(name); } -void ManGenerator::writeHtmlLink(const char *,const char *text) +void ManGenerator::startHtmlLink(const char *) +{ +} + +void ManGenerator::endHtmlLink() { - docify(text); } void ManGenerator::writeMailLink(const char *url) diff --git a/src/mangen.h b/src/mangen.h index 785cd75..920f1cb 100644 --- a/src/mangen.h +++ b/src/mangen.h @@ -76,7 +76,8 @@ class ManGenerator : public OutputGenerator const char *anchor,const char *name); void startTextLink(const char *,const char *) {} void endTextLink() {} - void writeHtmlLink(const char *url,const char *text); + void startHtmlLink(const char *url); + void endHtmlLink(); void writeMailLink(const char *url); void startTypewriter() { t << "\\fC"; firstCol=FALSE; } void endTypewriter() { t << "\\fR"; firstCol=FALSE; } @@ -164,6 +165,8 @@ class ManGenerator : public OutputGenerator void writeSharpS() { t << "s\\*:"; /* just a wild guess, need to check! */ firstCol=FALSE; } + void writeCCedil(char c) { t << c; /* TODO: fix this */ + firstCol=FALSE; } void startMemberDescription() { t << "\n.RI \"\\fI"; firstCol=FALSE; } void endMemberDescription() { t << "\\fR\""; firstCol=FALSE; } void startDescList(); diff --git a/src/outputgen.h b/src/outputgen.h index 436ebcb..06ae375 100644 --- a/src/outputgen.h +++ b/src/outputgen.h @@ -103,14 +103,17 @@ class BaseOutputDocInterface virtual void writeCodeLink(const char *ref,const char *file, const char *anchor,const char *text) = 0; - /*! Writes a (link to an) URL found in the documentation. - * \param url To URL to link to. - * \param text The text to display as a placeholder for the link. + /*! Starts a (link to an) URL found in the documentation. + * \param url The URL to link to. + */ + virtual void startHtmlLink(const char *url) = 0; + + /*! Ends a link started by startHtmlLink(). */ - virtual void writeHtmlLink(const char *url,const char *text) = 0; + virtual void endHtmlLink() = 0; /*! Writes a (link to an) email address found in the documentation. - * \param url To email address, this is also used for the link text. + * \param url The email address, this is also used for the link text. */ virtual void writeMailLink(const char *url) = 0; @@ -202,6 +205,7 @@ class BaseOutputDocInterface virtual void writeTilde(char) = 0; virtual void writeRing(char) = 0; virtual void writeSharpS() = 0; + virtual void writeCCedil(char) = 0; virtual void startDescList() = 0; virtual void endDescList() = 0; virtual void startParamList() = 0; diff --git a/src/outputlist.h b/src/outputlist.h index 7ae1973..3a6898d 100644 --- a/src/outputlist.h +++ b/src/outputlist.h @@ -134,8 +134,10 @@ class OutputList : public OutputDocInterface { forall(&OutputGenerator::startTextLink,file,anchor); } void endTextLink() { forall(&OutputGenerator::endTextLink); } - void writeHtmlLink(const char *url,const char *text) - { forall(&OutputGenerator::writeHtmlLink,url,text); } + void startHtmlLink(const char *url) + { forall(&OutputGenerator::startHtmlLink,url); } + void endHtmlLink() + { forall(&OutputGenerator::endHtmlLink); } void writeMailLink(const char *url) { forall(&OutputGenerator::writeMailLink,url); } void writeStartAnnoItem(const char *type,const char *file, @@ -296,6 +298,8 @@ class OutputList : public OutputDocInterface { forall(&OutputGenerator::writeRing,c); } void writeSharpS() { forall(&OutputGenerator::writeSharpS); } + void writeCCedil(char c) + { forall(&OutputGenerator::writeCCedil,c); } void startMemberDescription() { forall(&OutputGenerator::startMemberDescription); } void endMemberDescription() diff --git a/src/packagedef.cpp b/src/packagedef.cpp index 4bdedbb..4f2ae02 100644 --- a/src/packagedef.cpp +++ b/src/packagedef.cpp @@ -27,11 +27,12 @@ #include "language.h" #include "doxygen.h" -PackageDef::PackageDef(const char *df,int dl,const char *na) : +PackageDef::PackageDef(const char *df,int dl,const char *na,const char *ref) : Definition(df,dl,na) { classList = new ClassList; packageFileName = "package_"+convertFileName(na); + setReference(ref); } PackageDef::~PackageDef() diff --git a/src/packagedef.h b/src/packagedef.h index 7d5224a..00c88f4 100644 --- a/src/packagedef.h +++ b/src/packagedef.h @@ -32,7 +32,7 @@ class OutputList; class PackageDef : public Definition { public: - PackageDef(const char *fName,int line, const char *name); + PackageDef(const char *fName,int line, const char *name,const char *ref=0); ~PackageDef(); DefType definitionType() { return TypePackage; } QCString getOutputFileBase() const { return packageFileName; } diff --git a/src/rtfgen.cpp b/src/rtfgen.cpp index 181f1a8..efae422 100644 --- a/src/rtfgen.cpp +++ b/src/rtfgen.cpp @@ -1317,27 +1317,30 @@ void RTFGenerator::writeIndexItem(const char *ref,const char *fn, // t << "}{\\pageref{" << text << "}}" << endl; //} -void RTFGenerator::writeHtmlLink(const char *url,const char *text) +void RTFGenerator::startHtmlLink(const char *url) { - if (url && Config::rtfHyperFlag) + if (Config::rtfHyperFlag) { t << "{\\field {\\*\\fldinst { HYPERLINK \\\\l \""; t << url; t << "\" }{}"; t << "}{\\fldrslt {\\cs37\\ul\\cf2 "; + } + else + { + startTypewriter(); + } +} - if (text) - docify(text); - else - docify(url); - +void RTFGenerator::endHtmlLink() +{ + if (Config::rtfHyperFlag) + { t << "}}}" << endl; } else { - startTypewriter(); - docify(text); endTypewriter(); } } @@ -2264,6 +2267,16 @@ void RTFGenerator::writeRing(char c) } } +void RTFGenerator::writeCCedil(char c) +{ + switch(c) + { + case 'C' : t << '\307'; break; + case 'c' : t << '\347'; break; + default: t << '?'; break; + } +} + /** * VERY brittle routine inline RTF's included by other RTF's. * it is recursive and ugly. diff --git a/src/rtfgen.h b/src/rtfgen.h index 2f1355a..a40986d 100644 --- a/src/rtfgen.h +++ b/src/rtfgen.h @@ -78,7 +78,8 @@ class RTFGenerator : public OutputGenerator const char *anchor,const char *text); void startTextLink(const char *f,const char *anchor); void endTextLink(); - void writeHtmlLink(const char *,const char *); + void startHtmlLink(const char *); + void endHtmlLink(); void writeMailLink(const char *url); void startTypewriter() { t << "{\\f2 "; } void endTypewriter() { t << "}"; } @@ -159,6 +160,7 @@ class RTFGenerator : public OutputGenerator void writeTilde(char c); void writeRing(char c); void writeSharpS() { t << "\337"; } + void writeCCedil(char c); void startMemberDescription(); void endMemberDescription(); diff --git a/src/scanner.l b/src/scanner.l index 5bd5c0b..ab714c5 100644 --- a/src/scanner.l +++ b/src/scanner.l @@ -146,6 +146,7 @@ static QStack<QCString> autoGroupNameStack; static QCString lastDefGroup; static bool insideFormula; +static bool insideTryBlock=FALSE; //----------------------------------------------------------------------------- @@ -168,6 +169,7 @@ static void initParser() baseVirt = Normal; isTypedef = FALSE; autoGroupNameStack.clear(); + insideTryBlock = FALSE; } static void initEntry() @@ -426,6 +428,7 @@ TITLE [tT][iI][tT][lL][eE] %x SkipRound %x SkipSquare %x TypedefName +%x TryFunctionBlock %x Comment %x Doc %x JavaDoc @@ -1028,7 +1031,12 @@ TITLE [tT][iI][tT][lL][eE] { BEGIN(IDLUnionCase); } - else + else if (insideTryBlock && strcmp(yytext,"catch")==0) + { + insideTryBlock=FALSE; + BEGIN(TryFunctionBlock); + } + else { if (YY_START==FindMembers) { @@ -1071,6 +1079,13 @@ TITLE [tT][iI][tT][lL][eE] <IDLUnionCase>":" { BEGIN(FindMembers); } <IDLUnionCase>\n { yyLineNr++; } <IDLUnionCase>. +<TryFunctionBlock>\n +<TryFunctionBlock>"{" { + curlyCount=0; + lastCurlyContext = FindMembers ; + BEGIN( SkipCurly ); + } +<TryFunctionBlock>. <EndCppQuote>")" { insideCppQuote=FALSE; BEGIN(FindMembers); @@ -1551,7 +1566,9 @@ TITLE [tT][iI][tT][lL][eE] BEGIN( FindMembers ) ; } else + { BEGIN( MemberSpec ) ; + } } } } @@ -1985,6 +2002,9 @@ TITLE [tT][iI][tT][lL][eE] current->args += ' ' ; } <FuncQual,FuncRound,FuncFunc>. { current->args += *yytext; } +<FuncQual>{BN}*"try"{BN}+ { /* try-function-block */ + insideTryBlock=TRUE; + } <FuncQual>{BN}*"throw"{BN}*"(" { current->exception = " throw (" ; roundCount=0; @@ -2045,7 +2065,7 @@ TITLE [tT][iI][tT][lL][eE] //} current->fileName = yyFileName; current->startLine = yyLineNr; - if (*yytext!=';' || (current_root->section&Entry::SCOPE_MASK) ) + if (*yytext!=';' || (current_root->section&Entry::COMPOUND_MASK) ) { int tempArg=current->name.find('<'); QCString tempName; diff --git a/src/tagreader.cpp b/src/tagreader.cpp index bb9e76d..ed684c9 100644 --- a/src/tagreader.cpp +++ b/src/tagreader.cpp @@ -76,6 +76,18 @@ class TagNamespaceInfo QStringList classList; }; +/*! Container for package specific info that can be read from a tagfile */ +class TagPackageInfo +{ + public: + TagPackageInfo() { members.setAutoDelete(TRUE); } + QString name; + QString filename; + QStrList docAnchors; + QList<TagMemberInfo> members; + QStringList classList; +}; + /*! Container for file specific info that can be read from a tagfile */ class TagFileInfo { @@ -214,6 +226,7 @@ class TagFileParser : public QXmlDefaultHandler } else if (kind=="package") { + m_curPackage = new TagPackageInfo; m_state = InPackage; } else @@ -235,6 +248,8 @@ class TagFileParser : public QXmlDefaultHandler m_curGroup=0; break; case InPage: m_tagFilePages.append(m_curPage); m_curPage=0; break; + case InPackage: m_tagFilePackages.append(m_curPackage); + m_curPackage=0; break; default: err("Error: tag `compound' was not expected!\n"); } @@ -278,6 +293,7 @@ class TagFileParser : public QXmlDefaultHandler case InFile: m_curFile->members.append(m_curMember); break; case InNamespace: m_curNamespace->members.append(m_curMember); break; case InGroup: m_curGroup->members.append(m_curMember); break; + case InPackage: m_curPackage->members.append(m_curMember); break; default: err("Error: Unexpected tag `member' found\n"); break; } } @@ -291,6 +307,7 @@ class TagFileParser : public QXmlDefaultHandler case InGroup: m_curGroup->docAnchors.append(m_curString); break; case InPage: m_curPage->docAnchors.append(m_curString); break; case InMember: m_curMember->docAnchors.append(m_curString); break; + case InPackage: m_curPackage->docAnchors.append(m_curString); break; default: err("Error: Unexpected tag `member' found\n"); break; } } @@ -301,6 +318,7 @@ class TagFileParser : public QXmlDefaultHandler case InFile: m_curFile->classList.append(m_curString); break; case InNamespace: m_curNamespace->classList.append(m_curString); break; case InGroup: m_curGroup->classList.append(m_curString); break; + case InPackage: m_curPackage->classList.append(m_curString); break; default: err("Error: Unexpected tag `class' found\n"); break; } } @@ -343,6 +361,7 @@ class TagFileParser : public QXmlDefaultHandler case InGroup: m_curGroup->name = m_curString; break; case InPage: m_curPage->name = m_curString; break; case InMember: m_curMember->name = m_curString; break; + case InPackage: m_curPackage->name = m_curString; break; default: err("Error: Unexpected tag `name' found\n"); break; } } @@ -395,6 +414,7 @@ class TagFileParser : public QXmlDefaultHandler case InFile: m_curFile->filename = m_curString; break; case InGroup: m_curGroup->filename = m_curString; break; case InPage: m_curPage->filename = m_curString; break; + case InPackage: m_curPackage->filename = m_curString; break; default: err("Error: Unexpected tag `filename' found\n"); break; } } @@ -457,18 +477,23 @@ class TagFileParser : public QXmlDefaultHandler bool startDocument() { + m_state = Invalid; + m_curClass=0; m_curNamespace=0; m_curFile=0; m_curGroup=0; m_curPage=0; - m_state = Invalid; + m_curPackage=0; + m_stateStack.setAutoDelete(TRUE); m_tagFileClasses.setAutoDelete(TRUE); m_tagFileFiles.setAutoDelete(TRUE); m_tagFileNamespaces.setAutoDelete(TRUE); m_tagFileGroups.setAutoDelete(TRUE); m_tagFilePages.setAutoDelete(TRUE); + m_tagFilePackages.setAutoDelete(TRUE); + m_startElementHandlers.insert("compound", new StartElementHandler(this,&TagFileParser::startCompound)); m_startElementHandlers.insert("member", new StartElementHandler(this,&TagFileParser::startMember)); m_startElementHandlers.insert("name", new StartElementHandler(this,&TagFileParser::startStringValue)); @@ -485,6 +510,7 @@ class TagFileParser : public QXmlDefaultHandler m_startElementHandlers.insert("page", new StartElementHandler(this,&TagFileParser::startStringValue)); m_startElementHandlers.insert("docanchor", new StartElementHandler(this,&TagFileParser::startStringValue)); m_startElementHandlers.insert("tagfile", new StartElementHandler(this,&TagFileParser::startIgnoreElement)); + m_endElementHandlers.insert("compound", new EndElementHandler(this,&TagFileParser::endCompound)); m_endElementHandlers.insert("member", new EndElementHandler(this,&TagFileParser::endMember)); m_endElementHandlers.insert("name", new EndElementHandler(this,&TagFileParser::endName)); @@ -501,6 +527,7 @@ class TagFileParser : public QXmlDefaultHandler m_endElementHandlers.insert("page", new EndElementHandler(this,&TagFileParser::endPage)); m_endElementHandlers.insert("docanchor", new EndElementHandler(this,&TagFileParser::endDocAnchor)); m_endElementHandlers.insert("tagfile", new EndElementHandler(this,&TagFileParser::endIgnoreElement)); + return TRUE; } bool startElement( const QString&, const QString&, @@ -548,11 +575,13 @@ class TagFileParser : public QXmlDefaultHandler QList<TagNamespaceInfo> m_tagFileNamespaces; QList<TagGroupInfo> m_tagFileGroups; QList<TagPageInfo> m_tagFilePages; + QList<TagPackageInfo> m_tagFilePackages; QDict<StartElementHandler> m_startElementHandlers; QDict<EndElementHandler> m_endElementHandlers; TagClassInfo *m_curClass; TagFileInfo *m_curFile; TagNamespaceInfo *m_curNamespace; + TagPackageInfo *m_curPackage; TagGroupInfo *m_curGroup; TagPageInfo *m_curPage; TagMemberInfo *m_curMember; @@ -870,6 +899,10 @@ static QString stripPath(const QString &s) } } +/*! Injects the info gathered by the XML parser into the Entry tree. + * This tree contains the information extracted from the input in a + * "unrelated" form. + */ void TagFileParser::buildLists(Entry *root) { // build class list @@ -953,6 +986,24 @@ void TagFileParser::buildLists(Entry *root) tni = m_tagFileNamespaces.next(); } + // build package list + TagPackageInfo *tpgi = m_tagFilePackages.first(); + while (tpgi) + { + Entry *pe = new Entry; + pe->section = Entry::PACKAGE_SEC; + pe->name = tpgi->name; + addDocAnchors(pe,tpgi->docAnchors); + TagInfo *ti = new TagInfo; + ti->tagName = m_tagName; + ti->fileName = tpgi->filename; + pe->tagInfo = ti; + + buildMemberList(pe,tpgi->members); + root->addSubEntry(pe); + tpgi = m_tagFilePackages.next(); + } + // build group list TagGroupInfo *tgi = m_tagFileGroups.first(); while (tgi) diff --git a/src/translator.h b/src/translator.h index a8c1de7..59aad27 100644 --- a/src/translator.h +++ b/src/translator.h @@ -230,7 +230,7 @@ class Translator // quick reference sections /*! This is put above each page as a link to the list of all groups of - * compounds or files (see the \group command). + * compounds or files (see the \\group command). */ virtual QCString trModules() { return "Modules"; } @@ -591,47 +591,47 @@ class Translator return (QCString)"Inheritance diagram for "+clName+":"; } - /*! this text is generated when the \internal command is used. */ + /*! this text is generated when the \\internal command is used. */ virtual QCString trForInternalUseOnly() { return "For internal use only."; } - /*! this text is generated when the \reimp command is used. */ + /*! this text is generated when the \\reimp command is used. */ virtual QCString trReimplementedForInternalReasons() { return "Reimplemented for internal reasons; the API is not affected."; } - /*! this text is generated when the \warning command is used. */ + /*! this text is generated when the \\warning command is used. */ virtual QCString trWarning() { return "Warning"; } - /*! this text is generated when the \bug command is used. */ + /*! this text is generated when the \\bug command is used. */ virtual QCString trBugsAndLimitations() { return "Bugs and limitations"; } - /*! this text is generated when the \version command is used. */ + /*! this text is generated when the \\version command is used. */ virtual QCString trVersion() { return "Version"; } - /*! this text is generated when the \date command is used. */ + /*! this text is generated when the \\date command is used. */ virtual QCString trDate() { return "Date"; } - /*! this text is generated when the \author command is used. */ + /*! this text is generated when the \\author command is used. */ virtual QCString trAuthors() { return "Author(s)"; } - /*! this text is generated when the \return command is used. */ + /*! this text is generated when the \\return command is used. */ virtual QCString trReturns() { return "Returns"; } - /*! this text is generated when the \sa command is used. */ + /*! this text is generated when the \\sa command is used. */ virtual QCString trSeeAlso() { return "See also"; } - /*! this text is generated when the \param command is used. */ + /*! this text is generated when the \\param command is used. */ virtual QCString trParameters() { return "Parameters"; } - /*! this text is generated when the \exception command is used. */ + /*! this text is generated when the \\exception command is used. */ virtual QCString trExceptions() { return "Exceptions"; } @@ -1239,7 +1239,7 @@ class Translator // new since 1.2.5 ////////////////////////////////////////////////////////////////////////// - /*! Used as a marker that is put before a \bug item */ + /*! Used as a marker that is put before a \\bug item */ virtual QCString trBug() { return "Bug"; diff --git a/src/translator_de.h b/src/translator_de.h index dca9345..1fdf217 100644 --- a/src/translator_de.h +++ b/src/translator_de.h @@ -638,7 +638,7 @@ class TranslatorGerman : public Translator /*! this text is put before an include dependency graph */ virtual QCString trInclDepGraph(const char *fName) { - return (QCString)"Include-Abhängikeitsdiagramm für "+fName+":"; + return (QCString)"Include-Abhängigkeitsdiagramm für "+fName+":"; } /*! header that is put before the list of constructor/destructors. */ virtual QCString trConstructorDocumentation() @@ -834,7 +834,7 @@ class TranslatorGerman : public Translator "Die Rechtecke in obigem Graphen bedeuten:\n" "<ul>\n" "<li>Ein schwarz gefülltes Rechteck stellt die Struktur oder " - "Klasse dar, füdie der Graph erzeug wurde.\n" + "Klasse dar, für die der Graph erzeug wurde.\n" "<li>Ein Rechteck mit schwarzem Rahmen kennzeichnet eine dokumentierte " " Struktur oder Klasse.\n" "<li>Ein Rechteck mit grauem Rahmen kennzeichnet eine undokumentierte " @@ -850,10 +850,10 @@ class TranslatorGerman : public Translator "zwischen zwei Klassen dar.\n" "<li>Ein dunkelgrüner Pfeil stellt geschützte Vererbung dar.\n" "<li>Ein dunkelroter Pfeil stellt private Vererbung dar.\n" - "<li>Ein gestrichelter violetter Pfeil beutet, dass eine Klasse in einer " + "<li>Ein gestrichelter violetter Pfeil bedeutet, dass eine Klasse in einer " "anderen enthalten ist oder von einer anderen benutzt wird. Am Pfeil " "stehen die Variable(n), mit deren Hilfe auf die Struktur oder Klasse " - "an der Pfeilspize zugegriffen werden kann. \n" + "an der Pfeilspitze zugegriffen werden kann. \n" "</ul>\n"; } /*! text for the link to the legend page */ diff --git a/src/translator_fr.h b/src/translator_fr.h index e7809b5..ce356ce 100644 --- a/src/translator_fr.h +++ b/src/translator_fr.h @@ -31,6 +31,12 @@ class TranslatorFrench : public Translator QCString latexBabelPackage() { return "french"; } + /*! return the language charset. This will be used for the HTML output */ + virtual QCString idLanguageCharset() + { + return "iso-8859-1"; + } + /*! used in the compound documentation before a list of related functions. */ QCString trRelatedFunctions() { return "Fonctions associées"; } |