diff options
author | Dimitri van Heesch <dimitri@stack.nl> | 2009-05-22 11:07:08 (GMT) |
---|---|---|
committer | Dimitri van Heesch <dimitri@stack.nl> | 2009-05-22 11:07:08 (GMT) |
commit | 8375a55083e5232e65493e73cb594c9c5e9552ab (patch) | |
tree | 9568dad93df55e8726251e5bdb1f2d8c00bdde93 /src | |
parent | bb12cae9e3318bfb11de719aa3e93db2bfaaccd6 (diff) | |
download | Doxygen-8375a55083e5232e65493e73cb594c9c5e9552ab.zip Doxygen-8375a55083e5232e65493e73cb594c9c5e9552ab.tar.gz Doxygen-8375a55083e5232e65493e73cb594c9c5e9552ab.tar.bz2 |
Release-1.5.9-20090522
Diffstat (limited to 'src')
39 files changed, 1254 insertions, 373 deletions
diff --git a/src/classdef.cpp b/src/classdef.cpp index 7bd4b48..198fc4d 100644 --- a/src/classdef.cpp +++ b/src/classdef.cpp @@ -844,7 +844,9 @@ void ClassDef::writeBriefDescription(OutputList &ol,bool exampleFlag) { if (!briefDescription().isEmpty()) { - ol.parseDoc(briefFile(),briefLine(),this,0,briefDescription(),TRUE,FALSE); + ol.startParagraph(); + ol.parseDoc(briefFile(),briefLine(),this,0, + briefDescription(),TRUE,FALSE,0,TRUE,FALSE); ol.pushGeneratorState(); ol.disable(OutputGenerator::RTF); ol.writeString(" \n"); @@ -862,10 +864,11 @@ void ClassDef::writeBriefDescription(OutputList &ol,bool exampleFlag) } ol.popGeneratorState(); - ol.pushGeneratorState(); - ol.disable(OutputGenerator::RTF); - ol.newParagraph(); - ol.popGeneratorState(); + //ol.pushGeneratorState(); + //ol.disable(OutputGenerator::RTF); + //ol.newParagraph(); // FIXME:PARA + //ol.popGeneratorState(); + ol.endParagraph(); } ol.writeSynopsis(); } @@ -903,7 +906,7 @@ void ClassDef::writeDetailedDescription(OutputList &ol, const QCString &pageType ol.pushGeneratorState(); ol.disable(OutputGenerator::Man); ol.disable(OutputGenerator::RTF); - ol.newParagraph(); + //ol.newParagraph(); // FIXME:PARA ol.enableAll(); ol.disableAllBut(OutputGenerator::Man); ol.writeString("\n\n"); @@ -912,7 +915,6 @@ void ClassDef::writeDetailedDescription(OutputList &ol, const QCString &pageType // write documentation if (!documentation().isEmpty()) { - //ol.newParagraph(); ol.parseDoc(docFile(),docLine(),this,0,documentation(),TRUE,FALSE); } // write type constraints @@ -922,9 +924,11 @@ void ClassDef::writeDetailedDescription(OutputList &ol, const QCString &pageType if (exampleFlag && m_impl->exampleSDict) { ol.startSimpleSect(BaseOutputDocInterface::Examples,0,0,theTranslator->trExamples()+": "); - ol.writeDescItem(); - ol.newParagraph(); + ol.startDescForItem(); + ol.startParagraph(); writeExample(ol,m_impl->exampleSDict); + ol.endParagraph(); + ol.endDescForItem(); ol.endSimpleSect(); } //ol.newParagraph(); @@ -972,7 +976,7 @@ void ClassDef::showUsedFiles(OutputList &ol) ol.startItemList(); } - ol.writeListItem(); + ol.startItemListItem(); QCString path=fd->getPath(); if (Config_getBool("FULL_PATH_NAMES")) { @@ -1015,8 +1019,9 @@ void ClassDef::showUsedFiles(OutputList &ol) { ol.docify(fname); } - ol.popGeneratorState(); + + ol.endItemListItem(); } file=m_impl->files.next(); } @@ -1089,6 +1094,7 @@ void ClassDef::writeInheritanceGraph(OutputList &ol) if (m_impl->inherits && (count=m_impl->inherits->count())>0) { + ol.startParagraph(); //parseText(ol,theTranslator->trInherits()+" "); QCString inheritLine = theTranslator->trInheritsList(m_impl->inherits->count()); @@ -1147,12 +1153,13 @@ void ClassDef::writeInheritanceGraph(OutputList &ol) index=newIndex+matchLen; } ol.parseText(inheritLine.right(inheritLine.length()-index)); - ol.newParagraph(); + ol.endParagraph(); } // write subclasses if (m_impl->inheritedBy && (count=m_impl->inheritedBy->count())>0) { + ol.startParagraph(); QCString inheritLine = theTranslator->trInheritedByList(m_impl->inheritedBy->count()); QRegExp marker("@[0-9]+"); int index=0,newIndex,matchLen; @@ -1179,7 +1186,7 @@ void ClassDef::writeInheritanceGraph(OutputList &ol) index=newIndex+matchLen; } ol.parseText(inheritLine.right(inheritLine.length()-index)); - ol.newParagraph(); + ol.endParagraph(); } if (renderDiagram) @@ -1216,6 +1223,7 @@ void ClassDef::writeIncludeFiles(OutputList &ol) m_impl->incInfo->includeName.data(); if (!nm.isEmpty()) { + ol.startParagraph(); ol.startTypewriter(); bool isIDLorJava = nm.right(4)==".idl" || nm.right(5)==".pidl" || @@ -1257,7 +1265,7 @@ void ClassDef::writeIncludeFiles(OutputList &ol) if (isIDLorJava) ol.docify(";"); ol.endTypewriter(); - ol.newParagraph(); + ol.endParagraph(); } } } @@ -1271,10 +1279,11 @@ void ClassDef::writeAllMembersLink(OutputList &ol) { ol.pushGeneratorState(); ol.disableAllBut(OutputGenerator::Html); - ol.newParagraph(); + ol.startParagraph(); ol.startTextLink(getMemberListFileName(),0); ol.parseText(theTranslator->trListOfAllMembers()); ol.endTextLink(); + ol.endParagraph(); ol.enableAll(); ol.popGeneratorState(); } @@ -1663,7 +1672,7 @@ void ClassDef::writeMemberList(OutputList &ol) ol.parseText(theTranslator->trIncludingInheritedMembers()); //ol.startItemList(); - ol.writeString("<p><table>\n"); + ol.writeString("<table>\n"); //MemberNameInfo *mni=m_impl->allMemberNameInfoList->first(); MemberNameInfoSDict::Iterator mnii(*m_impl->allMemberNameInfoSDict); diff --git a/src/commentcnv.l b/src/commentcnv.l index 4c71988..33d0c04 100644 --- a/src/commentcnv.l +++ b/src/commentcnv.l @@ -63,12 +63,14 @@ static int g_lastCommentContext; static bool g_inSpecialComment; static bool g_inRoseComment; static int g_javaBlock; +static bool g_specialComment; static QCString g_aliasString; static int g_blockCount; static int g_lastBlockContext; static bool g_pythonDocString; + static SrcLangExt g_lang; static void replaceCommentMarker(const char *s,int len) @@ -341,7 +343,8 @@ void replaceComment(int offset); g_readLineCtx=YY_START; BEGIN(ReadLine); } -<Scan>"/*" { /* start of a C comment */ +<Scan>"/*"[*!]? { /* start of a C comment */ + g_specialComment=yyleng==3; copyToOutput(yytext,yyleng); BEGIN(CComment); } @@ -640,6 +643,10 @@ void replaceComment(int offset); { ADDCHAR('/'); ADDCHAR('*'); + if (g_specialComment) + { + ADDCHAR('*'); + } } } } diff --git a/src/definition.cpp b/src/definition.cpp index 60709aa..36c1f69 100644 --- a/src/definition.cpp +++ b/src/definition.cpp @@ -819,6 +819,7 @@ void Definition::writeInlineCode(OutputList &ol,const char *scopeName) //printf("Read:\n`%s'\n\n",codeFragment.data()); MemberDef *thisMd = 0; if (definitionType()==TypeMember) thisMd = (MemberDef *)this; + ol.startParagraph(); ol.startCodeFragment(); pIntf->parseCode(ol, // codeOutIntf scopeName, // scope @@ -832,7 +833,7 @@ void Definition::writeInlineCode(OutputList &ol,const char *scopeName) thisMd // memberDef ); ol.endCodeFragment(); - ol.newParagraph(); + ol.endParagraph(); } } ol.popGeneratorState(); diff --git a/src/diagram.cpp b/src/diagram.cpp index bed02e1..75a0e00 100644 --- a/src/diagram.cpp +++ b/src/diagram.cpp @@ -175,9 +175,9 @@ static void writeMapArea(QTextStream &t,ClassDef *cd,QCString relPath, t << relPath; } t << cd->getOutputFileBase() << Doxygen::htmlFileExtension << "\" "; - t << "alt=\"" << cd->displayName(); + t << "alt=\"" << convertToXML(cd->displayName()); t << "\" shape=\"rect\" coords=\"" << x << "," << y << ","; - t << (x+w) << "," << (y+h) << "\">" << endl; + t << (x+w) << "," << (y+h) << "\"/>" << endl; } } //----------------------------------------------------------------------------- diff --git a/src/dirdef.cpp b/src/dirdef.cpp index dba1d85..6a0c12d 100644 --- a/src/dirdef.cpp +++ b/src/dirdef.cpp @@ -134,7 +134,7 @@ void DirDef::writeDetailedDescription(OutputList &ol,const QCString &title) ol.pushGeneratorState(); ol.disable(OutputGenerator::Man); ol.disable(OutputGenerator::RTF); - ol.newParagraph(); + // ol.newParagraph(); // FIXME:PARA ol.enableAll(); ol.disableAllBut(OutputGenerator::Man); ol.writeString("\n\n"); @@ -153,6 +153,7 @@ void DirDef::writeBriefDescription(OutputList &ol) { if (!briefDescription().isEmpty()) { + ol.startParagraph(); ol.parseDoc(briefFile(),briefLine(),this,0,briefDescription(),TRUE,FALSE); ol.pushGeneratorState(); ol.disable(OutputGenerator::RTF); @@ -170,10 +171,11 @@ void DirDef::writeBriefDescription(OutputList &ol) } ol.popGeneratorState(); - ol.pushGeneratorState(); - ol.disable(OutputGenerator::RTF); - ol.newParagraph(); - ol.popGeneratorState(); + //ol.pushGeneratorState(); + //ol.disable(OutputGenerator::RTF); + //ol.newParagraph(); + //ol.popGeneratorState(); + ol.endParagraph(); } ol.writeSynopsis(); } @@ -188,10 +190,11 @@ void DirDef::writeDirectoryGraph(OutputList &ol) { msg("Generating dependency graph for directory %s\n",displayName().data()); ol.disable(OutputGenerator::Man); - ol.newParagraph(); + ol.startParagraph(); ol.startDirDepGraph(); //TODO: ol.parseText(theTranslator->trDirDepGraph()); ol.endDirDepGraph(dirDep); + ol.endParagraph(); ol.enableAll(); } } @@ -220,6 +223,7 @@ void DirDef::writeSubDirList(OutputList &ol) } if (!dd->briefDescription().isEmpty() && Config_getBool("BRIEF_MEMBER_DESC")) { + ol.startParagraph(); ol.startMemberDescription(); ol.parseDoc(briefFile(),briefLine(),dd,0,dd->briefDescription(), FALSE, // indexWords @@ -229,7 +233,7 @@ void DirDef::writeSubDirList(OutputList &ol) TRUE // link from index ); ol.endMemberDescription(); - ol.newParagraph(); + ol.endParagraph(); } dd=m_subdirs.next(); } @@ -282,6 +286,7 @@ void DirDef::writeFileList(OutputList &ol) ol.endMemberItem(); if (!fd->briefDescription().isEmpty() && Config_getBool("BRIEF_MEMBER_DESC")) { + ol.startParagraph(); ol.startMemberDescription(); ol.parseDoc(briefFile(),briefLine(),fd,0,fd->briefDescription(), FALSE, // indexWords @@ -291,7 +296,7 @@ void DirDef::writeFileList(OutputList &ol) TRUE // link from index ); ol.endMemberDescription(); - ol.newParagraph(); + ol.endParagraph(); } fd=m_fileList->next(); } diff --git a/src/docparser.h b/src/docparser.h index cdc1379..fc930dd 100644 --- a/src/docparser.h +++ b/src/docparser.h @@ -473,6 +473,7 @@ class DocFormula : public DocNode int id() const { return m_id; } DocNode *parent() const { return m_parent; } void accept(DocVisitor *v) { v->visit(this); } + bool isInline() { return text().at(0)!='\\'; } private: DocNode *m_parent; @@ -574,6 +575,7 @@ class DocXRefItem : public CompAccept<DocXRefItem>, public DocNode QString key() const { return m_key; } void accept(DocVisitor *v) { CompAccept<DocXRefItem>::accept(this,v); } bool parse(); + const QList<DocNode> &children() const { return m_children; } private: DocNode *m_parent; @@ -838,6 +840,7 @@ class DocSecRefItem : public CompAccept<DocSecRefItem>, public DocNode DocNode *parent() const { return m_parent; } void accept(DocVisitor *v) { CompAccept<DocSecRefItem>::accept(this,v); } void parse(); + const QList<DocNode> &children() const { return m_children; } private: DocNode *m_parent; @@ -929,6 +932,7 @@ class DocSimpleSect : public CompAccept<DocSimpleSect>, public DocNode int parseRcs(); int parseXml(); void appendLinkWord(const QString &word); + const QList<DocNode> &children() const { return m_children; } private: DocNode * m_parent; @@ -1104,6 +1108,7 @@ class DocHtmlListItem : public CompAccept<DocHtmlListItem>, public DocNode void accept(DocVisitor *v) { CompAccept<DocHtmlListItem>::accept(this,v); } int parse(); int parseXml(); + const QList<DocNode> &children() const { return m_children; } private: DocNode * m_parent; @@ -1122,6 +1127,7 @@ class DocHtmlDescData : public CompAccept<DocHtmlDescData>, public DocNode DocNode *parent() const { return m_parent; } void accept(DocVisitor *v) { CompAccept<DocHtmlDescData>::accept(this,v); } int parse(); + const QList<DocNode> &children() const { return m_children; } private: DocNode * m_parent; diff --git a/src/dot.cpp b/src/dot.cpp index 48c319b..a5c87cd 100644 --- a/src/dot.cpp +++ b/src/dot.cpp @@ -41,7 +41,7 @@ #include <qtextstream.h> #include <md5.h> -#define MAP_CMD "cmap" +#define MAP_CMD "cmapx" //#define FONTNAME "FreeSans" #define FONTNAME getDotFontName() @@ -141,75 +141,78 @@ static bool convertMapFile(QTextStream &t,const char *mapName, int numBytes = f.readLine(buf.data(),maxLineLen); buf[numBytes-1]='\0'; - // search for href="...", store ... part in link - int indexS = buf.find("href=\""), indexE; - if (indexS!=-1 && (indexE=buf.find('"',indexS+6))!=-1) + if (buf.left(5)=="<area") { - QCString link = buf.mid(indexS+6,indexE-indexS-6); - QCString result; - QCString *dest; - if (urlOnly) // for user defined dot graphs + // search for href="...", store ... part in link + int indexS = buf.find("href=\""), indexE; + if (indexS!=-1 && (indexE=buf.find('"',indexS+6))!=-1) { - if (link.left(5)=="\\ref ") // \ref url + QCString link = buf.mid(indexS+6,indexE-indexS-6); + QCString result; + QCString *dest; + if (urlOnly) // for user defined dot graphs { - result="href=\""; - // fake ref node to resolve the url - DocRef *df = new DocRef( (DocNode*) 0, link.mid(5), context ); - if (!df->ref().isEmpty()) + if (link.left(5)=="\\ref ") // \ref url { - if ((dest=Doxygen::tagDestinationDict[df->ref()])) - result += *dest + "/"; + result="href=\""; + // fake ref node to resolve the url + DocRef *df = new DocRef( (DocNode*) 0, link.mid(5), context ); + if (!df->ref().isEmpty()) + { + if ((dest=Doxygen::tagDestinationDict[df->ref()])) + result += *dest + "/"; + } + else if (!relPath.isEmpty()) + { + result += relPath; + } + if (!df->file().isEmpty()) + result += df->file().data() + Doxygen::htmlFileExtension; + if (!df->anchor().isEmpty()) + result += "#" + df->anchor(); + delete df; + result += "\""; } - else if (!relPath.isEmpty()) + else { - result += relPath; + result = "href=\"" + link + "\""; } - if (!df->file().isEmpty()) - result += df->file().data() + Doxygen::htmlFileExtension; - if (!df->anchor().isEmpty()) - result += "#" + df->anchor(); - delete df; - result += "\""; - } - else - { - result = "href=\"" + link + "\""; } - } - else // ref$url (external ref via tag file), or $url (local ref) - { - int marker = link.find('$'); - if (marker!=-1) + else // ref$url (external ref via tag file), or $url (local ref) { - QCString ref = link.left(marker); - QCString url = link.mid(marker+1); - if (!ref.isEmpty()) - { - result = "doxygen=\"" + ref + ":"; - if ((dest=Doxygen::tagDestinationDict[ref])) result += *dest + "/"; - result += "\" "; - } - result+= "href=\""; - if (!ref.isEmpty()) + int marker = link.find('$'); + if (marker!=-1) { - if ((dest=Doxygen::tagDestinationDict[ref])) result += *dest + "/"; + QCString ref = link.left(marker); + QCString url = link.mid(marker+1); + if (!ref.isEmpty()) + { + result = "doxygen=\"" + ref + ":"; + if ((dest=Doxygen::tagDestinationDict[ref])) result += *dest + "/"; + result += "\" "; + } + result+= "href=\""; + if (!ref.isEmpty()) + { + if ((dest=Doxygen::tagDestinationDict[ref])) result += *dest + "/"; + } + else if (!relPath.isEmpty()) + { + result += relPath; + } + result+= url + "\""; } - else if (!relPath.isEmpty()) + else // should not happen, but handle properly anyway { - result += relPath; + result = "href=\"" + link + "\""; } - result+= url + "\""; - } - else // should not happen, but handle properly anyway - { - result = "href=\"" + link + "\""; } + QCString leftPart = buf.left(indexS); + QCString rightPart = buf.mid(indexE+1); + buf = leftPart + result + rightPart; } - QCString leftPart = buf.left(indexS); - QCString rightPart = buf.mid(indexE+1); - buf = leftPart + result + rightPart; + t << buf; } - t << buf; } return TRUE; } @@ -1128,8 +1131,8 @@ void DotGfxHierarchyTable::writeGraph(QTextStream &out,const char *path) const // write image and map in a table row QCString mapLabel = convertNameToFile(n->m_label); out << "<tr><td><img src=\"" << imgName << "\" border=\"0\" alt=\"\" usemap=\"#" - << mapLabel << "_map\">" << endl; - out << "<map name=\"" << mapLabel << "_map\">" << endl; + << mapLabel << "_map\"/>" << endl; + out << "<map name=\"" << mapLabel << "_map\" id=\"" << mapLabel << "\">" << endl; convertMapFile(out,mapName,""); out << "</map></td></tr>" << endl; //thisDir.remove(mapName); @@ -1915,7 +1918,7 @@ QCString DotClassGraph::writeGraph(QTextStream &out, if (format==BITMAP && generateImageMap) // produce HTML to include the image { QCString mapLabel = convertNameToFile(m_startNode->m_label+"_"+mapName); - out << "<p><center><img src=\"" << relPath << baseName << "." + out << "<center><img src=\"" << relPath << baseName << "." << imgExt << "\" border=\"0\" usemap=\"#" << mapLabel << "\" alt=\""; switch (m_graphType) @@ -1930,14 +1933,14 @@ QCString DotClassGraph::writeGraph(QTextStream &out, ASSERT(0); break; } - out << "\"></center>" << endl; + out << "\"/></center>" << endl; QString tmpstr; QTextOStream tmpout(&tmpstr); tmpout.setEncoding(tmpout.UnicodeUTF8); convertMapFile(tmpout,baseName+".map",relPath); if (!tmpstr.isEmpty()) { - out << "<map name=\"" << mapLabel << "\">" << endl; + out << "<map name=\"" << mapLabel << "\" id=\"" << mapLabel << "\">" << endl; out << tmpstr; out << "</map>" << endl; } @@ -2245,10 +2248,9 @@ QCString DotInclDepGraph::writeGraph(QTextStream &out, if (format==BITMAP && generateImageMap) { - out << "<p><center><img src=\"" << relPath << baseName << "." + out << "<center><img src=\"" << relPath << baseName << "." << imgExt << "\" border=\"0\" usemap=\"#" - << mapName << "_map\" alt=\""; - out << "\">"; + << mapName << "_map\" alt=\"\"/>"; out << "</center>" << endl; QString tmpstr; QTextOStream tmpout(&tmpstr); @@ -2256,7 +2258,7 @@ QCString DotInclDepGraph::writeGraph(QTextStream &out, convertMapFile(tmpout,baseName+".map",relPath); if (!tmpstr.isEmpty()) { - out << "<map name=\"" << mapName << "_map\">" << endl; + out << "<map name=\"" << mapName << "_map\" id=\"" << mapName << "\">" << endl; out << tmpstr; out << "</map>" << endl; } @@ -2539,7 +2541,7 @@ QCString DotCallGraph::writeGraph(QTextStream &out, GraphOutputFormat format, if (format==BITMAP && generateImageMap) { - out << "<p><center><img src=\"" << relPath << baseName << "." + out << "<center><img src=\"" << relPath << baseName << "." << imgExt << "\" border=\"0\" usemap=\"#" << mapName << "_map\" alt=\""; out << "\">"; @@ -2550,7 +2552,7 @@ QCString DotCallGraph::writeGraph(QTextStream &out, GraphOutputFormat format, convertMapFile(tmpout,baseName+".map",relPath); if (!tmpstr.isEmpty()) { - out << "<map name=\"" << mapName << "_map\">" << endl; + out << "<map name=\"" << mapName << "_map\" id=\"" << mapName << "\">" << endl; out << tmpstr; out << "</map>" << endl; } @@ -2681,11 +2683,11 @@ QCString DotDirDeps::writeGraph(QTextStream &out, if (format==BITMAP && generateImageMap) { - out << "<p><center><img src=\"" << relPath << baseName << "." + out << "<center><img src=\"" << relPath << baseName << "." << imgExt << "\" border=\"0\" usemap=\"#" << mapName << "_map\" alt=\""; - out << m_dir->displayName(); - out << "\">"; + out << convertToXML(m_dir->displayName()); + out << "\"/>"; out << "</center>" << endl; QString tmpstr; QTextOStream tmpout(&tmpstr); @@ -2693,7 +2695,7 @@ QCString DotDirDeps::writeGraph(QTextStream &out, convertMapFile(tmpout,baseName+".map",relPath,TRUE); if (!tmpstr.isEmpty()) { - out << "<map name=\"" << mapName << "_map\">" << endl; + out << "<map name=\"" << mapName << "_map\" id=\"" << mapName << "\">" << endl; out << tmpstr; out << "</map>" << endl; } @@ -3175,8 +3177,8 @@ QCString DotGroupCollaboration::writeGraph( QTextStream &t, GraphOutputFormat fo QCString mapLabel = convertNameToFile(baseName); t << "<center><table><tr><td><img src=\"" << relPath << imgName << "\" border=\"0\" alt=\"\" usemap=\"#" - << mapLabel << "_map\">" << endl; - t << "<map name=\"" << mapLabel << "_map\">" << endl; + << mapLabel << "_map\"/>" << endl; + t << "<map name=\"" << mapLabel << "_map\" id=\"" << mapLabel << "\">" << endl; convertMapFile(t,mapName,relPath); t << "</map></td></tr></table></center>" << endl; thisDir.remove(mapName); diff --git a/src/doxygen.css b/src/doxygen.css index 3767dc9..b5debd1 100644 --- a/src/doxygen.css +++ b/src/doxygen.css @@ -1,3 +1,5 @@ +/* The standard CSS for doxygen */ + body, table, div, p, dl { font-family: Lucida Grande, Verdana, Geneva, Arial, sans-serif; font-size: 12px; @@ -18,12 +20,40 @@ h3 { font-size: 100%; } +dt { + font-weight: bold; +} + +div.multicol { + -moz-column-gap: 1em; + -webkit-column-gap: 1em; + -moz-column-count: 3; + -webkit-column-count: 3; +} + +p.startli, p.startdd { + margin-top: 0px; +} + +p.endli { + margin-bottom: 0px; +} + +p.enddd { + margin-bottom: 4px; +} + /* @end */ caption { font-weight: bold; } +span.legend { + font-size: 70%; + text-align: center; +} + div.qindex, div.navtab{ background-color: #e8eef2; border: 1px solid #84b0c7; @@ -161,6 +191,15 @@ img.formulaInl { vertical-align: middle; } +img.center { + border: 0; +} + +img.footer { + border: 0; + vertical-align: middle; +} + /* @group Code Colorization */ span.keyword { @@ -267,8 +306,13 @@ hr { border-top: 1px solid #ccc; } +.memItemLeft, .memTemplItemLeft { + white-space: nowrap; +} + .memTemplParams { color: #606060; + white-space: nowrap; } /* @end */ @@ -295,6 +339,7 @@ hr { .memitem { padding: 0; + margin-bottom: 10px; } .memname { @@ -312,8 +357,11 @@ hr { font-weight: bold; -webkit-border-top-left-radius: 8px; -webkit-border-top-right-radius: 8px; + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); -moz-border-radius-topleft: 8px; -moz-border-radius-topright: 8px; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px; + } .memdoc { @@ -322,8 +370,10 @@ hr { border-top-width: 0; -webkit-border-bottom-left-radius: 8px; -webkit-border-bottom-right-radius: 8px; + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); -moz-border-radius-bottomleft: 8px; -moz-border-radius-bottomright: 8px; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px; } .paramkey { diff --git a/src/doxygen_css.h b/src/doxygen_css.h index 99c7b5d..1584e69 100644 --- a/src/doxygen_css.h +++ b/src/doxygen_css.h @@ -1,3 +1,5 @@ +"/* 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: 12px;\n" @@ -18,12 +20,40 @@ " font-size: 100%;\n" "}\n" "\n" +"dt {\n" +" font-weight: bold;\n" +"}\n" +"\n" +"div.multicol {\n" +" -moz-column-gap: 1em;\n" +" -webkit-column-gap: 1em;\n" +" -moz-column-count: 3;\n" +" -webkit-column-count: 3;\n" +"}\n" +"\n" +"p.startli, p.startdd {\n" +" margin-top: 0px;\n" +"}\n" +"\n" +"p.endli {\n" +" margin-bottom: 0px;\n" +"}\n" +"\n" +"p.enddd {\n" +" margin-bottom: 4px;\n" +"}\n" +"\n" "/* @end */\n" "\n" "caption {\n" " font-weight: bold;\n" "}\n" "\n" +"span.legend {\n" +" font-size: 70%;\n" +" text-align: center;\n" +"}\n" +"\n" "div.qindex, div.navtab{\n" " background-color: #e8eef2;\n" " border: 1px solid #84b0c7;\n" @@ -161,6 +191,15 @@ " vertical-align: middle;\n" "}\n" "\n" +"img.center {\n" +" border: 0;\n" +"}\n" +"\n" +"img.footer {\n" +" border: 0;\n" +" vertical-align: middle;\n" +"}\n" +"\n" "/* @group Code Colorization */\n" "\n" "span.keyword {\n" @@ -267,8 +306,13 @@ " border-top: 1px solid #ccc;\n" "}\n" "\n" +".memItemLeft, .memTemplItemLeft {\n" +" white-space: nowrap;\n" +"}\n" +"\n" ".memTemplParams {\n" " color: #606060;\n" +" white-space: nowrap;\n" "}\n" "\n" "/* @end */\n" @@ -295,6 +339,7 @@ "\n" ".memitem {\n" " padding: 0;\n" +" margin-bottom: 10px;\n" "}\n" "\n" ".memname {\n" @@ -312,8 +357,11 @@ " font-weight: bold;\n" " -webkit-border-top-left-radius: 8px;\n" " -webkit-border-top-right-radius: 8px;\n" +" -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15);\n" " -moz-border-radius-topleft: 8px;\n" " -moz-border-radius-topright: 8px;\n" +" -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px;\n" +"\n" "}\n" "\n" ".memdoc {\n" @@ -322,8 +370,10 @@ " border-top-width: 0;\n" " -webkit-border-bottom-left-radius: 8px;\n" " -webkit-border-bottom-right-radius: 8px;\n" +" -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15);\n" " -moz-border-radius-bottomleft: 8px;\n" " -moz-border-radius-bottomright: 8px;\n" +" -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px;\n" "}\n" "\n" ".paramkey {\n" diff --git a/src/filedef.cpp b/src/filedef.cpp index d25d51d..85aa6ed 100644 --- a/src/filedef.cpp +++ b/src/filedef.cpp @@ -186,7 +186,7 @@ void FileDef::writeDetailedDescription(OutputList &ol,const QCString &title) ol.pushGeneratorState(); ol.disable(OutputGenerator::Man); ol.disable(OutputGenerator::RTF); - ol.newParagraph(); + // ol.newParagraph(); // FIXME:PARA ol.enableAll(); ol.disableAllBut(OutputGenerator::Man); ol.writeString("\n\n"); @@ -220,7 +220,9 @@ void FileDef::writeBriefDescription(OutputList &ol) { if (!briefDescription().isEmpty()) { - ol.parseDoc(briefFile(),briefLine(),this,0,briefDescription(),TRUE,FALSE); + ol.startParagraph(); + ol.parseDoc(briefFile(),briefLine(),this,0, + briefDescription(),TRUE,FALSE,0,TRUE,FALSE); ol.pushGeneratorState(); ol.disable(OutputGenerator::RTF); ol.writeString(" \n"); @@ -236,11 +238,12 @@ void FileDef::writeBriefDescription(OutputList &ol) ol.endTextLink(); } ol.popGeneratorState(); + ol.endParagraph(); - ol.pushGeneratorState(); - ol.disable(OutputGenerator::RTF); - ol.newParagraph(); - ol.popGeneratorState(); + //ol.pushGeneratorState(); + //ol.disable(OutputGenerator::RTF); + //ol.newParagraph(); + //ol.popGeneratorState(); } ol.writeSynopsis(); } @@ -337,7 +340,6 @@ void FileDef::writeIncludeGraph(OutputList &ol) { ol.startTextBlock(); ol.disable(OutputGenerator::Man); - ol.newParagraph(); ol.startInclDepGraph(); ol.parseText(theTranslator->trInclDepGraph(name())); ol.endInclDepGraph(incDepGraph); @@ -358,7 +360,6 @@ void FileDef::writeIncludedByGraph(OutputList &ol) { ol.startTextBlock(); ol.disable(OutputGenerator::Man); - ol.newParagraph(); ol.startInclDepGraph(); ol.parseText(theTranslator->trInclByDepGraph()); ol.endInclDepGraph(incDepGraph); @@ -376,10 +377,11 @@ void FileDef::writeSourceLink(OutputList &ol) if (generateSourceFile()) { ol.disableAllBut(OutputGenerator::Html); - ol.newParagraph(); + ol.startParagraph(); ol.startTextLink(includeName(),0); ol.parseText(theTranslator->trGotoSourceCode()); ol.endTextLink(); + ol.endParagraph(); ol.enableAll(); } } diff --git a/src/formula.cpp b/src/formula.cpp index 764792e..11ea644 100644 --- a/src/formula.cpp +++ b/src/formula.cpp @@ -1,5 +1,4 @@ /****************************************************************************** - i * * * Copyright (C) 1997-2008 by Dimitri van Heesch. diff --git a/src/ftvhelp.cpp b/src/ftvhelp.cpp index 1d27d2b..e602cfe 100644 --- a/src/ftvhelp.cpp +++ b/src/ftvhelp.cpp @@ -293,7 +293,7 @@ unsigned char ftv2vertline_png[] = { FTVImageInfo image_info[] = { - { " ", "ftv2blank.png",ftv2blank_png,174,16,22 }, + { " ", "ftv2blank.png",ftv2blank_png,174,16,22 }, { "*", "ftv2doc.png",ftv2doc_png,255,24,22 }, { "+", "ftv2folderclosed.png",ftv2folderclosed_png,259,24,22 }, { "-", "ftv2folderopen.png",ftv2folderopen_png,261,24,22 }, @@ -585,9 +585,10 @@ void FTVHelp::generateTreeView(QString* OutString) #if QT_VERSION >= 200 t.setEncoding(QTextStream::UnicodeUTF8); #endif - t << "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Frameset//EN\">\n"; - t << "<html><head>"; - t << "<meta http-equiv=\"Content-Type\" content=\"text/html;charset=UTF-8\">\n"; + //t << "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Frameset//EN\">\n"; + t << "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Frameset//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd\">\n"; + t << "<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n"; + t << "<meta http-equiv=\"Content-Type\" content=\"text/html;charset=UTF-8\"/>\n"; t << "<title>"; if (Config_getString("PROJECT_NAME").isEmpty()) { @@ -597,12 +598,14 @@ void FTVHelp::generateTreeView(QString* OutString) { t << Config_getString("PROJECT_NAME"); } - t << "</title></head>" << endl; + t << "</title>\n</head>" << endl; t << "<frameset cols=\"" << Config_getInt("TREEVIEW_WIDTH") << ",*\">" << endl; - t << " <frame src=\"tree" << Doxygen::htmlFileExtension << "\" name=\"treefrm\">" << endl; - t << " <frame src=\"main" << Doxygen::htmlFileExtension << "\" name=\"basefrm\">" << endl; + t << " <frame src=\"tree" << Doxygen::htmlFileExtension << "\" name=\"treefrm\"/>" << endl; + t << " <frame src=\"main" << Doxygen::htmlFileExtension << "\" name=\"basefrm\"/>" << endl; t << " <noframes>" << endl; + t << " <body>" << endl; t << " <a href=\"main" << Doxygen::htmlFileExtension << "\">Frames are disabled. Click here to go to the main page.</a>" << endl; + t << " </body>" << endl; t << " </noframes>" << endl; t << "</frameset>" << endl; t << "</html>" << endl; @@ -618,9 +621,10 @@ void FTVHelp::generateTreeView(QString* OutString) if (m_topLevelIndex) { + t << "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n"; t << "<html xmlns=\"http://www.w3.org/1999/xhtml\" xml:lang=\"en\" lang=\"en\">\n"; t << " <head>\n"; - t << " <meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\" />\n"; + t << " <meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n"; t << " <meta http-equiv=\"Content-Style-Type\" content=\"text/css\" />\n"; t << " <meta http-equiv=\"Content-Language\" content=\"en\" />\n"; t << " <link rel=\"stylesheet\" href=\""; @@ -638,7 +642,7 @@ void FTVHelp::generateTreeView(QString* OutString) } t << cssfi.fileName(); } - t << "\">" << endl; + t << "\"/>" << endl; t << " <title>TreeView</title>\n"; } t << " <script type=\"text/javascript\">\n"; @@ -720,7 +724,7 @@ void FTVHelp::generateTreeView(QString* OutString) else { t << " <div class=\"directory-alt\">\n"; - t << " <br>\n"; + t << " <br/>\n"; } t << " <div style=\"display: block;\">\n"; @@ -729,7 +733,7 @@ void FTVHelp::generateTreeView(QString* OutString) t << " </div>\n"; t << " </div>\n"; - if (!m_topLevelIndex) + if (m_topLevelIndex) { t << " </body>\n"; t << "</html>\n"; diff --git a/src/ftvhelp.h b/src/ftvhelp.h index d1a89a8..25e2c9f 100644 --- a/src/ftvhelp.h +++ b/src/ftvhelp.h @@ -63,8 +63,8 @@ extern FTVImageInfo image_info[]; #define FTV_IMGATTRIBS(name) \ "src=\"" FTV_ICON_FILE(name) "\" " \ "alt=\"" << FTV_INFO(name).alt << "\" " \ - "width=" << FTV_INFO(name).width << " " \ - "height=" << FTV_INFO(name).height << " " + "width=\"" << FTV_INFO(name).width << "\" " \ + "height=\"" << FTV_INFO(name).height << "\" " /*! A class that generates a dynamic tree view side panel. */ diff --git a/src/groupdef.cpp b/src/groupdef.cpp index c65f483..23d897f 100644 --- a/src/groupdef.cpp +++ b/src/groupdef.cpp @@ -527,7 +527,7 @@ void GroupDef::writeDetailedDescription(OutputList &ol,const QCString &title) ol.pushGeneratorState(); ol.disable(OutputGenerator::Man); ol.disable(OutputGenerator::RTF); - ol.newParagraph(); + // ol.newParagraph(); // FIXME:PARA ol.enableAll(); ol.disableAllBut(OutputGenerator::Man); ol.writeString("\n\n"); @@ -552,7 +552,9 @@ void GroupDef::writeBriefDescription(OutputList &ol) { if (!briefDescription().isEmpty()) { - ol.parseDoc(briefFile(),briefLine(),this,0,briefDescription(),TRUE,FALSE); + ol.startParagraph(); + ol.parseDoc(briefFile(),briefLine(),this,0, + briefDescription(),TRUE,FALSE,0,TRUE,FALSE); ol.pushGeneratorState(); ol.disable(OutputGenerator::RTF); ol.writeString(" \n"); @@ -569,10 +571,11 @@ void GroupDef::writeBriefDescription(OutputList &ol) } ol.popGeneratorState(); - ol.pushGeneratorState(); - ol.disable(OutputGenerator::RTF); - ol.newParagraph(); - ol.popGeneratorState(); + //ol.pushGeneratorState(); + //ol.disable(OutputGenerator::RTF); + //ol.newParagraph(); + //ol.popGeneratorState(); + ol.endParagraph(); } } @@ -586,10 +589,11 @@ void GroupDef::writeGroupGraph(OutputList &ol) msg("Generating dependency graph for group %s\n",qualifiedName().data()); ol.pushGeneratorState(); ol.disable(OutputGenerator::Man); - ol.newParagraph(); + ol.startParagraph(); ol.startGroupCollaboration(); ol.parseText(theTranslator->trCollaborationDiagram(title)); ol.endGroupCollaboration(graph); + ol.endParagraph(); ol.popGeneratorState(); } } @@ -618,10 +622,11 @@ void GroupDef::writeFiles(OutputList &ol,const QCString &title) ol.endMemberItem(); if (!fd->briefDescription().isEmpty() && Config_getBool("BRIEF_MEMBER_DESC")) { + ol.startParagraph(); ol.startMemberDescription(); ol.parseDoc(briefFile(),briefLine(),fd,0,fd->briefDescription(),FALSE,FALSE); ol.endMemberDescription(); - ol.newParagraph(); + ol.endParagraph(); } fd=fileList->next(); } @@ -659,10 +664,11 @@ void GroupDef::writeNestedGroups(OutputList &ol,const QCString &title) ol.endMemberItem(); if (!gd->briefDescription().isEmpty() && Config_getBool("BRIEF_MEMBER_DESC")) { + ol.startParagraph(); ol.startMemberDescription(); ol.parseDoc(briefFile(),briefLine(),gd,0,gd->briefDescription(),FALSE,FALSE); ol.endMemberDescription(); - ol.newParagraph(); + ol.endParagraph(); } gd=groupList->next(); } @@ -693,10 +699,11 @@ void GroupDef::writeDirs(OutputList &ol,const QCString &title) } if (!dd->briefDescription().isEmpty() && Config_getBool("BRIEF_MEMBER_DESC")) { + ol.startParagraph(); ol.startMemberDescription(); ol.parseDoc(briefFile(),briefLine(),dd,0,dd->briefDescription(),FALSE,FALSE); ol.endMemberDescription(); - ol.newParagraph(); + ol.endParagraph(); } dd=dirList->next(); } diff --git a/src/htmldocvisitor.cpp b/src/htmldocvisitor.cpp index efdcf01..b24625f 100644 --- a/src/htmldocvisitor.cpp +++ b/src/htmldocvisitor.cpp @@ -34,6 +34,45 @@ static const int NUM_HTML_LIST_TYPES = 4; static const char types[][NUM_HTML_LIST_TYPES] = {"1", "a", "i", "A"}; +static bool mustBeOutsideParagraph(DocNode *n) +{ + switch (n->kind()) + { + /* <ul> */ + case DocNode::Kind_HtmlList: + case DocNode::Kind_SimpleList: + case DocNode::Kind_AutoList: + /* <dl> */ + case DocNode::Kind_SimpleSect: + case DocNode::Kind_ParamSect: + case DocNode::Kind_HtmlDescList: + case DocNode::Kind_XRefItem: + /* <table> */ + case DocNode::Kind_HtmlTable: + /* <h?> */ + case DocNode::Kind_Section: + case DocNode::Kind_HtmlHeader: + /* <div> */ + case DocNode::Kind_Verbatim: + case DocNode::Kind_Include: + case DocNode::Kind_Image: + case DocNode::Kind_SecRefList: + /* <hr> */ + case DocNode::Kind_HorRuler: + return TRUE; + case DocNode::Kind_StyleChange: + return ((DocStyleChange*)n)->style()==DocStyleChange::Preformatted || + ((DocStyleChange*)n)->style()==DocStyleChange::Div || + ((DocStyleChange*)n)->style()==DocStyleChange::Center; + case DocNode::Kind_Formula: + return !((DocFormula*)n)->isInline(); + default: + break; + } + return FALSE; +} + + static QString htmlAttribsToString(const HtmlAttribList &attribs) { @@ -42,9 +81,13 @@ static QString htmlAttribsToString(const HtmlAttribList &attribs) HtmlAttrib *att; for (li.toFirst();(att=li.current());++li) { - result+=" "; - result+=att->name; - if (!att->value.isEmpty()) result+="=\""+att->value+"\""; + if (!att->value.isEmpty()) // ignore attribute without values as they + // are not XHTML compliant + { + result+=" "; + result+=att->name; + result+="=\""+convertToXML(att->value)+"\""; + } } return result; } @@ -143,13 +186,13 @@ void HtmlDocVisitor::visit(DocURL *u) void HtmlDocVisitor::visit(DocLineBreak *) { if (m_hide) return; - m_t << "<br>\n"; + m_t << "<br/>\n"; } void HtmlDocVisitor::visit(DocHorRuler *) { if (m_hide) return; - m_t << "<hr>\n"; + m_t << "<hr/>\n"; } void HtmlDocVisitor::visit(DocStyleChange *s) @@ -173,7 +216,16 @@ void HtmlDocVisitor::visit(DocStyleChange *s) if (s->enable()) m_t << "<sup" << htmlAttribsToString(s->attribs()) << ">"; else m_t << "</sup>"; break; case DocStyleChange::Center: - if (s->enable()) m_t << "<center" << htmlAttribsToString(s->attribs()) << ">"; else m_t << "</center>"; + if (s->enable()) + { + forceEndParagraph(s); + m_t << "<center" << htmlAttribsToString(s->attribs()) << ">"; + } + else + { + m_t << "</center>"; + forceStartParagraph(s); + } break; case DocStyleChange::Small: if (s->enable()) m_t << "<small" << htmlAttribsToString(s->attribs()) << ">"; else m_t << "</small>"; @@ -181,6 +233,7 @@ void HtmlDocVisitor::visit(DocStyleChange *s) case DocStyleChange::Preformatted: if (s->enable()) { + forceEndParagraph(s); m_t << "<pre" << htmlAttribsToString(s->attribs()) << ">"; m_insidePre=TRUE; } @@ -188,10 +241,20 @@ void HtmlDocVisitor::visit(DocStyleChange *s) { m_insidePre=FALSE; m_t << "</pre>"; + forceStartParagraph(s); } break; case DocStyleChange::Div: - if (s->enable()) m_t << "<div" << htmlAttribsToString(s->attribs()) << ">"; else m_t << "</div>"; + if (s->enable()) + { + forceEndParagraph(s); + m_t << "<div" << htmlAttribsToString(s->attribs()) << ">"; + } + else + { + m_t << "</div>"; + forceStartParagraph(s); + } break; case DocStyleChange::Span: if (s->enable()) m_t << "<span" << htmlAttribsToString(s->attribs()) << ">"; else m_t << "</span>"; @@ -207,16 +270,20 @@ void HtmlDocVisitor::visit(DocVerbatim *s) switch(s->type()) { case DocVerbatim::Code: // fall though + forceEndParagraph(s); m_t << PREFRAG_START; Doxygen::parserManager->getParser(m_langExt) ->parseCode(m_ci,s->context(),s->text().latin1(), s->isExample(),s->exampleFile()); m_t << PREFRAG_END; + forceStartParagraph(s); break; case DocVerbatim::Verbatim: + forceEndParagraph(s); m_t << PREFRAG_START; filter(s->text()); m_t << PREFRAG_END; + forceStartParagraph(s); break; case DocVerbatim::HtmlOnly: m_t << s->text(); @@ -245,9 +312,11 @@ void HtmlDocVisitor::visit(DocVerbatim *s) file.writeBlock( s->text(), s->text().length() ); file.close(); + forceEndParagraph(s); m_t << "<div align=\"center\">" << endl; writeDotFile(fileName,s->relPath(),s->context()); m_t << "</div>" << endl; + forceStartParagraph(s); if (Config_getBool("DOT_CLEANUP")) file.remove(); } @@ -272,9 +341,11 @@ void HtmlDocVisitor::visit(DocVerbatim *s) file.writeBlock( text, text.length() ); file.close(); + forceEndParagraph(s); m_t << "<div align=\"center\">" << endl; writeMscFile(baseName,s->relPath(),s->context()); m_t << "</div>" << endl; + forceStartParagraph(s); if (Config_getBool("DOT_CLEANUP")) file.remove(); } @@ -285,7 +356,7 @@ void HtmlDocVisitor::visit(DocVerbatim *s) void HtmlDocVisitor::visit(DocAnchor *anc) { if (m_hide) return; - m_t << "<a class=\"anchor\" name=\"" << anc->anchor() << "\"></a>"; + m_t << "<a class=\"anchor\" id=\"" << anc->anchor() << "\"></a>"; } void HtmlDocVisitor::visit(DocInclude *inc) @@ -294,6 +365,7 @@ void HtmlDocVisitor::visit(DocInclude *inc) switch(inc->type()) { case DocInclude::Include: + forceEndParagraph(inc); m_t << PREFRAG_START; Doxygen::parserManager->getParser(inc->extension()) ->parseCode(m_ci, @@ -307,9 +379,11 @@ void HtmlDocVisitor::visit(DocInclude *inc) TRUE // inlineFragment ); m_t << PREFRAG_END; + forceStartParagraph(inc); break; case DocInclude::IncWithLines: { + forceEndParagraph(inc); m_t << PREFRAG_START; QFileInfo cfi( inc->file() ); FileDef fd( cfi.dirPath(), cfi.fileName() ); @@ -320,6 +394,7 @@ void HtmlDocVisitor::visit(DocInclude *inc) inc->isExample(), inc->exampleFile(), &fd); m_t << PREFRAG_END; + forceStartParagraph(inc); } break; case DocInclude::DontInclude: @@ -328,9 +403,11 @@ void HtmlDocVisitor::visit(DocInclude *inc) m_t << inc->text(); break; case DocInclude::VerbInclude: + forceEndParagraph(inc); m_t << PREFRAG_START; filter(inc->text()); m_t << PREFRAG_END; + forceStartParagraph(inc); break; } } @@ -372,8 +449,12 @@ void HtmlDocVisitor::visit(DocIncOperator *op) void HtmlDocVisitor::visit(DocFormula *f) { if (m_hide) return; - bool bDisplay = f->text().at(0)=='\\'; - if (bDisplay) m_t << "<p class=\"formulaDsp\">" << endl; + bool bDisplay = !f->isInline(); + if (bDisplay) + { + forceEndParagraph(f); + m_t << "<p class=\"formulaDsp\">" << endl; + } m_t << "<img class=\"formula" << (bDisplay ? "Dsp" : "Inl"); m_t << "\" alt=\""; @@ -381,9 +462,12 @@ void HtmlDocVisitor::visit(DocFormula *f) m_t << "\""; /// @todo cache image dimensions on formula generation and give height/width /// for faster preloading and better rendering of the page - m_t << " src=\"" << f->relPath() << f->name() << ".png\">"; + m_t << " src=\"" << f->relPath() << f->name() << ".png\"/>"; if (bDisplay) - m_t << endl << "<p>" << endl; + { + m_t << endl << "</p>" << endl; + forceStartParagraph(f); + } } void HtmlDocVisitor::visit(DocIndexEntry *) @@ -398,6 +482,7 @@ void HtmlDocVisitor::visit(DocIndexEntry *) void HtmlDocVisitor::visitPre(DocAutoList *l) { if (m_hide) return; + forceEndParagraph(l); if (l->isEnumList()) { // @@ -408,7 +493,7 @@ void HtmlDocVisitor::visitPre(DocAutoList *l) // A. // 1. (repeat)... // - m_t << "<ol type=" << types[l->depth() % NUM_HTML_LIST_TYPES] << ">"; + m_t << "<ol type=\"" << types[l->depth() % NUM_HTML_LIST_TYPES] << "\">"; } else { @@ -429,6 +514,7 @@ void HtmlDocVisitor::visitPost(DocAutoList *l) m_t << "</ul>"; } if (!l->isPreformatted()) m_t << "\n"; + forceStartParagraph(l); } void HtmlDocVisitor::visitPre(DocAutoListItem *) @@ -437,41 +523,219 @@ void HtmlDocVisitor::visitPre(DocAutoListItem *) m_t << "<li>"; } -void HtmlDocVisitor::visitPost(DocAutoListItem *) +void HtmlDocVisitor::visitPost(DocAutoListItem *li) { if (m_hide) return; m_t << "</li>"; + if (!li->isPreformatted()) m_t << "\n"; +} + +template<class T> +bool isFirstChildNode(T *parent, DocNode *node) +{ + return parent->children().getFirst()==node; } -void HtmlDocVisitor::visitPre(DocPara *) +template<class T> +bool isLastChildNode(T *parent, DocNode *node) +{ + return parent->children().getLast()==node; +} + +int getParagraphContext(DocPara *p,bool &isFirst,bool &isLast) +{ + int t=0; + isFirst=FALSE; + isLast=FALSE; + if (p && p->parent()) + { + switch (p->parent()->kind()) + { + case DocNode::Kind_AutoListItem: + isFirst=TRUE; + isLast =TRUE; + if (isFirst) t=1; + if (isLast) t=3; + break; + case DocNode::Kind_SimpleListItem: + isFirst=TRUE; + isLast =TRUE; + if (isFirst) t=1; + if (isLast) t=3; + break; + case DocNode::Kind_HtmlListItem: + isFirst=isFirstChildNode((DocHtmlListItem*)p->parent(),p); + isLast =isLastChildNode ((DocHtmlListItem*)p->parent(),p); + if (isFirst) t=1; + if (isLast) t=3; + break; + case DocNode::Kind_SecRefItem: + isFirst=isFirstChildNode((DocSecRefItem*)p->parent(),p); + isLast =isLastChildNode ((DocSecRefItem*)p->parent(),p); + if (isFirst) t=1; + if (isLast) t=3; + break; + case DocNode::Kind_HtmlDescData: + isFirst=isFirstChildNode((DocHtmlDescData*)p->parent(),p); + isLast =isLastChildNode ((DocHtmlDescData*)p->parent(),p); + if (isFirst) t=2; + if (isLast) t=4; + break; + case DocNode::Kind_XRefItem: + isFirst=isFirstChildNode((DocXRefItem*)p->parent(),p); + isLast =isLastChildNode ((DocXRefItem*)p->parent(),p); + if (isFirst) t=2; + if (isLast) t=4; + break; + case DocNode::Kind_SimpleSect: + isFirst=isFirstChildNode((DocSimpleSect*)p->parent(),p); + isLast =isLastChildNode ((DocSimpleSect*)p->parent(),p); + if (isFirst) t=2; + if (isLast) t=4; + break; + default: + break; + } + //printf("para=%p parent()->kind=%d isFirst=%d isLast=%d t=%d\n", + // p,p->parent()->kind(),isFirst,isLast,t); + } + return t; +} + +void HtmlDocVisitor::visitPre(DocPara *p) { if (m_hide) return; - // TODO: - // Paragraph should be surrounded by <p>..</p>, but - // - // A list item (li), description data (dd), or table data (td) should - // only have paragraph markers if there are multiple paragraphs (otherwise - // the output looks ugly). - // - // A list or table should be placed outside the paragraph context, - // so the current paragraph should be ended and restarted. To avoid - // empty paragraphs, it has to be checked if the list or table is the - // first or last child within the paragraph. - + //printf("Processing docpara with parent of kind %d\n", + // p->parent() ? p->parent()->kind() : -1); + + bool needsTag = FALSE; + if (p && p->parent()) + { + switch (p->parent()->kind()) + { + case DocNode::Kind_Section: + case DocNode::Kind_HtmlListItem: + case DocNode::Kind_HtmlDescData: + case DocNode::Kind_HtmlCell: + case DocNode::Kind_SimpleListItem: + case DocNode::Kind_AutoListItem: + case DocNode::Kind_SimpleSect: + needsTag = TRUE; + break; + case DocNode::Kind_Root: + needsTag = !((DocRoot*)p->parent())->singleLine(); + break; + default: + needsTag = FALSE; + } + } + + // if the first element of a paragraph is something that should be outside of + // the paragraph (<ul>,<dl>,<table>,..) then that will already started the + // paragraph and we don't need to do it here + uint nodeIndex = 0; + if (p && nodeIndex<p->children().count()) + { + while (nodeIndex<p->children().count() && + p->children().at(nodeIndex)->kind()==DocNode::Kind_WhiteSpace) + { + nodeIndex++; + } + if (nodeIndex<p->children().count()) + { + DocNode *n = p->children().at(nodeIndex); + if (mustBeOutsideParagraph(n)) + { + needsTag = FALSE; + } + } + } + + // check if this paragraph is the first or last child of a <li> or <dd>. + // this allows us to mark the tag with a special class so we can + // fix the otherwise ugly spacing. + int t; + static const char *contexts[5] = + { "", + " class=\"startli\"", + " class=\"startdd\"", + " class=\"endli\"", + " class=\"enddd\"" + }; + bool isFirst; + bool isLast; + t = getParagraphContext(p,isFirst,isLast); + //printf("startPara first=%d last=%d\n",isFirst,isLast); + if (isFirst && isLast) needsTag=FALSE; + + // write the paragraph tag (if needed) + if (needsTag) m_t << "<p" << contexts[t] << ">"; } void HtmlDocVisitor::visitPost(DocPara *p) { - if (m_hide) return; - if (!p->isLast() && // omit <p> for last paragraph - !(p->parent() && // and for parameter sections - p->parent()->kind()==DocNode::Kind_ParamSect - ) - ) +// if (m_hide) return; +// if (!p->isLast() && // omit <p> for last paragraph +// !(p->parent() && // and for parameter sections +// p->parent()->kind()==DocNode::Kind_ParamSect +// ) +// ) +// { +// m_t << "<p>\n"; +// } + + bool needsTag = FALSE; + if (p && p->parent()) { - m_t << "<p>\n"; + switch (p->parent()->kind()) + { + case DocNode::Kind_Section: + case DocNode::Kind_HtmlListItem: + case DocNode::Kind_HtmlDescData: + case DocNode::Kind_HtmlCell: + case DocNode::Kind_SimpleListItem: + case DocNode::Kind_AutoListItem: + case DocNode::Kind_SimpleSect: + needsTag = TRUE; + break; + case DocNode::Kind_Root: + needsTag = !((DocRoot*)p->parent())->singleLine(); + break; + default: + needsTag = FALSE; + } } + + QCString context; + // if the last element of a paragraph is something that should be outside of + // the paragraph (<ul>,<dl>,<table>) then that will already have ended the + // paragraph and we don't need to do it here + int nodeIndex = p->children().count()-1; + if (p && nodeIndex>=0) + { + while (nodeIndex>=0 && p->children().at(nodeIndex)->kind()==DocNode::Kind_WhiteSpace) + { + nodeIndex--; + } + if (nodeIndex>=0) + { + DocNode *n = p->children().at(nodeIndex); + if (mustBeOutsideParagraph(n)) + { + needsTag = FALSE; + } + } + } + + bool isFirst; + bool isLast; + getParagraphContext(p,isFirst,isLast); + //printf("endPara first=%d last=%d\n",isFirst,isLast); + if (isFirst && isLast) needsTag=FALSE; + + if (needsTag) m_t << "</p>\n"; + } void HtmlDocVisitor::visitPre(DocRoot *) @@ -485,7 +749,8 @@ void HtmlDocVisitor::visitPost(DocRoot *) void HtmlDocVisitor::visitPre(DocSimpleSect *s) { if (m_hide) return; - m_t << "<dl class=\"" << s->typeString() << "\" compact><dt><b>"; + forceEndParagraph(s); + m_t << "<dl class=\"" << s->typeString() << "\"><dt><b>"; switch(s->type()) { case DocSimpleSect::See: @@ -528,10 +793,11 @@ void HtmlDocVisitor::visitPre(DocSimpleSect *s) } } -void HtmlDocVisitor::visitPost(DocSimpleSect *) +void HtmlDocVisitor::visitPost(DocSimpleSect *s) { if (m_hide) return; m_t << "</dd></dl>\n"; + forceStartParagraph(s); } void HtmlDocVisitor::visitPre(DocTitle *) @@ -547,8 +813,10 @@ void HtmlDocVisitor::visitPost(DocTitle *) void HtmlDocVisitor::visitPre(DocSimpleList *sl) { if (m_hide) return; + forceEndParagraph(sl); m_t << "<ul>"; if (!sl->isPreformatted()) m_t << "\n"; + } void HtmlDocVisitor::visitPost(DocSimpleList *sl) @@ -556,6 +824,7 @@ void HtmlDocVisitor::visitPost(DocSimpleList *sl) if (m_hide) return; m_t << "</ul>"; if (!sl->isPreformatted()) m_t << "\n"; + forceStartParagraph(sl); } void HtmlDocVisitor::visitPre(DocSimpleListItem *) @@ -574,20 +843,23 @@ void HtmlDocVisitor::visitPost(DocSimpleListItem *li) void HtmlDocVisitor::visitPre(DocSection *s) { if (m_hide) return; + forceEndParagraph(s); m_t << "<h" << s->level()+1 << ">"; - m_t << "<a class=\"anchor\" name=\"" << s->anchor(); + m_t << "<a class=\"anchor\" id=\"" << s->anchor(); m_t << "\">" << endl; filter(convertCharEntitiesToUTF8(s->title().data())); m_t << "</a></h" << s->level()+1 << ">\n"; } -void HtmlDocVisitor::visitPost(DocSection *) +void HtmlDocVisitor::visitPost(DocSection *s) { + forceStartParagraph(s); } void HtmlDocVisitor::visitPre(DocHtmlList *s) { if (m_hide) return; + forceEndParagraph(s); if (s->type()==DocHtmlList::Ordered) { m_t << "<ol" << htmlAttribsToString(s->attribs()) << ">\n"; @@ -610,6 +882,7 @@ void HtmlDocVisitor::visitPost(DocHtmlList *s) m_t << "</ul>"; } if (!s->isPreformatted()) m_t << "\n"; + forceStartParagraph(s); } void HtmlDocVisitor::visitPre(DocHtmlListItem *i) @@ -628,13 +901,15 @@ void HtmlDocVisitor::visitPost(DocHtmlListItem *) void HtmlDocVisitor::visitPre(DocHtmlDescList *dl) { if (m_hide) return; + forceEndParagraph(dl); m_t << "<dl" << htmlAttribsToString(dl->attribs()) << ">\n"; } -void HtmlDocVisitor::visitPost(DocHtmlDescList *) +void HtmlDocVisitor::visitPost(DocHtmlDescList *dl) { if (m_hide) return; m_t << "</dl>\n"; + forceStartParagraph(dl); } void HtmlDocVisitor::visitPre(DocHtmlDescTitle *dt) @@ -668,6 +943,8 @@ void HtmlDocVisitor::visitPre(DocHtmlTable *t) bool hasCellSpacing = FALSE; bool hasCellPadding = FALSE; + forceEndParagraph(t); + HtmlAttribListIterator li(t->attribs()); HtmlAttrib *att; for (li.toFirst();(att=li.current());++li) @@ -683,10 +960,11 @@ void HtmlDocVisitor::visitPre(DocHtmlTable *t) m_t << ">\n"; } -void HtmlDocVisitor::visitPost(DocHtmlTable *) +void HtmlDocVisitor::visitPost(DocHtmlTable *t) { if (m_hide) return; m_t << "</table>\n"; + forceStartParagraph(t); } void HtmlDocVisitor::visitPre(DocHtmlRow *tr) @@ -757,7 +1035,7 @@ void HtmlDocVisitor::visitPost(DocInternal *) void HtmlDocVisitor::visitPre(DocHRef *href) { if (m_hide) return; - m_t << "<a href=\"" << href->url() << "\"" + m_t << "<a href=\"" << convertToXML(href->url()) << "\"" << htmlAttribsToString(href->attribs()) << ">"; } @@ -770,6 +1048,7 @@ void HtmlDocVisitor::visitPost(DocHRef *) void HtmlDocVisitor::visitPre(DocHtmlHeader *header) { if (m_hide) return; + forceEndParagraph(header); m_t << "<h" << header->level() << htmlAttribsToString(header->attribs()) << ">"; } @@ -778,12 +1057,14 @@ void HtmlDocVisitor::visitPost(DocHtmlHeader *header) { if (m_hide) return; m_t << "</h" << header->level() << ">\n"; + forceStartParagraph(header); } void HtmlDocVisitor::visitPre(DocImage *img) { if (img->type()==DocImage::Html) { + forceEndParagraph(img); if (m_hide) return; QString baseName=img->name(); int i; @@ -793,7 +1074,7 @@ void HtmlDocVisitor::visitPre(DocImage *img) } m_t << "<div align=\"center\">" << endl; m_t << "<img src=\"" << img->relPath() << img->name() << "\" alt=\"" - << baseName << "\"" << ">" << endl; + << baseName << "\"" << "/>" << endl; if (img->hasCaption()) { m_t << "<p><strong>"; @@ -816,6 +1097,7 @@ void HtmlDocVisitor::visitPost(DocImage *img) m_t << "</strong></p>"; } m_t << "</div>" << endl; + forceStartParagraph(img); } else // other format { @@ -889,21 +1171,23 @@ void HtmlDocVisitor::visitPre(DocSecRefItem *ref) void HtmlDocVisitor::visitPost(DocSecRefItem *) { if (m_hide) return; - m_t << "</a> "; + m_t << "</a></li>\n"; } -void HtmlDocVisitor::visitPre(DocSecRefList *) +void HtmlDocVisitor::visitPre(DocSecRefList *s) { if (m_hide) return; - m_t << "<multicol cols=3>" << endl; + forceEndParagraph(s); + m_t << "<div class=\"multicol\">" << endl; m_t << "<ul>" << endl; } -void HtmlDocVisitor::visitPost(DocSecRefList *) +void HtmlDocVisitor::visitPost(DocSecRefList *s) { if (m_hide) return; m_t << "</ul>" << endl; - m_t << "</multicol>" << endl; + m_t << "</div>" << endl; + forceStartParagraph(s); } //void HtmlDocVisitor::visitPre(DocLanguage *l) @@ -928,7 +1212,8 @@ void HtmlDocVisitor::visitPost(DocSecRefList *) void HtmlDocVisitor::visitPre(DocParamSect *s) { if (m_hide) return; - m_t << "<dl compact><dt><b>"; + forceEndParagraph(s); + m_t << "<dl><dt><b>"; switch(s->type()) { case DocParamSect::Param: @@ -950,11 +1235,13 @@ void HtmlDocVisitor::visitPre(DocParamSect *s) m_t << " <table border=\"0\" cellspacing=\"2\" cellpadding=\"0\">" << endl; } -void HtmlDocVisitor::visitPost(DocParamSect *) +void HtmlDocVisitor::visitPost(DocParamSect *s) { if (m_hide) return; m_t << " </table>" << endl; + m_t << " </dd>" << endl; m_t << "</dl>" << endl; + forceStartParagraph(s); } void HtmlDocVisitor::visitPre(DocParamList *pl) @@ -1008,16 +1295,17 @@ void HtmlDocVisitor::visitPost(DocParamList *) void HtmlDocVisitor::visitPre(DocXRefItem *x) { if (m_hide) return; + forceEndParagraph(x); bool anonymousEnum = x->file()=="@"; if (!anonymousEnum) { - m_t << "<dl class=\"" << x->key() << "\" compact><dt><b><a class=\"el\" href=\"" + m_t << "<dl class=\"" << x->key() << "\"><dt><b><a class=\"el\" href=\"" << x->relPath() << x->file() << Doxygen::htmlFileExtension << "#" << x->anchor() << "\">"; } else { - m_t << "<dl class=\"" << x->key() << "\" compact><dt><b>"; + m_t << "<dl class=\"" << x->key() << "\"><dt><b>"; } filter(x->title()); m_t << ":"; @@ -1025,10 +1313,11 @@ void HtmlDocVisitor::visitPre(DocXRefItem *x) m_t << "</b></dt><dd>"; } -void HtmlDocVisitor::visitPost(DocXRefItem *) +void HtmlDocVisitor::visitPost(DocXRefItem *x) { if (m_hide) return; m_t << "</dd></dl>" << endl; + forceStartParagraph(x); } void HtmlDocVisitor::visitPre(DocInternalRef *ref) @@ -1182,7 +1471,7 @@ void HtmlDocVisitor::writeDotFile(const QString &fileName,const QString &relPath << Config_getEnum("DOT_IMAGE_FORMAT") << "\" alt=\"" << baseName << "\" border=\"0\" usemap=\"#" << mapName << "\">" << endl; QString imap = getDotImageMapFromFile(fileName,outDir,relPath.data(),context); - m_t << "<map name=\"" << mapName << "\">" << imap << "</map>" << endl; + m_t << "<map name=\"" << mapName << "\" id=\"" << mapName << "\">" << imap << "</map>" << endl; } void HtmlDocVisitor::writeMscFile(const QString &fileName,const QString &relPath, @@ -1201,6 +1490,82 @@ void HtmlDocVisitor::writeMscFile(const QString &fileName,const QString &relPath m_t << "<img src=\"" << relPath << baseName << ".png\" alt=\"" << baseName << "\" border=\"0\" usemap=\"#" << mapName << "\">" << endl; QString imap = getMscImageMapFromFile(fileName,outDir,relPath.data(),context); - m_t << "<map name=\"" << mapName << "\">" << imap << "</map>" << endl; + m_t << "<map name=\"" << mapName << "\" id=\"" << mapName << "\">" << imap << "</map>" << endl; +} + +/** Used for items found inside a paragraph, which due to XHTML restrictions + * have to be outside of the paragraph. This method will forcefully end + * the current paragraph and forceStartParagraph() will restart it. + */ +void HtmlDocVisitor::forceEndParagraph(DocNode *n) +{ + //printf("forceEndParagraph(%p) %d\n",n,n->kind()); + if (n->parent() && n->parent()->kind()==DocNode::Kind_Para) + { + DocPara *para = (DocPara*)n->parent(); + int nodeIndex = para->children().findRef(n); + nodeIndex--; + if (nodeIndex<0) return; // first node + while (nodeIndex>=0 && + para->children().at(nodeIndex)->kind()==DocNode::Kind_WhiteSpace + ) + { + nodeIndex--; + } + if (nodeIndex>=0) + { + DocNode *n = para->children().at(nodeIndex); + //printf("n=%p kind=%d outside=%d\n",n,n->kind(),mustBeOutsideParagraph(n)); + if (mustBeOutsideParagraph(n)) return; + } + + bool isFirst; + bool isLast; + getParagraphContext(para,isFirst,isLast); + //printf("forceEnd first=%d last=%d\n",isFirst,isLast); + if (isFirst && isLast) return; + + m_t << "</p>" << endl; + } +} + +/** Used for items found inside a paragraph, which due to XHTML restrictions + * have to be outside of the paragraph. This method will forcefully start + * the paragraph, that was previously ended by forceEndParagraph(). + */ +void HtmlDocVisitor::forceStartParagraph(DocNode *n) +{ + //printf("forceStartParagraph(%p) %d\n",n,n->kind()); + if (n->parent() && n->parent()->kind()==DocNode::Kind_Para) // if we are inside a paragraph + { + DocPara *para = (DocPara*)n->parent(); + int nodeIndex = para->children().findRef(n); + int numNodes = para->children().count(); + nodeIndex++; + if (nodeIndex==numNodes) return; // last node + while (nodeIndex<numNodes && + para->children().at(nodeIndex)->kind()==DocNode::Kind_WhiteSpace + ) + { + nodeIndex++; + } + if (nodeIndex<numNodes) + { + DocNode *n = para->children().at(nodeIndex); + if (mustBeOutsideParagraph(n)) return; + } + else + { + return; // only whitespace at the end! + } + + bool isFirst; + bool isLast; + getParagraphContext(para,isFirst,isLast); + //printf("forceStart first=%d last=%d\n",isFirst,isLast); + if (isFirst && isLast) return; + + m_t << "<p>"; + } } diff --git a/src/htmldocvisitor.h b/src/htmldocvisitor.h index bbe7c34..929fb5c 100644 --- a/src/htmldocvisitor.h +++ b/src/htmldocvisitor.h @@ -23,6 +23,7 @@ #include <qstack.h> #include <qcstring.h> +class DocNode; class QTextStream; class CodeOutputInterface; class QString; @@ -141,6 +142,9 @@ class HtmlDocVisitor : public DocVisitor void pushEnabled(); void popEnabled(); + void forceEndParagraph(DocNode *n); + void forceStartParagraph(DocNode *n); + //-------------------------------------- // state variables //-------------------------------------- diff --git a/src/htmlgen.cpp b/src/htmlgen.cpp index 12213f7..49dd8e2 100644 --- a/src/htmlgen.cpp +++ b/src/htmlgen.cpp @@ -568,15 +568,15 @@ static void writeDefaultHeaderFile(QTextStream &t, const char *title, else relPathStr=relPath; - t << "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">\n" - "<html><head>" - "<meta http-equiv=\"Content-Type\" content=\"text/html;charset=UTF-8" - //<< theTranslator->idLanguageCharset() - << "\">\n" - "<title>"; +// t << "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">\n"; +// t << "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">\n"; + t << "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n"; + t << "<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n" + "<meta http-equiv=\"Content-Type\" content=\"text/html;charset=UTF-8\"/>\n" + "<title>"; t << convertToHtml(title); t << "</title>\n"; - t << "<link href=\"" << relPathStr << "tabs.css\" rel=\"stylesheet\" type=\"text/css\">\n"; + t << "<link href=\"" << relPathStr << "tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n"; t << "<link "; t << "href=\""; if (Config_getString("HTML_STYLESHEET").isEmpty()) @@ -594,8 +594,8 @@ static void writeDefaultHeaderFile(QTextStream &t, const char *title, t << relPathStr << cssfi.fileName(); } - t << "\" rel=\"stylesheet\" type=\"text/css\">\n"; - t << "</head><body>\n"; + t << "\" rel=\"stylesheet\" type=\"text/css\"/>\n"; + t << "</head>\n<body>\n"; } @@ -609,11 +609,10 @@ void HtmlGenerator::writeHeaderFile(QFile &file) void HtmlGenerator::writeFooterFile(QFile &file) { QTextStream t(&file); - t << "<hr size=\"1\"><address style=\"text-align: right;\"><small>\n"; + t << "<hr size=\"1\"/><address style=\"text-align: right;\"><small>\n"; t << theTranslator->trGeneratedAt( "$datetime", "$projectname" ); t << " <a href=\"http://www.doxygen.org/index.html\">" - << "<img src=\"doxygen.png\" alt=\"doxygen\" " - << "align=\"middle\" border=\"0\">" + << "<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>" << "</a> $doxygenversion"; t << "</small></address>\n" << "</body>\n" @@ -715,24 +714,24 @@ static void writePageFooter(QTextStream &t,const QCString &lastTitle, { if (g_footer.isEmpty()) { - t << "<hr size=\"1\"><address style=\"text-align: right;\"><small>"; + t << "<hr size=\"1\"/><address style=\"text-align: right;\"><small>"; t << theTranslator->trGeneratedAt( dateToString(TRUE), Config_getString("PROJECT_NAME") ); t << " " << endl << "<a href=\"http://www.doxygen.org/index.html\">"; - t << endl << "<img src=\"" << relPath << "doxygen.png\" alt=\"doxygen\" " - << "align=\"middle\" border=\"0\">" << "</a> " << versionString << " "; + t << endl << "<img class=\"footer\" src=\"" << relPath << "doxygen.png\" alt=\"doxygen\"/>" + << "</a> " << versionString << " "; t << "</small></address>"; if (Debug::isFlagSet(Debug::Validate)) { t << "<p><a href=\"http://validator.w3.org/check/referer\">" - "<img border=\"0\" src=\"http://www.w3.org/Icons/valid-html401\"" + "<img class=\"footer\" src=\"http://www.w3.org/Icons/valid-html401\"" " height=\"31\" width=\"88\" alt=\"This page is Valid HTML 4.01 " "Transitional!\"></a><a href=\"http://jigsaw.w3.org/css-validator/\">" - "<img style=\"border:0;width:88px;height:31px\" " + "<img class=\"footer\" style=\"border:0;width:88px;height:31px\" " "src=\"http://jigsaw.w3.org/css-validator/images/vcss\" " - "alt=\"This page uses valid CSS!\"></a></p>"; + "alt=\"This page uses valid CSS!\"/></a></p>"; } t << "\n</body>\n</html>\n"; } @@ -754,7 +753,7 @@ void HtmlGenerator::endFile() void HtmlGenerator::startProjectNumber() { - t << "<h3 align=\"center\">"; + t << "<h3>"; } void HtmlGenerator::endProjectNumber() @@ -806,7 +805,7 @@ void HtmlGenerator::startDoxyAnchor(const char *,const char *, const char *anchor, const char *name, const char *args) { - t << "<a class=\"anchor\" name=\"" << anchor << "\"></a>"; + t << "<a class=\"anchor\" id=\"" << anchor << "\"></a>"; t << "<!-- doxytag: member=\""; docify(name,TRUE); t << "\" ref=\""; @@ -820,10 +819,10 @@ void HtmlGenerator::endDoxyAnchor(const char *,const char *) { } -void HtmlGenerator::newParagraph() -{ - t << endl << "<p>" << endl; -} +//void HtmlGenerator::newParagraph() +//{ +// t << endl << "<p>" << endl; +//} void HtmlGenerator::startParagraph() { @@ -840,11 +839,20 @@ void HtmlGenerator::writeString(const char *text) t << text; } +void HtmlGenerator::startIndexListItem() +{ + t << "<li>"; +} + +void HtmlGenerator::endIndexListItem() +{ + t << "</li>" << endl; +} + void HtmlGenerator::startIndexItem(const char *ref,const char *f) { //printf("HtmlGenerator::startIndexItem(%s,%s)\n",ref,f); QCString *dest; - t << "<li>"; if (ref || f) { if (ref) @@ -880,7 +888,7 @@ void HtmlGenerator::endIndexItem(const char *ref,const char *f) //printf("HtmlGenerator::endIndexItem(%s,%s,%s)\n",ref,f,name); if (ref || f) { - t << "</a>" << endl; + t << "</a>"; } else { @@ -1006,14 +1014,14 @@ void HtmlGenerator::startSection(const char *lab,const char *,SectionInfo::Secti { switch(type) { - case SectionInfo::Page: t << "<h1>"; break; - case SectionInfo::Section: t << "<h2>"; break; - case SectionInfo::Subsection: t << "<h3>"; break; - case SectionInfo::Subsubsection: t << "<h4>"; break; - case SectionInfo::Paragraph: t << "<h5>"; break; + case SectionInfo::Page: t << "\n\n<h1>"; break; + case SectionInfo::Section: t << "\n\n<h2>"; break; + case SectionInfo::Subsection: t << "\n\n<h3>"; break; + case SectionInfo::Subsubsection: t << "\n\n<h4>"; break; + case SectionInfo::Paragraph: t << "\n\n<h5>"; break; default: ASSERT(0); break; } - t << "<a class=\"anchor\" name=\"" << lab << "\">"; + t << "<a class=\"anchor\" id=\"" << lab << "\">"; } void HtmlGenerator::endSection(const char *,SectionInfo::SectionType type) @@ -1095,6 +1103,10 @@ void HtmlGenerator::codify(const char *str) break; case '&': t << "&"; col++; break; + case '\'': t << "'"; col++; + break; + case '"': t << """; col++; + break; //case ' ': t << " "; col++; // break; case '\\': @@ -1133,10 +1145,13 @@ void HtmlGenerator::endClassDiagram(const ClassDiagram &d, { t << "</div>" << endl; t << "<div class=\"dynsection\">" << endl; - t << "\n<p><center><img src=\"" - << relPath << fileName << ".png\" usemap=\"#" << name << "_map\"" - << " border=\"0\" alt=\"\"></center>" << endl - << "<map name=\"" << name << "_map\">" << endl; + t << "<img class=\"center\" src=\""; + t << relPath << fileName << ".png\" usemap=\"#"; + docify(name); + t << "_map\" alt=\"\"/>" << endl; + t << "<map id=\""; + docify(name); + t << "_map\">" << endl; d.writeImage(t,dir,relPath,fileName); t << "</div>" << endl; @@ -1179,10 +1194,10 @@ void HtmlGenerator::startMemberItem(int annoType) t << "<tr>"; switch(annoType) { - case 0: t << "<td class=\"memItemLeft\" nowrap align=\"right\" valign=\"top\">"; break; - case 1: t << "<td class=\"memItemLeft\" nowrap>"; break; - case 2: t << "<td class=\"memItemLeft\" nowrap valign=\"top\">"; break; - default: t << "<td class=\"memTemplParams\" nowrap colspan=\"2\">"; break; + case 0: t << "<td class=\"memItemLeft\" align=\"right\" valign=\"top\">"; break; + case 1: t << "<td class=\"memItemLeft\" >"; break; + case 2: t << "<td class=\"memItemLeft\" valign=\"top\">"; break; + default: t << "<td class=\"memTemplParams\" colspan=\"2\">"; break; } } else @@ -1196,7 +1211,7 @@ void HtmlGenerator::endMemberItem() //DBG_HTML(t << "<!-- endMemberItem(" << (int)inGroup << "," << fileName << "," << headerName << " -->" << endl) if (Config_getBool("HTML_ALIGN_MEMBERS")) { - t << "</td></tr>\n"; + t << "</td></tr>"; } t << endl; } @@ -1210,7 +1225,7 @@ void HtmlGenerator::endMemberTemplateParams() if (Config_getBool("HTML_ALIGN_MEMBERS")) { t << "</td></tr>" << endl; - t << "<tr><td class=\"memTemplItemLeft\" nowrap align=\"right\" valign=\"top\">"; + t << "<tr><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">"; } } @@ -1243,11 +1258,11 @@ void HtmlGenerator::endMemberDescription() DBG_HTML(t << "<!-- endMemberDescription -->" << endl) if (Config_getBool("HTML_ALIGN_MEMBERS")) { - t << "<br></td></tr>" << endl; + t << "<br/></td></tr>" << endl; } else { - t << "<br></dl>"; + t << "<br/></dl>"; } } @@ -1276,7 +1291,7 @@ void HtmlGenerator::startMemberHeader() DBG_HTML(t << "<!-- startMemberHeader -->" << endl) if (Config_getBool("HTML_ALIGN_MEMBERS")) { - t << "<tr><td colspan=\"2\"><br><h2>"; + t << "<tr><td colspan=\"2\"><br/><h2>"; } else { @@ -1306,7 +1321,7 @@ void HtmlGenerator::startMemberSubtitle() void HtmlGenerator::endMemberSubtitle() { DBG_HTML(t << "<!-- endMemberSubtitle -->" << endl) - if (Config_getBool("HTML_ALIGN_MEMBERS")) t << "<br><br></td></tr>" << endl; + if (Config_getBool("HTML_ALIGN_MEMBERS")) t << "<br/><br/></td></tr>" << endl; } void HtmlGenerator::startIndexList() @@ -1400,7 +1415,7 @@ void HtmlGenerator::startMemberDocName(bool /*align*/) void HtmlGenerator::endMemberDocName() { DBG_HTML(t << "<!-- endMemberDocName -->" << endl;) - t << " </td>" << endl; + t << "</td>" << endl; } void HtmlGenerator::startParameterList(bool openBracket) @@ -1449,7 +1464,7 @@ void HtmlGenerator::endParameterName(bool last,bool emptyList,bool closeBracket) { if (emptyList) { - t << " </td>" << endl; + t << "</td>" << endl; t << " <td>"; if (closeBracket) t << " )"; t << " </td>" << endl; @@ -1507,11 +1522,11 @@ void HtmlGenerator::endDotGraph(const DotClassGraph &g) g.writeGraph(t,BITMAP,dir,relPath); if (Config_getBool("GENERATE_LEGEND")) { - t << "<center><font size=\"2\">["; + t << "<center><span class=\"legend\">["; startHtmlLink(relPath+"graph_legend"+Doxygen::htmlFileExtension); t << theTranslator->trLegend(); endHtmlLink(); - t << "]</font></center>"; + t << "]</span></center>"; } t << "</div>" << endl; } @@ -1590,7 +1605,7 @@ void HtmlGenerator::startMemberGroupDocs() void HtmlGenerator::endMemberGroupDocs() { - t << "<br><br></div></td></tr>" << endl; + t << "<br/><br/></div></td></tr>" << endl; } void HtmlGenerator::startMemberGroup() @@ -1611,7 +1626,7 @@ void HtmlGenerator::startIndent() void HtmlGenerator::endIndent() { DBG_HTML(t << "<!-- endIndent -->" << endl;) - t << endl << "</div>" << endl << "</div><p>" << endl; + t << endl << "</div>" << endl << "</div>" << endl; } void HtmlGenerator::addIndexItem(const char *,const char *) @@ -1653,7 +1668,7 @@ void HtmlGenerator::startSimpleSect(SectionTypes, const char *filename,const char *anchor, const char *title) { - t << "<dl compact><dt><b>"; + t << "<dl><dt><b>"; if (filename) { writeObjectLink(0,filename,anchor,title); @@ -1673,7 +1688,7 @@ void HtmlGenerator::endSimpleSect() void HtmlGenerator::startParamList(ParamListTypes, const char *title) { - t << "<dl compact><dt><b>"; + t << "<dl><dt><b>"; docify(title); t << "</b></dt>"; } @@ -2041,7 +2056,7 @@ void HtmlGenerator::generateSectionImages() void HtmlGenerator::startConstraintList(const char *header) { t << "<div class=\"typeconstraint\">" << endl; - t << "<dl compact><dt><b>" << header << "</b><dt><dd>" << endl; + t << "<dl><dt><b>" << header << "</b><dt><dd>" << endl; t << "<table border=\"0\" cellspacing=\"2\" cellpadding=\"0\">" << endl; } @@ -2086,11 +2101,11 @@ void HtmlGenerator::lineBreak(const char *style) { if (style) { - t << "<br class=\"" << style << "\">" << endl; + t << "<br class=\"" << style << "\"/>" << endl; } else { - t << "<br>" << endl; + t << "<br/>" << endl; } } diff --git a/src/htmlgen.h b/src/htmlgen.h index 32ef613..76467a2 100644 --- a/src/htmlgen.h +++ b/src/htmlgen.h @@ -63,10 +63,11 @@ class HtmlGenerator : public OutputGenerator void startTitle() { t << "<h1>"; } void endTitle() { t << "</h1>"; } - void newParagraph(); void startParagraph(); void endParagraph(); void writeString(const char *text); + void startIndexListItem(); + void endIndexListItem(); void startIndexList(); void endIndexList(); void startIndexKey(); @@ -92,7 +93,8 @@ class HtmlGenerator : public OutputGenerator void endTypewriter() { t << "</code>"; } void startGroupHeader(); void endGroupHeader(); - void writeListItem() { t << "<li>"; } + void startItemListItem() { t << "<li>"; } + void endItemListItem() { t << "</li>\n"; } void startMemberSections(); void endMemberSections(); @@ -122,7 +124,7 @@ class HtmlGenerator : public OutputGenerator void startMemberDescription(); void endMemberDescription(); - void writeRuler() { t << "<hr>"; } + void writeRuler() { t << "<hr/>"; } void writeAnchor(const char *,const char *name) { t << "<a name=\"" << name <<"\"></a>"; } void startCodeFragment() { t << PREFRAG_START; } @@ -134,10 +136,12 @@ class HtmlGenerator : public OutputGenerator void endEmphasis() { t << "</em>"; } void startBold() { t << "<b>"; } void endBold() { t << "</b>"; } - void startDescription() { t << endl << "<dl compact>" << endl; } - void endDescription() { t << endl << "</dl>" << endl; } + void startDescription() { t << endl << "<dl>" << endl; } + void endDescription() { t << endl << "</dl>\n" << endl; } void startDescItem() { t << "<dt>"; } - void endDescItem() { t << "<dd>"; } + void endDescItem() { t << "</dt>"; } + void startDescForItem() { t << "<dd>"; } + void endDescForItem() { t << "</dd>\n"; } void lineBreak(const char *style); void writeChar(char c); void startMemberDoc(const char *,const char *,const char *,const char *); @@ -160,13 +164,13 @@ class HtmlGenerator : public OutputGenerator void endCenter() { t << "</center>" << endl; } void startSmall() { t << "<small>" << endl; } void endSmall() { t << "</small>" << endl; } - void startDescList(SectionTypes) { t << "<dl compact><dt><b>" << endl; } - void endDescList() { t << "</dl>"; } + //void startDescList(SectionTypes) { t << "<dl compact><dt><b>" << endl; } + //void endDescList() { t << "</dl>"; } void startSimpleSect(SectionTypes,const char *,const char *,const char *); void endSimpleSect(); void startParamList(ParamListTypes,const char *); void endParamList(); - void writeDescItem() { t << "<dd>" << endl; } + //void writeDescItem() { t << "<dd>" << endl; } void startSection(const char *,const char *,SectionInfo::SectionType); void endSection(const char *,SectionInfo::SectionType); void addIndexItem(const char *,const char *); diff --git a/src/index.cpp b/src/index.cpp index f42e2b1..bcfe4eb 100644 --- a/src/index.cpp +++ b/src/index.cpp @@ -336,6 +336,7 @@ void writeClassTree(OutputList &ol,BaseClassList *bcl,bool hideSuper,int level,F ftv->incContentsDepth(); started=TRUE; } + ol.startIndexListItem(); //printf("Passed...\n"); bool hasChildren = !cd->visited && !hideSuper && classHasVisibleChildren(cd); //printf("tree4: Has children %s: %d\n",cd->name().data(),hasChildren); @@ -371,6 +372,7 @@ void writeClassTree(OutputList &ol,BaseClassList *bcl,bool hideSuper,int level,F cd->visited=TRUE; writeClassTree(ol,cd->subClasses(),wasVisited,level+1,ftv); } + ol.endIndexListItem(); } } if (started) @@ -500,6 +502,7 @@ static void writeClassTreeForList(OutputList &ol,ClassSDict *cl,bool &started,FT Doxygen::indexList.incContentsDepth(); started=TRUE; } + ol.startIndexListItem(); bool hasChildren = !cd->visited && classHasVisibleChildren(cd); //printf("list: Has children %s: %d\n",cd->name().data(),hasChildren); if (cd->isLinkable()) @@ -533,6 +536,7 @@ static void writeClassTreeForList(OutputList &ol,ClassSDict *cl,bool &started,FT writeClassTree(ol,cd->subClasses(),cd->visited,1,ftv); cd->visited=TRUE; } + ol.endIndexListItem(); } } } @@ -617,10 +621,11 @@ void writeHierarchicalIndex(OutputList &ol) { ol.disable(OutputGenerator::Latex); ol.disable(OutputGenerator::RTF); + ol.startParagraph(); ol.startTextLink("inherits",0); ol.parseText(theTranslator->trGotoGraphicalHierarchy()); ol.endTextLink(); - ol.newParagraph(); + ol.endParagraph(); ol.enable(OutputGenerator::Latex); ol.enable(OutputGenerator::RTF); } @@ -665,10 +670,11 @@ void writeGraphicalClassHierarchy(OutputList &ol) endTitle(ol,0,0); ol.startTextBlock(); Doxygen::indexList.addContentsItem(FALSE,theTranslator->trGraphicalHierarchy(),0,"inherits",0); + ol.startParagraph(); ol.startTextLink("hierarchy",0); ol.parseText(theTranslator->trGotoTextualHierarchy()); ol.endTextLink(); - ol.newParagraph(); + ol.endParagraph(); //parseText(ol,theTranslator->trClassHierarchyDescription()); //ol.newParagraph(); ol.endTextBlock(); @@ -1080,6 +1086,25 @@ void writeAnnotatedClassList(OutputList &ol) ol.endIndexList(); } +static QCString letterToLabel(char startLetter) +{ + QCString s(5); + if (isId(startLetter)) + { + s[0]=startLetter; s[1]=0; + } + else + { + const char hex[]="0123456789abcdef"; + s[0]='0'; + s[1]='x'; + s[2]=hex[startLetter>>4]; + s[3]=hex[startLetter&0xF]; + s[4]=0; + } + return s; +} + //---------------------------------------------------------------------------- class PrefixIgnoreClassList : public ClassList @@ -1123,7 +1148,7 @@ void writeAlphabeticalClassList(OutputList &ol) } } - QCString alphaLinks = "<p><div class=\"qindex\">"; + QCString alphaLinks = "<div class=\"qindex\">"; int l; for (l = 0; l < 256; l++) { @@ -1137,7 +1162,7 @@ void writeAlphabeticalClassList(OutputList &ol) } } - alphaLinks += "</div><p>\n"; + alphaLinks += "</div>\n"; ol.writeString(alphaLinks); ol.writeString("<table align=\"center\" width=\"95%\" border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n"); @@ -1236,7 +1261,7 @@ void writeAlphabeticalClassList(OutputList &ol) //printf("head ClassDef=%p %s\n",cd,cd ? cd->name().data() : "<none>"); int index = getPrefixIndex(cd->className()); startLetter=toupper(cd->className().at(index)); - char s[2]; s[0]=startLetter; s[1]=0; + QCString s = letterToLabel(startLetter); //ol.writeIndexHeading(s); ol.writeString("<a name=\"letter_"); ol.writeString(s); @@ -1437,6 +1462,7 @@ static void writeMemberList(OutputList &ol,bool useSections,int page, QCString prevDefName; bool first=TRUE; bool firstSection=TRUE; + bool firstItem=TRUE; for (pi=startIndex; pi<=endIndex; pi++) // page==-1 => pi=[0..127], page!=-1 => pi=page { MemberIndexList *ml = &memberLists[pi]; @@ -1457,16 +1483,20 @@ static void writeMemberList(OutputList &ol,bool useSections,int page, tolower(name.at(startIndex))!=tolower(prevName.at(0))) && useSections) // new section { + if (!firstItem) ol.endItemListItem(); if (!firstSection) ol.endItemList(); - char cs[2]; - cs[0]=tolower(name.at(startIndex));cs[1]='\0'; + char cl[2]; + cl[0] = tolower(name.at(startIndex)); + cl[1] = 0; + QCString cs = letterToLabel(cl[0]); QCString anchor=(QCString)"index_"+cs; - QCString title=(QCString)"- "+cs+" -"; + QCString title=(QCString)"- "+cl+" -"; ol.startSection(anchor,title,SectionInfo::Subsection); ol.docify(title); ol.endSection(anchor,SectionInfo::Subsection); ol.startItemList(); firstSection=FALSE; + firstItem=TRUE; } else if (!useSections && first) { @@ -1475,7 +1505,9 @@ static void writeMemberList(OutputList &ol,bool useSections,int page, } // member name - ol.writeListItem(); + if (!firstItem) ol.endItemListItem(); + ol.startItemListItem(); + firstItem=FALSE; ol.docify(name); if (isFunc) ol.docify("()"); ol.writeString("\n"); @@ -1494,6 +1526,7 @@ static void writeMemberList(OutputList &ol,bool useSections,int page, writeLinkForMemberMap[(int)type](ol,md,sep,prevDefName); } } + if (!firstItem) ol.endItemListItem(); ol.endItemList(); } @@ -1848,7 +1881,7 @@ static void writeClassMemberIndexFiltered(OutputList &ol, ClassMemberHighlight h // normal lists otherwise ol.writeString(" "); } - ol.newParagraph(); + //ol.newParagraph(); // FIXME:PARA writeMemberList(ol,quickIndex, multiPageIndex?page:-1, g_memberIndexLetterUsed[hl], @@ -1979,7 +2012,7 @@ static void writeFileMemberIndexFiltered(OutputList &ol, FileMemberHighlight hl) // normal lists otherwise ol.writeString(" "); } - ol.newParagraph(); + //ol.newParagraph(); // FIXME:PARA //writeFileMemberList(ol,quickIndex,hl,page); writeMemberList(ol,quickIndex, multiPageIndex?page:-1, @@ -2107,7 +2140,7 @@ static void writeNamespaceMemberIndexFiltered(OutputList &ol, // normal lists otherwise ol.writeString(" "); } - ol.newParagraph(); + //ol.newParagraph(); // FIXME:PARA //writeNamespaceMemberList(ol,quickIndex,hl,page); writeMemberList(ol,quickIndex, @@ -2164,7 +2197,7 @@ void writeExampleIndex(OutputList &ol) PageDef *pd=0; for (pdi.toFirst();(pd=pdi.current());++pdi) { - ol.writeListItem(); + ol.startItemListItem(); QCString n=pd->getOutputFileBase(); if (!pd->title().isEmpty()) { @@ -2176,6 +2209,7 @@ void writeExampleIndex(OutputList &ol) ol.writeObjectLink(0,n,0,pd->name()); Doxygen::indexList.addContentsItem(FALSE,pd->name(),pd->getReference(),n,0); } + ol.endItemListItem(); ol.writeString("\n"); } ol.endItemList(); @@ -2270,6 +2304,7 @@ void writePageIndex(OutputList &ol) bool hasSubPages = pd->hasSubPages(); + ol.startIndexListItem(); ol.startIndexItem(pd->getReference(),pd->getOutputFileBase()); ol.parseText(pageTitle); ol.endIndexItem(pd->getReference(),pd->getOutputFileBase()); @@ -2282,6 +2317,7 @@ void writePageIndex(OutputList &ol) ol.writeString("\n"); Doxygen::indexList.addContentsItem(hasSubPages,pageTitle,pd->getReference(),pd->getOutputFileBase(),0); writeSubPages(pd); + ol.endIndexListItem(); } } endIndexHierarchy(ol,0); @@ -2379,7 +2415,6 @@ void writeGroupIndexItem(GroupDef *gd,MemberList *ml,const QCString &title) //---------------------------------------------------------------------------- /*! * write groups as hierarchical trees - * \author KPW */ void writeGroupTreeNode(OutputList &ol, GroupDef *gd, int level, FTVHelp* ftv) { @@ -2437,6 +2472,7 @@ void writeGroupTreeNode(OutputList &ol, GroupDef *gd, int level, FTVHelp* ftv) //parseText(ol,gd->groupTitle()); //ol.endTextLink(); + ol.startIndexListItem(); ol.startIndexItem(gd->getReference(),gd->getOutputFileBase()); ol.parseText(gd->groupTitle()); ol.endIndexItem(gd->getReference(),gd->getOutputFileBase()); @@ -2572,6 +2608,7 @@ void writeGroupTreeNode(OutputList &ol, GroupDef *gd, int level, FTVHelp* ftv) Doxygen::indexList.decContentsDepth(); } } + ol.endIndexListItem(); Doxygen::indexList.decContentsDepth(); if (ftv) @@ -2627,6 +2664,7 @@ void writeDirTreeNode(OutputList &ol, DirDef *dd, int level, FTVHelp* ftv) ftv->incContentsDepth(); } + ol.startIndexListItem(); ol.startIndexItem(dd->getReference(),dd->getOutputFileBase()); ol.parseText(dd->shortName()); ol.endIndexItem(dd->getReference(),dd->getOutputFileBase()); @@ -2664,6 +2702,7 @@ void writeDirTreeNode(OutputList &ol, DirDef *dd, int level, FTVHelp* ftv) } } } + ol.endIndexListItem(); Doxygen::indexList.decContentsDepth(); if (ftv) @@ -2710,6 +2749,7 @@ void writeGroupIndex(OutputList &ol) Doxygen::indexList.incContentsDepth(); ol.parseText(theTranslator->trModulesDescription()); ol.endTextBlock(); + FTVHelp* ftv = NULL; QCString& TreeView=Config_getEnum("GENERATE_TREEVIEW"); if (TreeView=="HIERARCHIES" || TreeView=="ALL") @@ -2857,7 +2897,7 @@ void writeIndex(OutputList &ol) } } ol.endTitleHead(0,0); - ol.newParagraph(); + // ol.newParagraph(); // FIXME:PARA if (!Config_getString("PROJECT_NUMBER").isEmpty()) { ol.startProjectNumber(); diff --git a/src/latexgen.cpp b/src/latexgen.cpp index f3f6be3..aca7fac 100644 --- a/src/latexgen.cpp +++ b/src/latexgen.cpp @@ -412,6 +412,7 @@ static void writeDefaultStyleSheetPart3(QTextStream &t) t << "\\definecolor{vhdldigit}{rgb}{1.0,0.0,1.0}\n"; t << "\\definecolor{vhdlkeyword}{rgb}{0.43,0.0,0.43}\n"; t << "\\definecolor{vhdllogic}{rgb}{1.0,0.0,0.0}\n"; + t << "\\definecolor{vhdlchar}{rgb}{0.0,0.0,0.0}\n"; } void LatexGenerator::writeHeaderFile(QFile &f) diff --git a/src/latexgen.h b/src/latexgen.h index 00e52f8..2967c74 100644 --- a/src/latexgen.h +++ b/src/latexgen.h @@ -65,6 +65,8 @@ class LatexGenerator : public OutputGenerator void startParagraph(); void endParagraph(); void writeString(const char *text); + void startIndexListItem() {} + void endIndexListItem() {} void startIndexList() { t << "\\begin{CompactList}" << endl; } void endIndexList() { t << "\\end{CompactList}" << endl; } void startIndexKey(); @@ -90,7 +92,8 @@ class LatexGenerator : public OutputGenerator void endTypewriter() { t << "}"; } void startGroupHeader(); void endGroupHeader(); - void writeListItem() { t << "\\item " << endl; } + void startItemListItem() { t << "\\item " << endl; } + void endItemListItem() {} void startMemberSections() {} void endMemberSections() {} @@ -161,7 +164,8 @@ class LatexGenerator : public OutputGenerator void endSimpleSect(); void startParamList(ParamListTypes,const char *title); void endParamList(); - void writeDescItem() { t << "\\par" << endl; } + void startDescForItem() { t << "\\par" << endl; } + void endDescForItem() {} void startSection(const char *,const char *,SectionInfo::SectionType); void endSection(const char *,SectionInfo::SectionType); void addIndexItem(const char *,const char *); diff --git a/src/mangen.cpp b/src/mangen.cpp index c438a15..35ffc26 100644 --- a/src/mangen.cpp +++ b/src/mangen.cpp @@ -356,7 +356,7 @@ void ManGenerator::endTitle() t << "\""; } -void ManGenerator::writeListItem() +void ManGenerator::startItemListItem() { if (!firstCol) t << endl; t << ".TP" << endl; @@ -365,6 +365,10 @@ void ManGenerator::writeListItem() col=0; } +void ManGenerator::endItemListItem() +{ +} + void ManGenerator::startCodeFragment() { newParagraph(); @@ -476,7 +480,7 @@ void ManGenerator::startDescItem() // paragraph=TRUE; //} -void ManGenerator::writeDescItem() +void ManGenerator::startDescForItem() { if (!firstCol) t << endl; if (!paragraph) t << ".in -1c" << endl; @@ -486,6 +490,10 @@ void ManGenerator::writeDescItem() col=0; } +void ManGenerator::endDescForItem() +{ +} + void ManGenerator::endDescItem() { t << "\" 1c" << endl; @@ -669,13 +677,14 @@ void ManGenerator::startConstraintList(const char *header) void ManGenerator::startConstraintParam() { - writeListItem(); + startItemListItem(); startEmphasis(); } void ManGenerator::endConstraintParam() { endEmphasis(); + endItemListItem(); t << " : "; } diff --git a/src/mangen.h b/src/mangen.h index 8dbe7b8..4254649 100644 --- a/src/mangen.h +++ b/src/mangen.h @@ -63,6 +63,8 @@ class ManGenerator : public OutputGenerator void startParagraph(); void endParagraph(); void writeString(const char *text); + void startIndexListItem() {} + void endIndexListItem() {} void startIndexList() {} void endIndexList() { newParagraph(); } void startIndexKey() {} @@ -95,7 +97,9 @@ class ManGenerator : public OutputGenerator void insertMemberAlign(bool) {} void startMemberSubtitle() {} void endMemberSubtitle() {} - void writeListItem(); + //void writeListItem(); + void startItemListItem(); + void endItemListItem(); void startMemberDocList() {} void endMemberDocList() {} void startMemberList(); @@ -157,7 +161,9 @@ class ManGenerator : public OutputGenerator void endSimpleSect(); void startParamList(ParamListTypes,const char *title); void endParamList(); - void writeDescItem(); + //void writeDescItem(); + void startDescForItem(); + void endDescForItem(); void startSection(const char *,const char *,SectionInfo::SectionType); void endSection(const char *,SectionInfo::SectionType); void addIndexItem(const char *,const char *) {} @@ -177,7 +183,7 @@ class ManGenerator : public OutputGenerator void startDescTable() {} void endDescTable() {} - void startDescTableTitle() { writeListItem(); startBold(); startEmphasis(); } + void startDescTableTitle() { startItemListItem(); startBold(); startEmphasis(); endItemListItem(); } void endDescTableTitle() { endEmphasis(); endBold(); } void startDescTableData() { t << endl; firstCol=TRUE; } void endDescTableData() {} diff --git a/src/memberdef.cpp b/src/memberdef.cpp index c708ffd..7bbfed4 100644 --- a/src/memberdef.cpp +++ b/src/memberdef.cpp @@ -140,9 +140,14 @@ static bool writeDefArgumentList(OutputList &ol,ClassDef *cd, //if (!md->isDefine()) ol.startParameter(TRUE); else ol.docify(" "); bool first=TRUE; + bool paramTypeStarted=FALSE; while (a) { - if (md->isDefine() || first) ol.startParameterType(first,md->isObjCMethod()?"dummy":0); + if (md->isDefine() || first) + { + ol.startParameterType(first,md->isObjCMethod()?"dummy":0); + paramTypeStarted=TRUE; + } QRegExp re(")("),res("(.*\\*"); int vp=a->type.find(re); int wp=a->type.find(res); @@ -179,7 +184,11 @@ static bool writeDefArgumentList(OutputList &ol,ClassDef *cd, } if (!md->isDefine()) { - ol.endParameterType(); + if (paramTypeStarted) + { + ol.endParameterType(); + paramTypeStarted=FALSE; + } ol.startParameterName(defArgList->count()<2); } if (hasFuncPtrType) @@ -236,7 +245,16 @@ static bool writeDefArgumentList(OutputList &ol,ClassDef *cd, if (key!=",") key+=":"; // for normal keywords add colon } ol.endParameterName(FALSE,FALSE,!md->isObjCMethod()); + if (paramTypeStarted) + { + ol.endParameterType(); + } ol.startParameterType(FALSE,key); + paramTypeStarted=TRUE; + } + else + { + ol.endParameterName(FALSE,FALSE,TRUE); } } first=FALSE; @@ -1497,7 +1515,6 @@ void MemberDef::writeDeclaration(OutputList &ol, //ol.startEmphasis(); ol.popGeneratorState(); } - //ol.newParagraph(); ol.endMemberDescription(); } warnIfUndocumented(); @@ -1926,10 +1943,11 @@ void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol, ol.endDoxyAnchor(cfname,memAnchor); ol.startIndent(); - ol.pushGeneratorState(); - ol.disable(OutputGenerator::RTF); - ol.newParagraph(); - ol.popGeneratorState(); + // FIXME:PARA + //ol.pushGeneratorState(); + //ol.disable(OutputGenerator::RTF); + //ol.newParagraph(); + //ol.popGeneratorState(); /* write multi-line initializer (if any) */ if (hasMultiLineInitializer() @@ -1969,8 +1987,11 @@ void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol, ) ) { - ol.parseDoc(briefFile(),briefLine(),getOuterScope()?getOuterScope():container,this,brief,FALSE,FALSE); - ol.newParagraph(); + ol.startParagraph(); + ol.parseDoc(briefFile(),briefLine(), + getOuterScope()?getOuterScope():container,this, + brief,FALSE,FALSE,0,TRUE,FALSE); + ol.endParagraph(); } /* write detailed description */ @@ -1980,8 +2001,9 @@ void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol, ol.parseDoc(docFile(),docLine(),getOuterScope()?getOuterScope():container,this,detailed+"\n",TRUE,FALSE); if (!inbodyDocumentation().isEmpty()) { - ol.newParagraph(); + ol.startParagraph(); ol.parseDoc(inbodyFile(),inbodyLine(),getOuterScope()?getOuterScope():container,this,inbodyDocumentation()+"\n",TRUE,FALSE); + ol.endParagraph(); } } else if (!brief.isEmpty() && (Config_getBool("REPEAT_BRIEF") || @@ -1989,7 +2011,6 @@ void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol, { if (!inbodyDocumentation().isEmpty()) { - ol.newParagraph(); ol.parseDoc(inbodyFile(),inbodyLine(),getOuterScope()?getOuterScope():container,this,inbodyDocumentation()+"\n",TRUE,FALSE); } } @@ -2068,9 +2089,8 @@ void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol, { if (first) { - //ol.newParagraph(); ol.startSimpleSect(BaseOutputDocInterface::EnumValues,0,0,theTranslator->trEnumerationValues()+": "); - ol.writeDescItem(); + ol.startDescForItem(); ol.startDescTable(); } @@ -2110,13 +2130,13 @@ void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol, if (!fmd->briefDescription().isEmpty()) { ol.parseDoc(fmd->briefFile(),fmd->briefLine(),getOuterScope()?getOuterScope():container,fmd,fmd->briefDescription(),TRUE,FALSE); - //ol.newParagraph(); - } - if (!fmd->briefDescription().isEmpty() && - !fmd->documentation().isEmpty()) - { - ol.newParagraph(); } + // FIXME:PARA + //if (!fmd->briefDescription().isEmpty() && + // !fmd->documentation().isEmpty()) + //{ + // ol.newParagraph(); + //} if (!fmd->documentation().isEmpty()) { ol.parseDoc(fmd->docFile(),fmd->docLine(),getOuterScope()?getOuterScope():container,fmd,fmd->documentation()+"\n",TRUE,FALSE); @@ -2130,6 +2150,7 @@ void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol, { //ol.endItemList(); ol.endDescTable(); + ol.endDescForItem(); ol.endSimpleSect(); ol.writeChar('\n'); } @@ -2269,9 +2290,9 @@ void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol, if (hasExamples()) { ol.startSimpleSect(BaseOutputDocInterface::Examples,0,0,theTranslator->trExamples()+": "); - ol.writeDescItem(); + ol.startDescForItem(); writeExample(ol,m_impl->exampleSDict); - //ol.endDescItem(); + ol.endDescForItem(); ol.endSimpleSect(); } @@ -2296,10 +2317,11 @@ void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol, { msg("Generating call graph for function %s\n",qualifiedName().data()); ol.disable(OutputGenerator::Man); - ol.newParagraph(); + ol.startParagraph(); ol.startCallGraph(); ol.parseText(theTranslator->trCallGraph()); ol.endCallGraph(callGraph); + ol.endParagraph(); ol.enableAll(); } } @@ -2312,10 +2334,11 @@ void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol, { msg("Generating caller graph for function %s\n",qualifiedName().data()); ol.disable(OutputGenerator::Man); - ol.newParagraph(); + ol.startParagraph(); ol.startCallGraph(); ol.parseText(theTranslator->trCallerGraph()); ol.endCallGraph(callerGraph); + ol.endParagraph(); ol.enableAll(); } } @@ -2518,7 +2541,7 @@ void MemberDef::setAnchor(const char *a) QCString sigStr(33); MD5Buffer((const unsigned char *)memAnchor.data(),memAnchor.length(),md5_sig); MD5SigToString(md5_sig,sigStr.data(),33); - m_impl->anc = sigStr; + m_impl->anc = "a"+sigStr; } void MemberDef::setGroupDef(GroupDef *gd,Grouping::GroupPri_t pri, diff --git a/src/msc.cpp b/src/msc.cpp index 064e414..f17ab0b 100644 --- a/src/msc.cpp +++ b/src/msc.cpp @@ -81,7 +81,7 @@ static bool convertMapFile(QTextStream &t,const char *mapName,const QCString rel } t << "\" shape=\"rect\" coords=\"" << x1 << "," << y1 << "," << x2 << "," << y2 << "\"" - << " alt=\"\">" << endl; + << " alt=\"\"/>" << endl; } } diff --git a/src/namespacedef.cpp b/src/namespacedef.cpp index 869b5a2..bac6779 100644 --- a/src/namespacedef.cpp +++ b/src/namespacedef.cpp @@ -257,7 +257,7 @@ void NamespaceDef::writeDetailedDescription(OutputList &ol,const QCString &title ol.pushGeneratorState(); ol.disable(OutputGenerator::Man); ol.disable(OutputGenerator::RTF); - ol.newParagraph(); + //ol.newParagraph(); // FIXME:PARA ol.enableAll(); ol.disableAllBut(OutputGenerator::Man); ol.writeString("\n\n"); @@ -268,7 +268,6 @@ void NamespaceDef::writeDetailedDescription(OutputList &ol,const QCString &title ol.parseDoc(docFile(),docLine(),this,0,documentation()+"\n",TRUE,FALSE); } ol.endTextBlock(); - ol.newParagraph(); } } @@ -276,7 +275,9 @@ void NamespaceDef::writeBriefDescription(OutputList &ol) { if (!briefDescription().isEmpty()) { - ol.parseDoc(briefFile(),briefLine(),this,0,briefDescription(),TRUE,FALSE); + ol.startParagraph(); + ol.parseDoc(briefFile(),briefLine(),this,0, + briefDescription(),TRUE,FALSE,0,TRUE,FALSE); ol.pushGeneratorState(); ol.disable(OutputGenerator::RTF); ol.writeString(" \n"); @@ -292,11 +293,13 @@ void NamespaceDef::writeBriefDescription(OutputList &ol) ol.endTextLink(); } ol.popGeneratorState(); + ol.endParagraph(); - ol.pushGeneratorState(); - ol.disable(OutputGenerator::RTF); - ol.newParagraph(); - ol.popGeneratorState(); + // FIXME:PARA + //ol.pushGeneratorState(); + //ol.disable(OutputGenerator::RTF); + //ol.newParagraph(); + //ol.popGeneratorState(); } ol.writeSynopsis(); } @@ -792,10 +795,11 @@ void NamespaceSDict::writeDeclaration(OutputList &ol,const char *title,bool loca ol.endMemberItem(); if (!nd->briefDescription().isEmpty() && Config_getBool("BRIEF_MEMBER_DESC")) { + ol.startParagraph(); ol.startMemberDescription(); ol.parseDoc(nd->briefFile(),nd->briefLine(),nd,0,nd->briefDescription(),FALSE,FALSE); ol.endMemberDescription(); - ol.newParagraph(); + ol.endParagraph(); } } } diff --git a/src/outputgen.h b/src/outputgen.h index 99248f0..6a4158a 100644 --- a/src/outputgen.h +++ b/src/outputgen.h @@ -101,7 +101,7 @@ class BaseOutputDocInterface : public CodeOutputInterface const QCString &,bool) {} virtual void parseText(const QCString &) {} - /*! Start of a bullet list: e.g. \c \<ul\> in html. writeListItem() is + /*! Start of a bullet list: e.g. \c \<ul\> in html. startItemListItem() is * Used for the bullet items. */ virtual void startItemList() = 0; @@ -109,7 +109,12 @@ class BaseOutputDocInterface : public CodeOutputInterface /*! Writes a list item for a bullet or enumerated * list: e.g. \c \<li\> in html */ - virtual void writeListItem() = 0; + virtual void startItemListItem() = 0; + + /*! Writes a list item for a bullet or enumerated + * list: e.g. \c \</li\> in html + */ + virtual void endItemListItem() = 0; /*! Ends a bullet list: e.g. \c \</ul\> in html */ virtual void endItemList() = 0; @@ -130,11 +135,11 @@ class BaseOutputDocInterface : public CodeOutputInterface virtual void writeString(const char *text) = 0; /*! Starts a new paragraph */ - virtual void newParagraph() = 0; + //virtual void newParagraph() = 0; /*! Starts a new paragraph */ virtual void startParagraph() = 0; - /*! End a paragraph */ + /*! Ends a paragraph */ virtual void endParagraph() = 0; /*! Writes a link to an object in the documentation. @@ -211,8 +216,11 @@ class BaseOutputDocInterface : public CodeOutputInterface /*! Starts an item of a description list: e.g. \c \<dt\> in HTML. */ virtual void startDescItem() = 0; + virtual void startDescForItem() = 0; + virtual void endDescForItem() = 0; + /*! Ends an item of a description list and starts the - * description itself: e.g. \c \<dd\> in HTML. + * description itself: e.g. \c \</dt\> in HTML. */ virtual void endDescItem() = 0; @@ -227,7 +235,7 @@ class BaseOutputDocInterface : public CodeOutputInterface virtual void startParamList(ParamListTypes t,const char *title) = 0; virtual void endParamList() = 0; - virtual void writeDescItem() = 0; + //virtual void writeDescItem() = 0; virtual void startTitle() = 0; virtual void endTitle() = 0; @@ -303,6 +311,8 @@ class OutputGenerator : public BaseOutputDocInterface virtual void writeStyleInfo(int part) = 0; virtual void startTitleHead(const char *) = 0; virtual void endTitleHead(const char *fileName,const char *name) = 0; + virtual void startIndexListItem() = 0; + virtual void endIndexListItem() = 0; virtual void startIndexList() = 0; virtual void endIndexList() = 0; virtual void startIndexKey() = 0; diff --git a/src/outputlist.h b/src/outputlist.h index 6187c7d..be467d2 100644 --- a/src/outputlist.h +++ b/src/outputlist.h @@ -97,14 +97,18 @@ class OutputList : public OutputDocInterface { forall(&OutputGenerator::startTitle); } void endTitle() { forall(&OutputGenerator::endTitle); } - void newParagraph() - { forall(&OutputGenerator::newParagraph); } + //void newParagraph() + //{ forall(&OutputGenerator::newParagraph); } void startParagraph() { forall(&OutputGenerator::startParagraph); } void endParagraph() { forall(&OutputGenerator::endParagraph); } void writeString(const char *text) { forall(&OutputGenerator::writeString,text); } + void startIndexListItem() + { forall(&OutputGenerator::startIndexListItem); } + void endIndexListItem() + { forall(&OutputGenerator::endIndexListItem); } void startIndexList() { forall(&OutputGenerator::startIndexList); } void endIndexList() @@ -157,8 +161,12 @@ class OutputList : public OutputDocInterface { forall(&OutputGenerator::startGroupHeader); } void endGroupHeader() { forall(&OutputGenerator::endGroupHeader); } - void writeListItem() - { forall(&OutputGenerator::writeListItem); } + //void writeListItem() + //{ forall(&OutputGenerator::writeListItem); } + void startItemListItem() + { forall(&OutputGenerator::startItemListItem); } + void endItemListItem() + { forall(&OutputGenerator::endItemListItem); } void startMemberSections() { forall(&OutputGenerator::startMemberSections); } void endMemberSections() @@ -251,6 +259,10 @@ class OutputList : public OutputDocInterface { forall(&OutputGenerator::startDescItem); } void endDescItem() { forall(&OutputGenerator::endDescItem); } + void startDescForItem() + { forall(&OutputGenerator::startDescForItem); } + void endDescForItem() + { forall(&OutputGenerator::endDescForItem); } void startSubsection() { forall(&OutputGenerator::startSubsection); } void endSubsection() @@ -286,8 +298,8 @@ class OutputList : public OutputDocInterface { forall(&OutputGenerator::startParamList,t,title); } void endParamList() { forall(&OutputGenerator::endParamList); } - void writeDescItem() - { forall(&OutputGenerator::writeDescItem); } + //void writeDescItem() + //{ forall(&OutputGenerator::writeDescItem); } void startIndent() { forall(&OutputGenerator::startIndent); } void endIndent() diff --git a/src/pagedef.cpp b/src/pagedef.cpp index 05825a6..9091581 100644 --- a/src/pagedef.cpp +++ b/src/pagedef.cpp @@ -119,7 +119,7 @@ void PageDef::writeDocumentation(OutputList &ol) (si=Doxygen::sectionDict.find(pageName))!=0) { ol.startSection(si->label,si->title,si->type); - ol.parseDoc(docFile(),docLine(),this,0,si->title,TRUE,FALSE); + ol.parseDoc(docFile(),docLine(),this,0,si->title,TRUE,FALSE,0,TRUE,FALSE); stringToSearchIndex(getOutputFileBase(), theTranslator->trPage(TRUE,TRUE)+" "+si->title, si->title); @@ -2210,22 +2210,24 @@ CHARLIT (("'"\\[0-7]{1,3}"'")|("'"\\."'")|("'"[^'\\\n]{1,4}"'")) // Deal with file changes due to // #include's within { .. } blocks - QCString lineStr; + QCString lineStr(15+g_yyFileName.length()); lineStr.sprintf("# %d \"%s\" 2",g_yyLineNr,g_yyFileName.data()); outputArray(lineStr.data(),lineStr.length()); delete fs; fs=0; } } -<*>"/*" { - outputChar('/');outputChar('*'); +<*>"/*"[*]? { + outputArray(yytext,yyleng); g_lastCContext=YY_START; g_commentCount=1; + if (yyleng==3) g_lastGuardName.resize(0); // reset guard in case the #define is documented! BEGIN(SkipCComment); } -<*>"//" { - outputChar('/');outputChar('/'); +<*>"//"[/]? { + outputArray(yytext,yyleng); g_lastCPPContext=YY_START; + if (yyleng==3) g_lastGuardName.resize(0); // reset guard in case the #define is documented! BEGIN(SkipCPPComment); } <*>\n { diff --git a/src/rtfgen.cpp b/src/rtfgen.cpp index e97c041..557b3fd 100644 --- a/src/rtfgen.cpp +++ b/src/rtfgen.cpp @@ -972,9 +972,9 @@ void RTFGenerator::endItemList() //} /*! write bullet or enum item */ -void RTFGenerator::writeListItem() +void RTFGenerator::startItemListItem() { - DBG_RTF(t << "{\\comment (writeListItem)}" << endl) + DBG_RTF(t << "{\\comment (startItemListItem)}" << endl) newParagraph(); t << rtf_Style_Reset; if (rtf_listItemInfo[m_listLevel].isEnum) @@ -990,6 +990,11 @@ void RTFGenerator::writeListItem() m_omitParagraph = TRUE; } +void RTFGenerator::endItemListItem() +{ + DBG_RTF(t << "{\\comment (endItemListItem)}" << endl) +} + void RTFGenerator::startIndexItem(const char *,const char *) { DBG_RTF(t << "{\\comment (startIndexItem)}" << endl) @@ -1582,9 +1587,14 @@ void RTFGenerator::startDescList(SectionTypes) // t << rtf_Style_Reset << rtf_DList_DepthStyle(); //} -void RTFGenerator::writeDescItem() +void RTFGenerator::startDescForItem() +{ + DBG_RTF(t << "{\\comment (startDescForItem) }" << endl) +} + +void RTFGenerator::endDescForItem() { - DBG_RTF(t << "{\\comment (writeDescItem) }" << endl) + DBG_RTF(t << "{\\comment (endDescForItem) }" << endl) } //void RTFGenerator::endDescList() diff --git a/src/rtfgen.h b/src/rtfgen.h index 3c895bf..36f748d 100644 --- a/src/rtfgen.h +++ b/src/rtfgen.h @@ -63,6 +63,8 @@ class RTFGenerator : public OutputGenerator void startParagraph(); void endParagraph(); void writeString(const char *text); + void startIndexListItem() {} + void endIndexListItem() {} void startIndexList(); void endIndexList(); void startIndexKey(); @@ -88,7 +90,9 @@ class RTFGenerator : public OutputGenerator void endTypewriter() { t << "}"; } void startGroupHeader(); void endGroupHeader(); - void writeListItem(); + //void writeListItem(); + void startItemListItem(); + void endItemListItem(); void startMemberSections() {} void endMemberSections() {} @@ -152,7 +156,9 @@ class RTFGenerator : public OutputGenerator void endSimpleSect(); void startParamList(ParamListTypes,const char *); void endParamList(); - void writeDescItem(); + //void writeDescItem(); + void startDescForItem(); + void endDescForItem(); void startSection(const char *,const char *,SectionInfo::SectionType); void endSection(const char *,SectionInfo::SectionType); void addIndexItem(const char *,const char *); diff --git a/src/scanner.l b/src/scanner.l index bd46a13..d189bef 100644 --- a/src/scanner.l +++ b/src/scanner.l @@ -1000,6 +1000,7 @@ TYPEDEFPREFIX (("typedef"{BN}+)?)((("volatile"|"const"){BN}+)?) lineCount() ; } <FindMembers>[\-+]{BN}* { + printf("Found - insideObj=%d\n",insideObjC); if (!insideObjC) { REJECT; @@ -1477,7 +1478,8 @@ TYPEDEFPREFIX (("typedef"{BN}+)?)((("volatile"|"const"){BN}+)?) isTypedef=((QCString)yytext).find("typedef")!=-1; current->section = Entry::CLASS_SEC ; current->spec = Entry::Struct; - current->objc = insideObjC = FALSE; + // bug 582676: can be a struct nested in an interface so keep insideObjC state + //current->objc = insideObjC = FALSE; addType( current ) ; current->type += " struct" ; current->fileName = yyFileName; @@ -1534,7 +1536,8 @@ TYPEDEFPREFIX (("typedef"{BN}+)?)((("volatile"|"const"){BN}+)?) isTypedef=((QCString)yytext).find("typedef")!=-1; current->section = Entry::CLASS_SEC; current->spec = Entry::Union; - current->objc = insideObjC = FALSE; + // bug 582676: can be a struct nested in an interface so keep insideObjC state + //current->objc = insideObjC = FALSE; addType( current ) ; current->type += " union" ; current->fileName = yyFileName; diff --git a/src/translator_en.h b/src/translator_en.h index 72ff0c3..c71957e 100644 --- a/src/translator_en.h +++ b/src/translator_en.h @@ -1042,30 +1042,33 @@ class TranslatorEnglish : public Translator "};\n" "\\endcode\n" "This will result in the following graph:" - "<p><center><img alt=\"\" src=\"graph_legend."+Config_getEnum("DOT_IMAGE_FORMAT")+"\"></center>\n" + "<p><center><img alt=\"\" src=\"graph_legend."+Config_getEnum("DOT_IMAGE_FORMAT")+"\"></center></p>\n" "<p>\n" "The boxes in the above graph have the following meaning:\n" + "</p>\n" "<ul>\n" "<li>%A filled gray box represents the struct or class for which the " - "graph is generated.\n" - "<li>%A box with a black border denotes a documented struct or class.\n" - "<li>%A box with a grey border denotes an undocumented struct or class.\n" + "graph is generated.</li>\n" + "<li>%A box with a black border denotes a documented struct or class.</li>\n" + "<li>%A box with a grey border denotes an undocumented struct or class.</li>\n" "<li>%A box with a red border denotes a documented struct or class for" "which not all inheritance/containment relations are shown. %A graph is " - "truncated if it does not fit within the specified boundaries.\n" + "truncated if it does not fit within the specified boundaries.</li>\n" "</ul>\n" + "<p>\n" "The arrows have the following meaning:\n" + "</p>\n" "<ul>\n" "<li>%A dark blue arrow is used to visualize a public inheritance " - "relation between two classes.\n" - "<li>%A dark green arrow is used for protected inheritance.\n" - "<li>%A dark red arrow is used for private inheritance.\n" + "relation between two classes.</li>\n" + "<li>%A dark green arrow is used for protected inheritance.</li>\n" + "<li>%A dark red arrow is used for private inheritance.</li>\n" "<li>%A purple dashed arrow is used if a class is contained or used " "by another class. The arrow is labeled with the variable(s) " - "through which the pointed class or struct is accessible.\n" + "through which the pointed class or struct is accessible.</li>\n" "<li>%A yellow dashed arrow denotes a relation between a template instance and " "the template class it was instantiated from. The arrow is labeled with " - "the template parameters of the instance.\n" + "the template parameters of the instance.</li>\n" "</ul>\n"; } /*! text for the link to the legend page */ diff --git a/src/translator_pl.h b/src/translator_pl.h index f5041c1..bddd7ff 100644 --- a/src/translator_pl.h +++ b/src/translator_pl.h @@ -20,7 +20,7 @@ #ifndef TRANSLATOR_PL_H #define TRANSLATOR_PL_H -class TranslatorPolish : public TranslatorAdapter_1_4_6 +class TranslatorPolish : public Translator { private: /*! to avoid macro redefinition from translator_pl.h */ @@ -489,12 +489,6 @@ class TranslatorPolish : public TranslatorAdapter_1_4_6 { return decode("Dokumentacja typów wyliczanych"); } /*! This is used in the documentation of a file/namespace before the list - * of documentation blocks for enumeration values - */ - QCString trEnumerationValueDocumentation() - { return decode("Dokumentacja wartości wyliczanych"); } - - /*! This is used in the documentation of a file/namespace before the list * of documentation blocks for functions */ QCString trFunctionDocumentation() @@ -636,12 +630,12 @@ class TranslatorPolish : public TranslatorAdapter_1_4_6 case ClassDef::Struct: result+=" struktury "; break; case ClassDef::Union: result+=" unii "; break; case ClassDef::Interface: result+=" interfejsu "; break; - case ClassDef::Protocol: result+=decode(" protocol "); break; // translate me! - case ClassDef::Category: result+=decode(" category "); break; // translate me! - case ClassDef::Exception: result+=decode(" wyjątku "); break; + case ClassDef::Protocol: result+=" protokołu "; break; + case ClassDef::Category: result+=" kategorii "; break; + case ClassDef::Exception: result+=" wyjątku "; break; } result+=(QCString)clName; - return result; + return decode(result); } /*! used as the title of the HTML page of a file */ @@ -795,8 +789,8 @@ class TranslatorPolish : public TranslatorAdapter_1_4_6 case ClassDef::Struct: result+="j struktury"; break; case ClassDef::Union: result+="j unii"; break; case ClassDef::Interface: result+="go interfejsu"; break; - case ClassDef::Protocol: result+=decode("protocol"); break; // translate me! - case ClassDef::Category: result+=decode("category"); break; // translate me! + case ClassDef::Protocol: result+="go protokołu"; break; + case ClassDef::Category: result+="j kategorii"; break; case ClassDef::Exception: result+="go wyjątku"; break; } result+=" została wygenerowana z plik"; @@ -1574,6 +1568,220 @@ class TranslatorPolish : public TranslatorAdapter_1_4_6 return "To jest metoda przeciążona, udostępniona dla wygody. " "Różni się od powyższej metody tylko zestawem akceptowanych argumentów."; } + +////////////////////////////////////////////////////////////////////////// +// new since 1.4.6 +////////////////////////////////////////////////////////////////////////// + + /*! This is used to introduce a caller (or called-by) graph */ + virtual QCString trCallerGraph() + { + return "Oto graf wywoływań tej funkcji:"; + } + + /*! This is used in the documentation of a file/namespace before the list + * of documentation blocks for enumeration values + */ + virtual QCString trEnumerationValueDocumentation() + { return "Dokumentacja wyliczeń"; } //TODO check if it is correct translation + +////////////////////////////////////////////////////////////////////////// +// new since 1.5.4 (mainly for Fortran) +////////////////////////////////////////////////////////////////////////// + + /*! header that is put before the list of member subprograms (Fortran). */ + virtual QCString trMemberFunctionDocumentationFortran() + { return "Dokumentacja składowej funkcji/podprogramu"; } + + /*! This is put above each page as a link to the list of annotated data types (Fortran). */ + virtual QCString trCompoundListFortran() + { return "Lista typów danych"; } + + /*! This is put above each page as a link to all members of compounds (Fortran). */ + virtual QCString trCompoundMembersFortran() + { return "Pola danych"; } + + /*! This is an introduction to the annotated compound list (Fortran). */ + virtual QCString trCompoundListDescriptionFortran() + { return "Tutaj znajdują się typy danych z ich krótkimi opisami:"; } + + /*! This is an introduction to the page with all data types (Fortran). */ + virtual QCString trCompoundMembersDescriptionFortran(bool extractAll) + { + QCString result="Tutaj znajduje się lista wszystkich "; + if (!extractAll) + { + result+="udokumentowanych "; + } + result+="składowych typów danych"; + result+=" wraz z odnośnikami do "; + if (!extractAll) + { + result+="dokumentacji struktury danych dla każdej składowej"; + } + else + { + result+="typów danych, do których dana składowa należy:"; + } + return result; + } + + /*! This is used in LaTeX as the title of the chapter with the + * annotated compound index (Fortran). + */ + virtual QCString trCompoundIndexFortran() + { return "Indeks typów danych"; } + + /*! This is used in LaTeX as the title of the chapter containing + * the documentation of all data types (Fortran). + */ + virtual QCString trTypeDocumentation() + { return "Dokumentacja typów danych"; } + + /*! This is used in the documentation of a file as a header before the + * list of (global) subprograms (Fortran). + */ + virtual QCString trSubprograms() + { return "Funkcje/podprogramy"; } + + /*! This is used in the documentation of a file/namespace before the list + * of documentation blocks for subprograms (Fortran) + */ + virtual QCString trSubprogramDocumentation() + { return "Dokumentacja funkcji/podprogramu"; } + + /*! This is used in the documentation of a file/namespace/group before + * the list of links to documented compounds (Fortran) + */ + virtual QCString trDataTypes() + { return "Typy danych"; } + + /*! used as the title of page containing all the index of all modules (Fortran). */ + virtual QCString trModulesList() + { return "Lista modułów"; } + + /*! used as an introduction to the modules list (Fortran) */ + virtual QCString trModulesListDescription(bool extractAll) + { + QCString result="Tutaj znajduje się lista wszystkich "; + if (!extractAll) result+="udokumentowanych "; + result+="modułów z ich krótkimi opisami:"; + return result; + } + + /*! used as the title of the HTML page of a module/type (Fortran) */ + virtual QCString trCompoundReferenceFortran(const char *clName, + ClassDef::CompoundType compType, + bool isTemplate) + { + QCString result="Dokumentacja"; + if (isTemplate) result+=" szablonu"; + switch(compType) + { + case ClassDef::Class: result+=" modułu "; break; + case ClassDef::Struct: result+=" typu "; break; + case ClassDef::Union: result+=" unii "; break; + case ClassDef::Interface: result+=" interfejsu "; break; + case ClassDef::Protocol: result+=" protokołu "; break; + case ClassDef::Category: result+=" kategorii "; break; + case ClassDef::Exception: result+=" wyjątku "; break; + } + result+=(QCString)clName; + return result; + } + /*! used as the title of the HTML page of a module (Fortran) */ + virtual QCString trModuleReference(const char *namespaceName) + { + QCString result="Dokumentacja modułu "; + result+=namespaceName; + return result; + } + + /*! This is put above each page as a link to all members of modules. (Fortran) */ + virtual QCString trModulesMembers() + { return "Składowe modułu"; } + + /*! This is an introduction to the page with all modules members (Fortran) */ + virtual QCString trModulesMemberDescription(bool extractAll) + { + QCString result="Tutaj znajduje się lista wszystkich "; + if (!extractAll) result+="udokumentowanych "; + result+="składowych modułów wraz z odnośnikami do "; + if (extractAll) + { + result+="dokumentacji modułu dla każdej składowej:"; + } + else + { + result+="modułów do których składowe te należą:"; + } + return result; + } + + /*! This is used in LaTeX as the title of the chapter with the + * index of all modules (Fortran). + */ + virtual QCString trModulesIndex() + { return "Indeks modułu"; } + + /*! This is used for translation of the word that will possibly + * be followed by a single name or by a list of names + * of the category. + */ + virtual QCString trModule(bool first_capital, bool singular) + { + QCString result((first_capital ? "Moduł" : "moduł")); + if (!singular) result+="y"; + return result; + } + /*! This is put at the bottom of a module documentation page and is + * followed by a list of files that were used to generate the page. + */ + virtual QCString trGeneratedFromFilesFortran(ClassDef::CompoundType compType, + bool single) + { + // single is true implies a single file + QCString result=(QCString)"Dokumentacja dla te"; + switch(compType) + { + case ClassDef::Class: result+="go modułu"; break; + case ClassDef::Struct: result+="go typu"; break; + case ClassDef::Union: result+="j unii"; break; + case ClassDef::Interface: result+="go interfejsu"; break; + case ClassDef::Protocol: result+="go protokołu"; break; + case ClassDef::Category: result+="j kategorii"; break; + case ClassDef::Exception: result+="go wyjątku"; break; + } + result+=" została wygenerowana z plik"; + if (single) result+="u:"; else result+="ów:"; + return decode(result); + } + /*! This is used for translation of the word that will possibly + * be followed by a single name or by a list of names + * of the category. + */ + virtual QCString trType(bool first_capital, bool singular) + { + QCString result((first_capital ? "Typ" : "typ")); + if (!singular) result+="y"; + return result; + } + /*! This is used for translation of the word that will possibly + * be followed by a single name or by a list of names + * of the category. + */ + virtual QCString trSubprogram(bool first_capital, bool singular) + { + QCString result((first_capital ? "Podprogram" : "podprogram")); + if (!singular) result+="y"; + return result; + } + + /*! C# Type Constraint list */ + virtual QCString trTypeConstraints() + { + return "Więzy typów"; //TODO check if it is correct translation + } }; #endif diff --git a/src/vhdlcode.l b/src/vhdlcode.l index 28e2d85..8b442ef 100644 --- a/src/vhdlcode.l +++ b/src/vhdlcode.l @@ -340,7 +340,7 @@ static void codifyLines(const char *text,const char *cl=0,bool classlink=FALSE) while (!done) { sp=p; - while ((c=*p++) && c!='\n'); + while ((c=*p++) && c!='\n') {} if (c=='\n') { g_yyLineNr++; @@ -379,7 +379,7 @@ static void writeMultiLineCodeLink(CodeOutputInterface &ol, { char *sp=p; char c; - while ((c=*p++) && c!='\n'); + while ((c=*p++) && c!='\n') {} if (c=='\n') { g_yyLineNr++; diff --git a/src/vhdldocgen.cpp b/src/vhdldocgen.cpp index 809fc31..280e068 100644 --- a/src/vhdldocgen.cpp +++ b/src/vhdldocgen.cpp @@ -833,12 +833,13 @@ bool VhdlDocGen::compareString(const QCString& s1,const QCString& s2) bool VhdlDocGen::getSigTypeName(QList<QCString>& ql, const char* str,QCString& buffer) { - QCString temp(str); - QStringList qlist=QStringList::split(" is ",temp,FALSE); - if (qlist.count()!=2) return FALSE; - temp.resize(0); - temp+=(QCString)qlist[0]+":"+(QCString)qlist[1]; - return VhdlDocGen::getSigName(ql,temp.data(),buffer); + //QCString temp(str); + //QStringList qlist=QStringList::split(" is ",temp,FALSE); + //if (qlist.count()!=2) return FALSE; + //temp.resize(0); + //temp+=(QCString)qlist[0]+":"+(QCString)qlist[1]; + //return VhdlDocGen::getSigName(ql,temp.data(),buffer); + return VhdlDocGen::getSigName(ql,str,buffer); } /*! @@ -1356,7 +1357,7 @@ bool VhdlDocGen::isNumber(const QCString& s) #endif }// isNumber -void VhdlDocGen::startFonts(const QCString& q, char *keyword,OutputList& ol) +void VhdlDocGen::startFonts(const QCString& q, const char *keyword,OutputList& ol) { ol.startFontClass(keyword); ol.docify(q.data()); @@ -1650,10 +1651,12 @@ bool VhdlDocGen::isFunctionProto(QCString& ss) QCString proc("procedure"); QCString func("function"); name=name.stripWhiteSpace(); - QStringList ql=QStringList::split(" ",name,FALSE); + QStringList ql=QStringList::split(QRegExp("[\\s]"),name,FALSE); int j=ql.count(); if (j<2) return FALSE; - QCString tt=(QCString)ql[0]; + QCString tt=(QCString)ql[0].lower(); + + if (tt=="impure" || tt=="pure") tt=ql[1]; if (VhdlDocGen::compareString(tt,proc)!=0 && VhdlDocGen::compareString(tt,func)!=0) return FALSE; diff --git a/src/vhdldocgen.h b/src/vhdldocgen.h index a42ed4f..6323489 100644 --- a/src/vhdldocgen.h +++ b/src/vhdldocgen.h @@ -262,7 +262,7 @@ class VhdlDocGen static void writeLink(const MemberDef* mdef,OutputList &ol); static void adjustMemberName(QCString& nn); static bool membersHaveSpecificType(MemberList *ml,int type); - static void startFonts(const QCString& q, char *keyword,OutputList& ol); + static void startFonts(const QCString& q, const char *keyword,OutputList& ol); static bool isNumber(const QCString& s); private: diff --git a/src/vhdlscanner.l b/src/vhdlscanner.l index 073e0a1..2acd2dc 100644 --- a/src/vhdlscanner.l +++ b/src/vhdlscanner.l @@ -400,7 +400,7 @@ static void parseProcessProto() static void parseFunctionProto() { - QCString name,ret,qcs; + QCString name,ret,qcs,temp; bool sem=FALSE; QList<Argument> ql; ql.setAutoDelete(TRUE); @@ -409,11 +409,18 @@ static void parseFunctionProto() return; // function without a prototype if (qcs.contains("function",FALSE)==0 && qcs.contains("procedure",FALSE)==0) return; - while (qcs.stripPrefix(" ")); - if (qcs.stripPrefix("impure")) + qcs=qcs.stripWhiteSpace(); + temp=qcs.lower(); + if (temp.stripPrefix("impure")) + { current->exception="impure"; - else if (qcs.stripPrefix("pure")) + qcs=qcs.remove(0,6); + } + else if (temp.stripPrefix("pure")) + { current->exception="pure"; + qcs=qcs.remove(0,4); + } VhdlDocGen::parseFuncProto(qcs.data(),ql,name,ret); //printf("parseFuncProto(%s)=%s,%s\n",qcs.data(),name.data(),ret.data()); |