diff options
author | Dimitri van Heesch <dimitri@stack.nl> | 2012-07-12 15:32:41 (GMT) |
---|---|---|
committer | Dimitri van Heesch <dimitri@stack.nl> | 2012-07-12 15:32:41 (GMT) |
commit | 52445a98210e9aa50b3fd4bb36995e117539e490 (patch) | |
tree | 84ec1ff38937e82a2dfe563fc2d140bc337ffd7f /src | |
parent | 0ce3aea886f4e95da56d164b3944fd54d3d68f89 (diff) | |
download | Doxygen-52445a98210e9aa50b3fd4bb36995e117539e490.zip Doxygen-52445a98210e9aa50b3fd4bb36995e117539e490.tar.gz Doxygen-52445a98210e9aa50b3fd4bb36995e117539e490.tar.bz2 |
Release-1.8.1.2
Diffstat (limited to 'src')
96 files changed, 2346 insertions, 701 deletions
diff --git a/src/bib2xhtml.h b/src/bib2xhtml.h index 65e4ed4..3615cee 100644 --- a/src/bib2xhtml.h +++ b/src/bib2xhtml.h @@ -88,6 +88,35 @@ " s/\\\\([cC]hi)\\b/&$1;/g;\n" " s/\\\\([pP]si)\\b/&$1;/g;\n" " s/\\\\([oO]mega)\\b/&$1;/g;\n" +" s/\\\\S\\b/§/g;\n" +" s/^\\\\circ\\b/°/g;\n" +" s/\\\\infty\\b/∞/g;\n" +" s/\\\\emptyset\\b/∅/g;\n" +" s/\\\\pm\\b/±/g;\n" +" s/\\\\times\\b/×/g;\n" +" s/\\\\cdot\\b/⋅/g;\n" +" s/\\\\partial\\b/∂/g;\n" +" s/\\\\nabla\\b/∇/g;\n" +" s/\\\\surd\\b/√/g;\n" +" s/\\\\perp\\b/⊥/g;\n" +" s/\\\\sum\\b/∑/g;\n" +" s/\\\\int\\b/∫/g;\n" +" s/\\\\prod\\b/∏/g;\n" +" s/\\\\sim\\b/∼/g;\n" +" s/\\\\approx\\b/≈/g;\n" +" s/\\\\ne\\b/≠/g;\n" +" s/\\\\equiv\\b/≡/g;\n" +" s/\\\\propto\\b/∝/g;\n" +" s/\\\\le\\b/≤/g;\n" +" s/\\\\ge\\b/≥/g;\n" +" s/\\\\leftarrow\\b/←/g;\n" +" s/\\\\rightarrow\\b/→/g;\n" +" s/\\\\in\\b/∈/g;\n" +" s/\\\\notin\\b/∉/g;\n" +" s/\\\\lceil\\b/⌈/g;\n" +" s/\\\\rceil\\b/⌉/g;\n" +" s/\\\\lfloor\\b/⌊/g;\n" +" s/\\\\rfloor\\b/⌋/g;\n" "}\n" "foreach (@ARGV) {\n" " if (/\\.bib$/) {\n" diff --git a/src/bib2xhtml.pl b/src/bib2xhtml.pl index 146435f..da6dc62 100755 --- a/src/bib2xhtml.pl +++ b/src/bib2xhtml.pl @@ -88,6 +88,35 @@ sub html_ent { s/\\([cC]hi)\b/&$1;/g; s/\\([pP]si)\b/&$1;/g; s/\\([oO]mega)\b/&$1;/g; + s/\\S\b/§/g; + s/^\\circ\b/°/g; + s/\\infty\b/∞/g; + s/\\emptyset\b/∅/g; + s/\\pm\b/±/g; + s/\\times\b/×/g; + s/\\cdot\b/⋅/g; + s/\\partial\b/∂/g; + s/\\nabla\b/∇/g; + s/\\surd\b/√/g; + s/\\perp\b/⊥/g; + s/\\sum\b/∑/g; + s/\\int\b/∫/g; + s/\\prod\b/∏/g; + s/\\sim\b/∼/g; + s/\\approx\b/≈/g; + s/\\ne\b/≠/g; + s/\\equiv\b/≡/g; + s/\\propto\b/∝/g; + s/\\le\b/≤/g; + s/\\ge\b/≥/g; + s/\\leftarrow\b/←/g; + s/\\rightarrow\b/→/g; + s/\\in\b/∈/g; + s/\\notin\b/∉/g; + s/\\lceil\b/⌈/g; + s/\\rceil\b/⌉/g; + s/\\lfloor\b/⌊/g; + s/\\rfloor\b/⌋/g; } foreach (@ARGV) { if (/\.bib$/) { diff --git a/src/classdef.cpp b/src/classdef.cpp index 1aa20e1..68f8b06 100644 --- a/src/classdef.cpp +++ b/src/classdef.cpp @@ -761,9 +761,9 @@ static void writeInheritanceSpecifier(OutputList &ol,BaseClassDef *bcd) ol.startTypewriter(); ol.docify(" ["); QStrList sl; - if (bcd->prot==Protected) sl.append("protected"); - else if (bcd->prot==Private) sl.append("private"); - if (bcd->virt==Virtual) sl.append("virtual"); + if (bcd->prot==Protected) sl.append("protected"); + else if (bcd->prot==Private) sl.append("private"); + if (bcd->virt==Virtual) sl.append("virtual"); const char *s=sl.first(); while (s) { @@ -790,7 +790,11 @@ void ClassDef::setIncludeFile(FileDef *fd, m_impl->incInfo->includeName = includeName; m_impl->incInfo->local = local; } - if (force && includeName) m_impl->incInfo->includeName = includeName; + if (force && includeName) + { + m_impl->incInfo->includeName = includeName; + m_impl->incInfo->local = local; + } } // TODO: fix this: a nested template class can have multiple outer templates @@ -971,7 +975,10 @@ void ClassDef::writeDetailedDescription(OutputList &ol, const QCString &/*pageTy (Config_getBool("SOURCE_BROWSER") && getStartBodyLine()!=-1 && getBodyDef()) || exampleFlag) { - ol.writeRuler(); + ol.pushGeneratorState(); + ol.disable(OutputGenerator::Html); + ol.writeRuler(); + ol.popGeneratorState(); ol.pushGeneratorState(); ol.disableAllBut(OutputGenerator::Html); @@ -1331,6 +1338,7 @@ void ClassDef::writeIncludeFiles(OutputList &ol) } } +#if 0 void ClassDef::writeAllMembersLink(OutputList &ol) { // write link to list of all members (HTML only) @@ -1349,6 +1357,7 @@ void ClassDef::writeAllMembersLink(OutputList &ol) ol.popGeneratorState(); } } +#endif void ClassDef::writeMemberGroups(OutputList &ol,bool showInline) { @@ -1462,7 +1471,16 @@ void ClassDef::writeSummaryLinks(OutputList &ol) ) { LayoutDocEntrySection *ls = (LayoutDocEntrySection*)lde; - writeSummaryLink(ol,"nested-classes",ls->title,first); + ol.writeSummaryLink(0,"nested-classes",ls->title,first); + first=FALSE; + } + else if (lde->kind()==LayoutDocEntry::ClassAllMembersLink && + m_impl->allMemberNameInfoSDict && + !Config_getBool("OPTIMIZE_OUTPUT_FOR_C") + ) + { + ol.writeSummaryLink(getMemberListFileName(),"all-members-list",theTranslator->trListOfAllMembers(),first); + first=FALSE; } else if (lde->kind()== LayoutDocEntry::MemberDecl) { @@ -1470,7 +1488,8 @@ void ClassDef::writeSummaryLinks(OutputList &ol) MemberList * ml = getMemberList(lmd->type); if (ml && ml->declVisible()) { - writeSummaryLink(ol,ml->listTypeAsString(),lmd->title,first); + ol.writeSummaryLink(0,ml->listTypeAsString(),lmd->title,first); + first=FALSE; } } } @@ -1480,7 +1499,7 @@ void ClassDef::writeSummaryLinks(OutputList &ol) SDict<QCString>::Iterator li(m_impl->vhdlSummaryTitles); for (li.toFirst();li.current();++li) { - writeSummaryLink(ol,li.current()->data(),li.current()->data(),first); + ol.writeSummaryLink(0,li.current()->data(),li.current()->data(),first); } } if (!first) @@ -1821,7 +1840,7 @@ void ClassDef::writeDocumentationContents(OutputList &ol,const QCString &pageTit writeCollaborationGraph(ol); break; case LayoutDocEntry::ClassAllMembersLink: - writeAllMembersLink(ol); + //writeAllMembersLink(ol); // this is now part of the summary links break; case LayoutDocEntry::MemberDeclStart: startMemberDeclarations(ol); @@ -3804,54 +3823,49 @@ static void convertProtectionLevel( break; } } + //printf("convertProtectionLevel(type=%d prot=%d): %d,%d\n", + // inListType,inProt,*outListType1,*outListType2); } int ClassDef::countInheritedDecMembersRec(MemberList::ListType lt, ClassDef *inheritedFrom) { + //printf("> %s::countedInheritedDecMembersRec(%d)\n",name().data(),lt); int count=0; if (m_impl->inherits) { - BaseClassDef *ibcd=m_impl->inherits->first(); - while (ibcd) + BaseClassListIterator it(*m_impl->inherits); + BaseClassDef *ibcd; + for (it.toFirst();(ibcd=it.current());++it) { ClassDef *icd=ibcd->classDef; int lt1,lt2; + // an inherited member with protection level lt + // could have come from a section with protection levels lt1 or lt2 + // in the bass class (e.g. for protected inheritance, the protected + // member comes from protected and public methods in the base class) convertProtectionLevel(lt,ibcd->prot,<1,<2); - MemberList *ml = icd->getMemberList((MemberList::ListType)lt1); - if (ml) + MemberList *ml1 = icd->getMemberList((MemberList::ListType)lt1); + MemberList *ml2 = icd->getMemberList((MemberList::ListType)lt2); + if (ml1) { - //count+=ml->countInheritableMembers(inheritedFrom); count+=icd->countMembersIncludingGrouped((MemberList::ListType)lt1,inheritedFrom,TRUE); - count+=icd->countInheritedDecMembersRec((MemberList::ListType)lt1,inheritedFrom); } - if (lt2!=-1) + if (ml2) { - ml = icd->getMemberList((MemberList::ListType)lt2); - if (ml) - { - //count+=ml->countInheritableMembers(inheritedFrom); - count+=icd->countMembersIncludingGrouped((MemberList::ListType)lt2,inheritedFrom,TRUE); - count+=icd->countInheritedDecMembersRec((MemberList::ListType)lt2,inheritedFrom); - } + count+=icd->countMembersIncludingGrouped((MemberList::ListType)lt2,inheritedFrom,TRUE); } - ibcd=m_impl->inherits->next(); - } - } -#if 0 - if (m_impl->memberGroupSDict) - { - MemberGroupSDict::Iterator mgli(*m_impl->memberGroupSDict); - MemberGroup *mg; - for (;(mg=mgli.current());++mgli) - { - if (!mg->allMembersInSameSection() || !m_impl->subGrouping) // group is in its own section + if (lt1!=-1) { - count+=mg->countGroupedInheritedMembers(lt); + count+=icd->countInheritedDecMembersRec((MemberList::ListType)lt1,inheritedFrom); + } + if (lt2!=-1) + { + count+=icd->countInheritedDecMembersRec((MemberList::ListType)lt2,inheritedFrom); } } } -#endif + //printf("< %s::countedInheritedDecMembersRec(%d) count=%d\n",name().data(),lt,count); return count; } @@ -3863,7 +3877,7 @@ int ClassDef::countInheritedDecMembers(MemberList::ListType lt) { count = ml->countInheritableMembers(this); } - if (count==0) // for this class the member list is empty + if (count==0) // for this class the (non-private) member list is empty // see if we need to create a section for it under // Additional Inherited Members { @@ -3871,7 +3885,7 @@ int ClassDef::countInheritedDecMembers(MemberList::ListType lt) } else // member list is not empty, so we will add the inherited members there { - count=0; + count = 0; } return count; } @@ -3977,7 +3991,7 @@ void ClassDef::writeInheritedMemberDeclarations(OutputList &ol, if (lt1!=-1) { icd->writeMemberDeclarations(ol,(MemberList::ListType)lt1, - title,QCString(),FALSE,inheritedFrom,lt2,visitedClasses); + title,QCString(),FALSE,inheritedFrom,lt2,invert,visitedClasses); } } } @@ -3986,19 +4000,22 @@ void ClassDef::writeInheritedMemberDeclarations(OutputList &ol, } void ClassDef::writeMemberDeclarations(OutputList &ol,MemberList::ListType lt,const QCString &title, - const char *subTitle,bool showInline,ClassDef *inheritedFrom,int lt2,QPtrDict<void> *visitedClasses) + const char *subTitle,bool showInline,ClassDef *inheritedFrom,int lt2,bool invert,QPtrDict<void> *visitedClasses) { - //printf("%s::writeMemberDeclarations(%s)\n",name().data(),title.data()); - //static bool optimizeVhdl = Config_getBool("OPTIMIZE_OUTPUT_VHDL"); + //printf("%s: ClassDef::writeMemberDeclarations for %s\n",name().data(),ml->listTypeAsString().data()); MemberList * ml = getMemberList(lt); - if (ml) + if (getLanguage()==SrcLangExt_VHDL) // use specific declarations function { - //printf("%s: ClassDef::writeMemberDeclarations for %s\n",name().data(),ml->listTypeAsString().data()); - if (getLanguage()==SrcLangExt_VHDL) // use specific declarations function + if (ml) { VhdlDocGen::writeVhdlDeclarations(ml,ol,0,this,0,0); } - else // use generic declaration function + } + else + { + //printf("%s::writeMemberDeclarations(%s)\n",name().data(),title.data()); + //static bool optimizeVhdl = Config_getBool("OPTIMIZE_OUTPUT_VHDL"); + if (ml) { ml->writeDeclarations(ol,this,0,0,0,title,subTitle,FALSE,showInline,inheritedFrom); if (lt2!=-1) @@ -4009,15 +4026,14 @@ void ClassDef::writeMemberDeclarations(OutputList &ol,MemberList::ListType lt,co ml2->writeDeclarations(ol,this,0,0,0,0,0,FALSE,showInline,inheritedFrom); } } - - static bool inlineInheritedMembers = Config_getBool("INLINE_INHERITED_MEMB"); - if (!inlineInheritedMembers) // show inherited members as separate lists - { - QPtrDict<void> visited(17); - writeInheritedMemberDeclarations(ol,lt,title, - inheritedFrom ? inheritedFrom : this, - FALSE,visitedClasses==0 ? &visited: visitedClasses); - } + } + static bool inlineInheritedMembers = Config_getBool("INLINE_INHERITED_MEMB"); + if (!inlineInheritedMembers) // show inherited members as separate lists + { + QPtrDict<void> visited(17); + writeInheritedMemberDeclarations(ol,lt,title, + inheritedFrom ? inheritedFrom : this, + invert,visitedClasses==0 ? &visited: visitedClasses); } } } diff --git a/src/classdef.h b/src/classdef.h index e7d5fb5..033162e 100644 --- a/src/classdef.h +++ b/src/classdef.h @@ -361,7 +361,7 @@ class ClassDef : public Definition MemberList *createMemberList(MemberList::ListType lt); void writeInheritedMemberDeclarations(OutputList &ol,MemberList::ListType lt,const QCString &title,ClassDef *inheritedFrom,bool invert,QPtrDict<void> *visitedClasses); void writeMemberDeclarations(OutputList &ol,MemberList::ListType lt,const QCString &title, - const char *subTitle=0,bool showInline=FALSE,ClassDef *inheritedFrom=0,int lt2=-1,QPtrDict<void> *visitedClasses=0); + const char *subTitle=0,bool showInline=FALSE,ClassDef *inheritedFrom=0,int lt2=-1,bool invert=FALSE,QPtrDict<void> *visitedClasses=0); void writeMemberDocumentation(OutputList &ol,MemberList::ListType lt,const QCString &title,bool showInline=FALSE); void writeSimpleMemberDocumentation(OutputList &ol,MemberList::ListType lt); void writePlainMemberDeclaration(OutputList &ol,MemberList::ListType lt,bool inGroup,ClassDef *inheritedFrom,const char *inheritId); @@ -369,7 +369,7 @@ class ClassDef : public Definition void writeDetailedDescription(OutputList &ol,const QCString &pageType,bool exampleFlag, const QCString &title,const QCString &anchor=QCString()); void writeIncludeFiles(OutputList &ol); - void writeAllMembersLink(OutputList &ol); + //void writeAllMembersLink(OutputList &ol); void writeInheritanceGraph(OutputList &ol); void writeCollaborationGraph(OutputList &ol); void writeMemberGroups(OutputList &ol,bool showInline=FALSE); diff --git a/src/cmdmapper.cpp b/src/cmdmapper.cpp index 9a723c2..b13fc37 100644 --- a/src/cmdmapper.cpp +++ b/src/cmdmapper.cpp @@ -113,6 +113,7 @@ CommandMap cmdMap[] = { "$", CMD_DOLLAR }, { "#", CMD_HASH }, { "%", CMD_PERCENT }, + { "|", CMD_PIPE }, { "::", CMD_DCOLON }, { "\"", CMD_QUOTE }, { "_internalref", CMD_INTERNALREF }, diff --git a/src/cmdmapper.h b/src/cmdmapper.h index c53e2b1..06778c5 100644 --- a/src/cmdmapper.h +++ b/src/cmdmapper.h @@ -116,7 +116,8 @@ enum CommandType CMD_CITE = 86, CMD_SNIPPET = 87, CMD_RTFONLY = 88, - CMD_ENDRTFONLY = 89 + CMD_ENDRTFONLY = 89, + CMD_PIPE = 90 }; enum HtmlTagType @@ -2168,7 +2168,8 @@ OPERATOR {ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP} g_curClassBases.clear(); BEGIN( Bases ); } -<PackageName>[ \t]*";" | +<PackageName>[ \t]*";" | +<Bases>^{B}*/"@"{ID} | // Objective-C interface <Bases,ClassName,ClassVar,CppCliTypeModifierFollowup>{B}*"{"{B}* { g_theVarContext.pushScope(); g_code->codify(yytext); diff --git a/src/commentcnv.l b/src/commentcnv.l index 689c274..869b122 100644 --- a/src/commentcnv.l +++ b/src/commentcnv.l @@ -195,64 +195,6 @@ static void endCondSection() } } -#if 0 -/** remove and executes cond and endcond commands in \a s */ -static QCString handleCondCmdInAliases(const QCString &s) -{ - QCString result; - //printf("handleCondCmdInAliases(%s)\n",s.data()); - static QRegExp cmdPat("[\\\\@][a-z_A-Z][a-z_A-Z0-9]*"); - int p=0,i,l; - while ((i=cmdPat.match(s,p,&l))!=-1) - { - result+=s.mid(p,i-p); - QCString cmd = s.mid(i+1,l-1); - //printf("Found command %s\n",cmd.data()); - if (cmd=="cond") - { - int sp=i+l,ep; - const char *arg=s.data()+sp; - char c; - // skip spaces - while ((c=*arg) && (c==' ' || c=='\t')) arg++,sp++; - // read argument - if (*arg=='\n') // no arg - { - startCondSection(" "); - ep=sp; - } - else // get argument - { - ep=sp; - while ((c=*arg) && isId(c)) arg++,ep++; - if (ep>sp) - { - QCString id = s.mid(sp,ep-sp); - //printf("Found conditional section id %s\n",id.data()); - startCondSection(id); - } - else // invalid identifier - { - } - } - p=ep; - } - else if (cmd=="endcond") - { - endCondSection(); - p=i+l; - } - else - { - result+=s.mid(i,l); - p=i+l; - } - } - result+=s.right(s.length()-p); - return result; -} -#endif - /** copies string \a s with length \a len to the output, while * replacing any alias commands found in the string. */ @@ -608,6 +550,7 @@ void replaceComment(int offset); BEGIN(Scan); } } + /* removed for bug 674842 (bug was introduced in rev 768) <CComment>"'" { g_charContext = YY_START; copyToOutput(yytext,(int)yyleng); @@ -618,6 +561,7 @@ void replaceComment(int offset); copyToOutput(yytext,(int)yyleng); BEGIN(SkipString); } + */ <CComment>. { copyToOutput(yytext,(int)yyleng); } diff --git a/src/commentscan.l b/src/commentscan.l index 26c381f..b44bd70 100644 --- a/src/commentscan.l +++ b/src/commentscan.l @@ -970,6 +970,14 @@ RCSTAG "$"{ID}":"[^\n$]+"$" <Comment>"</remarks>" { // end of a brief or detailed description addOutput(yytext); } +<Comment>"<"{PRE}{ATTR}">" { + insidePre=TRUE; + addOutput(yytext); + } +<Comment>"</"{PRE}">" { + insidePre=FALSE; + addOutput(yytext); + } <Comment>{RCSTAG} { // RCS tag which end a brief description setOutput(OutputDoc); REJECT; @@ -1115,10 +1123,10 @@ RCSTAG "$"{ID}":"[^\n$]+"$" addOutput(yytext); } <Comment>"---" { // mdash - addOutput("—"); + addOutput(insidePre || Doxygen::markdownSupport ? yytext : "—"); } <Comment>"--" { // ndash - addOutput("–"); + addOutput(insidePre || Doxygen::markdownSupport ? yytext : "–"); } <Comment>("."+)[a-z_A-Z0-9\)] { // . at start or in the middle of a word, or ellipsis addOutput(yytext); @@ -2672,7 +2680,7 @@ bool parseCommentBlock(/* in */ ParserInterface *parser, } Debug::print(Debug::CommentScan,0,"-----------\nCommentScanner: %s:%d\n" - "input=[%s]\n",fileName.data(),lineNr,comment.data() + "input=[\n%s]\n",fileName.data(),lineNr,comment.data() ); commentScanYYrestart( commentScanYYin ); diff --git a/src/compound.xsd b/src/compound.xsd index 4007382..5549b03 100644 --- a/src/compound.xsd +++ b/src/compound.xsd @@ -392,6 +392,75 @@ <xsd:element name="ring" type="docCharType" /> <xsd:element name="szlig" type="docEmptyType" /> <xsd:element name="nonbreakablespace" type="docEmptyType" /> + <xsd:element name="aelig" type="docEmptyType" /> + <xsd:element name="AElig" type="docEmptyType" /> + <xsd:element name="Gamma" type="docEmptyType" /> + <xsd:element name="Delta" type="docEmptyType" /> + <xsd:element name="Theta" type="docEmptyType" /> + <xsd:element name="Lambda" type="docEmptyType" /> + <xsd:element name="Xi" type="docEmptyType" /> + <xsd:element name="Pi" type="docEmptyType" /> + <xsd:element name="Sigma" type="docEmptyType" /> + <xsd:element name="Upsilon" type="docEmptyType" /> + <xsd:element name="Phi" type="docEmptyType" /> + <xsd:element name="Psi" type="docEmptyType" /> + <xsd:element name="Omega" type="docEmptyType" /> + <xsd:element name="alpha" type="docEmptyType" /> + <xsd:element name="beta" type="docEmptyType" /> + <xsd:element name="gamma" type="docEmptyType" /> + <xsd:element name="delta" type="docEmptyType" /> + <xsd:element name="epsilon" type="docEmptyType" /> + <xsd:element name="zeta" type="docEmptyType" /> + <xsd:element name="eta" type="docEmptyType" /> + <xsd:element name="theta" type="docEmptyType" /> + <xsd:element name="iota" type="docEmptyType" /> + <xsd:element name="kappa" type="docEmptyType" /> + <xsd:element name="lambda" type="docEmptyType" /> + <xsd:element name="mu" type="docEmptyType" /> + <xsd:element name="nu" type="docEmptyType" /> + <xsd:element name="xi" type="docEmptyType" /> + <xsd:element name="pi" type="docEmptyType" /> + <xsd:element name="rho" type="docEmptyType" /> + <xsd:element name="sigma" type="docEmptyType" /> + <xsd:element name="tau" type="docEmptyType" /> + <xsd:element name="upsilon" type="docEmptyType" /> + <xsd:element name="phi" type="docEmptyType" /> + <xsd:element name="chi" type="docEmptyType" /> + <xsd:element name="psi" type="docEmptyType" /> + <xsd:element name="omega" type="docEmptyType" /> + <xsd:element name="sigmaf" type="docEmptyType" /> + <xsd:element name="sect" type="docEmptyType" /> + <xsd:element name="deg" type="docEmptyType" /> + <xsd:element name="prime" type="docEmptyType" /> + <xsd:element name="Prime" type="docEmptyType" /> + <xsd:element name="infin" type="docEmptyType" /> + <xsd:element name="empty" type="docEmptyType" /> + <xsd:element name="plusmn" type="docEmptyType" /> + <xsd:element name="times" type="docEmptyType" /> + <xsd:element name="minus" type="docEmptyType" /> + <xsd:element name="sdot" type="docEmptyType" /> + <xsd:element name="part" type="docEmptyType" /> + <xsd:element name="nabla" type="docEmptyType" /> + <xsd:element name="radic" type="docEmptyType" /> + <xsd:element name="perp" type="docEmptyType" /> + <xsd:element name="sum" type="docEmptyType" /> + <xsd:element name="int" type="docEmptyType" /> + <xsd:element name="prod" type="docEmptyType" /> + <xsd:element name="sim" type="docEmptyType" /> + <xsd:element name="asymp" type="docEmptyType" /> + <xsd:element name="ne" type="docEmptyType" /> + <xsd:element name="equiv" type="docEmptyType" /> + <xsd:element name="prop" type="docEmptyType" /> + <xsd:element name="le" type="docEmptyType" /> + <xsd:element name="ge" type="docEmptyType" /> + <xsd:element name="larr" type="docEmptyType" /> + <xsd:element name="rarr" type="docEmptyType" /> + <xsd:element name="isin" type="docEmptyType" /> + <xsd:element name="notin" type="docEmptyType" /> + <xsd:element name="lceil" type="docEmptyType" /> + <xsd:element name="rceil" type="docEmptyType" /> + <xsd:element name="lfloor" type="docEmptyType" /> + <xsd:element name="rfloor" type="docEmptyType" /> </xsd:choice> </xsd:group> @@ -827,6 +896,7 @@ <xsd:enumeration value="assign"/> <xsd:enumeration value="weak"/> <xsd:enumeration value="strong"/> + <xsd:enumeration value="unretained"/> </xsd:restriction> </xsd:simpleType> diff --git a/src/compound_xsd.h b/src/compound_xsd.h index eb4d978..6d60a1d 100644 --- a/src/compound_xsd.h +++ b/src/compound_xsd.h @@ -392,6 +392,75 @@ " <xsd:element name=\"ring\" type=\"docCharType\" />\n" " <xsd:element name=\"szlig\" type=\"docEmptyType\" />\n" " <xsd:element name=\"nonbreakablespace\" type=\"docEmptyType\" />\n" +" <xsd:element name=\"aelig\" type=\"docEmptyType\" />\n" +" <xsd:element name=\"AElig\" type=\"docEmptyType\" />\n" +" <xsd:element name=\"Gamma\" type=\"docEmptyType\" />\n" +" <xsd:element name=\"Delta\" type=\"docEmptyType\" />\n" +" <xsd:element name=\"Theta\" type=\"docEmptyType\" />\n" +" <xsd:element name=\"Lambda\" type=\"docEmptyType\" />\n" +" <xsd:element name=\"Xi\" type=\"docEmptyType\" />\n" +" <xsd:element name=\"Pi\" type=\"docEmptyType\" />\n" +" <xsd:element name=\"Sigma\" type=\"docEmptyType\" />\n" +" <xsd:element name=\"Upsilon\" type=\"docEmptyType\" />\n" +" <xsd:element name=\"Phi\" type=\"docEmptyType\" />\n" +" <xsd:element name=\"Psi\" type=\"docEmptyType\" />\n" +" <xsd:element name=\"Omega\" type=\"docEmptyType\" />\n" +" <xsd:element name=\"alpha\" type=\"docEmptyType\" />\n" +" <xsd:element name=\"beta\" type=\"docEmptyType\" />\n" +" <xsd:element name=\"gamma\" type=\"docEmptyType\" />\n" +" <xsd:element name=\"delta\" type=\"docEmptyType\" />\n" +" <xsd:element name=\"epsilon\" type=\"docEmptyType\" />\n" +" <xsd:element name=\"zeta\" type=\"docEmptyType\" />\n" +" <xsd:element name=\"eta\" type=\"docEmptyType\" />\n" +" <xsd:element name=\"theta\" type=\"docEmptyType\" />\n" +" <xsd:element name=\"iota\" type=\"docEmptyType\" />\n" +" <xsd:element name=\"kappa\" type=\"docEmptyType\" />\n" +" <xsd:element name=\"lambda\" type=\"docEmptyType\" />\n" +" <xsd:element name=\"mu\" type=\"docEmptyType\" />\n" +" <xsd:element name=\"nu\" type=\"docEmptyType\" />\n" +" <xsd:element name=\"xi\" type=\"docEmptyType\" />\n" +" <xsd:element name=\"pi\" type=\"docEmptyType\" />\n" +" <xsd:element name=\"rho\" type=\"docEmptyType\" />\n" +" <xsd:element name=\"sigma\" type=\"docEmptyType\" />\n" +" <xsd:element name=\"tau\" type=\"docEmptyType\" />\n" +" <xsd:element name=\"upsilon\" type=\"docEmptyType\" />\n" +" <xsd:element name=\"phi\" type=\"docEmptyType\" />\n" +" <xsd:element name=\"chi\" type=\"docEmptyType\" />\n" +" <xsd:element name=\"psi\" type=\"docEmptyType\" />\n" +" <xsd:element name=\"omega\" type=\"docEmptyType\" />\n" +" <xsd:element name=\"sigmaf\" type=\"docEmptyType\" />\n" +" <xsd:element name=\"sect\" type=\"docEmptyType\" />\n" +" <xsd:element name=\"deg\" type=\"docEmptyType\" />\n" +" <xsd:element name=\"prime\" type=\"docEmptyType\" />\n" +" <xsd:element name=\"Prime\" type=\"docEmptyType\" />\n" +" <xsd:element name=\"infin\" type=\"docEmptyType\" />\n" +" <xsd:element name=\"empty\" type=\"docEmptyType\" />\n" +" <xsd:element name=\"plusmn\" type=\"docEmptyType\" />\n" +" <xsd:element name=\"times\" type=\"docEmptyType\" />\n" +" <xsd:element name=\"minus\" type=\"docEmptyType\" />\n" +" <xsd:element name=\"sdot\" type=\"docEmptyType\" />\n" +" <xsd:element name=\"part\" type=\"docEmptyType\" />\n" +" <xsd:element name=\"nabla\" type=\"docEmptyType\" />\n" +" <xsd:element name=\"radic\" type=\"docEmptyType\" />\n" +" <xsd:element name=\"perp\" type=\"docEmptyType\" />\n" +" <xsd:element name=\"sum\" type=\"docEmptyType\" />\n" +" <xsd:element name=\"int\" type=\"docEmptyType\" />\n" +" <xsd:element name=\"prod\" type=\"docEmptyType\" />\n" +" <xsd:element name=\"sim\" type=\"docEmptyType\" />\n" +" <xsd:element name=\"asymp\" type=\"docEmptyType\" />\n" +" <xsd:element name=\"ne\" type=\"docEmptyType\" />\n" +" <xsd:element name=\"equiv\" type=\"docEmptyType\" />\n" +" <xsd:element name=\"prop\" type=\"docEmptyType\" />\n" +" <xsd:element name=\"le\" type=\"docEmptyType\" />\n" +" <xsd:element name=\"ge\" type=\"docEmptyType\" />\n" +" <xsd:element name=\"larr\" type=\"docEmptyType\" />\n" +" <xsd:element name=\"rarr\" type=\"docEmptyType\" />\n" +" <xsd:element name=\"isin\" type=\"docEmptyType\" />\n" +" <xsd:element name=\"notin\" type=\"docEmptyType\" />\n" +" <xsd:element name=\"lceil\" type=\"docEmptyType\" />\n" +" <xsd:element name=\"rceil\" type=\"docEmptyType\" />\n" +" <xsd:element name=\"lfloor\" type=\"docEmptyType\" />\n" +" <xsd:element name=\"rfloor\" type=\"docEmptyType\" />\n" " </xsd:choice>\n" " </xsd:group>\n" "\n" @@ -827,6 +896,7 @@ " <xsd:enumeration value=\"assign\"/>\n" " <xsd:enumeration value=\"weak\"/>\n" " <xsd:enumeration value=\"strong\"/>\n" +" <xsd:enumeration value=\"unretained\"/>\n" " </xsd:restriction>\n" " </xsd:simpleType>\n" "\n" diff --git a/src/config.l b/src/config.l index 9719f31..d19f233 100644 --- a/src/config.l +++ b/src/config.l @@ -1225,7 +1225,7 @@ void Config::check() QFileInfo fi(dotPath); if (fi.exists() && fi.isFile()) // user specified path + exec { - dotPath=fi.dirPath(TRUE).utf8(); + dotPath=fi.dirPath(TRUE).utf8()+"/"; } else { diff --git a/src/definition.cpp b/src/definition.cpp index 1631c16..8e9b0be 100644 --- a/src/definition.cpp +++ b/src/definition.cpp @@ -394,7 +394,9 @@ void Definition::addSectionsToIndex() Doxygen::indexList.decContentsDepth(); } } - Doxygen::indexList.addContentsItem(TRUE,si->title, + QCString title = si->title; + if (title.isEmpty()) title = si->label; + Doxygen::indexList.addContentsItem(TRUE,title, getReference(), getOutputFileBase(), si->label, diff --git a/src/dirdef.cpp b/src/dirdef.cpp index 1114bb8..953f3ba 100644 --- a/src/dirdef.cpp +++ b/src/dirdef.cpp @@ -116,9 +116,12 @@ void DirDef::writeDetailedDescription(OutputList &ol,const QCString &title) if ((!briefDescription().isEmpty() && Config_getBool("REPEAT_BRIEF")) || !documentation().isEmpty()) { - ol.writeRuler(); ol.pushGeneratorState(); - ol.disableAllBut(OutputGenerator::Html); + ol.disable(OutputGenerator::Html); + ol.writeRuler(); + ol.popGeneratorState(); + ol.pushGeneratorState(); + ol.disableAllBut(OutputGenerator::Html); ol.writeAnchor(0,"details"); ol.popGeneratorState(); ol.startGroupHeader(); diff --git a/src/docparser.cpp b/src/docparser.cpp index 4beb405..876fede 100644 --- a/src/docparser.cpp +++ b/src/docparser.cpp @@ -1526,6 +1526,73 @@ DocSymbol::SymType DocSymbol::decodeSymbol(const QCString &symName,char *letter) else if (symName==" ") return DocSymbol::Nbsp; else if (symName=="Æ") return DocSymbol::AElig; else if (symName=="æ") return DocSymbol::Aelig; + else if (symName=="Γ") return DocSymbol::GrkGamma; + else if (symName=="Δ") return DocSymbol::GrkDelta; + else if (symName=="Θ") return DocSymbol::GrkTheta; + else if (symName=="Λ") return DocSymbol::GrkLambda; + else if (symName=="Ξ") return DocSymbol::GrkXi; + else if (symName=="Π") return DocSymbol::GrkPi; + else if (symName=="Σ") return DocSymbol::GrkSigma; + else if (symName=="Υ") return DocSymbol::GrkUpsilon; + else if (symName=="Φ") return DocSymbol::GrkPhi; + else if (symName=="Ψ") return DocSymbol::GrkPsi; + else if (symName=="Ω") return DocSymbol::GrkOmega; + else if (symName=="α") return DocSymbol::Grkalpha; + else if (symName=="β") return DocSymbol::Grkbeta; + else if (symName=="γ") return DocSymbol::Grkgamma; + else if (symName=="δ") return DocSymbol::Grkdelta; + else if (symName=="ε") return DocSymbol::Grkepsilon; + else if (symName=="ζ") return DocSymbol::Grkzeta; + else if (symName=="η") return DocSymbol::Grketa; + else if (symName=="θ") return DocSymbol::Grktheta; + else if (symName=="ι") return DocSymbol::Grkiota; + else if (symName=="κ") return DocSymbol::Grkkappa; + else if (symName=="λ") return DocSymbol::Grklambda; + else if (symName=="μ") return DocSymbol::Grkmu; + else if (symName=="ν") return DocSymbol::Grknu; + else if (symName=="ξ") return DocSymbol::Grkxi; + else if (symName=="π") return DocSymbol::Grkpi; + else if (symName=="ρ") return DocSymbol::Grkrho; + else if (symName=="σ") return DocSymbol::Grksigma; + else if (symName=="τ") return DocSymbol::Grktau; + else if (symName=="υ") return DocSymbol::Grkupsilon; + else if (symName=="φ") return DocSymbol::Grkphi; + else if (symName=="χ") return DocSymbol::Grkchi; + else if (symName=="ψ") return DocSymbol::Grkpsi; + else if (symName=="ω") return DocSymbol::Grkomega; + else if (symName=="ς") return DocSymbol::Grkvarsigma; + else if (symName=="§") return DocSymbol::Section; + else if (symName=="°") return DocSymbol::Degree; + else if (symName=="′") return DocSymbol::Prime; + else if (symName=="″") return DocSymbol::DoublePrime; + else if (symName=="∞") return DocSymbol::Infinity; + else if (symName=="∅") return DocSymbol::EmptySet; + else if (symName=="±") return DocSymbol::PlusMinus; + else if (symName=="×") return DocSymbol::Times; + else if (symName=="−") return DocSymbol::Minus; + else if (symName=="⋅") return DocSymbol::CenterDot; + else if (symName=="∂") return DocSymbol::Partial; + else if (symName=="∇") return DocSymbol::Nabla; + else if (symName=="√") return DocSymbol::SquareRoot; + else if (symName=="⊥") return DocSymbol::Perpendicular; + else if (symName=="∑") return DocSymbol::Sum; + else if (symName=="∫") return DocSymbol::Integral; + else if (symName=="∏") return DocSymbol::Product; + else if (symName=="∼") return DocSymbol::Similar; + else if (symName=="≈") return DocSymbol::Approx; + else if (symName=="≠") return DocSymbol::NotEqual; + else if (symName=="≡") return DocSymbol::Equivalent; + else if (symName=="∝") return DocSymbol::Proportional; + else if (symName=="≤") return DocSymbol::LessEqual; + else if (symName=="≥") return DocSymbol::GreaterEqual; + else if (symName=="←") return DocSymbol::LeftArrow; + else if (symName=="→") return DocSymbol::RightArrow; + else if (symName=="∈") return DocSymbol::SetIn; + else if (symName=="∉") return DocSymbol::SetNotIn; + else if (symName=="⌈") return DocSymbol::LeftCeil; + else if (symName=="⌉") return DocSymbol::RightCeil; + else if (symName=="⌊") return DocSymbol::LeftFloor; + else if (symName=="⌋") return DocSymbol::RightFloor; else if (l==6 && symName.right(4)=="uml;") { *letter=symName.at(1); @@ -5069,7 +5136,7 @@ int DocPara::handleStartCode() if (g_token->verb.at(i)=='\n') li=i+1; i++; } - m_children.append(new DocVerbatim(this,g_context,g_token->verb.mid(li),DocVerbatim::Code,g_isExample,g_exampleName,lang)); + m_children.append(new DocVerbatim(this,g_context,stripIndentation(g_token->verb.mid(li)),DocVerbatim::Code,g_isExample,g_exampleName,lang)); if (retval==0) warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: code section ended without end marker"); doctokenizerYYsetStatePara(); return retval; @@ -5153,6 +5220,9 @@ int DocPara::handleCommand(const QCString &cmdName) case CMD_HASH: m_children.append(new DocSymbol(this,DocSymbol::Hash)); break; + case CMD_PIPE: + m_children.append(new DocSymbol(this,DocSymbol::Pipe)); + break; case CMD_DCOLON: m_children.append(new DocSymbol(this,DocSymbol::DoubleColon)); break; @@ -5607,7 +5677,7 @@ int DocPara::handleHtmlStartTag(const QCString &tagName,const HtmlAttribList &ta case HTML_PRE: handleStyleEnter(this,m_children,DocStyleChange::Preformatted,&g_token->attribs); setInsidePreformatted(TRUE); - //doctokenizerYYsetInsidePre(TRUE); + doctokenizerYYsetInsidePre(TRUE); break; case HTML_P: retval=TK_NEWPARA; @@ -6011,7 +6081,7 @@ int DocPara::handleHtmlEndTag(const QCString &tagName) case HTML_PRE: handleStyleLeave(this,m_children,DocStyleChange::Preformatted,"pre"); setInsidePreformatted(FALSE); - //doctokenizerYYsetInsidePre(FALSE); + doctokenizerYYsetInsidePre(FALSE); break; case HTML_P: retval=TK_NEWPARA; diff --git a/src/docparser.h b/src/docparser.h index ab7c523..77f488b 100644 --- a/src/docparser.h +++ b/src/docparser.h @@ -340,7 +340,19 @@ class DocSymbol : public DocNode enum SymType { Unknown=0, BSlash, At, Less, Greater, Amp, Dollar, Hash, DoubleColon, Percent, Copy, Tm, Reg, Apos, Quot, Uml, Acute, Grave, Circ, Tilde, Szlig, Cedil, Ring, Nbsp, Slash, - Lsquo, Rsquo, Ldquo, Rdquo, Ndash, Mdash, Aelig, AElig + Lsquo, Rsquo, Ldquo, Rdquo, Ndash, Mdash, Aelig, AElig, + GrkGamma, GrkDelta, GrkTheta, GrkLambda, GrkXi, GrkPi, + GrkSigma, GrkUpsilon, GrkPhi, GrkPsi, GrkOmega, Grkalpha, + Grkbeta, Grkgamma, Grkdelta, Grkepsilon, Grkzeta, Grketa, + Grktheta, Grkiota, Grkkappa, Grklambda, Grkmu, Grknu, Grkxi, + Grkpi, Grkrho, Grksigma, Grktau, Grkupsilon, Grkphi, Grkchi, + Grkpsi, Grkomega, Grkvarsigma, Section, Degree, Prime, + DoublePrime, Infinity, EmptySet, PlusMinus, Times, Minus, + CenterDot, Partial, Nabla, SquareRoot, Perpendicular, Sum, + Integral, Product, Similar, Approx, NotEqual, Equivalent, + Proportional, LessEqual, GreaterEqual, LeftArrow, RightArrow, + SetIn, SetNotIn, LeftCeil, RightCeil, LeftFloor, RightFloor, + Pipe }; DocSymbol(DocNode *parent,SymType s,char letter='\0') : m_symbol(s), m_letter(letter) { m_parent = parent; } diff --git a/src/docsets.cpp b/src/docsets.cpp index f18185d..d7d3d1c 100644 --- a/src/docsets.cpp +++ b/src/docsets.cpp @@ -47,6 +47,8 @@ void DocSets::initialize() if (publisherId.isEmpty()) publisherId="PublisherId"; QCString publisherName = Config_getString("DOCSET_PUBLISHER_NAME"); if (publisherName.isEmpty()) publisherName="PublisherName"; + QCString projectNumber = Config_getString("PROJECT_NUMBER"); + if (projectNumber.isEmpty()) projectNumber="ProjectNumber"; // -- write Makefile { @@ -115,7 +117,9 @@ void DocSets::initialize() " <key>CFBundleName</key>\n" " <string>" << projectName << "</string>\n" " <key>CFBundleIdentifier</key>\n" - " <string>" << bundleId << ".docset</string>\n" + " <string>" << bundleId << "</string>\n" + " <key>CFBundleVersion</key>\n" + " <string>" << projectNumber << "</string>\n" " <key>DocSetFeedName</key>\n" " <string>" << feedName << "</string>\n" " <key>DocSetPublisherIdentifier</key>\n" diff --git a/src/doctokenizer.l b/src/doctokenizer.l index ae4c173..396216d 100644 --- a/src/doctokenizer.l +++ b/src/doctokenizer.l @@ -120,7 +120,7 @@ static int computeIndent(const char *str,int length) { int i; int indent=0; - int tabSize=Config_getInt("TAB_SIZE"); + static int tabSize=Config_getInt("TAB_SIZE"); for (i=0;i<length;i++) { if (str[i]=='\t') @@ -340,7 +340,7 @@ FILEMASK ({FILESCHAR}*{FILEECHAR}+("."{FILESCHAR}*{FILEECHAR}+)*)|{HFILEMASK} LINKMASK [^ \t\n\r\\@<&${}]+("("[^\n)]*")")?({BLANK}*("const"|"volatile"){BLANK}+)? VERBATIM "verbatim"{BLANK}* SPCMD1 {CMD}([a-z_A-Z][a-z_A-Z0-9]*|{VERBATIM}) -SPCMD2 {CMD}[\\@<>&$#%~".] +SPCMD2 {CMD}[\\@<>&$#%~".|] SPCMD3 {CMD}form#[0-9]+ SPCMD4 {CMD}"::" INOUT "in"|"out"|("in"{BLANK}*","{BLANK}*"out")|("out"{BLANK}*","{BLANK}*"in") @@ -432,7 +432,7 @@ REFWORD {LABELID}|{REFWORD2}|{REFWORD3} return TK_LISTITEM; } <St_Para>^{MLISTITEM} { /* list item */ - if (!Doxygen::markdownSupport) + if (!Doxygen::markdownSupport || g_insidePre) { REJECT; } @@ -448,7 +448,7 @@ REFWORD {LABELID}|{REFWORD2}|{REFWORD3} } } <St_Para>^{OLISTITEM} { /* numbered list item */ - if (!Doxygen::markdownSupport) + if (!Doxygen::markdownSupport || g_insidePre) { REJECT; } @@ -474,7 +474,7 @@ REFWORD {LABELID}|{REFWORD2}|{REFWORD3} return TK_LISTITEM; } <St_Para>{BLANK}*\n{MLISTITEM} { /* list item on next line */ - if (!Doxygen::markdownSupport) + if (!Doxygen::markdownSupport || g_insidePre) { REJECT; } @@ -491,7 +491,7 @@ REFWORD {LABELID}|{REFWORD2}|{REFWORD3} } } <St_Para>{BLANK}*\n{OLISTITEM} { /* list item on next line */ - if (!Doxygen::markdownSupport) + if (!Doxygen::markdownSupport || g_insidePre) { REJECT; } @@ -685,15 +685,19 @@ REFWORD {LABELID}|{REFWORD2}|{REFWORD3} return TK_COMMAND; } <St_Para>({BLANK}*\n)+{BLANK}*\n{BLANK}* { - if (g_insidePre) - { - /* Inside a <pre>..</pre> blank lines are treated - * as whitespace. - */ - g_token->chars=yytext; - return TK_WHITESPACE; - } - else // found end of a paragraph + // g_insidePre was always FALSE, so the next section + // was never executed, now g_insidePre is set properly + // again, so the section is commented out to keep the + // old behavior. + //if (g_insidePre) + //{ + // /* Inside a <pre>..</pre> blank lines are treated + // * as whitespace. + // */ + // g_token->chars=yytext; + // return TK_WHITESPACE; + //} + //else // found end of a paragraph { g_token->indent=computeIndent(yytext,(int)yyleng); int i; diff --git a/src/dot.cpp b/src/dot.cpp index 9deae32..8db1025 100644 --- a/src/dot.cpp +++ b/src/dot.cpp @@ -232,11 +232,19 @@ static int getDotFontSize() return dotFontSize; } -static void writeGraphHeader(FTextStream &t) +static void writeGraphHeader(FTextStream &t,const QCString &title=QCString()) { static bool interactiveSVG = Config_getBool("INTERACTIVE_SVG"); - t << "digraph G" << endl; - t << "{" << endl; + t << "digraph "; + if (title.isEmpty()) + { + t << "\"Dot Graph\""; + } + else + { + t << "\"" << convertToXML(title) << "\""; + } + t << endl << "{" << endl; if (interactiveSVG) // insert a comment to force regeneration when this // option is toggled { @@ -701,7 +709,8 @@ static void removeDotGraph(const QCString &dotName) * file does not exist or its contents are not equal to \a md5, * a new .md5 is generated with the \a md5 string as contents. */ -static bool checkAndUpdateMd5Signature(const QCString &baseName,const QCString &md5) +static bool checkAndUpdateMd5Signature(const QCString &baseName, + const QCString &md5) { QFile f(baseName+".md5"); if (f.open(IO_ReadOnly)) @@ -2197,7 +2206,7 @@ void DotGfxHierarchyTable::writeGraph(FTextStream &out, // compute md5 checksum of the graph were are about to generate QGString theGraph; FTextStream md5stream(&theGraph); - writeGraphHeader(md5stream); + writeGraphHeader(md5stream,theTranslator->trGraphicalHierarchy()); md5stream << " rankdir=\"LR\";" << endl; for (dnli2.toFirst();(node=dnli2.current());++dnli2) { @@ -2861,6 +2870,7 @@ QCString computeMd5Signature(DotNode *root, bool lrRank, bool renderParents, bool backArrows, + const QCString &title, QCString &graphStr ) { @@ -2869,7 +2879,7 @@ QCString computeMd5Signature(DotNode *root, //printf("computeMd5Signature\n"); QGString buf; FTextStream md5stream(&buf); - writeGraphHeader(md5stream); + writeGraphHeader(md5stream,title); if (lrRank) { md5stream << " rankdir=\"LR\";" << endl; @@ -2930,13 +2940,15 @@ static bool updateDotGraph(DotNode *root, GraphOutputFormat format, bool lrRank, bool renderParents, - bool backArrows + bool backArrows, + const QCString &title=QCString() ) { QCString theGraph; // TODO: write graph to theGraph, then compute md5 checksum QCString md5 = computeMd5Signature( - root,gt,format,lrRank,renderParents,backArrows,theGraph); + root,gt,format,lrRank,renderParents, + backArrows,title,theGraph); QFile f(baseName+".dot"); if (f.open(IO_WriteOnly)) { @@ -3019,7 +3031,8 @@ QCString DotClassGraph::writeGraph(FTextStream &out, format, m_lrRank, m_graphType==DotNode::Inheritance, - TRUE + TRUE, + m_startNode->label() ) || !checkDeliverables(format==BITMAP ? absImgName : usePDFLatex ? absPdfName : absEpsName, @@ -3339,7 +3352,8 @@ QCString DotInclDepGraph::writeGraph(FTextStream &out, format, FALSE, // lrRank FALSE, // renderParents - m_inverse // backArrows + m_inverse, // backArrows + m_startNode->label() ) || !checkDeliverables(format==BITMAP ? absImgName : usePDFLatex ? absPdfName : absEpsName, @@ -3611,7 +3625,7 @@ QCString DotCallGraph::writeGraph(FTextStream &out, GraphOutputFormat format, static bool usePDFLatex = Config_getBool("USE_PDFLATEX"); QCString baseName = m_diskName + (m_inverse ? "_icgraph" : "_cgraph"); - QCString mapName = baseName; + QCString mapName = baseName; QCString imgExt = Config_getEnum("DOT_IMAGE_FORMAT"); QCString absBaseName = d.absPath().utf8()+"/"+baseName; @@ -3621,14 +3635,15 @@ QCString DotCallGraph::writeGraph(FTextStream &out, GraphOutputFormat format, QCString absEpsName = absBaseName+".eps"; QCString absImgName = absBaseName+"."+imgExt; - bool regenerate=FALSE; + bool regenerate = FALSE; if (updateDotGraph(m_startNode, DotNode::CallGraph, absBaseName, format, TRUE, // lrRank FALSE, // renderParents - m_inverse // backArrows + m_inverse, // backArrows + m_startNode->label() ) || !checkDeliverables(format==BITMAP ? absImgName : usePDFLatex ? absPdfName : absEpsName, @@ -3873,7 +3888,7 @@ void generateGraphLegend(const char *path) QGString theGraph; FTextStream md5stream(&theGraph); - writeGraphHeader(md5stream); + writeGraphHeader(md5stream,theTranslator->trLegendTitle()); md5stream << " Node9 [shape=\"box\",label=\"Inherited\",fontsize=\"" << FONTSIZE << "\",height=0.2,width=0.4,fontname=\"" << FONTNAME << "\",fillcolor=\"grey75\",style=\"filled\" fontcolor=\"black\"];\n"; md5stream << " Node10 -> Node9 [dir=\"back\",color=\"midnightblue\",fontsize=\"" << FONTSIZE << "\",style=\"solid\",fontname=\"" << FONTNAME << "\"];\n"; md5stream << " Node10 [shape=\"box\",label=\"PublicBase\",fontsize=\"" << FONTSIZE << "\",height=0.2,width=0.4,fontname=\"" << FONTNAME << "\",color=\"black\",URL=\"$classPublicBase" << Doxygen::htmlFileExtension << "\"];\n"; @@ -4266,7 +4281,7 @@ QCString DotGroupCollaboration::writeGraph( FTextStream &t, GraphOutputFormat fo QGString theGraph; FTextStream md5stream(&theGraph); - writeGraphHeader(md5stream); + writeGraphHeader(md5stream,m_rootNode->label()); // clean write flags QDictIterator<DotNode> dni(*m_usedNodes); @@ -4463,9 +4478,19 @@ bool DotGroupCollaboration::isTrivial() const return m_usedNodes->count() <= 1; } -void DotGroupCollaboration::writeGraphHeader(FTextStream &t) const +void DotGroupCollaboration::writeGraphHeader(FTextStream &t, + const QCString &title) const { - t << "digraph structs" << endl; + t << "digraph "; + if (title.isEmpty()) + { + t << "\"Dot Graph\""; + } + else + { + t << "\"" << convertToXML(title) << "\""; + } + t << endl; t << "{" << endl; if (Config_getBool("DOT_TRANSPARENT")) { @@ -4479,7 +4504,7 @@ void DotGroupCollaboration::writeGraphHeader(FTextStream &t) const void writeDotDirDepGraph(FTextStream &t,DirDef *dd) { - t << "digraph G {\n"; + t << "digraph \"" << dd->displayName() << "\" {\n"; if (Config_getBool("DOT_TRANSPARENT")) { t << " bgcolor=transparent;\n"; @@ -127,6 +127,7 @@ class DotNode GraphOutputFormat f, bool lrRank, bool renderParents, bool backArrows, + const QCString &title, QCString &graphStr ); }; @@ -307,7 +308,7 @@ class DotGroupCollaboration private : void addCollaborationMember( Definition* def, QCString& url, EdgeType eType ); void addMemberList( class MemberList* ml ); - void writeGraphHeader(FTextStream &t) const; + void writeGraphHeader(FTextStream &t,const QCString &title) const; Edge* addEdge( DotNode* _pNStart, DotNode* _pNEnd, EdgeType _eType, const QCString& _label, const QCString& _url ); diff --git a/src/doxygen.cpp b/src/doxygen.cpp index d942656..dd90915 100644 --- a/src/doxygen.cpp +++ b/src/doxygen.cpp @@ -1080,48 +1080,48 @@ ArgumentList *getTemplateArgumentsFromName( static ClassDef::CompoundType convertToCompoundType(int section,int specifier) { - ClassDef::CompoundType sec=ClassDef::Class; - if (specifier&Entry::Struct) - sec=ClassDef::Struct; - else if (specifier&Entry::Union) - sec=ClassDef::Union; - else if (specifier&Entry::Interface) - sec=ClassDef::Interface; - else if (specifier&Entry::Protocol) - sec=ClassDef::Protocol; - else if (specifier&Entry::Category) - sec=ClassDef::Category; - else if (specifier&Entry::Exception) - sec=ClassDef::Exception; - - switch(section) - { - //case Entry::UNION_SEC: - case Entry::UNIONDOC_SEC: - sec=ClassDef::Union; - break; + ClassDef::CompoundType sec=ClassDef::Class; + if (specifier&Entry::Struct) + sec=ClassDef::Struct; + else if (specifier&Entry::Union) + sec=ClassDef::Union; + else if (specifier&Entry::Category) + sec=ClassDef::Category; + else if (specifier&Entry::Interface) + sec=ClassDef::Interface; + else if (specifier&Entry::Protocol) + sec=ClassDef::Protocol; + else if (specifier&Entry::Exception) + sec=ClassDef::Exception; + + switch(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::STRUCTDOC_SEC: + sec=ClassDef::Struct; + break; //case Entry::INTERFACE_SEC: - case Entry::INTERFACEDOC_SEC: - sec=ClassDef::Interface; - break; + case Entry::INTERFACEDOC_SEC: + sec=ClassDef::Interface; + break; //case Entry::PROTOCOL_SEC: - case Entry::PROTOCOLDOC_SEC: - sec=ClassDef::Protocol; - break; + case Entry::PROTOCOLDOC_SEC: + sec=ClassDef::Protocol; + break; //case Entry::CATEGORY_SEC: - case Entry::CATEGORYDOC_SEC: - sec=ClassDef::Category; - break; + case Entry::CATEGORYDOC_SEC: + sec=ClassDef::Category; + break; //case Entry::EXCEPTION_SEC: - case Entry::EXCEPTIONDOC_SEC: - sec=ClassDef::Exception; - break; - } - return sec; + case Entry::EXCEPTIONDOC_SEC: + sec=ClassDef::Exception; + break; + } + return sec; } @@ -1210,7 +1210,7 @@ static void addClassToContext(EntryNav *rootNav) cd=new ClassDef(root->fileName,root->startLine,fullName,sec, tagName,refFileName,TRUE,root->spec&Entry::Enum); 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); + fullName.data(),sec,root->tArgLists ? (int)root->tArgLists->count() : -1); cd->setDocumentation(root->doc,root->docFile,root->docLine); // copy docs to definition cd->setBriefDescription(root->brief,root->briefFile,root->briefLine); cd->setLanguage(root->lang); @@ -1241,7 +1241,6 @@ static void addClassToContext(EntryNav *rootNav) // add class to the list //printf("ClassDict.insert(%s)\n",resolveDefines(fullName).data()); Doxygen::classSDict->append(fullName,cd); - } cd->addSectionsToDefinition(root->anchors); @@ -1504,7 +1503,7 @@ static void processTagLessClasses(ClassDef *rootCd, //printf(" found %s for class %s\n",name.data(),cd->name().data()); ClassDef *ncd = createTagLessInstance(rootCd,icd,name); processTagLessClasses(rootCd,icd,ncd,name,count+1); - //printf(" addTagged %s to %s\n",ncd->name().data(),cd->name().data()); + //printf(" addTagged %s to %s\n",ncd->name().data(),tagParentCd->name().data()); tagParentCd->addTaggedInnerClass(ncd); ncd->setTagLessReference(icd); @@ -1524,7 +1523,8 @@ static void processTagLessClasses(ClassDef *rootCd, { if (pmd->name()==md->name()) { - pmd->setType(substitute(pmd->typeString(),icd->name(),ncd->name())); + pmd->setAccessorType(ncd,substitute(pmd->typeString(),icd->name(),ncd->name())); + //pmd->setType(substitute(pmd->typeString(),icd->name(),ncd->name())); } } } @@ -1536,6 +1536,26 @@ static void processTagLessClasses(ClassDef *rootCd, } } +static void writeMainPageTagFileData() +{ + if (Doxygen::mainPage && !Config_getString("GENERATE_TAGFILE").isEmpty()) + { + Doxygen::tagFile << " <compound kind=\"page\">" << endl + << " <name>" + << convertToXML(Doxygen::mainPage->name()) + << "</name>" << endl + << " <title>" + << convertToXML(Doxygen::mainPage->title()) + << "</title>" << endl + << " <filename>" + << convertToXML(Doxygen::mainPage->getOutputFileBase()) + << "</filename>" << endl; + + Doxygen::mainPage->writeDocAnchorsToTagFile(); + Doxygen::tagFile << " </compound>" << endl; + } +} + static void findTagLessClasses(ClassDef *cd) { if (cd->getClassSDict()) @@ -6989,12 +7009,13 @@ static void addEnumValuesToEnums(EntryNav *rootNav) if ( (sle=rootNav->lang())==SrcLangExt_CSharp || sle==SrcLangExt_Java || - sle==SrcLangExt_XML + sle==SrcLangExt_XML || + (root->spec&Entry::Strong) ) { - // Unlike C++, for C# & Java enum values are only inside the enum - // scope, so we must create them here and only add them to the - // enum + // Unlike classic C/C++ enums, for C++11, C# & Java enum + // values are only inside the enum scope, so we must create + // them here and only add them to the enum e->loadEntry(g_storage); Entry *root = e->entry(); //printf("md->qualifiedName()=%s rootNav->name()=%s\n", @@ -7371,7 +7392,9 @@ static void computeMemberRelations() { //printf(" match found!\n"); if (mcd && bmcd && - mcd->isLinkable() && bmcd->isLinkable() + mcd->isLinkable() && bmcd->isLinkable() && md->isFunction() && + classInheritedProtectionLevel(mcd,bmcd)!=Private && + md->protection()!=Private ) { MemberDef *rmd; @@ -10556,8 +10579,14 @@ void generateOutput() initDocParser(); + bool generateHtml = Config_getBool("GENERATE_HTML"); + bool generateLatex = Config_getBool("GENERATE_LATEX"); + bool generateMan = Config_getBool("GENERATE_MAN"); + bool generateRtf = Config_getBool("GENERATE_RTF"); + + g_outputList = new OutputList(TRUE); - if (Config_getBool("GENERATE_HTML")) + if (generateHtml) { g_outputList->add(new HtmlGenerator); HtmlGenerator::init(); @@ -10582,17 +10611,17 @@ void generateOutput() copyExtraFiles(); FTVHelp::generateTreeViewImages(); } - if (Config_getBool("GENERATE_LATEX")) + if (generateLatex) { g_outputList->add(new LatexGenerator); LatexGenerator::init(); } - if (Config_getBool("GENERATE_MAN")) + if (generateMan) { g_outputList->add(new ManGenerator); ManGenerator::init(); } - if (Config_getBool("GENERATE_RTF")) + if (generateRtf) { g_outputList->add(new RTFGenerator); RTFGenerator::init(); @@ -10630,9 +10659,9 @@ void generateOutput() Doxygen::tagFile << "<tagfile>" << endl; } - if (Config_getBool("GENERATE_HTML")) writeDoxFont(Config_getString("HTML_OUTPUT")); - if (Config_getBool("GENERATE_LATEX")) writeDoxFont(Config_getString("LATEX_OUTPUT")); - if (Config_getBool("GENERATE_RTF")) writeDoxFont(Config_getString("RTF_OUTPUT")); + if (generateHtml) writeDoxFont(Config_getString("HTML_OUTPUT")); + if (generateLatex) writeDoxFont(Config_getString("LATEX_OUTPUT")); + if (generateRtf) writeDoxFont(Config_getString("RTF_OUTPUT")); msg("Generating style sheet...\n"); //printf("writing style info\n"); @@ -10656,7 +10685,7 @@ void generateOutput() // generate search indices (need to do this before writing other HTML // pages as these contain a drop down menu with options depending on // what categories we find in this function. - if (Config_getBool("GENERATE_HTML") && searchEngine) + if (generateHtml && searchEngine) { msg("Generating search indices...\n"); QCString searchDirName = Config_getString("HTML_OUTPUT")+"/search"; @@ -10707,19 +10736,24 @@ void generateOutput() msg("Generating directory documentation...\n"); generateDirDocs(*g_outputList); - if (Doxygen::formulaList.count()>0 && Config_getBool("GENERATE_HTML") + if (Doxygen::formulaList.count()>0 && generateHtml && !Config_getBool("USE_MATHJAX")) { msg("Generating bitmaps for formulas in HTML...\n"); Doxygen::formulaList.generateBitmaps(Config_getString("HTML_OUTPUT")); } - writeIndexHierarchy(*g_outputList); + writeMainPageTagFileData(); + + if (g_outputList->count()>0) + { + writeIndexHierarchy(*g_outputList); + } msg("finalizing index lists...\n"); Doxygen::indexList.finalize(); - if (!Config_getString("GENERATE_TAGFILE").isEmpty()) + if (!generateTagFile.isEmpty()) { Doxygen::tagFile << "</tagfile>" << endl; delete tag; @@ -10727,11 +10761,11 @@ void generateOutput() if (Config_getBool("DOT_CLEANUP")) { - if (Config_getBool("GENERATE_HTML")) + if (generateHtml) removeDoxFont(Config_getString("HTML_OUTPUT")); - if (Config_getBool("GENERATE_RTF")) + if (generateRtf) removeDoxFont(Config_getString("RTF_OUTPUT")); - if (Config_getBool("GENERATE_LATEX")) + if (generateLatex) removeDoxFont(Config_getString("LATEX_OUTPUT")); } @@ -10752,14 +10786,14 @@ void generateOutput() msg("Generating Perl module output...\n"); generatePerlMod(); } - if (Config_getBool("GENERATE_HTML") && searchEngine && serverBasedSearch) + if (generateHtml && searchEngine && serverBasedSearch) { msg("Generating search index\n"); HtmlGenerator::writeSearchPage(); Doxygen::searchIndex->write(Config_getString("HTML_OUTPUT")+"/search/search.idx"); } - if (Config_getBool("GENERATE_RTF")) + if (generateRtf) { msg("Combining RTF output...\n"); if (!RTFGenerator::preProcessFileInplace(Config_getString("RTF_OUTPUT"),"refman.rtf")) @@ -10773,7 +10807,7 @@ void generateOutput() DotManager::instance()->run(); } - if (Config_getBool("GENERATE_HTML") && + if (generateHtml && Config_getBool("GENERATE_HTMLHELP") && !Config_getString("HHC_LOCATION").isEmpty()) { @@ -10788,7 +10822,7 @@ void generateOutput() portable_sysTimerStop(); QDir::setCurrent(oldDir); } - if ( Config_getBool("GENERATE_HTML") && + if ( generateHtml && Config_getBool("GENERATE_QHP") && !Config_getString("QHG_LOCATION").isEmpty()) { diff --git a/src/doxygen.css b/src/doxygen.css index 6ce8bb9..9078ffa 100644 --- a/src/doxygen.css +++ b/src/doxygen.css @@ -1,9 +1,7 @@ /* The standard CSS for doxygen */ body, table, div, p, dl { - font-family: Lucida Grande, Verdana, Geneva, Arial, sans-serif; - font-size: 13px; - line-height: 1.3; + font: 400 14px/19px Roboto,sans-serif; } /* @group Heading Levels */ @@ -19,7 +17,14 @@ h1 { } h2 { - font-size: 120%; + border-bottom: 1px solid ##99; + color: ##44; + font-size: 150%; + font-weight: normal; + margin-top: 1.75em; + padding-top: 8px; + padding-bottom: 4px; + width: 100%; } h3 { @@ -418,7 +423,7 @@ table.memberdecls { padding: 0px; } -.memberdecls td { +.memberdecls td, .fieldtable tr { -webkit-transition-property: background-color, box-shadow; -webkit-transition-duration: 0.5s; -moz-transition-property: background-color, box-shadow; @@ -431,7 +436,7 @@ table.memberdecls { transition-duration: 0.5s; } -.memberdecls td.glow { +.memberdecls td.glow, .fieldtable tr.glow { background-color: cyan; box-shadow: 0 0 15px cyan; } @@ -451,7 +456,7 @@ table.memberdecls { } .memItemLeft, .memItemRight, .memTemplParams { - border-top: 1px solid ##cc; + border-bottom: 1px solid ##E2; } .memItemLeft, .memTemplItemLeft { @@ -691,6 +696,7 @@ div.directory { width: 100%; padding-left: 6px; padding-right: 6px; + padding-top: 3px; border-left: 1px solid rgba(0,0,0,0.05); } @@ -845,6 +851,7 @@ table.fieldtable { display:block; text-decoration: none; outline: none; + font-family: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif; } .navpath li.navelem a:hover @@ -903,7 +910,7 @@ div.header div.headertitle { - padding: 5px 5px 5px 7px; + padding: 5px 5px 5px 10px; } dl diff --git a/src/doxygen.md b/src/doxygen.md index 6931329..6ca351e 100644 --- a/src/doxygen.md +++ b/src/doxygen.md @@ -5,9 +5,11 @@ Introduction ------------ This page provides a high-level overview of the internals of doxygen, with -links to the relevant parts of the code. +links to the relevant parts of the code. This document is intended for +developers who want to work on doxygen. Users of doxygen are refered to the +[User Manual](http://www.doxygen.org/manual.html). -The generic starting point of the application is ofcource the main() function. +The generic starting point of the application is of cource the main() function. Configuration options --------------------- @@ -39,9 +41,21 @@ for each file. Each parser implements the abstract interface ParserInterface. If the parser indicates it needs preprocessing via ParserInterface::needsPreprocessing(), doxygen will call preprocessFile() -on the file before calling ParserInterface::parseInput(). +on the file. -The result of parsing is a tree of Entry objects +A second step is to convert multiline C++-style comments into C style comments +for easier processing later on. As side effect of this step also +aliases (ALIASES option) are resolved. The function that performs these +2 tasks is called convertCppComments(). + +*Note:* Alias resolution should better be done in a separate step as it is +now coupled to C/C++ code and does not work automatically for other languages! + +The third step is the actual language parsing and is done by calling +ParserInterface::parseInput() on the parser interface returned by +the ParserManager. + +The result of parsing is a tree of Entry objects. These Entry objects are wrapped in a EntryNav object and stored on disk using Entry::createNavigationIndex() on the root node of the tree. @@ -54,6 +68,36 @@ is split into multiple parts if needed. Some data that is later needed is extracted like section labels, xref items, and formulas. Also Markdown markup is processed using processMarkdown() during this pass. +Resolving relations +------------------- + +The Entry objects created and filled during parsing are stored on disk +(to keep memory needs low). The name, parent/child relation, and +location on disk of each Entry is stored as a tree of EntryNav nodes, which is +kept in memory. + +Doxygen does a number of tree walks over the EntryNav nodes in the tree to +build up the data structures needed to produce the output. + +The resulting data structures are all children of the generic base class +called Definition which holds all non-specific data for a symbol definition. + +Definition is an abstract base class. Concrete subclasses are +- ClassDef: for storing class/struct/union related data +- NamespaceDef: for storing namespace related data +- FileDef: for storing file related data +- DirDef: for storing directory related data + +For doxygen specific concepts the following subclasses are available +- GroupDef: for storing grouping related data +- PageDef: for storing page related data + +Finally the data for members of classes, namespaces, and files is stored is +the subclass MemberDef. + +Producing output +---------------- +TODO diff --git a/src/doxygen_css.h b/src/doxygen_css.h index 0c4f9c1..831887a 100644 --- a/src/doxygen_css.h +++ b/src/doxygen_css.h @@ -1,9 +1,7 @@ "/* The standard CSS for doxygen */\n" "\n" "body, table, div, p, dl {\n" -" font-family: Lucida Grande, Verdana, Geneva, Arial, sans-serif;\n" -" font-size: 13px;\n" -" line-height: 1.3;\n" +" font: 400 14px/19px Roboto,sans-serif;\n" "}\n" "\n" "/* @group Heading Levels */\n" @@ -19,7 +17,14 @@ "}\n" "\n" "h2 {\n" -" font-size: 120%;\n" +" border-bottom: 1px solid ##99;\n" +" color: ##44;\n" +" font-size: 150%;\n" +" font-weight: normal;\n" +" margin-top: 1.75em;\n" +" padding-top: 8px;\n" +" padding-bottom: 4px;\n" +" width: 100%;\n" "}\n" "\n" "h3 {\n" @@ -418,7 +423,7 @@ " padding: 0px;\n" "}\n" "\n" -".memberdecls td {\n" +".memberdecls td, .fieldtable tr {\n" " -webkit-transition-property: background-color, box-shadow;\n" " -webkit-transition-duration: 0.5s;\n" " -moz-transition-property: background-color, box-shadow;\n" @@ -431,7 +436,7 @@ " transition-duration: 0.5s;\n" "}\n" "\n" -".memberdecls td.glow {\n" +".memberdecls td.glow, .fieldtable tr.glow {\n" " background-color: cyan;\n" " box-shadow: 0 0 15px cyan;\n" "}\n" @@ -451,7 +456,7 @@ "}\n" "\n" ".memItemLeft, .memItemRight, .memTemplParams {\n" -" border-top: 1px solid ##cc;\n" +" border-bottom: 1px solid ##E2;\n" "}\n" "\n" ".memItemLeft, .memTemplItemLeft {\n" @@ -691,6 +696,7 @@ " width: 100%;\n" " padding-left: 6px;\n" " padding-right: 6px;\n" +" padding-top: 3px;\n" " border-left: 1px solid rgba(0,0,0,0.05);\n" "}\n" "\n" @@ -845,6 +851,7 @@ " display:block;\n" " text-decoration: none;\n" " outline: none;\n" +" font-family: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif;\n" "}\n" "\n" ".navpath li.navelem a:hover\n" @@ -903,7 +910,7 @@ "\n" "div.headertitle\n" "{\n" -" padding: 5px 5px 5px 7px;\n" +" padding: 5px 5px 5px 10px;\n" "}\n" "\n" "dl\n" diff --git a/src/entry.h b/src/entry.h index 9a39963..d881386 100644 --- a/src/entry.h +++ b/src/entry.h @@ -139,9 +139,10 @@ class Entry Assign = 0x00200000, Strong = 0x00400000, Weak = 0x00800000, - Composition = 0x01000000, - Aggregation = 0x02000000, - Association = 0x04000000 + Unretained = 0x01000000, + Composition = 0x02000000, + Aggregation = 0x04000000, + Association = 0x08000000 }; enum ClassSpecifier { diff --git a/src/filedef.cpp b/src/filedef.cpp index 674cc89..0566df6 100644 --- a/src/filedef.cpp +++ b/src/filedef.cpp @@ -171,9 +171,12 @@ void FileDef::writeDetailedDescription(OutputList &ol,const QCString &title) (Config_getBool("SOURCE_BROWSER") && getStartBodyLine()!=-1 && getBodyDef()) ) { - ol.writeRuler(); ol.pushGeneratorState(); - ol.disableAllBut(OutputGenerator::Html); + ol.disable(OutputGenerator::Html); + ol.writeRuler(); + ol.popGeneratorState(); + ol.pushGeneratorState(); + ol.disableAllBut(OutputGenerator::Html); ol.writeAnchor(0,"details"); ol.popGeneratorState(); ol.startGroupHeader(); @@ -492,7 +495,8 @@ void FileDef::writeSummaryLinks(OutputList &ol) { LayoutDocEntrySection *ls = (LayoutDocEntrySection*)lde; QCString label = lde->kind()==LayoutDocEntry::FileClasses ? "nested-classes" : "namespaces"; - writeSummaryLink(ol,label,ls->title,first); + ol.writeSummaryLink(0,label,ls->title,first); + first=FALSE; } else if (lde->kind()==LayoutDocEntry::MemberDecl) { @@ -500,7 +504,8 @@ void FileDef::writeSummaryLinks(OutputList &ol) MemberList * ml = getMemberList(lmd->type); if (ml && ml->declVisible()) { - writeSummaryLink(ol,ml->listTypeAsString(),lmd->title,first); + ol.writeSummaryLink(0,ml->listTypeAsString(),lmd->title,first); + first=FALSE; } } } @@ -794,10 +799,13 @@ void FileDef::writeSource(OutputList &ol) ol.disable(OutputGenerator::RTF); if (!latexSourceCode) ol.disable(OutputGenerator::Latex); + bool isDocFile = isDocumentationFile(); + bool genSourceFile = !isDocFile && generateSourceFile(); if (getDirDef()) { startFile(ol,getSourceFileBase(),0,pageTitle,HLI_FileVisible, - !generateTreeView,getOutputFileBase()); + !generateTreeView, + !isDocFile && genSourceFile ? 0 : getOutputFileBase()); if (!generateTreeView) { getDirDef()->writeNavigationPath(ol); @@ -809,8 +817,8 @@ void FileDef::writeSource(OutputList &ol) } else { - startFile(ol,getSourceFileBase(),0,pageTitle,HLI_FileVisible, - FALSE,getOutputFileBase()); + startFile(ol,getSourceFileBase(),0,pageTitle,HLI_FileVisible,FALSE, + !isDocFile && genSourceFile ? 0 : getOutputFileBase()); startTitle(ol,getSourceFileBase()); ol.parseText(title); endTitle(ol,getSourceFileBase(),0); diff --git a/src/fortrancode.l b/src/fortrancode.l index d8c788e..f21d8b6 100644 --- a/src/fortrancode.l +++ b/src/fortrancode.l @@ -672,11 +672,12 @@ CHAR (CHARACTER{ARGS}?|CHARACTER{BS}"*"({BS}[0-9]+|{ARGS})) TYPE_SPEC (({NUM_TYPE}({BS}"*"{BS}[0-9]+)?)|({NUM_TYPE}{KIND})|DOUBLE{BS_}COMPLEX|DOUBLE{BS_}PRECISION|{CHAR}) INTENT_SPEC intent{BS}"("{BS}(in|out|in{BS}out){BS}")" -ATTR_SPEC (ALLOCATABLE|DIMENSION{ARGS}|EXTERNAL|{INTENT_SPEC}|INTRINSIC|OPTIONAL|PARAMETER|POINTER|PRIVATE|PUBLIC|SAVE|TARGET|RECURSIVE|PURE|ELEMENTAL) +ATTR_SPEC (IMPLICIT|ALLOCATABLE|DIMENSION{ARGS}|EXTERNAL|{INTENT_SPEC}|INTRINSIC|OPTIONAL|PARAMETER|POINTER|PRIVATE|PUBLIC|SAVE|TARGET|RECURSIVE|PURE|ELEMENTAL) ACCESS_SPEC (PRIVATE|PUBLIC) /* Assume that attribute statements are almost the same as attributes. */ ATTR_STMT {ATTR_SPEC}|DIMENSION -COMMANDS (DO|SELECT|CASE|WHERE|IF|THEN|ELSE|MODULE{BS_}PROCEDURE|CONTAINS|IMPLICIT{BS}NONE|CONTAINS|WRITE|READ|ALLOCATE|ALLOCATED|ASSOCIATED|DEALLOCATE|SIZE|END{BS}IF|END{BS}DO|WHILE|INQUIRE|OPEN|CLOSE|DATA) +FLOW (DO|SELECT|CASE|WHERE|IF|THEN|ELSE|WHILE|FORALL|ELSEWHERE|ELSEIF|RETURN|CONTINUE|EXIT) +COMMANDS (FORMAT|CONTAINS|MODULE{BS_}PROCEDURE|WRITE|READ|ALLOCATE|ALLOCATED|ASSOCIATED|DEALLOCATE|SIZE|INQUIRE|OPEN|CLOSE|DATA|COMMON) IGNORE (CALL) PREFIX (RECURSIVE{BS_}|PURE{BS_}|ELEMENTAL{BS_}){0,2}(RECURSIVE|PURE|ELEMENTAL)? @@ -713,21 +714,32 @@ PREFIX (RECURSIVE{BS_}|PURE{BS_}|ELEMENTAL{BS_}){0,2}(RECURSIVE|PURE|ELEMENTA } /*-------- inner construct ---------------------------------------------------*/ -<Start>{COMMANDS}/[,( \t\n].* { // hightlight rest of fortran statements +<Start>{COMMANDS}/[,( \t\n].* { // highlight /* font class is defined e.g. in doxygen.css */ startFontClass("keyword"); codifyLines(yytext); endFontClass(); } -<Start>"end"({BS_}{COMMANDS})?/[ \t\n] { - startFontClass("keyword"); +<Start>{FLOW}/[,( \t\n].* { + /* font class is defined e.g. in doxygen.css */ + startFontClass("keywordflow"); + codifyLines(yytext); + endFontClass(); + } +<Start>"end"({BS}{FLOW})?/[ \t\n] { // list is a bit long as not all have possible end + startFontClass("keywordflow"); codifyLines(yytext); endFontClass(); } +<Start>"implicit"{BS}"none" { + startFontClass("keywordtype"); + codifyLines(yytext); + endFontClass(); + } /*-------- use statement -------------------------------------------*/ <Start>"use"{BS_} { - startFontClass("keyword"); + startFontClass("keywordtype"); codifyLines(yytext); endFontClass(); yy_push_state(YY_START); @@ -750,7 +762,9 @@ PREFIX (RECURSIVE{BS_}|PURE{BS_}|ELEMENTAL{BS_}){0,2}(RECURSIVE|PURE|ELEMENTA addUse(tmp); } <Use>,{BS}"ONLY" { // TODO: rename + startFontClass("keywordtype"); codifyLines(yytext); + endFontClass(); yy_push_state(YY_START); BEGIN(UseOnly); } @@ -815,7 +829,7 @@ PREFIX (RECURSIVE{BS_}|PURE{BS_}|ELEMENTAL{BS_}){0,2}(RECURSIVE|PURE|ELEMENTA <Subprog,Subprogend>"\n" { codifyLines(yytext); yy_pop_state(); } -<Start>^{BS}"end"{BS}({SUBPROG}|"module"|"program"|"type"|"interface"){BS} { // Fortran subroutine or function ends +<Start>^{BS}"end"{BS}("block"{BS}"data"|{SUBPROG}|"module"|"program"|"type"|"interface"){BS} { // Fortran subroutine or function ends //cout << "===> end function " << yytext << endl; endScope(); startFontClass("keyword"); @@ -828,7 +842,7 @@ PREFIX (RECURSIVE{BS_}|PURE{BS_}|ELEMENTAL{BS_}){0,2}(RECURSIVE|PURE|ELEMENTA generateLink(*g_code,yytext); yy_pop_state(); } -<Start>^{BS}"end"{BS}({SUBPROG}|"module"|"program"|"type"|"interface"){BS}/(\n|!) { // Fortran subroutine or function ends +<Start>^{BS}"end"{BS}("block"{BS}"data"|{SUBPROG}|"module"|"program"|"type"|"interface"){BS}/(\n|!) { // Fortran subroutine or function ends //cout << "===> end function " << yytext << endl; endScope(); startFontClass("keyword"); diff --git a/src/fortranscanner.l b/src/fortranscanner.l index 0eb62a1..a5902a8 100644 --- a/src/fortranscanner.l +++ b/src/fortranscanner.l @@ -1028,6 +1028,20 @@ private { startCommentBlock(TRUE); yy_push_state(DocBackLine); } + else + { + /* handle out of place !< comment as a normal comment */ + if (YY_START == String) { yyColNr -= yyleng; REJECT; } // "!" is ignored in strings + // skip comment line (without docu comments "!>" "!<" ) + /* ignore further "!" and ignore comments in Strings */ + if ((YY_START != StrIgnore) && (YY_START != String)) + { + yy_push_state(YY_START); + BEGIN(StrIgnore); + debugStr="*!"; + //fprintf(stderr,"start comment %d\n",yyLineNr); + } + } } <DocBackLine>.* { // contents of current comment line docBlock+=yytext; diff --git a/src/ftvhelp.cpp b/src/ftvhelp.cpp index c180c4e..76f31ab 100644 --- a/src/ftvhelp.cpp +++ b/src/ftvhelp.cpp @@ -739,7 +739,7 @@ void FTVHelp::addContentsItem(bool isDir, } -static QCString node2URL(FTVNode *n) +static QCString node2URL(FTVNode *n,bool overruleFile=FALSE,bool srcLink=FALSE) { QCString url = n->file; if (!url.isEmpty() && url.at(0)=='!') // relative URL @@ -753,6 +753,18 @@ static QCString node2URL(FTVNode *n) } else // local file (with optional anchor) { + if (overruleFile && n->def && n->def->definitionType()==Definition::TypeFile) + { + FileDef *fd = (FileDef*)n->def; + if (srcLink) + { + url = fd->getSourceFileBase(); + } + else + { + url = fd->getOutputFileBase(); + } + } url+=Doxygen::htmlFileExtension; if (!n->anchor.isEmpty()) url+="#"+n->anchor; } @@ -1085,7 +1097,24 @@ static bool generateJSTree(NavIndexEntryList &navIndex,FTextStream &t, if (n->addToNavIndex) // add entry to the navigation index { - navIndex.append(new NavIndexEntry(node2URL(n),pathToNode(n,n))); + if (n->def && n->def->definitionType()==Definition::TypeFile) + { + FileDef *fd = (FileDef*)n->def; + bool doc,src; + doc = fileVisibleInIndex(fd,src); + if (doc) + { + navIndex.append(new NavIndexEntry(node2URL(n,TRUE,FALSE),pathToNode(n,n))); + } + if (src) + { + navIndex.append(new NavIndexEntry(node2URL(n,TRUE,TRUE),pathToNode(n,n))); + } + } + else + { + navIndex.append(new NavIndexEntry(node2URL(n),pathToNode(n,n))); + } } if (n->separateIndex) // store items in a separate file for dynamic loading @@ -1191,15 +1220,24 @@ static void generateJSNavTree(const QList<FTVNode> &nodeList) tsidx << "{" << endl; QListIterator<NavIndexEntry> li(navIndex); NavIndexEntry *e; + bool first=TRUE; for (li.toFirst();(e=li.current());) // for each entry { if (elemCount==0) { - t << "\"" << e->url << "\"," << endl; + if (!first) + { + t << "," << endl; + } + else + { + first=FALSE; + } + t << "\"" << e->url << "\""; } tsidx << "\"" << e->url << "\":[" << e->path << "]"; ++li; - if (li.current()) tsidx << ","; // not last entry + if (li.current() && elemCount<maxElemCount-1) tsidx << ","; // not last entry tsidx << endl; elemCount++; @@ -1217,7 +1255,7 @@ static void generateJSNavTree(const QList<FTVNode> &nodeList) } } tsidx << "};" << endl; - t << "];" << endl; + t << endl << "];" << endl; } t << endl << navtree_script; } diff --git a/src/ftvhelp.h b/src/ftvhelp.h index 8f24b3d..d28b506 100644 --- a/src/ftvhelp.h +++ b/src/ftvhelp.h @@ -50,9 +50,9 @@ class FTVHelp : public IndexIntf const char *ref, const char *file, const char *anchor, - bool separateIndex=FALSE, - bool addToNavIndex=FALSE, - Definition *def=0); + bool separateIndex, + bool addToNavIndex, + Definition *def); void addIndexItem(Definition *,MemberDef *,const char *) {} void addIndexFile(const char *) {} void addImageFile(const char *) {} diff --git a/src/groupdef.cpp b/src/groupdef.cpp index 77b706b..910d2b5 100644 --- a/src/groupdef.cpp +++ b/src/groupdef.cpp @@ -547,9 +547,12 @@ void GroupDef::writeDetailedDescription(OutputList &ol,const QCString &title) { if (pageDict->count()!=countMembers()) // not only pages -> classical layout { - ol.writeRuler(); ol.pushGeneratorState(); - ol.disableAllBut(OutputGenerator::Html); + ol.disable(OutputGenerator::Html); + ol.writeRuler(); + ol.popGeneratorState(); + ol.pushGeneratorState(); + ol.disableAllBut(OutputGenerator::Html); ol.writeAnchor(0,"details"); ol.popGeneratorState(); ol.startGroupHeader(); @@ -883,7 +886,8 @@ void GroupDef::writeSummaryLinks(OutputList &ol) lde->kind()==LayoutDocEntry::GroupFiles ? "files" : lde->kind()==LayoutDocEntry::GroupNestedGroups ? "groups" : "dirs"; - writeSummaryLink(ol,label,ls->title,first); + ol.writeSummaryLink(0,label,ls->title,first); + first=FALSE; } else if (lde->kind()==LayoutDocEntry::MemberDecl) { @@ -891,7 +895,8 @@ void GroupDef::writeSummaryLinks(OutputList &ol) MemberList * ml = getMemberList(lmd->type); if (ml && ml->declVisible()) { - writeSummaryLink(ol,ml->listTypeAsString(),lmd->title,first); + ol.writeSummaryLink(0,ml->listTypeAsString(),lmd->title,first); + first=FALSE; } } } diff --git a/src/htmldocvisitor.cpp b/src/htmldocvisitor.cpp index e048858..4fa613d 100644 --- a/src/htmldocvisitor.cpp +++ b/src/htmldocvisitor.cpp @@ -173,40 +173,108 @@ void HtmlDocVisitor::visit(DocSymbol *s) if (m_hide) return; switch(s->symbol()) { - case DocSymbol::BSlash: m_t << "\\"; break; - case DocSymbol::At: m_t << "@"; break; - case DocSymbol::Less: m_t << "<"; break; - case DocSymbol::Greater: m_t << ">"; break; - case DocSymbol::Amp: m_t << "&"; break; - case DocSymbol::Dollar: m_t << "$"; break; - case DocSymbol::Hash: m_t << "#"; break; - case DocSymbol::DoubleColon: m_t << "::"; break; - case DocSymbol::Percent: m_t << "%"; break; - case DocSymbol::Copy: m_t << "©"; break; - case DocSymbol::Tm: m_t << "™"; break; - case DocSymbol::Reg: m_t << "®"; break; - case DocSymbol::Apos: m_t << "'"; break; - case DocSymbol::Quot: m_t << "\""; break; - case DocSymbol::Lsquo: m_t << "‘"; break; - case DocSymbol::Rsquo: m_t << "’"; break; - case DocSymbol::Ldquo: m_t << "“"; break; - case DocSymbol::Rdquo: m_t << "”"; break; - case DocSymbol::Ndash: m_t << "–"; break; - case DocSymbol::Mdash: m_t << "—"; break; - case DocSymbol::Uml: m_t << "&" << s->letter() << "uml;"; break; - case DocSymbol::Acute: m_t << "&" << s->letter() << "acute;"; break; - case DocSymbol::Grave: m_t << "&" << s->letter() << "grave;"; break; - case DocSymbol::Circ: m_t << "&" << s->letter() << "circ;"; break; - case DocSymbol::Slash: m_t << "&" << s->letter() << "slash;"; break; - case DocSymbol::Tilde: m_t << "&" << s->letter() << "tilde;"; break; - case DocSymbol::Szlig: m_t << "ß"; break; - case DocSymbol::Cedil: m_t << "&" << s->letter() << "cedil;"; break; - case DocSymbol::Ring: m_t << "&" << s->letter() << "ring;"; break; - case DocSymbol::Nbsp: m_t << " "; break; - case DocSymbol::AElig: m_t << "Æ"; break; - case DocSymbol::Aelig: m_t << "æ"; break; + case DocSymbol::BSlash: m_t << "\\"; break; + case DocSymbol::At: m_t << "@"; break; + case DocSymbol::Less: m_t << "<"; break; + case DocSymbol::Greater: m_t << ">"; break; + case DocSymbol::Amp: m_t << "&"; break; + case DocSymbol::Dollar: m_t << "$"; break; + case DocSymbol::Hash: m_t << "#"; break; + case DocSymbol::DoubleColon: m_t << "::"; break; + case DocSymbol::Percent: m_t << "%"; break; + case DocSymbol::Pipe: m_t << "|"; break; + case DocSymbol::Copy: m_t << "©"; break; + case DocSymbol::Tm: m_t << "™"; break; + case DocSymbol::Reg: m_t << "®"; break; + case DocSymbol::Apos: m_t << "'"; break; + case DocSymbol::Quot: m_t << "\""; break; + case DocSymbol::Lsquo: m_t << "‘"; break; + case DocSymbol::Rsquo: m_t << "’"; break; + case DocSymbol::Ldquo: m_t << "“"; break; + case DocSymbol::Rdquo: m_t << "”"; break; + case DocSymbol::Ndash: m_t << "–"; break; + case DocSymbol::Mdash: m_t << "—"; break; + case DocSymbol::Uml: m_t << "&" << s->letter() << "uml;"; break; + case DocSymbol::Acute: m_t << "&" << s->letter() << "acute;"; break; + case DocSymbol::Grave: m_t << "&" << s->letter() << "grave;"; break; + case DocSymbol::Circ: m_t << "&" << s->letter() << "circ;"; break; + case DocSymbol::Slash: m_t << "&" << s->letter() << "slash;"; break; + case DocSymbol::Tilde: m_t << "&" << s->letter() << "tilde;"; break; + case DocSymbol::Szlig: m_t << "ß"; break; + case DocSymbol::Cedil: m_t << "&" << s->letter() << "cedil;"; break; + case DocSymbol::Ring: m_t << "&" << s->letter() << "ring;"; break; + case DocSymbol::Nbsp: m_t << " "; break; + case DocSymbol::AElig: m_t << "Æ"; break; + case DocSymbol::Aelig: m_t << "æ"; break; + case DocSymbol::GrkGamma: m_t << "Γ"; break; + case DocSymbol::GrkDelta: m_t << "Δ"; break; + case DocSymbol::GrkTheta: m_t << "Θ"; break; + case DocSymbol::GrkLambda: m_t << "Λ"; break; + case DocSymbol::GrkXi: m_t << "Ξ"; break; + case DocSymbol::GrkPi: m_t << "Π"; break; + case DocSymbol::GrkSigma: m_t << "Σ"; break; + case DocSymbol::GrkUpsilon: m_t << "Υ"; break; + case DocSymbol::GrkPhi: m_t << "Φ"; break; + case DocSymbol::GrkPsi: m_t << "Ψ"; break; + case DocSymbol::GrkOmega: m_t << "Ω"; break; + case DocSymbol::Grkalpha: m_t << "α"; break; + case DocSymbol::Grkbeta: m_t << "β"; break; + case DocSymbol::Grkgamma: m_t << "γ"; break; + case DocSymbol::Grkdelta: m_t << "δ"; break; + case DocSymbol::Grkepsilon: m_t << "ε"; break; + case DocSymbol::Grkzeta: m_t << "ζ"; break; + case DocSymbol::Grketa: m_t << "η"; break; + case DocSymbol::Grktheta: m_t << "θ"; break; + case DocSymbol::Grkiota: m_t << "ι"; break; + case DocSymbol::Grkkappa: m_t << "κ"; break; + case DocSymbol::Grklambda: m_t << "λ"; break; + case DocSymbol::Grkmu: m_t << "μ"; break; + case DocSymbol::Grknu: m_t << "ν"; break; + case DocSymbol::Grkxi: m_t << "ξ"; break; + case DocSymbol::Grkpi: m_t << "π"; break; + case DocSymbol::Grkrho: m_t << "ρ"; break; + case DocSymbol::Grksigma: m_t << "σ"; break; + case DocSymbol::Grktau: m_t << "τ"; break; + case DocSymbol::Grkupsilon: m_t << "υ"; break; + case DocSymbol::Grkphi: m_t << "φ"; break; + case DocSymbol::Grkchi: m_t << "χ"; break; + case DocSymbol::Grkpsi: m_t << "ψ"; break; + case DocSymbol::Grkomega: m_t << "ω"; break; + case DocSymbol::Grkvarsigma: m_t << "ς"; break; + case DocSymbol::Section: m_t << "§"; break; + case DocSymbol::Degree: m_t << "°"; break; + case DocSymbol::Prime: m_t << "′"; break; + case DocSymbol::DoublePrime: m_t << "″"; break; + case DocSymbol::Infinity: m_t << "∞"; break; + case DocSymbol::EmptySet: m_t << "∅"; break; + case DocSymbol::PlusMinus: m_t << "±"; break; + case DocSymbol::Times: m_t << "×"; break; + case DocSymbol::Minus: m_t << "−"; break; + case DocSymbol::CenterDot: m_t << "⋅"; break; + case DocSymbol::Partial: m_t << "∂"; break; + case DocSymbol::Nabla: m_t << "∇"; break; + case DocSymbol::SquareRoot: m_t << "√"; break; + case DocSymbol::Perpendicular: m_t << "⊥"; break; + case DocSymbol::Sum: m_t << "∑"; break; + case DocSymbol::Integral: m_t << "∫"; break; + case DocSymbol::Product: m_t << "∏"; break; + case DocSymbol::Similar: m_t << "∼"; break; + case DocSymbol::Approx: m_t << "≈"; break; + case DocSymbol::NotEqual: m_t << "≠"; break; + case DocSymbol::Equivalent: m_t << "≡"; break; + case DocSymbol::Proportional: m_t << "∝"; break; + case DocSymbol::LessEqual: m_t << "≤"; break; + case DocSymbol::GreaterEqual: m_t << "≥"; break; + case DocSymbol::LeftArrow: m_t << "←"; break; + case DocSymbol::RightArrow: m_t << "→"; break; + case DocSymbol::SetIn: m_t << "∈"; break; + case DocSymbol::SetNotIn: m_t << "∉"; break; + case DocSymbol::LeftCeil: m_t << "⌈"; break; + case DocSymbol::RightCeil: m_t << "⌉"; break; + case DocSymbol::LeftFloor: m_t << "⌊"; break; + case DocSymbol::RightFloor: m_t << "⌋"; break; default: - err("error: unknown symbol found\n"); + err("error: unknown symbol found\n"); } } @@ -1000,7 +1068,7 @@ void HtmlDocVisitor::visitPre(DocSimpleSect *s) // special case 1: user defined title if (s->type()!=DocSimpleSect::User && s->type()!=DocSimpleSect::Rcs) { - m_t << ":</dt><dd>"; + m_t << "</dt><dd>"; } } @@ -1482,7 +1550,7 @@ void HtmlDocVisitor::visitPre(DocParamSect *s) ASSERT(0); } m_t << "<dl class=\"" << className << "\"><dt>"; - m_t << heading << ":"; + m_t << heading; m_t << "</dt><dd>" << endl; m_t << " <table class=\"" << className << "\">" << endl; } diff --git a/src/htmlgen.cpp b/src/htmlgen.cpp index 6cf31ad..e475263 100644 --- a/src/htmlgen.cpp +++ b/src/htmlgen.cpp @@ -649,6 +649,89 @@ static unsigned char bdwn_a_png[7*8] = 0, 0,128,255,128, 0, 0, }; +static unsigned char sync_on_png[576] = +{ + 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, + 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, + 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, + 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, + 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, + 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, + 128,128,128,128,128,128,128,128,128,138,128,128,128,128,133,128,128,128,128,128,128,128,128,128, + 128,128,128,128,128,128,128,129,205,186,128,128,128,128,160,210,134,128,128,128,128,128,128,128, + 128,128,128,128,128,128,139,217,255,181,128,128,128,128,152,255,229,147,128,128,128,128,128,128, + 128,128,128,128,128,156,236,255,255,181,128,128,128,128,152,255,255,243,164,128,128,128,128,128, + 128,128,128,128,175,249,255,255,255,223,196,198,198,197,211,255,255,255,253,186,128,128,128,128, + 128,128,133,202,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,214,137,128,128, + 128,128,135,217,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,225,140,128,128, + 128,128,128,128,189,255,255,255,255,238,224,225,225,224,232,255,255,255,255,201,131,128,128,128, + 128,128,128,128,128,167,245,255,255,183,128,128,128,128,155,255,255,250,179,128,128,128,128,128, + 128,128,128,128,128,128,150,231,255,188,128,128,128,128,161,255,238,158,128,128,128,128,128,128, + 128,128,128,128,128,128,128,136,216,188,128,128,128,128,161,223,142,128,128,128,128,128,128,128, + 128,128,128,128,128,128,128,128,130,141,128,128,128,128,135,132,128,128,128,128,128,128,128,128, + 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, + 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, + 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, + 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, + 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, + 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128 +}; + +static unsigned char sync_off_png[576] = +{ + 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, + 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, + 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, + 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, + 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, + 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, + 128,128,128,128,128,128,128,128,138,128,128,128,128,128,128,133,128,128,128,128,128,128,128,128, + 128,128,128,128,128,128,129,205,186,128,128,128,128,128,128,160,210,134,128,128,128,128,128,128, + 128,128,128,128,128,139,217,255,181,128,128,128,128,128,128,152,255,229,147,128,128,128,128,128, + 128,128,128,128,156,236,255,255,181,128,128,128,128,128,128,152,255,255,243,164,128,128,128,128, + 128,128,128,175,249,255,255,255,223,196,198,198,128,128,197,211,255,255,255,253,186,128,128,128, + 128,128,202,255,255,255,255,255,255,255,255,225,128,128,255,255,255,255,255,255,255,214,128,128, + 128,128,217,255,255,255,255,255,255,255,255,128,128,198,255,255,255,255,255,255,255,225,128,128, + 128,128,128,189,255,255,255,255,238,224,225,128,128,225,224,232,255,255,255,255,201,128,128,128, + 128,128,128,128,167,245,255,255,183,128,128,128,128,128,128,155,255,255,250,179,128,128,128,128, + 128,128,128,128,128,150,231,255,188,128,128,128,128,128,128,161,255,238,158,128,128,128,128,128, + 128,128,128,128,128,128,136,216,188,128,128,128,128,128,128,161,223,142,128,128,128,128,128,128, + 128,128,128,128,128,128,128,130,141,128,128,128,128,128,128,135,132,128,128,128,128,128,128,128, + 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, + 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, + 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, + 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, + 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, + 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128 +}; + +static unsigned char sync_a_png[576] = +{ + 0, 0, 0, 0, 0, 0, 0, 29, 98,157,207,231,234,211,164,104, 38, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 21,143,234,255,255,255,255,255,255,255,255,244,155, 33, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 70,221,255,255,255,255,255,255,255,255,255,255,255,255,235, 93, 0, 0, 0, 0, + 0, 0, 0, 92,251,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,116, 0, 0, 0, + 0, 0, 68,251,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 96, 0, 0, + 0, 20,225,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,243, 41, 0, + 0,143,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,172, 1, + 28,238,255,255,255,255,255,253,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 42, + 99,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,133, + 160,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,204, + 212,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,224, + 234,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,237,255,236, + 235,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,230,255,236, + 216,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,226, + 168,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,208, + 107,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,147, + 39,245,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 53, + 0,159,255,255,255,255,255,255,251,255,255,255,255,255,255,255,255,255,255,255,255,255,190, 3, + 0, 31,239,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,249, 54, 0, + 0, 0, 91,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,119, 0, 0, + 0, 0, 0,116,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,145, 0, 0, 0, + 0, 0, 0, 0, 98,240,255,255,255,255,255,255,255,255,255,255,255,255,248,119, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 45,168,252,255,255,255,255,255,255,255,255,255,184, 58, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 45,131,201,222,234,236,224,204,142, 54, 0, 0, 0, 0, 0, 0, 0 +}; //------------------------------------------------------------------------ @@ -659,6 +742,7 @@ static const char tabs_css[] = " width: 100%;\n" " z-index: 101;\n" " font-size: 13px;\n" +" font-family: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif;\n" "}\n" "\n" ".tabs2 {\n" @@ -757,6 +841,8 @@ static ColoredImgDataItem colored_tab_data[] = { "closed.png", 9, 9, closed_png, closed_a_png }, { "open.png", 9, 9, open_png, open_a_png }, { "bdwn.png", 7, 8, bdwn_png, bdwn_a_png }, + { "sync_on.png", 24, 24, sync_on_png, sync_a_png }, + { "sync_off.png",24, 24, sync_off_png, sync_a_png }, { 0, 0, 0, 0, 0 } }; @@ -2700,6 +2786,7 @@ QCString HtmlGenerator::writeSplitBarAsString(const char *name,const char *relpa "<div id=\"side-nav\" class=\"ui-resizable side-nav-resizable\">\n" " <div id=\"nav-tree\">\n" " <div id=\"nav-tree-contents\">\n" + " <div id=\"nav-sync\" class=\"sync\"></div>\n" " </div>\n" " </div>\n" " <div id=\"splitbar\" style=\"-moz-user-select:none;\" \n" @@ -3055,6 +3142,10 @@ void HtmlGenerator::writeInheritedSectionTitle( { classLink+= externalLinkTarget() + externalRef(relPath,ref,TRUE); } + else + { + classLink+=relPath; + } classLink+=file+Doxygen::htmlFileExtension+a; classLink+=QCString("\">")+name+"</a>"; t << "<tr class=\"inherit_header " << id << "\">" @@ -3109,5 +3200,30 @@ void HtmlGenerator::writeLineNumber(const char *ref,const char *filename, t << " "; } +void HtmlGenerator::writeSummaryLink(const char *file,const char *anchor,const char *title,bool first) +{ + if (first) + { + t << " <div class=\"summary\">\n"; + } + else + { + t << " |\n"; + } + t << "<a href=\""; + if (file) + { + t << relPath << file; + t << Doxygen::htmlFileExtension; + } + else + { + t << "#"; + t << anchor; + } + t << "\">"; + t << title; + t << "</a>"; +} diff --git a/src/htmlgen.h b/src/htmlgen.h index 83599f4..9680372 100644 --- a/src/htmlgen.h +++ b/src/htmlgen.h @@ -205,6 +205,7 @@ class HtmlGenerator : public OutputGenerator void writeNavigationPath(const char *s); void writeLogo(); void writeQuickLinks(bool compact,HighlightedItem hli,const char *file); + void writeSummaryLink(const char *file,const char *anchor,const char *title,bool first); void startContents(); void endContents(); void writeNonBreakableSpace(int); diff --git a/src/index.cpp b/src/index.cpp index b2301a2..8fd476f 100644 --- a/src/index.cpp +++ b/src/index.cpp @@ -297,7 +297,8 @@ void addMembersToIndex(T *def,LayoutDocManager::LayoutPart part, Doxygen::indexList.addContentsItem(hasMembers,name, def->getReference(),def->getOutputFileBase(),anchor, hasMembers && !preventSeparateIndex, - addToIndex); + addToIndex, + def); int numClasses=0; ClassSDict *classes = def->getClassSDict(); if (classes) @@ -329,7 +330,8 @@ void addMembersToIndex(T *def,LayoutDocManager::LayoutPart part, { LockingPtr<MemberList> enumList = md->enumFieldList(); bool isDir = enumList!=0 && md->isEnumerate(); - if (md->name().find('@')==-1) + bool isAnonymous = md->name().find('@')!=-1; + if (!isAnonymous) { if (md->getOuterScope()==def) { @@ -344,7 +346,10 @@ void addMembersToIndex(T *def,LayoutDocManager::LayoutPart part, } if (isDir) { - Doxygen::indexList.incContentsDepth(); + if (!isAnonymous) + { + Doxygen::indexList.incContentsDepth(); + } MemberListIterator emli(*enumList); MemberDef *emd; for (emli.toFirst();(emd=emli.current());++emli) @@ -360,7 +365,10 @@ void addMembersToIndex(T *def,LayoutDocManager::LayoutPart part, emd->name(),def->getReference(),def->getOutputFileBase(),emd->anchor(),FALSE,addToIndex); } } - Doxygen::indexList.decContentsDepth(); + if (!isAnonymous) + { + Doxygen::indexList.decContentsDepth(); + } } } } @@ -539,25 +547,43 @@ static void writeClassTree(OutputList &ol,BaseClassList *bcl,bool hideSuper,int //---------------------------------------------------------------------------- -static bool fileVisibleInIndex(FileDef *fd,bool &genSourceFile) +static bool classVisibleInIndex(ClassDef *cd) { static bool allExternals = Config_getBool("ALLEXTERNALS"); - //static bool fullPathNames = Config_getBool("FULL_PATH_NAMES"); - //DirDef *dd = fd->getDirDef(); - bool isDocFile = fd->isDocumentationFile(); - genSourceFile = !isDocFile && fd->generateSourceFile(); - return ( //(!fullPathNames || dd==0) && - ((allExternals && fd->isLinkable()) || - fd->isLinkableInProject() - ) && - !isDocFile - ); + return (allExternals && cd->isLinkable()) || cd->isLinkableInProject(); } -static bool classVisibleInIndex(ClassDef *cd) +//---------------------------------------------------------------------------- + +static bool dirHasVisibleChildren(DirDef *dd) { - static bool allExternals = Config_getBool("ALLEXTERNALS"); - return (allExternals && cd->isLinkable()) || cd->isLinkableInProject(); + if (dd->hasDocumentation()) return TRUE; + + QListIterator<FileDef> fli(*dd->getFiles()); + FileDef *fd; + for (fli.toFirst();(fd=fli.current());++fli) + { + bool genSourceFile; + if (fileVisibleInIndex(fd,genSourceFile)) + { + return TRUE; + } + if (genSourceFile) + { + return TRUE; + } + } + + QListIterator<DirDef> dli(dd->subDirs()); + DirDef *subdd; + for (dli.toFirst();(subdd=dli.current());++dli) + { + if (dirHasVisibleChildren(subdd)) + { + return TRUE; + } + } + return FALSE; } //---------------------------------------------------------------------------- @@ -572,6 +598,11 @@ static void writeDirTreeNode(OutputList &ol, DirDef *dd, int level, FTVHelp* ftv return; } + if (!dirHasVisibleChildren(dd)) + { + return; + } + static bool tocExpand = TRUE; //Config_getBool("TOC_EXPAND"); bool isDir = dd->subDirs().count()>0 || // there are subdirs (tocExpand && // or toc expand and @@ -621,8 +652,17 @@ static void writeDirTreeNode(OutputList &ol, DirDef *dd, int level, FTVHelp* ftv FileDef *fd=fileList->first(); while (fd) { - static bool allExternals = Config_getBool("ALLEXTERNALS"); - if ((allExternals && fd->isLinkable()) || fd->isLinkableInProject()) + //static bool allExternals = Config_getBool("ALLEXTERNALS"); + //if ((allExternals && fd->isLinkable()) || fd->isLinkableInProject()) + //{ + // fileCount++; + //} + bool genSourceFile; + if (fileVisibleInIndex(fd,genSourceFile)) + { + fileCount++; + } + else if (genSourceFile) { fileCount++; } @@ -650,7 +690,7 @@ static void writeDirTreeNode(OutputList &ol, DirDef *dd, int level, FTVHelp* ftv ol.parseText(fd->displayName()); ol.endIndexItem(reference,outputBase); ol.endIndexListItem(); - if (ftv && doc) + if (ftv && (src || doc)) { ftv->addContentsItem(FALSE, fd->displayName(), @@ -672,11 +712,19 @@ static void writeDirTreeNode(OutputList &ol, DirDef *dd, int level, FTVHelp* ftv FileDef *fd=fileList->first(); while (fd) { - static bool allExternals = Config_getBool("ALLEXTERNALS"); - if ((allExternals && fd->isLinkable()) || fd->isLinkableInProject()) + //static bool allExternals = Config_getBool("ALLEXTERNALS"); + //if ((allExternals && fd->isLinkable()) || fd->isLinkableInProject()) + bool doc,src; + doc = fileVisibleInIndex(fd,src); + if (doc) { - //Doxygen::indexList.addContentsItem(FALSE, convertToHtml(fd->name(),TRUE),fd->getReference(), fd->getOutputFileBase(), 0); - addMembersToIndex(fd,LayoutDocManager::File,fd->displayName(),QCString()); + addMembersToIndex(fd,LayoutDocManager::File,fd->displayName(),QCString(),TRUE); + } + else if (src) + { + Doxygen::indexList.addContentsItem( + FALSE, convertToHtml(fd->name(),TRUE), 0, + fd->getSourceFileBase(), 0, FALSE, TRUE, fd); } fd=fileList->next(); } @@ -725,24 +773,20 @@ static void writeDirHierarchy(OutputList &ol, FTVHelp* ftv,bool addToIndex) FileDef *fd; for (;(fd=fni.current());++fni) { - bool doc,src; - doc = fileVisibleInIndex(fd,src); - QCString reference,outputBase; - if (doc) - { - reference = fd->getReference(); - outputBase = fd->getOutputFileBase(); - } static bool fullPathNames = Config_getBool("FULL_PATH_NAMES"); - if ((!fullPathNames || fd->getDirDef()==0) && (doc || src)) + if (!fullPathNames || fd->getDirDef()==0) // top level file { - ftv->addContentsItem(FALSE,fd->displayName(), - reference, outputBase, 0, - FALSE,FALSE,fd); - if (addToIndex && doc) + bool doc,src; + doc = fileVisibleInIndex(fd,src); + if (doc) + { + addMembersToIndex(fd,LayoutDocManager::File,fd->displayName(),QCString(),TRUE); + } + else if (src) { - addMembersToIndex(fd,LayoutDocManager::File, - fd->displayName(),QCString()); + Doxygen::indexList.addContentsItem( + FALSE, convertToHtml(fd->name(),TRUE), 0, + fd->getSourceFileBase(), 0, FALSE, TRUE, fd); } } } @@ -1055,6 +1099,7 @@ static void writeFileIndex(OutputList &ol) ol.pushGeneratorState(); ol.disable(OutputGenerator::Man); if (documentedFiles==0) ol.disableAllBut(OutputGenerator::Html); + LayoutNavEntry *lne = LayoutDocManager::instance().rootNavEntry()->find(LayoutNavEntry::FileList); if (lne==0) lne = LayoutDocManager::instance().rootNavEntry()->find(LayoutNavEntry::Files); // fall back QCString title = lne ? lne->title() : theTranslator->trFileList(); @@ -1334,6 +1379,39 @@ void writeClassTree(ClassSDict *clDict,FTVHelp *ftv,bool addToIndex,bool globalO } } +static bool containsVisibleChild(NamespaceDef *nd,bool includeClasses) +{ + if (nd->getNamespaceSDict()) + { + NamespaceSDict::Iterator cnli(*nd->getNamespaceSDict()); + NamespaceDef *cnd; + for (cnli.toFirst();(cnd=cnli.current());++cnli) + { + if (cnd->isLinkable() && cnd->localName().find('@')!=-1) + { + return TRUE; + } + else if (containsVisibleChild(cnd,includeClasses)) + { + return TRUE; + } + } + } + if (includeClasses && nd->getClassSDict()) + { + ClassSDict::Iterator cli(*nd->getClassSDict()); + ClassDef *cd; + for (;(cd=cli.current());++cli) + { + if (cd->isLinkableInProject() && cd->templateMaster()==0) + { + return TRUE; + } + } + } + return FALSE; +} + static void writeNamespaceTree(NamespaceSDict *nsDict,FTVHelp *ftv, bool rootOnly,bool showClasses,bool addToIndex) { @@ -1343,40 +1421,11 @@ static void writeNamespaceTree(NamespaceSDict *nsDict,FTVHelp *ftv, NamespaceDef *nd; for (nli.toFirst();(nd=nli.current());++nli) { - if (/*nd->isLinkableInProject() && */ + if (nd->localName().find('@')==-1 && (!rootOnly || nd->getOuterScope()==Doxygen::globalScope)) { - int count=0; - if (nd->getNamespaceSDict()) - { - NamespaceSDict::Iterator cnli(*nd->getNamespaceSDict()); - NamespaceDef *cnd; - for (cnli.toFirst();(cnd=cnli.current());++cnli) - { - if (cnd->isLinkable()) - { - count++; - } - } - } - int classCount=0; - if (nd->getClassSDict()) - { - ClassSDict::Iterator cli(*nd->getClassSDict()); - ClassDef *cd; - for (;(cd=cli.current());++cli) - { - if (cd->isLinkableInProject() && cd->templateMaster()==0) - { - classCount++; - } - } - } - if (showClasses) - { - count+=classCount; - } + bool hasChildren = containsVisibleChild(nd,showClasses); QCString ref; QCString file; @@ -1390,27 +1439,30 @@ static void writeNamespaceTree(NamespaceSDict *nsDict,FTVHelp *ftv, } } - ftv->addContentsItem(count>0,nd->localName(),ref,file,0,FALSE,TRUE,nd); - - if (addToIndex) + if (nd->isLinkable() || hasChildren) { - Doxygen::indexList.addContentsItem(count>0,nd->localName(),ref,file,QCString(), - count>0 && !file.isEmpty(),addToIndex); - } + ftv->addContentsItem(hasChildren,nd->localName(),ref,file,0,FALSE,TRUE,nd); - //printf("*** writeNamespaceTree count=%d addToIndex=%d showClasses=%d classCount=%d\n", - // count,addToIndex,showClasses,classCount); - if (count>0) - { - if (addToIndex) Doxygen::indexList.incContentsDepth(); - ftv->incContentsDepth(); - writeNamespaceTree(nd->getNamespaceSDict(),ftv,FALSE,showClasses,addToIndex); - if (showClasses) + if (addToIndex) { - writeClassTree(nd->getClassSDict(),ftv,addToIndex,FALSE); + Doxygen::indexList.addContentsItem(hasChildren,nd->localName(),ref,file,QCString(), + hasChildren && !file.isEmpty(),addToIndex); + } + + //printf("*** writeNamespaceTree count=%d addToIndex=%d showClasses=%d classCount=%d\n", + // count,addToIndex,showClasses,classCount); + if (hasChildren) + { + if (addToIndex) Doxygen::indexList.incContentsDepth(); + ftv->incContentsDepth(); + writeNamespaceTree(nd->getNamespaceSDict(),ftv,FALSE,showClasses,addToIndex); + if (showClasses) + { + writeClassTree(nd->getClassSDict(),ftv,addToIndex,FALSE); + } + ftv->decContentsDepth(); + if (addToIndex) Doxygen::indexList.decContentsDepth(); } - ftv->decContentsDepth(); - if (addToIndex) Doxygen::indexList.decContentsDepth(); } } } @@ -3496,7 +3548,10 @@ static void writeGroupTreeNode(OutputList &ol, GroupDef *gd, int level, FTVHelp* ClassDef *cd; for (;(cd=it.current());++it) { - if (cd->isVisible()) + bool nestedClassInSameGroup = + cd->getOuterScope() && cd->getOuterScope()->definitionType()==Definition::TypeClass && + cd->getOuterScope()->partOfGroups()!=0 && cd->getOuterScope()->partOfGroups()->contains(gd); + if (cd->isVisible() && !nestedClassInSameGroup) { if (cd->isLinkable() && cd->isEmbeddedInOuterScope()) { @@ -3955,22 +4010,6 @@ static void writeIndex(OutputList &ol) /*,Doxygen::mainPage->sectionDict*/); ol.endTextBlock(); - if (!Config_getString("GENERATE_TAGFILE").isEmpty()) - { - Doxygen::tagFile << " <compound kind=\"page\">" << endl - << " <name>" - << convertToXML(Doxygen::mainPage->name()) - << "</name>" << endl - << " <title>" - << convertToXML(Doxygen::mainPage->title()) - << "</title>" << endl - << " <filename>" - << convertToXML(Doxygen::mainPage->getOutputFileBase()) - << "</filename>" << endl; - - Doxygen::mainPage->writeDocAnchorsToTagFile(); - Doxygen::tagFile << " </compound>" << endl; - } Doxygen::insideMainPage=FALSE; } diff --git a/src/index.h b/src/index.h index 050350f..8eb93ce 100644 --- a/src/index.h +++ b/src/index.h @@ -105,6 +105,13 @@ class IndexList : public IndexIntf for (li.toFirst();li.current();++li) (li.current()->*methodPtr)(a1,a2,a3,a4,a5,a6,a7,a8); } + template<typename A1,typename A2,typename A3,typename A4,typename A5,typename A6,typename A7,typename A8,typename A9> + void foreach(void (IndexIntf::*methodPtr)(A1,A2,A3,A4,A5,A6,A7,A8,A9),A1 a1,A2 a2,A3 a3,A4 a4,A5 a5,A6 a6,A7 a7,A8 a8,A9 a9) + { + QListIterator<IndexIntf> li(m_intfs); + for (li.toFirst();li.current();++li) (li.current()->*methodPtr)(a1,a2,a3,a4,a5,a6,a7,a8,a9); + } + public: /** Creates a list of indexes */ IndexList() { m_intfs.setAutoDelete(TRUE); m_enabled=TRUE; } diff --git a/src/latexdocvisitor.cpp b/src/latexdocvisitor.cpp index 7d326cb..d134385 100644 --- a/src/latexdocvisitor.cpp +++ b/src/latexdocvisitor.cpp @@ -139,6 +139,7 @@ void LatexDocVisitor::visit(DocSymbol *s) case DocSymbol::Hash: m_t << "\\#"; break; case DocSymbol::DoubleColon: m_t << "::"; break; case DocSymbol::Percent: m_t << "\\%"; break; + case DocSymbol::Pipe: m_t << "$|$"; break; case DocSymbol::Copy: m_t << "\\copyright"; break; case DocSymbol::Tm: m_t << "\\texttrademark"; break; case DocSymbol::Reg: m_t << "\\textregistered"; break; @@ -186,6 +187,73 @@ void LatexDocVisitor::visit(DocSymbol *s) case DocSymbol::Nbsp: m_t << "~"; break; case DocSymbol::AElig: m_t << "{\\AE}"; break; case DocSymbol::Aelig: m_t << "{\\ae}"; break; + case DocSymbol::GrkGamma: m_t << "{$\\Gamma$}"; break; + case DocSymbol::GrkDelta: m_t << "{$\\Delta$}"; break; + case DocSymbol::GrkTheta: m_t << "{$\\Theta$}"; break; + case DocSymbol::GrkLambda: m_t << "{$\\Lambda$}"; break; + case DocSymbol::GrkXi: m_t << "{$\\Xi$}"; break; + case DocSymbol::GrkPi: m_t << "{$\\Pi$}"; break; + case DocSymbol::GrkSigma: m_t << "{$\\Sigma$}"; break; + case DocSymbol::GrkUpsilon: m_t << "{$\\Upsilon$}"; break; + case DocSymbol::GrkPhi: m_t << "{$\\Phi$}"; break; + case DocSymbol::GrkPsi: m_t << "{$\\Psi$}"; break; + case DocSymbol::GrkOmega: m_t << "{$\\Omega$}"; break; + case DocSymbol::Grkalpha: m_t << "{$\\alpha$}"; break; + case DocSymbol::Grkbeta: m_t << "{$\\beta$}"; break; + case DocSymbol::Grkgamma: m_t << "{$\\gamma$}"; break; + case DocSymbol::Grkdelta: m_t << "{$\\delta$}"; break; + case DocSymbol::Grkepsilon: m_t << "{$\\varepsilon$}"; break; + case DocSymbol::Grkzeta: m_t << "{$\\zeta$}"; break; + case DocSymbol::Grketa: m_t << "{$\\eta$}"; break; + case DocSymbol::Grktheta: m_t << "{$\\theta$}"; break; + case DocSymbol::Grkiota: m_t << "{$\\iota$}"; break; + case DocSymbol::Grkkappa: m_t << "{$\\kappa$}"; break; + case DocSymbol::Grklambda: m_t << "{$\\lambda$}"; break; + case DocSymbol::Grkmu: m_t << "{$\\mu$}"; break; + case DocSymbol::Grknu: m_t << "{$\\nu$}"; break; + case DocSymbol::Grkxi: m_t << "{$\\xi$}"; break; + case DocSymbol::Grkpi: m_t << "{$\\pi$}"; break; + case DocSymbol::Grkrho: m_t << "{$\\rho$}"; break; + case DocSymbol::Grksigma: m_t << "{$\\sigma$}"; break; + case DocSymbol::Grktau: m_t << "{$\\tau$}"; break; + case DocSymbol::Grkupsilon: m_t << "{$\\upsilon$}"; break; + case DocSymbol::Grkphi: m_t << "{$\\varphi$}"; break; + case DocSymbol::Grkchi: m_t << "{$\\chi$}"; break; + case DocSymbol::Grkpsi: m_t << "{$\\psi$}"; break; + case DocSymbol::Grkomega: m_t << "{$\\omega$}"; break; + case DocSymbol::Grkvarsigma: m_t << "{$\\varsigma$}"; break; + case DocSymbol::Section: m_t << "{$\\S$}"; break; + case DocSymbol::Degree: m_t << "\\textdegree"; break; + case DocSymbol::Prime: m_t << "'"; break; + case DocSymbol::DoublePrime: m_t << "''"; break; + case DocSymbol::Infinity: m_t << "{$\\infty$}"; break; + case DocSymbol::EmptySet: m_t << "{$\\emptyset$}"; break; + case DocSymbol::PlusMinus: m_t << "{$\\pm$}"; break; + case DocSymbol::Times: m_t << "{$\\times$}"; break; + case DocSymbol::Minus: m_t << "-"; break; + case DocSymbol::CenterDot: m_t << "{$\\cdot$}"; break; + case DocSymbol::Partial: m_t << "{$\\partial$}"; break; + case DocSymbol::Nabla: m_t << "{$\\nabla$}"; break; + case DocSymbol::SquareRoot: m_t << "{$\\surd$}"; break; + case DocSymbol::Perpendicular: m_t << "{$\\perp$}"; break; + case DocSymbol::Sum: m_t << "{$\\sum$}"; break; + case DocSymbol::Integral: m_t << "{$\\int$}"; break; + case DocSymbol::Product: m_t << "{$\\prod$}"; break; + case DocSymbol::Similar: m_t << "{$\\sim$}"; break; + case DocSymbol::Approx: m_t << "{$\\approx$}"; break; + case DocSymbol::NotEqual: m_t << "{$\\ne$}"; break; + case DocSymbol::Equivalent: m_t << "{$\\equiv$}"; break; + case DocSymbol::Proportional: m_t << "{$\\propto$}"; break; + case DocSymbol::LessEqual: m_t << "{$\\le$}"; break; + case DocSymbol::GreaterEqual: m_t << "{$\\ge$}"; break; + case DocSymbol::LeftArrow: m_t << "{$\\leftarrow$}"; break; + case DocSymbol::RightArrow: m_t << "{$\\rightarrow$}"; break; + case DocSymbol::SetIn: m_t << "{$\\in$}"; break; + case DocSymbol::SetNotIn: m_t << "{$\\notin$}"; break; + case DocSymbol::LeftCeil: m_t << "{$\\lceil$}"; break; + case DocSymbol::RightCeil: m_t << "{$\\rceil$}"; break; + case DocSymbol::LeftFloor: m_t << "{$\\lfloor$}"; break; + case DocSymbol::RightFloor: m_t << "{$\\rfloor$}"; break; default: err("error: unknown symbol found\n"); } diff --git a/src/latexgen.cpp b/src/latexgen.cpp index c6bafad..e940541 100644 --- a/src/latexgen.cpp +++ b/src/latexgen.cpp @@ -326,6 +326,7 @@ static void writeDefaultHeaderPart1(FTextStream &t) t << "\\usepackage[scaled=.90]{helvet}\n"; t << "\\usepackage{courier}\n"; t << "\\usepackage{sectsty}\n"; + t << "\\usepackage{amssymb}\n"; t << "\\usepackage[titles]{tocloft}\n"; t << "\\usepackage{doxygen}\n"; diff --git a/src/latexgen.h b/src/latexgen.h index cd47ac3..63e0de6 100644 --- a/src/latexgen.h +++ b/src/latexgen.h @@ -191,6 +191,7 @@ class LatexGenerator : public OutputGenerator void writeNavigationPath(const char *) {} void writeLogo() {} void writeQuickLinks(bool,HighlightedItem,const char*) {} + void writeSummaryLink(const char *,const char *,const char *,bool) {} void startContents() {} void endContents() {} void writeNonBreakableSpace(int); diff --git a/src/layout_default.h b/src/layout_default.h index 67596bc..0950a94 100644 --- a/src/layout_default.h +++ b/src/layout_default.h @@ -27,7 +27,6 @@ " <includes visible=\"$SHOW_INCLUDE_FILES\"/>\n" " <inheritancegraph visible=\"$CLASS_GRAPH\"/>\n" " <collaborationgraph visible=\"$COLLABORATION_GRAPH\"/>\n" -" <allmemberslink visible=\"yes\"/>\n" " <memberdecl>\n" " <nestedclasses visible=\"yes\" title=\"\"/>\n" " <publictypes title=\"\"/>\n" @@ -72,6 +71,7 @@ " <properties title=\"\"/>\n" " <events title=\"\"/>\n" " </memberdef>\n" +" <allmemberslink visible=\"yes\"/>\n" " <usedfiles visible=\"$SHOW_USED_FILES\"/>\n" " <authorsection visible=\"yes\"/>\n" " </class>\n" diff --git a/src/layout_default.xml b/src/layout_default.xml index 589d0f1..7127664 100644 --- a/src/layout_default.xml +++ b/src/layout_default.xml @@ -27,7 +27,6 @@ <includes visible="$SHOW_INCLUDE_FILES"/> <inheritancegraph visible="$CLASS_GRAPH"/> <collaborationgraph visible="$COLLABORATION_GRAPH"/> - <allmemberslink visible="yes"/> <memberdecl> <nestedclasses visible="yes" title=""/> <publictypes title=""/> @@ -72,6 +71,7 @@ <properties title=""/> <events title=""/> </memberdef> + <allmemberslink visible="yes"/> <usedfiles visible="$SHOW_USED_FILES"/> <authorsection visible="yes"/> </class> diff --git a/src/mandocvisitor.cpp b/src/mandocvisitor.cpp index 3b0192d..87dd16f 100644 --- a/src/mandocvisitor.cpp +++ b/src/mandocvisitor.cpp @@ -84,6 +84,7 @@ void ManDocVisitor::visit(DocSymbol *s) case DocSymbol::Hash: m_t << "#"; break; case DocSymbol::DoubleColon: m_t << "::"; break; case DocSymbol::Percent: m_t << "%"; break; + case DocSymbol::Pipe: m_t << "|"; break; case DocSymbol::Copy: m_t << "(C)"; break; case DocSymbol::Tm: m_t << "(TM)"; break; case DocSymbol::Reg: m_t << "(R)"; break; @@ -106,7 +107,8 @@ void ManDocVisitor::visit(DocSymbol *s) case DocSymbol::Ring: m_t << s->letter() << "\\*o"; break; case DocSymbol::Nbsp: m_t << " "; break; default: - err("error: unknown symbol found\n"); + // unsupport symbol for man page :-( + break; } m_firstCol=FALSE; } diff --git a/src/mangen.h b/src/mangen.h index fe951ad..27656a7 100644 --- a/src/mangen.h +++ b/src/mangen.h @@ -188,6 +188,7 @@ class ManGenerator : public OutputGenerator void writeNavigationPath(const char *) {} void writeLogo() {} void writeQuickLinks(bool,HighlightedItem,const char *) {} + void writeSummaryLink(const char *,const char *,const char *,bool) {} void startContents() {} void endContents() {} void writeNonBreakableSpace(int n) { int i; for (i=0;i<n;i++) t << " "; } diff --git a/src/markdown.cpp b/src/markdown.cpp index 559828f..adcac4e 100644 --- a/src/markdown.cpp +++ b/src/markdown.cpp @@ -275,7 +275,7 @@ static int findEmphasisChar(const char *data, int size, char c) { i++; int l = endBlockName.length(); - while (i<size-l-1) + while (i<size-l) { if ((data[i]=='\\' || data[i]=='@') && // command data[i-1]!='\\' && data[i-1]!='@') // not escaped @@ -366,7 +366,7 @@ static int processEmphasis2(GrowBuf &out, const char *data, int size, char c) return 0; } -/** Parsing single emphase. +/** Parsing tripple emphasis. * Finds the first closing tag, and delegates to the other emph */ static int processEmphasis3(GrowBuf &out, const char *data, int size, char c) @@ -425,6 +425,41 @@ static int processEmphasis3(GrowBuf &out, const char *data, int size, char c) return 0; } +/** Process ndash and mdashes */ +static int processNmdash(GrowBuf &out,const char *data,int,int size) +{ + // precondition: data[0]=='-' + int i=1; + int count=1; + if (i<size && data[i]=='-') // found -- + { + count++,i++; + } + if (i<size && data[i]=='-') // found --- + { + count++,i++; + } + if (i<size && data[i]=='-') // found ---- + { + count++; + } + if (count==2) // -- => ndash + { + out.addStr("–"); + return 2; + } + else if (count==3) // --- => ndash + { + out.addStr("—"); + return 3; + } + // not an ndash or mdash + return 0; +} + +/** Process a HTML tag. Note that <pre>..</pre> are treated specially, in + * the sense that all code inside is written unprocessed + */ static int processHtmlTag(GrowBuf &out,const char *data,int offset,int size) { if (offset>0 && data[-1]=='\\') return 0; // escaped < @@ -518,23 +553,6 @@ static int processEmphasis(GrowBuf &out,const char *data,int offset,int size) return 0; } -#if 0 - if (offset>0 && size>1 && (isIdChar(-1) || data[-1]==data[0])) - { - if (isIdChar(1) || data[-1]==data[0]) - { - // avoid processing interal * and _ as cmd_id, or 4*10 as emphasis, - // also x**2,y*2 should not be processed - return 0; - } - else if (size>2 && data[0]==data[1] && isIdChar(2)) - { - // avoid processing interal ** and __ such as cmd__id__bla, - // or 4**10,5**10 as emphasis - return 0; - } - } -#endif char c = data[0]; int ret; if (size>2 && data[1]!=c) // _bla or *bla @@ -922,7 +940,7 @@ static int processSpecialCommand(GrowBuf &out, const char *data, int offset, int if (!endBlockName.isEmpty()) { int l = endBlockName.length(); - while (i<size-l-1) + while (i<size-l) { if ((data[i]=='\\' || data[i]=='@') && // command data[i-1]!='\\' && data[i-1]!='@') // not escaped @@ -1152,14 +1170,6 @@ static QCString extractTitleId(QCString &title) //printf("found id='%s' title='%s'\n",id.data(),title.data()); return id; } - //i = r1.match(title,0,&l); - //if (i!=-1) // found id: style id - //{ - // QCString id = title.mid(i,l-1); - // title = title.left(i)+title.mid(i+l); - // //printf("found id='%s' title='%s'\n",id.data(),title.data()); - // return id; - //} //printf("no id found in title '%s'\n",title.data()); return ""; } @@ -2159,6 +2169,7 @@ QCString processMarkdown(const QCString &fileName,Entry *e,const QCString &input g_actions['[']=processLink; g_actions['!']=processLink; g_actions['<']=processHtmlTag; + g_actions['-']=processNmdash; // finally process the inline markup (links, emphasis and code spans) processInline(out,s,size); out.addChar(0); diff --git a/src/memberdef.cpp b/src/memberdef.cpp index 8591ca3..69abf7a 100644 --- a/src/memberdef.cpp +++ b/src/memberdef.cpp @@ -401,7 +401,9 @@ class MemberDefImpl ExampleSDict *exampleSDict; // a dictionary of all examples for quick access - QCString type; // return type + QCString type; // return actual type + QCString accessorType; // return type that tell how to get to this member + ClassDef *accessorClass; // class that this member accesses (for anonymous types) QCString args; // function arguments/variable array specifiers QCString def; // member definition in code (fully qualified name) QCString anc; // HTML anchor name @@ -525,6 +527,7 @@ void MemberDefImpl::init(Definition *def, redefines=0; relatedAlso=0; redefinedBy=0; + accessorClass=0; nspace=0; memDef=0; memDec=0; @@ -1046,7 +1049,6 @@ void MemberDef::writeLink(OutputList &ol,ClassDef *,NamespaceDef *, { KEEP_RESIDENT_DURING_CALL; SrcLangExt lang = getLanguage(); - //static bool optimizeOutputJava = Config_getBool("OPTIMIZE_OUTPUT_JAVA"); static bool hideScopeNames = Config_getBool("HIDE_SCOPE_NAMES"); QCString sep = getLanguageSpecificSeparator(lang,TRUE); QCString n = name(); @@ -1134,14 +1136,12 @@ ClassDef *MemberDef::getClassDefOfAnonymousType() if (!cname.isEmpty() && annName.left(cname.length()+2)!=cname+"::") { QCString ts=stripAnonymousNamespaceScope(cname+"::"+annName); - //printf("Member::writeDeclaration: Trying %s\n",ts.data()); annoClassDef=getClass(ts); } // if not found yet, try without scope name if (annoClassDef==0) { QCString ts=stripAnonymousNamespaceScope(annName); - //printf("Member::writeDeclaration: Trying %s\n",ts.data()); annoClassDef=getClass(ts); } } @@ -1847,6 +1847,7 @@ void MemberDef::_getLabels(QStrList &sl,Definition *container) const else if (isRetain()) sl.append("retain"); else if (isWeak()) sl.append("weak"); else if (isStrong()) sl.append("strong"); + else if (isUnretained()) sl.append("unsafe_unretained"); if (!isObjCMethod()) { @@ -2666,6 +2667,50 @@ static QCString simplifyTypeForTable(const QCString &s) return ts; } +#if 0 +/** Returns the type definition corresponding to a member's return type. + * @param[in] scope The scope in which to search for the class definition. + * @param[in] type The string representing the member's return type. + * @param[in] lang The programming language in which the class is defined. + * @param[out] start The string position where the class definition name was found. + * @param[out] length The length of the class definition's name. + */ +static Definition *getClassFromType(Definition *scope,const QCString &type,SrcLangExt lang,int &start,int &length) +{ + int pos=0; + int i; + QCString name; + QCString templSpec; + while ((i=extractClassNameFromType(type,pos,name,templSpec,lang))!=-1) + { + ClassDef *cd=0; + MemberDef *md=0; + int l = name.length()+templSpec.length(); + if (!templSpec.isEmpty()) + { + cd = getResolvedClass(scope,0,name+templSpec,&md); + } + cd = getResolvedClass(scope,0,name); + if (cd) + { + start=i; + length=l; + printf("getClassFromType: type=%s name=%s start=%d length=%d\n",type.data(),name.data(),start,length); + return cd; + } + else if (md) + { + start=i; + length=l; + printf("getClassFromType: type=%s name=%s start=%d length=%d\n",type.data(),name.data(),start,length); + return md; + } + pos=i+l; + } + return 0; +} +#endif + void MemberDef::writeMemberDocSimple(OutputList &ol, Definition *container) { KEEP_RESIDENT_DURING_CALL; @@ -2682,18 +2727,49 @@ void MemberDef::writeMemberDocSimple(OutputList &ol, Definition *container) doxyName="__unnamed__"; } + ClassDef *cd = m_impl->accessorClass; + //printf("===> %s::anonymous: %s\n",name().data(),cd?cd->name().data():"<none>"); + ol.startInlineMemberType(); ol.startDoxyAnchor(cfname,cname,memAnchor,doxyName,doxyArgs); - QCString ts = simplifyTypeForTable(m_impl->type); + QCString type = m_impl->accessorType; + if (type.isEmpty()) + { + type = m_impl->type; + } + QCString ts = simplifyTypeForTable(type); - linkifyText(TextGeneratorOLImpl(ol), // out - scope, // scope - getBodyDef(), // fileScope - this, // self - ts, // text - TRUE // autoBreak - ); + if (cd) // cd points to an anonymous struct pointed to by this member + // so we add a link to it from the type column. + { + int i=0; + const char *prefixes[] = { "struct ","union ","class ", 0 }; + const char **p = prefixes; + while (*p) + { + int l=strlen(*p); + if (ts.left(l)==*p) + { + ol.writeString(*p); + i=l; + } + p++; + } + ol.writeObjectLink(cd->getReference(), + cd->getOutputFileBase(), + cd->anchor(),ts.mid(i)); + } + else // use standard auto linking + { + linkifyText(TextGeneratorOLImpl(ol), // out + scope, // scope + getBodyDef(), // fileScope + this, // self + ts, // text + TRUE // autoBreak + ); + } ol.endDoxyAnchor(cfname,memAnchor); ol.endInlineMemberType(); @@ -3396,6 +3472,13 @@ void MemberDef::setType(const char *t) m_impl->type = t; } +void MemberDef::setAccessorType(ClassDef *cd,const char *t) +{ + makeResident(); + m_impl->accessorClass = cd; + m_impl->accessorType = t; +} + void MemberDef::findSectionsInDocumentation() { makeResident(); @@ -3874,6 +3957,13 @@ bool MemberDef::isStrong() const return (m_impl->memSpec&Entry::Strong)!=0; } +bool MemberDef::isUnretained() const +{ + makeResident(); + return (m_impl->memSpec&Entry::Unretained)!=0; +} + + bool MemberDef::isImplementation() const { makeResident(); @@ -4387,6 +4477,8 @@ void MemberDef::flushToDisk() const marshalObjPointer (Doxygen::symbolStorage,m_impl->relatedAlso); marshalExampleSDict (Doxygen::symbolStorage,m_impl->exampleSDict); marshalQCString (Doxygen::symbolStorage,m_impl->type); + marshalQCString (Doxygen::symbolStorage,m_impl->accessorType); + marshalObjPointer (Doxygen::symbolStorage,m_impl->accessorClass); marshalQCString (Doxygen::symbolStorage,m_impl->args); marshalQCString (Doxygen::symbolStorage,m_impl->def); marshalQCString (Doxygen::symbolStorage,m_impl->anc); @@ -4486,6 +4578,8 @@ void MemberDef::loadFromDisk() const m_impl->relatedAlso = (ClassDef*)unmarshalObjPointer (Doxygen::symbolStorage); m_impl->exampleSDict = unmarshalExampleSDict (Doxygen::symbolStorage); m_impl->type = unmarshalQCString (Doxygen::symbolStorage); + m_impl->accessorType = unmarshalQCString (Doxygen::symbolStorage); + m_impl->accessorClass = (ClassDef*)unmarshalObjPointer (Doxygen::symbolStorage); m_impl->args = unmarshalQCString (Doxygen::symbolStorage); m_impl->def = unmarshalQCString (Doxygen::symbolStorage); m_impl->anc = unmarshalQCString (Doxygen::symbolStorage); diff --git a/src/memberdef.h b/src/memberdef.h index 3658ac3..a3c6dc7 100644 --- a/src/memberdef.h +++ b/src/memberdef.h @@ -154,6 +154,7 @@ class MemberDef : public Definition bool isRetain() const; bool isWeak() const; bool isStrong() const; + bool isUnretained() const; bool isNew() const; bool isSealed() const; bool isImplementation() const; @@ -298,6 +299,7 @@ class MemberDef : public Definition void setDefinitionTemplateParameterLists(QList<ArgumentList> *lists); void setTypeConstraints(ArgumentList *al); void setType(const char *t); + void setAccessorType(ClassDef *cd,const char *t); // namespace related members void setNamespace(NamespaceDef *nd); diff --git a/src/memberlist.cpp b/src/memberlist.cpp index 0d74cd6..327db76 100644 --- a/src/memberlist.cpp +++ b/src/memberlist.cpp @@ -615,7 +615,10 @@ void MemberList::writeDocumentation(OutputList &ol, if (title) { - ol.writeRuler(); + ol.pushGeneratorState(); + ol.disable(OutputGenerator::Html); + ol.writeRuler(); + ol.popGeneratorState(); ol.startGroupHeader(showInline ? 2 : 0); ol.parseText(title); ol.endGroupHeader(showInline ? 2 : 0); diff --git a/src/namespacedef.cpp b/src/namespacedef.cpp index ccc80c3..6bbba31 100644 --- a/src/namespacedef.cpp +++ b/src/namespacedef.cpp @@ -237,9 +237,12 @@ void NamespaceDef::writeDetailedDescription(OutputList &ol,const QCString &title !documentation().isEmpty() ) { - ol.writeRuler(); ol.pushGeneratorState(); - ol.disableAllBut(OutputGenerator::Html); + ol.disable(OutputGenerator::Html); + ol.writeRuler(); + ol.popGeneratorState(); + ol.pushGeneratorState(); + ol.disableAllBut(OutputGenerator::Html); ol.writeAnchor(0,"details"); ol.popGeneratorState(); ol.startGroupHeader(); @@ -394,7 +397,8 @@ void NamespaceDef::writeSummaryLinks(OutputList &ol) { LayoutDocEntrySection *ls = (LayoutDocEntrySection*)lde; QCString label = lde->kind()==LayoutDocEntry::NamespaceClasses ? "nested-classes" : "namespaces"; - writeSummaryLink(ol,label,ls->title,first); + ol.writeSummaryLink(0,label,ls->title,first); + first=FALSE; } else if (lde->kind()== LayoutDocEntry::MemberDecl) { @@ -402,7 +406,8 @@ void NamespaceDef::writeSummaryLinks(OutputList &ol) MemberList * ml = getMemberList(lmd->type); if (ml && ml->declVisible()) { - writeSummaryLink(ol,ml->listTypeAsString(),lmd->title,first); + ol.writeSummaryLink(0,ml->listTypeAsString(),lmd->title,first); + first=FALSE; } } } diff --git a/src/navtree.css b/src/navtree.css index 435168a..eb2aa70 100644 --- a/src/navtree.css +++ b/src/navtree.css @@ -43,6 +43,7 @@ #nav-tree .label { margin:0px; padding:0px; + font: 12px 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif; } #nav-tree .label a { @@ -119,6 +120,21 @@ -webkit-overflow-scrolling : touch; /* iOS 5+ */ } +#nav-sync { + position:absolute; + top:5px; + right:24px; + z-index:0; +} + +#nav-sync img { + opacity:0.3; +} + +#nav-sync img:hover { + opacity:0.9; +} + @media print { #nav-tree { display: none; } diff --git a/src/navtree.js b/src/navtree.js index 1b4931c..4fb2c87 100644 --- a/src/navtree.js +++ b/src/navtree.js @@ -20,6 +20,34 @@ function stripPath2(uri) return m ? uri.substring(i-6) : s; } +function localStorageSupported() +{ + return 'localStorage' in window && window['localStorage'] !== null; +} + +function storeLink(link) +{ + if (!$("#nav-sync").hasClass('sync') && localStorageSupported()) { + window.localStorage.setItem('navpath',link); + } +} + +function deleteLink() +{ + if (localStorageSupported()) { + window.localStorage.setItem('navpath',''); + } +} + +function cachedLink() +{ + if (localStorageSupported()) { + return window.localStorage.getItem('navpath'); + } else { + return ''; + } +} + function getScript(scriptName,func,show) { var head = document.getElementsByTagName("head")[0]; @@ -138,6 +166,7 @@ function newNode(o, po, text, link, childrenData, lastNode) var targetPage = stripPath(link.split('#')[0]); a.href = srcPage!=targetPage ? url : '#'; a.onclick = function(){ + storeLink(link); if (!$(a).parent().parent().hasClass('selected')) { $('.item').removeClass('selected'); @@ -165,6 +194,7 @@ function newNode(o, po, text, link, childrenData, lastNode) }; } else { a.href = url; + a.onclick = function() { storeLink(link); } } } else { if (childrenData != null) @@ -248,6 +278,8 @@ function highlightAnchor() glowEffect(rows.children(),300); // member without details } else if (anchor.parents().slice(2).prop('tagName')=='TR') { glowEffect(anchor.parents('div.memitem'),1000); // enum value + } else if (anchor.parent().attr('class')=='fieldtype'){ + glowEffect(anchor.parent().parent(),1000); // struct field } else if (anchor.parent().is(":header")) { glowEffect(anchor.parent(),1000); // section header } else { @@ -255,12 +287,11 @@ function highlightAnchor() } } -function selectAndHighlight(n) +function selectAndHighlight(hash,n) { var a; - if ($(location).attr('hash')) { - var link=stripPath($(location).attr('pathname'))+':'+ - $(location).attr('hash').substring(1); + if (hash) { + var link=stripPath($(location).attr('pathname'))+':'+hash.substring(1); a=$('.item a[class$="'+link+'"]'); } if (a && a.length) { @@ -274,14 +305,14 @@ function selectAndHighlight(n) showRoot(); } -function showNode(o, node, index) +function showNode(o, node, index, hash) { if (node && node.childrenData) { if (typeof(node.childrenData)==='string') { var varName = node.childrenData; getScript(node.relpath+varName,function(){ node.childrenData = getData(varName); - showNode(o,node,index); + showNode(o,node,index,hash); },true); } else { if (!node.childrenVisited) { @@ -296,26 +327,26 @@ function showNode(o, node, index) node.expanded = true; var n = node.children[o.breadcrumbs[index]]; if (index+1<o.breadcrumbs.length) { - showNode(o,n,index+1); + showNode(o,n,index+1,hash); } else { if (typeof(n.childrenData)==='string') { var varName = n.childrenData; getScript(n.relpath+varName,function(){ n.childrenData = getData(varName); node.expanded=false; - showNode(o,node,index); // retry with child node expanded + showNode(o,node,index,hash); // retry with child node expanded },true); } else { - var rootBase = o.toroot.replace(/\..+$/, ''); + var rootBase = stripPath(o.toroot.replace(/\..+$/, '')); if (rootBase=="index" || rootBase=="pages") { expandNode(o, n, true, true); } - selectAndHighlight(n); + selectAndHighlight(hash,n); } } } } else { - selectAndHighlight(); + selectAndHighlight(hash); } } @@ -333,7 +364,7 @@ function getNode(o, po) function gotoNode(o,subIndex,root,hash,relpath) { var nti = navTreeSubIndices[subIndex][root+hash]; - o.breadcrumbs = nti ? nti : navTreeSubIndices[subIndex][root]; + o.breadcrumbs = $.extend(true, [], nti ? nti : navTreeSubIndices[subIndex][root]); if (!o.breadcrumbs && root!=NAVTREE[0][1]) { // fallback: show index navTo(o,NAVTREE[0][1],"",relpath); $('.item').removeClass('selected'); @@ -341,16 +372,29 @@ function gotoNode(o,subIndex,root,hash,relpath) } if (o.breadcrumbs) { o.breadcrumbs.unshift(0); // add 0 for root node - showNode(o, o.node, 0); + showNode(o, o.node, 0, hash); } } function navTo(o,root,hash,relpath) { + var link = cachedLink(); + if (link) { + var parts = link.split('#'); + root = parts[0]; + if (parts.length>1) hash = '#'+parts[1]; + else hash=''; + } + if (root==NAVTREE[0][1]) { + $('#nav-sync').css('top','30px'); + } else { + $('#nav-sync').css('top','5px'); + } if (hash.match(/^#l\d+$/)) { var anchor=$('a[name='+hash.substring(1)+']'); glowEffect(anchor.parent(),1000); // line number hash=''; // strip line number anchors + //root=root.replace(/_source\./,'.'); // source link to doc link } var url=root+hash; var i=-1; @@ -367,6 +411,20 @@ function navTo(o,root,hash,relpath) } } +function toggleSyncButton(relpath) +{ + var navSync = $('#nav-sync'); + if (navSync.hasClass('sync')) { + navSync.removeClass('sync'); + navSync.html('<img src="'+relpath+'sync_off.png"/>'); + storeLink(stripPath2($(location).attr('pathname'))+$(location).attr('hash')); + } else { + navSync.addClass('sync'); + navSync.html('<img src="'+relpath+'sync_on.png"/>'); + deleteLink(); + } +} + function initNavTree(toroot,relpath) { var o = new Object(); @@ -387,6 +445,17 @@ function initNavTree(toroot,relpath) o.node.plus_img.width = 16; o.node.plus_img.height = 22; + if (localStorageSupported()) { + var navSync = $('#nav-sync'); + if (cachedLink()) { + navSync.html('<img src="'+relpath+'sync_off.png"/>'); + navSync.removeClass('sync'); + } else { + navSync.html('<img src="'+relpath+'sync_on.png"/>'); + } + navSync.click(function(){ toggleSyncButton(relpath); }); + } + navTo(o,toroot,window.location.hash,relpath); $(window).bind('hashchange', function(){ diff --git a/src/navtree_css.h b/src/navtree_css.h index 99bcb24..00a889f 100644 --- a/src/navtree_css.h +++ b/src/navtree_css.h @@ -43,6 +43,7 @@ "#nav-tree .label {\n" " margin:0px;\n" " padding:0px;\n" +" font: 12px 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif;\n" "}\n" "\n" "#nav-tree .label a {\n" @@ -119,6 +120,21 @@ " -webkit-overflow-scrolling : touch; /* iOS 5+ */\n" "}\n" "\n" +"#nav-sync {\n" +" position:absolute;\n" +" top:5px;\n" +" right:24px;\n" +" z-index:0;\n" +"}\n" +"\n" +"#nav-sync img {\n" +" opacity:0.3;\n" +"}\n" +"\n" +"#nav-sync img:hover {\n" +" opacity:0.9;\n" +"}\n" +"\n" "@media print\n" "{\n" " #nav-tree { display: none; }\n" diff --git a/src/navtree_js.h b/src/navtree_js.h index e243466..fee88b3 100644 --- a/src/navtree_js.h +++ b/src/navtree_js.h @@ -20,6 +20,34 @@ " return m ? uri.substring(i-6) : s;\n" "}\n" "\n" +"function localStorageSupported()\n" +"{\n" +" return 'localStorage' in window && window['localStorage'] !== null;\n" +"}\n" +"\n" +"function storeLink(link)\n" +"{\n" +" if (!$(\"#nav-sync\").hasClass('sync') && localStorageSupported()) {\n" +" window.localStorage.setItem('navpath',link);\n" +" }\n" +"}\n" +"\n" +"function deleteLink()\n" +"{\n" +" if (localStorageSupported()) {\n" +" window.localStorage.setItem('navpath','');\n" +" } \n" +"}\n" +"\n" +"function cachedLink()\n" +"{\n" +" if (localStorageSupported()) {\n" +" return window.localStorage.getItem('navpath');\n" +" } else {\n" +" return '';\n" +" }\n" +"}\n" +"\n" "function getScript(scriptName,func,show)\n" "{\n" " var head = document.getElementsByTagName(\"head\")[0]; \n" @@ -138,6 +166,7 @@ " var targetPage = stripPath(link.split('#')[0]);\n" " a.href = srcPage!=targetPage ? url : '#';\n" " a.onclick = function(){\n" +" storeLink(link);\n" " if (!$(a).parent().parent().hasClass('selected'))\n" " {\n" " $('.item').removeClass('selected');\n" @@ -165,6 +194,7 @@ " };\n" " } else {\n" " a.href = url;\n" +" a.onclick = function() { storeLink(link); }\n" " }\n" " } else {\n" " if (childrenData != null) \n" @@ -248,6 +278,8 @@ " glowEffect(rows.children(),300); // member without details\n" " } else if (anchor.parents().slice(2).prop('tagName')=='TR') {\n" " glowEffect(anchor.parents('div.memitem'),1000); // enum value\n" +" } else if (anchor.parent().attr('class')=='fieldtype'){\n" +" glowEffect(anchor.parent().parent(),1000); // struct field\n" " } else if (anchor.parent().is(\":header\")) {\n" " glowEffect(anchor.parent(),1000); // section header\n" " } else {\n" @@ -255,12 +287,11 @@ " }\n" "}\n" "\n" -"function selectAndHighlight(n)\n" +"function selectAndHighlight(hash,n)\n" "{\n" " var a;\n" -" if ($(location).attr('hash')) {\n" -" var link=stripPath($(location).attr('pathname'))+':'+\n" -" $(location).attr('hash').substring(1);\n" +" if (hash) {\n" +" var link=stripPath($(location).attr('pathname'))+':'+hash.substring(1);\n" " a=$('.item a[class$=\"'+link+'\"]');\n" " }\n" " if (a && a.length) {\n" @@ -274,14 +305,14 @@ " showRoot();\n" "}\n" "\n" -"function showNode(o, node, index)\n" +"function showNode(o, node, index, hash)\n" "{\n" " if (node && node.childrenData) {\n" " if (typeof(node.childrenData)==='string') {\n" " var varName = node.childrenData;\n" " getScript(node.relpath+varName,function(){\n" " node.childrenData = getData(varName);\n" -" showNode(o,node,index);\n" +" showNode(o,node,index,hash);\n" " },true);\n" " } else {\n" " if (!node.childrenVisited) {\n" @@ -296,26 +327,26 @@ " node.expanded = true;\n" " var n = node.children[o.breadcrumbs[index]];\n" " if (index+1<o.breadcrumbs.length) {\n" -" showNode(o,n,index+1);\n" +" showNode(o,n,index+1,hash);\n" " } else {\n" " if (typeof(n.childrenData)==='string') {\n" " var varName = n.childrenData;\n" " getScript(n.relpath+varName,function(){\n" " n.childrenData = getData(varName);\n" " node.expanded=false;\n" -" showNode(o,node,index); // retry with child node expanded\n" +" showNode(o,node,index,hash); // retry with child node expanded\n" " },true);\n" " } else {\n" -" var rootBase = o.toroot.replace(/\\..+$/, '');\n" +" var rootBase = stripPath(o.toroot.replace(/\\..+$/, ''));\n" " if (rootBase==\"index\" || rootBase==\"pages\") {\n" " expandNode(o, n, true, true);\n" " }\n" -" selectAndHighlight(n);\n" +" selectAndHighlight(hash,n);\n" " }\n" " }\n" " }\n" " } else {\n" -" selectAndHighlight();\n" +" selectAndHighlight(hash);\n" " }\n" "}\n" "\n" @@ -333,7 +364,7 @@ "function gotoNode(o,subIndex,root,hash,relpath)\n" "{\n" " var nti = navTreeSubIndices[subIndex][root+hash];\n" -" o.breadcrumbs = nti ? nti : navTreeSubIndices[subIndex][root];\n" +" o.breadcrumbs = $.extend(true, [], nti ? nti : navTreeSubIndices[subIndex][root]);\n" " if (!o.breadcrumbs && root!=NAVTREE[0][1]) { // fallback: show index\n" " navTo(o,NAVTREE[0][1],\"\",relpath);\n" " $('.item').removeClass('selected');\n" @@ -341,16 +372,29 @@ " }\n" " if (o.breadcrumbs) {\n" " o.breadcrumbs.unshift(0); // add 0 for root node\n" -" showNode(o, o.node, 0);\n" +" showNode(o, o.node, 0, hash);\n" " }\n" "}\n" "\n" "function navTo(o,root,hash,relpath)\n" "{\n" +" var link = cachedLink();\n" +" if (link) {\n" +" var parts = link.split('#');\n" +" root = parts[0];\n" +" if (parts.length>1) hash = '#'+parts[1];\n" +" else hash='';\n" +" }\n" +" if (root==NAVTREE[0][1]) {\n" +" $('#nav-sync').css('top','30px');\n" +" } else {\n" +" $('#nav-sync').css('top','5px');\n" +" }\n" " if (hash.match(/^#l\\d+$/)) {\n" " var anchor=$('a[name='+hash.substring(1)+']');\n" " glowEffect(anchor.parent(),1000); // line number\n" " hash=''; // strip line number anchors\n" +" //root=root.replace(/_source\\./,'.'); // source link to doc link\n" " }\n" " var url=root+hash;\n" " var i=-1;\n" @@ -367,6 +411,20 @@ " }\n" "}\n" "\n" +"function toggleSyncButton(relpath)\n" +"{\n" +" var navSync = $('#nav-sync');\n" +" if (navSync.hasClass('sync')) {\n" +" navSync.removeClass('sync');\n" +" navSync.html('<img src=\"'+relpath+'sync_off.png\"/>');\n" +" storeLink(stripPath2($(location).attr('pathname'))+$(location).attr('hash'));\n" +" } else {\n" +" navSync.addClass('sync');\n" +" navSync.html('<img src=\"'+relpath+'sync_on.png\"/>');\n" +" deleteLink();\n" +" }\n" +"}\n" +"\n" "function initNavTree(toroot,relpath)\n" "{\n" " var o = new Object();\n" @@ -387,6 +445,17 @@ " o.node.plus_img.width = 16;\n" " o.node.plus_img.height = 22;\n" "\n" +" if (localStorageSupported()) {\n" +" var navSync = $('#nav-sync');\n" +" if (cachedLink()) {\n" +" navSync.html('<img src=\"'+relpath+'sync_off.png\"/>');\n" +" navSync.removeClass('sync');\n" +" } else {\n" +" navSync.html('<img src=\"'+relpath+'sync_on.png\"/>');\n" +" }\n" +" navSync.click(function(){ toggleSyncButton(relpath); });\n" +" }\n" +"\n" " navTo(o,toroot,window.location.hash,relpath);\n" "\n" " $(window).bind('hashchange', function(){\n" diff --git a/src/outputgen.h b/src/outputgen.h index e41c1a6..793f7d3 100644 --- a/src/outputgen.h +++ b/src/outputgen.h @@ -389,6 +389,7 @@ class OutputGenerator : public BaseOutputDocInterface virtual void writeNavigationPath(const char *) = 0; virtual void writeLogo() = 0; virtual void writeQuickLinks(bool compact,HighlightedItem hli,const char *file) = 0; + virtual void writeSummaryLink(const char *file,const char *anchor,const char *title,bool first) = 0; virtual void startContents() = 0; virtual void endContents() = 0; virtual void startTextBlock(bool) = 0; diff --git a/src/outputlist.h b/src/outputlist.h index b7bb5a3..be26f99 100644 --- a/src/outputlist.h +++ b/src/outputlist.h @@ -54,6 +54,7 @@ class OutputList : public OutputDocInterface virtual ~OutputList(); void add(const OutputGenerator *); + uint count() const { return outputs->count(); } void disableAllBut(OutputGenerator::OutputType o); void enableAll(); @@ -350,6 +351,8 @@ class OutputList : public OutputDocInterface { forall(&OutputGenerator::writeLogo); } void writeQuickLinks(bool compact,HighlightedItem hli,const char *file) { forall(&OutputGenerator::writeQuickLinks,compact,hli,file); } + void writeSummaryLink(const char *file,const char *anchor,const char *title,bool first) + { forall(&OutputGenerator::writeSummaryLink,file,anchor,title,first); } void startContents() { forall(&OutputGenerator::startContents); } void endContents() diff --git a/src/perlmodgen.cpp b/src/perlmodgen.cpp index 4a0123f..fd477c2 100644 --- a/src/perlmodgen.cpp +++ b/src/perlmodgen.cpp @@ -538,6 +538,7 @@ void PerlModDocVisitor::visit(DocSymbol *sy) case DocSymbol::Hash: c = '#'; break; case DocSymbol::DoubleColon: s = "::"; break; case DocSymbol::Percent: c = '%'; break; + case DocSymbol::Pipe: c = '|'; break; case DocSymbol::Quot: c = '"'; break; case DocSymbol::Lsquo: s = "\\\'"; break; case DocSymbol::Rsquo: s = "\\\'"; break; @@ -562,6 +563,73 @@ void PerlModDocVisitor::visit(DocSymbol *sy) case DocSymbol::Apos: s = "\\\'"; break; case DocSymbol::Aelig: symbol = "aelig"; break; case DocSymbol::AElig: symbol = "AElig"; break; + case DocSymbol::GrkGamma: symbol = "Gamma"; break; + case DocSymbol::GrkDelta: symbol = "Delta"; break; + case DocSymbol::GrkTheta: symbol = "Theta"; break; + case DocSymbol::GrkLambda: symbol = "Lambda"; break; + case DocSymbol::GrkXi: symbol = "Xi"; break; + case DocSymbol::GrkPi: symbol = "Pi"; break; + case DocSymbol::GrkSigma: symbol = "Sigma"; break; + case DocSymbol::GrkUpsilon: symbol = "Upsilon"; break; + case DocSymbol::GrkPhi: symbol = "Phi"; break; + case DocSymbol::GrkPsi: symbol = "Psi"; break; + case DocSymbol::GrkOmega: symbol = "Omega"; break; + case DocSymbol::Grkalpha: symbol = "alpha"; break; + case DocSymbol::Grkbeta: symbol = "beta"; break; + case DocSymbol::Grkgamma: symbol = "gamma"; break; + case DocSymbol::Grkdelta: symbol = "delta"; break; + case DocSymbol::Grkepsilon: symbol = "epsilon"; break; + case DocSymbol::Grkzeta: symbol = "zeta"; break; + case DocSymbol::Grketa: symbol = "eta"; break; + case DocSymbol::Grktheta: symbol = "theta"; break; + case DocSymbol::Grkiota: symbol = "iota"; break; + case DocSymbol::Grkkappa: symbol = "kappa"; break; + case DocSymbol::Grklambda: symbol = "lambda"; break; + case DocSymbol::Grkmu: symbol = "mu"; break; + case DocSymbol::Grknu: symbol = "nu"; break; + case DocSymbol::Grkxi: symbol = "xi"; break; + case DocSymbol::Grkpi: symbol = "pi"; break; + case DocSymbol::Grkrho: symbol = "rho"; break; + case DocSymbol::Grksigma: symbol = "sigma"; break; + case DocSymbol::Grktau: symbol = "tau"; break; + case DocSymbol::Grkupsilon: symbol = "upsilon"; break; + case DocSymbol::Grkphi: symbol = "phi"; break; + case DocSymbol::Grkchi: symbol = "chi"; break; + case DocSymbol::Grkpsi: symbol = "psi"; break; + case DocSymbol::Grkomega: symbol = "omega"; break; + case DocSymbol::Grkvarsigma: symbol = "sigma"; break; + case DocSymbol::Section: symbol = "sect"; break; + case DocSymbol::Degree: symbol = "deg"; break; + case DocSymbol::Prime: s = "\\\'"; break; + case DocSymbol::DoublePrime: c = '"'; break; + case DocSymbol::Infinity: symbol = "inf"; break; + case DocSymbol::EmptySet: symbol = "empty"; break; + case DocSymbol::PlusMinus: s = "+/-"; break; + case DocSymbol::Times: c = '*'; break; + case DocSymbol::Minus: c = '-'; break; + case DocSymbol::CenterDot: c = '.'; break; + case DocSymbol::Partial: symbol = "partial"; break; + case DocSymbol::Nabla: symbol = "nabla"; break; + case DocSymbol::SquareRoot: symbol = "sqrt"; break; + case DocSymbol::Perpendicular: symbol = "perp"; break; + case DocSymbol::Sum: symbol = "sum"; break; + case DocSymbol::Integral: symbol = "int"; break; + case DocSymbol::Product: symbol = "prod"; break; + case DocSymbol::Similar: c = '~'; break; + case DocSymbol::Approx: symbol = "approx"; break; + case DocSymbol::NotEqual: s = "!="; break; + case DocSymbol::Equivalent: symbol = "equiv"; break; + case DocSymbol::Proportional: symbol = "propto"; break; + case DocSymbol::LessEqual: s = "<="; break; + case DocSymbol::GreaterEqual: s = ">="; break; + case DocSymbol::LeftArrow: s = "<-"; break; + case DocSymbol::RightArrow: s = "->"; break; + case DocSymbol::SetIn: symbol = "in"; break; + case DocSymbol::SetNotIn: symbol = "notin"; break; + case DocSymbol::LeftCeil: symbol = "lceil"; break; + case DocSymbol::RightCeil: symbol = "rceil"; break; + case DocSymbol::LeftFloor: symbol = "lfloor"; break; + case DocSymbol::RightFloor: symbol = "rfloor"; break; case DocSymbol::Unknown: err("error: unknown symbol found\n"); break; } diff --git a/src/printdocvisitor.h b/src/printdocvisitor.h index b84d0e1..223e838 100644 --- a/src/printdocvisitor.h +++ b/src/printdocvisitor.h @@ -65,6 +65,7 @@ class PrintDocVisitor : public DocVisitor case DocSymbol::Dollar: printf("$"); break; case DocSymbol::Hash: printf("#"); break; case DocSymbol::Percent: printf("%%"); break; + case DocSymbol::Pipe: printf("|"); break; case DocSymbol::Copy: printf("©"); break; case DocSymbol::Apos: printf("'"); break; case DocSymbol::Quot: printf("\""); break; @@ -85,6 +86,73 @@ class PrintDocVisitor : public DocVisitor case DocSymbol::Nbsp: printf(" "); break; case DocSymbol::Aelig: printf("æ"); break; case DocSymbol::AElig: printf("Æ"); break; + case DocSymbol::GrkGamma: printf("Γ"); break; + case DocSymbol::GrkDelta: printf("Δ"); break; + case DocSymbol::GrkTheta: printf("Θ"); break; + case DocSymbol::GrkLambda: printf("Λ"); break; + case DocSymbol::GrkXi: printf("Ξ"); break; + case DocSymbol::GrkPi: printf("Π"); break; + case DocSymbol::GrkSigma: printf("Σ"); break; + case DocSymbol::GrkUpsilon: printf("Υ"); break; + case DocSymbol::GrkPhi: printf("Φ"); break; + case DocSymbol::GrkPsi: printf("Ψ"); break; + case DocSymbol::GrkOmega: printf("Ω"); break; + case DocSymbol::Grkalpha: printf("α"); break; + case DocSymbol::Grkbeta: printf("β"); break; + case DocSymbol::Grkgamma: printf("γ"); break; + case DocSymbol::Grkdelta: printf("δ"); break; + case DocSymbol::Grkepsilon: printf("ε"); break; + case DocSymbol::Grkzeta: printf("ζ"); break; + case DocSymbol::Grketa: printf("η"); break; + case DocSymbol::Grktheta: printf("θ"); break; + case DocSymbol::Grkiota: printf("ι"); break; + case DocSymbol::Grkkappa: printf("κ"); break; + case DocSymbol::Grklambda: printf("λ"); break; + case DocSymbol::Grkmu: printf("μ"); break; + case DocSymbol::Grknu: printf("ν"); break; + case DocSymbol::Grkxi: printf("ξ"); break; + case DocSymbol::Grkpi: printf("π"); break; + case DocSymbol::Grkrho: printf("ρ"); break; + case DocSymbol::Grksigma: printf("σ"); break; + case DocSymbol::Grktau: printf("τ"); break; + case DocSymbol::Grkupsilon: printf("υ"); break; + case DocSymbol::Grkphi: printf("φ"); break; + case DocSymbol::Grkchi: printf("χ"); break; + case DocSymbol::Grkpsi: printf("ψ"); break; + case DocSymbol::Grkomega: printf("ω"); break; + case DocSymbol::Grkvarsigma: printf("ς"); break; + case DocSymbol::Section: printf("§"); break; + case DocSymbol::Degree: printf("°"); break; + case DocSymbol::Prime: printf("′"); break; + case DocSymbol::DoublePrime: printf("″"); break; + case DocSymbol::Infinity: printf("∞"); break; + case DocSymbol::EmptySet: printf("∅"); break; + case DocSymbol::PlusMinus: printf("±"); break; + case DocSymbol::Times: printf("×"); break; + case DocSymbol::Minus: printf("−"); break; + case DocSymbol::CenterDot: printf("⋅"); break; + case DocSymbol::Partial: printf("∂"); break; + case DocSymbol::Nabla: printf("∇"); break; + case DocSymbol::SquareRoot: printf("√"); break; + case DocSymbol::Perpendicular: printf("⊥"); break; + case DocSymbol::Sum: printf("∑"); break; + case DocSymbol::Integral: printf("∫"); break; + case DocSymbol::Product: printf("∏"); break; + case DocSymbol::Similar: printf("∼"); break; + case DocSymbol::Approx: printf("≈"); break; + case DocSymbol::NotEqual: printf("≠"); break; + case DocSymbol::Equivalent: printf("≡"); break; + case DocSymbol::Proportional: printf("∝"); break; + case DocSymbol::LessEqual: printf("≤"); break; + case DocSymbol::GreaterEqual: printf("≥"); break; + case DocSymbol::LeftArrow: printf("←"); break; + case DocSymbol::RightArrow: printf("→"); break; + case DocSymbol::SetIn: printf("∈"); break; + case DocSymbol::SetNotIn: printf("∉"); break; + case DocSymbol::LeftCeil: printf("⌈"); break; + case DocSymbol::RightCeil: printf("⌉"); break; + case DocSymbol::LeftFloor: printf("⌊"); break; + case DocSymbol::RightFloor: printf("⌋"); break; default: printf("Error: unknown symbol found\n"); } diff --git a/src/qhp.cpp b/src/qhp.cpp index 86da674..0d55227 100644 --- a/src/qhp.cpp +++ b/src/qhp.cpp @@ -160,10 +160,12 @@ void Qhp::finalize() void Qhp::incContentsDepth() { m_sectionLevel++; + //printf("Qhp::incContentsDepth() %d->%d\n",m_sectionLevel-1,m_sectionLevel); } void Qhp::decContentsDepth() { + //printf("Qhp::decContentsDepth() %d->%d\n",m_sectionLevel,m_sectionLevel-1); if (m_sectionLevel <= 0) { return; @@ -177,6 +179,7 @@ void Qhp::addContentsItem(bool /*isDir*/, const char * name, bool /* addToNavIndex */, Definition * /*def*/) { + //printf("Qhp::addContentsItem(%s) %d\n",name,m_sectionLevel); // Backup difference before modification int diff = m_prevSectionLevel - m_sectionLevel; @@ -282,7 +285,7 @@ void Qhp::handlePrevSection() if (m_prevSectionTitle.isNull()) { - return; + m_prevSectionTitle=" "; // should not happen... } // We skip "Main Page" as our extra root is pointing to that diff --git a/src/rtfdocvisitor.cpp b/src/rtfdocvisitor.cpp index b4dedf1..3000151 100644 --- a/src/rtfdocvisitor.cpp +++ b/src/rtfdocvisitor.cpp @@ -130,6 +130,7 @@ void RTFDocVisitor::visit(DocSymbol *s) case DocSymbol::Hash: m_t << "#"; break; case DocSymbol::DoubleColon: m_t << "::"; break; case DocSymbol::Percent: m_t << "%"; break; + case DocSymbol::Pipe: m_t << "|"; break; case DocSymbol::Copy: m_t << "(C)"; break; case DocSymbol::Tm: m_t << "(TM)"; break; case DocSymbol::Reg: m_t << "(R)"; break; @@ -241,6 +242,73 @@ void RTFDocVisitor::visit(DocSymbol *s) case DocSymbol::Nbsp: m_t << "\\~ "; break; case DocSymbol::Aelig: m_t << "\346"; break; case DocSymbol::AElig: m_t << "\306"; break; + case DocSymbol::GrkGamma: m_t << "Gamma "; break; + case DocSymbol::GrkDelta: m_t << "Delta "; break; + case DocSymbol::GrkTheta: m_t << "Theta "; break; + case DocSymbol::GrkLambda: m_t << "Lambda "; break; + case DocSymbol::GrkXi: m_t << "Xi "; break; + case DocSymbol::GrkPi: m_t << "Pi "; break; + case DocSymbol::GrkSigma: m_t << "Sigma "; break; + case DocSymbol::GrkUpsilon: m_t << "Upsilon "; break; + case DocSymbol::GrkPhi: m_t << "Phi "; break; + case DocSymbol::GrkPsi: m_t << "Psi "; break; + case DocSymbol::GrkOmega: m_t << "Omega "; break; + case DocSymbol::Grkalpha: m_t << "alpha "; break; + case DocSymbol::Grkbeta: m_t << "beta "; break; + case DocSymbol::Grkgamma: m_t << "gamma "; break; + case DocSymbol::Grkdelta: m_t << "delta "; break; + case DocSymbol::Grkepsilon: m_t << "epsilon "; break; + case DocSymbol::Grkzeta: m_t << "zeta "; break; + case DocSymbol::Grketa: m_t << "eta "; break; + case DocSymbol::Grktheta: m_t << "theta "; break; + case DocSymbol::Grkiota: m_t << "iota "; break; + case DocSymbol::Grkkappa: m_t << "kappa "; break; + case DocSymbol::Grklambda: m_t << "lambda "; break; + case DocSymbol::Grkmu: m_t << "mu "; break; + case DocSymbol::Grknu: m_t << "nu "; break; + case DocSymbol::Grkxi: m_t << "xi "; break; + case DocSymbol::Grkpi: m_t << "pi "; break; + case DocSymbol::Grkrho: m_t << "rho "; break; + case DocSymbol::Grksigma: m_t << "sigma "; break; + case DocSymbol::Grktau: m_t << "tau "; break; + case DocSymbol::Grkupsilon: m_t << "upsilon "; break; + case DocSymbol::Grkphi: m_t << "phi "; break; + case DocSymbol::Grkchi: m_t << "chi "; break; + case DocSymbol::Grkpsi: m_t << "psi "; break; + case DocSymbol::Grkomega: m_t << "omega "; break; + case DocSymbol::Grkvarsigma: m_t << "sigma "; break; + case DocSymbol::Section: m_t << "\247"; break; + case DocSymbol::Degree: m_t << "\260"; break; + case DocSymbol::Prime: m_t << "'"; break; + case DocSymbol::DoublePrime: m_t << "\""; break; + case DocSymbol::Infinity: m_t << "inf "; break; + case DocSymbol::EmptySet: m_t << "empty "; break; + case DocSymbol::PlusMinus: m_t << "\261"; break; + case DocSymbol::Times: m_t << "\327"; break; + case DocSymbol::Minus: m_t << "-"; break; + case DocSymbol::CenterDot: m_t << "."; break; + case DocSymbol::Partial: m_t << "partial "; break; + case DocSymbol::Nabla: m_t << "nabla "; break; + case DocSymbol::SquareRoot: m_t << "sqrt "; break; + case DocSymbol::Perpendicular: m_t << "perp "; break; + case DocSymbol::Sum: m_t << "sum "; break; + case DocSymbol::Integral: m_t << "int "; break; + case DocSymbol::Product: m_t << "prod "; break; + case DocSymbol::Similar: m_t << "~"; break; + case DocSymbol::Approx: m_t << "approx "; break; + case DocSymbol::NotEqual: m_t << "!="; break; + case DocSymbol::Equivalent: m_t << "equiv "; break; + case DocSymbol::Proportional: m_t << "propto "; break; + case DocSymbol::LessEqual: m_t << "<="; break; + case DocSymbol::GreaterEqual: m_t << ">="; break; + case DocSymbol::LeftArrow: m_t << "<-"; break; + case DocSymbol::RightArrow: m_t << "->"; break; + case DocSymbol::SetIn: m_t << "in "; break; + case DocSymbol::SetNotIn: m_t << "notin "; break; + case DocSymbol::LeftCeil: m_t << "lceil "; break; + case DocSymbol::RightCeil: m_t << "rceil "; break; + case DocSymbol::LeftFloor: m_t << "lfloor "; break; + case DocSymbol::RightFloor: m_t << "rfloor "; break; default: err("error: unknown symbol found\n"); } diff --git a/src/rtfgen.h b/src/rtfgen.h index 628eb6d..d93d77c 100644 --- a/src/rtfgen.h +++ b/src/rtfgen.h @@ -183,6 +183,7 @@ class RTFGenerator : public OutputGenerator void writeNavigationPath(const char *) {} void writeLogo() {} void writeQuickLinks(bool,HighlightedItem,const char *) {} + void writeSummaryLink(const char *,const char *,const char *,bool) {} void startContents() {} void endContents() {} void writeNonBreakableSpace(int); diff --git a/src/scanner.l b/src/scanner.l index ed55b41..e819877 100644 --- a/src/scanner.l +++ b/src/scanner.l @@ -283,7 +283,7 @@ static void lineCount() if (*p=='\n') yyLineNr++,g_column=0; else if (*p=='\t') - g_column+=tabSize - (g_column&tabSize); + g_column+=tabSize - (g_column%tabSize); else g_column++; } @@ -818,7 +818,7 @@ TYPEDEFPREFIX (("typedef"{BN}+)?)((("volatile"|"const"){BN}+)?) <FindMembersPHP>[^\n<]+ { // Non-PHP code text, ignore } <FindMembersPHP>\n { // Non-PHP code text, ignore - yyLineNr++; + lineCount(); } <FindMembersPHP>. { // Non-PHP code text, ignore } @@ -996,7 +996,7 @@ TYPEDEFPREFIX (("typedef"{BN}+)?)((("volatile"|"const"){BN}+)?) BEGIN( FindMembers ); } <CliPropertyType>\n { - yyLineNr++; + lineCount(); } <CliPropertyType>{B}* { } @@ -1204,6 +1204,10 @@ TYPEDEFPREFIX (("typedef"{BN}+)?)((("volatile"|"const"){BN}+)?) } <ObjCPropAttr>"assign" { // default } +<ObjCPropAttr>"unsafe_unretained" { + current->spec&=~Entry::Assign; + current->spec|=Entry::Unretained; + } <ObjCPropAttr>"retain" { current->spec&=~Entry::Assign; current->spec|=Entry::Retain; @@ -1234,7 +1238,7 @@ TYPEDEFPREFIX (("typedef"{BN}+)?)((("volatile"|"const"){BN}+)?) else if (strcmp(yytext,"@property")==0) // ObjC 2.0 property { current->mtype = mtype = Property; - current->spec|=Entry::Writable | Entry::Readable | Entry::Assign; + current->spec|=Entry::Writable | Entry::Readable; current->protection = Public ; } else if (strcmp(yytext,"@synthesize")==0) @@ -1630,7 +1634,9 @@ TYPEDEFPREFIX (("typedef"{BN}+)?)((("volatile"|"const"){BN}+)?) } <FindMembers>{B}*{TYPEDEFPREFIX}{IDLATTR}?"enum"({BN}+("class"|"struct"))?"{" | <FindMembers>{B}*{TYPEDEFPREFIX}{IDLATTR}?"enum"({BN}+("class"|"struct"))?{BN}+ { // for IDL: typedef [something] enum - isTypedef=((QCString)yytext).find("typedef")!=-1; + QCString text=yytext; + isTypedef = text.find("typedef")!=-1; + bool isStrongEnum = text.find("struct")!=-1 || text.find("class")!=-1; if (insideJava) { current->section = Entry::CLASS_SEC; @@ -1641,7 +1647,11 @@ TYPEDEFPREFIX (("typedef"{BN}+)?)((("volatile"|"const"){BN}+)?) current->section = Entry::ENUM_SEC ; } addType( current ) ; - current->type += " enum" ; + current->type += " enum"; + if (isStrongEnum) + { + current->spec |= Entry::Strong; + } current->fileName = yyFileName; current->startLine = yyLineNr; current->bodyLine = yyLineNr; @@ -2205,9 +2215,9 @@ TYPEDEFPREFIX (("typedef"{BN}+)?)((("volatile"|"const"){BN}+)?) } <IDLUnionCase>"::" <IDLUnionCase>":" { BEGIN(FindMembers); } -<IDLUnionCase>\n { yyLineNr++; } +<IDLUnionCase>\n { lineCount(); } <IDLUnionCase>. -<TryFunctionBlock>\n { yyLineNr++; } +<TryFunctionBlock>\n { lineCount(); } <TryFunctionBlock>"{" { curlyCount=0; lastCurlyContext = TryFunctionBlockEnd ; @@ -2274,12 +2284,12 @@ TYPEDEFPREFIX (("typedef"{BN}+)?)((("volatile"|"const"){BN}+)?) { current->program+=yytext; } - yyLineNr++; + lineCount(); BEGIN( lastPreLineCtrlContext ); } <SkipCPP>. -<SkipCPP>\\[\r]*"\n"[\r]* { yyLineNr++ ; } -<SkipCPP>[\r]*\n[\r]* { yyLineNr++ ; +<SkipCPP>\\[\r]*"\n"[\r]* { lineCount(); } +<SkipCPP>[\r]*\n[\r]* { lineCount(); BEGIN( lastCPPContext) ; } <Define>{ID}{B}*"(" { @@ -2310,7 +2320,7 @@ TYPEDEFPREFIX (("typedef"{BN}+)?)((("volatile"|"const"){BN}+)?) } <DefineEnd>\n { //printf("End define: doc=%s docFile=%s docLine=%d\n",current->doc.data(),current->docFile.data(),current->docLine); - yyLineNr++; + lineCount(); current->fileName = yyFileName; current->startLine = yyLineNr; current->type.resize(0); @@ -2341,7 +2351,7 @@ TYPEDEFPREFIX (("typedef"{BN}+)?)((("volatile"|"const"){BN}+)?) } <DefinePHPEnd>. <DefineEnd>\\[\r]?\n { - yyLineNr++; + lineCount(); } <DefineEnd>\" { if (insideIDL && insideCppQuote) @@ -2608,7 +2618,7 @@ TYPEDEFPREFIX (("typedef"{BN}+)?)((("volatile"|"const"){BN}+)?) } <ReadInitializer>\n { current->initializer+=*yytext; - yyLineNr++; + lineCount(); } <ReadInitializer>"@\"" { //printf("insideCS=%d\n",insideCS); @@ -2637,7 +2647,7 @@ TYPEDEFPREFIX (("typedef"{BN}+)?)((("volatile"|"const"){BN}+)?) } <SkipVerbString>\n { *pSkipVerbString+=*yytext; - yyLineNr++; + lineCount(); } <SkipVerbString>. { *pSkipVerbString+=*yytext; @@ -2669,7 +2679,7 @@ TYPEDEFPREFIX (("typedef"{BN}+)?)((("volatile"|"const"){BN}+)?) } <CopyString,CopyPHPString>\n { *pCopyQuotedString+=*yytext; - yyLineNr++; + lineCount(); } <CopyString,CopyPHPString>. { *pCopyQuotedString+=*yytext; @@ -2692,7 +2702,7 @@ TYPEDEFPREFIX (("typedef"{BN}+)?)((("volatile"|"const"){BN}+)?) } <CopyGString,CopyPHPGString>\n { *pCopyQuotedGString+=*yytext; - yyLineNr++; + lineCount(); } <CopyGString,CopyPHPGString>. { *pCopyQuotedGString+=*yytext; @@ -2715,7 +2725,7 @@ TYPEDEFPREFIX (("typedef"{BN}+)?)((("volatile"|"const"){BN}+)?) BEGIN(lastRoundContext); } <CopyRound>\n { - yyLineNr++; + lineCount(); *pCopyRoundString+=*yytext; } <CopyRound>\' { @@ -2765,7 +2775,7 @@ TYPEDEFPREFIX (("typedef"{BN}+)?)((("volatile"|"const"){BN}+)?) BEGIN(lastRoundContext); } <GCopyRound>\n { - yyLineNr++; + lineCount(); *pCopyRoundGString+=*yytext; } <GCopyRound>\' { @@ -2837,7 +2847,7 @@ TYPEDEFPREFIX (("typedef"{BN}+)?)((("volatile"|"const"){BN}+)?) } <CopyCurly>"/" { *pCopyCurlyString+=yytext; } <CopyCurly>\n { - yyLineNr++; + lineCount(); *pCopyCurlyString+=*yytext; } <CopyCurly>. { @@ -2855,6 +2865,7 @@ TYPEDEFPREFIX (("typedef"{BN}+)?)((("volatile"|"const"){BN}+)?) if (yytext[yyleng-1]=='\n') { yyLineNr++; + g_column=0; } } <GCopyCurly>\" { @@ -2895,7 +2906,7 @@ TYPEDEFPREFIX (("typedef"{BN}+)?)((("volatile"|"const"){BN}+)?) } <GCopyCurly>"/" { *pCopyCurlyGString+=yytext; } <GCopyCurly>\n { - yyLineNr++; + lineCount(); *pCopyCurlyGString+=*yytext; } <GCopyCurly>. { @@ -3165,7 +3176,7 @@ TYPEDEFPREFIX (("typedef"{BN}+)?)((("volatile"|"const"){BN}+)?) } } <SkipRemainder>\n { - yyLineNr++; + lineCount(); } <SkipRemainder>[^\n]* <FindFields>"," { @@ -3185,7 +3196,10 @@ TYPEDEFPREFIX (("typedef"{BN}+)?)((("volatile"|"const"){BN}+)?) current->section = Entry::VARIABLE_SEC; // add to the scope of the enum current_root->addSubEntry(current); - if (!insideCS && !insideJava) // for C# and Java 1.5+ enum values always have to be explicitly qualified + if (!insideCS && !insideJava && + !(current_root->spec&Entry::Strong)) + // for C# and Java 1.5+ enum values always have to be explicitly qualified, + // same for C++11 style enums (enum class Name {}) { current = new Entry(*current); // add to the scope surrounding the enum (copy!) @@ -3650,7 +3664,7 @@ TYPEDEFPREFIX (("typedef"{BN}+)?)((("volatile"|"const"){BN}+)?) lineCount(); } <FuncPtrOperator>\n { - yyLineNr++; + lineCount(); current->name += *yytext; } <FuncPtrOperator>"(" { @@ -3927,7 +3941,7 @@ TYPEDEFPREFIX (("typedef"{BN}+)?)((("volatile"|"const"){BN}+)?) BEGIN( lastCommentInArgContext ); } <CopyArgCommentLine>\n { fullArgString+=yytext; - yyLineNr++; + lineCount(); if (lastCopyArgChar!=0) unput(lastCopyArgChar); BEGIN( lastCommentInArgContext ); @@ -3963,7 +3977,7 @@ TYPEDEFPREFIX (("typedef"{BN}+)?)((("volatile"|"const"){BN}+)?) } <CopyArgCommentLine>[^\\\@\n]+ { fullArgString+=yytext; } <CopyArgCommentLine>. { fullArgString+=*yytext; } -<CopyArgComment,CopyArgVerbatim>\n { fullArgString+=*yytext; yyLineNr++; } +<CopyArgComment,CopyArgVerbatim>\n { fullArgString+=*yytext; lineCount(); } <CopyArgComment,CopyArgVerbatim>. { fullArgString+=*yytext; } <CopyArgComment>{CMD}("brief"|"short"){B}+ { warn(yyFileName,yyLineNr, @@ -4052,7 +4066,7 @@ TYPEDEFPREFIX (("typedef"{BN}+)?)((("volatile"|"const"){BN}+)?) } } <ReadFuncArgType,ReadTempArgs,CopyArgString,CopyArgPHPString,CopyArgRound,CopyArgSharp>\n { - yyLineNr++; + lineCount(); *copyArgString+=*yytext; fullArgString+=*yytext; } @@ -4167,7 +4181,7 @@ TYPEDEFPREFIX (("typedef"{BN}+)?)((("volatile"|"const"){BN}+)?) BEGIN(FuncQual); } <CliOverride>\n { - yyLineNr++; + lineCount(); } <CliOverride>. { } @@ -4208,7 +4222,7 @@ TYPEDEFPREFIX (("typedef"{BN}+)?)((("volatile"|"const"){BN}+)?) } <FuncPtrInit>\n { current->args += *yytext; - yyLineNr++; + lineCount(); } <FuncQual>{ID} { // typically a K&R style C function if (insideCS && strcmp(yytext,"where")==0) @@ -4307,7 +4321,7 @@ TYPEDEFPREFIX (("typedef"{BN}+)?)((("volatile"|"const"){BN}+)?) } <ExcpList>"\n" { current->exception += ' '; - yyLineNr++; + lineCount(); } <ExcpList>. { current->exception += *yytext; @@ -4567,7 +4581,7 @@ TYPEDEFPREFIX (("typedef"{BN}+)?)((("volatile"|"const"){BN}+)?) BEGIN( SkipCurlyCpp ); } <SkipCurly,SkipInits>\n { - yyLineNr++; + lineCount(); //addToBody(yytext); } <SkipCurly,SkipCurlyCpp>"<<<" { @@ -4582,17 +4596,18 @@ TYPEDEFPREFIX (("typedef"{BN}+)?)((("volatile"|"const"){BN}+)?) } } <SkipCurly,SkipCurlyCpp>[^\n#"'@\\/{}<]+ { + lineCount(); // for g_column updates //addToBody(yytext); } <SkipCurlyCpp>\n { //addToBody(yytext); - yyLineNr++; + lineCount(); lastCurlyContext = FindMembers; BEGIN( SkipCurly ); } <SkipCurlyCpp>\\[\r]*"\n"[\r]* { //addToBody(yytext); - yyLineNr++; + lineCount(); } <SkipInits,SkipCurly,SkipCurlyCpp>"/*" { //addToBody(yytext); @@ -4649,7 +4664,7 @@ TYPEDEFPREFIX (("typedef"{BN}+)?)((("volatile"|"const"){BN}+)?) } <SkipString,SkipPHPString>"/*"|"*/"|"//" { } <SkipString,SkipPHPString>\n { - yyLineNr++; + lineCount(); } <SkipString,SkipPHPString>. { } <CompoundName>":" { // for "class : public base {} var;" construct, see bug 608359 @@ -4745,7 +4760,7 @@ TYPEDEFPREFIX (("typedef"{BN}+)?)((("volatile"|"const"){BN}+)?) } BEGIN( FindMembers ); } -<CompoundName>{SCOPENAME}/"(" { +<CompoundName>{SCOPENAME}/{BN}*"(" { current->name = yytext ; lineCount(); if (current->spec & Entry::Protocol) @@ -4872,10 +4887,10 @@ TYPEDEFPREFIX (("typedef"{BN}+)?)((("volatile"|"const"){BN}+)?) if (insideObjC && *yytext=='(') // class category { current->name+='('; - if (current->section!=Entry::OBJCIMPL_SEC) - { + //if (current->section!=Entry::OBJCIMPL_SEC) + //{ current->spec|=Entry::Category; - } + //} BEGIN( ClassCategory ); } else @@ -4935,7 +4950,7 @@ TYPEDEFPREFIX (("typedef"{BN}+)?)((("volatile"|"const"){BN}+)?) } } <CSConstraintName,CSConstraintType>\n { - yyLineNr++; + lineCount(); } <CSConstraintName,CSConstraintType>. { } @@ -5121,7 +5136,7 @@ TYPEDEFPREFIX (("typedef"{BN}+)?)((("volatile"|"const"){BN}+)?) } else { - yyLineNr++; + lineCount(); unput('{'); } } @@ -5307,7 +5322,7 @@ TYPEDEFPREFIX (("typedef"{BN}+)?)((("volatile"|"const"){BN}+)?) BEGIN(ClassVar); } } -<SkipUnionSwitch>\n { yyLineNr++; } +<SkipUnionSwitch>\n { lineCount(); } <SkipUnionSwitch>. <Comment>{BN}+ { current->program += yytext ; lineCount() ; @@ -5373,15 +5388,12 @@ TYPEDEFPREFIX (("typedef"{BN}+)?)((("volatile"|"const"){BN}+)?) docBlockContext = YY_START; docBlockInBody = YY_START==SkipCurly; static bool javadocAutoBrief = Config_getBool("JAVADOC_AUTOBRIEF"); - static bool markdownSupport = Config_getBool("MARKDOWN_SUPPORT"); docBlockAutoBrief = javadocAutoBrief; docBlock.resize(0); - if (markdownSupport) - { - QCString indent; - indent.fill(' ',computeIndent(yytext,g_column)); - docBlock+=indent; - } + + QCString indent; + indent.fill(' ',computeIndent(yytext,g_column)); + docBlock+=indent; if (docBlockAutoBrief) { @@ -5495,7 +5507,7 @@ TYPEDEFPREFIX (("typedef"{BN}+)?)((("volatile"|"const"){BN}+)?) <CSAccessorDecl>"remove" { if (curlyCount==0) current->spec |= Entry::Removable; } <CSAccessorDecl>"raise" { if (curlyCount==0) current->spec |= Entry::Raisable; } <CSAccessorDecl>. {} -<CSAccessorDecl>\n { yyLineNr++; } +<CSAccessorDecl>\n { lineCount(); } @@ -5508,7 +5520,7 @@ TYPEDEFPREFIX (("typedef"{BN}+)?)((("volatile"|"const"){BN}+)?) <DocLine>[^\n]*"\n"[ \t]*"//"[/!] { // continuation of multiline C++-style comment docBlock+=yytext; docBlock.resize(docBlock.length() - 3); - yyLineNr++; + lineCount(); } <DocLine>[^\n]*/"\n" { // whole line docBlock+=yytext; @@ -5523,13 +5535,9 @@ TYPEDEFPREFIX (("typedef"{BN}+)?)((("volatile"|"const"){BN}+)?) BEGIN(docBlockContext); } <DocBlock>^{B}*("//")?{B}*"*"+/[^//a-z_A-Z0-9*] { // start of a comment line - static bool markdownSupport = Config_getBool("MARKDOWN_SUPPORT"); - if (markdownSupport) - { - QCString indent; - indent.fill(' ',computeIndent(yytext,0)); - docBlock+=indent; - } + QCString indent; + indent.fill(' ',computeIndent(yytext,g_column)); + docBlock+=indent; } <DocBlock>^{B}*("//"){B}* { // strip embedded C++ comments if at the start of a line } @@ -5578,7 +5586,7 @@ TYPEDEFPREFIX (("typedef"{BN}+)?)((("volatile"|"const"){BN}+)?) docBlock+=yytext; } <DocBlock>\n { // newline - yyLineNr++; + lineCount(); docBlock+=*yytext; } <DocBlock>. { // command block @@ -5632,7 +5640,7 @@ TYPEDEFPREFIX (("typedef"{BN}+)?)((("volatile"|"const"){BN}+)?) } <DocCopyBlock>\n { // newline docBlock+=*yytext; - yyLineNr++; + lineCount(); } <DocCopyBlock>. { // any other character docBlock+=*yytext; @@ -5727,14 +5735,14 @@ TYPEDEFPREFIX (("typedef"{BN}+)?)((("volatile"|"const"){BN}+)?) } else { - yyLineNr++; + lineCount(); } } <SkipCxxComment>.*/\n { BEGIN( lastCContext ) ; } <SkipComment>[^\*\n]+ -<*>\n { yyLineNr++ ; } +<*>\n { lineCount(); } <*>\" { if (insideIDL && insideCppQuote) { @@ -5819,7 +5827,7 @@ static void handleCommentBlock(const QCString &doc,bool brief) while (parseCommentBlock( g_thisParser, docBlockInBody && previous ? previous : current, - doc, // text + stripIndentation(doc), // text yyFileName, // file lineNr, // line of block start docBlockInBody ? FALSE : brief, // isBrief diff --git a/src/store.cpp b/src/store.cpp index b60520c..6d3b7d1 100644 --- a/src/store.cpp +++ b/src/store.cpp @@ -418,6 +418,7 @@ void Store::dumpBlock(portable_off_t s,portable_off_t e) } printf("\n"); } + delete[] buf; portable_fseek(m_file,m_cur,SEEK_SET); } diff --git a/src/textdocvisitor.cpp b/src/textdocvisitor.cpp index b0c3ec2..33cb3f4 100644 --- a/src/textdocvisitor.cpp +++ b/src/textdocvisitor.cpp @@ -35,6 +35,7 @@ void TextDocVisitor::visit(DocSymbol *s) case DocSymbol::Hash: m_t << "#"; break; case DocSymbol::DoubleColon: m_t << "::"; break; case DocSymbol::Percent: m_t << "%"; break; + case DocSymbol::Pipe: m_t << "|"; break; case DocSymbol::Copy: m_t << "©"; break; case DocSymbol::Tm: m_t << "&tm;"; break; case DocSymbol::Reg: m_t << "®"; break; @@ -58,6 +59,73 @@ void TextDocVisitor::visit(DocSymbol *s) case DocSymbol::Nbsp: m_t << " "; break; case DocSymbol::Aelig: m_t << "æ"; break; case DocSymbol::AElig: m_t << "Æ"; break; + case DocSymbol::GrkGamma: m_t << "Γ"; break; + case DocSymbol::GrkDelta: m_t << "Δ"; break; + case DocSymbol::GrkTheta: m_t << "Θ"; break; + case DocSymbol::GrkLambda: m_t << "Λ"; break; + case DocSymbol::GrkXi: m_t << "Ξ"; break; + case DocSymbol::GrkPi: m_t << "Π"; break; + case DocSymbol::GrkSigma: m_t << "Σ"; break; + case DocSymbol::GrkUpsilon: m_t << "Υ"; break; + case DocSymbol::GrkPhi: m_t << "Φ"; break; + case DocSymbol::GrkPsi: m_t << "Ψ"; break; + case DocSymbol::GrkOmega: m_t << "Ω"; break; + case DocSymbol::Grkalpha: m_t << "α"; break; + case DocSymbol::Grkbeta: m_t << "β"; break; + case DocSymbol::Grkgamma: m_t << "γ"; break; + case DocSymbol::Grkdelta: m_t << "δ"; break; + case DocSymbol::Grkepsilon: m_t << "ε"; break; + case DocSymbol::Grkzeta: m_t << "ζ"; break; + case DocSymbol::Grketa: m_t << "η"; break; + case DocSymbol::Grktheta: m_t << "θ"; break; + case DocSymbol::Grkiota: m_t << "ι"; break; + case DocSymbol::Grkkappa: m_t << "κ"; break; + case DocSymbol::Grklambda: m_t << "λ"; break; + case DocSymbol::Grkmu: m_t << "μ"; break; + case DocSymbol::Grknu: m_t << "ν"; break; + case DocSymbol::Grkxi: m_t << "ξ"; break; + case DocSymbol::Grkpi: m_t << "π"; break; + case DocSymbol::Grkrho: m_t << "ρ"; break; + case DocSymbol::Grksigma: m_t << "σ"; break; + case DocSymbol::Grktau: m_t << "τ"; break; + case DocSymbol::Grkupsilon: m_t << "υ"; break; + case DocSymbol::Grkphi: m_t << "φ"; break; + case DocSymbol::Grkchi: m_t << "χ"; break; + case DocSymbol::Grkpsi: m_t << "ψ"; break; + case DocSymbol::Grkomega: m_t << "ω"; break; + case DocSymbol::Grkvarsigma: m_t << "ς"; break; + case DocSymbol::Section: m_t << "§"; break; + case DocSymbol::Degree: m_t << "°"; break; + case DocSymbol::Prime: m_t << "′"; break; + case DocSymbol::DoublePrime: m_t << "″"; break; + case DocSymbol::Infinity: m_t << "∞"; break; + case DocSymbol::EmptySet: m_t << "∅"; break; + case DocSymbol::PlusMinus: m_t << "±"; break; + case DocSymbol::Times: m_t << "×"; break; + case DocSymbol::Minus: m_t << "−"; break; + case DocSymbol::CenterDot: m_t << "⋅"; break; + case DocSymbol::Partial: m_t << "∂"; break; + case DocSymbol::Nabla: m_t << "∇"; break; + case DocSymbol::SquareRoot: m_t << "√"; break; + case DocSymbol::Perpendicular: m_t << "⊥"; break; + case DocSymbol::Sum: m_t << "∑"; break; + case DocSymbol::Integral: m_t << "∫"; break; + case DocSymbol::Product: m_t << "∏"; break; + case DocSymbol::Similar: m_t << "∼"; break; + case DocSymbol::Approx: m_t << "≈"; break; + case DocSymbol::NotEqual: m_t << "≠"; break; + case DocSymbol::Equivalent: m_t << "≡"; break; + case DocSymbol::Proportional: m_t << "∝"; break; + case DocSymbol::LessEqual: m_t << "≤"; break; + case DocSymbol::GreaterEqual: m_t << "≥"; break; + case DocSymbol::LeftArrow: m_t << "←"; break; + case DocSymbol::RightArrow: m_t << "→"; break; + case DocSymbol::SetIn: m_t << "∈"; break; + case DocSymbol::SetNotIn: m_t << "∉"; break; + case DocSymbol::LeftCeil: m_t << "⌈"; break; + case DocSymbol::RightCeil: m_t << "⌉"; break; + case DocSymbol::LeftFloor: m_t << "⌊"; break; + case DocSymbol::RightFloor: m_t << "⌋"; break; default: err("error: unknown symbol found\n"); } diff --git a/src/translator_br.h b/src/translator_br.h index 0394e66..7a0fb76 100644 --- a/src/translator_br.h +++ b/src/translator_br.h @@ -113,7 +113,7 @@ class TranslatorBrazilian : public TranslatorAdapter_1_8_0 /*! put in the class documentation */ virtual QCString trListOfAllMembers() - { return "Lista de todos os Membros."; } + { return "Lista de todos os Membros"; } /*! used as the title of the "list of all members" page of a class */ virtual QCString trMemberList() diff --git a/src/translator_ca.h b/src/translator_ca.h index 39816fd..da76896 100644 --- a/src/translator_ca.h +++ b/src/translator_ca.h @@ -126,7 +126,7 @@ class TranslatorCatalan : public TranslatorAdapter_1_8_0 /*! put in the class documentation */ virtual QCString trListOfAllMembers() - { return "Llista de tots els membres."; } + { return "Llista de tots els membres"; } /*! used as the title of the "list of all members" page of a class */ virtual QCString trMemberList() diff --git a/src/translator_cn.h b/src/translator_cn.h index 6e0a2fd..103dd00 100644 --- a/src/translator_cn.h +++ b/src/translator_cn.h @@ -107,7 +107,7 @@ class TranslatorChinese : public Translator /*! put in the class documention */ virtual QCString trListOfAllMembers() - { return "所有成员列表."; } + { return "所有成员列表"; } /*! used as the title of the "list of all members" page of a class */ virtual QCString trMemberList() diff --git a/src/translator_cz.h b/src/translator_cz.h index 93e6a94..77675f9 100644 --- a/src/translator_cz.h +++ b/src/translator_cz.h @@ -148,7 +148,7 @@ class TranslatorCzech : public Translator /*! put in the class documentation */ virtual QCString trListOfAllMembers() - { return "Seznam všech členů."; } + { return "Seznam všech členů"; } /*! used as the title of the "list of all members" page of a class */ virtual QCString trMemberList() diff --git a/src/translator_dk.h b/src/translator_dk.h index f585f7f..0f15cf8 100644 --- a/src/translator_dk.h +++ b/src/translator_dk.h @@ -170,7 +170,7 @@ class TranslatorDanish : public TranslatorAdapter_1_8_0 /*! put in the class documentation */ virtual QCString trListOfAllMembers() - { return "Liste over alle medlemmer."; } + { return "Liste over alle medlemmer"; } /*! used as the title of the "list of all members" page of a class */ virtual QCString trMemberList() diff --git a/src/translator_en.h b/src/translator_en.h index 3ec8a49..76b03a7 100644 --- a/src/translator_en.h +++ b/src/translator_en.h @@ -126,7 +126,7 @@ class TranslatorEnglish : public Translator /*! put in the class documentation */ virtual QCString trListOfAllMembers() - { return "List of all members."; } + { return "List of all members"; } /*! used as the title of the "list of all members" page of a class */ virtual QCString trMemberList() @@ -555,7 +555,7 @@ class TranslatorEnglish : public Translator /*! this text is generated when the \\sa command is used. */ virtual QCString trSeeAlso() - { return "See also"; } + { return "See Also"; } /*! this text is generated when the \\param command is used. */ virtual QCString trParameters() diff --git a/src/translator_eo.h b/src/translator_eo.h index 25d15fe..be6f24d 100644 --- a/src/translator_eo.h +++ b/src/translator_eo.h @@ -127,7 +127,7 @@ class TranslatorEsperanto : public Translator /*! put in the class documentation */ virtual QCString trListOfAllMembers() - { return "Listo de ĉiuj membroj."; } + { return "Listo de ĉiuj membroj"; } /*! used as the title of the "list of all members" page of a class */ virtual QCString trMemberList() diff --git a/src/translator_es.h b/src/translator_es.h index 506a5d8..42c3f5b 100644 --- a/src/translator_es.h +++ b/src/translator_es.h @@ -119,7 +119,7 @@ class TranslatorSpanish : public Translator /*! put in the class documentation */ virtual QCString trListOfAllMembers() - { return "Lista de todos los miembros."; } + { return "Lista de todos los miembros"; } /*! used as the title of the "list of all members" page of a class */ virtual QCString trMemberList() diff --git a/src/translator_fa.h b/src/translator_fa.h index dbfafca..e74e123 100644 --- a/src/translator_fa.h +++ b/src/translator_fa.h @@ -142,7 +142,7 @@ class TranslatorPersian : public TranslatorAdapter_1_7_5 /*! put in the class documentation */ virtual QCString trListOfAllMembers() - { return "ليست تمام اعضاء ."; } + { return "ليست تمام اعضاء "; } /*! used as the title of the "list of all members" page of a class */ virtual QCString trMemberList() diff --git a/src/translator_fi.h b/src/translator_fi.h index 148b140..fdf4b94 100644 --- a/src/translator_fi.h +++ b/src/translator_fi.h @@ -182,7 +182,7 @@ class TranslatorFinnish : public TranslatorAdapter_1_6_0 /*! put in the class documentation */ virtual QCString trListOfAllMembers() - { return "Lista kaikista jäsenistä."; } // "List of all members." + { return "Lista kaikista jäsenistä"; } // "List of all members." virtual QCString trMemberList() /*! used as the title of the "list of all members" page of a class */ diff --git a/src/translator_gr.h b/src/translator_gr.h index 337b75c..6490e85 100644 --- a/src/translator_gr.h +++ b/src/translator_gr.h @@ -101,7 +101,7 @@ class TranslatorGreek : public TranslatorAdapter_1_8_0 /*! put in the class documentation */ virtual QCString trListOfAllMembers() - { return "Λίστα όλων των μελών."; } + { return "Λίστα όλων των μελών"; } /*! used as the title of the "list of all members" page of a class */ virtual QCString trMemberList() diff --git a/src/translator_hr.h b/src/translator_hr.h index b875868..8e8a46e 100644 --- a/src/translator_hr.h +++ b/src/translator_hr.h @@ -113,7 +113,7 @@ class TranslatorCroatian : public Translator QCString trMore() { return "Opširnije..."; } QCString trListOfAllMembers() - { return "Popis svih članova."; } + { return "Popis svih članova"; } QCString trMemberList() { return "Popis članova."; } QCString trThisIsTheListOfAllMembers() diff --git a/src/translator_hu.h b/src/translator_hu.h index 70d7186..3bed223 100644 --- a/src/translator_hu.h +++ b/src/translator_hu.h @@ -111,7 +111,7 @@ class TranslatorHungarian : public TranslatorAdapter_1_4_6 /*! put in the class documentation */ virtual QCString trListOfAllMembers() - { return "A tagok teljes listja."; } + { return "A tagok teljes listja"; } /*! used as the title of the "list of all members" page of a class */ virtual QCString trMemberList() diff --git a/src/translator_id.h b/src/translator_id.h index 6519b0f..cf9a475 100644 --- a/src/translator_id.h +++ b/src/translator_id.h @@ -109,7 +109,7 @@ class TranslatorIndonesian : public TranslatorAdapter_1_8_0 /*! put in the class documentation */ virtual QCString trListOfAllMembers() - { return "Daftar semua anggota."; } + { return "Daftar semua anggota"; } /*! used as the title of the "list of all members" page of a class */ virtual QCString trMemberList() diff --git a/src/translator_it.h b/src/translator_it.h index 9ef1d22..bc3cad8 100644 --- a/src/translator_it.h +++ b/src/translator_it.h @@ -159,7 +159,7 @@ class TranslatorItalian : public Translator /*! put in the class documentation */ QCString trListOfAllMembers() - { return "Elenco di tutti i membri."; } + { return "Elenco di tutti i membri"; } /*! used as the title of the "list of all members" page of a class */ QCString trMemberList() diff --git a/src/translator_kr.h b/src/translator_kr.h index acaf8ee..3158405 100644 --- a/src/translator_kr.h +++ b/src/translator_kr.h @@ -1883,6 +1883,59 @@ class TranslatorKorean : public TranslatorAdapter_1_7_5 return sdate; } +////////////////////////////////////////////////////////////////////////// +// new since 1.7.5 +////////////////////////////////////////////////////////////////////////// + + /*! Header for the page with bibliographic citations */ + virtual QCString trCiteReferences() + { return " "; } + + /*! Text for copyright paragraph */ + virtual QCString trCopyright() + { return "Copyright"; } + + /*! Header for the graph showing the directory dependencies */ + virtual QCString trDirDepGraph(const char *name) + { return QCString(name) + QCString(" 丮 :"); } + +////////////////////////////////////////////////////////////////////////// +// new since 1.8.0 +////////////////////////////////////////////////////////////////////////// + + /*! Detail level selector shown for hierarchical indices */ + virtual QCString trDetailLevel() + { return " ܰ"; } + + /*! Section header for list of template parameters */ + virtual QCString trTemplateParameters() + { return "ø Ķ"; } + + /*! Used in dot graph when UML_LOOK is enabled and there are many fields */ + virtual QCString trAndMore(const QCString &number) + { return QCString(" ")+number+" ..."; } + + /*! Used file list for a Java enum */ + virtual QCString trEnumGeneratedFromFiles(bool /*single*/) + { QCString result = " ()κ Ǿϴ.:"; + return result; + } + + /*! Header of a Java enum page (Java enums are represented as classes). */ + virtual QCString trEnumReference(const char *name) + { return QCString(name)+" Enum Reference"; } + + /*! Used for a section containing inherited members */ + virtual QCString trInheritedFrom(const char *members,const char *what) + { return QCString(what) + QCString("()κ ӵ ") + QCString(members); } + + /*! Header of the sections with inherited members specific for the + * base class(es) + */ + virtual QCString trAdditionalInheritedMembers() + { return "߰ ӵ "; } + +////////////////////////////////////////////////////////////////////////// }; diff --git a/src/translator_lt.h b/src/translator_lt.h index 3f1bcb6..6dd1832 100644 --- a/src/translator_lt.h +++ b/src/translator_lt.h @@ -118,7 +118,7 @@ class TranslatorLithuanian : public TranslatorAdapter_1_4_6 /*! put in the class documentation */ virtual QCString trListOfAllMembers() - { return "Vis nari sraas."; } + { return "Vis nari sraas"; } /*! used as the title of the "list of all members" page of a class */ virtual QCString trMemberList() diff --git a/src/translator_mk.h b/src/translator_mk.h index d656609..b5d8dcb 100644 --- a/src/translator_mk.h +++ b/src/translator_mk.h @@ -113,7 +113,7 @@ class TranslatorMacedonian : public TranslatorAdapter_1_6_0 /*! put in the class documentation */ virtual QCString trListOfAllMembers() - { return "Список на сите членови."; } + { return "Список на сите членови"; } /*! used as the title of the "list of all members" page of a class */ virtual QCString trMemberList() diff --git a/src/translator_nl.h b/src/translator_nl.h index f88c942..b966760 100644 --- a/src/translator_nl.h +++ b/src/translator_nl.h @@ -61,7 +61,7 @@ class TranslatorDutch : public Translator QCString trMore() { return "Meer..."; } QCString trListOfAllMembers() - { return "Lijst van alle members."; } + { return "Lijst van alle members"; } QCString trMemberList() { return "Member Lijst"; } QCString trThisIsTheListOfAllMembers() diff --git a/src/translator_no.h b/src/translator_no.h index 29b2648..cffaa09 100644 --- a/src/translator_no.h +++ b/src/translator_no.h @@ -129,7 +129,7 @@ class TranslatorNorwegian : public TranslatorAdapter_1_4_6 /*! put in the class documentation */ virtual QCString trListOfAllMembers() - { return "Liste over alle medlemmer."; } + { return "Liste over alle medlemmer"; } /*! used as the title of the "list of all members" page of a class */ virtual QCString trMemberList() diff --git a/src/translator_pl.h b/src/translator_pl.h index 6dd8f0e..2e7bf05 100644 --- a/src/translator_pl.h +++ b/src/translator_pl.h @@ -99,7 +99,7 @@ class TranslatorPolish : public Translator /*! put in the class documentation */ QCString trListOfAllMembers() - { return "Lista wszystkich składowych."; } + { return "Lista wszystkich składowych"; } /*! used as the title of the "list of all members" page of a class */ QCString trMemberList() diff --git a/src/translator_ro.h b/src/translator_ro.h index 22b769d..42f0224 100644 --- a/src/translator_ro.h +++ b/src/translator_ro.h @@ -126,7 +126,7 @@ class TranslatorRomanian : public TranslatorAdapter_1_6_0 /*! put in the class documentation */ virtual QCString trListOfAllMembers() - { return "Lista tuturor membrilor."; } + { return "Lista tuturor membrilor"; } /*! used as the title of the "list of all members" page of a class */ virtual QCString trMemberList() diff --git a/src/translator_sc.h b/src/translator_sc.h index 6555cf5..2ea2091 100644 --- a/src/translator_sc.h +++ b/src/translator_sc.h @@ -125,7 +125,7 @@ class TranslatorSerbianCyrilic : public TranslatorAdapter_1_6_0 /*! put in the class documentation */ virtual QCString trListOfAllMembers() - { return "Списак свих чланова."; } + { return "Списак свих чланова"; } /*! used as the title of the "list of all members" page of a class */ virtual QCString trMemberList() diff --git a/src/translator_si.h b/src/translator_si.h index 5d0182a..8be0cd4 100644 --- a/src/translator_si.h +++ b/src/translator_si.h @@ -66,7 +66,7 @@ class TranslatorSlovene : public TranslatorAdapter_1_4_6 QCString trMore() { return "..."; } QCString trListOfAllMembers() - { return "Seznam vseh metod / atributov."; } + { return "Seznam vseh metod / atributov"; } QCString trMemberList() { return " - seznam metod in atributov."; } QCString trThisIsTheListOfAllMembers() diff --git a/src/translator_sk.h b/src/translator_sk.h index 5881c88..19d5358 100644 --- a/src/translator_sk.h +++ b/src/translator_sk.h @@ -92,7 +92,7 @@ class TranslatorSlovak : public Translator /*! put in the class documentation */ virtual QCString trListOfAllMembers() - { return "Zoznam všetkých členov."; } + { return "Zoznam všetkých členov"; } /*! used as the title of the "list of all members" page of a class */ virtual QCString trMemberList() diff --git a/src/translator_sr.h b/src/translator_sr.h index a04be56..b12f87c 100644 --- a/src/translator_sr.h +++ b/src/translator_sr.h @@ -128,7 +128,7 @@ private: /*! put in the class documentation */ virtual QCString trListOfAllMembers() - { return decode( "Spisak svih članova." ); } + { return decode( "Spisak svih članova" ); } /*! used as the title of the "list of all members" page of a class */ virtual QCString trMemberList() diff --git a/src/translator_sv.h b/src/translator_sv.h index f262eda..d6eeff7 100644 --- a/src/translator_sv.h +++ b/src/translator_sv.h @@ -135,7 +135,7 @@ class TranslatorSwedish : public TranslatorAdapter_1_6_0 { return "Mer..."; } virtual QCString trListOfAllMembers() - { return "Lista ver alla medlemmar."; } + { return "Lista ver alla medlemmar"; } virtual QCString trMemberList() { return "Medlemslista"; } diff --git a/src/translator_tr.h b/src/translator_tr.h index 5906364..83af116 100644 --- a/src/translator_tr.h +++ b/src/translator_tr.h @@ -125,7 +125,7 @@ class TranslatorTurkish : public TranslatorAdapter_1_7_5 /*! put in the class documentation */ virtual QCString trListOfAllMembers() - { return "Tüm üyelerin listesi."; } + { return "Tüm üyelerin listesi"; } /*! used as the title of the "list of all members" page of a class */ virtual QCString trMemberList() diff --git a/src/translator_vi.h b/src/translator_vi.h index 971f12b..d7984a9 100644 --- a/src/translator_vi.h +++ b/src/translator_vi.h @@ -132,7 +132,7 @@ class TranslatorVietnamese : public TranslatorAdapter_1_6_0 /*! put in the class documentation */ virtual QCString trListOfAllMembers() - { return "Liệt kê tất cả các thành viên."; } + { return "Liệt kê tất cả các thành viên"; } /*! used as the title of the "list of all members" page of a class */ virtual QCString trMemberList() diff --git a/src/translator_za.h b/src/translator_za.h index 46f5a05..b3084c6 100644 --- a/src/translator_za.h +++ b/src/translator_za.h @@ -113,7 +113,7 @@ class TranslatorAfrikaans : public TranslatorAdapter_1_6_0 /*! put in the class documentation */ virtual QCString trListOfAllMembers() - { return "Lys van alle lede."; } + { return "Lys van alle lede"; } /*! used as the title of the "list of all members" page of a class */ virtual QCString trMemberList() diff --git a/src/util.cpp b/src/util.cpp index 4ea20a7..b77b32c 100644 --- a/src/util.cpp +++ b/src/util.cpp @@ -2422,16 +2422,6 @@ int minClassDistance(const ClassDef *cd,const ClassDef *bcd,int level) int m=maxInheritanceDepth; if (cd->baseClasses()) { -#if 0 - BaseClassListIterator bcli(*cd->baseClasses()); - for ( ; bcli.current() ; ++bcli) - { - //printf("class %s base class %s\n",cd->name().data(),bcli.current()->classDef->name().data()); - int mc=minClassDistance(bcli.current()->classDef,bcd,level+1); - if (mc<m) m=mc; - if (m<0) break; - } -#endif BaseClassDef *bcdi = cd->baseClasses()->first(); while (bcdi) { @@ -2444,6 +2434,38 @@ int minClassDistance(const ClassDef *cd,const ClassDef *bcd,int level) return m; } +Protection classInheritedProtectionLevel(ClassDef *cd,ClassDef *bcd,Protection prot,int level) +{ + if (bcd->categoryOf()) // use class that is being extended in case of + // an Objective-C category + { + bcd=bcd->categoryOf(); + } + if (cd==bcd) + { + goto exit; + } + if (level==256) + { + err("error: Internal inconsistency: found class %s seem to have a recursive " + "inheritance relation! Please send a bug report to dimitri@stack.nl\n",cd->name().data()); + } + else if (cd->baseClasses()) + { + BaseClassDef *bcdi = cd->baseClasses()->first(); + while (bcdi && prot!=Private) + { + Protection baseProt = classInheritedProtectionLevel(bcdi->classDef,bcd,bcdi->prot,level+1); + if (baseProt==Private) prot=Private; + else if (baseProt==Protected) prot=Protected; + bcdi = cd->baseClasses()->next(); + } + } +exit: + //printf("classInheritedProtectionLevel(%s,%s)=%d\n",cd->name().data(),bcd->name().data(),prot); + return prot; +} + //static void printArgList(ArgumentList *al) //{ // if (al==0) return; @@ -5386,77 +5408,144 @@ QCString convertToJSString(const char *s) QCString convertCharEntitiesToUTF8(const QCString &s) { - static QDict<char> entityMap(67); + static QDict<char> entityMap(127); static bool init=TRUE; QCString result; static QRegExp entityPat("&[a-zA-Z]+;"); if (init) { - entityMap.insert("copy", "\xC2\xA9"); - entityMap.insert("tm", "\xE2\x84\xA2"); - entityMap.insert("trade", "\xE2\x84\xA2"); - entityMap.insert("reg", "\xC2\xAE"); - entityMap.insert("lsquo", "\xE2\x80\x98"); - entityMap.insert("rsquo", "\xE2\x80\x99"); - entityMap.insert("ldquo", "\xE2\x80\x9C"); - entityMap.insert("rdquo", "\xE2\x80\x9D"); - entityMap.insert("ndash", "\xE2\x80\x93"); - entityMap.insert("mdash", "\xE2\x80\x94"); - entityMap.insert("Auml", "\xC3\x84"); - entityMap.insert("Euml", "\xC3\x8B"); - entityMap.insert("Iuml", "\xC3\x8F"); - entityMap.insert("Ouml", "\xC3\x96"); - entityMap.insert("Uuml", "\xC3\x9C"); - entityMap.insert("Yuml", "\xC5\xB8"); - entityMap.insert("auml", "\xC3\xA4"); - entityMap.insert("euml", "\xC3\xAB"); - entityMap.insert("iuml", "\xC3\xAF"); - entityMap.insert("ouml", "\xC3\xB6"); - entityMap.insert("uuml", "\xC3\xBC"); - entityMap.insert("yuml", "\xC3\xBF"); - entityMap.insert("Aacute","\xC3\x81"); - entityMap.insert("Eacute","\xC3\x89"); - entityMap.insert("Iacute","\xC3\x8D"); - entityMap.insert("Oacute","\xC3\x93"); - entityMap.insert("Uacute","\xC3\x9A"); - entityMap.insert("aacute","\xC3\xA1"); - entityMap.insert("eacute","\xC3\xA9"); - entityMap.insert("iacute","\xC3\xAD"); - entityMap.insert("oacute","\xC3\xB3"); - entityMap.insert("uacute","\xC3\xBA"); - entityMap.insert("Agrave","\xC3\x80"); - entityMap.insert("Egrave","\xC3\x88"); - entityMap.insert("Igrave","\xC3\x8C"); - entityMap.insert("Ograve","\xC3\x92"); - entityMap.insert("Ugrave","\xC3\x99"); - entityMap.insert("agrave","\xC3\xA0"); - entityMap.insert("egrave","\xC3\xA8"); - entityMap.insert("igrave","\xC3\xAC"); - entityMap.insert("ograve","\xC3\xB2"); - entityMap.insert("ugrave","\xC3\xB9"); - entityMap.insert("Acirc", "\xC3\x82"); - entityMap.insert("Ecirc", "\xC3\x8A"); - entityMap.insert("Icirc", "\xC3\x8E"); - entityMap.insert("Ocirc", "\xC3\x94"); - entityMap.insert("Ucirc", "\xC3\x9B"); - entityMap.insert("acirc", "\xC3\xA2"); - entityMap.insert("ecirc", "\xC3\xAA"); - entityMap.insert("icirc", "\xC3\xAE"); - entityMap.insert("ocirc", "\xC3\xB4"); - entityMap.insert("ucirc", "\xC3\xBB"); - entityMap.insert("Atilde","\xC3\x83"); - entityMap.insert("Ntilde","\xC3\x91"); - entityMap.insert("Otilde","\xC3\x95"); - entityMap.insert("atilde","\xC3\xA3"); - entityMap.insert("ntilde","\xC3\xB1"); - entityMap.insert("otilde","\xC3\xB5"); - entityMap.insert("szlig", "\xC3\x9F"); - entityMap.insert("Ccedil","\xC3\x87"); - entityMap.insert("ccedil","\xC3\xA7"); - entityMap.insert("Aring", "\xC3\x85"); - entityMap.insert("aring", "\xC3\xA5"); - entityMap.insert("nbsp", "\xC2\xA0"); + entityMap.insert("copy", "\xC2\xA9"); + entityMap.insert("tm", "\xE2\x84\xA2"); + entityMap.insert("trade", "\xE2\x84\xA2"); + entityMap.insert("reg", "\xC2\xAE"); + entityMap.insert("lsquo", "\xE2\x80\x98"); + entityMap.insert("rsquo", "\xE2\x80\x99"); + entityMap.insert("ldquo", "\xE2\x80\x9C"); + entityMap.insert("rdquo", "\xE2\x80\x9D"); + entityMap.insert("ndash", "\xE2\x80\x93"); + entityMap.insert("mdash", "\xE2\x80\x94"); + entityMap.insert("Auml", "\xC3\x84"); + entityMap.insert("Euml", "\xC3\x8B"); + entityMap.insert("Iuml", "\xC3\x8F"); + entityMap.insert("Ouml", "\xC3\x96"); + entityMap.insert("Uuml", "\xC3\x9C"); + entityMap.insert("Yuml", "\xC5\xB8"); + entityMap.insert("auml", "\xC3\xA4"); + entityMap.insert("euml", "\xC3\xAB"); + entityMap.insert("iuml", "\xC3\xAF"); + entityMap.insert("ouml", "\xC3\xB6"); + entityMap.insert("uuml", "\xC3\xBC"); + entityMap.insert("yuml", "\xC3\xBF"); + entityMap.insert("Aacute", "\xC3\x81"); + entityMap.insert("Eacute", "\xC3\x89"); + entityMap.insert("Iacute", "\xC3\x8D"); + entityMap.insert("Oacute", "\xC3\x93"); + entityMap.insert("Uacute", "\xC3\x9A"); + entityMap.insert("aacute", "\xC3\xA1"); + entityMap.insert("eacute", "\xC3\xA9"); + entityMap.insert("iacute", "\xC3\xAD"); + entityMap.insert("oacute", "\xC3\xB3"); + entityMap.insert("uacute", "\xC3\xBA"); + entityMap.insert("Agrave", "\xC3\x80"); + entityMap.insert("Egrave", "\xC3\x88"); + entityMap.insert("Igrave", "\xC3\x8C"); + entityMap.insert("Ograve", "\xC3\x92"); + entityMap.insert("Ugrave", "\xC3\x99"); + entityMap.insert("agrave", "\xC3\xA0"); + entityMap.insert("egrave", "\xC3\xA8"); + entityMap.insert("igrave", "\xC3\xAC"); + entityMap.insert("ograve", "\xC3\xB2"); + entityMap.insert("ugrave", "\xC3\xB9"); + entityMap.insert("Acirc", "\xC3\x82"); + entityMap.insert("Ecirc", "\xC3\x8A"); + entityMap.insert("Icirc", "\xC3\x8E"); + entityMap.insert("Ocirc", "\xC3\x94"); + entityMap.insert("Ucirc", "\xC3\x9B"); + entityMap.insert("acirc", "\xC3\xA2"); + entityMap.insert("ecirc", "\xC3\xAA"); + entityMap.insert("icirc", "\xC3\xAE"); + entityMap.insert("ocirc", "\xC3\xB4"); + entityMap.insert("ucirc", "\xC3\xBB"); + entityMap.insert("Atilde", "\xC3\x83"); + entityMap.insert("Ntilde", "\xC3\x91"); + entityMap.insert("Otilde", "\xC3\x95"); + entityMap.insert("atilde", "\xC3\xA3"); + entityMap.insert("ntilde", "\xC3\xB1"); + entityMap.insert("otilde", "\xC3\xB5"); + entityMap.insert("szlig", "\xC3\x9F"); + entityMap.insert("Ccedil", "\xC3\x87"); + entityMap.insert("ccedil", "\xC3\xA7"); + entityMap.insert("Aring", "\xC3\x85"); + entityMap.insert("aring", "\xC3\xA5"); + entityMap.insert("nbsp", "\xC2\xA0"); + entityMap.insert("Gamma", "\xCE\x93"); + entityMap.insert("Delta", "\xCE\x94"); + entityMap.insert("Theta", "\xCE\x98"); + entityMap.insert("Lambda", "\xCE\x9B"); + entityMap.insert("Xi", "\xCE\x9E"); + entityMap.insert("Pi", "\xCE\xA0"); + entityMap.insert("Sigma", "\xCE\xA3"); + entityMap.insert("Upsilon", "\xCE\xA5"); + entityMap.insert("Phi", "\xCE\xA6"); + entityMap.insert("Psi", "\xCE\xA8"); + entityMap.insert("Omega", "\xCE\xA9"); + entityMap.insert("alpha", "\xCE\xB1"); + entityMap.insert("beta", "\xCE\xB2"); + entityMap.insert("gamma", "\xCE\xB3"); + entityMap.insert("delta", "\xCE\xB4"); + entityMap.insert("epsilon", "\xCE\xB5"); + entityMap.insert("zeta", "\xCE\xB6"); + entityMap.insert("eta", "\xCE\xB8"); + entityMap.insert("theta", "\xCE\xB8"); + entityMap.insert("iota", "\xCE\xB9"); + entityMap.insert("kappa", "\xCE\xBA"); + entityMap.insert("lambda", "\xCE\xBB"); + entityMap.insert("mu", "\xCE\xBC"); + entityMap.insert("nu", "\xCE\xBD"); + entityMap.insert("xi", "\xCE\xBE"); + entityMap.insert("pi", "\xCF\x80"); + entityMap.insert("rho", "\xCF\x81"); + entityMap.insert("sigma", "\xCF\x83"); + entityMap.insert("tau", "\xCF\x84"); + entityMap.insert("upsilon", "\xCF\x85"); + entityMap.insert("phi", "\xCF\x86"); + entityMap.insert("chi", "\xCF\x87"); + entityMap.insert("psi", "\xCF\x88"); + entityMap.insert("omega", "\xCF\x89"); + entityMap.insert("sigmaf", "\xCF\x82"); + entityMap.insert("sect", "\xC2\xA7"); + entityMap.insert("deg", "\xC2\xB0"); + entityMap.insert("prime", "\xE2\x80\xB2"); + entityMap.insert("Prime", "\xE2\x80\xB2"); + entityMap.insert("infin", "\xE2\x88\x9E"); + entityMap.insert("empty", "\xE2\x88\x85"); + entityMap.insert("plusmn", "\xC2\xB1"); + entityMap.insert("times", "\xC3\x97"); + entityMap.insert("minus", "\xE2\x88\x92"); + entityMap.insert("sdot", "\xE2\x8B\x85"); + entityMap.insert("part", "\xE2\x88\x82"); + entityMap.insert("nabla", "\xE2\x88\x87"); + entityMap.insert("radic", "\xE2\x88\x9A"); + entityMap.insert("perp", "\xE2\x8A\xA5"); + entityMap.insert("sum", "\xE2\x88\x91"); + entityMap.insert("int", "\xE2\x88\xAB"); + entityMap.insert("prod", "\xE2\x88\x8F"); + entityMap.insert("sim", "\xE2\x88\xBC"); + entityMap.insert("asymp", "\xE2\x89\x88"); + entityMap.insert("ne", "\xE2\x89\xA0"); + entityMap.insert("equiv", "\xE2\x89\xA1"); + entityMap.insert("prop", "\xE2\x88\x9D"); + entityMap.insert("le", "\xE2\x89\xA4"); + entityMap.insert("ge", "\xE2\x89\xA5"); + entityMap.insert("larr", "\xE2\x86\x90"); + entityMap.insert("rarr", "\xE2\x86\x92"); + entityMap.insert("isin", "\xE2\x88\x88"); + entityMap.insert("notin", "\xE2\x88\x89"); + entityMap.insert("lceil", "\xE2\x8C\x88"); + entityMap.insert("rceil", "\xE2\x8C\x89"); + entityMap.insert("lfloor", "\xE2\x8C\x8A"); + entityMap.insert("rfloor", "\xE2\x8C\x8B"); init=FALSE; } @@ -6596,7 +6685,7 @@ QCString parseCommentAsText(const Definition *scope,const MemberDef *md, root->accept(visitor); delete visitor; delete root; - QCString result = s.data(); + QCString result = convertCharEntitiesToUTF8(s.data()); int i=0; int charCnt=0; int l=result.length(); @@ -7114,8 +7203,9 @@ bool patternMatch(const QFileInfo &fi,const QStrList *patList) return found; } +#if 0 // move to HtmlGenerator::writeSummaryLink void writeSummaryLink(OutputList &ol,const char *label,const char *title, - bool &first) + bool &first,const char *file) { if (first) { @@ -7126,12 +7216,22 @@ void writeSummaryLink(OutputList &ol,const char *label,const char *title, { ol.writeString(" |\n"); } - ol.writeString("<a href=\"#"); - ol.writeString(label); + if (file) + { + ol.writeString("<a href=\""); + ol.writeString(file); + ol.writeString(Doxygen::htmlFileExtension); + } + else + { + ol.writeString("<a href=\"#"); + ol.writeString(label); + } ol.writeString("\">"); ol.writeString(title); ol.writeString("</a>"); } +#endif QCString externalLinkTarget() { @@ -7381,3 +7481,85 @@ bool protectionLevelVisible(Protection prot) (prot==Package && extractPackage); } +//--------------------------------------------------------------------------- + +QCString stripIndentation(const QCString &s) +{ + if (s.isEmpty()) return s; // empty string -> we're done + + //printf("stripIndentation:\n%s\n------\n",s.data()); + // compute minimum indentation over all lines + const char *p=s.data(); + char c; + int indent=0; + int minIndent=1000000; // "infinite" + bool searchIndent=TRUE; + static int tabSize=Config_getInt("TAB_SIZE"); + while ((c=*p++)) + { + if (c=='\t') indent+=tabSize - (indent%tabSize); + else if (c=='\n') indent=0,searchIndent=TRUE; + else if (c==' ') indent++; + else if (searchIndent) + { + searchIndent=FALSE; + if (indent<minIndent) minIndent=indent; + } + } + + // no indent to remove -> we're done + if (minIndent==0) return s; + + // remove minimum indentation for each line + QGString result; + p=s.data(); + indent=0; + while ((c=*p++)) + { + if (c=='\n') // start of new line + { + indent=0; + result+=c; + } + else if (indent<minIndent) // skip until we reach minIndent + { + if (c=='\t') + { + int newIndent = indent+tabSize-(indent%tabSize); + int i=newIndent; + while (i>minIndent) // if a tab crosses the minIndent boundary fill the rest with spaces + { + result+=' '; + i--; + } + indent=newIndent; + } + else // space + { + indent++; + } + } + else // copy anything until the end of the line + { + result+=c; + } + } + + result+='\0'; + return result.data(); +} + + +bool fileVisibleInIndex(FileDef *fd,bool &genSourceFile) +{ + static bool allExternals = Config_getBool("ALLEXTERNALS"); + bool isDocFile = fd->isDocumentationFile(); + genSourceFile = !isDocFile && fd->generateSourceFile(); + return ( ((allExternals && fd->isLinkable()) || + fd->isLinkableInProject() + ) && + !isDocFile + ); +} + + @@ -234,6 +234,7 @@ void initClassHierarchy(ClassSDict *cl); bool hasVisibleRoot(BaseClassList *bcl); int minClassDistance(const ClassDef *cd,const ClassDef *bcd,int level=0); +Protection classInheritedProtectionLevel(ClassDef *cd,ClassDef *bcd,Protection prot=Public,int level=0); QCString convertNameToFile(const char *name,bool allowDots=FALSE,bool allowUnderscore=FALSE); @@ -376,9 +377,6 @@ QCString filterTitle(const QCString &title); bool patternMatch(const QFileInfo &fi,const QStrList *patList); -void writeSummaryLink(OutputList &ol,const char *label,const char *title, - bool &first); - QCString externalLinkTarget(); QCString externalRef(const QCString &relPath,const QCString &ref,bool href); int nextUtf8CharPosition(const QCString &utf8Str,int len,int startPos); @@ -405,5 +403,9 @@ QCString processMarkup(const QCString &s); bool protectionLevelVisible(Protection prot); +QCString stripIndentation(const QCString &s); + +bool fileVisibleInIndex(FileDef *fd,bool &genSourceFile); + #endif diff --git a/src/vhdldocgen.cpp b/src/vhdldocgen.cpp index ab0d243..5321e47 100644 --- a/src/vhdldocgen.cpp +++ b/src/vhdldocgen.cpp @@ -112,11 +112,11 @@ static void codify(FTextStream &t,const char *str) static void createSVG() { QCString ov =Config_getString("HTML_OUTPUT"); - QCString dir="-o "+ov+"/vhdl_design_overview.html"; - ov+="/vhdl_design.dot "; + QCString dir="-o \""+ov+"/vhdl_design_overview.html\""; + ov+="/vhdl_design.dot"; QRegExp ep("[\\s]"); - QCString vlargs="-Tsvg "+ov+dir ; + QCString vlargs="-Tsvg \""+ov+"\" "+dir ; if (portable_system("dot",vlargs)!=0) { diff --git a/src/xmldocvisitor.cpp b/src/xmldocvisitor.cpp index 506a484..f82e9d6 100644 --- a/src/xmldocvisitor.cpp +++ b/src/xmldocvisitor.cpp @@ -69,38 +69,106 @@ void XmlDocVisitor::visit(DocSymbol *s) if (m_hide) return; switch(s->symbol()) { - case DocSymbol::BSlash: m_t << "\\"; break; - case DocSymbol::At: m_t << "@"; break; - case DocSymbol::Less: m_t << "<"; break; - case DocSymbol::Greater: m_t << ">"; break; - case DocSymbol::Amp: m_t << "&"; break; - case DocSymbol::Dollar: m_t << "$"; break; - case DocSymbol::Hash: m_t << "#"; break; - case DocSymbol::DoubleColon: m_t << "::"; break; - case DocSymbol::Percent: m_t << "%"; break; - case DocSymbol::Copy: m_t << "<copy/>"; break; - case DocSymbol::Tm: m_t << "<trademark/>"; break; - case DocSymbol::Reg: m_t << "<registered/>"; break; - case DocSymbol::Apos: m_t << "'"; break; - case DocSymbol::Quot: m_t << "\""; break; - case DocSymbol::Lsquo: m_t << "<lsquo/>"; break; - case DocSymbol::Rsquo: m_t << "<rsquo/>"; break; - case DocSymbol::Ldquo: m_t << "<ldquo/>"; break; - case DocSymbol::Rdquo: m_t << "<rdquo/>"; break; - case DocSymbol::Ndash: m_t << "<ndash/>"; break; - case DocSymbol::Mdash: m_t << "<mdash/>"; break; - case DocSymbol::Uml: m_t << "<umlaut char=\"" << s->letter() << "\"/>"; break; - case DocSymbol::Acute: m_t << "<acute char=\"" << s->letter() << "\"/>"; break; - case DocSymbol::Grave: m_t << "<grave char=\"" << s->letter() << "\"/>"; break; - case DocSymbol::Circ: m_t << "<circ char=\"" << s->letter() << "\"/>"; break; - case DocSymbol::Tilde: m_t << "<tilde char=\"" << s->letter() << "\"/>"; break; - case DocSymbol::Szlig: m_t << "<szlig/>"; break; - case DocSymbol::Cedil: m_t << "<cedil char=\"" << s->letter() << "\"/>"; break; - case DocSymbol::Ring: m_t << "<ring char=\"" << s->letter() << "\"/>"; break; - case DocSymbol::Slash: m_t << "<slash char=\"" << s->letter() << "\"/>"; break; - case DocSymbol::Nbsp: m_t << "<nonbreakablespace/>"; break; - case DocSymbol::Aelig: m_t << "<aelig/>"; break; - case DocSymbol::AElig: m_t << "<AElig/>"; break; + case DocSymbol::BSlash: m_t << "\\"; break; + case DocSymbol::At: m_t << "@"; break; + case DocSymbol::Less: m_t << "<"; break; + case DocSymbol::Greater: m_t << ">"; break; + case DocSymbol::Amp: m_t << "&"; break; + case DocSymbol::Dollar: m_t << "$"; break; + case DocSymbol::Hash: m_t << "#"; break; + case DocSymbol::DoubleColon: m_t << "::"; break; + case DocSymbol::Percent: m_t << "%"; break; + case DocSymbol::Pipe: m_t << "|"; break; + case DocSymbol::Copy: m_t << "<copy/>"; break; + case DocSymbol::Tm: m_t << "<trademark/>"; break; + case DocSymbol::Reg: m_t << "<registered/>"; break; + case DocSymbol::Apos: m_t << "'"; break; + case DocSymbol::Quot: m_t << "\""; break; + case DocSymbol::Lsquo: m_t << "<lsquo/>"; break; + case DocSymbol::Rsquo: m_t << "<rsquo/>"; break; + case DocSymbol::Ldquo: m_t << "<ldquo/>"; break; + case DocSymbol::Rdquo: m_t << "<rdquo/>"; break; + case DocSymbol::Ndash: m_t << "<ndash/>"; break; + case DocSymbol::Mdash: m_t << "<mdash/>"; break; + case DocSymbol::Uml: m_t << "<umlaut char=\"" << s->letter() << "\"/>"; break; + case DocSymbol::Acute: m_t << "<acute char=\"" << s->letter() << "\"/>"; break; + case DocSymbol::Grave: m_t << "<grave char=\"" << s->letter() << "\"/>"; break; + case DocSymbol::Circ: m_t << "<circ char=\"" << s->letter() << "\"/>"; break; + case DocSymbol::Tilde: m_t << "<tilde char=\"" << s->letter() << "\"/>"; break; + case DocSymbol::Szlig: m_t << "<szlig/>"; break; + case DocSymbol::Cedil: m_t << "<cedil char=\"" << s->letter() << "\"/>"; break; + case DocSymbol::Ring: m_t << "<ring char=\"" << s->letter() << "\"/>"; break; + case DocSymbol::Slash: m_t << "<slash char=\"" << s->letter() << "\"/>"; break; + case DocSymbol::Nbsp: m_t << "<nonbreakablespace/>"; break; + case DocSymbol::Aelig: m_t << "<aelig/>"; break; + case DocSymbol::AElig: m_t << "<AElig/>"; break; + case DocSymbol::GrkGamma: m_t << "<Gamma>"; break; + case DocSymbol::GrkDelta: m_t << "<Delta>"; break; + case DocSymbol::GrkTheta: m_t << "<Theta>"; break; + case DocSymbol::GrkLambda: m_t << "<Lambda>"; break; + case DocSymbol::GrkXi: m_t << "<Xi>"; break; + case DocSymbol::GrkPi: m_t << "<Pi>"; break; + case DocSymbol::GrkSigma: m_t << "<Sigma>"; break; + case DocSymbol::GrkUpsilon: m_t << "<Upsilon>"; break; + case DocSymbol::GrkPhi: m_t << "<Phi>"; break; + case DocSymbol::GrkPsi: m_t << "<Psi>"; break; + case DocSymbol::GrkOmega: m_t << "<Omega>"; break; + case DocSymbol::Grkalpha: m_t << "<alpha>"; break; + case DocSymbol::Grkbeta: m_t << "<beta>"; break; + case DocSymbol::Grkgamma: m_t << "<gamma>"; break; + case DocSymbol::Grkdelta: m_t << "<delta>"; break; + case DocSymbol::Grkepsilon: m_t << "<epsilon>"; break; + case DocSymbol::Grkzeta: m_t << "<zeta>"; break; + case DocSymbol::Grketa: m_t << "<eta>"; break; + case DocSymbol::Grktheta: m_t << "<theta>"; break; + case DocSymbol::Grkiota: m_t << "<iota>"; break; + case DocSymbol::Grkkappa: m_t << "<kappa>"; break; + case DocSymbol::Grklambda: m_t << "<lambda>"; break; + case DocSymbol::Grkmu: m_t << "<mu>"; break; + case DocSymbol::Grknu: m_t << "<nu>"; break; + case DocSymbol::Grkxi: m_t << "<xi>"; break; + case DocSymbol::Grkpi: m_t << "<pi>"; break; + case DocSymbol::Grkrho: m_t << "<rho>"; break; + case DocSymbol::Grksigma: m_t << "<sigma>"; break; + case DocSymbol::Grktau: m_t << "<tau>"; break; + case DocSymbol::Grkupsilon: m_t << "<upsilon>"; break; + case DocSymbol::Grkphi: m_t << "<phi>"; break; + case DocSymbol::Grkchi: m_t << "<chi>"; break; + case DocSymbol::Grkpsi: m_t << "<psi>"; break; + case DocSymbol::Grkomega: m_t << "<omega>"; break; + case DocSymbol::Grkvarsigma: m_t << "<sigmaf>"; break; + case DocSymbol::Section: m_t << "<sect>"; break; + case DocSymbol::Degree: m_t << "<deg>"; break; + case DocSymbol::Prime: m_t << "<prime>"; break; + case DocSymbol::DoublePrime: m_t << "<Prime>"; break; + case DocSymbol::Infinity: m_t << "<infin>"; break; + case DocSymbol::EmptySet: m_t << "<empty>"; break; + case DocSymbol::PlusMinus: m_t << "<plusmn>"; break; + case DocSymbol::Times: m_t << "<times>"; break; + case DocSymbol::Minus: m_t << "<minus>"; break; + case DocSymbol::CenterDot: m_t << "<sdot>"; break; + case DocSymbol::Partial: m_t << "<part>"; break; + case DocSymbol::Nabla: m_t << "<nabla>"; break; + case DocSymbol::SquareRoot: m_t << "<radic>"; break; + case DocSymbol::Perpendicular: m_t << "<perp>"; break; + case DocSymbol::Sum: m_t << "<sum>"; break; + case DocSymbol::Integral: m_t << "<int>"; break; + case DocSymbol::Product: m_t << "<prod>"; break; + case DocSymbol::Similar: m_t << "<sim>"; break; + case DocSymbol::Approx: m_t << "<asymp>"; break; + case DocSymbol::NotEqual: m_t << "<ne>"; break; + case DocSymbol::Equivalent: m_t << "<equiv>"; break; + case DocSymbol::Proportional: m_t << "<prop>"; break; + case DocSymbol::LessEqual: m_t << "<le>"; break; + case DocSymbol::GreaterEqual: m_t << "<ge>"; break; + case DocSymbol::LeftArrow: m_t << "<larr>"; break; + case DocSymbol::RightArrow: m_t << "<rarr>"; break; + case DocSymbol::SetIn: m_t << "<isin>"; break; + case DocSymbol::SetNotIn: m_t << "<notin>"; break; + case DocSymbol::LeftCeil: m_t << "<lceil>"; break; + case DocSymbol::RightCeil: m_t << "<rceil>"; break; + case DocSymbol::LeftFloor: m_t << "<lfloor>"; break; + case DocSymbol::RightFloor: m_t << "<rfloor>"; break; default: err("error: unknown symbol found\n"); } |