summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authordimitri <dimitri@afe2bf4a-e733-0410-8a33-86f594647bc7>2009-05-22 11:07:08 (GMT)
committerdimitri <dimitri@afe2bf4a-e733-0410-8a33-86f594647bc7>2009-05-22 11:07:08 (GMT)
commit7a3de4c3c8aac25c38b6e93bb0927de40cd1c650 (patch)
tree9568dad93df55e8726251e5bdb1f2d8c00bdde93 /src
parentc34e05f1d2d21630290f758aafe6d151825d0ce8 (diff)
downloadDoxygen-7a3de4c3c8aac25c38b6e93bb0927de40cd1c650.zip
Doxygen-7a3de4c3c8aac25c38b6e93bb0927de40cd1c650.tar.gz
Doxygen-7a3de4c3c8aac25c38b6e93bb0927de40cd1c650.tar.bz2
Release-1.5.9-20090522
Diffstat (limited to 'src')
-rw-r--r--src/classdef.cpp41
-rw-r--r--src/commentcnv.l9
-rw-r--r--src/definition.cpp3
-rw-r--r--src/diagram.cpp4
-rw-r--r--src/dirdef.cpp21
-rw-r--r--src/docparser.h6
-rw-r--r--src/dot.cpp144
-rw-r--r--src/doxygen.css50
-rw-r--r--src/doxygen_css.h50
-rw-r--r--src/filedef.cpp20
-rw-r--r--src/formula.cpp1
-rw-r--r--src/ftvhelp.cpp26
-rw-r--r--src/ftvhelp.h4
-rw-r--r--src/groupdef.cpp27
-rw-r--r--src/htmldocvisitor.cpp473
-rw-r--r--src/htmldocvisitor.h4
-rw-r--r--src/htmlgen.cpp129
-rw-r--r--src/htmlgen.h22
-rw-r--r--src/index.cpp70
-rw-r--r--src/latexgen.cpp1
-rw-r--r--src/latexgen.h8
-rw-r--r--src/mangen.cpp15
-rw-r--r--src/mangen.h12
-rw-r--r--src/memberdef.cpp71
-rw-r--r--src/msc.cpp2
-rw-r--r--src/namespacedef.cpp20
-rw-r--r--src/outputgen.h22
-rw-r--r--src/outputlist.h24
-rw-r--r--src/pagedef.cpp2
-rw-r--r--src/pre.l12
-rw-r--r--src/rtfgen.cpp18
-rw-r--r--src/rtfgen.h10
-rw-r--r--src/scanner.l7
-rw-r--r--src/translator_en.h23
-rw-r--r--src/translator_pl.h234
-rw-r--r--src/vhdlcode.l4
-rw-r--r--src/vhdldocgen.cpp21
-rw-r--r--src/vhdldocgen.h2
-rw-r--r--src/vhdlscanner.l15
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[] =
{
- { "&nbsp;", "ftv2blank.png",ftv2blank_png,174,16,22 },
+ { "&#160;", "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 << "&nbsp;<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 << "&nbsp;" << 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 << "&amp;"; col++;
break;
+ case '\'': t << "&apos;"; col++;
+ break;
+ case '"': t << "&quot;"; col++;
+ break;
//case ' ': t << "&nbsp;"; 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 << "&nbsp;)";
t << "&nbsp;</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("&nbsp;");
}
- 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("&nbsp;");
}
- 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("&nbsp;");
}
- 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);
diff --git a/src/pre.l b/src/pre.l
index f946fc4..c818ce9 100644
--- a/src/pre.l
+++ b/src/pre.l
@@ -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());