diff options
author | dimitri <dimitri@afe2bf4a-e733-0410-8a33-86f594647bc7> | 2001-12-29 18:30:48 (GMT) |
---|---|---|
committer | dimitri <dimitri@afe2bf4a-e733-0410-8a33-86f594647bc7> | 2001-12-29 18:30:48 (GMT) |
commit | ff11b7d98ad7d24770afd151aa6b439adc7506d2 (patch) | |
tree | 048517043e4c90dcc686bc038b480825fe32886c /src | |
parent | 414d7b3bbfad8ec16237c3708af188ecaee62886 (diff) | |
download | Doxygen-ff11b7d98ad7d24770afd151aa6b439adc7506d2.zip Doxygen-ff11b7d98ad7d24770afd151aa6b439adc7506d2.tar.gz Doxygen-ff11b7d98ad7d24770afd151aa6b439adc7506d2.tar.bz2 |
Release-1.2.13
Diffstat (limited to 'src')
-rw-r--r-- | src/classdef.cpp | 205 | ||||
-rw-r--r-- | src/classdef.h | 8 | ||||
-rw-r--r-- | src/code.l | 4 | ||||
-rw-r--r-- | src/config.l | 77 | ||||
-rw-r--r-- | src/defargs.l | 5 | ||||
-rw-r--r-- | src/doc.l | 4 | ||||
-rw-r--r-- | src/doxygen.cpp | 374 | ||||
-rw-r--r-- | src/filedef.cpp | 2 | ||||
-rw-r--r-- | src/groupdef.cpp | 2 | ||||
-rw-r--r-- | src/htmlgen.h | 5 | ||||
-rw-r--r-- | src/lang_cfg.h | 1 | ||||
-rw-r--r-- | src/language.cpp | 16 | ||||
-rw-r--r-- | src/latexgen.cpp | 34 | ||||
-rw-r--r-- | src/latexgen.h | 5 | ||||
-rw-r--r-- | src/libdoxygen.pro.in | 1 | ||||
-rw-r--r-- | src/mangen.cpp | 1 | ||||
-rw-r--r-- | src/mangen.h | 5 | ||||
-rw-r--r-- | src/memberdef.cpp | 75 | ||||
-rw-r--r-- | src/memberdef.h | 2 | ||||
-rw-r--r-- | src/membergroup.cpp | 2 | ||||
-rw-r--r-- | src/memberlist.cpp | 50 | ||||
-rw-r--r-- | src/namespacedef.cpp | 2 | ||||
-rw-r--r-- | src/outputgen.h | 5 | ||||
-rw-r--r-- | src/outputlist.h | 9 | ||||
-rw-r--r-- | src/rtfgen.h | 5 | ||||
-rw-r--r-- | src/scanner.l | 67 | ||||
-rw-r--r-- | src/tagreader.cpp | 6 | ||||
-rw-r--r-- | src/translator_adapter.h | 248 | ||||
-rw-r--r-- | src/translator_fi.h | 101 | ||||
-rw-r--r-- | src/translator_gr.h | 1334 | ||||
-rw-r--r-- | src/translator_se.h | 15 | ||||
-rw-r--r-- | src/util.cpp | 79 | ||||
-rw-r--r-- | src/util.h | 3 | ||||
-rw-r--r-- | src/xmlgen.cpp | 302 |
34 files changed, 2266 insertions, 788 deletions
diff --git a/src/classdef.cpp b/src/classdef.cpp index 4b35855..eb46b38 100644 --- a/src/classdef.cpp +++ b/src/classdef.cpp @@ -87,23 +87,24 @@ ClassDef::ClassDef( memberGroupSDict = new MemberGroupSDict; memberGroupSDict->setAutoDelete(TRUE); m_innerClasses = new ClassSDict(17); - //int i=name().findRev("::"); // TODO: broken if A<N::C> is the class name - //if (i==-1) - //{ - // m_scopelessName=name(); - //} - //else - //{ - // m_scopelessName=name().right(name().length()-i-2); - //} m_subGrouping=TRUE; - //m_isTemplBaseClass=-1; m_templateInstances = 0; m_templateMaster =0; m_templBaseClassNames = 0; m_artificial = FALSE; m_isAbstract = FALSE; m_isStatic = FALSE; + m_membersMerged = FALSE; + + if (((QCString)defFileName).right(5)!=".java" && + guessSection(defFileName)==Entry::SOURCE_SEC) + { + m_isLocal=TRUE; + } + else + { + m_isLocal=FALSE; + } } // destroy the class definition @@ -181,7 +182,10 @@ void ClassDef::addMembersToMemberGroup() } // adds new member definition to the class -void ClassDef::insertMember(MemberDef *md) +void ClassDef::internalInsertMember(MemberDef *md, + Protection prot, + bool addToAllList + ) { //printf("adding %s::%s\n",name().data(),md->name().data()); if (!isReference()) @@ -190,7 +194,7 @@ void ClassDef::insertMember(MemberDef *md) /* insert member in the declaration section */ /********************************************/ if (md->isRelated() && - (Config_getBool("EXTRACT_PRIVATE") || md->protection()!=Private)) + (Config_getBool("EXTRACT_PRIVATE") || prot!=Private)) { related.append(md); md->setSectionList(&related); @@ -217,7 +221,7 @@ void ClassDef::insertMember(MemberDef *md) md->setSectionList(&properties); break; case MemberDef::Slot: // Qt specific - switch (md->protection()) + switch (prot) { case Protected: proSlots.append(md); @@ -238,7 +242,7 @@ void ClassDef::insertMember(MemberDef *md) { if (md->isVariable()) { - switch (md->protection()) + switch (prot) { case Protected: proStaticAttribs.append(md); @@ -256,7 +260,7 @@ void ClassDef::insertMember(MemberDef *md) } else // function { - switch (md->protection()) + switch (prot) { case Protected: proStaticMembers.append(md); @@ -277,7 +281,7 @@ void ClassDef::insertMember(MemberDef *md) { if (md->isVariable()) { - switch (md->protection()) + switch (prot) { case Protected: proAttribs.append(md); @@ -295,7 +299,7 @@ void ClassDef::insertMember(MemberDef *md) } else if (md->isTypedef() || md->isEnumerate() || md->isEnumValue()) { - switch (md->protection()) + switch (prot) { case Protected: proTypes.append(md); @@ -313,7 +317,7 @@ void ClassDef::insertMember(MemberDef *md) } else // member function { - switch (md->protection()) + switch (prot) { case Protected: proMembers.append(md); @@ -338,7 +342,7 @@ void ClassDef::insertMember(MemberDef *md) /* insert member in the detailed documentation section */ /*******************************************************/ if ((md->isRelated() && - (Config_getBool("EXTRACT_PRIVATE") || md->protection()!=Private) + (Config_getBool("EXTRACT_PRIVATE") || prot!=Private) ) || md->isFriend() ) { @@ -365,7 +369,7 @@ void ClassDef::insertMember(MemberDef *md) functionMembers.append(md); break; case MemberDef::Slot: - switch (md->protection()) + switch (prot) { case Protected: if (Config_getBool("SORT_MEMBER_DOCS")) @@ -391,7 +395,7 @@ void ClassDef::insertMember(MemberDef *md) } break; default: // any of the other members - if (md->protection()!=Private || Config_getBool("EXTRACT_PRIVATE")) + if (prot!=Private || Config_getBool("EXTRACT_PRIVATE")) { switch (md->memberType()) { @@ -458,21 +462,28 @@ void ClassDef::insertMember(MemberDef *md) m_isAbstract=TRUE; } - MemberInfo *mi = new MemberInfo((MemberDef *)md, - md->protection(),md->virtualness(),FALSE); - MemberNameInfo *mni=0; - if ((mni=m_allMemberNameInfoSDict->find(md->name()))) - { - mni->append(mi); - } - else + if (addToAllList) { - mni = new MemberNameInfo(md->name()); - mni->append(mi); - m_allMemberNameInfoSDict->inSort(mni->memberName(),mni); + MemberInfo *mi = new MemberInfo((MemberDef *)md, + prot,md->virtualness(),FALSE); + MemberNameInfo *mni=0; + if ((mni=m_allMemberNameInfoSDict->find(md->name()))) + { + mni->append(mi); + } + else + { + mni = new MemberNameInfo(md->name()); + mni->append(mi); + m_allMemberNameInfoSDict->append(mni->memberName(),mni); + } } } +void ClassDef::insertMember(MemberDef *md) +{ + internalInsertMember(md,md->protection(),TRUE); +} //void ClassDef::computeMemberGroups() //{ @@ -498,29 +509,30 @@ void ClassDef::insertMember(MemberDef *md) // compute the anchors for all members void ClassDef::computeAnchors() { - setAnchors('a',&pubMembers); - setAnchors('b',&proMembers); - setAnchors('c',&priMembers); - setAnchors('d',&pubStaticMembers); - setAnchors('e',&proStaticMembers); - setAnchors('f',&priStaticMembers); - setAnchors('g',&pubSlots); - setAnchors('h',&proSlots); - setAnchors('i',&priSlots); - setAnchors('j',&signals); - setAnchors('k',&related); - setAnchors('l',&friends); - setAnchors('m',&pubAttribs); - setAnchors('n',&proAttribs); - setAnchors('o',&priAttribs); - setAnchors('p',&pubStaticAttribs); - setAnchors('q',&proStaticAttribs); - setAnchors('r',&priStaticAttribs); - setAnchors('s',&pubTypes); - setAnchors('t',&proTypes); - setAnchors('u',&priTypes); - setAnchors('v',&dcopMethods); - setAnchors('w',&properties); + ClassDef *context = Config_getBool("INLINE_INHERITED_MEMB") ? this : 0; + setAnchors(context,'a',&pubMembers); + setAnchors(context,'b',&proMembers); + setAnchors(context,'c',&priMembers); + setAnchors(context,'d',&pubStaticMembers); + setAnchors(context,'e',&proStaticMembers); + setAnchors(context,'f',&priStaticMembers); + setAnchors(context,'g',&pubSlots); + setAnchors(context,'h',&proSlots); + setAnchors(context,'i',&priSlots); + setAnchors(context,'j',&signals); + setAnchors(context,'k',&related); + setAnchors(context,'l',&friends); + setAnchors(context,'m',&pubAttribs); + setAnchors(context,'n',&proAttribs); + setAnchors(context,'o',&priAttribs); + setAnchors(context,'p',&pubStaticAttribs); + setAnchors(context,'q',&proStaticAttribs); + setAnchors(context,'r',&priStaticAttribs); + setAnchors(context,'s',&pubTypes); + setAnchors(context,'t',&proTypes); + setAnchors(context,'u',&priTypes); + setAnchors(context,'v',&dcopMethods); + setAnchors(context,'w',&properties); } void ClassDef::distributeMemberGroupDocumentation() @@ -967,7 +979,9 @@ void ClassDef::writeDocumentation(OutputList &ol) // write link to list of all members (HTML only) if (m_allMemberNameInfoSDict->count()>0 && - !Config_getBool("OPTIMIZE_OUTPUT_FOR_C")) + !Config_getBool("OPTIMIZE_OUTPUT_FOR_C") + /* && !Config_getBool("INLINE_INHERITED_MEMB") */ + ) { ol.disableAllBut(OutputGenerator::Html); ol.startTextLink(m_memListFileName,0); @@ -1213,7 +1227,9 @@ void ClassDef::writeDocumentationForInnerClasses(OutputList &ol) ClassDef *innerCd; for (cli.toFirst();(innerCd=cli.current());++cli) { - if (innerCd->isLinkableInProject() && innerCd->templateMaster()==0) + if (innerCd->isLinkableInProject() && innerCd->templateMaster()==0 && + (innerCd->protection()!=Private || Config_getBool("EXTRACT_PRIVATE")) + ) { msg("Generating docs for nested compound %s...\n",innerCd->name().data()); innerCd->writeDocumentation(ol); @@ -1568,6 +1584,7 @@ bool ClassDef::isLinkableInProject() const !m_artificial && name().find('@')==-1 && /* anonymous compound */ (m_prot!=Private || Config_getBool("EXTRACT_PRIVATE")) && /* private */ + (!m_isLocal || Config_getBool("EXTRACT_LOCAL_CLASSES")) && /* local */ hasDocumentation() && /* documented */ !isReference() && /* not an external reference */ (!m_isStatic || Config_getBool("EXTRACT_STATIC")); @@ -1637,6 +1654,17 @@ bool ClassDef::isBaseClass(ClassDef *bcd) } //---------------------------------------------------------------------------- + +static bool isStandardFunc(MemberDef *md) +{ + ClassDef *cd=md->getClassDef(); + if (cd->templateMaster()) cd=cd->templateMaster(); + return md->name()=="operator=" || // assignment operator + md->name()==cd->localName() || // constructor + (md->name().find('~')!=-1 && + md->name().find("operator")==-1); // destructor +} + /*! * recusively merges the `all members' lists of a class base * with that of this class. Must only be called for classes without @@ -1645,19 +1673,22 @@ bool ClassDef::isBaseClass(ClassDef *bcd) void ClassDef::mergeMembers() { + if (m_membersMerged) return; + m_membersMerged=TRUE; + //printf(" mergeMembers for %s\n",name().data()); + bool inlineInheritedMembers = Config_getBool("INLINE_INHERITED_MEMB" ); BaseClassListIterator bcli(*baseClasses()); BaseClassDef *bcd; for ( ; (bcd=bcli.current()) ; ++bcli ) { ClassDef *bClass=bcd->classDef; - + // merge the members in the base class of this inheritance branch first bClass->mergeMembers(); - MemberNameInfoSDict *srcMnd = bClass->memberNameInfoSDict(); - MemberNameInfoSDict *dstMnd = memberNameInfoSDict(); - //MemberNameInfoList *dstMnl = memberNameInfoList(); - + MemberNameInfoSDict *srcMnd = bClass->m_allMemberNameInfoSDict; + MemberNameInfoSDict *dstMnd = m_allMemberNameInfoSDict; + MemberNameInfoSDict::Iterator srcMnili(*srcMnd); MemberNameInfo *srcMni; for ( ; (srcMni=srcMnili.current()) ; ++srcMnili) @@ -1687,24 +1718,26 @@ void ClassDef::mergeMembers() if (srcMd!=dstMd) // different members { ClassDef *dstCd = dstMd->getClassDef(); - //printf("Is %s a base class of %s?\n",srcCd->name(),dstCd->name()); + //printf(" Is %s a base class of %s?\n",srcCd->name().data(),dstCd->name().data()); if (srcCd==dstCd || dstCd->isBaseClass(srcCd)) // member is in the same or a base class { found=matchArguments(srcMd->argumentList(), - dstMd->argumentList() - ); - //ambigue = ambigue || !found; + dstMd->argumentList()); + //printf(" Yes, matching (%s<->%s): %d\n", + // argListToString(srcMd->argumentList()).data(), + // argListToString(dstMd->argumentList()).data(), + // found); hidden = hidden || !found; } else // member is in a non base class => multiple inheritance - // using the same base class. + // using the same base class. { //printf("$$ Existing member %s %s add scope %s\n", // dstMi->ambiguityResolutionScope.data(), // dstMd->name().data(), // dstMi->scopePath.left(dstMi->scopePath.find("::")+2).data()); - + QCString scope=dstMi->scopePath.left(dstMi->scopePath.find("::")+2); if (scope!=dstMi->ambiguityResolutionScope.left(scope.length())) dstMi->ambiguityResolutionScope.prepend(scope); @@ -1722,7 +1755,7 @@ void ClassDef::mergeMembers() found=TRUE; } else // member can be reached via multiple paths in the - // inheritance tree + // inheritance tree { //printf("$$ Existing member %s %s add scope %s\n", // dstMi->ambiguityResolutionScope.data(), @@ -1731,7 +1764,9 @@ void ClassDef::mergeMembers() QCString scope=dstMi->scopePath.left(dstMi->scopePath.find("::")+2); if (scope!=dstMi->ambiguityResolutionScope.left(scope.length())) + { dstMi->ambiguityResolutionScope.prepend(scope); + } ambigue=TRUE; } } @@ -1748,6 +1783,14 @@ void ClassDef::mergeMembers() // this case is shown anyway. if (!found && srcMd->protection()!=Private) { + if (inlineInheritedMembers) + { + if (!isStandardFunc(srcMd)) + { + //printf(" insertMember `%s'\n",srcMd->name().data()); + internalInsertMember(srcMd,bcd->prot,FALSE); + } + } Specifier virt=srcMi->virt; if (srcMi->virt==Normal && bcd->virt!=Normal) virt=bcd->virt; MemberInfo *newMi = new MemberInfo(srcMd,bcd->prot,virt,TRUE); @@ -1761,8 +1804,10 @@ void ClassDef::mergeMembers() QCString scope=bClass->name()+"::"; if (scope!=srcMi->ambiguityResolutionScope.left(scope.length())) + { newMi->ambiguityResolutionScope= scope+srcMi->ambiguityResolutionScope.copy(); + } } if (hidden) { @@ -1777,7 +1822,6 @@ void ClassDef::mergeMembers() newMi->ambiguityResolutionScope=srcMi->ambigClass->name()+"::"; } } - //printf("Adding!\n"); dstMni->append(newMi); } } @@ -1786,8 +1830,9 @@ void ClassDef::mergeMembers() { // 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()); - + MemberNameInfo *newMni = 0; + newMni = new MemberNameInfo(srcMni->memberName()); + // copy the member(s) from the base to the sub class MemberNameInfoIterator mnii(*srcMni); MemberInfo *mi; @@ -1805,12 +1850,20 @@ void ClassDef::mergeMembers() //printf("%s::%s: prot=%d bcd->prot=%d result=%d\n", // name().data(),mi->memberDef->name().data(),mi->prot, // bcd->prot,prot); - + if (mi->prot!=Private) { Specifier virt=mi->virt; if (mi->virt==Normal && bcd->virt!=Normal) virt=bcd->virt; - + + if (inlineInheritedMembers) + { + if (!isStandardFunc(mi->memberDef)) + { + //printf(" insertMember `%s'\n",mi->memberDef->name().data()); + internalInsertMember(mi->memberDef,prot,FALSE); + } + } //printf("Adding!\n"); MemberInfo *newMi=new MemberInfo(mi->memberDef,prot,virt,TRUE); newMi->scopePath=bClass->name()+"::"+mi->scopePath; @@ -1819,13 +1872,13 @@ void ClassDef::mergeMembers() newMni->append(newMi); } } - + // add it to the dictionary - //dstMnl->append(newMni); dstMnd->append(newMni->memberName(),newMni); } } } + //printf(" end mergeMembers\n"); } //---------------------------------------------------------------------------- diff --git a/src/classdef.h b/src/classdef.h index d294601..507a915 100644 --- a/src/classdef.h +++ b/src/classdef.h @@ -311,6 +311,8 @@ class ClassDef : public Definition /*! \} Interal API */ private: + void internalInsertMember(MemberDef *md,Protection prot,bool addToAllList); + /*! file name that forms the base for the output file containing the * class documentation. For compatibility with Qt (e.g. links via tag * files) this name cannot be derived from the class name directly. @@ -408,6 +410,12 @@ class ClassDef : public Definition /*! Is the class part of an unnamed namespace? */ bool m_isStatic; + + /*! TRUE if classes members are merged with those of the base classes. */ + bool m_membersMerged; + + /*! TRUE if the class is defined in a source file rather than a header file. */ + bool m_isLocal; }; /*! \brief Class that contains information about a usage relation. @@ -1107,14 +1107,12 @@ TYPEKW ("bool"|"char"|"double"|"float"|"int"|"long"|"short"|"signed"|"unsigned" g_code->codify(yytext); } <ClassName>{ID} { - //g_ccd.name=yytext; g_curClassName=yytext; addType(); generateClassOrGlobalLink(*g_code,yytext); BEGIN( ClassVar ); } <ClassVar>"=" { - g_code->codify(yytext); unput(*yytext); BEGIN( Body ); } @@ -1124,7 +1122,7 @@ TYPEKW ("bool"|"char"|"double"|"float"|"int"|"long"|"short"|"signed"|"unsigned" g_theVarContext.addVariable(g_type,g_name); generateClassOrGlobalLink(*g_code,yytext); } -<ClassName,ClassVar>[ \t\n]*":"[ \t\n]* { +<ClassName,ClassVar>[ \t\n]*":"[ \t\n]* { codifyLines(yytext); g_curClassBases.clear(); BEGIN( Bases ); diff --git a/src/config.l b/src/config.l index 98b61aa..3a1918d 100644 --- a/src/config.l +++ b/src/config.l @@ -711,7 +711,7 @@ static void substEnvVarsInStrList(QStrList &sl) // search for a "word" for (i=0;i<l;i++) { - char c; + char c=0; // skip until start of new word while (i<l && ((c=result.at(i))==' ' || c=='\t')) i++; p=i; // p marks the start index of the word @@ -868,6 +868,15 @@ void Config::check() char *sfp = stripFromPath.first(); while (sfp) { + register char *p = sfp; + if (p) + { + char c; + while ((c=*p++)) + { + if (c=='\\') c='/'; + } + } QCString path = sfp; if (path.at(0)!='/' && (path.length()<=2 || path.at(1)!=':')) { @@ -1213,34 +1222,83 @@ void Config::create() "information to generate all constant output in the proper language. \n" "The default language is English, other supported languages are: \n" "Brazilian, Chinese, Croatian, Czech, Danish, Dutch, Finnish, French, \n" - "German, Hungarian, Italian, Japanese, Korean, Norwegian, Polish, \n" + "German, Greek, Hungarian, Italian, Japanese, Korean, Norwegian, Polish, \n" "Portuguese, Romanian, Russian, Slovak, Slovene, Spanish and Swedish.\n", "English" ); +#ifdef LANG_BR ce->addValue("Brazilian"); +#endif +#ifdef LANG_CN ce->addValue("Chinese"); +#endif +#ifdef LANG_HR ce->addValue("Croatian"); +#endif +#ifdef LANG_CZ ce->addValue("Czech"); +#endif +#ifdef LANG_DK ce->addValue("Danish"); +#endif +#ifdef LANG_NL ce->addValue("Dutch"); +#endif ce->addValue("English"); +#ifdef LANG_FI ce->addValue("Finnish"); +#endif +#ifdef LANG_FR ce->addValue("French"); +#endif +#ifdef LANG_DE ce->addValue("German"); +#endif +#ifdef LANG_GR + ce->addValue("Greek"); +#endif +#ifdef LANG_HU ce->addValue("Hungarian"); +#endif +#ifdef LANG_IT ce->addValue("Italian"); +#endif +#ifdef LANG_JP ce->addValue("Japanese"); +#endif +#ifdef LANG_KR ce->addValue("Korean"); +#endif +#ifdef LANG_NO ce->addValue("Norwegian"); +#endif +#ifdef LANG_PL ce->addValue("Polish"); +#endif +#ifdef LANG_PT ce->addValue("Portuguese"); +#endif +#ifdef LANG_RO ce->addValue("Romanian"); +#endif +#ifdef LANG_RU ce->addValue("Russian"); +#endif +#ifdef LANG_SK ce->addValue("Slovak"); +#endif +#ifdef LANG_SI ce->addValue("Slovene"); +#endif +#ifdef LANG_ES ce->addValue("Spanish"); +#endif +#ifdef LANG_SE ce->addValue("Swedish"); +#endif +#ifdef LANG_UA ce->addValue("Ukrainian"); +#endif cb = addBool( "EXTRACT_ALL", "If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in \n" @@ -1262,6 +1320,13 @@ void Config::create() FALSE ); cb = addBool( + "EXTRACT_LOCAL_CLASSES", + "If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) \n" + "defined locally in source files will be included in the documentation. \n" + "If set to NO only classes defined in header files are included. \n", + TRUE + ); + cb = addBool( "HIDE_UNDOC_MEMBERS", "If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all \n" "undocumented members of documented classes, files or namespaces. \n" @@ -1302,6 +1367,14 @@ void Config::create() FALSE ); cb = addBool( + "INLINE_INHERITED_MEMB", + "If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all inherited \n" + "members of a class in the documentation of that class as if those members were \n" + "ordinary class members. Constructors, destructors and assignment operators of \n" + "the base classes will not be shown. \n", + FALSE + ); + cb = addBool( "FULL_PATH_NAMES", "If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full \n" "path before files name in the file list and in the header files. If set \n" diff --git a/src/defargs.l b/src/defargs.l index 3fa6e65..c238123 100644 --- a/src/defargs.l +++ b/src/defargs.l @@ -196,8 +196,8 @@ ID [a-z_A-Z][a-z_A-Z0-9]* g_argRoundCount++; *g_copyArgValue += *yytext; } -<CopyArgRound,CopyArgRound2>")" { - *g_copyArgValue += *yytext; +<CopyArgRound,CopyArgRound2>")"({B}*{ID})* { + *g_copyArgValue += yytext; if (g_argRoundCount>0) { g_argRoundCount--; @@ -251,6 +251,7 @@ ID [a-z_A-Z][a-z_A-Z0-9]* <ReadFuncArgType,ReadFuncArgDef>[,)>] { g_curArgTypeName=removeRedundantWhiteSpace(g_curArgTypeName); g_curArgDefValue=g_curArgDefValue.stripWhiteSpace(); + //printf("curArgType=`%s' curArgDefVal=`%s'\n",g_curArgTypeName.data(),g_curArgDefValue.data()); int l=g_curArgTypeName.length(); if (l>0) { @@ -1002,21 +1002,25 @@ OPMASK ({B}*{OPNORM}({OPARG}?))|({OPCAST}{OPARG}) outDoc->docify(getenv(envvar)); } <DocScan>{CMD}"htmlonly"/[^a-z_A-Z0-9] { + outDoc->startHtmlOnly(); outDoc->pushGeneratorState(); outDoc->disableAllBut(OutputGenerator::Html); BEGIN(DocHtmlScan); } <DocHtmlScan>{CMD}"endhtmlonly"/[^a-z_A-Z0-9] { outDoc->popGeneratorState(); + outDoc->endHtmlOnly(); BEGIN(DocScan); } <DocScan>{CMD}"latexonly"/[^a-z_A-Z0-9] { + outDoc->startLatexOnly(); outDoc->pushGeneratorState(); outDoc->disableAllBut(OutputGenerator::Latex); BEGIN(DocLatexScan); } <DocLatexScan>{CMD}"endlatexonly"/[^a-z_A-Z0-9] { outDoc->popGeneratorState(); + outDoc->endLatexOnly(); BEGIN(DocScan); } <DocHtmlScan,DocLatexScan>"//"|"/*"|"*/" { diff --git a/src/doxygen.cpp b/src/doxygen.cpp index 83c640e..c4fb21a 100644 --- a/src/doxygen.cpp +++ b/src/doxygen.cpp @@ -555,215 +555,214 @@ static void buildClassList(Entry *root) { // this should not be called warn(root->fileName,root->startLine, - "Warning: invalid class name found!" + "Warning: invalid class name found!" ); + goto error; } - else - { - Debug::print(Debug::Classes,0," Found class with raw name %s\n",fullName.data()); + Debug::print(Debug::Classes,0," Found class with raw name %s\n",fullName.data()); - fullName=stripAnonymousNamespaceScope(fullName); - fullName=stripTemplateSpecifiersFromScope(fullName); - - Debug::print(Debug::Classes,0," Found class with name %s\n",fullName.data()); + fullName=stripAnonymousNamespaceScope(fullName); + fullName=stripTemplateSpecifiersFromScope(fullName); - bool ambig; - ClassDef *cd; - //printf("findFileDef(%s)\n",root->fileName.data()); - FileDef *fd=findFileDef(Doxygen::inputNameDict,root->fileName,ambig); + Debug::print(Debug::Classes,0," Found class with name %s\n",fullName.data()); - if ((cd=getClass(fullName))) - { - Debug::print(Debug::Classes,0," Existing class!\n",fullName.data()); - //if (cd->templateArguments()==0) - //{ - // //printf("existing ClassDef tempArgList=%p specScope=%s\n",root->tArgList,root->scopeSpec.data()); - // cd->setTemplateArguments(tArgList); - //} - if (!root->doc.isEmpty() || !root->brief.isEmpty() || - (root->bodyLine!=-1 && Config_getBool("SOURCE_BROWSER")) - ) - // block contains something that ends up in the docs - { - if (!root->doc.isEmpty() && !cd->documentation().isEmpty()) - { - warn( - root->fileName,root->startLine, - "Warning: class %s already has a detailed description. " - "Skipping the one found here.", - fullName.data() - ); - } - else if (!root->doc.isEmpty()) - { - cd->setDocumentation(root->doc); - } - if (!root->brief.isEmpty() && !cd->briefDescription().isEmpty()) - { - warn( - root->fileName,root->startLine, - "Warning: class %s already has a brief description\n" - " skipping the one found here.", - fullName.data() - ); - } - else if (!root->brief.isEmpty()) - { - cd->setBriefDescription(root->brief); - } - if (root->bodyLine!=-1 && cd->getStartBodyLine()==-1) - { - cd->setBodySegment(root->bodyLine,root->endBodyLine); - cd->setBodyDef(findFileDef(Doxygen::inputNameDict,root->fileName,ambig)); - } - cd->addSectionsToDefinition(root->anchors); - cd->setName(fullName); // change name to match docs - } - cd->setFileDef(fd); - if (cd->hasDocumentation()) + bool ambig; + ClassDef *cd; + //printf("findFileDef(%s)\n",root->fileName.data()); + FileDef *fd=findFileDef(Doxygen::inputNameDict,root->fileName,ambig); + + if ((cd=getClass(fullName))) + { + Debug::print(Debug::Classes,0," Existing class!\n",fullName.data()); + //if (cd->templateArguments()==0) + //{ + // //printf("existing ClassDef tempArgList=%p specScope=%s\n",root->tArgList,root->scopeSpec.data()); + // cd->setTemplateArguments(tArgList); + //} + if (!root->doc.isEmpty() || !root->brief.isEmpty() || + (root->bodyLine!=-1 && Config_getBool("SOURCE_BROWSER")) + ) + // block contains something that ends up in the docs + { + if (!root->doc.isEmpty() && !cd->documentation().isEmpty()) { - addIncludeFile(cd,fd,root); + warn( + root->fileName,root->startLine, + "Warning: class %s already has a detailed description. " + "Skipping the one found here.", + fullName.data() + ); } - addNamespace(root,cd); - if (fd && (root->section & Entry::COMPOUND_MASK)) + else if (!root->doc.isEmpty()) { - //printf(">> Inserting class `%s' in file `%s' (root->fileName=`%s')\n", - // cd->name().data(), - // fd->name().data(), - // root->fileName.data() - // ); - fd->insertClass(cd); + cd->setDocumentation(root->doc); } - addClassToGroups(root,cd); - cd->setRefItems(root->todoId,root->testId,root->bugId); - if (!root->subGrouping) cd->setSubGrouping(FALSE); - - if (cd->templateArguments()==0) + if (!root->brief.isEmpty() && !cd->briefDescription().isEmpty()) { - // this happens if a template class declared with @class is found - // before the actual definition. - ArgumentList *tArgList = - getTemplateArgumentsFromName(fullName,root->tArgLists); - cd->setTemplateArguments(tArgList); + warn( + root->fileName,root->startLine, + "Warning: class %s already has a brief description\n" + " skipping the one found here.", + fullName.data() + ); } - } - else // new class - { - - ClassDef::CompoundType sec=ClassDef::Class; - switch(root->section) + else if (!root->brief.isEmpty()) { - case Entry::UNION_SEC: - case Entry::UNIONDOC_SEC: - sec=ClassDef::Union; break; - case Entry::STRUCT_SEC: - case Entry::STRUCTDOC_SEC: - sec=ClassDef::Struct; break; - case Entry::INTERFACE_SEC: - case Entry::INTERFACEDOC_SEC: - sec=ClassDef::Interface; break; - case Entry::EXCEPTION_SEC: - case Entry::EXCEPTIONDOC_SEC: - sec=ClassDef::Exception; break; + cd->setBriefDescription(root->brief); } - Debug::print(Debug::Classes,0," New class `%s' (sec=0x%08x)! #tArgLists=%d\n", - fullName.data(),root->section,root->tArgLists ? (int)root->tArgLists->count() : -1); - QCString className; - QCString namespaceName; - extractNamespaceName(fullName,className,namespaceName); - - //printf("New class: namespace `%s' name=`%s'\n",className.data(),namespaceName.data()); - - QCString tagName; - QCString refFileName; - if (root->tagInfo) + if (root->bodyLine!=-1 && cd->getStartBodyLine()==-1) { - tagName = root->tagInfo->tagName; - refFileName = root->tagInfo->fileName; + cd->setBodySegment(root->bodyLine,root->endBodyLine); + cd->setBodyDef(findFileDef(Doxygen::inputNameDict,root->fileName,ambig)); } - ClassDef *cd=new ClassDef(root->fileName,root->startLine,fullName,sec, - tagName,refFileName); - cd->setDocumentation(root->doc); // copy docs to definition - cd->setBriefDescription(root->brief); - //printf("new ClassDef %s tempArgList=%p specScope=%s\n",fullName.data(),root->tArgList,root->scopeSpec.data()); - + cd->addSectionsToDefinition(root->anchors); + cd->setName(fullName); // change name to match docs + } + cd->setFileDef(fd); + if (cd->hasDocumentation()) + { + addIncludeFile(cd,fd,root); + } + addNamespace(root,cd); + if (fd && (root->section & Entry::COMPOUND_MASK)) + { + //printf(">> Inserting class `%s' in file `%s' (root->fileName=`%s')\n", + // cd->name().data(), + // fd->name().data(), + // root->fileName.data() + // ); + fd->insertClass(cd); + } + addClassToGroups(root,cd); + cd->setRefItems(root->todoId,root->testId,root->bugId); + if (!root->subGrouping) cd->setSubGrouping(FALSE); + if (cd->templateArguments()==0) + { + // this happens if a template class declared with @class is found + // before the actual definition. ArgumentList *tArgList = - getTemplateArgumentsFromName(fullName,root->tArgLists); - //printf("class %s template args=%s\n",fullName.data(), - // tArgList ? tempArgListToString(tArgList).data() : "<none>"); + getTemplateArgumentsFromName(fullName,root->tArgLists); cd->setTemplateArguments(tArgList); - cd->setProtection(root->protection); - cd->addSectionsToDefinition(root->anchors); - cd->setIsStatic(root->stat); + } + } + else // new class + { - // file definition containing the class cd - cd->setBodySegment(root->bodyLine,root->endBodyLine); - cd->setBodyDef(fd); - if (!root->subGrouping) cd->setSubGrouping(FALSE); + ClassDef::CompoundType sec=ClassDef::Class; + switch(root->section) + { + case Entry::UNION_SEC: + case Entry::UNIONDOC_SEC: + sec=ClassDef::Union; break; + case Entry::STRUCT_SEC: + case Entry::STRUCTDOC_SEC: + sec=ClassDef::Struct; break; + case Entry::INTERFACE_SEC: + case Entry::INTERFACEDOC_SEC: + sec=ClassDef::Interface; break; + case Entry::EXCEPTION_SEC: + case Entry::EXCEPTIONDOC_SEC: + sec=ClassDef::Exception; break; + } + Debug::print(Debug::Classes,0," New class `%s' (sec=0x%08x)! #tArgLists=%d\n", + fullName.data(),root->section,root->tArgLists ? (int)root->tArgLists->count() : -1); + QCString className; + QCString namespaceName; + extractNamespaceName(fullName,className,namespaceName); - addClassToGroups(root,cd); - cd->setRefItems(root->todoId,root->testId,root->bugId); + //printf("New class: namespace `%s' name=`%s'\n",className.data(),namespaceName.data()); - // see if the class is found inside a namespace - bool found=addNamespace(root,cd); + QCString tagName; + QCString refFileName; + if (root->tagInfo) + { + tagName = root->tagInfo->tagName; + refFileName = root->tagInfo->fileName; + } + ClassDef *cd=new ClassDef(root->fileName,root->startLine,fullName,sec, + tagName,refFileName); + cd->setDocumentation(root->doc); // copy docs to definition + cd->setBriefDescription(root->brief); + //printf("new ClassDef %s tempArgList=%p specScope=%s\n",fullName.data(),root->tArgList,root->scopeSpec.data()); - cd->setFileDef(fd); - if (cd->hasDocumentation()) - { - addIncludeFile(cd,fd,root); - } - - // namespace is part of the class name - if (!found && !namespaceName.isEmpty()) - { - NamespaceDef *nd = getResolvedNamespace(namespaceName); - if (nd) - { - cd->setNamespace(nd); - nd->insertClass(cd); - found=TRUE; - } - } - - // if the class is not in a namespace then we insert - // it in the file definition - if (!found && fd && (root->section & Entry::COMPOUND_MASK)) - { - //printf(">> Inserting class `%s' in file `%s' (root->fileName=`%s')\n", - // cd->name().data(), - // fd->name().data(), - // root->fileName.data() - // ); - fd->insertClass(cd); - } - - // the empty string test is needed for extract all case - cd->setBriefDescription(root->brief); - cd->insertUsedFile(root->fileName); - // add class to the list - //printf("ClassDict.insert(%s)\n",resolveDefines(fullName).data()); - Doxygen::classSDict.append(fullName,cd); + ArgumentList *tArgList = + getTemplateArgumentsFromName(fullName,root->tArgLists); + //printf("class %s template args=%s\n",fullName.data(), + // tArgList ? tempArgListToString(tArgList).data() : "<none>"); + cd->setTemplateArguments(tArgList); + cd->setProtection(root->protection); + cd->addSectionsToDefinition(root->anchors); + cd->setIsStatic(root->stat); - // also add class to the correct structural context - Definition *d = findScopeFromQualifiedName(Doxygen::globalScope,fullName); - if (d==0) - { - //warn(root->fileName,root->startLine, - // "Warning: Internal inconsistency: scope for class %s not " - // "found!\n",fullName.data() - // ); - } - else + // file definition containing the class cd + cd->setBodySegment(root->bodyLine,root->endBodyLine); + cd->setBodyDef(fd); + if (!root->subGrouping) cd->setSubGrouping(FALSE); + + addClassToGroups(root,cd); + cd->setRefItems(root->todoId,root->testId,root->bugId); + + // see if the class is found inside a namespace + bool found=addNamespace(root,cd); + + cd->setFileDef(fd); + if (cd->hasDocumentation()) + { + addIncludeFile(cd,fd,root); + } + + // namespace is part of the class name + if (!found && !namespaceName.isEmpty()) + { + NamespaceDef *nd = getResolvedNamespace(namespaceName); + if (nd) { - //printf("****** adding %s to scope %s\n",cd->name().data(),d->name().data()); - d->addInnerCompound(cd); - cd->setOuterScope(d); + cd->setNamespace(nd); + nd->insertClass(cd); + found=TRUE; } } + + // if the class is not in a namespace then we insert + // it in the file definition + if (!found && fd && (root->section & Entry::COMPOUND_MASK)) + { + //printf(">> Inserting class `%s' in file `%s' (root->fileName=`%s')\n", + // cd->name().data(), + // fd->name().data(), + // root->fileName.data() + // ); + fd->insertClass(cd); + } + + // the empty string test is needed for extract all case + cd->setBriefDescription(root->brief); + cd->insertUsedFile(root->fileName); + + // add class to the list + //printf("ClassDict.insert(%s)\n",resolveDefines(fullName).data()); + Doxygen::classSDict.append(fullName,cd); + + // also add class to the correct structural context + Definition *d = findScopeFromQualifiedName(Doxygen::globalScope,fullName); + if (d==0) + { + //warn(root->fileName,root->startLine, + // "Warning: Internal inconsistency: scope for class %s not " + // "found!\n",fullName.data() + // ); + } + else + { + //printf("****** adding %s to scope %s\n",cd->name().data(),d->name().data()); + d->addInnerCompound(cd); + cd->setOuterScope(d); + } } } +error: EntryListIterator eli(*root->sublist); Entry *e; for (;(e=eli.current());++eli) @@ -1847,7 +1846,7 @@ static void buildFunctionList(Entry *root) //printf("match!\n"); // see if we need to create a new member found=(nd && rnd && nsName==rnsName) || // members are in the same namespace - ((fd!=0 && // no external reference and + ((nd==0 && rnd==0 && fd!=0 && // no external reference and fd->absFilePath()==root->fileName // prototype in the same file ) ); @@ -2167,6 +2166,11 @@ static void transferFunctionDocumentation() } mdec->mergeMemberSpecifiers(mdef->getMemberSpecifiers()); mdef->mergeMemberSpecifiers(mdec->getMemberSpecifiers()); + + int todoId = QMAX(mdec->todoId(),mdef->todoId()); + int testId = QMAX(mdec->testId(),mdef->testId()); + int bugId = QMAX(mdec->bugId() ,mdef->bugId() ); + mdec->setRefItems(todoId,testId,bugId); } } } @@ -4775,6 +4779,7 @@ static void buildCompleteMemberLists() cd->subClasses()->count()==0 && // is a root of the hierarchy cd->baseClasses()->count()>0) // and has at least one base class { + //printf("*** merging members for %s\n",cd->name().data()); cd->mergeMembers(); } } @@ -6954,8 +6959,8 @@ void parseInput() msg("Determining which enums are documented\n"); findDocumentedEnumValues(); - msg("Computing member references...\n"); - computeMemberReferences(); + //msg("Computing member references...\n"); + //computeMemberReferences(); msg("Computing member relations...\n"); computeMemberRelations(); @@ -6975,6 +6980,9 @@ void parseInput() msg("Building full member lists recursively...\n"); buildCompleteMemberLists(); + msg("Computing member references...\n"); + computeMemberReferences(); + if (Config_getBool("INHERIT_DOCS")) { msg("Inheriting documentation...\n"); diff --git a/src/filedef.cpp b/src/filedef.cpp index 620c8a9..144f8c6 100644 --- a/src/filedef.cpp +++ b/src/filedef.cpp @@ -84,7 +84,7 @@ FileDef::~FileDef() /*! Compute the HTML anchor names for all members in the class */ void FileDef::computeAnchors() { - setAnchors('a',&allMemberList); + setAnchors(0,'a',&allMemberList); } void FileDef::distributeMemberGroupDocumentation() diff --git a/src/groupdef.cpp b/src/groupdef.cpp index f879d60..7e2a54f 100644 --- a/src/groupdef.cpp +++ b/src/groupdef.cpp @@ -343,7 +343,7 @@ int GroupDef::countMembers() const /*! Compute the HTML anchor names for all members in the class */ void GroupDef::computeAnchors() { - setAnchors('a',allMemberList); + setAnchors(0,'a',allMemberList); } void GroupDef::writeDocumentation(OutputList &ol) diff --git a/src/htmlgen.h b/src/htmlgen.h index 75c2a00..387065e 100644 --- a/src/htmlgen.h +++ b/src/htmlgen.h @@ -249,6 +249,11 @@ class HtmlGenerator : public OutputGenerator void startFontClass(const char *s) { t << "<font class=\"" << s << "\">"; } void endFontClass() { t << "</font>"; } + void startHtmlOnly() {} + void endHtmlOnly() {} + void startLatexOnly() {} + void endLatexOnly() {} + private: QCString lastTitle; QCString lastFile; diff --git a/src/lang_cfg.h b/src/lang_cfg.h index 581905b..4e6639b 100644 --- a/src/lang_cfg.h +++ b/src/lang_cfg.h @@ -21,3 +21,4 @@ #define LANG_DK #define LANG_SK #define LANG_UA +#define LANG_GR diff --git a/src/language.cpp b/src/language.cpp index 33da153..5f27716 100644 --- a/src/language.cpp +++ b/src/language.cpp @@ -91,6 +91,12 @@ #ifdef LANG_UA #include "translator_ua.h" #endif +#ifdef LANG_GR +#include "translator_gr.h" +#endif +//#ifdef LANG_JS +//#include "translator_js.h" +//#endif #endif #define L_EQUAL(a) !stricmp(langName,a) @@ -242,6 +248,16 @@ bool setTranslator(const char *langName) theTranslator=new TranslatorUkrainian; } #endif +#ifdef LANG_GR + else if (L_EQUAL("greek")) + { + theTranslator=new TranslatorGreek; + } +#endif +// else if (L_EQUAL("japanese-sjis")) +// { +// theTranslator=new TranslatorJapaneseSjis; +// } #endif else // use the default language (i.e. english) { diff --git a/src/latexgen.cpp b/src/latexgen.cpp index 0f24f6e..49469de 100644 --- a/src/latexgen.cpp +++ b/src/latexgen.cpp @@ -272,8 +272,9 @@ static void writeDefaultHeaderPart1(QTextStream &t) t << "\\makeindex\n" "\\setcounter{tocdepth}{1}\n" "\\setlength{\\footrulewidth}{0.4pt}\n" - "\\begin{document}\n" - "\\begin{titlepage}\n" + "\\begin{document}\n"; + if (theTranslator->idLanguage()=="greek") t << "\\selectlanguage{greek}\n"; + t << "\\begin{titlepage}\n" "\\vspace*{7cm}\n" "\\begin{center}\n" "{\\Large "; @@ -1380,13 +1381,15 @@ void LatexGenerator::latin2ToLatex(unsigned char c) //void LatexGenerator::docifyStatic(QTextStream &t,const char *str) void LatexGenerator::docify(const char *str) { - static bool isCzech = theTranslator->idLanguage()=="czech"; - static bool isJapanese = theTranslator->idLanguage()=="japanese"; - static bool isKorean = theTranslator->idLanguage()=="korean"; - static bool isRussian = theTranslator->idLanguage()=="russian"; - static bool isUkrainian = theTranslator->idLanguage()=="ukrainian"; - static bool isChinese = theTranslator->idLanguage()=="chinese"; - static bool isLatin2 = theTranslator->idLanguageCharset()=="iso-8859-2"; + static bool isCzech = theTranslator->idLanguage()=="czech"; + static bool isJapanese = theTranslator->idLanguage()=="japanese"; + static bool isJapaneseSjis = theTranslator->idLanguage()=="japanese-sjis"; + static bool isKorean = theTranslator->idLanguage()=="korean"; + static bool isRussian = theTranslator->idLanguage()=="russian"; + static bool isUkrainian = theTranslator->idLanguage()=="ukrainian"; + static bool isChinese = theTranslator->idLanguage()=="chinese"; + static bool isLatin2 = theTranslator->idLanguageCharset()=="iso-8859-2"; + static bool isGreek = theTranslator->idLanguage()=="greek"; if (str) { const unsigned char *p=(const unsigned char *)str; @@ -1452,7 +1455,7 @@ void LatexGenerator::docify(const char *str) default: // Some languages uses wide characters - if (isJapanese || isKorean || isChinese) + if (isJapanese || isJapaneseSjis || isKorean || isChinese) { if (c>=128) { @@ -1494,6 +1497,17 @@ void LatexGenerator::docify(const char *str) t << (char)c; } } + else if (isGreek) + { + if (c<128) + { + t << "\\textlatin{" << (char)c << "}"; + } + else + { + t << (char)c; + } + } else // language is other than Czech, Russian or Japanese { switch(c) diff --git a/src/latexgen.h b/src/latexgen.h index 51947c2..5d5eab8 100644 --- a/src/latexgen.h +++ b/src/latexgen.h @@ -255,6 +255,11 @@ class LatexGenerator : public OutputGenerator void startFontClass(const char *) {} void endFontClass() {} + + void startHtmlOnly() {} + void endHtmlOnly() {} + void startLatexOnly() {} + void endLatexOnly() {} private: void latin2ToLatex(unsigned char); diff --git a/src/libdoxygen.pro.in b/src/libdoxygen.pro.in index 6b73443..14914f9 100644 --- a/src/libdoxygen.pro.in +++ b/src/libdoxygen.pro.in @@ -76,6 +76,7 @@ HEADERS = bufstr.h \ translator_es.h \ translator_fi.h \ translator_fr.h \ + translator_gr.h \ translator_hr.h \ translator_hu.h \ translator_it.h \ diff --git a/src/mangen.cpp b/src/mangen.cpp index 9c06dc0..3864ee7 100644 --- a/src/mangen.cpp +++ b/src/mangen.cpp @@ -143,6 +143,7 @@ void ManGenerator::startFile(const char *,const char *manName, void ManGenerator::endFile() { + t << endl; endPlainFile(); } diff --git a/src/mangen.h b/src/mangen.h index ea944be..2b95de9 100644 --- a/src/mangen.h +++ b/src/mangen.h @@ -237,6 +237,11 @@ class ManGenerator : public OutputGenerator void startFontClass(const char *) {} void endFontClass() {} + void startHtmlOnly() {} + void endHtmlOnly() {} + void startLatexOnly() {} + void endLatexOnly() {} + private: bool firstCol; bool paragraph; diff --git a/src/memberdef.cpp b/src/memberdef.cpp index edcf1e7..baa1452 100644 --- a/src/memberdef.cpp +++ b/src/memberdef.cpp @@ -129,6 +129,7 @@ static void writeDefArgumentList(OutputList &ol,ClassDef *cd, } if ((vp=a->type.find(re))!=-1) // argument type is a function pointer { + //printf("a->type=`%s' a->name=`%s'\n",a->type.data(),a->name.data()); QCString n=a->type.left(vp); if (!cName.isEmpty()) n=addTemplateNames(n,cd->name(),cName); linkifyText(TextGeneratorOLImpl(ol),scopeName,md->name(),n); @@ -367,10 +368,7 @@ void MemberDef::setReimplements(MemberDef *md) { m_templateMaster->setReimplements(md); } - else - { - redefines=md; - } + redefines=md; } void MemberDef::insertReimplementedBy(MemberDef *md) @@ -379,11 +377,8 @@ void MemberDef::insertReimplementedBy(MemberDef *md) { m_templateMaster->insertReimplementedBy(md); } - else - { - if (redefinedBy==0) redefinedBy = new MemberList; - redefinedBy->inSort(md); - } + if (redefinedBy==0) redefinedBy = new MemberList; + redefinedBy->inSort(md); } void MemberDef::insertEnumField(MemberDef *md) @@ -491,6 +486,7 @@ ClassDef *MemberDef::getClassDefOfAnonymousType() if (ltype.left(7)=="friend ") ltype=ltype.right(ltype.length()-7); static QRegExp r("@[0-9]+"); int l,i=r.match(ltype,0,&l); + //printf("ltype=`%s' i=%d\n",ltype.data(),i); // search for the last anonymous scope in the member type ClassDef *annoClassDef=0; if (i!=-1) // found anonymous scope in type @@ -498,10 +494,9 @@ ClassDef *MemberDef::getClassDefOfAnonymousType() int il=i-1,ir=i+l; // extract anonymous scope while (il>=0 && (isId(ltype.at(il)) || ltype.at(il)==':' || ltype.at(il)=='@')) il--; - if (il>0) il++; + if (il>0) il++; else if (il<0) il=0; while (ir<(int)ltype.length() && (isId(ltype.at(ir)) || ltype.at(ir)==':' || ltype.at(ir)=='@')) ir++; - //QCString annName = ltype.mid(i,l); QCString annName = ltype.mid(il,ir-il); // if inside a class or namespace try to prepend the scope name @@ -745,7 +740,7 @@ void MemberDef::writeDeclaration(OutputList &ol, } // write name - if (!name().isEmpty() && name().at(0)!='@') + if (!name().isEmpty() && name().at(0)!='@') // hide annonymous stuff { //printf("Member name=`%s gd=%p md->groupDef=%p inGroup=%d isLinkable()=%d\n",name().data(),gd,getGroupDef(),inGroup,isLinkable()); if (isLinkable()) @@ -764,7 +759,9 @@ void MemberDef::writeDeclaration(OutputList &ol, else { //printf("writeLink %s->%d\n",name.data(),hasDocumentation()); - writeLink(ol,cd,nd,fd,gd); + ClassDef *rcd = cd; + if (isReference() && classDef) rcd = classDef; + writeLink(ol,rcd,nd,fd,gd); } } else if (isDocumentedFriendClass()) @@ -903,7 +900,7 @@ bool MemberDef::isDetailedSectionVisible(bool inGroup) const { bool groupFilter = getGroupDef()==0 || inGroup; - bool visible = isDetailedSectionLinkable() && groupFilter; + bool visible = isDetailedSectionLinkable() && groupFilter && !isReference(); //printf("MemberDef::isDetailedSectionVisible() %d\n",visible); return visible; } @@ -1102,7 +1099,7 @@ void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol, isFriend() || isRelated() || isExplicit() || isMutable() || (isInline() && Config_getBool("INLINE_INFO")) || isSignal() || isSlot() || - isStatic() + isStatic() || (classDef && classDef!=container) ) { // write the member specifier list @@ -1126,6 +1123,7 @@ void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol, if (isSignal()) sl.append("signal"); if (isSlot()) sl.append("slot"); } + if (classDef && classDef!=container) sl.append("inherited"); const char *s=sl.first(); while (s) { @@ -1165,22 +1163,29 @@ void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol, parseCode(ol,scopeName,init,FALSE,0); ol.endCodeFragment(); } + + QCString brief = m_templateMaster ? + m_templateMaster->briefDescription() : briefDescription(); + QCString detailed = m_templateMaster ? + m_templateMaster->documentation() : documentation(); + ArgumentList *docArgList = m_templateMaster ? + m_templateMaster->argList : argList; /* write brief description */ - if (!briefDescription().isEmpty() && + if (!brief.isEmpty() && (Config_getBool("REPEAT_BRIEF") /* || (!Config_getBool("BRIEF_MEMBER_DESC") && documentation().isEmpty())*/ ) /* || !annMemb */ ) { - parseDoc(ol,m_defFileName,m_defLine,scopeName,name(),briefDescription()); + parseDoc(ol,m_defFileName,m_defLine,scopeName,name(),brief); ol.newParagraph(); } /* write detailed description */ - if (!documentation().isEmpty()) + if (!detailed.isEmpty()) { - parseDoc(ol,m_defFileName,m_defLine,scopeName,name(),documentation()+"\n"); + parseDoc(ol,m_defFileName,m_defLine,scopeName,name(),detailed+"\n"); ol.pushGeneratorState(); ol.disableAllBut(OutputGenerator::RTF); ol.newParagraph(); @@ -1190,7 +1195,7 @@ void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol, //printf("***** argList=%p name=%s docs=%s hasDocs=%d\n", // argList, // argList?argList->hasDocumentation():-1); - if (argList && argList->hasDocumentation()) + if (docArgList && docArgList->hasDocumentation()) { //printf("***** argumentList is documented\n"); ol.startParamList(BaseOutputDocInterface::Param); @@ -1198,7 +1203,7 @@ void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol, ol.endDescTitle(); ol.writeDescItem(); ol.startDescTable(); - ArgumentListIterator ali(*argList); + ArgumentListIterator ali(*docArgList); Argument *a; for (ali.toFirst();(a=ali.current());++ali) { @@ -1293,21 +1298,6 @@ void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol, ClassDef *bcd=0; if (bmd && (bcd=bmd->getClassDef())) { -#if 0 - if (lvirt!=Normal) // search for virtual member of the deepest base class - { - MemberDef *lastBmd=bmd; - while (lastBmd) - { - ClassDef *lastBcd = lastBmd->getClassDef(); - if (lastBmd->virtualness()!=Normal && - lastBmd->isLinkable() && - lastBcd->isLinkable() - ) { bmd=lastBmd; bcd=lastBcd; } - lastBmd=lastBmd->reimplements(); - } - } -#endif // write class that contains a member that is reimplemented by this one if (bcd->isLinkable()) { @@ -1543,6 +1533,11 @@ QCString MemberDef::getScopeString() const return result; } +void MemberDef::setAnchor(const char *a) +{ + anc=a; +} + QCString MemberDef::anchor() const { if (m_templateMaster) return m_templateMaster->anchor(); @@ -1601,6 +1596,9 @@ MemberDef *MemberDef::createTemplateInstanceMember( actArg->type = substituteTemplateArgumentsInString(actArg->type,formalArgs,actualArgs); actualArgList->append(actArg); } + actualArgList->constSpecifier = argList->constSpecifier; + actualArgList->volatileSpecifier = argList->volatileSpecifier; + actualArgList->pureSpecifier = argList->pureSpecifier; } MemberDef *imd = new MemberDef( @@ -1613,7 +1611,11 @@ MemberDef *MemberDef::createTemplateInstanceMember( ); imd->argList = actualArgList; imd->def = substituteTemplateArgumentsInString(def,formalArgs,actualArgs); + imd->setBodyDef(getBodyDef()); + imd->setBodySegment(getStartBodyLine(),getEndBodyLine()); + // TODO: init other member variables (if needed). + // TODO: reimplemented info return imd; } @@ -1663,6 +1665,7 @@ void MemberDef::addListReference(Definition *d) memName.prepend(pd->name()+"::"); } } + //printf("*** addListReference %s todo=%d test=%d bug=%d\n",name().data(),todoId(),testId(),bugId()); addRefItem(todoId(),testId(),bugId(),memLabel, d->getOutputFileBase()+":"+anchor(),memName,argsString()); } diff --git a/src/memberdef.h b/src/memberdef.h index 44fac2d..df4b794 100644 --- a/src/memberdef.h +++ b/src/memberdef.h @@ -135,7 +135,7 @@ class MemberDef : public Definition void setMemberType(MemberType t) { mtype=t; } void setDefinition(const char *d) { def=d; } void setFileDef(FileDef *fd) { fileDef=fd; } - void setAnchor(const char *a) { anc=a; } + void setAnchor(const char *a); void setProtection(Protection p) { prot=p; } void setMemberSpecifiers(int s) { memSpec=s; } void mergeMemberSpecifiers(int s) { memSpec|=s; } diff --git a/src/membergroup.cpp b/src/membergroup.cpp index 1f5dffd..469ad0d 100644 --- a/src/membergroup.cpp +++ b/src/membergroup.cpp @@ -84,7 +84,7 @@ void MemberGroup::insertMember(MemberDef *md) void MemberGroup::setAnchors() { - ::setAnchors('z',memberList,grpId); + ::setAnchors(0,'z',memberList,grpId); } void MemberGroup::writeDeclarations(OutputList &ol, diff --git a/src/memberlist.cpp b/src/memberlist.cpp index af318e3..fdffc33 100644 --- a/src/memberlist.cpp +++ b/src/memberlist.cpp @@ -373,54 +373,8 @@ void MemberList::writePlainDeclarations(OutputList &ol, } case MemberDef::Friend: { -#if 0 - //printf("Writing friend `%s'\n",md->name().data()); - QCString type=md->typeString(); - //printf("Friend: type=%s name=%s\n",type.data(),md->name().data()); - bool isFriendClass = type=="friend class"; - if (!isFriendClass) - { -#endif - if (first) ol.startMemberList(),first=FALSE; - md->writeDeclaration(ol,cd,nd,fd,gd,m_inGroup); -#if 0 - } - else // isFriendClass - // friend is undocumented as a member but it is a class, - // so generate a link to the class if that is documented. - { - ClassDef *cd=getClass(md->name()); - if (md->hasDocumentation()) // friend is documented - { - if (first) ol.startMemberList(),first=FALSE; - ol.startMemberItem(0); - ol.docify("class "); - ol.insertMemberAlign(); - ol.writeObjectLink(0,0,md->anchor(),md->name()); - ol.endMemberItem(FALSE); - } - else if (cd && cd->isLinkable()) // class is documented - { - if (first) ol.startMemberList(),first=FALSE; - ol.startMemberItem(0); - ol.docify("class "); - ol.insertMemberAlign(); - ol.writeObjectLink(cd->getReference(),cd->getOutputFileBase(),0,cd->name()); - ol.endMemberItem(FALSE); - } - else if (!Config_getBool("HIDE_UNDOC_MEMBERS")) // no documentation - { - if (first) ol.startMemberList(),first=FALSE; - ol.startMemberItem(0); - ol.docify("class "); - ol.insertMemberAlign(); - ol.startBold(); - ol.docify(md->name()); - ol.endBold(); - ol.endMemberItem(FALSE); - } - } -#endif + if (first) ol.startMemberList(),first=FALSE; + md->writeDeclaration(ol,cd,nd,fd,gd,m_inGroup); break; } case MemberDef::EnumValue: diff --git a/src/namespacedef.cpp b/src/namespacedef.cpp index 25b6bad..89584ba 100644 --- a/src/namespacedef.cpp +++ b/src/namespacedef.cpp @@ -167,7 +167,7 @@ void NamespaceDef::insertMember(MemberDef *md) void NamespaceDef::computeAnchors() { - setAnchors('a',&allMemberList); + setAnchors(0,'a',&allMemberList); } void NamespaceDef::writeDocumentation(OutputList &ol) diff --git a/src/outputgen.h b/src/outputgen.h index 1e061e6..3d6bfae 100644 --- a/src/outputgen.h +++ b/src/outputgen.h @@ -257,6 +257,11 @@ class BaseOutputDocInterface virtual void startFontClass(const char *) = 0; virtual void endFontClass() = 0; + virtual void startHtmlOnly() = 0; + virtual void endHtmlOnly() = 0; + virtual void startLatexOnly() = 0; + virtual void endLatexOnly() = 0; + /*! Writes an ASCII string to the output. This function should keep * spaces visible, should break lines at a newline and should convert * tabs to the right number of spaces. diff --git a/src/outputlist.h b/src/outputlist.h index 8f3152a..88f3cb4 100644 --- a/src/outputlist.h +++ b/src/outputlist.h @@ -434,6 +434,15 @@ class OutputList : public OutputDocInterface void endFontClass() { forall(&OutputGenerator::endFontClass); } + void startHtmlOnly() + { forall(&OutputGenerator::startHtmlOnly); } + void endHtmlOnly() + { forall(&OutputGenerator::endHtmlOnly); } + void startLatexOnly() + { forall(&OutputGenerator::startLatexOnly); } + void endLatexOnly() + { forall(&OutputGenerator::endLatexOnly); } + #if 0 void startPlainFile(const char *name) { forall(&OutputGenerator::startPlainFile,name); } diff --git a/src/rtfgen.h b/src/rtfgen.h index 980aea6..0f967b6 100644 --- a/src/rtfgen.h +++ b/src/rtfgen.h @@ -240,6 +240,11 @@ class RTFGenerator : public OutputGenerator void startFontClass(const char *) {} void endFontClass() {} + void startHtmlOnly() {} + void endHtmlOnly() {} + void startLatexOnly() {} + void endLatexOnly() {} + static bool preProcessFileInplace(const char *path,const char *name); private: diff --git a/src/scanner.l b/src/scanner.l index 5615224..6371b71 100644 --- a/src/scanner.l +++ b/src/scanner.l @@ -920,6 +920,10 @@ CHARLIT (("'"\\[0-7]{1,3}"'")|("'"\\."'")|("'"[^'\\\n]{1,4}"'")) current->name = current->name.simplifyWhiteSpace(); BEGIN( FindMembers ) ; } +<Operator>";" { // can occur when importing members + unput(';'); + BEGIN( FindMembers ) ; + } <Operator>[^(] { lineCount(); current->name += *yytext ; @@ -1093,6 +1097,11 @@ CHARLIT (("'"\\[0-7]{1,3}"'")|("'"\\."'")|("'"[^'\\\n]{1,4}"'")) BEGIN( ReadFuncArgType ) ; } } +<EndTemplate>">"{BN}*/"("({BN}*{ID}{BN}*"::")*({BN}*"*"{BN}*)+ { // function pointer returning a template instance + lineCount(); + current->name+='>'; + BEGIN(FindMembers); + } <EndTemplate>">"{BN}*/"::" { lineCount(); current->name+='>'; @@ -2033,24 +2042,58 @@ CHARLIT (("'"\\[0-7]{1,3}"'")|("'"\\."'")|("'"[^'\\\n]{1,4}"'")) } /* a special comment */ <ReadFuncArgType>("/*"[*!]|"//"[/!])("<"?) { - fullArgString+=yytext; - lastCopyArgChar=0; - if (yytext[1]=='/') - BEGIN( CopyArgCommentLine ); + if (currentArgumentContext==DefineEnd) + { + // for defines we interpret a comment + // as documentation for the define + int i;for (i=yyleng-1;i>=0;i--) + { + unput(yytext[i]); + } + stringToArgumentList(fullArgString,current->argList); + BEGIN( currentArgumentContext ); + } else - BEGIN( CopyArgComment ); + { + // for functions we interpret a comment + // as documentation for the argument + fullArgString+=yytext; + lastCopyArgChar=0; + if (yytext[1]=='/') + BEGIN( CopyArgCommentLine ); + else + BEGIN( CopyArgComment ); + } } /* `)' followed by a special comment */ <ReadFuncArgType>")"{BN}*("/*"[*!]|"//"[/!])"<" { lineCount(); - lastCopyArgChar=*yytext; - QCString text=&yytext[1]; - text=text.stripWhiteSpace(); - fullArgString+=text; - if (text.find("//")!=-1) - BEGIN( CopyArgCommentLine ); + if (currentArgumentContext==DefineEnd) + { + // for defines we interpret a comment + // as documentation for the define + int i;for (i=yyleng-1;i>0;i--) + { + unput(yytext[i]); + } + *copyArgString+=*yytext; + fullArgString+=*yytext; + stringToArgumentList(fullArgString,current->argList); + BEGIN( currentArgumentContext ); + } else - BEGIN( CopyArgComment ); + { + // for functions we interpret a comment + // as documentation for the last argument + lastCopyArgChar=*yytext; + QCString text=&yytext[1]; + text=text.stripWhiteSpace(); + fullArgString+=text; + if (text.find("//")!=-1) + BEGIN( CopyArgCommentLine ); + else + BEGIN( CopyArgComment ); + } } <CopyArgComment>[^\n\*]+ { fullArgString+=yytext; } <CopyArgComment>"*/" { fullArgString+=yytext; diff --git a/src/tagreader.cpp b/src/tagreader.cpp index 207d977..5f35a6d 100644 --- a/src/tagreader.cpp +++ b/src/tagreader.cpp @@ -32,6 +32,7 @@ #include "doxygen.h" #include "util.h" #include "message.h" +#include "defargs.h" //#include "reflist.h" /*! Container for member specific info that can be read from a tagfile */ @@ -859,6 +860,11 @@ void TagFileParser::buildMemberList(Entry *ce,QList<TagMemberInfo> &members) me->type = tmi->type; me->name = tmi->name; me->args = tmi->arglist; + if (!me->args.isEmpty()) + { + me->argList = new ArgumentList; + stringToArgumentList(me->args,me->argList); + } me->protection = tmi->prot; me->virt = tmi->virt; me->stat = tmi->isStatic; diff --git a/src/translator_adapter.h b/src/translator_adapter.h index 136cc75..a103405 100644 --- a/src/translator_adapter.h +++ b/src/translator_adapter.h @@ -267,252 +267,4 @@ class TranslatorAdapter_1_2_1 : public TranslatorAdapter_1_2_2 { return english.trDCOPMethods(); } }; -/*! \brief Translator adapter class for release 1.2.0 - * - * Translator adapter for dealing with translator changes since - * release 1.2.0 - */ -class TranslatorAdapter_1_2_0 : public TranslatorAdapter_1_2_1 -{ - public: - virtual QCString updateNeededMessage() - { return createUpdateNeededMessage(idLanguage(),"release 1.2.0"); } - - virtual QCString trTest() - { return english.trTest(); } - - virtual QCString trTestList() - { return english.trTestList(); } - -}; - -/*! \brief Translator adapter class for release 1.1.5 - * - * Translator adapter for dealing with translator changes since - * release 1.1.5 - */ -class TranslatorAdapter_1_1_5 : public TranslatorAdapter_1_2_0 -{ - public: - virtual QCString updateNeededMessage() - { return createUpdateNeededMessage(idLanguage(),"release 1.1.5"); } - - virtual QCString trLegendTitle() - { return english.trLegendTitle(); } - - virtual QCString trLegendDocs() - { return english.trLegendDocs(); } - - virtual QCString trLegend() - { return english.trLegend(); } -}; - -/*! \brief Translator adapter class for release 1.1.4 - * - * Translator adapter for dealing with translator changes since - * release 1.1.4 - */ -class TranslatorAdapter_1_1_4 : public TranslatorAdapter_1_1_5 -{ - public: - virtual QCString updateNeededMessage() - { return createUpdateNeededMessage(idLanguage(),"release 1.1.4"); } - - virtual QCString trReferencedBy() - { return english.trReferencedBy(); } - - virtual QCString trRemarks() - { return english.trRemarks(); } - - virtual QCString trAttention() - { return english.trAttention(); } - - virtual QCString trInclByDepGraph() - { return english.trInclByDepGraph(); } - - virtual QCString trSince() - { return english.trSince(); } -}; - -/*! \brief Translator adapter class for release 1.1.3 - * - * Translator adapter for dealing with translator changes since - * release 1.1.3 - */ -class TranslatorAdapter_1_1_3 : public TranslatorAdapter_1_1_4 -{ - public: - virtual QCString updateNeededMessage() - { return createUpdateNeededMessage(idLanguage(),"release 1.1.3"); } - - virtual QCString trTodo() - { return english.trTodo(); } - - virtual QCString trTodoList() - { return english.trTodoList(); } -}; - -/*! \brief Translator adapter class for release 1.1.0 - * - * Translator adapter for dealing with translator changes since - * release 1.1.0 - */ -class TranslatorAdapter_1_1_0 : public TranslatorAdapter_1_1_3 -{ - public: - virtual QCString updateNeededMessage() - { return createUpdateNeededMessage(idLanguage(),"release 1.1.0"); } - - virtual QCString trNote() - { return english.trNote(); } - - virtual QCString trPublicTypes() - { return english.trPublicTypes(); } - - virtual QCString trPublicAttribs() - { return english.trPublicAttribs(); } - - virtual QCString trStaticPublicAttribs() - { return english.trStaticPublicAttribs(); } - - virtual QCString trProtectedTypes() - { return english.trProtectedTypes(); } - - virtual QCString trProtectedAttribs() - { return english.trProtectedAttribs(); } - - virtual QCString trStaticProtectedAttribs() - { return english.trStaticProtectedAttribs(); } - - virtual QCString trPrivateTypes() - { return english.trPrivateTypes(); } - - virtual QCString trPrivateAttribs() - { return english.trPrivateAttribs(); } - - virtual QCString trStaticPrivateAttribs() - { return english.trStaticPrivateAttribs(); } - - virtual QCString trEnumerationValueDocumentation() - { return english.trEnumerationValueDocumentation(); } -}; - -/*! \brief Translator adapter class for release 1.0.0 - * - * Translator adapter for dealing with translator changes since - * release 1.0.0 - */ -class TranslatorAdapter_1_0_0 : public TranslatorAdapter_1_1_0 -{ - virtual QCString updateNeededMessage() - { return createUpdateNeededMessage(idLanguage(),"release 1.0.0"); } - - virtual QCString trIncludingInheritedMembers() - { return english.trIncludingInheritedMembers(); } - - virtual QCString trFuncProtos() - { return english.trFuncProtos(); } - - virtual QCString trNamespaces() - { return english.trNamespaces(); } - - virtual QCString trGeneratedFromFiles(ClassDef::CompoundType compType, - bool single) - { return english.trGeneratedFromFiles(compType, single); } - - virtual QCString trAlphabeticalList() - { return english.trAlphabeticalList(); } - - virtual QCString trReturnValues() - { return english.trReturnValues(); } - - virtual QCString trMainPage() - { return english.trMainPage(); } - - virtual QCString trPageAbbreviation() - { return english.trPageAbbreviation(); } - - virtual QCString trSources() - { return english.trSources(); } - - virtual QCString trStaticProtectedMembers() - { return english.trStaticProtectedMembers(); } - - virtual QCString trDefinedAtLineInSourceFile() - { return english.trDefinedAtLineInSourceFile(); } - - virtual QCString trDefinedInSourceFile() - { return english.trDefinedInSourceFile(); } - - virtual QCString trDeprecated() - { return english.trDeprecated(); } - - virtual QCString trCollaborationDiagram(const char *clName) - { return english.trCollaborationDiagram(clName); } - - virtual QCString trInclDepGraph(const char *fName) - { return english.trInclDepGraph(fName); } - - virtual QCString trConstructorDocumentation() - { return english.trConstructorDocumentation(); } - - virtual QCString trGotoSourceCode() - { return english.trGotoSourceCode(); } - - virtual QCString trGotoDocumentation() - { return english.trGotoDocumentation(); } - - virtual QCString trPrecondition() - { return english.trPrecondition(); } - - virtual QCString trPostcondition() - { return english.trPostcondition(); } - - virtual QCString trInvariant() - { return english.trInvariant(); } - - virtual QCString trInitialValue() - { return english.trInitialValue(); } - - virtual QCString trCode() - { return english.trCode(); } - - virtual QCString trGraphicalHierarchy() - { return english.trGraphicalHierarchy(); } - - virtual QCString trGotoGraphicalHierarchy() - { return english.trGotoGraphicalHierarchy(); } - - virtual QCString trGotoTextualHierarchy() - { return english.trGotoTextualHierarchy(); } - - virtual QCString trPageIndex() - { return english.trPageIndex(); } - - virtual QCString trReimplementedForInternalReasons() - { return english.trReimplementedForInternalReasons(); } - - virtual QCString trClassHierarchyDescription() - { return english.trClassHierarchyDescription(); } - - virtual QCString trNoDescriptionAvailable() - { return english.trNoDescriptionAvailable(); } - - virtual QCString trEnumerationValues() - { return english.trEnumerationValues(); } - - virtual QCString trFunctionPrototypeDocumentation() - { return english.trFunctionPrototypeDocumentation(); } - - virtual QCString trEnumerationTypeDocumentation() - { return english.trEnumerationTypeDocumentation(); } - - virtual QCString trFunctionDocumentation() - { return english.trFunctionDocumentation(); } - - virtual QCString trRelatedFunctionDocumentation() - { return english.trRelatedFunctionDocumentation(); } - -}; - #endif diff --git a/src/translator_fi.h b/src/translator_fi.h index fc39795..ba836a0 100644 --- a/src/translator_fi.h +++ b/src/translator_fi.h @@ -27,58 +27,67 @@ Olli Korhonen <olli.korhonen@ccc.fi> olla vakiintuneessa kδytφssδ. * Tehtδvδδ: - - Termien kokoaminen listaksi ja suomennosten jδrkevyyden tarkastelu. (lista on jo melko kattava) - Author = Tekijδ - Class = Luokka - Compound = Kooste ? - Data = Data - Documentation = Dokumentaatio - Defines = Mδδrittelyt ? - Description = Selite - Detailed = Yksityiskohtainen - diagram = kaavio - Enum = Enumeraatio ? - Exceptions = Poikkeukset - File = Tiedosto - Friends = Ystδvδt ? - Functions = Funktiot - Hierarchical = Hierarkinen - Index = Indeksi - Inherits = Perii - Member = Jδsen - Module = Moduli - Namespace = Nimiavaruus ? - Parameters = Parametrit - Private = Yksityinen - Protected = Suojattu - Prototypes = Prototyypit - Public = Julkinen - Reference Manual= Kδsikirja - Reimplemented = Uudelleen toteutettu - Related = Liittyvδ - Signals = Signaali - Slots = ? - Static = Staattinen - Struct = ? - Typedef = Tyyppimδδrittely - Union = ? - Variables = Muuttujat - - Taivutusmuotojen virheettφmyyden tarkastelu prepositioiden korvauskohdissa. - - Sanasta sanaan kδδnnφskohtien mielekkyyden tarkastelu valmiista dokumentista. - - umlaut vastineiden kδyttφ scandien kohdalla. + - Termien kokoaminen listaksi ja suomennosten jδrkevyyden tarkastelu. (lista on jo melko kattava) + Author = Tekijδ + Class = Luokka + Compound = Kooste ? + Data = Data + Documentation = Dokumentaatio + Defines = Mδδrittelyt ? + Description = Selite + Detailed = Yksityiskohtainen + diagram = kaavio + Enum = Enumeraatio ? + Exceptions = Poikkeukset + File = Tiedosto + Friends = Ystδvδt ? + Functions = Funktiot + Hierarchical = Hierarkinen + Index = Indeksi + Inherits = Perii + Member = Jδsen + Module = Moduli + Namespace = Nimiavaruus ? + Parameters = Parametrit + Private = Yksityinen + Protected = Suojattu + Prototypes = Prototyypit + Public = Julkinen + Reference Manual= Kδsikirja + Reimplemented = Uudelleen toteutettu + Related = Liittyvδ + Signals = Signaali + Slots = ? + Static = Staattinen + Struct = ? + Typedef = Tyyppimδδrittely + Union = ? + Variables = Muuttujat + - Taivutusmuotojen virheettφmyyden tarkastelu prepositioiden korvauskohdissa. + - Sanasta sanaan kδδnnφskohtien mielekkyyden tarkastelu valmiista dokumentista. + - umlaut vastineiden kδyttφ scandien kohdalla. positiiviset kommentit otetaan ilolla vastaan. =================================================================================== */ -#ifndef TRANSLATOR_SF_H -#define TRANSLATOR_SF_H +#ifndef TRANSLATOR_FI_H +#define TRANSLATOR_FI_H -#include "translator_adapter.h" - -class TranslatorFinnish : public TranslatorAdapter_1_0_0 +class TranslatorFinnish : public TranslatorEnglish { public: + /*! This method is used to generate a warning message to signal + * the user that the translation of his/her language of choice + * needs updating. + */ + virtual QCString updateNeededMessage() + { + return "Warning: The Finnish translator is really obsolete.\n" + "It was not updated since version 1.0.0. As a result,\n" + "some sentences may appear in English.\n\n"; + } + QCString idLanguage() { return "finnish"; } QCString latexBabelPackage() @@ -119,7 +128,7 @@ class TranslatorFinnish : public TranslatorAdapter_1_0_0 { // here s is one of " Class", " Struct" or " Union" // single is true implies a single file QCString result=(QCString)"Tδmδn "+s+ // "The documentation for this"+s+ - " dokumentaatio on generoitu ";// " was generated from the following file"; + " dokumentaatio on generoitu ";// " was generated from the following file"; if (single) result+="seuraavasta tiedostosta:"; else @@ -379,7 +388,7 @@ class TranslatorFinnish : public TranslatorAdapter_1_0_0 QCString trGeneratedAt(const char *date,const char *projName) { - // funktio on hiukan vaikea kδδntδδ prepositioihin sidotun rakenteen vuoksi. + // funktio on hiukan vaikea kδδntδδ prepositioihin sidotun rakenteen vuoksi. QCString result=(QCString)"Generoitu "+date; // "Generated at " if (projName) result+=(QCString)" projektille "+projName; // " for " result+=(QCString)" tekijδ: "; // " by" diff --git a/src/translator_gr.h b/src/translator_gr.h new file mode 100644 index 0000000..ba07ac7 --- /dev/null +++ b/src/translator_gr.h @@ -0,0 +1,1334 @@ +/****************************************************************************** + * + * + * + * Copyright (C) 1997-2001 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. + * + * Documents produced by Doxygen are derivative works derived from the + * input used in their production; they are not affected by this license. + * + */ + +/* + * 15 Dec 2001 : Translation to greek by + * Harry Kalogirou <harkal@rainbow.cs.unipi.gr> + */ + +#ifndef TRANSLATOR_GR_H +#define TRANSLATOR_GR_H + +class TranslatorGreek : public TranslatorAdapter_1_2_11 +{ + public: + + // --- Language control methods ------------------- + + /*! Used for identification of the language. The identification + * should not be translated. It should be replaced by the name + * of the language in English using lower-case characters only + * (e.g. "czech", "japanese", "russian", etc.). It should be equal to + * the identification used in language.cpp. + */ + virtual QCString idLanguage() + { return "greek"; } + virtual QCString latexBabelPackage() + { + return "greek"; + } + virtual QCString latexLanguageSupportCommand() + { + return "\\usepackage[greek,english]{babel}\n\\usepackage[iso-8859-7]{inputenc}\n"; + } + + /*! return the language charset. This will be used for the HTML output */ + virtual QCString idLanguageCharset() + { + return "iso-8859-7"; + } + + // --- Language translation methods ------------------- + + /*! used in the compound documentation before a list of related functions. */ + virtual QCString trRelatedFunctions() + { return "Σχετικές συναρτήσεις"; } + + /*! subscript for the related functions. */ + virtual QCString trRelatedSubscript() + { return "(Σημειώστε ότι αυτές δεν είναι συναρτήσεις μέλη.)"; } + + /*! header that is put before the detailed description of files, classes and namespaces. */ + virtual QCString trDetailedDescription() + { return "Λεπτομερή Περιγραφή"; } + + /*! header that is put before the list of typedefs. */ + virtual QCString trMemberTypedefDocumentation() + { return "Τεκμηρίωση Μελών Typedef"; } + + /*! header that is put before the list of enumerations. */ + virtual QCString trMemberEnumerationDocumentation() + { return "Τεκμηρίωση Απαριθμήσεων Μελών"; } + + /*! header that is put before the list of member functions. */ + virtual QCString trMemberFunctionDocumentation() + { return "Τεκμηρίωση Συναρτήσεων Μελών"; } + + /*! header that is put before the list of member attributes. */ + virtual QCString trMemberDataDocumentation() + { + if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C")) + { + return "Τεκμηρίωση Πεδίων"; + } + else + { + return "Τεκμηρίωση Δεδομένων Μελών"; + } + } + + /*! this is the text of a link put after brief descriptions. */ + virtual QCString trMore() + { return "Περισσότερα..."; } + + /*! put in the class documentation */ + virtual QCString trListOfAllMembers() + { return "Λίστα όλων των μελών."; } + + /*! used as the title of the "list of all members" page of a class */ + virtual QCString trMemberList() + { return "Λίστα μελών"; } + + /*! this is the first part of a sentence that is followed by a class name */ + virtual QCString trThisIsTheListOfAllMembers() + { return "Ακολουθεί η πλήρης λίστα των μελών της"; } + + /*! this is the remainder of the sentence after the class name */ + virtual QCString trIncludingInheritedMembers() + { return ", περιλαμβανομένων όλων των κληρονομημένων μελών."; } + + /*! this is put at the author sections at the bottom of man pages. + * parameter s is name of the project name. + */ + virtual QCString trGeneratedAutomatically(const char *s) + { QCString result="Δημιουργήθηκε αυτόματα από το Doxygen"; + if (s) result+=(QCString)" για "+s; + result+=" από τον πηγαίο κώδικα."; + return result; + } + + /*! put after an enum name in the list of all members */ + virtual QCString trEnumName() + { return "όνομα απαρύθμισης"; } + + /*! put after an enum value in the list of all members */ + virtual QCString trEnumValue() + { return "τιμή απαρύθμισης"; } + + /*! put after an undocumented member in the list of all members */ + virtual QCString trDefinedIn() + { return "ορισμένο στο "; } + + // 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). + */ + virtual QCString trModules() + { return "Κομμάτια"; } + + /*! This is put above each page as a link to the class hierarchy */ + virtual QCString trClassHierarchy() + { return "Ιεραρχία Κλάσεων"; } + + /*! This is put above each page as a link to the list of annotated classes */ + virtual QCString trCompoundList() + { + if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C")) + { + return "Δομές Δεδομένων"; + } + else + { + return "Λίστα Συσσωματωμάτων"; + } + } + + /*! This is put above each page as a link to the list of documented files */ + virtual QCString trFileList() + { return "Λίστα Αρχείων"; } + + /*! This is put above each page as a link to the list of all verbatim headers */ + virtual QCString trHeaderFiles() + { return "Αρχεία Κεφαλίδας"; } + + /*! This is put above each page as a link to all members of compounds. */ + virtual QCString trCompoundMembers() + { + if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C")) + { + return "Πεδία Δεδομένων"; + } + else + { + return "Μέλη Συσσωματώματα"; + } + } + + /*! This is put above each page as a link to all members of files. */ + virtual QCString trFileMembers() + { + if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C")) + { + return "Καθολικοί ορισμοί"; + } + else + { + return "Μέλη Αρχείων"; + } + } + + /*! This is put above each page as a link to all related pages. */ + virtual QCString trRelatedPages() + { return "Σχετικές Σελίδες"; } + + /*! This is put above each page as a link to all examples. */ + virtual QCString trExamples() + { return "Παραδείγματα"; } + + /*! This is put above each page as a link to the search engine. */ + virtual QCString trSearch() + { return "Αναζήτηση"; } + + /*! This is an introduction to the class hierarchy. */ + virtual QCString trClassHierarchyDescription() + { return "Αυτή η λίστα κληρονομηκότητας είναι μερικώς ταξινομημένη, " + "αλλά όχι πλήρως, αλφαβητικά:"; + } + + /*! This is an introduction to the list with all files. */ + virtual QCString trFileListDescription(bool extractAll) + { + QCString result="Ακολουθεί μια λίστα όλων των "; + if (!extractAll) result+="τεκμηριωμένων "; + result+="αρχείων με σύντομες περιγραφές:"; + return result; + } + + /*! This is an introduction to the annotated compound list. */ + virtual QCString trCompoundListDescription() + { + + if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C")) + { + return "Ακολουθούνε οι δομές δεδομένων με σύντομες περιγραφές:"; + } + else + { + return "Ακολουθούνε οι κλάσεις, οι δομές, " + "τα σώματα και οι διαπροσωπίες με σύντομες περιγραφές:"; + } + } + + /*! This is an introduction to the page with all class members. */ + virtual QCString trCompoundMembersDescription(bool extractAll) + { + QCString result="Ακολουθεί η λίστα όλων των "; + if (!extractAll) + { + result+="τεκμηριωμένων "; + } + if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C")) + { + result+="πεδίων δομών και σωμάτων "; + } + else + { + result+="κλάσεων"; + } + result+=" με συνδέσμους "; + if (extractAll) + { + if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C")) + { + result+="στην τεκμηρίωση των δομών/ενώσεων για κάθε πεδίο:"; + } + else + { + result+="στην τεκμηρίωση των κλάσεων για κάθε πεδίο:"; + } + } + else + { + if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C")) + { + result+="στις δομές/ενώσεις που ανήκουν:"; + } + else + { + result+="στις κλάσεις που ανήκουν:"; + } + } + return result; + } + + /*! This is an introduction to the page with all file members. */ + virtual QCString trFileMembersDescription(bool extractAll) + { + QCString result="Ακολουθεί η λίστα όλων των "; + if (!extractAll) result+="τεκμηριωμένων "; + + if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C")) + { + result+="συναρτήσεων, μεταβλητών, ορισμών, απαριθμήσεων, και ορισμών τύπων"; + } + else + { + result+="μελών αρχείων"; + } + result+=" με συνδέσμους "; + if (extractAll) + result+="στα αρχεία που ανήκουν:"; + else + result+="στην τεκμηρίωση:"; + return result; + } + + /*! This is an introduction to the page with the list of all header files. */ + virtual QCString trHeaderFilesDescription() + { return "Ακολουθούνε τα αρχεία κεφαλίδας που απαρτίζουν το API:"; } + + /*! This is an introduction to the page with the list of all examples */ + virtual QCString trExamplesDescription() + { return "Ακολουθεί η λίστα με τα παραδείγματα:"; } + + /*! This is an introduction to the page with the list of related pages */ + virtual QCString trRelatedPagesDescription() + { return "Ακολουθεί η λίστα όλων των σχετικών σελίδων τεκμηρίωσης:"; } + + /*! This is an introduction to the page with the list of class/file groups */ + virtual QCString trModulesDescription() + { return "Ακολουθεί η λίστα όλων των μονάδων:"; } + + /*! This sentences is used in the annotated class/file lists if no brief + * description is given. + */ + virtual QCString trNoDescriptionAvailable() + { return "Δεν υπάρχει περιγραφή διαθέσιμη"; } + + // index titles (the project name is prepended for these) + + + /*! This is used in HTML as the title of index.html. */ + virtual QCString trDocumentation() + { return "Τεκμηρίωση"; } + + /*! This is used in LaTeX as the title of the chapter with the + * index of all groups. + */ + virtual QCString trModuleIndex() + { return "Ευρετήριο μονάδων"; } + + /*! This is used in LaTeX as the title of the chapter with the + * class hierarchy. + */ + virtual QCString trHierarchicalIndex() + { return "Ιεραρχικό Ευρετήριο"; } + + /*! This is used in LaTeX as the title of the chapter with the + * annotated compound index. + */ + virtual QCString trCompoundIndex() + { + if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C")) + { + return "Ευρετήριο δομών δεδομένων"; + } + else + { + return "Συμπαγές Ευρετήριο"; + } + } + + /*! This is used in LaTeX as the title of the chapter with the + * list of all files. + */ + virtual QCString trFileIndex() + { return "Ευρετήτιο Αρχείων"; } + + /*! This is used in LaTeX as the title of the chapter containing + * the documentation of all groups. + */ + virtual QCString trModuleDocumentation() + { return "Τεκμηρίωση Μονάδων"; } + + /*! This is used in LaTeX as the title of the chapter containing + * the documentation of all classes, structs and unions. + */ + virtual QCString trClassDocumentation() + { + if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C")) + { + return "Τεκμηρίωση Δομών Δεδομένων"; + } + else + { + return "Τεκμηρίωση Κλάσεων"; + } + } + + /*! This is used in LaTeX as the title of the chapter containing + * the documentation of all files. + */ + virtual QCString trFileDocumentation() + { return "Τεκμηρίωση Αρχείων"; } + + /*! This is used in LaTeX as the title of the chapter containing + * the documentation of all examples. + */ + virtual QCString trExampleDocumentation() + { return "Τεκμηρίωση Παραδειγμάτων"; } + + /*! This is used in LaTeX as the title of the chapter containing + * the documentation of all related pages. + */ + virtual QCString trPageDocumentation() + { return "Τεκμηρίωση Σελίδων"; } + + /*! This is used in LaTeX as the title of the document */ + virtual QCString trReferenceManual() + { return "Ενχειρίδιο Αναφοράς"; } + + /*! This is used in the documentation of a file as a header before the + * list of defines + */ + virtual QCString trDefines() + { return "Ορισμοί"; } + + /*! This is used in the documentation of a file as a header before the + * list of function prototypes + */ + virtual QCString trFuncProtos() + { return "Πρωτοτυπήσεις Συναρτήσεων"; } + + /*! This is used in the documentation of a file as a header before the + * list of typedefs + */ + virtual QCString trTypedefs() + { return "Ορισμοί Τύπων"; } + + /*! This is used in the documentation of a file as a header before the + * list of enumerations + */ + virtual QCString trEnumerations() + { return "Απαριθμήσεις"; } + + /*! This is used in the documentation of a file as a header before the + * list of (global) functions + */ + virtual QCString trFunctions() + { return "Συναρτήσεις"; } + + /*! This is used in the documentation of a file as a header before the + * list of (global) variables + */ + virtual QCString trVariables() + { return "Μεταβλητές"; } + + /*! This is used in the documentation of a file as a header before the + * list of (global) variables + */ + virtual QCString trEnumerationValues() + { return "Τιμές Απαριθμήσεων"; } + + /*! This is used in the documentation of a file before the list of + * documentation blocks for defines + */ + virtual QCString trDefineDocumentation() + { return "Τεκμηρίωση Ορισμών"; } + + /*! This is used in the documentation of a file/namespace before the list + * of documentation blocks for function prototypes + */ + virtual QCString trFunctionPrototypeDocumentation() + { return "Τεκμηρίωση Πρωτοτυπήσεων των Συναρτήσεων"; } + + /*! This is used in the documentation of a file/namespace before the list + * of documentation blocks for typedefs + */ + virtual QCString trTypedefDocumentation() + { return "Τεκμηρίωση Ορισμών Τύπων"; } + + /*! This is used in the documentation of a file/namespace before the list + * of documentation blocks for enumeration types + */ + virtual QCString trEnumerationTypeDocumentation() + { return "Τεκμηρίωση Απαριθμήσεων"; } + + /*! This is used in the documentation of a file/namespace before the list + * of documentation blocks for enumeration values + */ + virtual QCString trEnumerationValueDocumentation() + { return "Τεκμηρίωση Τιμών των Απαριθμήσεων"; } + + /*! This is used in the documentation of a file/namespace before the list + * of documentation blocks for functions + */ + virtual QCString trFunctionDocumentation() + { return "Τεκμηρίωση Συναρτήσεων"; } + + /*! This is used in the documentation of a file/namespace before the list + * of documentation blocks for variables + */ + virtual QCString trVariableDocumentation() + { return "Τεκμηρίωση Μεταβλητών"; } + + /*! This is used in the documentation of a file/namespace/group before + * the list of links to documented compounds + */ + virtual QCString trCompounds() + { + if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C")) + { + return "Δομές Δεδομένων"; + } + else + { + return "Συσσωματώματα"; + } + } + + /*! This is used in the standard footer of each page and indicates when + * the page was generated + */ + virtual QCString trGeneratedAt(const char *date,const char *projName) + { + QCString result=(QCString)"Δημιουργήθηκε στις "+date; + if (projName) result+=(QCString)" για "+projName; + result+=(QCString)" από"; + return result; + } + /*! This is part of the sentence used in the standard footer of each page. + */ + virtual QCString trWrittenBy() + { + return "γραμμένο από τον "; + } + + /*! this text is put before a class diagram */ + virtual QCString trClassDiagram(const char *clName) + { + return (QCString)"Διάγραμμα κληρονομικότητας για την "+clName+":"; + } + + /*! this text is generated when the \\internal command is used. */ + virtual QCString trForInternalUseOnly() + { return "Μόνο για εσωτερική χρήση."; } + + /*! this text is generated when the \\reimp command is used. */ + virtual QCString trReimplementedForInternalReasons() + { return "Επαναυλοποιημένη για εσωτερικούς λόγους, το API δεν επιρεάζεται."; } + + /*! this text is generated when the \\warning command is used. */ + virtual QCString trWarning() + { return "Προειδοποίηση"; } + + /*! this text is generated when the \\bug command is used. */ + virtual QCString trBugsAndLimitations() + { return "Προβλήματα και περιορισμοί"; } + + /*! this text is generated when the \\version command is used. */ + virtual QCString trVersion() + { return "Έκδοση"; } + + /*! this text is generated when the \\date command is used. */ + virtual QCString trDate() + { return "Ημ/νια"; } + + /*! this text is generated when the \\return command is used. */ + virtual QCString trReturns() + { return "Επιστρέφει"; } + + /*! this text is generated when the \\sa command is used. */ + virtual QCString trSeeAlso() + { return "Κοιτάξτε επίσης "; } + + /*! this text is generated when the \\param command is used. */ + virtual QCString trParameters() + { return "Παράμετροι"; } + + /*! this text is generated when the \\exception command is used. */ + virtual QCString trExceptions() + { return "Εξαίρεση"; } + + /*! this text is used in the title page of a LaTeX document. */ + virtual QCString trGeneratedBy() + { return "Δημιουργήθηκε από "; } + +////////////////////////////////////////////////////////////////////////// +// new since 0.49-990307 +////////////////////////////////////////////////////////////////////////// + + /*! used as the title of page containing all the index of all namespaces. */ + virtual QCString trNamespaceList() + { return "Λίστα Χώρων Ονομάτων"; } + + /*! used as an introduction to the namespace list */ + virtual QCString trNamespaceListDescription(bool extractAll) + { + QCString result="Ακολουθέι η λίστα όλων των "; + if (!extractAll) result+="τεκμηριωμένων "; + result+="χώρων ονομάτων με σύντομες περιγραφές:"; + return result; + } + + /*! used in the class documentation as a header before the list of all + * friends of a class + */ + virtual QCString trFriends() + { return "Φίλοι"; } + +////////////////////////////////////////////////////////////////////////// +// new since 0.49-990405 +////////////////////////////////////////////////////////////////////////// + + /*! used in the class documentation as a header before the list of all + * related classes + */ + virtual QCString trRelatedFunctionDocumentation() + { return "Τεκμηρίωση Φίλικών και Συσχετιζόμενων Συναρτήσεων"; } + +////////////////////////////////////////////////////////////////////////// +// new since 0.49-990425 +////////////////////////////////////////////////////////////////////////// + + /*! used as the title of the HTML page of a class/struct/union */ + virtual QCString trCompoundReference(const char *clName, + ClassDef::CompoundType compType, + bool isTemplate) + { + QCString result=(QCString)clName+" "; + result+=" Αναφορά"; + switch(compType) + { + case ClassDef::Class: result+=" Κλάσης"; break; + case ClassDef::Struct: result+=" Δομής"; break; + case ClassDef::Union: result+=" Ένωσης"; break; + case ClassDef::Interface: result+=" Διαπροσωπίας"; break; + case ClassDef::Exception: result+=" Εξαίρεσης"; break; + } + if (isTemplate) result+=" Template"; + + return result; + } + + /*! used as the title of the HTML page of a file */ + virtual QCString trFileReference(const char *fileName) + { + QCString result=fileName; + result+=" Αναφορά Αρχείου"; + return result; + } + + /*! used as the title of the HTML page of a namespace */ + virtual QCString trNamespaceReference(const char *namespaceName) + { + QCString result=namespaceName; + result+=" Αναφορά Χώρου Ονομάτων"; + return result; + } + + virtual QCString trPublicMembers() + { return "Δημόσιες Μέθοδοι"; } + virtual QCString trPublicSlots() + { return "Δημόσια Slots"; } + virtual QCString trSignals() + { return "Σήματα"; } + virtual QCString trStaticPublicMembers() + { return "Στατικές Δημόσιες Μέδοδοι"; } + virtual QCString trProtectedMembers() + { return "Προστατευμένες Μέδοδοι"; } + virtual QCString trProtectedSlots() + { return "Προστατευμένα Slots"; } + virtual QCString trStaticProtectedMembers() + { return "Στατικές Προστατευμένες Μέδοδοι"; } + virtual QCString trPrivateMembers() + { return "Ιδιοτικές Μέδοδοι"; } + virtual QCString trPrivateSlots() + { return "Ιδιοτικά Slots"; } + virtual QCString trStaticPrivateMembers() + { return "Στατικές Ιδιοτικές Μέδοδοι"; } + + /*! this function is used to produce a comma-separated list of items. + * use generateMarker(i) to indicate where item i should be put. + */ + virtual QCString trWriteList(int numEntries) + { + QCString 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+=", και "; + } + } + return result; + } + + /*! used in class documentation to produce a list of base classes, + * if class diagrams are disabled. + */ + virtual QCString trInheritsList(int numEntries) + { + return "Κληρονομεί "+trWriteList(numEntries)+"."; + } + + /*! used in class documentation to produce a list of super classes, + * if class diagrams are disabled. + */ + virtual QCString trInheritedByList(int numEntries) + { + return "Κληρονομείται από "+trWriteList(numEntries)+"."; + } + + /*! used in member documentation blocks to produce a list of + * members that are hidden by this one. + */ + virtual QCString trReimplementedFromList(int numEntries) + { + return "Επαναυλοποιείται από "+trWriteList(numEntries)+"."; + } + + /*! used in member documentation blocks to produce a list of + * all member that overwrite the implementation of this member. + */ + virtual QCString trReimplementedInList(int numEntries) + { + return "Επαναυλοποιείται στην "+trWriteList(numEntries)+"."; + } + + /*! This is put above each page as a link to all members of namespaces. */ + virtual QCString trNamespaceMembers() + { return "Μέλη Namespace"; } + + /*! This is an introduction to the page with all namespace members */ + virtual QCString trNamespaceMemberDescription(bool extractAll) + { + QCString result="Ακολουθεί η λίστα όλων των "; + if (!extractAll) result+="τεκμηριωμένων "; + result+="μελών χώρων ονομάτων με συνδέσμους "; + if (extractAll) + result+="στην τεκμηρίωση του χώρου ονομάτων για κάθε μέλος:"; + else + result+="στους χώρους ονομάτων που ανήκουν:"; + return result; + } + /*! This is used in LaTeX as the title of the chapter with the + * index of all namespaces. + */ + virtual QCString trNamespaceIndex() + { return "Ευρετήριο Χώρων Ονομάτων"; } + + /*! This is used in LaTeX as the title of the chapter containing + * the documentation of all namespaces. + */ + virtual QCString trNamespaceDocumentation() + { return "Τεκμηρίωση Χώρων Ονομάτων"; } + +////////////////////////////////////////////////////////////////////////// +// new since 0.49-990522 +////////////////////////////////////////////////////////////////////////// + + /*! This is used in the documentation before the list of all + * namespaces in a file. + */ + virtual QCString trNamespaces() + { return "Χώροι Ονομάτων"; } + +////////////////////////////////////////////////////////////////////////// +// new since 0.49-990728 +////////////////////////////////////////////////////////////////////////// + + /*! This is put at the bottom of a class documentation page and is + * followed by a list of files that were used to generate the page. + */ + virtual QCString trGeneratedFromFiles(ClassDef::CompoundType compType, + bool single) + { // here s is one of " Class", " Struct" or " Union" + // single is true implies a single file + QCString result=(QCString)"Η τεκμηρίωση για "; + switch(compType) + { + case ClassDef::Class: result+="αυτή την κλάση"; break; + case ClassDef::Struct: result+="αυτή η δομή"; break; + case ClassDef::Union: result+="αυτή η ένωση"; break; + case ClassDef::Interface: result+="αυτή η διαπροσωπία"; break; + case ClassDef::Exception: result+="αυτή η εξαίρεση"; break; + } + result+=" δημιουργήθηκε απο τ"; + if (single) result+="ο ακόλουθο αρχείο:"; else result+="α ακόλουθα αρχεία:"; + return result; + } + + /*! This is in the (quick) index as a link to the alphabetical compound + * list. + */ + virtual QCString trAlphabeticalList() + { return "Αλφαβητική Λίστα"; } + +////////////////////////////////////////////////////////////////////////// +// new since 0.49-990901 +////////////////////////////////////////////////////////////////////////// + + /*! This is used as the heading text for the retval command. */ + virtual QCString trReturnValues() + { return "Τιμές Επιστροφής"; } + + /*! This is in the (quick) index as a link to the main page (index.html) + */ + virtual QCString trMainPage() + { return "Κύρια Σελίδα"; } + + /*! This is used in references to page that are put in the LaTeX + * documentation. It should be an abbreviation of the word page. + */ + virtual QCString trPageAbbreviation() + { return "σελ."; } + +////////////////////////////////////////////////////////////////////////// +// new since 0.49-991003 +////////////////////////////////////////////////////////////////////////// + + virtual QCString trSources() + { + return "Πηγαίος"; + } + virtual QCString trDefinedAtLineInSourceFile() + { + return "Ορισμός στη γραμμή @0 του αρχείου @1."; + } + virtual QCString trDefinedInSourceFile() + { + return "Ορισμός στο αρχείο @0."; + } + +////////////////////////////////////////////////////////////////////////// +// new since 0.49-991205 +////////////////////////////////////////////////////////////////////////// + + virtual QCString trDeprecated() + { + return "Αποσυρμένο"; + } + +////////////////////////////////////////////////////////////////////////// +// new since 1.0.0 +////////////////////////////////////////////////////////////////////////// + + /*! this text is put before a collaboration diagram */ + virtual QCString trCollaborationDiagram(const char *clName) + { + return (QCString)"Δίαγραμμα Συνεργασίας για την κλάση "+clName+":"; + } + /*! this text is put before an include dependency graph */ + virtual QCString trInclDepGraph(const char *fName) + { + return (QCString)"Διάγραμμα εξάρτησης Include για το αρχείο "+fName+":"; + } + /*! header that is put before the list of constructor/destructors. */ + virtual QCString trConstructorDocumentation() + { + return "Τεκμηρίωση Constructor & Destructor"; + } + /*! Used in the file documentation to point to the corresponding sources. */ + virtual QCString trGotoSourceCode() + { + return "Πήγαινε στον πηγαίο κώδικα του αρχείου."; + } + /*! Used in the file sources to point to the corresponding documentation. */ + virtual QCString trGotoDocumentation() + { + return "Πήγαινε στην τεκμηρίωση του αρχείου."; + } + /*! Text for the \\pre command */ + virtual QCString trPrecondition() + { + return "Προϋποθέσεις"; + } + /*! Text for the \\post command */ + virtual QCString trPostcondition() + { + return "Μεταϋποθέσεις"; + } + /*! Text for the \\invariant command */ + virtual QCString trInvariant() + { + return "Αμετάβλητα"; + } + /*! Text shown before a multi-line variable/enum initialization */ + virtual QCString trInitialValue() + { + return "Αρχική τιμή:"; + } + /*! Text used the source code in the file index */ + virtual QCString trCode() + { + return "κώδικας"; + } + virtual QCString trGraphicalHierarchy() + { + return "Γραφική Αναπαράσταση Της Ιεραρχίας Των Κλάσεων"; + } + virtual QCString trGotoGraphicalHierarchy() + { + return "Πήγαινε στην γραφική αναπαράσταση της ιεραρχίας των κλάσεων"; + } + virtual QCString trGotoTextualHierarchy() + { + return "Πήγαινε στην με κείμενο αναπαράσταση της ιεραρχίας των κλάσεων"; + } + virtual QCString trPageIndex() + { + return "Ευρετήριο Σελίδων"; + } + +////////////////////////////////////////////////////////////////////////// +// new since 1.1.0 +////////////////////////////////////////////////////////////////////////// + + virtual QCString trNote() + { + return "Σημείωση"; + } + virtual QCString trPublicTypes() + { + return "Δημόσιοι Τυποι"; + } + virtual QCString trPublicAttribs() + { + if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C")) + { + return "Πεδία Δεδομένων"; + } + else + { + return "Δημόσια Χαρακτηριστικά"; + } + } + virtual QCString trStaticPublicAttribs() + { + return "Στατικά Δημόσια Χαρακτηριστικά"; + } + virtual QCString trProtectedTypes() + { + return "Προστατευμένοι Τύποι"; + } + virtual QCString trProtectedAttribs() + { + return "Προστατευμένα Χαρακτηριστικά"; + } + virtual QCString trStaticProtectedAttribs() + { + return "Στατικά Προστατευμένα Χαρακτηριστικά"; + } + virtual QCString trPrivateTypes() + { + return "Ιδιωτικοί Τύποι"; + } + virtual QCString trPrivateAttribs() + { + return "Ιδιωτικα Χαρακτηριστικά"; + } + virtual QCString trStaticPrivateAttribs() + { + return "Στατικά Ιδιωτικα Χαρακτηριστικά"; + } + +////////////////////////////////////////////////////////////////////////// +// new since 1.1.3 +////////////////////////////////////////////////////////////////////////// + + /*! Used as a marker that is put before a \\todo item */ + virtual QCString trTodo() + { + return "Προς Υλοποίηση"; + } + /*! Used as the header of the todo list */ + virtual QCString trTodoList() + { + return "Λίστα των Προς Υλοποίηση"; + } + +////////////////////////////////////////////////////////////////////////// +// new since 1.1.4 +////////////////////////////////////////////////////////////////////////// + + virtual QCString trReferencedBy() + { + return "Αναφορά από"; + } + virtual QCString trRemarks() + { + return "Παρατήρηση"; + } + virtual QCString trAttention() + { + return "Προσοχή"; + } + virtual QCString trInclByDepGraph() + { + return "Το γράφημα αυτό παρουσιάζει ποιά αρχεία άμεσα ή " + "έμεσα περιλαμβάνουν αυτό το αρχείο:"; + } + virtual QCString trSince() + { + return "Από"; + } + +////////////////////////////////////////////////////////////////////////// +// new since 1.1.5 +////////////////////////////////////////////////////////////////////////// + + /*! title of the graph legend page */ + virtual QCString trLegendTitle() + { + return "Υπόμνημα Διαγραμμάτων"; + } + /*! page explaining how the dot graph's should be interpreted + * The %A in the text below are to prevent link to classes called "A". + */ + virtual QCString trLegendDocs() + { + return + "Αυτή η σελίδα εξηγεί το πως ερμηνεύονται τα διαγράμματα που δημιουργούνται " + "από το doxygen.<p>\n" + "Θεωρείστε το παρακάτω παράδειγμα:" + "\\code\n" + "/*! Invisible class because of truncation */\n" + "class Invisible { };\n\n" + "/*! Truncated class, inheritance relation is hidden */\n" + "class Truncated : public Invisible { };\n\n" + "/* Class not documented with doxygen comments */\n" + "class Undocumented { };\n\n" + "/*! Class that is inherited using public inheritance */\n" + "class PublicBase : public Truncated { };\n\n" + "/*! Class that is inherited using protected inheritance */\n" + "class ProtectedBase { };\n\n" + "/*! Class that is inherited using private inheritance */\n" + "class PrivateBase { };\n\n" + "/*! Class that is used by the Inherited class */\n" + "class Used { };\n\n" + "/*! Super class that inherits a number of other classes */\n" + "class Inherited : public PublicBase,\n" + " protected ProtectedBase,\n" + " private PrivateBase,\n" + " public Undocumented\n" + "{\n" + " private:\n" + " Used *m_usedClass;\n" + "};\n" + "\\endcode\n" + "Αν η ετικέτα \\c MAX_DOT_GRAPH_HEIGHT στο αρχείο ρυθμίσεων " + "τεθεί στο 200 θα έχουμε σαν αποτέλεσμα το ακόλουθο διάγραμμα:" + "<p><center><img src=\"graph_legend.gif\"></center>\n" + "<p>\n" + "Τα κουτιά στο παραπάνω διάγραμμα έχουν την ακόλουθη σημασία:\n" + "<ul>\n" + "<li>Ένα γεμισμένο μαύρο κουτί αναπαριστά τη δομή ή την κλάση για την οποία" + "αφορά το διάγραμμα.\n" + "<li>Ένα κουτί με μαύρο περίγραμμα αναπαριστά μία τεκμηριωμένη δομή ή κλάση.\n" + "<li>Ένα κουτί με γκρίζο περίγραμμα αναπαριστά μία μη τεκμηριωμένη δομή ή κλάση.\n" + "<li>Ένα κουτί με κόκκινο περίγραμμα αναπαριστά μία τεκμηριωμένη δομή ή κλάση για " + "την οποία δεν παρουσιάζονται όλες οι σχέσεις κληρονομικότητας και περιεχομένου. %Ένα " + "διάγραμμα μειώνεται αν δεν χωράει στις ορισμένες διαστάσεις." + "</ul>\n" + "Τα βέλη έχουν τις ακόλουθες σημασίες:\n" + "<ul>\n" + "<li>Ένα βαθύ μπλε βέλος χρησιμοποιείται για να παρουσιάσει μία δημόσια σχέση κληρονομικότητας " + "μεταξύ δύο κλάσεων.\n" + "<li>Ένα βαθύ πράσινο βέλος χρησιμοποιείται για προστατευμένη κληρονομικότητα.\n" + "<li>Ένα βαθύ κόκκινο βέλος χρησιμοποιείται για ιδιωτική κληρονομικότητα.\n" + "<li>Ένα μωβ διακεκομένο βέλος χρησιμοποιείται αν μία κλάση περιέχεται ή χρησιμοποιείται " + "από μία άλλη κλάση. Το βέλος ονομάζεται από το όνομα της μεταβλητής(ων) " + "μέσω της οποίας η κλάση ή δομή είναι προσβάσιμη. \n" + "</ul>\n"; + } + /*! text for the link to the legend page */ + virtual QCString trLegend() + { + return "υπόμνημα"; + } + +////////////////////////////////////////////////////////////////////////// +// new since 1.2.0 +////////////////////////////////////////////////////////////////////////// + + /*! Used as a marker that is put before a test item */ + virtual QCString trTest() + { + return "Δοκιμαστικό"; + } + /*! Used as the header of the test list */ + virtual QCString trTestList() + { + return "Λίστα Δοκιμαστικών"; + } + +////////////////////////////////////////////////////////////////////////// +// new since 1.2.1 +////////////////////////////////////////////////////////////////////////// + + /*! Used as a section header for KDE-2 IDL methods */ + virtual QCString trDCOPMethods() + { + return "Μέδοδοι DCOP"; + } + +////////////////////////////////////////////////////////////////////////// +// new since 1.2.2 +////////////////////////////////////////////////////////////////////////// + + /*! Used as a section header for IDL properties */ + virtual QCString trProperties() + { + return "Ιδιότητες"; + } + /*! Used as a section header for IDL property documentation */ + virtual QCString trPropertyDocumentation() + { + return "Τεκμηρίωση Ιδιοτήτων"; + } + +////////////////////////////////////////////////////////////////////////// +// new since 1.2.4 +////////////////////////////////////////////////////////////////////////// + + /*! Used for Java interfaces in the summary section of Java packages */ + virtual QCString trInterfaces() + { + return "Διαπροσωπίες"; + } + /*! Used for Java classes in the summary section of Java packages */ + virtual QCString trClasses() + { + if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C")) + { + return "Δομές Δεδομένων"; + } + else + { + return "Κλάσεις"; + } + } + /*! Used as the title of a Java package */ + virtual QCString trPackage(const char *name) + { + return (QCString)"Πακέτο "+name; + } + /*! Title of the package index page */ + virtual QCString trPackageList() + { + return "Λίστα Πακέτων"; + } + /*! The description of the package index page */ + virtual QCString trPackageListDescription() + { + return "Ακολουθεί η λίστα των πακέτων με σύντομη περιγραφή (αν υπάρχει):"; + } + /*! The link name in the Quick links header for each page */ + virtual QCString trPackages() + { + return "Πακέτα"; + } + /*! Used as a chapter title for Latex & RTF output */ + virtual QCString trPackageDocumentation() + { + return "Τεκμηρίωση Πακέτων"; + } + /*! Text shown before a multi-line define */ + virtual QCString trDefineValue() + { + return "Τιμή:"; + } + +////////////////////////////////////////////////////////////////////////// +// new since 1.2.5 +////////////////////////////////////////////////////////////////////////// + + /*! Used as a marker that is put before a \\bug item */ + virtual QCString trBug() + { + return "Πρόβλημα"; + } + /*! Used as the header of the bug list */ + virtual QCString trBugList() + { + return "Λίστα Προβλημάτων"; + } + +////////////////////////////////////////////////////////////////////////// +// new since 1.2.6 +////////////////////////////////////////////////////////////////////////// + + /*! Used as ansicpg for RTF file + * + * The following table shows the correlation of Charset name, Charset Value and + * <pre> + * Codepage number: + * Charset Name Charset Value(hex) Codepage number + * ------------------------------------------------------ + * DEFAULT_CHARSET 1 (x01) + * SYMBOL_CHARSET 2 (x02) + * OEM_CHARSET 255 (xFF) + * ANSI_CHARSET 0 (x00) 1252 + * RUSSIAN_CHARSET 204 (xCC) 1251 + * EE_CHARSET 238 (xEE) 1250 + * GREEK_CHARSET 161 (xA1) 1253 + * TURKISH_CHARSET 162 (xA2) 1254 + * BALTIC_CHARSET 186 (xBA) 1257 + * HEBREW_CHARSET 177 (xB1) 1255 + * ARABIC _CHARSET 178 (xB2) 1256 + * SHIFTJIS_CHARSET 128 (x80) 932 + * HANGEUL_CHARSET 129 (x81) 949 + * GB2313_CHARSET 134 (x86) 936 + * CHINESEBIG5_CHARSET 136 (x88) 950 + * </pre> + * + */ + virtual QCString trRTFansicp() + { + return "1253"; + } + + + /*! Used as ansicpg for RTF fcharset + * \see trRTFansicp() for a table of possible values. + */ + virtual QCString trRTFCharSet() + { + return "0"; + } + + /*! Used as header RTF general index */ + virtual QCString trRTFGeneralIndex() + { + return "Ευρετήριο"; + } + + /*! This is used for translation of the word that will possibly + * be followed by a single name or by a list of names + * of the category. + */ + virtual QCString trClass(bool first_capital, bool singular) + { + QCString result((first_capital ? "Κλάση" : "κλάση")); + if (!singular) result+=""; + return result; + } + + /*! This is used for translation of the word that will possibly + * be followed by a single name or by a list of names + * of the category. + */ + virtual QCString trFile(bool first_capital, bool singular) + { + QCString result((first_capital ? "Αρχεί" : "αρχεί")); + if (!singular) result+="α"; else result+="ο"; + return result; + } + + /*! This is used for translation of the word that will possibly + * be followed by a single name or by a list of names + * of the category. + */ + virtual QCString trNamespace(bool first_capital, bool singular) + { + QCString result((first_capital ? "Namespace" : "namespace")); + if (!singular) result+="s"; + return result; + } + + /*! This is used for translation of the word that will possibly + * be followed by a single name or by a list of names + * of the category. + */ + virtual QCString trGroup(bool first_capital, bool singular) + { + QCString result((first_capital ? "Ομάδ" : "ομάδ")); + if (!singular) result+="ες"; else result+="α"; + return result; + } + + /*! This is used for translation of the word that will possibly + * be followed by a single name or by a list of names + * of the category. + */ + virtual QCString trPage(bool first_capital, bool singular) + { + QCString result((first_capital ? "Σελίδ" : "σελίδ")); + if (!singular) result+="ες"; else result+="α"; + return result; + } + + /*! This is used for translation of the word that will possibly + * be followed by a single name or by a list of names + * of the category. + */ + virtual QCString trMember(bool first_capital, bool singular) + { + QCString result((first_capital ? "Μέλ" : "μέλ")); + if (!singular) result+="η"; else result+="ος"; + return result; + } + + /*! This is used for translation of the word that will possibly + * be followed by a single name or by a list of names + * of the category. + */ + virtual QCString trField(bool first_capital, bool singular) + { + QCString result((first_capital ? "Πεδί" : "πεδί")); + if (!singular) result+="α"; else result+="ο"; + return result; + } + + /*! This is used for translation of the word that will possibly + * be followed by a single name or by a list of names + * of the category. + */ + virtual QCString trGlobal(bool first_capital, bool singular) + { + QCString result((first_capital ? "Καθολικ" : "καθολικ")); + if (!singular) result+="ές"; else result+="ή"; + return result; + } + +////////////////////////////////////////////////////////////////////////// +// new since 1.2.7 +////////////////////////////////////////////////////////////////////////// + + /*! This text is generated when the \\author command is used and + * for the author section in man pages. */ + virtual QCString trAuthor(bool first_capital, bool singular) + { + QCString result((first_capital ? "Συγραφ" : "συγραφ")); + if (!singular) result+=""; else result+="έας"; + return result; + } + +}; + +#endif diff --git a/src/translator_se.h b/src/translator_se.h index 79ec0e2..741b817 100644 --- a/src/translator_se.h +++ b/src/translator_se.h @@ -62,11 +62,20 @@ Problem! #ifndef TRANSLATOR_SE_H #define TRANSLATOR_SE_H -#include "translator_adapter.h" - -class TranslatorSwedish : public TranslatorAdapter_1_0_0 +class TranslatorSwedish : public TranslatorEnglish { public: + /*! This method is used to generate a warning message to signal + * the user that the translation of his/her language of choice + * needs updating. + */ + virtual QCString updateNeededMessage() + { + return "Warning: The Swedish translator is really obsolete.\n" + "It was not updated since version 1.0.0. As a result,\n" + "some sentences may appear in English.\n\n"; + } + QCString idLanguage() { return "swedish"; } QCString latexBabelPackage() diff --git a/src/util.cpp b/src/util.cpp index 4381c54..e73b45b 100644 --- a/src/util.cpp +++ b/src/util.cpp @@ -869,7 +869,7 @@ QCString tempArgListToString(ArgumentList *al) // compute the HTML anchors for a list of members -void setAnchors(char id,MemberList *ml,int groupId) +void setAnchors(ClassDef *cd,char id,MemberList *ml,int groupId) { int count=0; MemberListIterator mli(*ml); @@ -883,7 +883,8 @@ void setAnchors(char id,MemberList *ml,int groupId) anchor.sprintf("%c%d",id,count++); else anchor.sprintf("%c%d_%d",id,groupId,count++); - //printf("Member %s anchor %s\n",md->name(),anchor.data()); + if (cd) anchor.prepend(escapeCharsInString(cd->name(),FALSE)); + //printf("Member %s anchor %s\n",md->name().data(),anchor.data()); md->setAnchor(anchor); } } @@ -2878,6 +2879,44 @@ bool hasVisibleRoot(BaseClassList *bcl) //---------------------------------------------------------------------- +QCString escapeCharsInString(const char *name,bool allowDots) +{ + QCString result; + char c; + const char *p=name; + while ((c=*p++)!=0) + { + switch(c) + { + case '_': result+="__"; break; + case '-': result+="-"; break; + case ':': result+="_1"; break; + case '/': result+="_2"; break; + case '<': result+="_3"; break; + case '>': result+="_4"; break; + case '*': result+="_5"; break; + case '&': result+="_6"; break; + case '|': result+="_7"; break; + case '.': if (allowDots) result+="."; else result+="_8"; break; + case '!': result+="_9"; break; + case ',': result+="_00"; break; + case ' ': result+="_01"; break; + default: + if (Config_getBool("CASE_SENSE_NAMES") || !isupper(c)) + { + result+=c; + } + else + { + result+="_"; + result+=tolower(c); + } + break; + } + } + return result; +} + /*! This function determines the file name on disk of an item * given its name, which could be a class name with templete * arguments, so special characters need to be escaped. @@ -2906,41 +2945,7 @@ QCString convertNameToFile(const char *name,bool allowDots) } else // long names { - - QCString result; - char c; - const char *p=name; - while ((c=*p++)!=0) - { - switch(c) - { - case '_': result+="__"; break; - case '-': result+="-"; break; - case ':': result+="_1"; break; - case '/': result+="_2"; break; - case '<': result+="_3"; break; - case '>': result+="_4"; break; - case '*': result+="_5"; break; - case '&': result+="_6"; break; - case '|': result+="_7"; break; - case '.': if (allowDots) result+="."; else result+="_8"; break; - case '!': result+="_9"; break; - case ',': result+="_00"; break; - case ' ': result+="_01"; break; - default: - if (Config_getBool("CASE_SENSE_NAMES") || !isupper(c)) - { - result+=c; - } - else - { - result+="_"; - result+=tolower(c); - } - break; - } - } - return result; + return escapeCharsInString(name,allowDots); } } @@ -73,7 +73,7 @@ class TextGeneratorOLImpl : public TextGeneratorIntf extern void linkifyText(const TextGeneratorIntf &ol,const char *clName,const char *name, const char *text,bool autoBreak=FALSE,bool external=TRUE); -extern void setAnchors(char id,MemberList *ml,int groupId=-1); +extern void setAnchors(ClassDef *cd,char id,MemberList *ml,int groupId=-1); extern QCString fileToString(const char *name,bool filter=FALSE); extern QCString dateToString(bool); extern bool getDefs(const QCString &scopeName, @@ -172,6 +172,7 @@ void addRelatedPage(const char *name,const QCString &ptitle, int todoId,int testId,int bugId,GroupDef *gd=0, TagInfo *tagInfo=0 ); +QCString escapeCharsInString(const char *name,bool allowDots); #endif diff --git a/src/xmlgen.cpp b/src/xmlgen.cpp index 9ab3e33..2c4087a 100644 --- a/src/xmlgen.cpp +++ b/src/xmlgen.cpp @@ -37,7 +37,14 @@ #include <qfile.h> #include <qtextstream.h> -#define XML_DB(x) +// no debug info +#define XML_DB(x) do {} while(0) + +// debug to stdout +//#define XML_DB(x) printf x + +// debug inside output +//#define XML_DB(x) QCString __t;__t.sprintf x;m_t << __t QCString sectionTypeToString(BaseOutputDocInterface::SectionTypes t) { @@ -76,14 +83,15 @@ inline void writeXMLString(QTextStream &t,const char *s) void writeXMLLink(QTextStream &t,const char *extRef,const char *compoundId, const char *anchorId,const char *text) { - t << "<ref idref=\"" << compoundId << "\""; - if (extRef) + t << "<ref idref=\"" << compoundId; + if (anchorId) { - t << " external=\"" << extRef << "\""; + t << "_1" << anchorId; } - if (anchorId) + t << "\""; + if (extRef) { - t << " anchor=\"" << anchorId << "\""; + t << " external=\"" << extRef << "\""; } t << ">"; writeXMLString(t,text); @@ -166,7 +174,6 @@ template<class T> class ValStack * Its methods are called when some XML text or markup * needs to be written. */ -// TODO: htmlonly, latexonly class XMLGenerator : public OutputDocInterface { public: @@ -179,13 +186,13 @@ class XMLGenerator : public OutputDocInterface { m_inParStack.top() = TRUE; m_t << "<para>" << endl; - XML_DB(("start par at level=%d\n",m_inParStack.count());) + XML_DB(("start par at level=%d\n",m_inParStack.count())); } else if (m_inParStack.isEmpty()) { m_inParStack.push(TRUE); m_t << "<para>" << endl; - XML_DB(("start par at level=%d\n",m_inParStack.count());) + XML_DB(("start par at level=%d\n",m_inParStack.count())); } } void endParMode() @@ -194,24 +201,24 @@ class XMLGenerator : public OutputDocInterface { m_inParStack.top() = FALSE; m_t << "</para>" << endl; - XML_DB(("end par at level=%d\n",m_inParStack.count());) + XML_DB(("end par at level=%d\n",m_inParStack.count())); } } void startNestedPar() { m_inParStack.push(FALSE); - XML_DB(("enter par level=%d\n",m_inParStack.count());) + XML_DB(("enter par level=%d\n",m_inParStack.count())); } void endNestedPar() { - XML_DB(("leave par level=%d\n",m_inParStack.count());) + XML_DB(("leave par level=%d\n",m_inParStack.count())); if (m_inParStack.pop()) { m_t << "</para>" << endl; } else { - XML_DB(("ILLEGAL par level!\n");) + //XML_DB(("ILLEGAL par level!\n")); } } @@ -219,35 +226,37 @@ class XMLGenerator : public OutputDocInterface void docify(const char *s) { + XML_DB(("(docify \"%s\")\n",s)); startParMode(); writeXMLString(m_t,s); } void writeChar(char c) { - startParMode(); char s[2];s[0]=c;s[1]=0; docify(s); } void writeString(const char *text) { - startParMode(); //m_t << text; docify(text); } void startItemList() { + XML_DB(("(startItemList)\n")); startParMode(); m_t << "<itemizedlist>" << endl;; m_inListStack.push(TRUE); } void startEnumList() { + XML_DB(("(startEnumList)\n")); startParMode(); m_t << "<orderedlist>"; m_inListStack.push(TRUE); } void writeListItem() { + XML_DB(("(writeListItem)\n")); if (!m_inListStack.isEmpty() && m_inListStack.top()) // first element { m_inListStack.top()=FALSE; @@ -263,6 +272,7 @@ class XMLGenerator : public OutputDocInterface } void endItemList() { + XML_DB(("(endItemList)\n")); if (!m_inListStack.isEmpty() && !m_inListStack.pop()) // first element { endParMode(); @@ -273,6 +283,7 @@ class XMLGenerator : public OutputDocInterface } void endEnumList() { + XML_DB(("(endEnumList)\n")); if (!m_inListStack.isEmpty() && !m_inListStack.pop()) // first element { endParMode(); @@ -283,65 +294,81 @@ class XMLGenerator : public OutputDocInterface } void newParagraph() { + XML_DB(("(newParagraph)\n")); endParMode(); startParMode(); } void startBold() { + XML_DB(("(startBold)\n")); startParMode(); m_t << "<bold>"; // non DocBook } void endBold() { + XML_DB(("(endBold)\n")); m_t << "</bold>"; // non DocBook } void startTypewriter() { + XML_DB(("(startTypewriter)\n")); startParMode(); m_t << "<computeroutput>"; } void endTypewriter() { + XML_DB(("(endTypewriter)\n")); m_t << "</computeroutput>"; } void startEmphasis() { + XML_DB(("(startEmphasis)\n")); startParMode(); m_t << "<emphasis>"; } void endEmphasis() { + XML_DB(("(endEmphasis)\n")); m_t << "</emphasis>"; } void startCodeFragment() { + XML_DB(("(startCodeFragment)\n")); + startParMode(); m_t << "<programlisting>"; } void endCodeFragment() { + XML_DB(("(endCodeFragment)\n")); m_t << "</programlisting>"; } void startPreFragment() { + XML_DB(("(startPreFragment)\n")); + startParMode(); m_t << "<programlisting>"; } void endPreFragment() { + XML_DB(("(endPreFragment)\n")); m_t << "</programlisting>"; } void writeRuler() { + XML_DB(("(startParMode)\n")); startParMode(); m_t << "<hruler/>"; } void startDescription() { + XML_DB(("(startDescription)\n")); startParMode(); m_t << "<variablelist>"; m_inListStack.push(TRUE); } void endDescription() { + XML_DB(("(endDescription)\n")); if (!m_inListStack.isEmpty() && !m_inListStack.pop()) // first element { endNestedPar(); @@ -352,6 +379,7 @@ class XMLGenerator : public OutputDocInterface } void startDescItem() { + XML_DB(("(startDescItem)\n")); if (!m_inListStack.isEmpty() && m_inListStack.top()) // first element { m_inListStack.top()=FALSE; @@ -365,22 +393,28 @@ class XMLGenerator : public OutputDocInterface } void endDescItem() { + XML_DB(("(endDescItem)\n")); m_t << "</term></varlistentry><listitem>"; startNestedPar(); } void startDescList(SectionTypes st) { - startParMode(); + XML_DB(("(startDescList)\n")); + endParMode(); m_t << "<simplesect kind=\"" << sectionTypeToString(st); m_t << "\"><title>"; + startNestedPar(); + m_inParStack.top() = TRUE; } void endDescList() { + XML_DB(("(endDescList)\n")); endNestedPar(); m_t << "</simplesect>"; } void startParamList(ParamListTypes t) { + XML_DB(("(startParamList)\n")); startParMode(); QCString kind; switch(t) @@ -390,150 +424,209 @@ class XMLGenerator : public OutputDocInterface case Exception: kind="exception"; break; } m_t << "<parameterlist kind=\"" << kind << "\"><title>"; // non DocBook + startNestedPar(); + m_inParStack.top() = TRUE; m_inParamList = TRUE; } void endParamList() { + XML_DB(("(endParamList)\n")); m_inParamList = FALSE; m_t << "</parameterlist>"; } void endDescTitle() { + m_inParStack.top() = FALSE; + endNestedPar(); + XML_DB(("(endDescTitle)\n")); m_t << "</title>"; if (!m_inParamList) startNestedPar(); } - void writeDescItem() { } - void startDescTable() { } - void endDescTable() { } + void writeDescItem() + { + XML_DB(("(writeDescItem)\n")); + } + void startDescTable() + { + XML_DB(("(startDescTable)\n")); + } + void endDescTable() + { + XML_DB(("(endDescTable)\n")); + } void startDescTableTitle() { + XML_DB(("(startDescTableTitle)\n")); m_t << "<parametername>"; // non docbook } void endDescTableTitle() { + XML_DB(("(endDescTableTitle)\n")); m_t << "</parametername>"; // non docbook } void startDescTableData() { + XML_DB(("(startDescTableData)\n")); m_t << "<parameterdescription>"; // non docbook startNestedPar(); } void endDescTableData() { + XML_DB(("(endDescTableData)\n")); endNestedPar(); m_t << "</parameterdescription>"; // non docbook } void lineBreak() { + XML_DB(("(lineBreak)\n")); startParMode(); m_t << "<linebreak/>"; // non docbook } void writeNonBreakableSpace(int num) { + XML_DB(("(writeNonBreakableSpace)\n")); int i;for (i=0;i<num;i++) m_t << " "; } void writeObjectLink(const char *ref,const char *file, const char *anchor, const char *text) { + XML_DB(("(writeObjectLink)\n")); startParMode(); writeXMLLink(m_t,ref,file,anchor,text); } void writeCodeLink(const char *ref,const char *file, const char *anchor,const char *text) { + XML_DB(("(writeCodeLink)\n")); writeXMLLink(m_t,ref,file,anchor,text); } void startHtmlLink(const char *url) { + XML_DB(("(startHtmlLink)\n")); startParMode(); m_t << "<ulink url=\"" << url << "\">"; } void endHtmlLink() { + XML_DB(("(endHtmlLink)\n")); m_t << "</ulink>"; } void writeMailLink(const char *url) { + XML_DB(("(writeMailLink)\n")); startParMode(); m_t << "<email>"; docify(url); m_t << "</email>"; } - void startSection(const char *id,const char *,bool) + void startSection(const char *id,const char *,bool subsection) { - m_t << "<sect1 id=\"" << id << "\">"; + XML_DB(("(startSection)\n")); + endParMode(); + m_t << "<sect"; + if (subsection) m_t << "2"; else m_t << "1"; + m_t << " id=\"" << id << "\">"; + startNestedPar(); + m_inParStack.top() = TRUE; } - void endSection(const char *,bool) + void endSection(const char *,bool subsection) { - m_t << "</sect1>"; + XML_DB(("(endSection)\n")); + m_t << "</sect"; + if (subsection) m_t << "2"; else m_t << "1"; + m_t << ">"; + m_inParStack.top() = FALSE; + endNestedPar(); } void startSubsection() { + XML_DB(("(startSubsection)\n")); + endParMode(); m_t << "<sect2>"; + startNestedPar(); + m_inParStack.top() = TRUE; } void endSubsection() { + XML_DB(("(endSubsection)\n")); m_t << "</sect2>"; + m_inParStack.top() = FALSE; + endNestedPar(); } void startSubsubsection() { + XML_DB(("(startSubsubsection)\n")); + endParMode(); m_t << "<sect3>"; + startNestedPar(); + m_inParStack.top() = TRUE; } void endSubsubsection() { + XML_DB(("(endSubsubsection)\n")); m_t << "</sect3>"; + m_inParStack.top() = FALSE; + endNestedPar(); } void startCenter() { + XML_DB(("(startCenter)\n")); startParMode(); m_t << "<center>"; // non docbook } void endCenter() { + XML_DB(("(endCenter)\n")); m_t << "</center>"; // non docbook } void startSmall() { + XML_DB(("(startSmall)\n")); startParMode(); m_t << "<small>"; // non docbook } void endSmall() { + XML_DB(("(endSmall)\n")); m_t << "</small>"; // non docbook } void startSubscript() { + XML_DB(("(startSubscript)\n")); startParMode(); m_t << "<subscript>"; } void endSubscript() { + XML_DB(("(endSubscript)\n")); m_t << "</subscript>"; } void startSuperscript() { + XML_DB(("(startSuperscript)\n")); startParMode(); m_t << "<superscript>"; } void endSuperscript() { + XML_DB(("(endSuperscript)\n")); m_t << "</superscript>"; } void startTable(int cols) { - XML_DB(("startTable\n");) + XML_DB(("startTable\n")); startParMode(); m_t << "<table cols=\"" << cols << "\">\n"; } void endTable() { - XML_DB(("endTable\n");) + XML_DB(("endTable\n")); m_t << "</row>\n</table>"; } void nextTableRow() { - XML_DB(("nextTableRow\n");) + XML_DB(("(nextTableRow)\n")); m_t << "<row><entry>"; // we need manually add a para here because cells are @@ -543,12 +636,12 @@ class XMLGenerator : public OutputDocInterface } void endTableRow() { - XML_DB(("endTableRow\n");) + XML_DB(("(endTableRow)\n")); m_t << "</row>" << endl; } void nextTableColumn() { - XML_DB(("nextTableColumn\n");) + XML_DB(("(nextTableColumn)\n")); m_t << "<entry>"; // we need manually add a para here because cells are @@ -558,7 +651,7 @@ class XMLGenerator : public OutputDocInterface } void endTableColumn() { - XML_DB(("endTableColumn\n");) + XML_DB(("(endTableColumn)\n")); // we need manually add a para here because cells are // parsed before the table is generated, and thus // are already parsed as if they are inside a paragraph. @@ -579,20 +672,28 @@ class XMLGenerator : public OutputDocInterface void startTitle() { + XML_DB(("(startTitle)\n")); m_t << "<title>"; + startNestedPar(); + m_inParStack.top() = TRUE; } void endTitle() { + m_inParStack.top() = FALSE; + endNestedPar(); + XML_DB(("(endTitle)\n")); m_t << "</title>" << endl; } void writeAnchor(const char *id,const char *name) { + XML_DB(("(writeAnchor)\n")); startParMode(); m_t << "<anchor id=\"" << id << "_" << name << "\"/>"; } void writeSectionRef(const char *,const char *id, const char *name,const char *text) { + XML_DB(("(writeSectionRef)\n")); startParMode(); m_t << "<link linkend=\"" << id << "_" << name << "\">"; docify(text); @@ -604,6 +705,7 @@ class XMLGenerator : public OutputDocInterface } void addIndexItem(const char *primaryie,const char *secondaryie) { + XML_DB(("(addIndexItem)\n")); startParMode(); m_t << "<indexentry><primaryie>"; docify(primaryie); @@ -613,6 +715,7 @@ class XMLGenerator : public OutputDocInterface } void writeFormula(const char *id,const char *text) { + XML_DB(("(writeFormula)\n")); startParMode(); m_t << "<formula id=\"" << id << "\">"; // non Docbook docify(text); @@ -620,6 +723,7 @@ class XMLGenerator : public OutputDocInterface } void startImage(const char *name,const char *size,bool /*caption*/) { + XML_DB(("(startImage)\n")); startParMode(); m_t << "<image name=\"" << name << "\""; if (size) m_t << " size=\"" << size << "\""; @@ -627,35 +731,43 @@ class XMLGenerator : public OutputDocInterface } void endImage(bool) { + XML_DB(("(endImage)\n")); m_t << "</image>"; } void startDotFile(const char *name,bool /*caption*/) { + XML_DB(("(startDotFile)\n")); startParMode(); m_t << "<dotfile name=\"" << name << "\">"; // non docbook } void endDotFile(bool) { + XML_DB(("(endDotFile)\n")); m_t << "</dotfile>"; } void startTextLink(const char *name,const char *anchor) { + XML_DB(("(startTextLink)\n")); startParMode(); m_t << "<ulink url=\"" << name << "#" << anchor << "\">"; } void endTextLink() { + XML_DB(("(endTextLink)\n")); m_t << "<ulink>"; } void startPageRef() { + XML_DB(("(startPageRef)\n")); } void endPageRef(const char *,const char *) { + XML_DB(("(endPageRef)\n")); } void writeLineNumber(const char *,const char *file, // TODO: support external references const char *anchor,int l) { + XML_DB(("(writeLineNumber)\n")); m_t << "<linenumber"; m_t << " line=\"" << l << "\""; if (file) @@ -666,34 +778,61 @@ class XMLGenerator : public OutputDocInterface } void startCodeLine() { + XML_DB(("(startCodeLine)\n")); startParMode(); m_t << "<codeline>"; // non DocBook } void endCodeLine() { + XML_DB(("(endCodeLine)\n")); m_t << "</codeline>" << endl; // non DocBook } void startCodeAnchor(const char *id) { + XML_DB(("(startCodeAnchor)\n")); startParMode(); m_t << "<anchor id=\"" << id << "\">"; } void endCodeAnchor() { + XML_DB(("(endCodeAnchor)\n")); m_t << "</anchor>"; } void startFontClass(const char *colorClass) { + XML_DB(("(startFontClass)\n")); m_t << "<highlight class=\"" << colorClass << "\">"; // non DocBook } void endFontClass() { + XML_DB(("(endFontClass)\n")); m_t << "</highlight>"; // non DocBook } void codify(const char *text) { + XML_DB(("(codify \"%s\")\n",text)); docify(text); } + void startHtmlOnly() + { + XML_DB(("(startHtmlOnly)\n")); + m_t << "<htmlonly>" << endl; + } + void endHtmlOnly() + { + XML_DB(("(endHtmlOnly)\n")); + m_t << "</htmlonly>" << endl; + } + void startLatexOnly() + { + XML_DB(("(startLatexOnly)\n")); + m_t << "<latexonly>" << endl; + } + void endLatexOnly() + { + XML_DB(("(endLatexOnly)\n")); + m_t << "</latexonly>" << endl; + } // Generator specific functions @@ -782,15 +921,16 @@ static void writeXMLDocBlock(QTextStream &t, const QCString &name, const QCString &text) { - if (text.stripWhiteSpace().isEmpty()) return; + QCString stext = text.stripWhiteSpace(); + if (text.isEmpty()) return; XMLGenerator *xmlGen = new XMLGenerator; - xmlGen->startParMode(); + //xmlGen->startParMode(); parseDoc(*xmlGen, fileName, // input definition file lineNr, // input definition line scope, // scope (which should not be linked to) name, // member (which should not be linked to) - text+"\n" // actual text + stext+"\n" // actual text ); xmlGen->endParMode(); t << xmlGen->getContents(); @@ -812,7 +952,39 @@ void writeXMLCodeBlock(QTextStream &t,FileDef *fd) delete xmlGen; } - +static void writeMemberReference(QTextStream &t,Definition *def,MemberDef *rmd,const char *tagName) +{ + QCString scope = rmd->getScopeString(); + QCString name = rmd->name(); + if (!scope.isEmpty() && scope!=def->name()) + { + name.prepend(scope+"::"); + } + Definition *d = rmd->getOuterScope(); + if (d==Doxygen::globalScope) d=rmd->getBodyDef(); + if (rmd->getStartBodyLine()!=-1 && rmd->getBodyDef()) + // link to definition in code + { + t << " <" << tagName << " id=\""; + t << rmd->getBodyDef()->getOutputFileBase() + << "_1" // encoded `:' character (see util.cpp:convertNameToFile) + << rmd->anchor() + << "\">"; + writeXMLString(t,name); + t << "</" << tagName << ">" << endl; + } + else if (rmd->isLinkable() && d && d->isLinkable()) + // link to declaration in documentation (in absense of a definition) + { + t << " <" << tagName << " id=\""; + t << d->getOutputFileBase() + << "_1" // encoded `:' character (see util.cpp:convertNameToFile) + << rmd->anchor() + << "\">"; + writeXMLString(t,name); + t << "</" << tagName << ">" << endl; + } +} static void generateXMLForMember(MemberDef *md,QTextStream &t,Definition *def) { @@ -894,7 +1066,7 @@ static void generateXMLForMember(MemberDef *md,QTextStream &t,Definition *def) md->memberType()!=MemberDef::Enumeration ) { - QCString typeStr = replaceAnonymousScopes(md->typeString()); + QCString typeStr = md->typeString(); //replaceAnonymousScopes(md->typeString()); t << " <type>"; linkifyText(TextGeneratorXMLImpl(t),scopeName,md->name(),typeStr); t << "</type>" << endl; @@ -1035,7 +1207,13 @@ static void generateXMLForMember(MemberDef *md,QTextStream &t,Definition *def) { t << " <location file=\"" << md->getDefFileName() << "\" line=\"" - << md->getDefLine() << "\"/>" << endl; + << md->getDefLine() << "\""; + if (md->getStartBodyLine()!=-1) + { + t << " bodystart=\"" << md->getStartBodyLine() << "\" bodyend=\"" + << md->getEndBodyLine() << "\""; + } + t << "/>" << endl; } //printf("md->getReferencesMembers()=%p\n",md->getReferencesMembers()); @@ -1045,24 +1223,7 @@ static void generateXMLForMember(MemberDef *md,QTextStream &t,Definition *def) MemberDef *rmd; for (mdi.toFirst();(rmd=mdi.current());++mdi) { - if (rmd->getStartBodyLine()!=-1 && rmd->getBodyDef()) - { - t << " <references id=\""; - t << rmd->getBodyDef()->getOutputFileBase() - << "_1" // encoded `:' character (see util.cpp:convertNameToFile) - << rmd->anchor() - << "\" line=\"" - << rmd->getStartBodyLine() - << "\">"; - QCString scope = rmd->getScopeString(); - QCString name = rmd->name(); - if (!scope.isEmpty() && scope!=def->name()) - { - name.prepend(scope+"::"); - } - writeXMLString(t,name); - t << "</references>" << endl; - } + writeMemberReference(t,def,rmd,"references"); } } if (md->getReferencedByMembers()) @@ -1071,24 +1232,7 @@ static void generateXMLForMember(MemberDef *md,QTextStream &t,Definition *def) MemberDef *rmd; for (mdi.toFirst();(rmd=mdi.current());++mdi) { - if (rmd->getStartBodyLine()!=-1 && rmd->getBodyDef()) - { - t << " <referencedby id=\""; - t << rmd->getBodyDef()->getOutputFileBase() - << "_1" // encoded `:' character (see util.cpp:convertNameToFile) - << rmd->anchor() - << "\" line=\"" - << rmd->getStartBodyLine() - << "\">"; - QCString scope = rmd->getScopeString(); - QCString name = rmd->name(); - if (!scope.isEmpty() && scope!=def->name()) - { - name.prepend(scope+"::"); - } - writeXMLString(t,name); - t << "</referencedby>" << endl; - } + writeMemberReference(t,def,rmd,"referencedby"); } } @@ -1256,9 +1400,15 @@ static void generateXMLForClass(ClassDef *cd,QTextStream &t) collaborationGraph.writeXML(t); t << " </collaborationgraph>" << endl; } - t << " <location file=\"" + t << " <location file=\"" << cd->getDefFileName() << "\" line=\"" - << cd->getDefLine() << "\"/>" << endl; + << cd->getDefLine() << "\""; + if (cd->getStartBodyLine()!=-1) + { + t << " bodystart=\"" << cd->getStartBodyLine() << "\" bodyend=\"" + << cd->getEndBodyLine() << "\""; + } + t << "/>" << endl; t << " </compounddef>" << endl; } @@ -1461,7 +1611,7 @@ static void generateXMLForGroup(GroupDef *gd,QTextStream &t) t << " <compounddef id=\"" << gd->getOutputFileBase() << "\" kind=\"group\">" << endl; - t << " <name>" << convertToXML(gd->name()) << "</name>" << endl; + t << " <compoundname>" << convertToXML(gd->name()) << "</compoundname>" << endl; t << " <title>" << convertToXML(gd->groupTitle()) << "</title>" << endl; FileList *fl = gd->getFiles(); @@ -1540,8 +1690,8 @@ static void generateXMLForPage(PageInfo *pi,QTextStream &t) t << " <compounddef id=\""; if (Config_getBool("CASE_SENSE_NAMES")) t << pi->name; else t << pi->name.lower(); - t << "\">" << endl; - t << " <name>" << pi->name << "</name>" << endl; + t << "\" kind=\"page\">" << endl; + t << " <compoundname>" << pi->name << "</compoundname>" << endl; SectionInfo *si = Doxygen::sectionDict.find(pi->name); if (si) { |