summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--INSTALL4
-rw-r--r--README4
-rw-r--r--VERSION2
-rw-r--r--doc/commands.doc6
-rw-r--r--packages/rpm/doxygen.spec2
-rw-r--r--src/defargs.l116
-rw-r--r--src/doc.l8
-rw-r--r--src/docparser.cpp3
-rw-r--r--src/dot.cpp6
-rw-r--r--src/doxygen.cpp233
-rw-r--r--src/groupdef.cpp29
-rw-r--r--src/groupdef.h2
-rw-r--r--src/htmldocvisitor.cpp719
-rw-r--r--src/htmldocvisitor.h713
-rw-r--r--src/htmlgen.cpp1
-rw-r--r--src/latexdocvisitor.cpp822
-rw-r--r--src/latexdocvisitor.h816
-rw-r--r--src/latexgen.cpp1
-rw-r--r--src/libdoxygen.pro.in4
-rw-r--r--src/memberdef.cpp15
-rw-r--r--src/memberdef.h9
-rw-r--r--src/page.h6
-rw-r--r--src/rtfdocvisitor.cpp1013
-rw-r--r--src/rtfdocvisitor.h150
-rw-r--r--src/rtfgen.cpp849
-rw-r--r--src/rtfgen.h24
-rw-r--r--src/rtfstyle.cpp518
-rw-r--r--src/rtfstyle.h80
-rw-r--r--src/scanner.l45
-rw-r--r--src/util.cpp54
-rw-r--r--src/util.h3
31 files changed, 3998 insertions, 2259 deletions
diff --git a/INSTALL b/INSTALL
index 809cc8e..b679d97 100644
--- a/INSTALL
+++ b/INSTALL
@@ -1,6 +1,6 @@
-DOXYGEN Version 1.2.17-20020825
+DOXYGEN Version 1.2.17-20020901
Please read the installation section of the manual for instructions.
--------
-Dimitri van Heesch (25 August 2002)
+Dimitri van Heesch (01 September 2002)
diff --git a/README b/README
index e987d37..d39ad5d 100644
--- a/README
+++ b/README
@@ -1,4 +1,4 @@
-DOXYGEN Version 1.2.17_20020825
+DOXYGEN Version 1.2.17_20020901
Please read INSTALL for compilation instructions.
@@ -17,4 +17,4 @@ to subscribe to the lists or to visit the archives.
Enjoy,
-Dimitri van Heesch (dimitri@stack.nl) (25 August 2002)
+Dimitri van Heesch (dimitri@stack.nl) (01 September 2002)
diff --git a/VERSION b/VERSION
index 9e2faab..98b96a6 100644
--- a/VERSION
+++ b/VERSION
@@ -1 +1 @@
-1.2.17-20020825
+1.2.17-20020901
diff --git a/doc/commands.doc b/doc/commands.doc
index 33456bb..8a95ab6 100644
--- a/doc/commands.doc
+++ b/doc/commands.doc
@@ -1039,7 +1039,11 @@ ALIASES = "english=\if english" \
\addindex \\anchor
This command places an invisible, named anchor into the documentation
- to which you can refer with the \\ref command.
+ to which you can refer with the \\ref command.
+
+ \note Anchors can currently only be put into a comment block
+ that is marked as a page (using \ref cmdpage "\\page") or mainpage
+ (\ref cmdmainpage "\\mainpage").
\sa section \ref cmdref "\\ref".
diff --git a/packages/rpm/doxygen.spec b/packages/rpm/doxygen.spec
index ff9d860..a75c06a 100644
--- a/packages/rpm/doxygen.spec
+++ b/packages/rpm/doxygen.spec
@@ -1,6 +1,6 @@
Summary: A documentation system for C/C++.
Name: doxygen
-Version: 1.2.17_20020825
+Version: 1.2.17_20020901
Release: 1
Epoch: 1
Source0: ftp://ftp.stack.nl/pub/users/dimitri/%{name}-%{version}.src.tar.gz
diff --git a/src/defargs.l b/src/defargs.l
index 5a0feaf..7cdd523 100644
--- a/src/defargs.l
+++ b/src/defargs.l
@@ -164,6 +164,9 @@ ID [a-z_A-Z][a-z_A-Z0-9]*
g_curArgTypeName+=g_curArgName;
BEGIN( ReadFuncArgType );
}
+<ReadFuncArgType>"<="|">="|"->"|">>"|"<<" { // handle operators in defargs
+ g_curArgTypeName+=yytext;
+ }
<ReadFuncArgType,ReadFuncArgDef>[({<] {
if (YY_START==ReadFuncArgType)
{
@@ -175,10 +178,10 @@ ID [a-z_A-Z][a-z_A-Z0-9]*
g_curArgDefValue+=*yytext;
g_copyArgValue=&g_curArgDefValue;
}
- g_readArgContext = YY_START;
+ g_readArgContext = YY_START;
if (*yytext=='(')
{
- g_argRoundCount=0;
+ g_argRoundCount=0;
BEGIN( CopyArgRound );
}
else if (*yytext=='{')
@@ -249,67 +252,74 @@ ID [a-z_A-Z][a-z_A-Z0-9]*
BEGIN( ReadDocBlock );
}
<ReadFuncArgType,ReadFuncArgDef>[,)>] {
- g_curArgTypeName=removeRedundantWhiteSpace(g_curArgTypeName);
- g_curArgDefValue=g_curArgDefValue.stripWhiteSpace();
- //printf("curArgType=`%s' curArgDefVal=`%s'\n",g_curArgTypeName.data(),g_curArgDefValue.data());
- int l=g_curArgTypeName.length();
- if (l>0)
+ if (*yytext==')' && g_curArgTypeName.stripWhiteSpace().isEmpty())
+ {
+ g_curArgTypeName+=*yytext;
+ }
+ else
{
- int i=l-1;
- while (i>=0 && (isspace(g_curArgTypeName.at(i)) || g_curArgTypeName.at(i)=='.')) i--;
- while (i>=0 && isId(g_curArgTypeName.at(i))) i--;
- //printf("g_curArgTypeName=`%s' i=%d\n",g_curArgTypeName.data(),i);
- Argument *a = new Argument;
- a->attrib = g_curArgAttrib.copy();
- //printf("a->type=%s a->name=%s i=%d l=%d\n",
- // a->type.data(),a->name.data(),i,l);
- a->array.resize(0);
- if (i==l-1 && g_curArgTypeName.at(i)==')') // function argument
+ g_curArgTypeName=removeRedundantWhiteSpace(g_curArgTypeName);
+ g_curArgDefValue=g_curArgDefValue.stripWhiteSpace();
+ //printf("curArgType=`%s' curArgDefVal=`%s'\n",g_curArgTypeName.data(),g_curArgDefValue.data());
+ int l=g_curArgTypeName.length();
+ if (l>0)
{
- int bi=g_curArgTypeName.find('(');
- int fi=bi-1;
- //printf("func arg fi=%d\n",fi);
- while (fi>=0 && isId(g_curArgTypeName.at(fi))) fi--;
- if (fi>=0)
+ int i=l-1;
+ while (i>=0 && (isspace(g_curArgTypeName.at(i)) || g_curArgTypeName.at(i)=='.')) i--;
+ while (i>=0 && isId(g_curArgTypeName.at(i))) i--;
+ //printf("g_curArgTypeName=`%s' i=%d\n",g_curArgTypeName.data(),i);
+ Argument *a = new Argument;
+ a->attrib = g_curArgAttrib.copy();
+ //printf("a->type=%s a->name=%s i=%d l=%d\n",
+ // a->type.data(),a->name.data(),i,l);
+ a->array.resize(0);
+ if (i==l-1 && g_curArgTypeName.at(i)==')') // function argument
{
- a->type = g_curArgTypeName.left(fi+1);
- a->name = g_curArgTypeName.mid(fi+1,bi-fi-1);
- a->array = g_curArgTypeName.right(l-bi);
+ int bi=g_curArgTypeName.find('(');
+ int fi=bi-1;
+ //printf("func arg fi=%d\n",fi);
+ while (fi>=0 && isId(g_curArgTypeName.at(fi))) fi--;
+ if (fi>=0)
+ {
+ a->type = g_curArgTypeName.left(fi+1);
+ a->name = g_curArgTypeName.mid(fi+1,bi-fi-1);
+ a->array = g_curArgTypeName.right(l-bi);
+ }
+ else
+ {
+ a->type = g_curArgTypeName;
+ }
+ }
+ else if (i>=0 && g_curArgTypeName.at(i)!=':')
+ { // type contains a name
+ a->type = removeRedundantWhiteSpace(g_curArgTypeName.left(i+1));
+ a->name = g_curArgTypeName.right(l-i-1);
}
- else
+ else // assume only the type was specified, try to determine name later
{
- a->type = g_curArgTypeName;
+ a->type = removeRedundantWhiteSpace(g_curArgTypeName);
}
+ //printf("a->type=%s a->name=%s a->array=%s\n",a->type.data(),a->name.data());
+ a->array += removeRedundantWhiteSpace(g_curArgArray);
+ a->defval = g_curArgDefValue.copy();
+ a->docs = g_curArgDocs.stripWhiteSpace();
+ //printf("Argument `%s' `%s' adding docs=`%s'\n",a->type.data(),a->name.data(),a->docs.data());
+ g_argList->append(a);
}
- else if (i>=0 && g_curArgTypeName.at(i)!=':')
- { // type contains a name
- a->type = removeRedundantWhiteSpace(g_curArgTypeName.left(i+1));
- a->name = g_curArgTypeName.right(l-i-1);
+ g_curArgAttrib.resize(0);
+ g_curArgTypeName.resize(0);
+ g_curArgDefValue.resize(0);
+ g_curArgArray.resize(0);
+ g_curArgDocs.resize(0);
+ if (*yytext==')')
+ {
+ BEGIN(FuncQual);
+ //printf(">>> end of argument list\n");
}
- else // assume only the type was specified, try to determine name later
+ else
{
- a->type = removeRedundantWhiteSpace(g_curArgTypeName);
+ BEGIN( ReadFuncArgType );
}
- //printf("a->type=%s a->name=%s a->array=%s\n",a->type.data(),a->name.data());
- a->array += removeRedundantWhiteSpace(g_curArgArray);
- a->defval = g_curArgDefValue.copy();
- a->docs = g_curArgDocs.stripWhiteSpace();
- //printf("Argument `%s' `%s' adding docs=`%s'\n",a->type.data(),a->name.data(),a->docs.data());
- g_argList->append(a);
- }
- g_curArgAttrib.resize(0);
- g_curArgTypeName.resize(0);
- g_curArgDefValue.resize(0);
- g_curArgArray.resize(0);
- g_curArgDocs.resize(0);
- if (*yytext==')')
- {
- BEGIN(FuncQual);
- //printf(">>> end of argument list\n");
- }
- else
- {
- BEGIN( ReadFuncArgType );
}
}
<ReadFuncArgType,ReadFuncArgPtr>{ID} {
diff --git a/src/doc.l b/src/doc.l
index 009cfb2..42dd41f 100644
--- a/src/doc.l
+++ b/src/doc.l
@@ -1130,8 +1130,10 @@ static int yyread(char *buf,int max_size)
return c;
}
-//ATTR ((({BN}+[^\>]+)/">")?)
+ //LINKMASK [a-z_A-Z0-9:#.,~&*/\[\]<>()\-\+]+({B}*("const"|"volatile"))?
+ //ATTR ((({BN}+[^\>]+)/">")?)
%}
+
CMD ("\\"|"@")
BN [ \t\n\r]
BL [ \t\r]*"\n"
@@ -1200,7 +1202,7 @@ OPARG "("[a-z_A-Z0-9,\<\> \t\*\&]*")"
OPNORM {OPNEW}|{OPDEL}|"+"|"-"|"*"|"/"|"%"|"^"|"&"|"|"|"~"|"!"|"="|"<"|">"|"+="|"-="|"*="|"/="|"%="|"^="|"&="|"|="|"<<"|">>"|"<<="|">>="|"=="|"!="|"<="|">="|"&&"|"||"|"++"|"--"|","|"->*"|"->"|"[]"|"()"
OPCAST {B}+[^(\r\n.,]+
OPMASK ({B}*{OPNORM}({OPARG}?))|({OPCAST}{OPARG})
-LINKMASK [a-z_A-Z0-9:#.,~&*/\[\]<>()\-\+]+({B}*("const"|"volatile"))?
+LINKMASK [^ \t\n\r\\@<&$]+("("[^\n)]*")")?({B}*("const"|"volatile"))?
%option noyywrap
@@ -1785,7 +1787,7 @@ LINKMASK [a-z_A-Z0-9:#.,~&*/\[\]<>()\-\+]+({B}*("const"|"volatile"))?
if (inBlock()) endBlock();
inReturnBlock=TRUE;
currentListIndent.push("P");
- outDoc->startSimpleSect(BaseOutputDocInterface::Return,0,0,theTranslator->trReturns()+":");
+ outDoc->startSimpleSect(BaseOutputDocInterface::Return,0,0,theTranslator->trReturns()+": ");
outDoc->writeDescItem();
}
}
diff --git a/src/docparser.cpp b/src/docparser.cpp
index 9502eeb..5e4a79c 100644
--- a/src/docparser.cpp
+++ b/src/docparser.cpp
@@ -1392,6 +1392,7 @@ QCString DocLink::parse(bool isJavaLink)
printf("Error: Unsupported symbol %s found at line %d\n",
g_token->name.data(),doctokenizerYYlineno);
break;
+ case TK_LNKWORD:
case TK_WORD:
if (isJavaLink) // special case to detect closing }
{
@@ -3894,7 +3895,7 @@ void DocRoot::parse()
DocNode *validatingParseDoc(const char *fileName,int startLine,
const char *context,const char *input)
{
- //printf("---------------- input --------------------\n%s\n----------- end input -------------------\n",input);
+ printf("---------------- input --------------------\n%s\n----------- end input -------------------\n",input);
printf("========== validating %s at line %d\n",fileName,startLine);
g_token = new TokenInfo;
diff --git a/src/dot.cpp b/src/dot.cpp
index 252f33e..b1d4c05 100644
--- a/src/dot.cpp
+++ b/src/dot.cpp
@@ -1793,8 +1793,10 @@ void writeDotGraphFromFile(const char *inFile,const char *outDir,
QCString imgName = (QCString)outFile+"."+imgExt;
if (format==BITMAP)
{
- dotArgs.sprintf("-T%s \"%s\" -o \"%s\"",imgExt.data(),
- inFile,imgName.data());
+ dotArgs.sprintf("-T%s \"%s\" -o \"%s\"",
+ imgExt.data(),
+ inFile,
+ imgName.data());
}
else // format==EPS
{
diff --git a/src/doxygen.cpp b/src/doxygen.cpp
index 75481c9..3756c21 100644
--- a/src/doxygen.cpp
+++ b/src/doxygen.cpp
@@ -200,11 +200,38 @@ static void addRelatedPage(Entry *root)
if (!g->groupname.isEmpty() && (gd=Doxygen::groupSDict[g->groupname])) break;
}
//printf("addRelatedPage() %s gd=%p\n",root->name.data(),gd);
- addRelatedPage(root->name,root->args,root->doc,root->anchors,
+ PageInfo *pi = addRelatedPage(root->name,root->args,root->doc,root->anchors,
root->fileName,root->startLine,
root->sli,
gd,root->tagInfo
);
+ if (pi)
+ {
+ // see if the function is inside a namespace
+ Definition *ctx = 0;
+
+ if (root->parent->section & Entry::COMPOUND_MASK ) // inside class
+ {
+ QCString fullName=removeRedundantWhiteSpace(root->parent->name);
+ fullName=stripAnonymousNamespaceScope(fullName);
+ fullName=stripTemplateSpecifiersFromScope(fullName);
+ ctx=getClass(fullName);
+ }
+ if (ctx==0 && root->parent->section == Entry::NAMESPACE_SEC ) // inside namespace
+ {
+ QCString nscope=removeAnonymousScopes(root->parent->name);
+ if (!nscope.isEmpty())
+ {
+ ctx = getResolvedNamespace(nscope);
+ }
+ }
+ if (ctx==0) // inside file
+ {
+ bool ambig;
+ ctx=findFileDef(Doxygen::inputNameDict,root->fileName,ambig);
+ }
+ pi->context = ctx;
+ }
}
@@ -1919,7 +1946,6 @@ static void buildFunctionList(Entry *root)
isMember=memIndex<ts || memIndex>te;
}
}
-
if (root->parent &&
!root->parent->name.isEmpty() &&
(root->parent->section & Entry::COMPOUND_MASK) &&
@@ -1967,7 +1993,8 @@ static void buildFunctionList(Entry *root)
if (rnd) rnsName = rnd->name().copy();
NamespaceList *unl = fd ? fd->getUsedNamespaces() : 0;
ClassList *ucl = fd ? fd->getUsedClasses() : 0;
- //printf("matching arguments for %s\n",md->name().data());
+ //printf("matching arguments for %s%s %s%s\n",
+ // md->name().data(),md->argsString(),rname.data(),argListToString(root->argList).data());
if (
matchArguments(md->argumentList(),root->argList,0,nsName,FALSE,unl,ucl)
)
@@ -2060,7 +2087,6 @@ static void buildFunctionList(Entry *root)
root->type,name,root->args,root->exception,
root->protection,root->virt,root->stat,FALSE,
MemberDef::Function,tArgList,root->argList);
- //printf("new member %p\n",md);
if (root->tagInfo)
@@ -2297,100 +2323,112 @@ static void transferFunctionDocumentation()
MemberName *mn;
for (;(mn=mnli.current());++mnli)
{
- MemberDef *md,*mdef=0,*mdec=0;
- MemberNameIterator mni(*mn);
+ //printf("memberName=%s count=%d\n",mn->memberName(),mn->count());
+ MemberDef *mdef=0,*mdec=0;
+ MemberNameIterator mni1(*mn);
/* find a matching function declaration and definition for this function */
- for (;(md=mni.current());++mni)
- {
- if (md->isPrototype())
- mdec=md;
- else if (md->isVariable() && md->isExternal())
- mdec=md;
-
- if (md->isFunction() && !md->isStatic() && !md->isPrototype())
- mdef=md;
- else if (md->isVariable() && !md->isExternal() && !md->isStatic())
- mdef=md;
- }
- //printf("mdef=(%p,%s) mdec=(%p,%s)\n",
- // mdef, mdef ? mdef->name().data() : "",
- // mdec, mdec ? mdec->name().data() : "");
- if (mdef && mdec &&
- matchArguments(mdef->argumentList(),mdec->argumentList())
- ) /* match found */
+ for (;(mdec=mni1.current());++mni1)
{
- //printf("Found member %s: definition in %s (doc=`%s') and declaration in %s (doc=`%s')\n",
- // mn->memberName(),
- // mdef->getFileDef()->name().data(),mdef->documentation().data(),
- // mdec->getFileDef()->name().data(),mdec->documentation().data()
- // );
-
- // first merge argument documentation
- transferArgumentDocumentation(mdec->argumentList(),mdef->argumentList());
-
- /* copy documentation between function definition and declaration */
- if (!mdec->briefDescription().isEmpty())
- {
- mdef->setBriefDescription(mdec->briefDescription(),mdec->briefFile(),mdec->briefLine());
- }
- else if (!mdef->briefDescription().isEmpty())
- {
- mdec->setBriefDescription(mdef->briefDescription(),mdef->briefFile(),mdef->briefLine());
- }
- if (!mdef->documentation().isEmpty())
- {
- //printf("transfering docs mdef->mdec (%s->%s)\n",mdef->argsString(),mdec->argsString());
- mdec->setDocumentation(mdef->documentation(),mdef->docFile(),mdef->docLine());
- mdec->setDocsForDefinition(mdef->isDocsForDefinition());
- ArgumentList *mdefAl = new ArgumentList;
- stringToArgumentList(mdef->argsString(),mdefAl);
- if (mdef->argumentList())
- {
- transferArgumentDocumentation(mdef->argumentList(),mdefAl);
- }
- mdec->setArgumentList(mdefAl);
- }
- else if (!mdec->documentation().isEmpty())
+ if (mdec->isPrototype() ||
+ (mdec->isVariable() && mdec->isExternal())
+ )
+ {
+ MemberNameIterator mni2(*mn);
+ for (;(mdef=mni2.current());++mni2)
{
- //printf("transfering docs mdec->mdef (%s->%s)\n",mdec->argsString(),mdef->argsString());
- mdef->setDocumentation(mdec->documentation(),mdec->docFile(),mdec->docLine());
- mdef->setDocsForDefinition(mdec->isDocsForDefinition());
- ArgumentList *mdecAl = new ArgumentList;
- stringToArgumentList(mdec->argsString(),mdecAl);
- if (mdec->argumentList())
+ if (
+ (mdef->isFunction() && !mdef->isStatic() && !mdef->isPrototype()) ||
+ (mdef->isVariable() && !mdef->isExternal() && !mdef->isStatic())
+ )
{
- transferArgumentDocumentation(mdec->argumentList(),mdecAl);
- }
- mdef->setDeclArgumentList(mdecAl);
- }
- if (mdec->getStartBodyLine()!=-1 && mdef->getStartBodyLine()==-1)
- {
- mdef->setBodySegment(mdec->getStartBodyLine(),mdec->getEndBodyLine());
- mdef->setBodyDef(mdec->getBodyDef());
- mdef->setBodyMember(mdec);
- }
- else if (mdef->getStartBodyLine()!=-1 && mdec->getStartBodyLine()==-1)
- {
- mdec->setBodySegment(mdef->getStartBodyLine(),mdef->getEndBodyLine());
- mdec->setBodyDef(mdef->getBodyDef());
- mdec->setBodyMember(mdef);
- }
- mdec->mergeMemberSpecifiers(mdef->getMemberSpecifiers());
- mdef->mergeMemberSpecifiers(mdec->getMemberSpecifiers());
-
+ //printf("mdef=(%p,%s) mdec=(%p,%s)\n",
+ // mdef, mdef ? mdef->name().data() : "",
+ // mdec, mdec ? mdec->name().data() : "");
+ if (mdef && mdec &&
+ matchArguments(mdef->argumentList(),mdec->argumentList())
+ ) /* match found */
+ {
+ //printf("Found member %s: definition in %s (doc=`%s') and declaration in %s (doc=`%s')\n",
+ // mn->memberName(),
+ // mdef->getFileDef()->name().data(),mdef->documentation().data(),
+ // mdec->getFileDef()->name().data(),mdec->documentation().data()
+ // );
+
+ // first merge argument documentation
+ transferArgumentDocumentation(mdec->argumentList(),mdef->argumentList());
+
+ /* copy documentation between function definition and declaration */
+ if (!mdec->briefDescription().isEmpty())
+ {
+ mdef->setBriefDescription(mdec->briefDescription(),mdec->briefFile(),mdec->briefLine());
+ }
+ else if (!mdef->briefDescription().isEmpty())
+ {
+ mdec->setBriefDescription(mdef->briefDescription(),mdef->briefFile(),mdef->briefLine());
+ }
+ if (!mdef->documentation().isEmpty())
+ {
+ //printf("transfering docs mdef->mdec (%s->%s)\n",mdef->argsString(),mdec->argsString());
+ mdec->setDocumentation(mdef->documentation(),mdef->docFile(),mdef->docLine());
+ mdec->setDocsForDefinition(mdef->isDocsForDefinition());
+ ArgumentList *mdefAl = new ArgumentList;
+ stringToArgumentList(mdef->argsString(),mdefAl);
+ if (mdef->argumentList())
+ {
+ transferArgumentDocumentation(mdef->argumentList(),mdefAl);
+ }
+ mdec->setArgumentList(mdefAl);
+ }
+ else if (!mdec->documentation().isEmpty())
+ {
+ //printf("transfering docs mdec->mdef (%s->%s)\n",mdec->argsString(),mdef->argsString());
+ mdef->setDocumentation(mdec->documentation(),mdec->docFile(),mdec->docLine());
+ mdef->setDocsForDefinition(mdec->isDocsForDefinition());
+ ArgumentList *mdecAl = new ArgumentList;
+ stringToArgumentList(mdec->argsString(),mdecAl);
+ if (mdec->argumentList())
+ {
+ transferArgumentDocumentation(mdec->argumentList(),mdecAl);
+ }
+ mdef->setDeclArgumentList(mdecAl);
+ }
+ if (mdec->getStartBodyLine()!=-1 && mdef->getStartBodyLine()==-1)
+ {
+ //printf("body mdec->mdef %d-%d\n",mdec->getStartBodyLine(),mdef->getEndBodyLine());
+ mdef->setBodySegment(mdec->getStartBodyLine(),mdec->getEndBodyLine());
+ mdef->setBodyDef(mdec->getBodyDef());
+ mdef->setBodyMember(mdec);
+ }
+ else if (mdef->getStartBodyLine()!=-1 && mdec->getStartBodyLine()==-1)
+ {
+ //printf("body mdef->mdec %d-%d\n",mdef->getStartBodyLine(),mdec->getEndBodyLine());
+ mdec->setBodySegment(mdef->getStartBodyLine(),mdef->getEndBodyLine());
+ mdec->setBodyDef(mdef->getBodyDef());
+ mdec->setBodyMember(mdef);
+ }
+ mdec->mergeMemberSpecifiers(mdef->getMemberSpecifiers());
+ mdef->mergeMemberSpecifiers(mdec->getMemberSpecifiers());
+
- // copy group info.
- //if (mdec->getGroupDef()==0 && mdef->getGroupDef()!=0)
- //{
- // mdef->setGroupDef(mdec->getGroupDef(),mdec->getGroupPri(),mdec->docFile(),mdec->docLine(),mdec->hasDocumentation());
- //}
- //else if (mdef->getGroupDef()==0 && mdec->getGroupDef()!=0)
- //{
- // mdec->setGroupDef(mdef->getGroupDef(),mdef->getGroupPri(),mdef->docFile(),mdef->docLine(),mdef->hasDocumentation());
- //}
+ // copy group info.
+ //if (mdec->getGroupDef()==0 && mdef->getGroupDef()!=0)
+ //{
+ // mdef->setGroupDef(mdec->getGroupDef(),mdec->getGroupPri(),mdec->docFile(),mdec->docLine(),mdec->hasDocumentation());
+ //}
+ //else if (mdef->getGroupDef()==0 && mdec->getGroupDef()!=0)
+ //{
+ // mdec->setGroupDef(mdef->getGroupDef(),mdef->getGroupPri(),mdef->docFile(),mdef->docLine(),mdef->hasDocumentation());
+ //}
- mdec->setRefItems(mdef->specialListItems());
- mdef->setRefItems(mdec->specialListItems());
+ mdec->setRefItems(mdef->specialListItems());
+ mdef->setRefItems(mdec->specialListItems());
+
+ mdef->setMemberDeclaration(mdec);
+ mdec->setMemberDefinition(mdef);
+ }
+ }
+ }
+ }
}
}
}
@@ -5972,7 +6010,16 @@ static void generatePageDocs()
outputList->endSection(si->label,si->type);
}
outputList->startTextBlock();
- parseDoc(*outputList,pi->defFileName,pi->defLine,0,0,pi->doc);
+ QCString scName;
+ if (pi->context &&
+ (pi->context->definitionType()==Definition::TypeClass ||
+ pi->context->definitionType()==Definition::TypeNamespace
+ )
+ )
+ {
+ scName=pi->context->name();
+ }
+ parseDoc(*outputList,pi->defFileName,pi->defLine,scName,0,pi->doc);
outputList->endTextBlock();
endFile(*outputList);
//outputList->enable(OutputGenerator::Man);
diff --git a/src/groupdef.cpp b/src/groupdef.cpp
index b2d3691..2a83ae6 100644
--- a/src/groupdef.cpp
+++ b/src/groupdef.cpp
@@ -162,7 +162,7 @@ void GroupDef::addMembersToMemberGroup()
}
-void GroupDef::insertMember(MemberDef *md,bool docOnly)
+bool GroupDef::insertMember(MemberDef *md,bool docOnly)
{
//printf("GroupDef(%s)::insertMember(%s)\n", title.data(), md->name().data());
MemberNameInfo *mni=0;
@@ -173,10 +173,17 @@ void GroupDef::insertMember(MemberDef *md,bool docOnly)
for ( ; (srcMi=srcMnii.current()) ; ++srcMnii )
{
MemberDef *srcMd = srcMi->memberDef;
- if (matchArguments(srcMd->argumentList(),md->argumentList()) &&
- srcMd->getOuterScope()==md->getOuterScope())
+
+ bool sameScope = srcMd->getOuterScope()==md->getOuterScope() || // same class or namespace
+ // both inside a file => definition and declaration do not have to be in the same file
+ (srcMd->getOuterScope()->definitionType()==Definition::TypeFile &&
+ md->getOuterScope()->definitionType()==Definition::TypeFile);
+
+ if (matchArguments(srcMd->argumentList(),md->argumentList()) &&
+ sameScope
+ )
{
- return; // member already added
+ return FALSE; // member already added
}
}
mni->append(new MemberInfo(md,md->protection(),md->virtualness(),FALSE));
@@ -187,6 +194,7 @@ void GroupDef::insertMember(MemberDef *md,bool docOnly)
mni->append(new MemberInfo(md,md->protection(),md->virtualness(),FALSE));
allMemberNameInfoSDict->append(mni->memberName(),mni);
}
+ //printf("Added member!\n");
allMemberList->append(md);
switch(md->memberType())
{
@@ -241,7 +249,7 @@ void GroupDef::insertMember(MemberDef *md,bool docOnly)
md->getClassDef() ? md->getClassDef()->name().data() : "",
name().data());
}
- //addMemberToGroup(md,groupId);
+ return TRUE;
}
void GroupDef::removeMember(MemberDef *md)
@@ -723,10 +731,13 @@ void addMemberToGroups(Entry *root,MemberDef *md)
if (insertit)
{
//printf("insertMember\n");
- fgd->insertMember(md);
- md->setGroupDef(fgd,pri,root->fileName,root->startLine,root->doc.length() != 0);
- ClassDef *cd = md->getClassDefOfAnonymousType();
- if (cd) cd->setGroupDefForAllMembers(fgd,pri,root->fileName,root->startLine,root->doc.length() != 0);
+ bool success = fgd->insertMember(md);
+ if (success)
+ {
+ md->setGroupDef(fgd,pri,root->fileName,root->startLine,root->doc.length() != 0);
+ ClassDef *cd = md->getClassDefOfAnonymousType();
+ if (cd) cd->setGroupDefForAllMembers(fgd,pri,root->fileName,root->startLine,root->doc.length() != 0);
+ }
}
}
}
diff --git a/src/groupdef.h b/src/groupdef.h
index a119d61..60dcba3 100644
--- a/src/groupdef.h
+++ b/src/groupdef.h
@@ -55,7 +55,7 @@ class GroupDef : public Definition
void addParentGroup(const GroupDef *def);
void addPage(PageInfo *def); // pages in this group
void addExample(const PageInfo *def); // examples in this group
- void insertMember(MemberDef *def,bool docOnly=FALSE);
+ bool insertMember(MemberDef *def,bool docOnly=FALSE);
void removeMember(MemberDef *md);
bool containsGroup(const GroupDef *def); // true if def is already a subgroup
void writeDetailedDocumentation(OutputList &ol);
diff --git a/src/htmldocvisitor.cpp b/src/htmldocvisitor.cpp
index 062f109..18bb3c9 100644
--- a/src/htmldocvisitor.cpp
+++ b/src/htmldocvisitor.cpp
@@ -17,6 +17,725 @@
*/
#include "htmldocvisitor.h"
+#include "docparser.h"
+#include "language.h"
+#include "doxygen.h"
+#include "outputgen.h"
+#include "code.h"
+#include "dot.h"
+
+HtmlDocVisitor::HtmlDocVisitor(QTextStream &t,BaseCodeDocInterface &ci)
+ : m_t(t), m_ci(ci), m_insidePre(FALSE), m_hide(FALSE)
+{
+}
+
+ //--------------------------------------
+ // visitor functions for leaf nodes
+ //--------------------------------------
+
+void HtmlDocVisitor::HtmlDocVisitor::visit(DocWord *w)
+{
+ if (m_hide) return;
+ filter(w->word());
+}
+
+void HtmlDocVisitor::HtmlDocVisitor::visit(DocLinkedWord *w)
+{
+ if (m_hide) return;
+ startLink(w->ref(),w->file(),w->anchor());
+ filter(w->word());
+ endLink();
+}
+
+void HtmlDocVisitor::HtmlDocVisitor::visit(DocWhiteSpace *w)
+{
+ if (m_hide) return;
+ if (m_insidePre)
+ {
+ m_t << w->chars();
+ }
+ else
+ {
+ m_t << " ";
+ }
+}
+
+void HtmlDocVisitor::visit(DocSymbol *s)
+{
+ if (m_hide) return;
+ switch(s->symbol())
+ {
+ case DocSymbol::BSlash: m_t << "\\"; break;
+ case DocSymbol::At: m_t << "@"; break;
+ case DocSymbol::Less: m_t << "&lt;"; break;
+ case DocSymbol::Greater: m_t << "&gt;"; break;
+ case DocSymbol::Amp: m_t << "&amp;"; break;
+ case DocSymbol::Dollar: m_t << "$"; break;
+ case DocSymbol::Hash: m_t << "#"; break;
+ case DocSymbol::Percent: m_t << "%"; break;
+ case DocSymbol::Copy: m_t << "&copy;"; break;
+ case DocSymbol::Apos: m_t << "'"; break;
+ case DocSymbol::Quot: m_t << "\""; break;
+ case DocSymbol::Uml: m_t << "&" << s->letter() << "uml;"; break;
+ case DocSymbol::Acute: m_t << "&" << s->letter() << "acute;"; break;
+ case DocSymbol::Grave: m_t << "&" << s->letter() << "grave;"; break;
+ case DocSymbol::Circ: m_t << "&" << s->letter() << "circ;"; break;
+ case DocSymbol::Tilde: m_t << "&" << s->letter() << "tilde;"; break;
+ case DocSymbol::Szlig: m_t << "&szlig;"; break;
+ case DocSymbol::Cedil: m_t << "&" << s->letter() << "cedul;"; break;
+ case DocSymbol::Ring: m_t << "&" << s->letter() << "ring;"; break;
+ case DocSymbol::Nbsp: m_t << "&nbsp;"; break;
+ default:
+ printf("Error: unknown symbol found\n");
+ }
+}
+
+void HtmlDocVisitor::visit(DocURL *u)
+{
+ if (m_hide) return;
+ m_t << "<a href=\"" << u->url() << "\">" << u->url() << "</a>";
+}
+
+void HtmlDocVisitor::visit(DocLineBreak *)
+{
+ if (m_hide) return;
+ m_t << "<br>\n";
+}
+
+void HtmlDocVisitor::visit(DocHorRuler *)
+{
+ if (m_hide) return;
+ m_t << "<hr>\n";
+}
+
+void HtmlDocVisitor::visit(DocStyleChange *s)
+{
+ if (m_hide) return;
+ switch (s->style())
+ {
+ case DocStyleChange::Bold:
+ if (s->enable()) m_t << "<b>"; else m_t << "</b> ";
+ break;
+ case DocStyleChange::Italic:
+ if (s->enable()) m_t << "<em>"; else m_t << "</em> ";
+ break;
+ case DocStyleChange::Code:
+ if (s->enable()) m_t << "<code>"; else m_t << "</code> ";
+ break;
+ case DocStyleChange::Subscript:
+ if (s->enable()) m_t << "<sub>"; else m_t << "</sub> ";
+ break;
+ case DocStyleChange::Superscript:
+ if (s->enable()) m_t << "<sup>"; else m_t << "</sup> ";
+ break;
+ case DocStyleChange::Center:
+ if (s->enable()) m_t << "<center>"; else m_t << "</center> ";
+ break;
+ case DocStyleChange::Small:
+ if (s->enable()) m_t << "<small>"; else m_t << "</small> ";
+ break;
+ }
+}
+
+void HtmlDocVisitor::visit(DocVerbatim *s)
+{
+ if (m_hide) return;
+ switch(s->type())
+ {
+ case DocVerbatim::Code: // fall though
+ m_t << "<div class=\"fragment\"><pre>";
+ parseCode(m_ci,s->context(),s->text(),FALSE,0);
+ m_t << "</pre></div>";
+ break;
+ case DocVerbatim::Verbatim:
+ m_t << "<div class=\"fragment\"><pre>";
+ filter(s->text());
+ m_t << "</pre></div>";
+ break;
+ case DocVerbatim::HtmlOnly:
+ m_t << s->text();
+ break;
+ case DocVerbatim::LatexOnly:
+ /* nothing */
+ break;
+ }
+}
+
+void HtmlDocVisitor::visit(DocAnchor *)
+{
+ if (m_hide) return;
+ m_t << "<a name=\"%s\"/></a>";
+}
+
+void HtmlDocVisitor::visit(DocInclude *inc)
+{
+ if (m_hide) return;
+ switch(inc->type())
+ {
+ case DocInclude::Include:
+ m_t << "<div class=\"fragment\"><pre>";
+ parseCode(m_ci,inc->context(),inc->text(),FALSE,0);
+ m_t << "</pre></div>";
+ break;
+ case DocInclude::DontInclude:
+ break;
+ case DocInclude::HtmlInclude:
+ m_t << inc->text();
+ break;
+ case DocInclude::VerbInclude:
+ m_t << "<div class=\"fragment\"><pre>";
+ filter(inc->text());
+ m_t << "</pre></div>";
+ break;
+ }
+}
+
+void HtmlDocVisitor::visit(DocIncOperator *op)
+{
+ //printf("DocIncOperator: type=%d first=%d, last=%d text=`%s'\n",
+ // op->type(),op->isFirst(),op->isLast(),op->text().data());
+ if (op->isFirst())
+ {
+ m_t << "<div class=\"fragment\"><pre>";
+ m_hide = TRUE;
+ }
+ if (op->type()!=DocIncOperator::Skip)
+ {
+ parseCode(m_ci,op->context(),op->text(),FALSE,0);
+ }
+ if (op->isLast())
+ {
+ m_hide = FALSE;
+ m_t << "</pre></div>";
+ }
+ else
+ {
+ m_t << endl;
+ }
+}
+
+void HtmlDocVisitor::visit(DocFormula *f)
+{
+ if (m_hide) return;
+ if (f->text().at(0)=='\\') m_t << "<p><center>" << endl;
+ m_t << "<img align=";
+#if !defined(_WIN32)
+ m_t << "\"top\""; // assume Unix users use Netscape 4.x which does
+ // not seem to support align == "middle" :-((
+#else
+ m_t << "\"middle\""; // assume Windows users use IE or HtmlHelp which on
+ // displays formulas nicely with align == "middle"
+#endif
+ m_t << " src=\"" << f->name() << ".png\">";
+ if (f->text().at(0)=='\\')
+ m_t << endl << "</center><p>" << endl;
+ else
+ m_t << " ";
+}
+
+//--------------------------------------
+// visitor functions for compound nodes
+//--------------------------------------
+
+void HtmlDocVisitor::visitPre(DocAutoList *l)
+{
+ if (l->isEnumList())
+ {
+ m_t << "<ol>\n";
+ }
+ else
+ {
+ m_t << "<ul>\n";
+ }
+}
+
+void HtmlDocVisitor::visitPost(DocAutoList *l)
+{
+ if (l->isEnumList())
+ {
+ m_t << "</ol>\n";
+ }
+ else
+ {
+ m_t << "</ul>\n";
+ }
+}
+
+void HtmlDocVisitor::visitPre(DocAutoListItem *)
+{
+ m_t << "<li>";
+}
+
+void HtmlDocVisitor::visitPost(DocAutoListItem *)
+{
+ m_t << "</li>";
+}
+
+void HtmlDocVisitor::visitPre(DocPara *)
+{
+}
+
+void HtmlDocVisitor::visitPost(DocPara *p)
+{
+ if (!p->isLast() && // omit <p> for last paragraph
+ !(p->parent() && // and for parameter sections
+ p->parent()->kind()==DocNode::Kind_ParamSect
+ )
+ ) m_t << "\n<p>\n";
+}
+
+void HtmlDocVisitor::visitPre(DocRoot *)
+{
+ //m_t << "<hr><h4><font color=\"red\">New parser:</font></h4>\n";
+}
+
+void HtmlDocVisitor::visitPost(DocRoot *)
+{
+ //m_t << "<hr><h4><font color=\"red\">Old parser:</font></h4>\n";
+}
+
+void HtmlDocVisitor::visitPre(DocSimpleSect *s)
+{
+ m_t << "<dl compact><dt><b>";
+ switch(s->type())
+ {
+ case DocSimpleSect::See:
+ m_t << theTranslator->trSeeAlso(); break;
+ case DocSimpleSect::Return:
+ m_t << theTranslator->trReturns(); break;
+ case DocSimpleSect::Author:
+ m_t << theTranslator->trAuthor(TRUE,TRUE); break;
+ case DocSimpleSect::Authors:
+ m_t << theTranslator->trAuthor(TRUE,FALSE); break;
+ case DocSimpleSect::Version:
+ m_t << theTranslator->trVersion(); break;
+ case DocSimpleSect::Since:
+ m_t << theTranslator->trSince(); break;
+ case DocSimpleSect::Date:
+ m_t << theTranslator->trDate(); break;
+ case DocSimpleSect::Note:
+ m_t << theTranslator->trNote(); break;
+ case DocSimpleSect::Warning:
+ m_t << theTranslator->trWarning(); break;
+ case DocSimpleSect::Pre:
+ m_t << theTranslator->trPrecondition(); break;
+ case DocSimpleSect::Post:
+ m_t << theTranslator->trPostcondition(); break;
+ case DocSimpleSect::Invar:
+ m_t << theTranslator->trInvariant(); break;
+ case DocSimpleSect::Remark:
+ m_t << theTranslator->trRemarks(); break;
+ case DocSimpleSect::Attention:
+ m_t << theTranslator->trAttention(); break;
+ case DocSimpleSect::User: break;
+ case DocSimpleSect::Unknown: break;
+ }
+
+ // special case 1: user defined title
+ if (s->type()!=DocSimpleSect::User)
+ {
+ m_t << ":</b></dt><dd>";
+ }
+}
+
+void HtmlDocVisitor::visitPost(DocSimpleSect *)
+{
+ m_t << "</dd></dl>\n";
+}
+
+void HtmlDocVisitor::visitPre(DocTitle *)
+{
+}
+
+void HtmlDocVisitor::visitPost(DocTitle *)
+{
+ m_t << "</b></dt><dd>";
+}
+
+void HtmlDocVisitor::visitPre(DocSimpleList *)
+{
+ m_t << "<ul>\n";
+}
+
+void HtmlDocVisitor::visitPost(DocSimpleList *)
+{
+ m_t << "</ul>\n";
+}
+
+void HtmlDocVisitor::visitPre(DocSimpleListItem *)
+{
+ m_t << "<li>";
+}
+
+void HtmlDocVisitor::visitPost(DocSimpleListItem *)
+{
+ m_t << "</li>\n";
+}
+
+void HtmlDocVisitor::visitPre(DocSection *s)
+{
+ m_t << "<h" << s->level()+1 << ">";
+ m_t << "<a name=\"" << s->anchor();
+ filter(s->title());
+ m_t << "\"</a>" << endl;
+ m_t << "</h" << s->level()+1 << ">\n";
+}
+
+void HtmlDocVisitor::visitPost(DocSection *)
+{
+}
+
+void HtmlDocVisitor::visitPre(DocHtmlList *s)
+{
+ if (s->type()==DocHtmlList::Ordered)
+ m_t << "<ol>\n";
+ else
+ m_t << "<ul>\n";
+}
+
+void HtmlDocVisitor::visitPost(DocHtmlList *s)
+{
+ if (s->type()==DocHtmlList::Ordered)
+ m_t << "</ol>\n";
+ else
+ m_t << "</ul>\n";
+}
+
+void HtmlDocVisitor::visitPre(DocHtmlListItem *)
+{
+ m_t << "<li>\n";
+}
+
+void HtmlDocVisitor::visitPost(DocHtmlListItem *)
+{
+ m_t << "</li>\n";
+}
+
+void HtmlDocVisitor::visitPre(DocHtmlPre *)
+{
+ m_t << "<pre>\n";
+ m_insidePre=TRUE;
+}
+
+void HtmlDocVisitor::visitPost(DocHtmlPre *)
+{
+ m_insidePre=FALSE;
+ m_t << "</pre>\n";
+}
+
+void HtmlDocVisitor::visitPre(DocHtmlDescList *)
+{
+ m_t << "<dl>\n";
+}
+
+void HtmlDocVisitor::visitPost(DocHtmlDescList *)
+{
+ m_t << "</dl>\n";
+}
+
+void HtmlDocVisitor::visitPre(DocHtmlDescTitle *)
+{
+ m_t << "<dt>";
+}
+
+void HtmlDocVisitor::visitPost(DocHtmlDescTitle *)
+{
+ m_t << "</dt>\n";
+}
+
+void HtmlDocVisitor::visitPre(DocHtmlDescData *)
+{
+ m_t << "<dd>";
+}
+
+void HtmlDocVisitor::visitPost(DocHtmlDescData *)
+{
+ m_t << "</dd>\n";
+}
+
+void HtmlDocVisitor::visitPre(DocHtmlTable *)
+{
+ m_t << "<table border=\"1\" cellspacing=\"3\" cellpadding=\"3\">\n";
+}
+
+void HtmlDocVisitor::visitPost(DocHtmlTable *)
+{
+ m_t << "</table>\n";
+}
+
+void HtmlDocVisitor::visitPre(DocHtmlRow *)
+{
+ m_t << "<tr>\n";
+}
+
+void HtmlDocVisitor::visitPost(DocHtmlRow *)
+{
+ m_t << "</tr>\n";
+}
+
+void HtmlDocVisitor::visitPre(DocHtmlCell *c)
+{
+ if (c->isHeading()) m_t << "<th>"; else m_t << "<td>";
+}
+
+void HtmlDocVisitor::visitPost(DocHtmlCell *c)
+{
+ if (c->isHeading()) m_t << "</th>"; else m_t << "</td>";
+}
+
+void HtmlDocVisitor::visitPre(DocHtmlCaption *)
+{
+ m_t << "<caption align=\"bottom\">";
+}
+
+void HtmlDocVisitor::visitPost(DocHtmlCaption *)
+{
+ m_t << "</caption>\n";
+}
+
+void HtmlDocVisitor::visitPre(DocIndexEntry *)
+{
+ m_hide = TRUE;
+}
+
+void HtmlDocVisitor::visitPost(DocIndexEntry *)
+{
+ m_hide = FALSE;
+}
+
+void HtmlDocVisitor::visitPre(DocInternal *)
+{
+ m_t << "<p><b>" << theTranslator->trForInternalUseOnly() << "</b></p>" << endl;
+ m_t << "<p>" << endl;
+}
+
+void HtmlDocVisitor::visitPost(DocInternal *)
+{
+ m_t << "</p>" << endl;
+}
+
+void HtmlDocVisitor::visitPre(DocHRef *href)
+{
+ m_t << "<a href=\"" << href->url() << "\">";
+}
+
+void HtmlDocVisitor::visitPost(DocHRef *)
+{
+ m_t << "</a>";
+}
+
+void HtmlDocVisitor::visitPre(DocHtmlHeader *header)
+{
+ m_t << "<h" << header->level() << ">";
+}
+
+void HtmlDocVisitor::visitPost(DocHtmlHeader *header)
+{
+ m_t << "</h" << header->level() << ">\n";
+}
+
+void HtmlDocVisitor::visitPre(DocImage *img)
+{
+ if (img->type()==DocImage::Html)
+ {
+ QCString baseName=img->name();
+ int i;
+ if ((i=baseName.findRev('/'))!=-1 || (i=baseName.findRev('\\'))!=-1)
+ {
+ baseName=baseName.right(baseName.length()-i-1);
+ }
+ m_t << "<div align=\"center\">" << endl;
+ m_t << "<img src=\"" << img->name() << "\" alt=\""
+ << baseName << "\">" << endl;
+ if (img->hasCaption())
+ {
+ m_t << "<p><strong>";
+ }
+ }
+ else // other format -> skip
+ {
+ m_hide=TRUE;
+ }
+}
+
+void HtmlDocVisitor::visitPost(DocImage *img)
+{
+ if (img->type()==DocImage::Html)
+ {
+ if (img->hasCaption())
+ {
+ m_t << "</strong></p>";
+ }
+ m_t << "</div>" << endl;
+ }
+ else // other format
+ {
+ m_hide=FALSE;
+ }
+}
+
+void HtmlDocVisitor::visitPre(DocDotFile *df)
+{
+ QCString baseName=df->file();
+ int i;
+ if ((i=baseName.findRev('/'))!=-1)
+ {
+ baseName=baseName.right(baseName.length()-i-1);
+ }
+ QCString outDir = Config_getString("HTML_OUTPUT");
+ writeDotGraphFromFile(df->file(),outDir,baseName,BITMAP);
+ m_t << "<div align=\"center\">" << endl;
+ m_t << "<img src=\"" << baseName << "."
+ << Config_getEnum("DOT_IMAGE_FORMAT") << "\" alt=\""
+ << baseName << "\">" << endl;
+ if (df->hasCaption())
+ {
+ m_t << "<p><strong>";
+ }
+}
+
+void HtmlDocVisitor::visitPost(DocDotFile *df)
+{
+ if (df->hasCaption())
+ {
+ m_t << "</strong></p>" << endl;
+ }
+ m_t << "</div>" << endl;
+}
+
+void HtmlDocVisitor::visitPre(DocLink *lnk)
+{
+ startLink(lnk->ref(),lnk->file(),lnk->anchor());
+}
+
+void HtmlDocVisitor::visitPost(DocLink *)
+{
+ endLink();
+}
+
+void HtmlDocVisitor::visitPre(DocRef *ref)
+{
+ startLink(ref->ref(),ref->file(),ref->anchor());
+ if (!ref->hasLinkText()) filter(ref->targetTitle());
+}
+
+void HtmlDocVisitor::visitPost(DocRef *)
+{
+ endLink();
+ m_t << " ";
+}
+
+void HtmlDocVisitor::visitPre(DocSecRefItem *ref)
+{
+ QCString refName=ref->file();
+ if (refName.right(Doxygen::htmlFileExtension.length())!=Doxygen::htmlFileExtension)
+ {
+ refName+=Doxygen::htmlFileExtension;
+ }
+ m_t << "<li><a href=\"" << refName << "#" << ref->anchor() << "\">";
+
+}
+
+void HtmlDocVisitor::visitPost(DocSecRefItem *)
+{
+ m_t << "</a> ";
+}
+
+void HtmlDocVisitor::visitPre(DocSecRefList *)
+{
+ m_t << "<multicol cols=3>" << endl;
+ m_t << "<ul>" << endl;
+}
+
+void HtmlDocVisitor::visitPost(DocSecRefList *)
+{
+ m_t << "</ul>" << endl;
+ m_t << "</multicol>" << endl;
+}
+
+void HtmlDocVisitor::visitPre(DocLanguage *)
+{
+}
+
+void HtmlDocVisitor::visitPost(DocLanguage *)
+{
+}
+
+void HtmlDocVisitor::visitPre(DocParamSect *s)
+{
+ m_t << "<dl compact><dt><b>";
+ switch(s->type())
+ {
+ case DocParamSect::Param:
+ m_t << theTranslator->trParameters(); break;
+ case DocParamSect::RetVal:
+ m_t << theTranslator->trReturnValues(); break;
+ case DocParamSect::Exception:
+ m_t << theTranslator->trExceptions(); break;
+ default:
+ ASSERT(0);
+ }
+ m_t << ":";
+ m_t << "</b></dt><dd>" << endl;
+ m_t << " <table border=\"0\" cellspacing=\"2\" cellpadding=\"0\">" << endl;
+}
+
+void HtmlDocVisitor::visitPost(DocParamSect *)
+{
+ m_t << " </table>" << endl;
+ m_t << "</dl>" << endl;
+}
+
+void HtmlDocVisitor::visitPre(DocParamList *pl)
+{
+ m_t << " <tr><td valign=top><em>";
+ QStrListIterator li(pl->parameters());
+ const char *s;
+ bool first=TRUE;
+ for (li.toFirst();(s=li.current());++li)
+ {
+ if (!first) m_t << ","; else first=FALSE;
+ m_t << s;
+ }
+ m_t << "</em>&nbsp;</td><td>";
+}
+
+void HtmlDocVisitor::visitPost(DocParamList *)
+{
+ m_t << "</td></tr>" << endl;
+}
+
+void HtmlDocVisitor::visitPre(DocXRefItem *x)
+{
+ m_t << "<dl compact><dt><b><a class=\"el\" href=\""
+ << x->file() << Doxygen::htmlFileExtension << "#" << x->anchor() << "\">";
+ filter(x->title());
+ m_t << ":</a></b></dt><dd>";
+}
+
+void HtmlDocVisitor::visitPost(DocXRefItem *)
+{
+ m_t << "</dd></dl>" << endl;
+}
+
+void HtmlDocVisitor::visitPre(DocInternalRef *ref)
+{
+ startLink(0,ref->file(),ref->anchor());
+}
+
+void HtmlDocVisitor::visitPost(DocInternalRef *)
+{
+ endLink();
+ m_t << " ";
+}
+
+void HtmlDocVisitor::visitPre(DocCopy *)
+{
+}
+
+void HtmlDocVisitor::visitPost(DocCopy *)
+{
+}
void HtmlDocVisitor::filter(const char *str)
{
diff --git a/src/htmldocvisitor.h b/src/htmldocvisitor.h
index 39956da..2be1fa5 100644
--- a/src/htmldocvisitor.h
+++ b/src/htmldocvisitor.h
@@ -20,646 +20,109 @@
#define _HTMLDOCVISITOR_H
#include "docvisitor.h"
-#include "docparser.h"
-#include "language.h"
-#include "doxygen.h"
-#include "outputgen.h"
-#include "code.h"
-#include "dot.h"
+
+class QTextStream;
+class BaseCodeDocInterface;
+class QCString;
/*! @brief Concrete visitor implementation for HTML output. */
class HtmlDocVisitor : public DocVisitor
{
public:
- HtmlDocVisitor(QTextStream &t,BaseCodeDocInterface &ci)
- : m_t(t), m_ci(ci), m_insidePre(FALSE), m_hide(FALSE) {}
+ HtmlDocVisitor(QTextStream &t,BaseCodeDocInterface &ci);
//--------------------------------------
// visitor functions for leaf nodes
//--------------------------------------
- void visit(DocWord *w)
- {
- if (m_hide) return;
- filter(w->word());
- }
- void visit(DocLinkedWord *w)
- {
- if (m_hide) return;
- startLink(w->ref(),w->file(),w->anchor());
- filter(w->word());
- endLink();
- }
- void visit(DocWhiteSpace *w)
- {
- if (m_hide) return;
- if (m_insidePre)
- {
- m_t << w->chars();
- }
- else
- {
- m_t << " ";
- }
- }
- void visit(DocSymbol *s)
- {
- if (m_hide) return;
- switch(s->symbol())
- {
- case DocSymbol::BSlash: m_t << "\\"; break;
- case DocSymbol::At: m_t << "@"; break;
- case DocSymbol::Less: m_t << "&lt;"; break;
- case DocSymbol::Greater: m_t << "&gt;"; break;
- case DocSymbol::Amp: m_t << "&amp;"; break;
- case DocSymbol::Dollar: m_t << "$"; break;
- case DocSymbol::Hash: m_t << "#"; break;
- case DocSymbol::Percent: m_t << "%"; break;
- case DocSymbol::Copy: m_t << "&copy;"; break;
- case DocSymbol::Apos: m_t << "'"; break;
- case DocSymbol::Quot: m_t << "\""; break;
- case DocSymbol::Uml: m_t << "&" << s->letter() << "uml;"; break;
- case DocSymbol::Acute: m_t << "&" << s->letter() << "acute;"; break;
- case DocSymbol::Grave: m_t << "&" << s->letter() << "grave;"; break;
- case DocSymbol::Circ: m_t << "&" << s->letter() << "circ;"; break;
- case DocSymbol::Tilde: m_t << "&" << s->letter() << "tilde;"; break;
- case DocSymbol::Szlig: m_t << "&szlig;"; break;
- case DocSymbol::Cedil: m_t << "&" << s->letter() << "cedul;"; break;
- case DocSymbol::Ring: m_t << "&" << s->letter() << "ring;"; break;
- case DocSymbol::Nbsp: m_t << "&nbsp;"; break;
- default:
- printf("Error: unknown symbol found\n");
- }
- }
- void visit(DocURL *u)
- {
- if (m_hide) return;
- m_t << "<a href=\"" << u->url() << "\">" << u->url() << "</a>";
- }
- void visit(DocLineBreak *)
- {
- if (m_hide) return;
- m_t << "<br>\n";
- }
- void visit(DocHorRuler *)
- {
- if (m_hide) return;
- m_t << "<hr>\n";
- }
- void visit(DocStyleChange *s)
- {
- if (m_hide) return;
- switch (s->style())
- {
- case DocStyleChange::Bold:
- if (s->enable()) m_t << "<b>"; else m_t << "</b> ";
- break;
- case DocStyleChange::Italic:
- if (s->enable()) m_t << "<em>"; else m_t << "</em> ";
- break;
- case DocStyleChange::Code:
- if (s->enable()) m_t << "<code>"; else m_t << "</code> ";
- break;
- case DocStyleChange::Subscript:
- if (s->enable()) m_t << "<sub>"; else m_t << "</sub> ";
- break;
- case DocStyleChange::Superscript:
- if (s->enable()) m_t << "<sup>"; else m_t << "</sup> ";
- break;
- case DocStyleChange::Center:
- if (s->enable()) m_t << "<center>"; else m_t << "</center> ";
- break;
- case DocStyleChange::Small:
- if (s->enable()) m_t << "<small>"; else m_t << "</small> ";
- break;
- }
- }
- void visit(DocVerbatim *s)
- {
- if (m_hide) return;
- switch(s->type())
- {
- case DocVerbatim::Code: // fall though
- m_t << "<div class=\"fragment\"><pre>";
- parseCode(m_ci,s->context(),s->text(),FALSE,0);
- m_t << "</pre></div>";
- break;
- case DocVerbatim::Verbatim:
- m_t << "<div class=\"fragment\"><pre>";
- filter(s->text());
- m_t << "</pre></div>";
- break;
- case DocVerbatim::HtmlOnly:
- m_t << s->text();
- break;
- case DocVerbatim::LatexOnly:
- /* nothing */
- break;
- }
- }
- void visit(DocAnchor *)
- {
- if (m_hide) return;
- m_t << "<a name=\"%s\"/></a>";
- }
- void visit(DocInclude *inc)
- {
- if (m_hide) return;
- switch(inc->type())
- {
- case DocInclude::Include:
- m_t << "<div class=\"fragment\"><pre>";
- parseCode(m_ci,inc->context(),inc->text(),FALSE,0);
- m_t << "</pre></div>";
- break;
- case DocInclude::DontInclude:
- break;
- case DocInclude::HtmlInclude:
- m_t << inc->text();
- break;
- case DocInclude::VerbInclude:
- m_t << "<div class=\"fragment\"><pre>";
- filter(inc->text());
- m_t << "</pre></div>";
- break;
- }
- }
- void visit(DocIncOperator *op)
- {
- //printf("DocIncOperator: type=%d first=%d, last=%d text=`%s'\n",
- // op->type(),op->isFirst(),op->isLast(),op->text().data());
- if (op->isFirst())
- {
- m_t << "<div class=\"fragment\"><pre>";
- m_hide = TRUE;
- }
- if (op->type()!=DocIncOperator::Skip)
- {
- parseCode(m_ci,op->context(),op->text(),FALSE,0);
- }
- if (op->isLast())
- {
- m_hide = FALSE;
- m_t << "</pre></div>";
- }
- else
- {
- m_t << endl;
- }
- }
- void visit(DocFormula *f)
- {
- if (m_hide) return;
- if (f->text().at(0)=='\\') m_t << "<p><center>" << endl;
- m_t << "<img align=";
-#if !defined(_WIN32)
- m_t << "\"top\""; // assume Unix users use Netscape 4.x which does
- // not seem to support align == "middle" :-((
-#else
- m_t << "\"middle\""; // assume Windows users use IE or HtmlHelp which on
- // displays formulas nicely with align == "middle"
-#endif
- m_t << " src=\"" << f->name() << ".png\">";
- if (f->text().at(0)=='\\')
- m_t << endl << "</center><p>" << endl;
- else
- m_t << " ";
- }
+ void visit(DocWord *);
+ void visit(DocLinkedWord *);
+ void visit(DocWhiteSpace *);
+ void visit(DocSymbol *);
+ void visit(DocURL *);
+ void visit(DocLineBreak *);
+ void visit(DocHorRuler *);
+ void visit(DocStyleChange *);
+ void visit(DocVerbatim *);
+ void visit(DocAnchor *);
+ void visit(DocInclude *);
+ void visit(DocIncOperator *);
+ void visit(DocFormula *);
//--------------------------------------
// visitor functions for compound nodes
//--------------------------------------
- void visitPre(DocAutoList *l)
- {
- if (l->isEnumList())
- {
- m_t << "<ol>\n";
- }
- else
- {
- m_t << "<ul>\n";
- }
- }
- void visitPost(DocAutoList *l)
- {
- if (l->isEnumList())
- {
- m_t << "</ol>\n";
- }
- else
- {
- m_t << "</ul>\n";
- }
- }
- void visitPre(DocAutoListItem *)
- {
- m_t << "<li>";
- }
- void visitPost(DocAutoListItem *)
- {
- m_t << "</li>";
- }
- void visitPre(DocPara *)
- {
- }
- void visitPost(DocPara *p)
- {
- if (!p->isLast() && // omit <p> for last paragraph
- !(p->parent() && // and for parameter sections
- p->parent()->kind()==DocNode::Kind_ParamSect
- )
- ) m_t << "\n<p>\n";
- }
- void visitPre(DocRoot *)
- {
- //m_t << "<hr><h4><font color=\"red\">New parser:</font></h4>\n";
- }
- void visitPost(DocRoot *)
- {
- //m_t << "<hr><h4><font color=\"red\">Old parser:</font></h4>\n";
- }
- void visitPre(DocSimpleSect *s)
- {
- m_t << "<dl compact><dt><b>";
- switch(s->type())
- {
- case DocSimpleSect::See:
- m_t << theTranslator->trSeeAlso(); break;
- case DocSimpleSect::Return:
- m_t << theTranslator->trReturns(); break;
- case DocSimpleSect::Author:
- m_t << theTranslator->trAuthor(TRUE,TRUE); break;
- case DocSimpleSect::Authors:
- m_t << theTranslator->trAuthor(TRUE,FALSE); break;
- case DocSimpleSect::Version:
- m_t << theTranslator->trVersion(); break;
- case DocSimpleSect::Since:
- m_t << theTranslator->trSince(); break;
- case DocSimpleSect::Date:
- m_t << theTranslator->trDate(); break;
- case DocSimpleSect::Note:
- m_t << theTranslator->trNote(); break;
- case DocSimpleSect::Warning:
- m_t << theTranslator->trWarning(); break;
- case DocSimpleSect::Pre:
- m_t << theTranslator->trPrecondition(); break;
- case DocSimpleSect::Post:
- m_t << theTranslator->trPostcondition(); break;
- case DocSimpleSect::Invar:
- m_t << theTranslator->trInvariant(); break;
- case DocSimpleSect::Remark:
- m_t << theTranslator->trRemarks(); break;
- case DocSimpleSect::Attention:
- m_t << theTranslator->trAttention(); break;
- case DocSimpleSect::User: break;
- case DocSimpleSect::Unknown: break;
- }
-
- // special case 1: user defined title
- if (s->type()!=DocSimpleSect::User)
- {
- m_t << ":</b></dt><dd>";
- }
- }
- void visitPost(DocSimpleSect *)
- {
- m_t << "</dd></dl>\n";
- }
- void visitPre(DocTitle *)
- {
- }
- void visitPost(DocTitle *)
- {
- m_t << "</b></dt><dd>";
- }
- void visitPre(DocSimpleList *)
- {
- m_t << "<ul>\n";
- }
- void visitPost(DocSimpleList *)
- {
- m_t << "</ul>\n";
- }
- void visitPre(DocSimpleListItem *)
- {
- m_t << "<li>";
- }
- void visitPost(DocSimpleListItem *)
- {
- m_t << "</li>\n";
- }
- void visitPre(DocSection *s)
- {
- m_t << "<h" << s->level()+1 << ">";
- m_t << "<a name=\"" << s->anchor();
- filter(s->title());
- m_t << "\"</a>" << endl;
- m_t << "</h" << s->level()+1 << ">\n";
- }
- void visitPost(DocSection *)
- {
- }
- void visitPre(DocHtmlList *s)
- {
- if (s->type()==DocHtmlList::Ordered)
- m_t << "<ol>\n";
- else
- m_t << "<ul>\n";
- }
- void visitPost(DocHtmlList *s)
- {
- if (s->type()==DocHtmlList::Ordered)
- m_t << "</ol>\n";
- else
- m_t << "</ul>\n";
- }
- void visitPre(DocHtmlListItem *)
- {
- m_t << "<li>\n";
- }
- void visitPost(DocHtmlListItem *)
- {
- m_t << "</li>\n";
- }
- void visitPre(DocHtmlPre *)
- {
- m_t << "<pre>\n";
- m_insidePre=TRUE;
- }
- void visitPost(DocHtmlPre *)
- {
- m_insidePre=FALSE;
- m_t << "</pre>\n";
- }
- void visitPre(DocHtmlDescList *)
- {
- m_t << "<dl>\n";
- }
- void visitPost(DocHtmlDescList *)
- {
- m_t << "</dl>\n";
- }
- void visitPre(DocHtmlDescTitle *)
- {
- m_t << "<dt>";
- }
- void visitPost(DocHtmlDescTitle *)
- {
- m_t << "</dt>\n";
- }
- void visitPre(DocHtmlDescData *)
- {
- m_t << "<dd>";
- }
- void visitPost(DocHtmlDescData *)
- {
- m_t << "</dd>\n";
- }
- void visitPre(DocHtmlTable *)
- {
- m_t << "<table border=\"1\" cellspacing=\"3\" cellpadding=\"3\">\n";
- }
- void visitPost(DocHtmlTable *)
- {
- m_t << "</table>\n";
- }
- void visitPre(DocHtmlRow *)
- {
- m_t << "<tr>\n";
- }
- void visitPost(DocHtmlRow *)
- {
- m_t << "</tr>\n";
- }
- void visitPre(DocHtmlCell *c)
- {
- if (c->isHeading()) m_t << "<th>"; else m_t << "<td>";
- }
- void visitPost(DocHtmlCell *c)
- {
- if (c->isHeading()) m_t << "</th>"; else m_t << "</td>";
- }
- void visitPre(DocHtmlCaption *)
- {
- m_t << "<caption align=\"bottom\">";
- }
- void visitPost(DocHtmlCaption *)
- {
- m_t << "</caption>\n";
- }
- void visitPre(DocIndexEntry *)
- {
- m_hide = TRUE;
- }
- void visitPost(DocIndexEntry *)
- {
- m_hide = FALSE;
- }
- void visitPre(DocInternal *)
- {
- m_t << "<p><b>" << theTranslator->trForInternalUseOnly() << "</b></p>" << endl;
- m_t << "<p>" << endl;
- }
- void visitPost(DocInternal *)
- {
- m_t << "</p>" << endl;
- }
- void visitPre(DocHRef *href)
- {
- m_t << "<a href=\"" << href->url() << "\">";
- }
- void visitPost(DocHRef *)
- {
- m_t << "</a>";
- }
- void visitPre(DocHtmlHeader *header)
- {
- m_t << "<h" << header->level() << ">";
- }
- void visitPost(DocHtmlHeader *header)
- {
- m_t << "</h" << header->level() << ">\n";
- }
- void visitPre(DocImage *img)
- {
- if (img->type()==DocImage::Html)
- {
- QCString baseName=img->name();
- int i;
- if ((i=baseName.findRev('/'))!=-1 || (i=baseName.findRev('\\'))!=-1)
- {
- baseName=baseName.right(baseName.length()-i-1);
- }
- m_t << "<div align=\"center\">" << endl;
- m_t << "<img src=\"" << img->name() << "\" alt=\""
- << baseName << "\">" << endl;
- if (img->hasCaption())
- {
- m_t << "<p><strong>";
- }
- }
- else // other format -> skip
- {
- m_hide=TRUE;
- }
- }
- void visitPost(DocImage *img)
- {
- if (img->type()==DocImage::Html)
- {
- if (img->hasCaption())
- {
- m_t << "</strong></p>";
- }
- m_t << "</div>" << endl;
- }
- else // other format
- {
- m_hide=FALSE;
- }
- }
- void visitPre(DocDotFile *df)
- {
- QCString baseName=df->file();
- int i;
- if ((i=baseName.findRev('/'))!=-1)
- {
- baseName=baseName.right(baseName.length()-i-1);
- }
- QCString outDir = Config_getString("HTML_OUTPUT");
- writeDotGraphFromFile(df->file(),outDir,baseName,BITMAP);
- m_t << "<div align=\"center\">" << endl;
- m_t << "<img src=\"" << baseName << "."
- << Config_getEnum("DOT_IMAGE_FORMAT") << "\" alt=\""
- << baseName << "\">" << endl;
- if (df->hasCaption())
- {
- m_t << "<p><strong>";
- }
- }
- void visitPost(DocDotFile *df)
- {
- if (df->hasCaption())
- {
- m_t << "</strong></p>" << endl;
- }
- m_t << "</div>" << endl;
- }
- void visitPre(DocLink *lnk)
- {
- startLink(lnk->ref(),lnk->file(),lnk->anchor());
- }
- void visitPost(DocLink *)
- {
- endLink();
- }
- void visitPre(DocRef *ref)
- {
- startLink(ref->ref(),ref->file(),ref->anchor());
- if (!ref->hasLinkText()) filter(ref->targetTitle());
- }
- void visitPost(DocRef *)
- {
- endLink();
- m_t << " ";
- }
- void visitPre(DocSecRefItem *ref)
- {
- QCString refName=ref->file();
- if (refName.right(Doxygen::htmlFileExtension.length())!=Doxygen::htmlFileExtension)
- {
- refName+=Doxygen::htmlFileExtension;
- }
- m_t << "<li><a href=\"" << refName << "#" << ref->anchor() << "\">";
-
- }
- void visitPost(DocSecRefItem *)
- {
- m_t << "</a> ";
- }
- void visitPre(DocSecRefList *)
- {
- m_t << "<multicol cols=3>" << endl;
- m_t << "<ul>" << endl;
- }
- void visitPost(DocSecRefList *)
- {
- m_t << "</ul>" << endl;
- m_t << "</multicol>" << endl;
- }
- void visitPre(DocLanguage *)
- {
- }
- void visitPost(DocLanguage *)
- {
- }
- void visitPre(DocParamSect *s)
- {
- m_t << "<dl compact><dt><b>";
- switch(s->type())
- {
- case DocParamSect::Param:
- m_t << theTranslator->trParameters(); break;
- case DocParamSect::RetVal:
- m_t << theTranslator->trReturnValues(); break;
- case DocParamSect::Exception:
- m_t << theTranslator->trExceptions(); break;
- default:
- ASSERT(0);
- }
- m_t << ":";
- m_t << "</b></dt><dd>" << endl;
- m_t << " <table border=\"0\" cellspacing=\"2\" cellpadding=\"0\">" << endl;
- }
- void visitPost(DocParamSect *)
- {
- m_t << " </table>" << endl;
- m_t << "</dl>" << endl;
- }
- void visitPre(DocParamList *pl)
- {
- m_t << " <tr><td valign=top><em>";
- QStrListIterator li(pl->parameters());
- const char *s;
- bool first=TRUE;
- for (li.toFirst();(s=li.current());++li)
- {
- if (!first) m_t << ","; else first=FALSE;
- m_t << s;
- }
- m_t << "</em>&nbsp;</td><td>";
- }
- void visitPost(DocParamList *)
- {
- m_t << "</td></tr>" << endl;
- }
- void visitPre(DocXRefItem *x)
- {
- m_t << "<dl compact><dt><b><a class=\"el\" href=\""
- << x->file() << Doxygen::htmlFileExtension << "#" << x->anchor() << "\">";
- filter(x->title());
- m_t << ":</a></b></dt><dd>";
- }
- void visitPost(DocXRefItem *)
- {
- m_t << "</dd></dl>" << endl;
- }
- void visitPre(DocInternalRef *ref)
- {
- startLink(0,ref->file(),ref->anchor());
- }
- void visitPost(DocInternalRef *)
- {
- endLink();
- m_t << " ";
- }
- void visitPre(DocCopy *)
- {
- }
- void visitPost(DocCopy *)
- {
- }
+ void visitPre(DocAutoList *);
+ void visitPost(DocAutoList *);
+ void visitPre(DocAutoListItem *);
+ void visitPost(DocAutoListItem *);
+ void visitPre(DocPara *) ;
+ void visitPost(DocPara *);
+ void visitPre(DocRoot *);
+ void visitPost(DocRoot *);
+ void visitPre(DocSimpleSect *);
+ void visitPost(DocSimpleSect *);
+ void visitPre(DocTitle *);
+ void visitPost(DocTitle *);
+ void visitPre(DocSimpleList *);
+ void visitPost(DocSimpleList *);
+ void visitPre(DocSimpleListItem *);
+ void visitPost(DocSimpleListItem *);
+ void visitPre(DocSection *);
+ void visitPost(DocSection *);
+ void visitPre(DocHtmlList *);
+ void visitPost(DocHtmlList *) ;
+ void visitPre(DocHtmlListItem *);
+ void visitPost(DocHtmlListItem *);
+ void visitPre(DocHtmlPre *);
+ void visitPost(DocHtmlPre *);
+ void visitPre(DocHtmlDescList *);
+ void visitPost(DocHtmlDescList *);
+ void visitPre(DocHtmlDescTitle *);
+ void visitPost(DocHtmlDescTitle *);
+ void visitPre(DocHtmlDescData *);
+ void visitPost(DocHtmlDescData *);
+ void visitPre(DocHtmlTable *);
+ void visitPost(DocHtmlTable *);
+ void visitPre(DocHtmlRow *);
+ void visitPost(DocHtmlRow *) ;
+ void visitPre(DocHtmlCell *);
+ void visitPost(DocHtmlCell *);
+ void visitPre(DocHtmlCaption *);
+ void visitPost(DocHtmlCaption *);
+ void visitPre(DocIndexEntry *);
+ void visitPost(DocIndexEntry *);
+ void visitPre(DocInternal *);
+ void visitPost(DocInternal *);
+ void visitPre(DocHRef *);
+ void visitPost(DocHRef *);
+ void visitPre(DocHtmlHeader *);
+ void visitPost(DocHtmlHeader *);
+ void visitPre(DocImage *);
+ void visitPost(DocImage *);
+ void visitPre(DocDotFile *);
+ void visitPost(DocDotFile *);
+ void visitPre(DocLink *);
+ void visitPost(DocLink *);
+ void visitPre(DocRef *);
+ void visitPost(DocRef *);
+ void visitPre(DocSecRefItem *);
+ void visitPost(DocSecRefItem *);
+ void visitPre(DocSecRefList *);
+ void visitPost(DocSecRefList *);
+ void visitPre(DocLanguage *);
+ void visitPost(DocLanguage *);
+ void visitPre(DocParamSect *);
+ void visitPost(DocParamSect *);
+ void visitPre(DocParamList *);
+ void visitPost(DocParamList *);
+ void visitPre(DocXRefItem *);
+ void visitPost(DocXRefItem *);
+ void visitPre(DocInternalRef *);
+ void visitPost(DocInternalRef *);
+ void visitPre(DocCopy *);
+ void visitPost(DocCopy *);
private:
diff --git a/src/htmlgen.cpp b/src/htmlgen.cpp
index 61f2eef..f95d2d7 100644
--- a/src/htmlgen.cpp
+++ b/src/htmlgen.cpp
@@ -30,6 +30,7 @@
#include "dot.h"
#include "language.h"
#include "htmlhelp.h"
+#include "docparser.h"
#include "htmldocvisitor.h"
// #define GROUP_COLOR "#ff8080"
diff --git a/src/latexdocvisitor.cpp b/src/latexdocvisitor.cpp
index ab310c8..c6a13ab 100644
--- a/src/latexdocvisitor.cpp
+++ b/src/latexdocvisitor.cpp
@@ -17,8 +17,830 @@
*/
#include "latexdocvisitor.h"
+#include "docparser.h"
+#include "language.h"
+#include "doxygen.h"
+#include "outputgen.h"
+#include "code.h"
+#include "dot.h"
#include "util.h"
+LatexDocVisitor::LatexDocVisitor(QTextStream &t,BaseCodeDocInterface &ci)
+ : m_t(t), m_ci(ci), m_insidePre(FALSE), m_hide(FALSE)
+{
+}
+
+ //--------------------------------------
+ // visitor functions for leaf nodes
+ //--------------------------------------
+
+void LatexDocVisitor::visit(DocWord *w)
+{
+ if (m_hide) return;
+ filter(w->word());
+}
+
+void LatexDocVisitor::visit(DocLinkedWord *w)
+{
+ if (m_hide) return;
+ startLink(w->ref(),w->file(),w->anchor());
+ filter(w->word());
+ endLink();
+}
+
+void LatexDocVisitor::visit(DocWhiteSpace *w)
+{
+ if (m_hide) return;
+ if (m_insidePre)
+ {
+ m_t << w->chars();
+ }
+ else
+ {
+ m_t << " ";
+ }
+}
+
+void LatexDocVisitor::visit(DocSymbol *s)
+{
+ if (m_hide) return;
+ switch(s->symbol())
+ {
+ case DocSymbol::BSlash: m_t << "$\\backslash$"; break;
+ case DocSymbol::At: m_t << "@"; break;
+ case DocSymbol::Less: m_t << "$<$"; break;
+ case DocSymbol::Greater: m_t << "$>$"; break;
+ case DocSymbol::Amp: m_t << "\\&"; break;
+ case DocSymbol::Dollar: m_t << "\\$"; break;
+ case DocSymbol::Hash: m_t << "\\#"; break;
+ case DocSymbol::Percent: m_t << "\\%"; break;
+ case DocSymbol::Copy: m_t << "\\copyright"; break;
+ case DocSymbol::Apos: m_t << "'"; break;
+ case DocSymbol::Quot: m_t << "''"; break;
+ case DocSymbol::Uml:
+ if (s->letter()=='i')
+ m_t << "\\\"{\\i}";
+ else
+ m_t << "\\\"{" << s->letter() << "}";
+ break;
+ case DocSymbol::Acute:
+ if (s->letter()=='i')
+ m_t << "\\'{\\i}";
+ else
+ m_t << "\\'{" << s->letter() << "}";
+ break;
+ case DocSymbol::Grave:
+ if (s->letter()=='i')
+ m_t << "\\`{\\i}";
+ else
+ m_t << "\\`{" << s->letter() << "}";
+ break;
+ case DocSymbol::Circ:
+ if (s->letter()=='i')
+ m_t << "\\^{\\i}";
+ else
+ m_t << "\\^{" << s->letter() << "}";
+ break;
+ case DocSymbol::Tilde: m_t << "\\~{" << s->letter() << "}"; break;
+ case DocSymbol::Szlig: m_t << "\"s"; break;
+ case DocSymbol::Cedil: m_t << "\\c{" << s->letter() << "}"; break;
+ case DocSymbol::Ring: m_t << "\\" << s->letter() << s->letter(); break;
+ case DocSymbol::Nbsp: m_t << "\\ "; break;
+ default:
+ printf("Error: unknown symbol found\n");
+ }
+}
+
+void LatexDocVisitor::visit(DocURL *u)
+{
+ if (m_hide) return;
+ if (Config_getBool("PDF_HYPERLINKS"))
+ {
+ m_t << "\\href{" << u->url() << "}";
+ }
+ m_t << "{\\tt " << u->url() << "}";
+}
+
+void LatexDocVisitor::visit(DocLineBreak *)
+{
+ if (m_hide) return;
+ m_t << "\\par\n";
+}
+
+void LatexDocVisitor::visit(DocHorRuler *)
+{
+ if (m_hide) return;
+ m_t << "\n\n";
+}
+
+void LatexDocVisitor::visit(DocStyleChange *s)
+{
+ if (m_hide) return;
+ switch (s->style())
+ {
+ case DocStyleChange::Bold:
+ if (s->enable()) m_t << "{\\bf "; else m_t << "} ";
+ break;
+ case DocStyleChange::Italic:
+ if (s->enable()) m_t << "{\\em "; else m_t << "} ";
+ break;
+ case DocStyleChange::Code:
+ if (s->enable()) m_t << "{\\tt "; else m_t << "} ";
+ break;
+ case DocStyleChange::Subscript:
+ if (s->enable()) m_t << "$_{\\mbox{"; else m_t << "}}$ ";
+ break;
+ case DocStyleChange::Superscript:
+ if (s->enable()) m_t << "$^{\\mbox{"; else m_t << "}}$ ";
+ break;
+ case DocStyleChange::Center:
+ if (s->enable()) m_t << "\\begin{center}"; else m_t << "\\end{center} ";
+ break;
+ case DocStyleChange::Small:
+ if (s->enable()) m_t << "\\footnotesize "; else m_t << "\\normalsize ";
+ break;
+ }
+}
+
+void LatexDocVisitor::visit(DocVerbatim *s)
+{
+ if (m_hide) return;
+ switch(s->type())
+ {
+ case DocVerbatim::Code: // fall though
+ m_t << "\n\n\\footnotesize\\begin{verbatim}";
+ parseCode(m_ci,s->context(),s->text(),FALSE,0);
+ m_t << "\\end{verbatim}\\normalsize" << endl;
+ break;
+ case DocVerbatim::Verbatim:
+ m_t << "\n\n\\footnotesize\\begin{verbatim}";
+ m_t << s->text();
+ m_t << "\\end{verbatim}\\normalsize" << endl;
+ break;
+ case DocVerbatim::HtmlOnly:
+ /* nothing */
+ break;
+ case DocVerbatim::LatexOnly:
+ m_t << s->text();
+ break;
+ }
+}
+
+void LatexDocVisitor::visit(DocAnchor *anc)
+{
+ if (m_hide) return;
+ m_t << "\\label{" << anc->anchor() << "}" << endl;
+ if (!anc->file().isEmpty() && Config_getBool("PDF_HYPERLINKS"))
+ {
+ m_t << "\\hypertarget{" << anc->file() << "_" << anc->anchor()
+ << "}{}" << endl;
+ }
+}
+
+void LatexDocVisitor::visit(DocInclude *inc)
+{
+ if (m_hide) return;
+ switch(inc->type())
+ {
+ case DocInclude::Include:
+ m_t << "\n\n\\footnotesize\\begin{verbatim}";
+ parseCode(m_ci,inc->context(),inc->text(),FALSE,0);
+ m_t << "\\end{verbatim}\\normalsize" << endl;
+ break;
+ case DocInclude::DontInclude:
+ break;
+ case DocInclude::HtmlInclude:
+ break;
+ case DocInclude::VerbInclude:
+ m_t << "\n\n\\footnotesize\\begin{verbatim}";
+ m_t << inc->text();
+ m_t << "\\end{verbatim}\\normalsize" << endl;
+ break;
+ }
+}
+
+void LatexDocVisitor::visit(DocIncOperator *op)
+{
+ //printf("DocIncOperator: type=%d first=%d, last=%d text=`%s'\n",
+ // op->type(),op->isFirst(),op->isLast(),op->text().data());
+ if (op->isFirst())
+ {
+ m_t << "\n\n\\footnotesize\\begin{verbatim}";
+ m_hide = TRUE;
+ }
+ if (op->type()!=DocIncOperator::Skip)
+ {
+ parseCode(m_ci,op->context(),op->text(),FALSE,0);
+ }
+ if (op->isLast())
+ {
+ m_hide = FALSE;
+ m_t << "\\end{verbatim}\\normalsize" << endl;
+ }
+ else
+ {
+ m_t << endl;
+ }
+}
+
+void LatexDocVisitor::visit(DocFormula *f)
+{
+ if (m_hide) return;
+ m_t << f->text();
+}
+
+//--------------------------------------
+// visitor functions for compound nodes
+//--------------------------------------
+
+void LatexDocVisitor::visitPre(DocAutoList *l)
+{
+ if (l->isEnumList())
+ {
+ m_t << "\\begin{enumerate}" << endl;
+ }
+ else
+ {
+ m_t << "\\begin{itemize}" << endl;
+ }
+}
+
+void LatexDocVisitor::visitPost(DocAutoList *l)
+{
+ if (l->isEnumList())
+ {
+ m_t << "\\end{enumerate}" << endl;
+ }
+ else
+ {
+ m_t << "\\end{itemize}" << endl;
+ }
+}
+
+void LatexDocVisitor::visitPre(DocAutoListItem *)
+{
+ m_t << "\\item ";
+}
+
+void LatexDocVisitor::visitPost(DocAutoListItem *)
+{
+}
+
+void LatexDocVisitor::visitPre(DocPara *)
+{
+}
+
+void LatexDocVisitor::visitPost(DocPara *p)
+{
+ if (!p->isLast() && // omit <p> for last paragraph
+ !(p->parent() && // and for parameter sections
+ p->parent()->kind()==DocNode::Kind_ParamSect
+ )
+ ) m_t << endl << endl;
+}
+
+void LatexDocVisitor::visitPre(DocRoot *)
+{
+}
+
+void LatexDocVisitor::visitPost(DocRoot *)
+{
+}
+
+void LatexDocVisitor::visitPre(DocSimpleSect *s)
+{
+ m_t << "\\begin{Desc}\n\\item[";
+ switch(s->type())
+ {
+ case DocSimpleSect::See:
+ m_t << theTranslator->trSeeAlso(); break;
+ case DocSimpleSect::Return:
+ m_t << theTranslator->trReturns(); break;
+ case DocSimpleSect::Author:
+ m_t << theTranslator->trAuthor(TRUE,TRUE); break;
+ case DocSimpleSect::Authors:
+ m_t << theTranslator->trAuthor(TRUE,FALSE); break;
+ case DocSimpleSect::Version:
+ m_t << theTranslator->trVersion(); break;
+ case DocSimpleSect::Since:
+ m_t << theTranslator->trSince(); break;
+ case DocSimpleSect::Date:
+ m_t << theTranslator->trDate(); break;
+ case DocSimpleSect::Note:
+ m_t << theTranslator->trNote(); break;
+ case DocSimpleSect::Warning:
+ m_t << theTranslator->trWarning(); break;
+ case DocSimpleSect::Pre:
+ m_t << theTranslator->trPrecondition(); break;
+ case DocSimpleSect::Post:
+ m_t << theTranslator->trPostcondition(); break;
+ case DocSimpleSect::Invar:
+ m_t << theTranslator->trInvariant(); break;
+ case DocSimpleSect::Remark:
+ m_t << theTranslator->trRemarks(); break;
+ case DocSimpleSect::Attention:
+ m_t << theTranslator->trAttention(); break;
+ case DocSimpleSect::User: break;
+ case DocSimpleSect::Unknown: break;
+ }
+
+ // special case 1: user defined title
+ if (s->type()!=DocSimpleSect::User)
+ {
+ m_t << ":]";
+ }
+}
+
+void LatexDocVisitor::visitPost(DocSimpleSect *)
+{
+ m_t << "\\end{Desc}" << endl;
+}
+
+void LatexDocVisitor::visitPre(DocTitle *)
+{
+}
+
+void LatexDocVisitor::visitPost(DocTitle *)
+{
+ m_t << "]";
+}
+
+void LatexDocVisitor::visitPre(DocSimpleList *)
+{
+ m_t << "\\begin{itemize}" << endl;
+}
+
+void LatexDocVisitor::visitPost(DocSimpleList *)
+{
+ m_t << "\\end{itemize}" << endl;
+}
+
+void LatexDocVisitor::visitPre(DocSimpleListItem *)
+{
+ m_t << "\\item ";
+}
+
+void LatexDocVisitor::visitPost(DocSimpleListItem *)
+{
+}
+
+void LatexDocVisitor::visitPre(DocSection *s)
+{
+ if (Config_getBool("PDF_HYPERLINKS"))
+ {
+ m_t << "\\hypertarget{" << s->file() << "_" << s->anchor() << "}{}";
+ }
+ if (s->level()==1)
+ {
+ if (Config_getBool("COMPACT_LATEX"))
+ {
+ m_t << "\\subsubsection{";
+ }
+ else
+ {
+ m_t << "\\subsection{";
+ }
+ }
+ else if (s->level()==2)
+ {
+ if (Config_getBool("COMPACT_LATEX"))
+ {
+ m_t << "\\paragraph{";
+ }
+ else
+ {
+ m_t << "\\subsubsection{";
+ }
+ }
+ filter(s->title());
+ m_t << "}\\label{" << s->anchor() << "}" << endl;
+}
+
+void LatexDocVisitor::visitPost(DocSection *)
+{
+}
+
+void LatexDocVisitor::visitPre(DocHtmlList *s)
+{
+ if (s->type()==DocHtmlList::Ordered)
+ m_t << "\\begin{enumerate}" << endl;
+ else
+ m_t << "\\begin{itemize}" << endl;
+}
+
+void LatexDocVisitor::visitPost(DocHtmlList *s)
+{
+ if (s->type()==DocHtmlList::Ordered)
+ m_t << "\\end{enumerate}" << endl;
+ else
+ m_t << "\\end{itemize}" << endl;
+}
+
+void LatexDocVisitor::visitPre(DocHtmlListItem *)
+{
+ m_t << "\\item ";
+}
+
+void LatexDocVisitor::visitPost(DocHtmlListItem *)
+{
+}
+
+void LatexDocVisitor::visitPre(DocHtmlPre *)
+{
+ m_t << "\\small\\begin{alltt}";
+ m_insidePre=TRUE;
+}
+
+void LatexDocVisitor::visitPost(DocHtmlPre *)
+{
+ m_insidePre=FALSE;
+ m_t << "\\end{alltt}\\normalsize " << endl;
+}
+
+void LatexDocVisitor::visitPre(DocHtmlDescList *)
+{
+ m_t << "\\begin{description}" << endl;
+}
+
+void LatexDocVisitor::visitPost(DocHtmlDescList *)
+{
+ m_t << "\\end{description}" << endl;
+}
+
+void LatexDocVisitor::visitPre(DocHtmlDescTitle *)
+{
+ m_t << "\\item[";
+}
+
+void LatexDocVisitor::visitPost(DocHtmlDescTitle *)
+{
+ m_t << "]";
+}
+
+void LatexDocVisitor::visitPre(DocHtmlDescData *)
+{
+}
+
+void LatexDocVisitor::visitPost(DocHtmlDescData *)
+{
+}
+
+void LatexDocVisitor::visitPre(DocHtmlTable *t)
+{
+ if (t->hasCaption())
+ {
+ m_t << "\\begin{table}[h]";
+ }
+ m_t << "\\begin{TabularC}{" << t->numCols() << "}\n\\hline\n";
+}
+
+void LatexDocVisitor::visitPost(DocHtmlTable *t)
+{
+ if (t->hasCaption())
+ {
+ m_t << "\\end{table}\n";
+ }
+ else
+ {
+ m_t << "\\\\\\hline\n\\end{TabularC}\n";
+ }
+}
+
+void LatexDocVisitor::visitPre(DocHtmlCaption *)
+{
+ m_t << "\\\\\\hline\n\\end{TabularC}\n\\centering\n\\caption{";
+}
+
+void LatexDocVisitor::visitPost(DocHtmlCaption *)
+{
+ m_t << "}\n";
+}
+
+void LatexDocVisitor::visitPre(DocHtmlRow *)
+{
+}
+
+void LatexDocVisitor::visitPost(DocHtmlRow *)
+{
+ m_t << "\\\\\\hline\n";
+}
+
+void LatexDocVisitor::visitPre(DocHtmlCell *)
+{
+}
+
+void LatexDocVisitor::visitPost(DocHtmlCell *c)
+{
+ if (!c->isLast()) m_t << "&";
+}
+
+void LatexDocVisitor::visitPre(DocIndexEntry *)
+{
+ m_hide = TRUE;
+}
+
+void LatexDocVisitor::visitPost(DocIndexEntry *)
+{
+ m_hide = FALSE;
+}
+
+void LatexDocVisitor::visitPre(DocInternal *)
+{
+ m_t << "\\begin{Desc}" << endl
+ << "\\item[" << theTranslator->trForInternalUseOnly() << "]" << endl;
+}
+
+void LatexDocVisitor::visitPost(DocInternal *)
+{
+ m_t << "\\end{Desc}" << endl;
+}
+
+void LatexDocVisitor::visitPre(DocHRef *href)
+{
+ if (Config_getBool("PDF_HYPERLINKS"))
+ {
+ m_t << "\\href{";
+ m_t << href->url();
+ m_t << "}";
+ }
+ m_t << "{\\tt ";
+}
+
+void LatexDocVisitor::visitPost(DocHRef *)
+{
+ m_t << "}";
+}
+
+void LatexDocVisitor::visitPre(DocHtmlHeader *header)
+{
+ if (Config_getBool("COMPACT_LATEX"))
+ {
+ switch(header->level())
+ {
+ case 1: m_t << "\\subsection{"; break;
+ case 2: m_t << "\\subsubsection{"; break;
+ case 3: m_t << "\\paragraph{"; break;
+ }
+ }
+ else
+ {
+ switch(header->level())
+ {
+ case 1: m_t << "\\section{"; break;
+ case 2: m_t << "\\subsection{"; break;
+ case 3: m_t << "\\subsubsection{"; break;
+ }
+ }
+}
+
+void LatexDocVisitor::visitPost(DocHtmlHeader *)
+{
+ m_t << "}";
+}
+
+void LatexDocVisitor::visitPre(DocImage *img)
+{
+ if (img->type()==DocImage::Latex)
+ {
+ if (img->hasCaption())
+ {
+ m_t << "\\begin{figure}[H]" << endl;
+ m_t << "\\begin{center}" << endl;
+ }
+ else
+ {
+ m_t << "\\mbox{";
+ }
+ QCString gfxName = img->name();
+ if (gfxName.right(4)==".eps" || gfxName.right(4)==".pdf")
+ {
+ gfxName=gfxName.left(gfxName.length()-4);
+ }
+ m_t << "\\includegraphics";
+ if (!img->width().isEmpty())
+ {
+ m_t << "[width=" << img->width() << "]";
+ }
+ else if (!img->height().isEmpty())
+ {
+ m_t << "[height=" << img->height() << "]";
+ }
+ m_t << "{" << gfxName << "}";
+ if (img->hasCaption())
+ {
+ m_t << "\\caption{";
+ }
+ }
+ else // other format -> skip
+ {
+ m_hide=TRUE;
+ }
+}
+
+void LatexDocVisitor::visitPost(DocImage *img)
+{
+ if (img->type()==DocImage::Latex)
+ {
+ m_t << "}" << endl; // end mbox or caption
+ if (img->hasCaption())
+ {
+ m_t << "\\end{center}" << endl;
+ m_t << "\\end{figure}" << endl;
+ }
+ }
+ else // other format
+ {
+ m_hide=FALSE;
+ }
+}
+
+void LatexDocVisitor::visitPre(DocDotFile *df)
+{
+ QCString baseName=df->file();
+ int i;
+ if ((i=baseName.findRev('/'))!=-1)
+ {
+ baseName=baseName.right(baseName.length()-i-1);
+ }
+ if (baseName.right(4)==".eps" || baseName.right(4)==".pdf")
+ {
+ baseName=baseName.left(baseName.length()-4);
+ }
+ QCString outDir = Config_getString("LATEX_OUTPUT");
+ writeDotGraphFromFile(df->file(),outDir,baseName,EPS);
+ if (df->hasCaption())
+ {
+ m_t << "\\begin{figure}[H]" << endl;
+ m_t << "\\begin{center}" << endl;
+ }
+ else
+ {
+ m_t << "\\mbox{";
+ }
+ m_t << "\\includegraphics";
+ if (!df->width().isEmpty())
+ {
+ m_t << "[width=" << df->width() << "]";
+ }
+ else if (!df->height().isEmpty())
+ {
+ m_t << "[height=" << df->height() << "]";
+ }
+ m_t << "{" << baseName << "}";
+
+ if (df->hasCaption())
+ {
+ m_t << "\\caption{";
+ }
+}
+
+void LatexDocVisitor::visitPost(DocDotFile *df)
+{
+ m_t << "}" << endl; // end mbox or caption
+ if (df->hasCaption())
+ {
+ m_t << "\\end{center}" << endl;
+ m_t << "\\end{figure}" << endl;
+ }
+}
+
+void LatexDocVisitor::visitPre(DocLink *lnk)
+{
+ startLink(lnk->ref(),lnk->file(),lnk->anchor());
+}
+
+void LatexDocVisitor::visitPost(DocLink *)
+{
+ endLink();
+}
+
+void LatexDocVisitor::visitPre(DocRef *ref)
+{
+ startLink(ref->ref(),ref->file(),ref->anchor());
+ if (!ref->hasLinkText()) filter(ref->targetTitle());
+}
+
+void LatexDocVisitor::visitPost(DocRef *)
+{
+ endLink();
+ m_t << " ";
+}
+
+void LatexDocVisitor::visitPre(DocSecRefItem *)
+{
+ m_t << "\\item \\contentsline{section}{";
+}
+
+void LatexDocVisitor::visitPost(DocSecRefItem *ref)
+{
+ m_t << "}{\\ref{" << ref->anchor() << "}}{}" << endl;
+}
+
+void LatexDocVisitor::visitPre(DocSecRefList *)
+{
+ m_t << "\\footnotesize" << endl;
+ m_t << "\\begin{multicols}{2}" << endl;
+ m_t << "\\begin{CompactList}" << endl;
+}
+
+void LatexDocVisitor::visitPost(DocSecRefList *)
+{
+ m_t << "\\end{CompactList}" << endl;
+ m_t << "\\end{multicols}" << endl;
+ m_t << "\\normalsize" << endl;
+}
+
+void LatexDocVisitor::visitPre(DocLanguage *)
+{
+}
+
+void LatexDocVisitor::visitPost(DocLanguage *)
+{
+}
+
+void LatexDocVisitor::visitPre(DocParamSect *s)
+{
+ m_t << "\\begin{Desc}" << endl;
+ m_t << "\\item[";
+ switch(s->type())
+ {
+ case DocParamSect::Param:
+ m_t << theTranslator->trParameters(); break;
+ case DocParamSect::RetVal:
+ m_t << theTranslator->trReturnValues(); break;
+ case DocParamSect::Exception:
+ m_t << theTranslator->trExceptions(); break;
+ default:
+ ASSERT(0);
+ }
+ m_t << ":]" << endl;
+ m_t << "\\begin{description}" << endl;
+}
+
+void LatexDocVisitor::visitPost(DocParamSect *)
+{
+ m_t << "\\end{description}" << endl;
+ m_t << "\\end{Desc}" << endl;
+}
+
+void LatexDocVisitor::visitPre(DocParamList *pl)
+{
+ m_t << "\\item[{\\em ";
+ QStrListIterator li(pl->parameters());
+ const char *s;
+ bool first=TRUE;
+ for (li.toFirst();(s=li.current());++li)
+ {
+ if (!first) m_t << ","; else first=FALSE;
+ m_t << s;
+ }
+ m_t << "}]";
+}
+
+void LatexDocVisitor::visitPost(DocParamList *)
+{
+}
+
+void LatexDocVisitor::visitPre(DocXRefItem *x)
+{
+ m_t << "\\begin{Desc}" << endl;
+ m_t << "\\item[";
+ if (Config_getBool("PDF_HYPERLINKS"))
+ {
+ m_t << "\\hyperlink{" << x->file() << "_" << x->anchor() << "}{";
+ }
+ else
+ {
+ m_t << "{\\bf ";
+ }
+ filter(x->title());
+ m_t << "}]";
+}
+
+void LatexDocVisitor::visitPost(DocXRefItem *)
+{
+ m_t << "\\end{Desc}" << endl;
+}
+
+void LatexDocVisitor::visitPre(DocInternalRef *ref)
+{
+ startLink(0,ref->file(),ref->anchor());
+}
+
+void LatexDocVisitor::visitPost(DocInternalRef *)
+{
+ endLink();
+ m_t << " ";
+}
+
+void LatexDocVisitor::visitPre(DocCopy *)
+{
+}
+
+void LatexDocVisitor::visitPost(DocCopy *)
+{
+}
+
void LatexDocVisitor::filter(const char *str)
{
filterLatexString(m_t,str,FALSE,m_insidePre);
diff --git a/src/latexdocvisitor.h b/src/latexdocvisitor.h
index 0de6510..f3a724f 100644
--- a/src/latexdocvisitor.h
+++ b/src/latexdocvisitor.h
@@ -20,749 +20,109 @@
#define _LATEXDOCVISITOR_H
#include "docvisitor.h"
-#include "docparser.h"
-#include "language.h"
-#include "doxygen.h"
-#include "outputgen.h"
-#include "code.h"
-#include "dot.h"
+
+class QTextStream;
+class BaseCodeDocInterface;
+class QCString;
/*! @brief Concrete visitor implementation for LaTeX output. */
class LatexDocVisitor : public DocVisitor
{
public:
- LatexDocVisitor(QTextStream &t,BaseCodeDocInterface &ci)
- : m_t(t), m_ci(ci), m_insidePre(FALSE), m_hide(FALSE) {}
+ LatexDocVisitor(QTextStream &t,BaseCodeDocInterface &ci);
//--------------------------------------
// visitor functions for leaf nodes
//--------------------------------------
- void visit(DocWord *w)
- {
- if (m_hide) return;
- filter(w->word());
- }
- void visit(DocLinkedWord *w)
- {
- if (m_hide) return;
- startLink(w->ref(),w->file(),w->anchor());
- filter(w->word());
- endLink();
- }
- void visit(DocWhiteSpace *w)
- {
- if (m_hide) return;
- if (m_insidePre)
- {
- m_t << w->chars();
- }
- else
- {
- m_t << " ";
- }
- }
- void visit(DocSymbol *s)
- {
- if (m_hide) return;
- switch(s->symbol())
- {
- case DocSymbol::BSlash: m_t << "$\\backslash$"; break;
- case DocSymbol::At: m_t << "@"; break;
- case DocSymbol::Less: m_t << "$<$"; break;
- case DocSymbol::Greater: m_t << "$>$"; break;
- case DocSymbol::Amp: m_t << "\\&"; break;
- case DocSymbol::Dollar: m_t << "\\$"; break;
- case DocSymbol::Hash: m_t << "\\#"; break;
- case DocSymbol::Percent: m_t << "\\%"; break;
- case DocSymbol::Copy: m_t << "\\copyright"; break;
- case DocSymbol::Apos: m_t << "'"; break;
- case DocSymbol::Quot: m_t << "''"; break;
- case DocSymbol::Uml:
- if (s->letter()=='i')
- m_t << "\\\"{\\i}";
- else
- m_t << "\\\"{" << s->letter() << "}";
- break;
- case DocSymbol::Acute:
- if (s->letter()=='i')
- m_t << "\\'{\\i}";
- else
- m_t << "\\'{" << s->letter() << "}";
- break;
- case DocSymbol::Grave:
- if (s->letter()=='i')
- m_t << "\\`{\\i}";
- else
- m_t << "\\`{" << s->letter() << "}";
- break;
- case DocSymbol::Circ:
- if (s->letter()=='i')
- m_t << "\\^{\\i}";
- else
- m_t << "\\^{" << s->letter() << "}";
- break;
- case DocSymbol::Tilde: m_t << "\\~{" << s->letter() << "}";
- case DocSymbol::Szlig: m_t << "\"s"; break;
- case DocSymbol::Cedil: m_t << "\\c{" << s->letter() << "}"; break;
- case DocSymbol::Ring: m_t << "\\" << s->letter() << s->letter(); break;
- case DocSymbol::Nbsp: m_t << "\\ "; break;
- default:
- printf("Error: unknown symbol found\n");
- }
- }
- void visit(DocURL *u)
- {
- if (m_hide) return;
- if (Config_getBool("PDF_HYPERLINKS"))
- {
- m_t << "\\href{" << u->url() << "}";
- }
- m_t << "{\\tt " << u->url() << "}";
- }
- void visit(DocLineBreak *)
- {
- if (m_hide) return;
- m_t << "\\par\n";
- }
- void visit(DocHorRuler *)
- {
- if (m_hide) return;
- m_t << "\n\n";
- }
- void visit(DocStyleChange *s)
- {
- if (m_hide) return;
- switch (s->style())
- {
- case DocStyleChange::Bold:
- if (s->enable()) m_t << "{\\bf "; else m_t << "} ";
- break;
- case DocStyleChange::Italic:
- if (s->enable()) m_t << "{\\em "; else m_t << "} ";
- break;
- case DocStyleChange::Code:
- if (s->enable()) m_t << "{\\tt "; else m_t << "} ";
- break;
- case DocStyleChange::Subscript:
- if (s->enable()) m_t << "$_{\\mbox{"; else m_t << "}}$ ";
- break;
- case DocStyleChange::Superscript:
- if (s->enable()) m_t << "$^{\\mbox{"; else m_t << "}}$ ";
- break;
- case DocStyleChange::Center:
- if (s->enable()) m_t << "\\begin{center}"; else m_t << "\\end{center} ";
- break;
- case DocStyleChange::Small:
- if (s->enable()) m_t << "\\footnotesize "; else m_t << "\\normalsize ";
- break;
- }
- }
- void visit(DocVerbatim *s)
- {
- if (m_hide) return;
- switch(s->type())
- {
- case DocVerbatim::Code: // fall though
- m_t << "\n\n\\footnotesize\\begin{verbatim}";
- parseCode(m_ci,s->context(),s->text(),FALSE,0);
- m_t << "\\end{verbatim}\\normalsize" << endl;
- break;
- case DocVerbatim::Verbatim:
- m_t << "\n\n\\footnotesize\\begin{verbatim}";
- m_t << s->text();
- m_t << "\\end{verbatim}\\normalsize" << endl;
- break;
- case DocVerbatim::HtmlOnly:
- /* nothing */
- break;
- case DocVerbatim::LatexOnly:
- m_t << s->text();
- break;
- }
- }
- void visit(DocAnchor *anc)
- {
- if (m_hide) return;
- m_t << "\\label{" << anc->anchor() << "}" << endl;
- if (!anc->file().isEmpty() && Config_getBool("PDF_HYPERLINKS"))
- {
- m_t << "\\hypertarget{" << anc->file() << "_" << anc->anchor()
- << "}{}" << endl;
- }
- }
- void visit(DocInclude *inc)
- {
- if (m_hide) return;
- switch(inc->type())
- {
- case DocInclude::Include:
- m_t << "\n\n\\footnotesize\\begin{verbatim}";
- parseCode(m_ci,inc->context(),inc->text(),FALSE,0);
- m_t << "\\end{verbatim}\\normalsize" << endl;
- break;
- case DocInclude::DontInclude:
- break;
- case DocInclude::HtmlInclude:
- break;
- case DocInclude::VerbInclude:
- m_t << "\n\n\\footnotesize\\begin{verbatim}";
- m_t << inc->text();
- m_t << "\\end{verbatim}\\normalsize" << endl;
- break;
- }
- }
- void visit(DocIncOperator *op)
- {
- //printf("DocIncOperator: type=%d first=%d, last=%d text=`%s'\n",
- // op->type(),op->isFirst(),op->isLast(),op->text().data());
- if (op->isFirst())
- {
- m_t << "\n\n\\footnotesize\\begin{verbatim}";
- m_hide = TRUE;
- }
- if (op->type()!=DocIncOperator::Skip)
- {
- parseCode(m_ci,op->context(),op->text(),FALSE,0);
- }
- if (op->isLast())
- {
- m_hide = FALSE;
- m_t << "\\end{verbatim}\\normalsize" << endl;
- }
- else
- {
- m_t << endl;
- }
- }
- void visit(DocFormula *f)
- {
- if (m_hide) return;
- m_t << f->text();
- }
+ void visit(DocWord *);
+ void visit(DocLinkedWord *);
+ void visit(DocWhiteSpace *);
+ void visit(DocSymbol *);
+ void visit(DocURL *);
+ void visit(DocLineBreak *);
+ void visit(DocHorRuler *);
+ void visit(DocStyleChange *);
+ void visit(DocVerbatim *);
+ void visit(DocAnchor *);
+ void visit(DocInclude *);
+ void visit(DocIncOperator *);
+ void visit(DocFormula *);
//--------------------------------------
// visitor functions for compound nodes
//--------------------------------------
- void visitPre(DocAutoList *l)
- {
- if (l->isEnumList())
- {
- m_t << "\\begin{enumerate}" << endl;
- }
- else
- {
- m_t << "\\begin{itemize}" << endl;
- }
- }
- void visitPost(DocAutoList *l)
- {
- if (l->isEnumList())
- {
- m_t << "\\end{enumerate}" << endl;
- }
- else
- {
- m_t << "\\end{itemize}" << endl;
- }
- }
- void visitPre(DocAutoListItem *)
- {
- m_t << "\\item ";
- }
- void visitPost(DocAutoListItem *)
- {
- }
- void visitPre(DocPara *)
- {
- }
- void visitPost(DocPara *p)
- {
- if (!p->isLast() && // omit <p> for last paragraph
- !(p->parent() && // and for parameter sections
- p->parent()->kind()==DocNode::Kind_ParamSect
- )
- ) m_t << endl << endl;
- }
- void visitPre(DocRoot *)
- {
- }
- void visitPost(DocRoot *)
- {
- }
- void visitPre(DocSimpleSect *s)
- {
- m_t << "\\begin{Desc}\n\\item[";
- switch(s->type())
- {
- case DocSimpleSect::See:
- m_t << theTranslator->trSeeAlso(); break;
- case DocSimpleSect::Return:
- m_t << theTranslator->trReturns(); break;
- case DocSimpleSect::Author:
- m_t << theTranslator->trAuthor(TRUE,TRUE); break;
- case DocSimpleSect::Authors:
- m_t << theTranslator->trAuthor(TRUE,FALSE); break;
- case DocSimpleSect::Version:
- m_t << theTranslator->trVersion(); break;
- case DocSimpleSect::Since:
- m_t << theTranslator->trSince(); break;
- case DocSimpleSect::Date:
- m_t << theTranslator->trDate(); break;
- case DocSimpleSect::Note:
- m_t << theTranslator->trNote(); break;
- case DocSimpleSect::Warning:
- m_t << theTranslator->trWarning(); break;
- case DocSimpleSect::Pre:
- m_t << theTranslator->trPrecondition(); break;
- case DocSimpleSect::Post:
- m_t << theTranslator->trPostcondition(); break;
- case DocSimpleSect::Invar:
- m_t << theTranslator->trInvariant(); break;
- case DocSimpleSect::Remark:
- m_t << theTranslator->trRemarks(); break;
- case DocSimpleSect::Attention:
- m_t << theTranslator->trAttention(); break;
- case DocSimpleSect::User: break;
- case DocSimpleSect::Unknown: break;
- }
-
- // special case 1: user defined title
- if (s->type()!=DocSimpleSect::User)
- {
- m_t << ":]";
- }
- }
- void visitPost(DocSimpleSect *)
- {
- m_t << "\\end{Desc}" << endl;
- }
- void visitPre(DocTitle *)
- {
- }
- void visitPost(DocTitle *)
- {
- m_t << "]";
- }
- void visitPre(DocSimpleList *)
- {
- m_t << "\\begin{itemize}" << endl;
- }
- void visitPost(DocSimpleList *)
- {
- m_t << "\\end{itemize}" << endl;
- }
- void visitPre(DocSimpleListItem *)
- {
- m_t << "\\item ";
- }
- void visitPost(DocSimpleListItem *)
- {
- }
- void visitPre(DocSection *s)
- {
- if (Config_getBool("PDF_HYPERLINKS"))
- {
- m_t << "\\hypertarget{" << s->file() << "_" << s->anchor() << "}{}";
- }
- if (s->level()==1)
- {
- if (Config_getBool("COMPACT_LATEX"))
- {
- m_t << "\\subsubsection{";
- }
- else
- {
- m_t << "\\subsection{";
- }
- }
- else if (s->level()==2)
- {
- if (Config_getBool("COMPACT_LATEX"))
- {
- m_t << "\\paragraph{";
- }
- else
- {
- m_t << "\\subsubsection{";
- }
- }
- filter(s->title());
- m_t << "}\\label{" << s->anchor() << "}" << endl;
- }
- void visitPost(DocSection *)
- {
- }
- void visitPre(DocHtmlList *s)
- {
- if (s->type()==DocHtmlList::Ordered)
- m_t << "\\begin{enumerate}" << endl;
- else
- m_t << "\\begin{itemize}" << endl;
- }
- void visitPost(DocHtmlList *s)
- {
- if (s->type()==DocHtmlList::Ordered)
- m_t << "\\end{enumerate}" << endl;
- else
- m_t << "\\end{itemize}" << endl;
- }
- void visitPre(DocHtmlListItem *)
- {
- m_t << "\\item ";
- }
- void visitPost(DocHtmlListItem *)
- {
- }
- void visitPre(DocHtmlPre *)
- {
- m_t << "\\small\\begin{alltt}";
- m_insidePre=TRUE;
- }
- void visitPost(DocHtmlPre *)
- {
- m_insidePre=FALSE;
- m_t << "\\end{alltt}\\normalsize " << endl;
- }
- void visitPre(DocHtmlDescList *)
- {
- m_t << "\\begin{description}" << endl;
- }
- void visitPost(DocHtmlDescList *)
- {
- m_t << "\\end{description}" << endl;
- }
- void visitPre(DocHtmlDescTitle *)
- {
- m_t << "\\item[";
- }
- void visitPost(DocHtmlDescTitle *)
- {
- m_t << "]";
- }
- void visitPre(DocHtmlDescData *)
- {
- }
- void visitPost(DocHtmlDescData *)
- {
- }
- void visitPre(DocHtmlTable *t)
- {
- if (t->hasCaption())
- {
- m_t << "\\begin{table}[h]";
- }
- m_t << "\\begin{TabularC}{" << t->numCols() << "}\n\\hline\n";
- }
- void visitPost(DocHtmlTable *t)
- {
- if (t->hasCaption())
- {
- m_t << "\\end{table}\n";
- }
- else
- {
- m_t << "\\\\\\hline\n\\end{TabularC}\n";
- }
- }
- void visitPre(DocHtmlCaption *)
- {
- m_t << "\\\\\\hline\n\\end{TabularC}\n\\centering\n\\caption{";
- }
- void visitPost(DocHtmlCaption *)
- {
- m_t << "}\n";
- }
- void visitPre(DocHtmlRow *)
- {
- }
- void visitPost(DocHtmlRow *)
- {
- m_t << "\\\\\\hline\n";
- }
- void visitPre(DocHtmlCell *)
- {
- }
- void visitPost(DocHtmlCell *c)
- {
- if (!c->isLast()) m_t << "&";
- }
- void visitPre(DocIndexEntry *)
- {
- m_hide = TRUE;
- }
- void visitPost(DocIndexEntry *)
- {
- m_hide = FALSE;
- }
- void visitPre(DocInternal *)
- {
- m_t << "\\begin{Desc}" << endl
- << "\\item[" << theTranslator->trForInternalUseOnly() << "]" << endl;
- }
- void visitPost(DocInternal *)
- {
- m_t << "\\end{Desc}" << endl;
- }
- void visitPre(DocHRef *href)
- {
- if (Config_getBool("PDF_HYPERLINKS"))
- {
- m_t << "\\href{";
- m_t << href->url();
- m_t << "}";
- }
- m_t << "{\\tt ";
- }
- void visitPost(DocHRef *)
- {
- m_t << "}";
- }
- void visitPre(DocHtmlHeader *header)
- {
- if (Config_getBool("COMPACT_LATEX"))
- {
- switch(header->level())
- {
- case 1: m_t << "\\subsection{"; break;
- case 2: m_t << "\\subsubsection{"; break;
- case 3: m_t << "\\paragraph{"; break;
- }
- }
- else
- {
- switch(header->level())
- {
- case 1: m_t << "\\section{"; break;
- case 2: m_t << "\\subsection{"; break;
- case 3: m_t << "\\subsubsection{"; break;
- }
- }
- }
- void visitPost(DocHtmlHeader *)
- {
- m_t << "}";
- }
- void visitPre(DocImage *img)
- {
- if (img->type()==DocImage::Latex)
- {
- if (img->hasCaption())
- {
- m_t << "\\begin{figure}[H]" << endl;
- m_t << "\\begin{center}" << endl;
- }
- else
- {
- m_t << "\\mbox{";
- }
- QCString gfxName = img->name();
- if (gfxName.right(4)==".eps" || gfxName.right(4)==".pdf")
- {
- gfxName=gfxName.left(gfxName.length()-4);
- }
- m_t << "\\includegraphics";
- if (!img->width().isEmpty())
- {
- m_t << "[width=" << img->width() << "]";
- }
- else if (!img->height().isEmpty())
- {
- m_t << "[height=" << img->height() << "]";
- }
- m_t << "{" << gfxName << "}";
- if (img->hasCaption())
- {
- m_t << "\\caption{";
- }
- }
- else // other format -> skip
- {
- m_hide=TRUE;
- }
- }
- void visitPost(DocImage *img)
- {
- if (img->type()==DocImage::Latex)
- {
- m_t << "}" << endl; // end mbox or caption
- if (img->hasCaption())
- {
- m_t << "\\end{center}" << endl;
- m_t << "\\end{figure}" << endl;
- }
- }
- else // other format
- {
- m_hide=FALSE;
- }
- }
- void visitPre(DocDotFile *df)
- {
- QCString baseName=df->file();
- int i;
- if ((i=baseName.findRev('/'))!=-1)
- {
- baseName=baseName.right(baseName.length()-i-1);
- }
- if (baseName.right(4)==".eps" || baseName.right(4)==".pdf")
- {
- baseName=baseName.left(baseName.length()-4);
- }
- QCString outDir = Config_getString("LATEX_OUTPUT");
- writeDotGraphFromFile(df->file(),outDir,baseName,EPS);
- if (df->hasCaption())
- {
- m_t << "\\begin{figure}[H]" << endl;
- m_t << "\\begin{center}" << endl;
- }
- else
- {
- m_t << "\\mbox{";
- }
- m_t << "\\includegraphics";
- if (!df->width().isEmpty())
- {
- m_t << "[width=" << df->width() << "]";
- }
- else if (!df->height().isEmpty())
- {
- m_t << "[height=" << df->height() << "]";
- }
- m_t << "{" << baseName << "}";
-
- if (df->hasCaption())
- {
- m_t << "\\caption{";
- }
- }
- void visitPost(DocDotFile *df)
- {
- m_t << "}" << endl; // end mbox or caption
- if (df->hasCaption())
- {
- m_t << "\\end{center}" << endl;
- m_t << "\\end{figure}" << endl;
- }
- }
- void visitPre(DocLink *lnk)
- {
- startLink(lnk->ref(),lnk->file(),lnk->anchor());
- }
- void visitPost(DocLink *)
- {
- endLink();
- }
- void visitPre(DocRef *ref)
- {
- startLink(ref->ref(),ref->file(),ref->anchor());
- if (!ref->hasLinkText()) filter(ref->targetTitle());
- }
- void visitPost(DocRef *)
- {
- endLink();
- m_t << " ";
- }
- void visitPre(DocSecRefItem *)
- {
- m_t << "\\item \\contentsline{section}{";
- }
- void visitPost(DocSecRefItem *ref)
- {
- m_t << "}{\\ref{" << ref->anchor() << "}}{}" << endl;
- }
- void visitPre(DocSecRefList *)
- {
- m_t << "\\footnotesize" << endl;
- m_t << "\\begin{multicols}{2}" << endl;
- m_t << "\\begin{CompactList}" << endl;
- }
- void visitPost(DocSecRefList *)
- {
- m_t << "\\end{CompactList}" << endl;
- m_t << "\\end{multicols}" << endl;
- m_t << "\\normalsize" << endl;
- }
- void visitPre(DocLanguage *)
- {
- }
- void visitPost(DocLanguage *)
- {
- }
- void visitPre(DocParamSect *s)
- {
- m_t << "\\begin{Desc}" << endl;
- m_t << "\\item[";
- switch(s->type())
- {
- case DocParamSect::Param:
- m_t << theTranslator->trParameters(); break;
- case DocParamSect::RetVal:
- m_t << theTranslator->trReturnValues(); break;
- case DocParamSect::Exception:
- m_t << theTranslator->trExceptions(); break;
- default:
- ASSERT(0);
- }
- m_t << ":]" << endl;
- m_t << "\\begin{description}" << endl;
- }
- void visitPost(DocParamSect *)
- {
- m_t << "\\end{description}" << endl;
- m_t << "\\end{Desc}" << endl;
- }
- void visitPre(DocParamList *pl)
- {
- m_t << "\\item[{\\em ";
- QStrListIterator li(pl->parameters());
- const char *s;
- bool first=TRUE;
- for (li.toFirst();(s=li.current());++li)
- {
- if (!first) m_t << ","; else first=FALSE;
- m_t << s;
- }
- m_t << "}]";
- }
- void visitPost(DocParamList *)
- {
- }
- void visitPre(DocXRefItem *x)
- {
- m_t << "\\begin{Desc}" << endl;
- m_t << "\\item[";
- if (Config_getBool("PDF_HYPERLINKS"))
- {
- m_t << "\\hyperlink{" << x->file() << "_" << x->anchor() << "}{";
- }
- else
- {
- m_t << "{\\bf ";
- }
- filter(x->title());
- m_t << "}]";
- }
- void visitPost(DocXRefItem *)
- {
- m_t << "\\end{Desc}" << endl;
- }
- void visitPre(DocInternalRef *ref)
- {
- startLink(0,ref->file(),ref->anchor());
- }
- void visitPost(DocInternalRef *)
- {
- endLink();
- m_t << " ";
- }
- void visitPre(DocCopy *)
- {
- }
- void visitPost(DocCopy *)
- {
- }
+ void visitPre(DocAutoList *);
+ void visitPost(DocAutoList *);
+ void visitPre(DocAutoListItem *);
+ void visitPost(DocAutoListItem *);
+ void visitPre(DocPara *);
+ void visitPost(DocPara *);
+ void visitPre(DocRoot *);
+ void visitPost(DocRoot *);
+ void visitPre(DocSimpleSect *);
+ void visitPost(DocSimpleSect *);
+ void visitPre(DocTitle *);
+ void visitPost(DocTitle *);
+ void visitPre(DocSimpleList *);
+ void visitPost(DocSimpleList *);
+ void visitPre(DocSimpleListItem *);
+ void visitPost(DocSimpleListItem *);
+ void visitPre(DocSection *s);
+ void visitPost(DocSection *);
+ void visitPre(DocHtmlList *s);
+ void visitPost(DocHtmlList *s);
+ void visitPre(DocHtmlListItem *);
+ void visitPost(DocHtmlListItem *);
+ void visitPre(DocHtmlPre *);
+ void visitPost(DocHtmlPre *);
+ void visitPre(DocHtmlDescList *);
+ void visitPost(DocHtmlDescList *);
+ void visitPre(DocHtmlDescTitle *);
+ void visitPost(DocHtmlDescTitle *);
+ void visitPre(DocHtmlDescData *);
+ void visitPost(DocHtmlDescData *);
+ void visitPre(DocHtmlTable *t);
+ void visitPost(DocHtmlTable *t);
+ void visitPre(DocHtmlCaption *);
+ void visitPost(DocHtmlCaption *);
+ void visitPre(DocHtmlRow *);
+ void visitPost(DocHtmlRow *) ;
+ void visitPre(DocHtmlCell *);
+ void visitPost(DocHtmlCell *);
+ void visitPre(DocIndexEntry *);
+ void visitPost(DocIndexEntry *);
+ void visitPre(DocInternal *);
+ void visitPost(DocInternal *);
+ void visitPre(DocHRef *);
+ void visitPost(DocHRef *);
+ void visitPre(DocHtmlHeader *);
+ void visitPost(DocHtmlHeader *) ;
+ void visitPre(DocImage *);
+ void visitPost(DocImage *);
+ void visitPre(DocDotFile *);
+ void visitPost(DocDotFile *);
+ void visitPre(DocLink *lnk);
+ void visitPost(DocLink *);
+ void visitPre(DocRef *ref);
+ void visitPost(DocRef *);
+ void visitPre(DocSecRefItem *);
+ void visitPost(DocSecRefItem *);
+ void visitPre(DocSecRefList *);
+ void visitPost(DocSecRefList *);
+ void visitPre(DocLanguage *);
+ void visitPost(DocLanguage *);
+ void visitPre(DocParamSect *);
+ void visitPost(DocParamSect *);
+ void visitPre(DocParamList *);
+ void visitPost(DocParamList *);
+ void visitPre(DocXRefItem *);
+ void visitPost(DocXRefItem *);
+ void visitPre(DocInternalRef *);
+ void visitPost(DocInternalRef *);
+ void visitPre(DocCopy *);
+ void visitPost(DocCopy *);
private:
diff --git a/src/latexgen.cpp b/src/latexgen.cpp
index d9f7b24..af236dc 100644
--- a/src/latexgen.cpp
+++ b/src/latexgen.cpp
@@ -29,6 +29,7 @@
#include "version.h"
#include "dot.h"
#include "page.h"
+#include "docparser.h"
#include "latexdocvisitor.h"
//static QCString filterTitle(const char *s)
diff --git a/src/libdoxygen.pro.in b/src/libdoxygen.pro.in
index 700c9da..fbd3771 100644
--- a/src/libdoxygen.pro.in
+++ b/src/libdoxygen.pro.in
@@ -71,7 +71,9 @@ HEADERS = bufstr.h \
printdocvisitor.h \
qtbc.h \
reflist.h \
+ rtfdocvisitor.h \
rtfgen.h \
+ rtfstyle.h \
scanner.h \
searchindex.h \
section.h \
@@ -162,7 +164,9 @@ SOURCES = ce_lex.cpp \
pngenc.cpp \
pre.cpp \
reflist.cpp \
+ rtfdocvisitor.cpp \
rtfgen.cpp \
+ rtfstyle.cpp \
scanner.cpp \
searchindex.cpp \
suffixtree.cpp \
diff --git a/src/memberdef.cpp b/src/memberdef.cpp
index 3127259..6932f7d 100644
--- a/src/memberdef.cpp
+++ b/src/memberdef.cpp
@@ -552,7 +552,14 @@ ClassDef *MemberDef::getClassDefOfAnonymousType()
*/
bool MemberDef::isBriefSectionVisible() const
{
- bool hasDocs = hasDocumentation();
+ //printf("Member %s grpId=%d docs=%s file=%s args=%s\n",
+ // name().data(),
+ // grpId,grpId==-1?"<none>":Doxygen::memberDocDict[grpId]->data(),
+ // getFileDef()->name().data(),
+ // argsString());
+ bool hasDocs = hasDocumentation() ||
+ // part of a documented member group
+ (grpId!=-1 && !Doxygen::memberDocDict[grpId]->isEmpty());
// only include static members with file/namespace scope if
// explicitly enabled in the config file
@@ -609,6 +616,12 @@ bool MemberDef::isBriefSectionVisible() const
!hasDocs
);
+ //printf("visibleIfStatic=%d visibleIfDocumented=%d visibleIfEnabled=%d"
+ // "visibleIfPrivate=%d visibleIfDocVirtual=%d visibltIfNotDefaultCDTor=%d "
+ // "visibleIfFriendCompound=%d\n",visibleIfStatic,visibleIfDocumented,
+ // visibleIfEnabled,visibleIfPrivate,visibleIfDocVirtual,visibleIfNotDefaultCDTor,
+ // visibleIfFriendCompound);
+
bool visible = visibleIfStatic && visibleIfDocumented &&
visibleIfEnabled && visibleIfPrivate &&
visibleIfDocVirtual && visibleIfNotDefaultCDTor &&
diff --git a/src/memberdef.h b/src/memberdef.h
index 8dd36f3..8755f4e 100644
--- a/src/memberdef.h
+++ b/src/memberdef.h
@@ -245,6 +245,12 @@ class MemberDef : public Definition
}
void setBodyMember(MemberDef *md) { bodyMemb = md; }
void setDocsForDefinition(bool b) { docsForDefinition = b; }
+
+ // declaration <-> definition relation
+ void setMemberDefinition(MemberDef *md) { memDef=md; }
+ void setMemberDeclaration(MemberDef *md) { memDec=md; }
+ MemberDef *memberDefinition() const { return memDef; }
+ MemberDef *memberDeclaration() const { return memDec; }
bool visited;
@@ -270,8 +276,6 @@ class MemberDef : public Definition
QCString init; // initializer
int initLines; // number of lines in the initializer
QCString decl; // member declaration in class
- //QCString declFile; // file where the declaration was found
- //int declLine; // line where the declaration was found
QCString def; // member definition in code (fully qualified name)
QCString anc; // HTML anchor name
MemberDef *bodyMemb; // Member containing the definition
@@ -281,7 +285,6 @@ class MemberDef : public Definition
bool stat; // is it a static function?
int memSpec; // The specifiers present for this member
MemberType mtype; // returns the kind of member
- //bool eUsed; // is the enumerate already placed in a list
bool proto; // is it a prototype;
bool docEnumValues; // is an enum with documented enum values.
bool annScope; // member is part of an annoymous scope
diff --git a/src/page.h b/src/page.h
index 303d43c..d2101c5 100644
--- a/src/page.h
+++ b/src/page.h
@@ -25,7 +25,8 @@ class PageInfo
public:
PageInfo(const char *f, int l,const char *n,const char *d,const char *t) :
defFileName(f), defLine(l), name(n),
- doc(d), title(t), sectionDict(0),specialListItems(0),m_inGroup(0) {}
+ doc(d), title(t), context(0), sectionDict(0),specialListItems(0),m_inGroup(0)
+ {}
// where the page definition was found
QCString defFileName;
@@ -40,6 +41,9 @@ class PageInfo
QCString reference;
QCString fileName;
+ // class, file or namespace in which the page was found
+ Definition *context;
+
// functions to get a uniform interface with Definitions
QCString getOutputFileBase() const { return fileName; }
bool isReference() const { return !reference.isEmpty(); }
diff --git a/src/rtfdocvisitor.cpp b/src/rtfdocvisitor.cpp
new file mode 100644
index 0000000..4a4abb9
--- /dev/null
+++ b/src/rtfdocvisitor.cpp
@@ -0,0 +1,1013 @@
+/******************************************************************************
+ *
+ *
+ *
+ *
+ * Copyright (C) 1997-2002 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+
+#include "rtfdocvisitor.h"
+#include "docparser.h"
+#include "language.h"
+#include "doxygen.h"
+#include "outputgen.h"
+#include "code.h"
+#include "dot.h"
+#include "util.h"
+#include "rtfstyle.h"
+
+RTFDocVisitor::RTFDocVisitor(QTextStream &t,BaseCodeDocInterface &ci)
+ : m_t(t), m_ci(ci), m_insidePre(FALSE), m_hide(FALSE), m_indentLevel(0)
+{
+}
+
+QCString RTFDocVisitor::getStyle(const char *name)
+{
+ QCString n;
+ n.sprintf("%s%d",name,m_indentLevel);
+ StyleData *sd = rtf_Style[n];
+ ASSERT(sd!=0);
+ return sd->reference;
+}
+
+ //--------------------------------------
+ // visitor functions for leaf nodes
+ //--------------------------------------
+
+void RTFDocVisitor::visit(DocWord *w)
+{
+ if (m_hide) return;
+ filter(w->word());
+}
+
+void RTFDocVisitor::visit(DocLinkedWord *w)
+{
+ if (m_hide) return;
+ startLink(w->ref(),w->file(),w->anchor());
+ filter(w->word());
+ endLink(w->ref());
+}
+
+void RTFDocVisitor::visit(DocWhiteSpace *w)
+{
+ if (m_hide) return;
+ if (m_insidePre)
+ {
+ m_t << w->chars();
+ }
+ else
+ {
+ m_t << " ";
+ }
+}
+
+void RTFDocVisitor::visit(DocSymbol *s)
+{
+ if (m_hide) return;
+ switch(s->symbol())
+ {
+ case DocSymbol::BSlash: m_t << "\\\\"; break;
+ case DocSymbol::At: m_t << "@"; break;
+ case DocSymbol::Less: m_t << "<"; break;
+ case DocSymbol::Greater: m_t << ">"; break;
+ case DocSymbol::Amp: m_t << "&"; break;
+ case DocSymbol::Dollar: m_t << "$"; break;
+ case DocSymbol::Hash: m_t << "#"; break;
+ case DocSymbol::Percent: m_t << "%"; break;
+ case DocSymbol::Copy: m_t << "\251"; break;
+ case DocSymbol::Apos: m_t << "'"; break;
+ case DocSymbol::Quot: m_t << "\""; break;
+ case DocSymbol::Uml: switch(s->letter())
+ {
+ case 'A' : m_t << '\304'; break;
+ case 'E' : m_t << '\313'; break;
+ case 'I' : m_t << '\317'; break;
+ case 'O' : m_t << '\326'; break;
+ case 'U' : m_t << '\334'; break;
+ case 'Y' : m_t << 'Y'; break;
+ case 'a' : m_t << '\344'; break;
+ case 'e' : m_t << '\353'; break;
+ case 'i' : m_t << '\357'; break;
+ case 'o' : m_t << '\366'; break;
+ case 'u' : m_t << '\374'; break;
+ case 'y' : m_t << '\377'; break;
+ default: m_t << '?'; break;
+ }
+ break;
+ case DocSymbol::Acute: switch(s->letter())
+ {
+ case 'A' : m_t << '\301'; break;
+ case 'E' : m_t << '\311'; break;
+ case 'I' : m_t << '\315'; break;
+ case 'O' : m_t << '\323'; break;
+ case 'U' : m_t << '\332'; break;
+ case 'Y' : m_t << '\335'; break;
+ case 'a' : m_t << '\341'; break;
+ case 'e' : m_t << '\351'; break;
+ case 'i' : m_t << '\355'; break;
+ case 'o' : m_t << '\363'; break;
+ case 'u' : m_t << '\372'; break;
+ case 'y' : m_t << '\375'; break;
+ default: m_t << '?'; break;
+ }
+ break;
+ case DocSymbol::Grave: switch(s->letter())
+ {
+ case 'A' : m_t << '\300'; break;
+ case 'E' : m_t << '\310'; break;
+ case 'I' : m_t << '\314'; break;
+ case 'O' : m_t << '\322'; break;
+ case 'U' : m_t << '\331'; break;
+ case 'a' : m_t << '\340'; break;
+ case 'e' : m_t << '\350'; break;
+ case 'i' : m_t << '\354'; break;
+ case 'o' : m_t << '\362'; break;
+ case 'u' : m_t << '\371'; break;
+ default: m_t << '?'; break;
+ }
+ break;
+ case DocSymbol::Circ: switch(s->letter())
+ {
+ case 'A' : m_t << '\302'; break;
+ case 'E' : m_t << '\312'; break;
+ case 'I' : m_t << '\316'; break;
+ case 'O' : m_t << '\324'; break;
+ case 'U' : m_t << '\333'; break;
+ case 'a' : m_t << '\342'; break;
+ case 'e' : m_t << '\352'; break;
+ case 'i' : m_t << '\356'; break;
+ case 'o' : m_t << '\364'; break;
+ case 'u' : m_t << '\373'; break;
+ default: m_t << '?'; break;
+ }
+ break;
+ case DocSymbol::Tilde: switch(s->letter())
+ {
+ case 'A' : m_t << '\303'; break;
+ case 'N' : m_t << '\321'; break;
+ case 'O' : m_t << '\325'; break;
+ case 'a' : m_t << '\343'; break;
+ case 'n' : m_t << '\361'; break;
+ case 'o' : m_t << '\365'; break;
+ default: m_t << '?'; break;
+ }
+ break;
+ case DocSymbol::Cedil: switch(s->letter())
+ {
+ case 'C' : m_t << '\307'; break;
+ case 'c' : m_t << '\347'; break;
+ default: m_t << '?'; break;
+ }
+ break;
+ case DocSymbol::Ring: switch(s->letter())
+ {
+ case 'A' : m_t << '\305'; break;
+ case 'a' : m_t << '\345'; break;
+ default: m_t << '?'; break;
+ }
+ break;
+ case DocSymbol::Szlig: m_t << "\337"; break;
+ case DocSymbol::Nbsp: m_t << "\\~ "; break;
+ default:
+ printf("Error: unknown symbol found\n");
+ }
+}
+
+void RTFDocVisitor::visit(DocURL *u)
+{
+ if (m_hide) return;
+ if (Config_getBool("RTF_HYPERLINKS"))
+ {
+ m_t << "{\\field {\\*\\fldinst { HYPERLINK \\\\l \"";
+ m_t << u->url();
+ m_t << "\" }{}";
+ m_t << "}{\\fldrslt {\\cs37\\ul\\cf2 ";
+ filter(u->url());
+ m_t << "}}}" << endl;
+ }
+ else
+ {
+ m_t << "{\\f2 ";
+ filter(u->url());
+ m_t << "}";
+ }
+}
+
+void RTFDocVisitor::visit(DocLineBreak *)
+{
+ if (m_hide) return;
+ m_t << "\\par\n";
+}
+
+void RTFDocVisitor::visit(DocHorRuler *)
+{
+ if (m_hide) return;
+ m_t << "{\\pard\\widctlpar\\brdrb\\brdrs\\brdrw5\\brsp20 \\adjustright \\par}" << endl;
+}
+
+void RTFDocVisitor::visit(DocStyleChange *s)
+{
+ if (m_hide) return;
+ switch (s->style())
+ {
+ case DocStyleChange::Bold:
+ if (s->enable()) m_t << "{\\b "; else m_t << "} ";
+ break;
+ case DocStyleChange::Italic:
+ if (s->enable()) m_t << "{\\i "; else m_t << "} ";
+ break;
+ case DocStyleChange::Code:
+ if (s->enable()) m_t << "{\\f2 "; else m_t << "} ";
+ break;
+ case DocStyleChange::Subscript:
+ if (s->enable()) m_t << "{\\sub "; else m_t << "} ";
+ break;
+ case DocStyleChange::Superscript:
+ if (s->enable()) m_t << "{\\super "; else m_t << "} ";
+ break;
+ case DocStyleChange::Center:
+ if (s->enable()) m_t << "{\\qc "; else m_t << "} ";
+ break;
+ case DocStyleChange::Small:
+ if (s->enable()) m_t << "{\\sub "; else m_t << "} ";
+ break;
+ }
+}
+
+void RTFDocVisitor::visit(DocVerbatim *s)
+{
+ if (m_hide) return;
+ switch(s->type())
+ {
+ case DocVerbatim::Code: // fall though
+ m_t << "{" << endl;
+ m_t << "\\par" << endl;
+ m_t << rtf_Style_Reset << getStyle("CodeExample");
+ parseCode(m_ci,s->context(),s->text(),FALSE,0);
+ m_t << "\\par" << endl;
+ m_t << "}" << endl;
+ break;
+ case DocVerbatim::Verbatim:
+ m_t << "{" << endl;
+ m_t << "\\par" << endl;
+ m_t << rtf_Style_Reset << getStyle("CodeExample");
+ m_t << s->text();
+ m_t << "\\par" << endl;
+ m_t << "}" << endl;
+ break;
+ case DocVerbatim::HtmlOnly:
+ /* nothing */
+ break;
+ case DocVerbatim::LatexOnly:
+ /* nothing */
+ break;
+ }
+}
+
+void RTFDocVisitor::visit(DocAnchor *anc)
+{
+ if (m_hide) return;
+ m_t << "\\label{" << anc->anchor() << "}" << endl;
+ if (!anc->file().isEmpty() && Config_getBool("PDF_HYPERLINKS"))
+ {
+ m_t << "\\hypertarget{" << anc->file() << "_" << anc->anchor()
+ << "}{}" << endl;
+ }
+}
+
+void RTFDocVisitor::visit(DocInclude *inc)
+{
+ if (m_hide) return;
+ switch(inc->type())
+ {
+ case DocInclude::Include:
+ m_t << "\n\n\\footnotesize\\begin{verbatim}";
+ parseCode(m_ci,inc->context(),inc->text(),FALSE,0);
+ m_t << "\\end{verbatim}\\normalsize" << endl;
+ break;
+ case DocInclude::DontInclude:
+ break;
+ case DocInclude::HtmlInclude:
+ break;
+ case DocInclude::VerbInclude:
+ m_t << "\n\n\\footnotesize\\begin{verbatim}";
+ m_t << inc->text();
+ m_t << "\\end{verbatim}\\normalsize" << endl;
+ break;
+ }
+}
+
+void RTFDocVisitor::visit(DocIncOperator *op)
+{
+ //printf("DocIncOperator: type=%d first=%d, last=%d text=`%s'\n",
+ // op->type(),op->isFirst(),op->isLast(),op->text().data());
+ if (op->isFirst())
+ {
+ m_t << "\n\n\\footnotesize\\begin{verbatim}";
+ m_hide = TRUE;
+ }
+ if (op->type()!=DocIncOperator::Skip)
+ {
+ parseCode(m_ci,op->context(),op->text(),FALSE,0);
+ }
+ if (op->isLast())
+ {
+ m_hide = FALSE;
+ m_t << "\\end{verbatim}\\normalsize" << endl;
+ }
+ else
+ {
+ m_t << endl;
+ }
+}
+
+void RTFDocVisitor::visit(DocFormula *f)
+{
+ if (m_hide) return;
+ m_t << f->text();
+}
+
+//--------------------------------------
+// visitor functions for compound nodes
+//--------------------------------------
+
+void RTFDocVisitor::visitPre(DocAutoList *l)
+{
+ if (l->isEnumList())
+ {
+ m_t << "\\begin{enumerate}" << endl;
+ }
+ else
+ {
+ m_t << "\\begin{itemize}" << endl;
+ }
+}
+
+void RTFDocVisitor::visitPost(DocAutoList *l)
+{
+ if (l->isEnumList())
+ {
+ m_t << "\\end{enumerate}" << endl;
+ }
+ else
+ {
+ m_t << "\\end{itemize}" << endl;
+ }
+}
+
+void RTFDocVisitor::visitPre(DocAutoListItem *)
+{
+ m_t << "\\item ";
+}
+
+void RTFDocVisitor::visitPost(DocAutoListItem *)
+{
+}
+
+void RTFDocVisitor::visitPre(DocPara *)
+{
+}
+
+void RTFDocVisitor::visitPost(DocPara *p)
+{
+ if (!p->isLast() && // omit <p> for last paragraph
+ !(p->parent() && // and for parameter sections
+ p->parent()->kind()==DocNode::Kind_ParamSect
+ )
+ ) m_t << endl << endl;
+}
+
+void RTFDocVisitor::visitPre(DocRoot *)
+{
+}
+
+void RTFDocVisitor::visitPost(DocRoot *)
+{
+}
+
+void RTFDocVisitor::visitPre(DocSimpleSect *s)
+{
+ m_t << "\\begin{Desc}\n\\item[";
+ switch(s->type())
+ {
+ case DocSimpleSect::See:
+ m_t << theTranslator->trSeeAlso(); break;
+ case DocSimpleSect::Return:
+ m_t << theTranslator->trReturns(); break;
+ case DocSimpleSect::Author:
+ m_t << theTranslator->trAuthor(TRUE,TRUE); break;
+ case DocSimpleSect::Authors:
+ m_t << theTranslator->trAuthor(TRUE,FALSE); break;
+ case DocSimpleSect::Version:
+ m_t << theTranslator->trVersion(); break;
+ case DocSimpleSect::Since:
+ m_t << theTranslator->trSince(); break;
+ case DocSimpleSect::Date:
+ m_t << theTranslator->trDate(); break;
+ case DocSimpleSect::Note:
+ m_t << theTranslator->trNote(); break;
+ case DocSimpleSect::Warning:
+ m_t << theTranslator->trWarning(); break;
+ case DocSimpleSect::Pre:
+ m_t << theTranslator->trPrecondition(); break;
+ case DocSimpleSect::Post:
+ m_t << theTranslator->trPostcondition(); break;
+ case DocSimpleSect::Invar:
+ m_t << theTranslator->trInvariant(); break;
+ case DocSimpleSect::Remark:
+ m_t << theTranslator->trRemarks(); break;
+ case DocSimpleSect::Attention:
+ m_t << theTranslator->trAttention(); break;
+ case DocSimpleSect::User: break;
+ case DocSimpleSect::Unknown: break;
+ }
+
+ // special case 1: user defined title
+ if (s->type()!=DocSimpleSect::User)
+ {
+ m_t << ":]";
+ }
+}
+
+void RTFDocVisitor::visitPost(DocSimpleSect *)
+{
+ m_t << "\\end{Desc}" << endl;
+}
+
+void RTFDocVisitor::visitPre(DocTitle *)
+{
+}
+
+void RTFDocVisitor::visitPost(DocTitle *)
+{
+ m_t << "]";
+}
+
+void RTFDocVisitor::visitPre(DocSimpleList *)
+{
+ m_t << "\\begin{itemize}" << endl;
+}
+
+void RTFDocVisitor::visitPost(DocSimpleList *)
+{
+ m_t << "\\end{itemize}" << endl;
+}
+
+void RTFDocVisitor::visitPre(DocSimpleListItem *)
+{
+ m_t << "\\item ";
+}
+
+void RTFDocVisitor::visitPost(DocSimpleListItem *)
+{
+}
+
+void RTFDocVisitor::visitPre(DocSection *s)
+{
+ if (Config_getBool("PDF_HYPERLINKS"))
+ {
+ m_t << "\\hypertarget{" << s->file() << "_" << s->anchor() << "}{}";
+ }
+ if (s->level()==1)
+ {
+ if (Config_getBool("COMPACT_LATEX"))
+ {
+ m_t << "\\subsubsection{";
+ }
+ else
+ {
+ m_t << "\\subsection{";
+ }
+ }
+ else if (s->level()==2)
+ {
+ if (Config_getBool("COMPACT_LATEX"))
+ {
+ m_t << "\\paragraph{";
+ }
+ else
+ {
+ m_t << "\\subsubsection{";
+ }
+ }
+ filter(s->title());
+ m_t << "}\\label{" << s->anchor() << "}" << endl;
+}
+
+void RTFDocVisitor::visitPost(DocSection *)
+{
+}
+
+void RTFDocVisitor::visitPre(DocHtmlList *s)
+{
+ if (s->type()==DocHtmlList::Ordered)
+ m_t << "\\begin{enumerate}" << endl;
+ else
+ m_t << "\\begin{itemize}" << endl;
+}
+
+void RTFDocVisitor::visitPost(DocHtmlList *s)
+{
+ if (s->type()==DocHtmlList::Ordered)
+ m_t << "\\end{enumerate}" << endl;
+ else
+ m_t << "\\end{itemize}" << endl;
+}
+
+void RTFDocVisitor::visitPre(DocHtmlListItem *)
+{
+ m_t << "\\item ";
+}
+
+void RTFDocVisitor::visitPost(DocHtmlListItem *)
+{
+}
+
+void RTFDocVisitor::visitPre(DocHtmlPre *)
+{
+ m_t << "\\small\\begin{alltt}";
+ m_insidePre=TRUE;
+}
+
+void RTFDocVisitor::visitPost(DocHtmlPre *)
+{
+ m_insidePre=FALSE;
+ m_t << "\\end{alltt}\\normalsize " << endl;
+}
+
+void RTFDocVisitor::visitPre(DocHtmlDescList *)
+{
+ m_t << "\\begin{description}" << endl;
+}
+
+void RTFDocVisitor::visitPost(DocHtmlDescList *)
+{
+ m_t << "\\end{description}" << endl;
+}
+
+void RTFDocVisitor::visitPre(DocHtmlDescTitle *)
+{
+ m_t << "\\item[";
+}
+
+void RTFDocVisitor::visitPost(DocHtmlDescTitle *)
+{
+ m_t << "]";
+}
+
+void RTFDocVisitor::visitPre(DocHtmlDescData *)
+{
+}
+
+void RTFDocVisitor::visitPost(DocHtmlDescData *)
+{
+}
+
+void RTFDocVisitor::visitPre(DocHtmlTable *t)
+{
+ if (t->hasCaption())
+ {
+ m_t << "\\begin{table}[h]";
+ }
+ m_t << "\\begin{TabularC}{" << t->numCols() << "}\n\\hline\n";
+}
+
+void RTFDocVisitor::visitPost(DocHtmlTable *t)
+{
+ if (t->hasCaption())
+ {
+ m_t << "\\end{table}\n";
+ }
+ else
+ {
+ m_t << "\\\\\\hline\n\\end{TabularC}\n";
+ }
+}
+
+void RTFDocVisitor::visitPre(DocHtmlCaption *)
+{
+ m_t << "\\\\\\hline\n\\end{TabularC}\n\\centering\n\\caption{";
+}
+
+void RTFDocVisitor::visitPost(DocHtmlCaption *)
+{
+ m_t << "}\n";
+}
+
+void RTFDocVisitor::visitPre(DocHtmlRow *)
+{
+}
+
+void RTFDocVisitor::visitPost(DocHtmlRow *)
+{
+ m_t << "\\\\\\hline\n";
+}
+
+void RTFDocVisitor::visitPre(DocHtmlCell *)
+{
+}
+
+void RTFDocVisitor::visitPost(DocHtmlCell *c)
+{
+ if (!c->isLast()) m_t << "&";
+}
+
+void RTFDocVisitor::visitPre(DocIndexEntry *)
+{
+ m_hide = TRUE;
+}
+
+void RTFDocVisitor::visitPost(DocIndexEntry *)
+{
+ m_hide = FALSE;
+}
+
+void RTFDocVisitor::visitPre(DocInternal *)
+{
+ m_t << "\\begin{Desc}" << endl
+ << "\\item[" << theTranslator->trForInternalUseOnly() << "]" << endl;
+}
+
+void RTFDocVisitor::visitPost(DocInternal *)
+{
+ m_t << "\\end{Desc}" << endl;
+}
+
+void RTFDocVisitor::visitPre(DocHRef *href)
+{
+ if (Config_getBool("PDF_HYPERLINKS"))
+ {
+ m_t << "\\href{";
+ m_t << href->url();
+ m_t << "}";
+ }
+ m_t << "{\\tt ";
+}
+
+void RTFDocVisitor::visitPost(DocHRef *)
+{
+ m_t << "}";
+}
+
+void RTFDocVisitor::visitPre(DocHtmlHeader *header)
+{
+ if (Config_getBool("COMPACT_LATEX"))
+ {
+ switch(header->level())
+ {
+ case 1: m_t << "\\subsection{"; break;
+ case 2: m_t << "\\subsubsection{"; break;
+ case 3: m_t << "\\paragraph{"; break;
+ }
+ }
+ else
+ {
+ switch(header->level())
+ {
+ case 1: m_t << "\\section{"; break;
+ case 2: m_t << "\\subsection{"; break;
+ case 3: m_t << "\\subsubsection{"; break;
+ }
+ }
+}
+
+void RTFDocVisitor::visitPost(DocHtmlHeader *)
+{
+ m_t << "}";
+}
+
+void RTFDocVisitor::visitPre(DocImage *img)
+{
+ if (img->type()==DocImage::Latex)
+ {
+ if (img->hasCaption())
+ {
+ m_t << "\\begin{figure}[H]" << endl;
+ m_t << "\\begin{center}" << endl;
+ }
+ else
+ {
+ m_t << "\\mbox{";
+ }
+ QCString gfxName = img->name();
+ if (gfxName.right(4)==".eps" || gfxName.right(4)==".pdf")
+ {
+ gfxName=gfxName.left(gfxName.length()-4);
+ }
+ m_t << "\\includegraphics";
+ if (!img->width().isEmpty())
+ {
+ m_t << "[width=" << img->width() << "]";
+ }
+ else if (!img->height().isEmpty())
+ {
+ m_t << "[height=" << img->height() << "]";
+ }
+ m_t << "{" << gfxName << "}";
+ if (img->hasCaption())
+ {
+ m_t << "\\caption{";
+ }
+ }
+ else // other format -> skip
+ {
+ m_hide=TRUE;
+ }
+}
+
+void RTFDocVisitor::visitPost(DocImage *img)
+{
+ if (img->type()==DocImage::Latex)
+ {
+ m_t << "}" << endl; // end mbox or caption
+ if (img->hasCaption())
+ {
+ m_t << "\\end{center}" << endl;
+ m_t << "\\end{figure}" << endl;
+ }
+ }
+ else // other format
+ {
+ m_hide=FALSE;
+ }
+}
+
+void RTFDocVisitor::visitPre(DocDotFile *df)
+{
+ QCString baseName=df->file();
+ int i;
+ if ((i=baseName.findRev('/'))!=-1)
+ {
+ baseName=baseName.right(baseName.length()-i-1);
+ }
+ if (baseName.right(4)==".eps" || baseName.right(4)==".pdf")
+ {
+ baseName=baseName.left(baseName.length()-4);
+ }
+ QCString outDir = Config_getString("LATEX_OUTPUT");
+ writeDotGraphFromFile(df->file(),outDir,baseName,EPS);
+ if (df->hasCaption())
+ {
+ m_t << "\\begin{figure}[H]" << endl;
+ m_t << "\\begin{center}" << endl;
+ }
+ else
+ {
+ m_t << "\\mbox{";
+ }
+ m_t << "\\includegraphics";
+ if (!df->width().isEmpty())
+ {
+ m_t << "[width=" << df->width() << "]";
+ }
+ else if (!df->height().isEmpty())
+ {
+ m_t << "[height=" << df->height() << "]";
+ }
+ m_t << "{" << baseName << "}";
+
+ if (df->hasCaption())
+ {
+ m_t << "\\caption{";
+ }
+}
+
+void RTFDocVisitor::visitPost(DocDotFile *df)
+{
+ m_t << "}" << endl; // end mbox or caption
+ if (df->hasCaption())
+ {
+ m_t << "\\end{center}" << endl;
+ m_t << "\\end{figure}" << endl;
+ }
+}
+
+void RTFDocVisitor::visitPre(DocLink *lnk)
+{
+ startLink(lnk->ref(),lnk->file(),lnk->anchor());
+}
+
+void RTFDocVisitor::visitPost(DocLink *lnk)
+{
+ endLink(lnk->ref());
+}
+
+void RTFDocVisitor::visitPre(DocRef *ref)
+{
+ startLink(ref->ref(),ref->file(),ref->anchor());
+ if (!ref->hasLinkText()) filter(ref->targetTitle());
+}
+
+void RTFDocVisitor::visitPost(DocRef *ref)
+{
+ endLink(ref->ref());
+ m_t << " ";
+}
+
+void RTFDocVisitor::visitPre(DocSecRefItem *)
+{
+ m_t << "\\item \\contentsline{section}{";
+}
+
+void RTFDocVisitor::visitPost(DocSecRefItem *ref)
+{
+ m_t << "}{\\ref{" << ref->anchor() << "}}{}" << endl;
+}
+
+void RTFDocVisitor::visitPre(DocSecRefList *)
+{
+ m_t << "\\footnotesize" << endl;
+ m_t << "\\begin{multicols}{2}" << endl;
+ m_t << "\\begin{CompactList}" << endl;
+}
+
+void RTFDocVisitor::visitPost(DocSecRefList *)
+{
+ m_t << "\\end{CompactList}" << endl;
+ m_t << "\\end{multicols}" << endl;
+ m_t << "\\normalsize" << endl;
+}
+
+void RTFDocVisitor::visitPre(DocLanguage *)
+{
+}
+
+void RTFDocVisitor::visitPost(DocLanguage *)
+{
+}
+
+void RTFDocVisitor::visitPre(DocParamSect *s)
+{
+ m_t << "\\begin{Desc}" << endl;
+ m_t << "\\item[";
+ switch(s->type())
+ {
+ case DocParamSect::Param:
+ m_t << theTranslator->trParameters(); break;
+ case DocParamSect::RetVal:
+ m_t << theTranslator->trReturnValues(); break;
+ case DocParamSect::Exception:
+ m_t << theTranslator->trExceptions(); break;
+ default:
+ ASSERT(0);
+ }
+ m_t << ":]" << endl;
+ m_t << "\\begin{description}" << endl;
+}
+
+void RTFDocVisitor::visitPost(DocParamSect *)
+{
+ m_t << "\\end{description}" << endl;
+ m_t << "\\end{Desc}" << endl;
+}
+
+void RTFDocVisitor::visitPre(DocParamList *pl)
+{
+ m_t << "\\item[{\\em ";
+ QStrListIterator li(pl->parameters());
+ const char *s;
+ bool first=TRUE;
+ for (li.toFirst();(s=li.current());++li)
+ {
+ if (!first) m_t << ","; else first=FALSE;
+ m_t << s;
+ }
+ m_t << "}]";
+}
+
+void RTFDocVisitor::visitPost(DocParamList *)
+{
+}
+
+void RTFDocVisitor::visitPre(DocXRefItem *x)
+{
+ m_t << "\\begin{Desc}" << endl;
+ m_t << "\\item[";
+ if (Config_getBool("PDF_HYPERLINKS"))
+ {
+ m_t << "\\hyperlink{" << x->file() << "_" << x->anchor() << "}{";
+ }
+ else
+ {
+ m_t << "{\\bf ";
+ }
+ filter(x->title());
+ m_t << "}]";
+}
+
+void RTFDocVisitor::visitPost(DocXRefItem *)
+{
+ m_t << "\\end{Desc}" << endl;
+}
+
+void RTFDocVisitor::visitPre(DocInternalRef *ref)
+{
+ startLink("",ref->file(),ref->anchor());
+}
+
+void RTFDocVisitor::visitPost(DocInternalRef *)
+{
+ endLink("");
+ m_t << " ";
+}
+
+void RTFDocVisitor::visitPre(DocCopy *)
+{
+}
+
+void RTFDocVisitor::visitPost(DocCopy *)
+{
+}
+
+static char* getMultiByte(int c)
+{
+ static char s[10];
+ sprintf(s,"\\'%X",c);
+ return s;
+}
+
+void RTFDocVisitor::filter(const char *str)
+{
+ if (str)
+ {
+ const unsigned char *p=(const unsigned char *)str;
+ unsigned char c;
+ unsigned char pc='\0';
+ while (*p)
+ {
+ static bool MultiByte = FALSE;
+ c=*p++;
+
+ if ( MultiByte )
+ {
+ m_t << getMultiByte( c );
+ MultiByte = FALSE;
+ continue;
+ }
+ if ( c >= 0x80 )
+ {
+ MultiByte = TRUE;
+ m_t << getMultiByte( c );
+ continue;
+ }
+
+ switch (c)
+ {
+ case '{': m_t << "\\{"; break;
+ case '}': m_t << "\\}"; break;
+ case '\\': m_t << "\\\\"; break;
+ default: m_t << (char)c;
+ }
+ pc = c;
+ }
+ }
+}
+
+void RTFDocVisitor::startLink(const QCString &ref,const QCString &file,const QCString &anchor)
+{
+ if (ref.isEmpty() && Config_getBool("RTF_HYPERLINKS"))
+ {
+ QCString refName;
+ if (!file.isEmpty())
+ {
+ refName+=file;
+ }
+ if (anchor)
+ {
+ refName+='_';
+ refName+=anchor;
+ }
+
+ m_t << "{\\field {\\*\\fldinst { HYPERLINK \\\\l \"";
+ m_t << rtfFormatBmkStr(refName);
+ m_t << "\" }{}";
+ m_t << "}{\\fldrslt {\\cs37\\ul\\cf2 ";
+ }
+ else
+ {
+ m_t << "{\\b ";
+ }
+}
+
+void RTFDocVisitor::endLink(const QCString &ref)
+{
+ if (ref.isEmpty() && Config_getBool("RTF_HYPERLINKS"))
+ {
+ m_t << "}}}";
+ }
+ else
+ {
+ m_t << "}";
+ }
+}
+
diff --git a/src/rtfdocvisitor.h b/src/rtfdocvisitor.h
new file mode 100644
index 0000000..842cc84
--- /dev/null
+++ b/src/rtfdocvisitor.h
@@ -0,0 +1,150 @@
+/******************************************************************************
+ *
+ *
+ *
+ *
+ * Copyright (C) 1997-2002 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+
+#ifndef _RTFDOCVISITOR_H
+#define _RTFDOCVISITOR_H
+
+#include "docvisitor.h"
+
+class QTextStream;
+class BaseCodeDocInterface;
+class QCString;
+
+/*! @brief Concrete visitor implementation for RTF output. */
+class RTFDocVisitor : public DocVisitor
+{
+ public:
+ RTFDocVisitor(QTextStream &t,BaseCodeDocInterface &ci);
+
+ //--------------------------------------
+ // visitor functions for leaf nodes
+ //--------------------------------------
+
+ void visit(DocWord *);
+ void visit(DocLinkedWord *);
+ void visit(DocWhiteSpace *);
+ void visit(DocSymbol *);
+ void visit(DocURL *);
+ void visit(DocLineBreak *);
+ void visit(DocHorRuler *);
+ void visit(DocStyleChange *);
+ void visit(DocVerbatim *);
+ void visit(DocAnchor *);
+ void visit(DocInclude *);
+ void visit(DocIncOperator *);
+ void visit(DocFormula *);
+
+ //--------------------------------------
+ // visitor functions for compound nodes
+ //--------------------------------------
+
+ void visitPre(DocAutoList *);
+ void visitPost(DocAutoList *);
+ void visitPre(DocAutoListItem *);
+ void visitPost(DocAutoListItem *);
+ void visitPre(DocPara *);
+ void visitPost(DocPara *);
+ void visitPre(DocRoot *);
+ void visitPost(DocRoot *);
+ void visitPre(DocSimpleSect *);
+ void visitPost(DocSimpleSect *);
+ void visitPre(DocTitle *);
+ void visitPost(DocTitle *);
+ void visitPre(DocSimpleList *);
+ void visitPost(DocSimpleList *);
+ void visitPre(DocSimpleListItem *);
+ void visitPost(DocSimpleListItem *);
+ void visitPre(DocSection *s);
+ void visitPost(DocSection *);
+ void visitPre(DocHtmlList *s);
+ void visitPost(DocHtmlList *s);
+ void visitPre(DocHtmlListItem *);
+ void visitPost(DocHtmlListItem *);
+ void visitPre(DocHtmlPre *);
+ void visitPost(DocHtmlPre *);
+ void visitPre(DocHtmlDescList *);
+ void visitPost(DocHtmlDescList *);
+ void visitPre(DocHtmlDescTitle *);
+ void visitPost(DocHtmlDescTitle *);
+ void visitPre(DocHtmlDescData *);
+ void visitPost(DocHtmlDescData *);
+ void visitPre(DocHtmlTable *t);
+ void visitPost(DocHtmlTable *t);
+ void visitPre(DocHtmlCaption *);
+ void visitPost(DocHtmlCaption *);
+ void visitPre(DocHtmlRow *);
+ void visitPost(DocHtmlRow *) ;
+ void visitPre(DocHtmlCell *);
+ void visitPost(DocHtmlCell *);
+ void visitPre(DocIndexEntry *);
+ void visitPost(DocIndexEntry *);
+ void visitPre(DocInternal *);
+ void visitPost(DocInternal *);
+ void visitPre(DocHRef *);
+ void visitPost(DocHRef *);
+ void visitPre(DocHtmlHeader *);
+ void visitPost(DocHtmlHeader *) ;
+ void visitPre(DocImage *);
+ void visitPost(DocImage *);
+ void visitPre(DocDotFile *);
+ void visitPost(DocDotFile *);
+ void visitPre(DocLink *lnk);
+ void visitPost(DocLink *);
+ void visitPre(DocRef *ref);
+ void visitPost(DocRef *);
+ void visitPre(DocSecRefItem *);
+ void visitPost(DocSecRefItem *);
+ void visitPre(DocSecRefList *);
+ void visitPost(DocSecRefList *);
+ void visitPre(DocLanguage *);
+ void visitPost(DocLanguage *);
+ void visitPre(DocParamSect *);
+ void visitPost(DocParamSect *);
+ void visitPre(DocParamList *);
+ void visitPost(DocParamList *);
+ void visitPre(DocXRefItem *);
+ void visitPost(DocXRefItem *);
+ void visitPre(DocInternalRef *);
+ void visitPost(DocInternalRef *);
+ void visitPre(DocCopy *);
+ void visitPost(DocCopy *);
+
+ private:
+
+ //--------------------------------------
+ // helper functions
+ //--------------------------------------
+
+ void filter(const char *str);
+ void startLink(const QCString &ref,const QCString &file,
+ const QCString &anchor);
+ void endLink(const QCString &ref);
+ QCString getStyle(const char *name);
+
+ //--------------------------------------
+ // state variables
+ //--------------------------------------
+
+ QTextStream &m_t;
+ BaseCodeDocInterface &m_ci;
+ bool m_insidePre;
+ bool m_hide;
+ int m_indentLevel;
+};
+
+#endif
diff --git a/src/rtfgen.cpp b/src/rtfgen.cpp
index 8583856..2aaa3ab 100644
--- a/src/rtfgen.cpp
+++ b/src/rtfgen.cpp
@@ -33,6 +33,7 @@
#include "dot.h"
#include "version.h"
#include "page.h"
+#include "rtfstyle.h"
//#define DBG_RTF(x) x;
#define DBG_RTF(x)
@@ -40,64 +41,6 @@
// used for table column width calculation
#define PAGEWIDTH 8748
-const int indentLevels = 10;
-
-struct RTFListItemInfo
-{
- bool isEnum;
- int number;
-};
-
-static RTFListItemInfo listItemInfo[indentLevels];
-static QCString title;
-static QCString subject;
-static QCString comments;
-static QCString company;
-static QCString logoFilename;
-static QCString author;
-static QCString manager;
-static QCString documentType;
-static QCString documentId;
-static QCString keywords;
-
-static QCString g_nextTag( "AAAAAAAAAA" );
-static QDict<QCString> g_tagDict( 5003 );
-
-static QCString formatBmkStr(const char *name)
-{
- // To overcome the 40-character tag limitation, we
- // substitute a short arbitrary string for the name
- // supplied, and keep track of the correspondence
- // between names and strings.
- QCString key( name );
- QCString* tag = g_tagDict.find( key );
- if ( !tag )
- {
- // This particular name has not yet been added
- // to the list. Add it, associating it with the
- // next tag value, and increment the next tag.
- tag = new QCString( g_nextTag.copy() ); // Make sure to use a deep copy!
- g_tagDict.insert( key, tag );
-
- // This is the increment part
- char* nxtTag = g_nextTag.data() + g_nextTag.length() - 1;
- for ( unsigned int i = 0; i < g_nextTag.length(); ++i, --nxtTag )
- {
- if ( ( ++(*nxtTag) ) > 'Z' )
- {
- (*nxtTag) = 'A';
- }
- else
- {
- // Since there was no carry, we can stop now
- break;
- }
- }
- }
-
- return *tag;
-}
-
static QCString dateToRTFDateString()
{
const QDateTime &d = QDateTime::currentDateTime();
@@ -106,7 +49,7 @@ static QCString dateToRTFDateString()
d.date().year(), d.date().month(), d.date().day(),
d.time().hour(),d.time().minute(),d.time().second());
return result;
-}
+}
RTFGenerator::RTFGenerator() : OutputGenerator()
{
@@ -143,307 +86,6 @@ OutputGenerator *RTFGenerator::copy()
return result;
}
-static const char Rtf_Style_Reset[] = "\\pard\\plain ";
-
-struct Rtf_Style_Default
-{
- const char *name;
- const char *reference;
- const char *definition;
-};
-
-static const struct Rtf_Style_Default Rtf_Style_Default[] =
-{
- { "Heading1",
- "\\s1\\sb240\\sa60\\keepn\\widctlpar\\adjustright \\b\\f1\\fs36\\kerning36\\cgrid ",
- "\\sbasedon0 \\snext0 heading 1"
- },
- { "Heading2",
- "\\s2\\sb240\\sa60\\keepn\\widctlpar\\adjustright \\b\\f1\\fs28\\kerning28\\cgrid ",
- "\\sbasedon0 \\snext0 heading 2"
- },
- { "Heading3",
- "\\s3\\sb240\\sa60\\keepn\\widctlpar\\adjustright \\b\\f1\\cgrid ",
- "\\sbasedon0 \\snext0 heading 3"
- },
- { "Heading4",
- "\\s4\\sb240\\sa60\\keepn\\widctlpar\\adjustright \\b\\f1\\fs20\\cgrid ",
- "\\sbasedon0 \\snext0 heading 4;}{\\*\\cs10 \\additive Default Paragraph Font"
- },
- { "Title",
- "\\s15\\qc\\sb240\\sa60\\widctlpar\\outlinelevel0\\adjustright \\b\\f1\\fs32\\kerning28\\cgrid ",
- "\\sbasedon0 \\snext15 Title"
- },
- { "SubTitle",
- "\\s16\\qc\\sa60\\widctlpar\\outlinelevel1\\adjustright \\f1\\cgrid ",
- "\\sbasedon0 \\snext16 Subtitle"
- },
- { "BodyText",
- "\\s17\\sa60\\sb30\\widctlpar\\qj \\fs22\\cgrid ",
- "\\sbasedon0 \\snext17 BodyText"
- },
- { "DenseText",
- "\\s18\\widctlpar\\fs22\\cgrid ",
- "\\sbasedon0 \\snext18 DenseText"
- },
- { "Header",
- "\\s28\\widctlpar\\tqc\\tx4320\\tqr\\tx8640\\adjustright \\fs20\\cgrid ",
- "\\sbasedon0 \\snext28 header"
- },
- { "Footer",
- "\\s29\\widctlpar\\tqc\\tx4320\\tqr\\tx8640\\qr\\adjustright \\fs20\\cgrid ",
- "\\sbasedon0 \\snext29 footer"
- },
- { "GroupHeader",
- "\\s30\\li360\\sa60\\sb120\\keepn\\widctlpar\\adjustright \\b\\f1\\fs20\\cgrid ",
- "\\sbasedon0 \\snext30 GroupHeader"
- },
- { "CodeExample0",
- "\\s40\\li0\\widctlpar\\adjustright \\shading1000\\cbpat8 \\f2\\fs16\\cgrid ",
- "\\sbasedon0 \\snext41 Code Example 0"
- },
- { "CodeExample1",
- "\\s41\\li360\\widctlpar\\adjustright \\shading1000\\cbpat8 \\f2\\fs16\\cgrid ",
- "\\sbasedon0 \\snext42 Code Example 1"
- },
- { "CodeExample2",
- "\\s42\\li720\\widctlpar\\adjustright \\shading1000\\cbpat8 \\f2\\fs16\\cgrid ",
- "\\sbasedon0 \\snext43 Code Example 2"
- },
- { "CodeExample3",
- "\\s43\\li1080\\widctlpar\\adjustright \\shading1000\\cbpat8 \\f2\\fs16\\cgrid ",
- "\\sbasedon0 \\snext44 Code Example 3"
- },
- { "CodeExample4",
- "\\s44\\li1440\\widctlpar\\adjustright \\shading1000\\cbpat8 \\f2\\fs16\\cgrid ",
- "\\sbasedon0 \\snext45 Code Example 4"
- },
- { "CodeExample5",
- "\\s45\\li1800\\widctlpar\\adjustright \\shading1000\\cbpat8 \\f2\\fs16\\cgrid ",
- "\\sbasedon0 \\snext46 Code Example 5"
- },
- { "CodeExample6",
- "\\s46\\li2160\\widctlpar\\adjustright \\shading1000\\cbpat8 \\f2\\fs16\\cgrid ",
- "\\sbasedon0 \\snext47 Code Example 6"
- },
- { "CodeExample7",
- "\\s47\\li2520\\widctlpar\\adjustright \\shading1000\\cbpat8 \\f2\\fs16\\cgrid ",
- "\\sbasedon0 \\snext48 Code Example 7"
- },
- { "CodeExample8",
- "\\s48\\li2880\\widctlpar\\adjustright \\shading1000\\cbpat8 \\f2\\fs16\\cgrid ",
- "\\sbasedon0 \\snext49 Code Example 8"
- },
- { "CodeExample9",
- "\\s49\\li3240\\widctlpar\\adjustright \\shading1000\\cbpat8 \\f2\\fs16\\cgrid ",
- "\\sbasedon0 \\snext49 Code Example 9"
- },
- { "ListContinue0",
- "\\s50\\li0\\sa60\\sb30\\qj\\widctlpar\\qj\\adjustright \\fs20\\cgrid ",
- "\\sbasedon0 \\snext51 List Continue 0"
- },
- { "ListContinue1",
- "\\s51\\li360\\sa60\\sb30\\qj\\widctlpar\\qj\\adjustright \\fs20\\cgrid ",
- "\\sbasedon0 \\snext52 List Continue 1"
- },
- { "ListContinue2",
- "\\s52\\li720\\sa60\\sb30\\qj\\widctlpar\\qj\\adjustright \\fs20\\cgrid ",
- "\\sbasedon0 \\snext53 List Continue 2"
- },
- { "ListContinue3",
- "\\s53\\li1080\\sa60\\sb30\\qj\\widctlpar\\qj\\adjustright \\fs20\\cgrid ",
- "\\sbasedon0 \\snext54 List Continue 3"
- },
- { "ListContinue4",
- "\\s54\\li1440\\sa60\\sb30\\qj\\widctlpar\\qj\\adjustright \\fs20\\cgrid ",
- "\\sbasedon0 \\snext55 List Continue 4"
- },
- { "ListContinue5",
- "\\s55\\li1800\\sa60\\sb30\\qj\\widctlpar\\qj\\adjustright \\fs20\\cgrid ",
- "\\sbasedon0 \\snext56 List Continue 5"
- },
- { "ListContinue6",
- "\\s56\\li2160\\sa60\\sb30\\qj\\widctlpar\\qj\\adjustright \\fs20\\cgrid ",
- "\\sbasedon0 \\snext57 List Continue 6"
- },
- { "ListContinue7",
- "\\s57\\li2520\\sa60\\sb30\\qj\\widctlpar\\qj\\adjustright \\fs20\\cgrid ",
- "\\sbasedon0 \\snext58 List Continue 7"
- },
- { "ListContinue8",
- "\\s58\\li2880\\sa60\\sb30\\qj\\widctlpar\\qj\\adjustright \\fs20\\cgrid ",
- "\\sbasedon0 \\snext59 List Continue 8"
- },
- { "ListContinue9",
- "\\s59\\li3240\\sa60\\sb30\\qj\\widctlpar\\qj\\adjustright \\fs20\\cgrid ",
- "\\sbasedon0 \\snext59 List Continue 9"
- },
- { "DescContinue0",
- "\\s60\\li0\\widctlpar\\ql\\adjustright \\fs20\\cgrid ",
- "\\sbasedon0 \\snext61 DescContinue 0"
- },
- { "DescContinue1",
- "\\s61\\li360\\widctlpar\\ql\\adjustright \\fs20\\cgrid ",
- "\\sbasedon0 \\snext62 DescContinue 1"
- },
- { "DescContinue2",
- "\\s62\\li720\\widctlpar\\ql\\adjustright \\fs20\\cgrid ",
- "\\sbasedon0 \\snext63 DescContinue 2"
- },
- { "DescContinue3",
- "\\s63\\li1080\\widctlpar\\ql\\adjustright \\fs20\\cgrid ",
- "\\sbasedon0 \\snext64 DescContinue 3"
- },
- { "DescContinue4",
- "\\s64\\li1440\\widctlpar\\ql\\adjustright \\fs20\\cgrid ",
- "\\sbasedon0 \\snext65 DescContinue 4"
- },
- { "DescContinue5",
- "\\s65\\li1800\\widctlpar\\ql\\adjustright \\fs20\\cgrid ",
- "\\sbasedon0 \\snext66 DescContinue 5"
- },
- { "DescContinue6",
- "\\s66\\li2160\\widctlpar\\ql\\adjustright \\fs20\\cgrid ",
- "\\sbasedon0 \\snext67 DescContinue 6"
- },
- { "DescContinue7",
- "\\s67\\li2520\\widctlpar\\ql\\adjustright \\fs20\\cgrid ",
- "\\sbasedon0 \\snext68 DescContinue 7"
- },
- { "DescContinue8",
- "\\s68\\li2880\\widctlpar\\ql\\adjustright \\fs20\\cgrid ",
- "\\sbasedon0 \\snext69 DescContinue 8"
- },
- { "DescContinue9",
- "\\s69\\li3240\\widctlpar\\ql\\adjustright \\fs20\\cgrid ",
- "\\sbasedon0 \\snext69 DescContinue 9"
- },
- { "LatexTOC0",
- "\\s70\\li0\\sa30\\sb30\\widctlpar\\tqr\\tldot\\tx8640\\adjustright \\fs20\\cgrid ",
- "\\sbasedon0 \\snext81 LatexTOC 0"
- },
- { "LatexTOC1",
- "\\s71\\li360\\sa27\\sb27\\widctlpar\\tqr\\tldot\\tx8640\\adjustright \\fs20\\cgrid ",
- "\\sbasedon0 \\snext82 LatexTOC 1"
- },
- { "LatexTOC2",
- "\\s72\\li720\\sa24\\sb24\\widctlpar\\tqr\\tldot\\tx8640\\adjustright \\fs20\\cgrid ",
- "\\sbasedon0 \\snext83 LatexTOC 2"
- },
- { "LatexTOC3",
- "\\s73\\li1080\\sa21\\sb21\\widctlpar\\tqr\\tldot\\tx8640\\adjustright \\fs20\\cgrid ",
- "\\sbasedon0 \\snext84 LatexTOC 3"
- },
- { "LatexTOC4",
- "\\s74\\li1440\\sa18\\sb18\\widctlpar\\tqr\\tldot\\tx8640\\adjustright \\fs20\\cgrid ",
- "\\sbasedon0 \\snext85 LatexTOC 4"
- },
- { "LatexTOC5",
- "\\s75\\li1800\\sa15\\sb15\\widctlpar\\tqr\\tldot\\tx8640\\adjustright \\fs20\\cgrid ",
- "\\sbasedon0 \\snext86 LatexTOC 5"
- },
- { "LatexTOC6",
- "\\s76\\li2160\\sa12\\sb12\\widctlpar\\tqr\\tldot\\tx8640\\adjustright \\fs20\\cgrid ",
- "\\sbasedon0 \\snext87 LatexTOC 6"
- },
- { "LatexTOC7",
- "\\s77\\li2520\\sa9\\sb9\\widctlpar\\tqr\\tldot\\tx8640\\adjustright \\fs20\\cgrid ",
- "\\sbasedon0 \\snext88 LatexTOC 7"
- },
- { "LatexTOC8",
- "\\s78\\li2880\\sa6\\sb6\\widctlpar\\tqr\\tldot\\tx8640\\adjustright \\fs20\\cgrid ",
- "\\sbasedon0 \\snext89 LatexTOC 8"
- },
- { "LatexTOC9",
- "\\s79\\li3240\\sa3\\sb3\\widctlpar\\tqr\\tldot\\tx8640\\adjustright \\fs20\\cgrid ",
- "\\sbasedon0 \\snext89 LatexTOC 9"
- },
- { "ListBullet0",
- "\\s80\\fi-360\\li360\\widctlpar\\jclisttab\\tx360{\\*\\pn \\pnlvlbody\\ilvl0\\ls1\\pnrnot0\\pndec }\\ls1\\adjustright \\fs20\\cgrid ",
- "\\sbasedon0 \\snext81 \\sautoupd List Bullet 0"
- },
- { "ListBullet1",
- "\\s81\\fi-360\\li720\\widctlpar\\jclisttab\\tx720{\\*\\pn \\pnlvlbody\\ilvl0\\ls2\\pnrnot0\\pndec }\\ls2\\adjustright \\fs20\\cgrid ",
- "\\sbasedon0 \\snext82 \\sautoupd List Bullet 1"
- },
- { "ListBullet2",
- "\\s82\\fi-360\\li1080\\widctlpar\\jclisttab\\tx1080{\\*\\pn \\pnlvlbody\\ilvl0\\ls3\\pnrnot0\\pndec }\\ls3\\adjustright \\fs20\\cgrid ",
- "\\sbasedon0 \\snext83 \\sautoupd List Bullet 2"
- },
- { "ListBullet3",
- "\\s83\\fi-360\\li1440\\widctlpar\\jclisttab\\tx1440{\\*\\pn \\pnlvlbody\\ilvl0\\ls4\\pnrnot0\\pndec }\\ls4\\adjustright \\fs20\\cgrid ",
- "\\sbasedon0 \\snext84 \\sautoupd List Bullet 3"
- },
- { "ListBullet4",
- "\\s84\\fi-360\\li1800\\widctlpar\\jclisttab\\tx1800{\\*\\pn \\pnlvlbody\\ilvl0\\ls5\\pnrnot0\\pndec }\\ls5\\adjustright \\fs20\\cgrid ",
- "\\sbasedon0 \\snext85 \\sautoupd List Bullet 4"
- },
- { "ListBullet5",
- "\\s85\\fi-360\\li2160\\widctlpar\\jclisttab\\tx2160{\\*\\pn \\pnlvlbody\\ilvl0\\ls6\\pnrnot0\\pndec }\\ls6\\adjustright \\fs20\\cgrid ",
- "\\sbasedon0 \\snext86 \\sautoupd List Bullet 5"
- },
- { "ListBullet6",
- "\\s86\\fi-360\\li2520\\widctlpar\\jclisttab\\tx2520{\\*\\pn \\pnlvlbody\\ilvl0\\ls7\\pnrnot0\\pndec }\\ls7\\adjustright \\fs20\\cgrid ",
- "\\sbasedon0 \\snext87 \\sautoupd List Bullet 6"
- },
- { "ListBullet7",
- "\\s87\\fi-360\\li2880\\widctlpar\\jclisttab\\tx2880{\\*\\pn \\pnlvlbody\\ilvl0\\ls8\\pnrnot0\\pndec }\\ls8\\adjustright \\fs20\\cgrid ",
- "\\sbasedon0 \\snext88 \\sautoupd List Bullet 7"
- },
- { "ListBullet8",
- "\\s88\\fi-360\\li3240\\widctlpar\\jclisttab\\tx3240{\\*\\pn \\pnlvlbody\\ilvl0\\ls9\\pnrnot0\\pndec }\\ls9\\adjustright \\fs20\\cgrid ",
- "\\sbasedon0 \\snext89 \\sautoupd List Bullet 8"
- },
- { "ListBullet9",
- "\\s89\\fi-360\\li3600\\widctlpar\\jclisttab\\tx3600{\\*\\pn \\pnlvlbody\\ilvl0\\ls10\\pnrnot0\\pndec }\\ls10\\adjustright \\fs20\\cgrid ",
- "\\sbasedon0 \\snext89 \\sautoupd List Bullet 9"
- },
- { "ListEnum0",
- "\\s90\\fi-360\\li360\\widctlpar\\fs20\\cgrid ",
- "\\sbasedon0 \\snext91 \\sautoupd List Enum 0"
- },
- { "ListEnum1",
- "\\s91\\fi-360\\li720\\widctlpar\\fs20\\cgrid ",
- "\\sbasedon0 \\snext92 \\sautoupd List Enum 1"
- },
- { "ListEnum2",
- "\\s92\\fi-360\\li1080\\widctlpar\\fs20\\cgrid ",
- "\\sbasedon0 \\snext93 \\sautoupd List Enum 2"
- },
- { "ListEnum3",
- "\\s93\\fi-360\\li1440\\widctlpar\\fs20\\cgrid ",
- "\\sbasedon0 \\snext94 \\sautoupd List Enum 3"
- },
- { "ListEnum4",
- "\\s94\\fi-360\\li1800\\widctlpar\\fs20\\cgrid ",
- "\\sbasedon0 \\snext95 \\sautoupd List Enum 4"
- },
- { "ListEnum5",
- "\\s95\\fi-360\\li2160\\widctlpar\\fs20\\cgrid ",
- "\\sbasedon0 \\snext96 \\sautoupd List Enum 5"
- },
- { "ListEnum6",
- "\\s96\\fi-360\\li2520\\widctlpar\\fs20\\cgrid ",
- "\\sbasedon0 \\snext96 \\sautoupd List Enum 5"
- },
- { "ListEnum7",
- "\\s97\\fi-360\\li2880\\widctlpar\\fs20\\cgrid ",
- "\\sbasedon0 \\snext98 \\sautoupd List Enum 7"
- },
- { "ListEnum8",
- "\\s98\\fi-360\\li3240\\widctlpar\\fs20\\cgrid ",
- "\\sbasedon0 \\snext99 \\sautoupd List Enum 8"
- },
- { "ListEnum9",
- "\\s99\\fi-360\\li3600\\widctlpar\\fs20\\cgrid ",
- "\\sbasedon0 \\snext99 \\sautoupd List Enum 9"
- },
- { 0,
- 0,
- 0
- }
-};
-
void RTFGenerator::writeStyleSheetFile(QFile &file)
{
QTextStream t(&file);
@@ -453,171 +95,14 @@ void RTFGenerator::writeStyleSheetFile(QFile &file)
t << "# Remove a hash to activate a line.\n\n";
int i;
- for (i=0;Rtf_Style_Default[i].reference!=0;i++)
+ for ( i=0 ; rtf_Style_Default[i].reference!=0 ; i++ )
{
- t << "# " << Rtf_Style_Default[i].name << " = "
- << Rtf_Style_Default[i].reference
- << Rtf_Style_Default[i].definition << endl;
+ t << "# " << rtf_Style_Default[i].name << " = "
+ << rtf_Style_Default[i].reference
+ << rtf_Style_Default[i].definition << endl;
}
}
-struct StyleData
-{
- // elements of this type are stored in dictionary Rtf_Style
- //
- // to define a tag in the header reference + definition is required
- // to use a tag in the body of the document only reference is required
-
- unsigned index; // index in style-sheet, i.e. number in s-clause
- char* reference; // everything required to apply the style
- char* definition; // aditional tags like \snext and style name
-
- StyleData(const char* reference, const char* definition);
- ~StyleData();
- bool setStyle(const char* s, const char* styleName);
-
- static const QRegExp s_clause;
-};
-
-const QRegExp StyleData::s_clause("\\\\s[0-9]+\\s*");
-
-StyleData::StyleData(const char* reference, const char* definition)
-{
- int start = s_clause.match(reference); ASSERT(start >= 0);
- reference += start;
- index = (int)atol(reference + 2); ASSERT(index > 0);
-
- ASSERT(reference != 0);
- size_t size = 1 + strlen(reference);
- memcpy(this->reference = new char[size], reference, size);
-
- ASSERT(definition != 0);
- size = 1 + strlen(definition);
- memcpy(this->definition = new char[size], definition, size);
-}
-
-StyleData::~StyleData()
-{
- delete[] reference;
- delete[] definition;
-}
-
-bool StyleData::setStyle(const char* s, const char* styleName)
-{
- static const QRegExp subgroup("^{[^}]*}\\s*");
- static const QRegExp any_clause("^\\\\[a-z][a-z0-9-]*\\s*");
-
- int len = 0; // length of a particular RTF formatting control
- int ref_len = 0; // length of the whole formatting section of a style
- int start = s_clause.match(s, 0, &len);
- if (start < 0)
- {
- err("Style sheet '%s' contains no '\\s' clause.\n{%s}\n", styleName, s);
- return FALSE;
- }
- s += start;
- index = (int)atol(s + 2); ASSERT(index > 0);
-
- // search for the end of pure formatting codes
- const char* end = s + len;
- ref_len = len;
- bool haveNewDefinition = TRUE;
- for(;;)
- {
- if (*end == '{')
- {
- // subgroups are used for \\additive
- if (0 != subgroup.match(end, 0, &len))
- break;
- else
- {
- end += len;
- ref_len += len;
- }
- }
- else if (*end == '\\')
- {
- if (0 == strncmp(end, "\\snext", 6))
- break;
- if (0 == strncmp(end, "\\sbasedon", 9))
- break;
- if (0 != any_clause.match(end, 0, &len))
- break;
- end += len;
- ref_len += len;
- }
- else if (*end == 0)
- { // no style-definition part, keep default value
- haveNewDefinition = FALSE;
- break;
- }
- else // plain name without leading \\snext
- break;
- }
- delete[] reference;
- reference = new char[ref_len + 1];
- memcpy(reference, s, ref_len);
- reference[ref_len] = 0;
- if (haveNewDefinition)
- {
- delete[] definition;
- size_t size = 1 + strlen(end);
- definition = new char[size];
- memcpy(definition, end, size);
- }
- return TRUE;
-}
-
-static void loadStylesheet(const char *name, QDict<StyleData>& dict)
-{
- QFile file(name);
- if (!file.open(IO_ReadOnly))
- {
- err("Can't open RTF style sheet file %s. Using defaults.\n",name);
- return;
- }
- msg("Loading RTF style sheet %s...\n",name);
-
- static const QRegExp separator("[ \t]*=[ \t]*");
- uint lineNr=1;
- QTextStream t(&file);
-#if QT_VERSION >= 200
- t.setEncoding(QTextStream::Latin1);
-#endif
-
- while (!t.eof())
- {
- QCString s(4096); // string buffer of max line length
- s = t.readLine().stripWhiteSpace();
- if (s.length()==0 || s.at(0)=='#') continue; // skip blanks & comments
- int sepLength;
- int sepStart = separator.match(s,0,&sepLength);
- if (sepStart<=0) // no valid assignment statement
- {
- warn(name,lineNr,"Assignment of style sheet name expected!\n");
- continue;
- }
- QCString key=s.left(sepStart);
- if (dict[key]==0) // not a valid style sheet name
- {
- warn(name,lineNr,"Invalid style sheet name %s ignored.\n",key.data());
- continue;
- }
- StyleData* styleData = dict.find(key);
- if (styleData == 0)
- {
- warn(name,lineNr,"Unknown style sheet name %s ignored.\n",key.data());
- continue;
- }
- s+=" "; // add command separator
- styleData->setStyle(s.data() + sepStart + sepLength, key.data());
- lineNr++;
- }
-}
-
-static QDict<StyleData> Rtf_Style(257);
-
-
void RTFGenerator::writeExtensionsFile(QFile &file)
{
QTextStream t(&file);
@@ -670,52 +155,6 @@ void RTFGenerator::writeExtensionsFile(QFile &file)
t << "#Keywords = \n\n";
}
-static void loadExtensions(const char *name)
-{
- QFile file(name);
- if (!file.open(IO_ReadOnly))
- {
- err("Can't open RTF extensions file %s. Using defaults.\n",name);
- return;
- }
- msg("Loading RTF extensions %s...\n",name);
-
- static const QRegExp separator("[ \t]*=[ \t]*");
- uint lineNr=1;
- QTextStream t(&file);
-#if QT_VERSION >= 200
- t.setEncoding(QTextStream::Latin1);
-#endif
-
- while (!t.eof())
- {
- QCString s(4096); // string buffer of max line length
- s = t.readLine().stripWhiteSpace();
- if (s.length()==0 || s.at(0)=='#') continue; // skip blanks & comments
- int sepLength;
- int sepStart = separator.match(s,0,&sepLength);
- if (sepStart<=0) // no valid assignment statement
- {
- warn(name,lineNr,"Assignment of extension field expected!\n");
- continue;
- }
- QCString key=s.left(sepStart);
- QCString data=s.data() + sepStart + sepLength;
-
- if (key == "Title") title = data.data();
- if (key == "Subject") subject = data.data();
- if (key == "Comments") comments = data.data();
- if (key == "Company") company = data.data();
- if (key == "LogoFilename") logoFilename = data.data();
- if (key == "Author") author = data.data();
- if (key == "Manager") manager = data.data();
- if (key == "DocumentType") documentType = data.data();
- if (key == "DocumentId") documentId = data.data();
- if (key == "Keywords") keywords = data.data();
- lineNr++;
- }
-}
-
void RTFGenerator::init()
{
@@ -726,18 +165,16 @@ void RTFGenerator::init()
err("Could not create output directory %s\n",dir.data());
exit(1);
}
- Rtf_Style.setAutoDelete(TRUE);
-
- g_tagDict.setAutoDelete(TRUE);
+ rtf_Style.setAutoDelete(TRUE);
- // first duplicate strings of Rtf_Style_Default
- const struct Rtf_Style_Default* def = Rtf_Style_Default;
+ // first duplicate strings of rtf_Style_Default
+ const struct Rtf_Style_Default* def = rtf_Style_Default;
while(def->reference != 0)
{
if (def->definition == 0)
- err("Internal error: Rtf_Style_Default[%s] has no definition.\n", def->name);
+ err("Internal error: rtf_Style_Default[%s] has no definition.\n", def->name);
StyleData* styleData = new StyleData(def->reference, def->definition);
- Rtf_Style.insert(def->name, styleData);
+ rtf_Style.insert(def->name, styleData);
def++;
}
@@ -745,7 +182,7 @@ void RTFGenerator::init()
QCString &rtfStyleSheetFile = Config_getString("RTF_STYLESHEET_FILE");
if (!rtfStyleSheetFile.isEmpty())
{
- loadStylesheet(rtfStyleSheetFile, Rtf_Style);
+ loadStylesheet(rtfStyleSheetFile, rtf_Style);
}
// If user has defined an extension file, load its contents.
@@ -807,7 +244,7 @@ void RTFGenerator::beginRTFDocument()
// sort styles ascending by \s-number via an intermediate QArray
QArray<const StyleData*> array(128);
array.fill(0);
- QDictIterator<StyleData> iter(Rtf_Style);
+ QDictIterator<StyleData> iter(rtf_Style);
const StyleData* style;
for(; (style = iter.current()); ++iter)
{
@@ -847,40 +284,40 @@ void RTFGenerator::beginRTFChapter()
{
t <<"\n";
DBG_RTF(t << "{\\comment BeginRTFChapter}\n")
- t << Rtf_Style_Reset;
+ t << rtf_Style_Reset;
// if we are compact, no extra page breaks...
if (Config_getBool("COMPACT_RTF"))
{
// t <<"\\sect\\sectd\\sbknone\n";
t <<"\\sect\\sbknone\n";
- RtfwriteRuler_thick();
+ rtfwriteRuler_thick();
}
else
t <<"\\sect\\sbkpage\n";
//t <<"\\sect\\sectd\\sbkpage\n";
- t << Rtf_Style["Heading1"]->reference << "\n";
+ t << rtf_Style["Heading1"]->reference << "\n";
}
void RTFGenerator::beginRTFSection()
{
t <<"\n";
DBG_RTF(t << "{\\comment BeginRTFSection}\n")
- t << Rtf_Style_Reset;
+ t << rtf_Style_Reset;
// if we are compact, no extra page breaks...
if (Config_getBool("COMPACT_RTF"))
{
// t <<"\\sect\\sectd\\sbknone\n";
t <<"\\sect\\sbknone\n";
- RtfwriteRuler_emboss();
+ rtfwriteRuler_emboss();
}
else
t <<"\\sect\\sbkpage\n";
//t <<"\\sect\\sectd\\sbkpage\n";
- t << Rtf_Style["Heading2"]->reference << "\n";
+ t << rtf_Style["Heading2"]->reference << "\n";
}
void RTFGenerator::startFile(const char *name,const char *,
@@ -929,13 +366,13 @@ void RTFGenerator::startIndexSection(IndexSections is)
break;
case isTitlePageAuthor:
t << "}\n";
- if (subject) t << "{\\subject " << subject << "}\n";
- if (comments) t << "{\\comment " << comments << "}\n";
- if (company) t << "{\\company " << company << "}\n";
- if (author) t << "{\\author " << author << "}\n";
- if (manager) t << "{\\manager " << manager << "}\n";
- if (documentType) t << "{\\category " << documentType << "}\n";
- if (keywords) t << "{\\keywords " << keywords << "}\n";
+ if (rtf_subject) t << "{\\subject " << rtf_subject << "}\n";
+ if (rtf_comments) t << "{\\comment " << rtf_comments << "}\n";
+ if (rtf_company) t << "{\\company " << rtf_company << "}\n";
+ if (rtf_author) t << "{\\author " << rtf_author << "}\n";
+ if (rtf_manager) t << "{\\manager " << rtf_manager << "}\n";
+ if (rtf_documentType) t << "{\\category " << rtf_documentType << "}\n";
+ if (rtf_keywords) t << "{\\keywords " << rtf_keywords << "}\n";
t << "{\\comment ";
break;
case isMainPage:
@@ -1081,9 +518,9 @@ void RTFGenerator::endIndexSection(IndexSections is)
switch (is)
{
case isTitlePageStart:
- if (title)
+ if (rtf_title)
// User has overridden document title in extensions file
- t << "}" << title;
+ t << "}" << rtf_title;
else
t << "}" << Config_getString("PROJECT_NAME");
break;
@@ -1093,42 +530,42 @@ void RTFGenerator::endIndexSection(IndexSections is)
t << "{\\creatim " << dateToRTFDateString() << "}\n}";
DBG_RTF(t << "{\\comment end of infoblock}\n");
// setup for this section
- t << Rtf_Style_Reset <<"\n";
+ t << rtf_Style_Reset <<"\n";
t <<"\\sectd\\pgnlcrm\n";
- t <<"{\\footer "<<Rtf_Style["Footer"]->reference << "{\\chpgn}}\n";
+ t <<"{\\footer "<<rtf_Style["Footer"]->reference << "{\\chpgn}}\n";
// the title entry
DBG_RTF(t << "{\\comment begin title page}\n")
- t << Rtf_Style_Reset << Rtf_Style["SubTitle"]->reference << endl; // set to title style
+ t << rtf_Style_Reset << rtf_Style["SubTitle"]->reference << endl; // set to title style
t << "\\vertalc\\qc\\par\\par\\par\\par\\par\\par\\par\n";
- if (logoFilename)
+ if (rtf_logoFilename)
{
- t << "{\\field\\flddirty {\\*\\fldinst INCLUDEPICTURE " << logoFilename;
+ t << "{\\field\\flddirty {\\*\\fldinst INCLUDEPICTURE " << rtf_logoFilename;
t << " \\\\d \\\\*MERGEFORMAT} {\\fldrslt IMAGE }}\\par\\par\n";
}
- if (company)
+ if (rtf_company)
{
- t << company << "\\par\\par\n";
+ t << rtf_company << "\\par\\par\n";
}
- t << Rtf_Style_Reset << Rtf_Style["Title"]->reference << endl; // set to title style
+ t << rtf_Style_Reset << rtf_Style["Title"]->reference << endl; // set to title style
t << "{\\field\\fldedit {\\*\\fldinst TITLE \\\\*MERGEFORMAT}{\\fldrslt TITLE}}\\par" << endl;
- t << Rtf_Style_Reset << Rtf_Style["SubTitle"]->reference << endl; // set to title style
+ t << rtf_Style_Reset << rtf_Style["SubTitle"]->reference << endl; // set to title style
t << "\\par\n";
- if (documentType)
+ if (rtf_documentType)
{
- t << documentType << "\\par\n";
+ t << rtf_documentType << "\\par\n";
}
- if (documentId)
+ if (rtf_documentId)
{
- t << documentId << "\\par\n";
+ t << rtf_documentId << "\\par\n";
}
t << "\\par\\par\\par\\par\\par\\par\\par\\par\\par\\par\\par\\par\n";
- t << Rtf_Style_Reset << Rtf_Style["SubTitle"]->reference << endl; // set to subtitle style
+ t << rtf_Style_Reset << rtf_Style["SubTitle"]->reference << endl; // set to subtitle style
t << "{\\field\\fldedit {\\*\\fldinst AUTHOR \\\\*MERGEFORMAT}{\\fldrslt AUTHOR}}\\par" << endl;
t << "Version " << Config_getString("PROJECT_NUMBER") << "\\par";
t << "{\\field\\fldedit {\\*\\fldinst CREATEDATE \\\\*MERGEFORMAT}"
@@ -1139,16 +576,16 @@ void RTFGenerator::endIndexSection(IndexSections is)
// table of contents section
DBG_RTF(t << "{\\comment Table of contents}\n")
t << "\\vertalt\n";
- t << Rtf_Style_Reset << endl;
- t << Rtf_Style["Heading1"]->reference;
+ t << rtf_Style_Reset << endl;
+ t << rtf_Style["Heading1"]->reference;
t << theTranslator->trRTFTableOfContents() << "\\par"<< endl;
- t << Rtf_Style_Reset << "\\par" << endl;
+ t << rtf_Style_Reset << "\\par" << endl;
t << "{\\field\\fldedit {\\*\\fldinst TOC \\\\f \\\\*MERGEFORMAT}{\\fldrslt Table of contents}}\\par\n";
- t << Rtf_Style_Reset << endl;
+ t << rtf_Style_Reset << endl;
}
break;
case isMainPage:
- t << "\\par " << Rtf_Style_Reset << endl;
+ t << "\\par " << rtf_Style_Reset << endl;
if (!Doxygen::mainPage || Doxygen::mainPage->title.isEmpty())
{
t << "{\\tc \\v " << theTranslator->trMainPage() << "}"<< endl;
@@ -1162,37 +599,37 @@ void RTFGenerator::endIndexSection(IndexSections is)
t << ".rtf\" \\\\*MERGEFORMAT}{\\fldrslt includedstuff}}\n";
break;
//case isPackageIndex:
- // t << "\\par " << Rtf_Style_Reset << endl;
+ // t << "\\par " << rtf_Style_Reset << endl;
// t << "{\\tc \\v " << theTranslator->trPackageList() << "}"<< endl;
// t << "{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \"packages.rtf\" \\\\*MERGEFORMAT}{\\fldrslt includedstuff}}\n";
// break;
case isModuleIndex:
- t << "\\par " << Rtf_Style_Reset << endl;
+ t << "\\par " << rtf_Style_Reset << endl;
t << "{\\tc \\v " << theTranslator->trModuleIndex() << "}"<< endl;
t << "{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \"modules.rtf\" \\\\*MERGEFORMAT}{\\fldrslt includedstuff}}\n";
break;
case isNamespaceIndex:
- t << "\\par " << Rtf_Style_Reset << endl;
+ t << "\\par " << rtf_Style_Reset << endl;
t << "{\\tc \\v " << theTranslator->trNamespaceIndex() << "}"<< endl;
t << "{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \"namespaces.rtf\" \\\\*MERGEFORMAT}{\\fldrslt includedstuff}}\n";
break;
case isClassHierarchyIndex:
- t << "\\par " << Rtf_Style_Reset << endl;
+ t << "\\par " << rtf_Style_Reset << endl;
t << "{\\tc \\v " << theTranslator->trHierarchicalIndex() << "}"<< endl;
t << "{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \"hierarchy.rtf\" \\\\*MERGEFORMAT}{\\fldrslt includedstuff}}\n";
break;
case isCompoundIndex:
- t << "\\par " << Rtf_Style_Reset << endl;
+ t << "\\par " << rtf_Style_Reset << endl;
t << "{\\tc \\v " << theTranslator->trCompoundIndex() << "}"<< endl;
t << "{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \"annotated.rtf\" \\\\*MERGEFORMAT}{\\fldrslt includedstuff}}\n";
break;
case isFileIndex:
- t << "\\par " << Rtf_Style_Reset << endl;
+ t << "\\par " << rtf_Style_Reset << endl;
t << "{\\tc \\v " << theTranslator->trFileIndex() << "}"<< endl;
t << "{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \"files.rtf\" \\\\*MERGEFORMAT}{\\fldrslt includedstuff}}\n";
break;
case isPageIndex:
- t << "\\par " << Rtf_Style_Reset << endl;
+ t << "\\par " << rtf_Style_Reset << endl;
t << "{\\tc \\v " << theTranslator->trPageIndex() << "}"<< endl;
t << "{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \"pages.rtf\" \\\\*MERGEFORMAT}{\\fldrslt includedstuff}}\n";
break;
@@ -1203,7 +640,7 @@ void RTFGenerator::endIndexSection(IndexSections is)
// t << "{\\tc \\v " << theTranslator->trPackageDocumentation() << "}"<< endl;
// while (pd)
// {
- // t << "\\par " << Rtf_Style_Reset << endl;
+ // t << "\\par " << rtf_Style_Reset << endl;
// t << "{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \"";
// t << pd->getOutputFileBase();
// t << ".rtf\" \\\\*MERGEFORMAT}{\\fldrslt includedstuff}}\n";
@@ -1221,7 +658,7 @@ void RTFGenerator::endIndexSection(IndexSections is)
{
if (!gd->isReference())
{
- t << "\\par " << Rtf_Style_Reset << endl;
+ t << "\\par " << rtf_Style_Reset << endl;
t << "{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \"";
t << gd->getOutputFileBase();
t << ".rtf\" \\\\*MERGEFORMAT}{\\fldrslt includedstuff}}\n";
@@ -1238,7 +675,7 @@ void RTFGenerator::endIndexSection(IndexSections is)
{
if (nd->isLinkableInProject())
{
- t << "\\par " << Rtf_Style_Reset << endl;
+ t << "\\par " << rtf_Style_Reset << endl;
t << "{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \"";
t << nd->getOutputFileBase();
t << ".rtf\" \\\\*MERGEFORMAT}{\\fldrslt includedstuff}}\n";
@@ -1249,7 +686,7 @@ void RTFGenerator::endIndexSection(IndexSections is)
{
if (nd->isLinkableInProject())
{
- t << "\\par " << Rtf_Style_Reset << endl;
+ t << "\\par " << rtf_Style_Reset << endl;
beginRTFSection();
t << "{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \"";
t << nd->getOutputFileBase();
@@ -1270,7 +707,7 @@ void RTFGenerator::endIndexSection(IndexSections is)
{
if (cd->isLinkableInProject() && cd->templateMaster()==0)
{
- t << "\\par " << Rtf_Style_Reset << endl;
+ t << "\\par " << rtf_Style_Reset << endl;
t << "{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \"";
t << cd->getOutputFileBase();
t << ".rtf\" \\\\*MERGEFORMAT}{\\fldrslt includedstuff}}\n";
@@ -1281,7 +718,7 @@ void RTFGenerator::endIndexSection(IndexSections is)
{
if (cd->isLinkableInProject() && cd->templateMaster()==0)
{
- t << "\\par " << Rtf_Style_Reset << endl;
+ t << "\\par " << rtf_Style_Reset << endl;
beginRTFSection();
t << "{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \"";
t << cd->getOutputFileBase();
@@ -1305,7 +742,7 @@ void RTFGenerator::endIndexSection(IndexSections is)
{
if (isFirst)
{
- t << "\\par " << Rtf_Style_Reset << endl;
+ t << "\\par " << rtf_Style_Reset << endl;
t << "{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \"";
t << fd->getOutputFileBase();
t << ".rtf\" \\\\*MERGEFORMAT}{\\fldrslt includedstuff}}\n";
@@ -1313,7 +750,7 @@ void RTFGenerator::endIndexSection(IndexSections is)
}
else
{
- t << "\\par " << Rtf_Style_Reset << endl;
+ t << "\\par " << rtf_Style_Reset << endl;
beginRTFSection();
t << "{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \"";
t << fd->getOutputFileBase();
@@ -1334,14 +771,14 @@ void RTFGenerator::endIndexSection(IndexSections is)
PageInfo *pi=pdi.toFirst();
if (pi)
{
- t << "\\par " << Rtf_Style_Reset << endl;
+ t << "\\par " << rtf_Style_Reset << endl;
t << "{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \"";
t << pi->getOutputFileBase();
t << ".rtf\" \\\\*MERGEFORMAT}{\\fldrslt includedstuff}}\n";
}
for (++pdi;(pi=pdi.current());++pdi)
{
- t << "\\par " << Rtf_Style_Reset << endl;
+ t << "\\par " << rtf_Style_Reset << endl;
beginRTFSection();
t << "{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \"";
t << pi->getOutputFileBase();
@@ -1359,7 +796,7 @@ void RTFGenerator::endIndexSection(IndexSections is)
{
if (!pi->getGroupDef() && !pi->isReference())
{
- if (first) t << "\\par " << Rtf_Style_Reset << endl;
+ if (first) t << "\\par " << rtf_Style_Reset << endl;
t << "{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \"";
t << pi->getOutputFileBase();
t << ".rtf\" \\\\*MERGEFORMAT}{\\fldrslt includedstuff}}\n";
@@ -1370,9 +807,9 @@ void RTFGenerator::endIndexSection(IndexSections is)
break;
case isEndIndex:
beginRTFChapter();
- t << Rtf_Style["Heading1"]->reference;
+ t << rtf_Style["Heading1"]->reference;
t << theTranslator->trRTFGeneralIndex() << "\\par "<< endl;
- t << Rtf_Style_Reset << endl;
+ t << rtf_Style_Reset << endl;
t << "{\\tc \\v " << theTranslator->trRTFGeneralIndex() << "}" << endl;
t << "{\\field\\fldedit {\\*\\fldinst INDEX \\\\c2 \\\\*MERGEFORMAT}{\\fldrslt INDEX}}\n";
@@ -1388,8 +825,8 @@ void RTFGenerator::lastIndexPage()
t <<"\\sect \\sectd \\sbknone\n";
// set footer
- t <<"{\\footer "<< Rtf_Style["Footer"]->reference << "{\\chpgn}}\n";
- //t << Rtf_Style["Heading1"]->reference << "\n";
+ t <<"{\\footer "<< rtf_Style["Footer"]->reference << "{\\chpgn}}\n";
+ //t << rtf_Style["Heading1"]->reference << "\n";
}
@@ -1413,7 +850,7 @@ void RTFGenerator::startIndexList()
DBG_RTF(t << "{\\comment (startIndexList)}" << endl)
t << "{" << endl;
incrementIndentLevel();
- t << Rtf_Style_Reset << Rtf_LCList_DepthStyle() << endl;
+ t << rtf_Style_Reset << rtf_LCList_DepthStyle() << endl;
newParagraph();
m_omitParagraph = TRUE;
}
@@ -1471,16 +908,16 @@ void RTFGenerator::writeListItem()
{
DBG_RTF(t << "{\\comment (writeListItem)}" << endl)
newParagraph();
- t << Rtf_Style_Reset;
+ t << rtf_Style_Reset;
if (listItemInfo[m_listLevel].isEnum)
{
- t << Rtf_EList_DepthStyle() << endl;
+ t << rtf_EList_DepthStyle() << endl;
t << listItemInfo[m_listLevel].number << ".\\tab ";
listItemInfo[m_listLevel].number++;
}
else
{
- t << Rtf_BList_DepthStyle() << endl;
+ t << rtf_BList_DepthStyle() << endl;
}
m_omitParagraph = TRUE;
}
@@ -1489,12 +926,12 @@ void RTFGenerator::writeIndexItem(const char *ref,const char *fn,
const char *name)
{
DBG_RTF(t << "{\\comment (writeIndexItem)}" << endl)
- //t << Rtf_LCList_DepthStyle() << endl;
+ //t << rtf_LCList_DepthStyle() << endl;
docify(name);
if (!ref && fn)
{
t << "\\tab ";
- WriteRTFReference(fn);
+ writeRTFReference(fn);
t << endl;
}
else
@@ -1556,7 +993,7 @@ void RTFGenerator::writeStartAnnoItem(const char *,const char *f,
if (f && Config_getBool("RTF_HYPERLINKS"))
{
t << "{\\field {\\*\\fldinst { HYPERLINK \\\\l \"";
- t << formatBmkStr(f);
+ t << rtfFormatBmkStr(f);
t << "\" }{}";
t << "}{\\fldrslt {\\cs37\\ul\\cf2 ";
@@ -1577,7 +1014,7 @@ void RTFGenerator::writeEndAnnoItem(const char *name)
if (name)
{
t << "\\tab ";
- WriteRTFReference(name);
+ writeRTFReference(name);
t << endl;
}
else
@@ -1611,7 +1048,7 @@ void RTFGenerator::endIndexValue(const char *name,bool hasBrief)
if (name)
{
t << "\\tab ";
- WriteRTFReference(name);
+ writeRTFReference(name);
t << endl;
}
else
@@ -1626,14 +1063,14 @@ void RTFGenerator::startSubsection()
//beginRTFSubSection();
t <<"\n";
DBG_RTF(t << "{\\comment Begin SubSection}\n")
- t << Rtf_Style_Reset;
- t << Rtf_Style["Heading3"]->reference << "\n";
+ t << rtf_Style_Reset;
+ t << rtf_Style["Heading3"]->reference << "\n";
}
void RTFGenerator::endSubsection()
{
newParagraph();
- t << Rtf_Style_Reset << endl;
+ t << rtf_Style_Reset << endl;
}
void RTFGenerator::startSubsubsection()
@@ -1642,7 +1079,7 @@ void RTFGenerator::startSubsubsection()
t << "\n";
DBG_RTF(t << "{\\comment Begin SubSubSection}\n")
t << "{" << endl;
- t << Rtf_Style_Reset << Rtf_Style["Heading4"]->reference << "\n";
+ t << rtf_Style_Reset << rtf_Style["Heading4"]->reference << "\n";
}
void RTFGenerator::endSubsubsection()
@@ -1735,7 +1172,7 @@ void RTFGenerator::startTextLink(const char *f,const char *anchor)
}
t << "{\\field {\\*\\fldinst { HYPERLINK \\\\l \"";
- t << formatBmkStr(ref);
+ t << rtfFormatBmkStr(ref);
t << "\" }{}";
t << "}{\\fldrslt {\\cs37\\ul\\cf2 ";
}
@@ -1766,7 +1203,7 @@ void RTFGenerator::writeObjectLink(const char *ref, const char *f,
}
t << "{\\field {\\*\\fldinst { HYPERLINK \\\\l \"";
- t << formatBmkStr(refName);
+ t << rtfFormatBmkStr(refName);
t << "\" }{}";
t << "}{\\fldrslt {\\cs37\\ul\\cf2 ";
@@ -1800,7 +1237,7 @@ void RTFGenerator::endPageRef(const char *clname, const char *anchor)
ref+='_';
ref+=anchor;
}
- WriteRTFReference(ref);
+ writeRTFReference(ref);
endEmphasis();
t << ")";
}
@@ -1822,7 +1259,7 @@ void RTFGenerator::writeCodeLink(const char *ref,const char *f,
}
t << "{\\field {\\*\\fldinst { HYPERLINK \\\\l \"";
- t << formatBmkStr(refName);
+ t << rtfFormatBmkStr(refName);
t << "\" }{}";
t << "}{\\fldrslt {\\cs37\\ul\\cf2 ";
@@ -1841,13 +1278,13 @@ void RTFGenerator::startTitleHead(const char *)
DBG_RTF(t <<"{\\comment startTitleHead}" << endl)
// beginRTFSection();
- t << Rtf_Style_Reset << Rtf_Style["Heading2"]->reference << endl;
+ t << rtf_Style_Reset << rtf_Style["Heading2"]->reference << endl;
}
void RTFGenerator::endTitleHead(const char *fileName,const char *name)
{
DBG_RTF(t <<"{\\comment endTitleHead}" << endl)
- t << "\\par " << Rtf_Style_Reset << endl;
+ t << "\\par " << rtf_Style_Reset << endl;
if (name)
{
// make table of contents entry
@@ -1883,8 +1320,8 @@ void RTFGenerator::startGroupHeader()
{
DBG_RTF(t <<"{\\comment startGroupHeader}" << endl)
newParagraph();
- t << Rtf_Style_Reset;
- t << Rtf_Style["Heading3"]->reference;
+ t << rtf_Style_Reset;
+ t << rtf_Style["Heading3"]->reference;
t << endl;
}
@@ -1892,7 +1329,7 @@ void RTFGenerator::endGroupHeader()
{
DBG_RTF(t <<"{\\comment endGroupHeader}" << endl)
newParagraph();
- t << Rtf_Style_Reset << endl;
+ t << rtf_Style_Reset << endl;
}
void RTFGenerator::startMemberDoc(const char *clname,
@@ -1906,10 +1343,10 @@ void RTFGenerator::startMemberDoc(const char *clname,
addIndexItem(memname,clname);
addIndexItem(clname,memname);
}
- t << Rtf_Style_Reset << Rtf_Style["Heading4"]->reference;
- //styleStack.push(Rtf_Style_Heading4);
+ t << rtf_Style_Reset << rtf_Style["Heading4"]->reference;
+ //styleStack.push(rtf_Style_Heading4);
t << "{" << endl;
- //printf("RTFGenerator::startMemberDoc() `%s'\n",Rtf_Style["Heading4"]->reference);
+ //printf("RTFGenerator::startMemberDoc() `%s'\n",rtf_Style["Heading4"]->reference);
startBold();
t << endl;
}
@@ -1920,7 +1357,7 @@ void RTFGenerator::endMemberDoc()
t << "}" << endl;
//const char *style = styleStack.pop();
//printf("RTFGenerator::endMemberDoc() `%s'\n",style);
- //ASSERT(style==Rtf_Style["Heading4"]->reference);
+ //ASSERT(style==rtf_Style["Heading4"]->reference);
endBold();
newParagraph();
}
@@ -1946,10 +1383,10 @@ void RTFGenerator::endDoxyAnchor(const char *fName,const char *anchor)
DBG_RTF(t << "{\\comment endDoxyAnchor}" << endl)
t << "{\\bkmkstart ";
- t << formatBmkStr(ref);
+ t << rtfFormatBmkStr(ref);
t << "}" << endl;
t << "{\\bkmkend ";
- t << formatBmkStr(ref);
+ t << rtfFormatBmkStr(ref);
t << "}" << endl;
}
@@ -1979,13 +1416,13 @@ void RTFGenerator::startIndent()
incrementIndentLevel();
DBG_RTF(t << "{\\comment (startIndent) }" << endl)
t << "{" << endl;
- t << Rtf_Style_Reset << Rtf_CList_DepthStyle() << endl;
+ t << rtf_Style_Reset << rtf_CList_DepthStyle() << endl;
//styleStack.push(style);
}
void RTFGenerator::endIndent()
{
- //const char *style = /* Rtf_CList_DepthStyle(); */
+ //const char *style = /* rtf_CList_DepthStyle(); */
t << "}" << endl;
decrementIndentLevel();
}
@@ -1995,7 +1432,7 @@ void RTFGenerator::startDescription()
{
DBG_RTF(t << "{\\comment (startDescription)}" << endl)
t << "{" << endl;
- t << Rtf_Style_Reset << Rtf_CList_DepthStyle();
+ t << rtf_Style_Reset << rtf_CList_DepthStyle();
}
void RTFGenerator::endDescription()
@@ -2024,7 +1461,7 @@ void RTFGenerator::startMemberDescription()
DBG_RTF(t << "{\\comment (startMemberDescription)}" << endl)
t << "{" << endl;
incrementIndentLevel();
- t << Rtf_Style_Reset << Rtf_CList_DepthStyle();
+ t << rtf_Style_Reset << rtf_CList_DepthStyle();
startEmphasis();
}
@@ -2053,7 +1490,7 @@ void RTFGenerator::endDescTitle()
t << "}";
newParagraph();
incrementIndentLevel();
- t << Rtf_Style_Reset << Rtf_DList_DepthStyle();
+ t << rtf_Style_Reset << rtf_DList_DepthStyle();
}
void RTFGenerator::writeDescItem()
@@ -2075,7 +1512,7 @@ void RTFGenerator::startSection(const char *,const char *title,SectionInfo::Sect
{
DBG_RTF(t << "{\\comment (startSection)}" << endl)
t << "{";
- t<< Rtf_Style_Reset;
+ t<< rtf_Style_Reset;
int num=4;
switch(type)
{
@@ -2087,7 +1524,7 @@ void RTFGenerator::startSection(const char *,const char *title,SectionInfo::Sect
QCString heading;
heading.sprintf("Heading%d",num);
// set style
- t << Rtf_Style[heading]->reference;
+ t << rtf_Style[heading]->reference;
// make table of contents entry
t << "{\\tc\\tcl" << num << " \\v ";
docify(title);
@@ -2117,7 +1554,7 @@ void RTFGenerator::writeSectionRef(const char *ref,const char *,
endBold();
t << " (";
docify(theTranslator->trPageAbbreviation());
- WriteRTFReference(lab);
+ writeRTFReference(lab);
t << ")" << endl;
}
}
@@ -2127,7 +1564,7 @@ void RTFGenerator::writeSectionRefItem(const char *,const char *lab,
{
docify(title);
t << "\\tab";
- WriteRTFReference(lab);
+ writeRTFReference(lab);
t << endl;
}
@@ -2258,7 +1695,7 @@ void RTFGenerator::endClassDiagram(ClassDiagram &d,
// display the file
t << "{" << endl;
- t << Rtf_Style_Reset << endl;
+ t << rtf_Style_Reset << endl;
t << "\\par\\pard \\qc {\\field\\flddirty {\\*\\fldinst INCLUDEPICTURE ";
t << fileName << ".png";
t << " \\\\d \\\\*MERGEFORMAT}{\\fldrslt IMAGE}}\\par" << endl;
@@ -2273,7 +1710,7 @@ void RTFGenerator::writeFormula(const char *,const char *text)
void RTFGenerator::startMemberItem(int)
{
DBG_RTF(t <<"{\\comment startMemberItem }" << endl)
- t << Rtf_Style_Reset << Rtf_BList_DepthStyle() << endl; // set style to apropriate depth
+ t << rtf_Style_Reset << rtf_BList_DepthStyle() << endl; // set style to apropriate depth
}
void RTFGenerator::endMemberItem(bool)
@@ -2299,14 +1736,14 @@ void RTFGenerator::writeAnchor(const char *fileName,const char *name)
}
DBG_RTF(t <<"{\\comment writeAncheor (" << anchor << ")}" << endl)
- t << "{\\bkmkstart " << formatBmkStr(anchor) << "}" << endl;
- t << "{\\bkmkend " << formatBmkStr(anchor) << "}" << endl;
+ t << "{\\bkmkstart " << rtfFormatBmkStr(anchor) << "}" << endl;
+ t << "{\\bkmkend " << rtfFormatBmkStr(anchor) << "}" << endl;
}
-void RTFGenerator::WriteRTFReference(const char *label)
+void RTFGenerator::writeRTFReference(const char *label)
{
t << "{\\field\\fldedit {\\*\\fldinst PAGEREF ";
- t << formatBmkStr(label);
+ t << rtfFormatBmkStr(label);
t << " \\\\*MERGEFORMAT}{\\fldrslt pagenum}}";
}
@@ -2314,8 +1751,8 @@ void RTFGenerator::startCodeFragment()
{
t << "{" << endl;
newParagraph();
- t << Rtf_Style_Reset << Rtf_Code_DepthStyle();
- //styleStack.push(Rtf_Style_CodeExample);
+ t << rtf_Style_Reset << rtf_Code_DepthStyle();
+ //styleStack.push(rtf_Style_CodeExample);
}
void RTFGenerator::endCodeFragment()
@@ -2323,7 +1760,7 @@ void RTFGenerator::endCodeFragment()
newParagraph();
//styleStack.pop();
//printf("RTFGenerator::endCodeFrament() top=%s\n",styleStack.top());
- //t << Rtf_Style_Reset << styleStack.top() << endl;
+ //t << rtf_Style_Reset << styleStack.top() << endl;
DBG_RTF(t << "{\\comment (endCodeFragment) }" << endl)
t << "}" << endl;
m_omitParagraph = TRUE;
@@ -2360,7 +1797,7 @@ void RTFGenerator::startImage(const char *name,const char *,bool)
{
newParagraph();
t << "{" << endl;
- t << Rtf_Style_Reset << endl;
+ t << rtf_Style_Reset << endl;
t << "\\par\\pard \\qc {\\field\\flddirty {\\*\\fldinst INCLUDEPICTURE ";
t << name;
t << " \\\\d \\\\*MERGEFORMAT}{\\fldrslt IMAGE}}\\par" << endl;
@@ -2384,7 +1821,7 @@ void RTFGenerator::startDotFile(const char *name,bool)
writeDotGraphFromFile(name,outDir,baseName,BITMAP);
newParagraph();
t << "{" << endl;
- t << Rtf_Style_Reset << endl;
+ t << rtf_Style_Reset << endl;
t << "\\par\\pard \\qc {\\field\\flddirty {\\*\\fldinst INCLUDEPICTURE ";
t << outDir << "\\" << baseName;
t << " \\\\d \\\\*MERGEFORMAT}{\\fldrslt IMAGE}}\\par" << endl;
@@ -2401,7 +1838,7 @@ void RTFGenerator::startDescTable()
DBG_RTF(t << "{\\comment (startDescTable) }" << endl)
//t << "{" << endl;
//incrementIndentLevel();
- //t << Rtf_Style_Reset << Rtf_CList_DepthStyle();
+ //t << rtf_Style_Reset << rtf_CList_DepthStyle();
}
void RTFGenerator::endDescTable()
@@ -2409,12 +1846,12 @@ void RTFGenerator::endDescTable()
//decrementIndentLevel();
DBG_RTF(t << "{\\comment (endDescTable)}" << endl)
//t << "}" << endl;
- //t << Rtf_Style_Reset << styleStack.top();
+ //t << rtf_Style_Reset << styleStack.top();
}
void RTFGenerator::startDescTableTitle()
{
- //t << Rtf_BList_DepthStyle() << endl;
+ //t << rtf_BList_DepthStyle() << endl;
DBG_RTF(t << "{\\comment (startDescTableTitle) }" << endl)
startBold();
startEmphasis();
@@ -2464,57 +1901,57 @@ void RTFGenerator::decrementIndentLevel()
}
// a style for list formatted with "list continue" style
-const char * RTFGenerator::Rtf_CList_DepthStyle()
+const char * RTFGenerator::rtf_CList_DepthStyle()
{
QCString n=makeIndexName("ListContinue",m_listLevel);
- return Rtf_Style[n]->reference;
+ return rtf_Style[n]->reference;
}
// a style for list formatted as a "latext style" table of contents
-const char * RTFGenerator::Rtf_LCList_DepthStyle()
+const char * RTFGenerator::rtf_LCList_DepthStyle()
{
QCString n=makeIndexName("LatexTOC",m_listLevel);
- return Rtf_Style[n]->reference;
+ return rtf_Style[n]->reference;
}
// a style for list formatted as a "bullet" style
-const char * RTFGenerator::Rtf_BList_DepthStyle()
+const char * RTFGenerator::rtf_BList_DepthStyle()
{
QCString n=makeIndexName("ListBullet",m_listLevel);
- return Rtf_Style[n]->reference;
+ return rtf_Style[n]->reference;
}
// a style for list formatted as a "enumeration" style
-const char * RTFGenerator::Rtf_EList_DepthStyle()
+const char * RTFGenerator::rtf_EList_DepthStyle()
{
QCString n=makeIndexName("ListEnum",m_listLevel);
- return Rtf_Style[n]->reference;
+ return rtf_Style[n]->reference;
}
-const char * RTFGenerator::Rtf_DList_DepthStyle()
+const char * RTFGenerator::rtf_DList_DepthStyle()
{
QCString n=makeIndexName("DescContinue",m_listLevel);
- return Rtf_Style[n]->reference;
+ return rtf_Style[n]->reference;
}
-const char * RTFGenerator::Rtf_Code_DepthStyle()
+const char * RTFGenerator::rtf_Code_DepthStyle()
{
QCString n=makeIndexName("CodeExample",m_listLevel);
- return Rtf_Style[n]->reference;
+ return rtf_Style[n]->reference;
}
void RTFGenerator::startTextBlock(bool dense)
{
DBG_RTF(t << "{\\comment startTextBlock}" << endl)
t << "{" << endl;
- t << Rtf_Style_Reset;
+ t << rtf_Style_Reset;
if (dense) // no spacing between "paragraphs"
{
- t << Rtf_Style["DenseText"]->reference;
+ t << rtf_Style["DenseText"]->reference;
}
else // some spacing
{
- t << Rtf_Style["BodyText"]->reference;
+ t << rtf_Style["BodyText"]->reference;
}
}
@@ -2537,7 +1974,7 @@ void RTFGenerator::startMemberSubtitle()
{
DBG_RTF(t << "{\\comment startMemberSubtitle}" << endl)
t << "{" << endl;
- t << Rtf_Style_Reset << Rtf_CList_DepthStyle() << endl;
+ t << rtf_Style_Reset << rtf_CList_DepthStyle() << endl;
}
void RTFGenerator::endMemberSubtitle()
@@ -2742,7 +2179,7 @@ void RTFGenerator::endDotGraph(DotClassGraph &g)
// display the file
t << "{" << endl;
- t << Rtf_Style_Reset << endl;
+ t << rtf_Style_Reset << endl;
t << "\\par\\pard \\qc {\\field\\flddirty {\\*\\fldinst INCLUDEPICTURE ";
t << fileName << "." << Config_getEnum("DOT_IMAGE_FORMAT");
t << " \\\\d \\\\*MERGEFORMAT}{\\fldrslt IMAGE}}\\par" << endl;
@@ -2761,7 +2198,7 @@ void RTFGenerator::endInclDepGraph(DotInclDepGraph &g)
// display the file
t << "{" << endl;
- t << Rtf_Style_Reset << endl;
+ t << rtf_Style_Reset << endl;
t << "\\par\\pard \\qc {\\field\\flddirty {\\*\\fldinst INCLUDEPICTURE ";
t << fileName << "." << Config_getEnum("DOT_IMAGE_FORMAT");
t << " \\\\d \\\\*MERGEFORMAT}{\\fldrslt IMAGE}}\\par" << endl;
@@ -2870,14 +2307,14 @@ void RTFGenerator::startMemberGroupHeader(bool hasHeader)
DBG_RTF(t << "{\\comment startMemberGroupHeader}" << endl)
t << "{" << endl;
if (hasHeader) incrementIndentLevel();
- t << Rtf_Style_Reset << Rtf_Style["GroupHeader"]->reference;
+ t << rtf_Style_Reset << rtf_Style["GroupHeader"]->reference;
}
void RTFGenerator::endMemberGroupHeader()
{
DBG_RTF(t << "{\\comment endMemberGroupHeader}" << endl)
newParagraph();
- t << Rtf_Style_Reset << Rtf_CList_DepthStyle();
+ t << rtf_Style_Reset << rtf_CList_DepthStyle();
}
void RTFGenerator::startMemberGroupDocs()
@@ -2896,7 +2333,7 @@ void RTFGenerator::endMemberGroupDocs()
void RTFGenerator::startMemberGroup()
{
DBG_RTF(t << "{\\comment startMemberGroup}" << endl)
- t << Rtf_Style_Reset << Rtf_BList_DepthStyle() << endl;
+ t << rtf_Style_Reset << rtf_BList_DepthStyle() << endl;
}
void RTFGenerator::endMemberGroup(bool hasHeader)
@@ -2925,7 +2362,7 @@ void RTFGenerator::startSimpleSect(SectionTypes,const char *file,const char *anc
t << "}";
newParagraph();
incrementIndentLevel();
- t << Rtf_Style_Reset << Rtf_DList_DepthStyle();
+ t << rtf_Style_Reset << rtf_DList_DepthStyle();
}
void RTFGenerator::endSimpleSect()
@@ -2949,7 +2386,7 @@ void RTFGenerator::startParamList(ParamListTypes,const char *title)
t << "}";
newParagraph();
incrementIndentLevel();
- t << Rtf_Style_Reset << Rtf_DList_DepthStyle();
+ t << rtf_Style_Reset << rtf_DList_DepthStyle();
}
void RTFGenerator::endParamList()
diff --git a/src/rtfgen.h b/src/rtfgen.h
index 54dca5d..221135e 100644
--- a/src/rtfgen.h
+++ b/src/rtfgen.h
@@ -107,7 +107,7 @@ class RTFGenerator : public OutputGenerator
//void memberGroupSeparator() {}
void insertMemberAlign() {}
- void writeRuler(){RtfwriteRuler_thin();};
+ void writeRuler() { rtfwriteRuler_thin(); }
void writeAnchor(const char *fileName,const char *name);
void startCodeFragment();
@@ -262,12 +262,12 @@ class RTFGenerator : public OutputGenerator
RTFGenerator(const RTFGenerator &);
RTFGenerator &operator=(const RTFGenerator &);
- const char *Rtf_BList_DepthStyle();
- const char *Rtf_CList_DepthStyle();
- const char *Rtf_EList_DepthStyle();
- const char *Rtf_LCList_DepthStyle();
- const char *Rtf_DList_DepthStyle();
- const char *Rtf_Code_DepthStyle();
+ const char *rtf_BList_DepthStyle();
+ const char *rtf_CList_DepthStyle();
+ const char *rtf_EList_DepthStyle();
+ const char *rtf_LCList_DepthStyle();
+ const char *rtf_DList_DepthStyle();
+ const char *rtf_Code_DepthStyle();
void incrementIndentLevel();
void decrementIndentLevel();
int col;
@@ -280,11 +280,11 @@ class RTFGenerator : public OutputGenerator
void beginRTFDocument();
void beginRTFChapter();
void beginRTFSection();
- void RtfwriteRuler_doubleline() { t << "{\\pard\\widctlpar\\brdrb\\brdrdb\\brdrw15\\brsp20 \\adjustright \\par}" << endl; };
- void RtfwriteRuler_emboss() { t << "{\\pard\\widctlpar\\brdrb\\brdremboss\\brdrw15\\brsp20 \\adjustright \\par}" << endl; };
- void RtfwriteRuler_thick() { t << "{\\pard\\widctlpar\\brdrb\\brdrs\\brdrw75\\brsp20 \\adjustright \\par}" << endl; };
- void RtfwriteRuler_thin() { t << "{\\pard\\widctlpar\\brdrb\\brdrs\\brdrw5\\brsp20 \\adjustright \\par}" << endl; };
- void WriteRTFReference(const char *label);
+ void rtfwriteRuler_doubleline() { t << "{\\pard\\widctlpar\\brdrb\\brdrdb\\brdrw15\\brsp20 \\adjustright \\par}" << endl; };
+ void rtfwriteRuler_emboss() { t << "{\\pard\\widctlpar\\brdrb\\brdremboss\\brdrw15\\brsp20 \\adjustright \\par}" << endl; };
+ void rtfwriteRuler_thick() { t << "{\\pard\\widctlpar\\brdrb\\brdrs\\brdrw75\\brsp20 \\adjustright \\par}" << endl; };
+ void rtfwriteRuler_thin() { t << "{\\pard\\widctlpar\\brdrb\\brdrs\\brdrw5\\brsp20 \\adjustright \\par}" << endl; };
+ void writeRTFReference(const char *label);
char *getMultiByte(int c);
};
diff --git a/src/rtfstyle.cpp b/src/rtfstyle.cpp
new file mode 100644
index 0000000..017bdaf
--- /dev/null
+++ b/src/rtfstyle.cpp
@@ -0,0 +1,518 @@
+/******************************************************************************
+ *
+ *
+ *
+ *
+ * Copyright (C) 1997-2002 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+
+#include "rtfstyle.h"
+
+#include <qfile.h>
+#include <qtextstream.h>
+#include <stdlib.h>
+
+#include "message.h"
+
+
+RTFListItemInfo listItemInfo[indentLevels];
+
+QCString rtf_title;
+QCString rtf_subject;
+QCString rtf_comments;
+QCString rtf_company;
+QCString rtf_logoFilename;
+QCString rtf_author;
+QCString rtf_manager;
+QCString rtf_documentType;
+QCString rtf_documentId;
+QCString rtf_keywords;
+
+char rtf_Style_Reset[] = "\\pard\\plain ";
+
+Rtf_Style_Default rtf_Style_Default[] =
+{
+ { "Heading1",
+ "\\s1\\sb240\\sa60\\keepn\\widctlpar\\adjustright \\b\\f1\\fs36\\kerning36\\cgrid ",
+ "\\sbasedon0 \\snext0 heading 1"
+ },
+ { "Heading2",
+ "\\s2\\sb240\\sa60\\keepn\\widctlpar\\adjustright \\b\\f1\\fs28\\kerning28\\cgrid ",
+ "\\sbasedon0 \\snext0 heading 2"
+ },
+ { "Heading3",
+ "\\s3\\sb240\\sa60\\keepn\\widctlpar\\adjustright \\b\\f1\\cgrid ",
+ "\\sbasedon0 \\snext0 heading 3"
+ },
+ { "Heading4",
+ "\\s4\\sb240\\sa60\\keepn\\widctlpar\\adjustright \\b\\f1\\fs20\\cgrid ",
+ "\\sbasedon0 \\snext0 heading 4;}{\\*\\cs10 \\additive Default Paragraph Font"
+ },
+ { "Title",
+ "\\s15\\qc\\sb240\\sa60\\widctlpar\\outlinelevel0\\adjustright \\b\\f1\\fs32\\kerning28\\cgrid ",
+ "\\sbasedon0 \\snext15 Title"
+ },
+ { "SubTitle",
+ "\\s16\\qc\\sa60\\widctlpar\\outlinelevel1\\adjustright \\f1\\cgrid ",
+ "\\sbasedon0 \\snext16 Subtitle"
+ },
+ { "BodyText",
+ "\\s17\\sa60\\sb30\\widctlpar\\qj \\fs22\\cgrid ",
+ "\\sbasedon0 \\snext17 BodyText"
+ },
+ { "DenseText",
+ "\\s18\\widctlpar\\fs22\\cgrid ",
+ "\\sbasedon0 \\snext18 DenseText"
+ },
+ { "Header",
+ "\\s28\\widctlpar\\tqc\\tx4320\\tqr\\tx8640\\adjustright \\fs20\\cgrid ",
+ "\\sbasedon0 \\snext28 header"
+ },
+ { "Footer",
+ "\\s29\\widctlpar\\tqc\\tx4320\\tqr\\tx8640\\qr\\adjustright \\fs20\\cgrid ",
+ "\\sbasedon0 \\snext29 footer"
+ },
+ { "GroupHeader",
+ "\\s30\\li360\\sa60\\sb120\\keepn\\widctlpar\\adjustright \\b\\f1\\fs20\\cgrid ",
+ "\\sbasedon0 \\snext30 GroupHeader"
+ },
+ { "CodeExample0",
+ "\\s40\\li0\\widctlpar\\adjustright \\shading1000\\cbpat8 \\f2\\fs16\\cgrid ",
+ "\\sbasedon0 \\snext41 Code Example 0"
+ },
+ { "CodeExample1",
+ "\\s41\\li360\\widctlpar\\adjustright \\shading1000\\cbpat8 \\f2\\fs16\\cgrid ",
+ "\\sbasedon0 \\snext42 Code Example 1"
+ },
+ { "CodeExample2",
+ "\\s42\\li720\\widctlpar\\adjustright \\shading1000\\cbpat8 \\f2\\fs16\\cgrid ",
+ "\\sbasedon0 \\snext43 Code Example 2"
+ },
+ { "CodeExample3",
+ "\\s43\\li1080\\widctlpar\\adjustright \\shading1000\\cbpat8 \\f2\\fs16\\cgrid ",
+ "\\sbasedon0 \\snext44 Code Example 3"
+ },
+ { "CodeExample4",
+ "\\s44\\li1440\\widctlpar\\adjustright \\shading1000\\cbpat8 \\f2\\fs16\\cgrid ",
+ "\\sbasedon0 \\snext45 Code Example 4"
+ },
+ { "CodeExample5",
+ "\\s45\\li1800\\widctlpar\\adjustright \\shading1000\\cbpat8 \\f2\\fs16\\cgrid ",
+ "\\sbasedon0 \\snext46 Code Example 5"
+ },
+ { "CodeExample6",
+ "\\s46\\li2160\\widctlpar\\adjustright \\shading1000\\cbpat8 \\f2\\fs16\\cgrid ",
+ "\\sbasedon0 \\snext47 Code Example 6"
+ },
+ { "CodeExample7",
+ "\\s47\\li2520\\widctlpar\\adjustright \\shading1000\\cbpat8 \\f2\\fs16\\cgrid ",
+ "\\sbasedon0 \\snext48 Code Example 7"
+ },
+ { "CodeExample8",
+ "\\s48\\li2880\\widctlpar\\adjustright \\shading1000\\cbpat8 \\f2\\fs16\\cgrid ",
+ "\\sbasedon0 \\snext49 Code Example 8"
+ },
+ { "CodeExample9",
+ "\\s49\\li3240\\widctlpar\\adjustright \\shading1000\\cbpat8 \\f2\\fs16\\cgrid ",
+ "\\sbasedon0 \\snext49 Code Example 9"
+ },
+ { "ListContinue0",
+ "\\s50\\li0\\sa60\\sb30\\qj\\widctlpar\\qj\\adjustright \\fs20\\cgrid ",
+ "\\sbasedon0 \\snext51 List Continue 0"
+ },
+ { "ListContinue1",
+ "\\s51\\li360\\sa60\\sb30\\qj\\widctlpar\\qj\\adjustright \\fs20\\cgrid ",
+ "\\sbasedon0 \\snext52 List Continue 1"
+ },
+ { "ListContinue2",
+ "\\s52\\li720\\sa60\\sb30\\qj\\widctlpar\\qj\\adjustright \\fs20\\cgrid ",
+ "\\sbasedon0 \\snext53 List Continue 2"
+ },
+ { "ListContinue3",
+ "\\s53\\li1080\\sa60\\sb30\\qj\\widctlpar\\qj\\adjustright \\fs20\\cgrid ",
+ "\\sbasedon0 \\snext54 List Continue 3"
+ },
+ { "ListContinue4",
+ "\\s54\\li1440\\sa60\\sb30\\qj\\widctlpar\\qj\\adjustright \\fs20\\cgrid ",
+ "\\sbasedon0 \\snext55 List Continue 4"
+ },
+ { "ListContinue5",
+ "\\s55\\li1800\\sa60\\sb30\\qj\\widctlpar\\qj\\adjustright \\fs20\\cgrid ",
+ "\\sbasedon0 \\snext56 List Continue 5"
+ },
+ { "ListContinue6",
+ "\\s56\\li2160\\sa60\\sb30\\qj\\widctlpar\\qj\\adjustright \\fs20\\cgrid ",
+ "\\sbasedon0 \\snext57 List Continue 6"
+ },
+ { "ListContinue7",
+ "\\s57\\li2520\\sa60\\sb30\\qj\\widctlpar\\qj\\adjustright \\fs20\\cgrid ",
+ "\\sbasedon0 \\snext58 List Continue 7"
+ },
+ { "ListContinue8",
+ "\\s58\\li2880\\sa60\\sb30\\qj\\widctlpar\\qj\\adjustright \\fs20\\cgrid ",
+ "\\sbasedon0 \\snext59 List Continue 8"
+ },
+ { "ListContinue9",
+ "\\s59\\li3240\\sa60\\sb30\\qj\\widctlpar\\qj\\adjustright \\fs20\\cgrid ",
+ "\\sbasedon0 \\snext59 List Continue 9"
+ },
+ { "DescContinue0",
+ "\\s60\\li0\\widctlpar\\ql\\adjustright \\fs20\\cgrid ",
+ "\\sbasedon0 \\snext61 DescContinue 0"
+ },
+ { "DescContinue1",
+ "\\s61\\li360\\widctlpar\\ql\\adjustright \\fs20\\cgrid ",
+ "\\sbasedon0 \\snext62 DescContinue 1"
+ },
+ { "DescContinue2",
+ "\\s62\\li720\\widctlpar\\ql\\adjustright \\fs20\\cgrid ",
+ "\\sbasedon0 \\snext63 DescContinue 2"
+ },
+ { "DescContinue3",
+ "\\s63\\li1080\\widctlpar\\ql\\adjustright \\fs20\\cgrid ",
+ "\\sbasedon0 \\snext64 DescContinue 3"
+ },
+ { "DescContinue4",
+ "\\s64\\li1440\\widctlpar\\ql\\adjustright \\fs20\\cgrid ",
+ "\\sbasedon0 \\snext65 DescContinue 4"
+ },
+ { "DescContinue5",
+ "\\s65\\li1800\\widctlpar\\ql\\adjustright \\fs20\\cgrid ",
+ "\\sbasedon0 \\snext66 DescContinue 5"
+ },
+ { "DescContinue6",
+ "\\s66\\li2160\\widctlpar\\ql\\adjustright \\fs20\\cgrid ",
+ "\\sbasedon0 \\snext67 DescContinue 6"
+ },
+ { "DescContinue7",
+ "\\s67\\li2520\\widctlpar\\ql\\adjustright \\fs20\\cgrid ",
+ "\\sbasedon0 \\snext68 DescContinue 7"
+ },
+ { "DescContinue8",
+ "\\s68\\li2880\\widctlpar\\ql\\adjustright \\fs20\\cgrid ",
+ "\\sbasedon0 \\snext69 DescContinue 8"
+ },
+ { "DescContinue9",
+ "\\s69\\li3240\\widctlpar\\ql\\adjustright \\fs20\\cgrid ",
+ "\\sbasedon0 \\snext69 DescContinue 9"
+ },
+ { "LatexTOC0",
+ "\\s70\\li0\\sa30\\sb30\\widctlpar\\tqr\\tldot\\tx8640\\adjustright \\fs20\\cgrid ",
+ "\\sbasedon0 \\snext81 LatexTOC 0"
+ },
+ { "LatexTOC1",
+ "\\s71\\li360\\sa27\\sb27\\widctlpar\\tqr\\tldot\\tx8640\\adjustright \\fs20\\cgrid ",
+ "\\sbasedon0 \\snext82 LatexTOC 1"
+ },
+ { "LatexTOC2",
+ "\\s72\\li720\\sa24\\sb24\\widctlpar\\tqr\\tldot\\tx8640\\adjustright \\fs20\\cgrid ",
+ "\\sbasedon0 \\snext83 LatexTOC 2"
+ },
+ { "LatexTOC3",
+ "\\s73\\li1080\\sa21\\sb21\\widctlpar\\tqr\\tldot\\tx8640\\adjustright \\fs20\\cgrid ",
+ "\\sbasedon0 \\snext84 LatexTOC 3"
+ },
+ { "LatexTOC4",
+ "\\s74\\li1440\\sa18\\sb18\\widctlpar\\tqr\\tldot\\tx8640\\adjustright \\fs20\\cgrid ",
+ "\\sbasedon0 \\snext85 LatexTOC 4"
+ },
+ { "LatexTOC5",
+ "\\s75\\li1800\\sa15\\sb15\\widctlpar\\tqr\\tldot\\tx8640\\adjustright \\fs20\\cgrid ",
+ "\\sbasedon0 \\snext86 LatexTOC 5"
+ },
+ { "LatexTOC6",
+ "\\s76\\li2160\\sa12\\sb12\\widctlpar\\tqr\\tldot\\tx8640\\adjustright \\fs20\\cgrid ",
+ "\\sbasedon0 \\snext87 LatexTOC 6"
+ },
+ { "LatexTOC7",
+ "\\s77\\li2520\\sa9\\sb9\\widctlpar\\tqr\\tldot\\tx8640\\adjustright \\fs20\\cgrid ",
+ "\\sbasedon0 \\snext88 LatexTOC 7"
+ },
+ { "LatexTOC8",
+ "\\s78\\li2880\\sa6\\sb6\\widctlpar\\tqr\\tldot\\tx8640\\adjustright \\fs20\\cgrid ",
+ "\\sbasedon0 \\snext89 LatexTOC 8"
+ },
+ { "LatexTOC9",
+ "\\s79\\li3240\\sa3\\sb3\\widctlpar\\tqr\\tldot\\tx8640\\adjustright \\fs20\\cgrid ",
+ "\\sbasedon0 \\snext89 LatexTOC 9"
+ },
+ { "ListBullet0",
+ "\\s80\\fi-360\\li360\\widctlpar\\jclisttab\\tx360{\\*\\pn \\pnlvlbody\\ilvl0\\ls1\\pnrnot0\\pndec }\\ls1\\adjustright \\fs20\\cgrid ",
+ "\\sbasedon0 \\snext81 \\sautoupd List Bullet 0"
+ },
+ { "ListBullet1",
+ "\\s81\\fi-360\\li720\\widctlpar\\jclisttab\\tx720{\\*\\pn \\pnlvlbody\\ilvl0\\ls2\\pnrnot0\\pndec }\\ls2\\adjustright \\fs20\\cgrid ",
+ "\\sbasedon0 \\snext82 \\sautoupd List Bullet 1"
+ },
+ { "ListBullet2",
+ "\\s82\\fi-360\\li1080\\widctlpar\\jclisttab\\tx1080{\\*\\pn \\pnlvlbody\\ilvl0\\ls3\\pnrnot0\\pndec }\\ls3\\adjustright \\fs20\\cgrid ",
+ "\\sbasedon0 \\snext83 \\sautoupd List Bullet 2"
+ },
+ { "ListBullet3",
+ "\\s83\\fi-360\\li1440\\widctlpar\\jclisttab\\tx1440{\\*\\pn \\pnlvlbody\\ilvl0\\ls4\\pnrnot0\\pndec }\\ls4\\adjustright \\fs20\\cgrid ",
+ "\\sbasedon0 \\snext84 \\sautoupd List Bullet 3"
+ },
+ { "ListBullet4",
+ "\\s84\\fi-360\\li1800\\widctlpar\\jclisttab\\tx1800{\\*\\pn \\pnlvlbody\\ilvl0\\ls5\\pnrnot0\\pndec }\\ls5\\adjustright \\fs20\\cgrid ",
+ "\\sbasedon0 \\snext85 \\sautoupd List Bullet 4"
+ },
+ { "ListBullet5",
+ "\\s85\\fi-360\\li2160\\widctlpar\\jclisttab\\tx2160{\\*\\pn \\pnlvlbody\\ilvl0\\ls6\\pnrnot0\\pndec }\\ls6\\adjustright \\fs20\\cgrid ",
+ "\\sbasedon0 \\snext86 \\sautoupd List Bullet 5"
+ },
+ { "ListBullet6",
+ "\\s86\\fi-360\\li2520\\widctlpar\\jclisttab\\tx2520{\\*\\pn \\pnlvlbody\\ilvl0\\ls7\\pnrnot0\\pndec }\\ls7\\adjustright \\fs20\\cgrid ",
+ "\\sbasedon0 \\snext87 \\sautoupd List Bullet 6"
+ },
+ { "ListBullet7",
+ "\\s87\\fi-360\\li2880\\widctlpar\\jclisttab\\tx2880{\\*\\pn \\pnlvlbody\\ilvl0\\ls8\\pnrnot0\\pndec }\\ls8\\adjustright \\fs20\\cgrid ",
+ "\\sbasedon0 \\snext88 \\sautoupd List Bullet 7"
+ },
+ { "ListBullet8",
+ "\\s88\\fi-360\\li3240\\widctlpar\\jclisttab\\tx3240{\\*\\pn \\pnlvlbody\\ilvl0\\ls9\\pnrnot0\\pndec }\\ls9\\adjustright \\fs20\\cgrid ",
+ "\\sbasedon0 \\snext89 \\sautoupd List Bullet 8"
+ },
+ { "ListBullet9",
+ "\\s89\\fi-360\\li3600\\widctlpar\\jclisttab\\tx3600{\\*\\pn \\pnlvlbody\\ilvl0\\ls10\\pnrnot0\\pndec }\\ls10\\adjustright \\fs20\\cgrid ",
+ "\\sbasedon0 \\snext89 \\sautoupd List Bullet 9"
+ },
+ { "ListEnum0",
+ "\\s90\\fi-360\\li360\\widctlpar\\fs20\\cgrid ",
+ "\\sbasedon0 \\snext91 \\sautoupd List Enum 0"
+ },
+ { "ListEnum1",
+ "\\s91\\fi-360\\li720\\widctlpar\\fs20\\cgrid ",
+ "\\sbasedon0 \\snext92 \\sautoupd List Enum 1"
+ },
+ { "ListEnum2",
+ "\\s92\\fi-360\\li1080\\widctlpar\\fs20\\cgrid ",
+ "\\sbasedon0 \\snext93 \\sautoupd List Enum 2"
+ },
+ { "ListEnum3",
+ "\\s93\\fi-360\\li1440\\widctlpar\\fs20\\cgrid ",
+ "\\sbasedon0 \\snext94 \\sautoupd List Enum 3"
+ },
+ { "ListEnum4",
+ "\\s94\\fi-360\\li1800\\widctlpar\\fs20\\cgrid ",
+ "\\sbasedon0 \\snext95 \\sautoupd List Enum 4"
+ },
+ { "ListEnum5",
+ "\\s95\\fi-360\\li2160\\widctlpar\\fs20\\cgrid ",
+ "\\sbasedon0 \\snext96 \\sautoupd List Enum 5"
+ },
+ { "ListEnum6",
+ "\\s96\\fi-360\\li2520\\widctlpar\\fs20\\cgrid ",
+ "\\sbasedon0 \\snext96 \\sautoupd List Enum 5"
+ },
+ { "ListEnum7",
+ "\\s97\\fi-360\\li2880\\widctlpar\\fs20\\cgrid ",
+ "\\sbasedon0 \\snext98 \\sautoupd List Enum 7"
+ },
+ { "ListEnum8",
+ "\\s98\\fi-360\\li3240\\widctlpar\\fs20\\cgrid ",
+ "\\sbasedon0 \\snext99 \\sautoupd List Enum 8"
+ },
+ { "ListEnum9",
+ "\\s99\\fi-360\\li3600\\widctlpar\\fs20\\cgrid ",
+ "\\sbasedon0 \\snext99 \\sautoupd List Enum 9"
+ },
+ { 0,
+ 0,
+ 0
+ }
+};
+
+const QRegExp StyleData::s_clause("\\\\s[0-9]+\\s*");
+
+StyleData::StyleData(const char* reference, const char* definition)
+{
+ int start = s_clause.match(reference); ASSERT(start >= 0);
+ reference += start;
+ index = (int)atol(reference + 2); ASSERT(index > 0);
+
+ ASSERT(reference != 0);
+ size_t size = 1 + strlen(reference);
+ memcpy(this->reference = new char[size], reference, size);
+
+ ASSERT(definition != 0);
+ size = 1 + strlen(definition);
+ memcpy(this->definition = new char[size], definition, size);
+}
+
+StyleData::~StyleData()
+{
+ delete[] reference;
+ delete[] definition;
+}
+
+bool StyleData::setStyle(const char* s, const char* styleName)
+{
+ static const QRegExp subgroup("^{[^}]*}\\s*");
+ static const QRegExp any_clause("^\\\\[a-z][a-z0-9-]*\\s*");
+
+ int len = 0; // length of a particular RTF formatting control
+ int ref_len = 0; // length of the whole formatting section of a style
+ int start = s_clause.match(s, 0, &len);
+ if (start < 0)
+ {
+ err("Style sheet '%s' contains no '\\s' clause.\n{%s}\n", styleName, s);
+ return FALSE;
+ }
+ s += start;
+ index = (int)atol(s + 2); ASSERT(index > 0);
+
+ // search for the end of pure formatting codes
+ const char* end = s + len;
+ ref_len = len;
+ bool haveNewDefinition = TRUE;
+ for(;;)
+ {
+ if (*end == '{')
+ {
+ // subgroups are used for \\additive
+ if (0 != subgroup.match(end, 0, &len))
+ break;
+ else
+ {
+ end += len;
+ ref_len += len;
+ }
+ }
+ else if (*end == '\\')
+ {
+ if (0 == strncmp(end, "\\snext", 6))
+ break;
+ if (0 == strncmp(end, "\\sbasedon", 9))
+ break;
+ if (0 != any_clause.match(end, 0, &len))
+ break;
+ end += len;
+ ref_len += len;
+ }
+ else if (*end == 0)
+ { // no style-definition part, keep default value
+ haveNewDefinition = FALSE;
+ break;
+ }
+ else // plain name without leading \\snext
+ break;
+ }
+ delete[] reference;
+ reference = new char[ref_len + 1];
+ memcpy(reference, s, ref_len);
+ reference[ref_len] = 0;
+ if (haveNewDefinition)
+ {
+ delete[] definition;
+ size_t size = 1 + strlen(end);
+ definition = new char[size];
+ memcpy(definition, end, size);
+ }
+ return TRUE;
+}
+
+void loadStylesheet(const char *name, QDict<StyleData>& dict)
+{
+ QFile file(name);
+ if (!file.open(IO_ReadOnly))
+ {
+ err("Can't open RTF style sheet file %s. Using defaults.\n",name);
+ return;
+ }
+ msg("Loading RTF style sheet %s...\n",name);
+
+ static const QRegExp separator("[ \t]*=[ \t]*");
+ uint lineNr=1;
+ QTextStream t(&file);
+#if QT_VERSION >= 200
+ t.setEncoding(QTextStream::Latin1);
+#endif
+
+ while (!t.eof())
+ {
+ QCString s(4096); // string buffer of max line length
+ s = t.readLine().stripWhiteSpace();
+ if (s.length()==0 || s.at(0)=='#') continue; // skip blanks & comments
+ int sepLength;
+ int sepStart = separator.match(s,0,&sepLength);
+ if (sepStart<=0) // no valid assignment statement
+ {
+ warn(name,lineNr,"Assignment of style sheet name expected!\n");
+ continue;
+ }
+ QCString key=s.left(sepStart);
+ if (dict[key]==0) // not a valid style sheet name
+ {
+ warn(name,lineNr,"Invalid style sheet name %s ignored.\n",key.data());
+ continue;
+ }
+ StyleData* styleData = dict.find(key);
+ if (styleData == 0)
+ {
+ warn(name,lineNr,"Unknown style sheet name %s ignored.\n",key.data());
+ continue;
+ }
+ s+=" "; // add command separator
+ styleData->setStyle(s.data() + sepStart + sepLength, key.data());
+ lineNr++;
+ }
+}
+
+QDict<StyleData> rtf_Style(257);
+
+void loadExtensions(const char *name)
+{
+ QFile file(name);
+ if (!file.open(IO_ReadOnly))
+ {
+ err("Can't open RTF extensions file %s. Using defaults.\n",name);
+ return;
+ }
+ msg("Loading RTF extensions %s...\n",name);
+
+ static const QRegExp separator("[ \t]*=[ \t]*");
+ uint lineNr=1;
+ QTextStream t(&file);
+#if QT_VERSION >= 200
+ t.setEncoding(QTextStream::Latin1);
+#endif
+
+ while (!t.eof())
+ {
+ QCString s(4096); // string buffer of max line length
+ s = t.readLine().stripWhiteSpace();
+ if (s.length()==0 || s.at(0)=='#') continue; // skip blanks & comments
+ int sepLength;
+ int sepStart = separator.match(s,0,&sepLength);
+ if (sepStart<=0) // no valid assignment statement
+ {
+ warn(name,lineNr,"Assignment of extension field expected!\n");
+ continue;
+ }
+ QCString key=s.left(sepStart);
+ QCString data=s.data() + sepStart + sepLength;
+
+ if (key == "Title") rtf_title = data.data();
+ if (key == "Subject") rtf_subject = data.data();
+ if (key == "Comments") rtf_comments = data.data();
+ if (key == "Company") rtf_company = data.data();
+ if (key == "LogoFilename") rtf_logoFilename = data.data();
+ if (key == "Author") rtf_author = data.data();
+ if (key == "Manager") rtf_manager = data.data();
+ if (key == "DocumentType") rtf_documentType = data.data();
+ if (key == "DocumentId") rtf_documentId = data.data();
+ if (key == "Keywords") rtf_keywords = data.data();
+ lineNr++;
+ }
+}
+
diff --git a/src/rtfstyle.h b/src/rtfstyle.h
new file mode 100644
index 0000000..1fe353c
--- /dev/null
+++ b/src/rtfstyle.h
@@ -0,0 +1,80 @@
+/******************************************************************************
+ *
+ *
+ *
+ *
+ * Copyright (C) 1997-2002 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+
+#ifndef RTFSTYLE_H
+#define RTFSTYLE_H
+
+#include "qtbc.h"
+#include <qregexp.h>
+#include <qdict.h>
+
+extern QCString rtf_title;
+extern QCString rtf_subject;
+extern QCString rtf_comments;
+extern QCString rtf_company;
+extern QCString rtf_logoFilename;
+extern QCString rtf_author;
+extern QCString rtf_manager;
+extern QCString rtf_documentType;
+extern QCString rtf_documentId;
+extern QCString rtf_keywords;
+
+struct RTFListItemInfo
+{
+ bool isEnum;
+ int number;
+};
+
+const int indentLevels = 10;
+
+extern RTFListItemInfo listItemInfo[indentLevels];
+
+struct Rtf_Style_Default
+{
+ const char *name;
+ const char *reference;
+ const char *definition;
+};
+
+extern char rtf_Style_Reset[];
+extern Rtf_Style_Default rtf_Style_Default[];
+
+struct StyleData
+{
+ // elements of this type are stored in dictionary Rtf_Style
+ //
+ // to define a tag in the header reference + definition is required
+ // to use a tag in the body of the document only reference is required
+
+ unsigned index; // index in style-sheet, i.e. number in s-clause
+ char* reference; // everything required to apply the style
+ char* definition; // aditional tags like \snext and style name
+
+ StyleData(const char* reference, const char* definition);
+ ~StyleData();
+ bool setStyle(const char* s, const char* styleName);
+
+ static const QRegExp s_clause;
+};
+
+extern QDict<StyleData> rtf_Style;
+
+void loadExtensions(const char *name);
+void loadStylesheet(const char *name, QDict<StyleData>& dict);
+
+#endif
diff --git a/src/scanner.l b/src/scanner.l
index 17dd7be..c2710e4 100644
--- a/src/scanner.l
+++ b/src/scanner.l
@@ -282,6 +282,12 @@ static void addSection()
{
//printf("New section pageName=%s label=%s title=%s\n",
// current->name.data(),sectionLabel.data(),sectionTitle.data());
+ if (current->name.isEmpty() || current->section != Entry::PAGEDOC_SEC)
+ {
+ warn(yyFileName,yyLineNr,"Warning: found section or anchor with label `%s' "
+ "outside of \\page context!\n",sectionLabel.data());
+ return;
+ }
if (sectionLabel.isEmpty()) return;
if (Doxygen::sectionDict.find(sectionLabel)==0)
{
@@ -3343,7 +3349,9 @@ CHARLIT (("'"\\[0-7]{1,3}"'")|("'"\\."'")|("'"[^'\\\n]{1,4}"'"))
current->name = yytext;
newDocState();
}
-<NameSpaceDocArg1>"\\"{B}*"\n" { yyLineNr++; }
+<NameSpaceDocArg1>"\\"{B}*"\n" {
+ yyLineNr++;
+ }
<NameSpaceDocArg1>"\n" {
warn(yyFileName,yyLineNr,
"Warning: missing argument after "
@@ -3355,7 +3363,9 @@ CHARLIT (("'"\\[0-7]{1,3}"'")|("'"\\."'")|("'"[^'\\\n]{1,4}"'"))
current->name = yytext;
newDocState();
}
-<PackageDocArg1>"\\"{B}*"\n" { yyLineNr++; }
+<PackageDocArg1>"\\"{B}*"\n" {
+ yyLineNr++;
+ }
<PackageDocArg1>"\n" {
warn(yyFileName,yyLineNr,
"Warning: missing argument after "
@@ -3376,7 +3386,9 @@ CHARLIT (("'"\\[0-7]{1,3}"'")|("'"\\."'")|("'"[^'\\\n]{1,4}"'"))
prependScope();
BEGIN( ClassDocArg2 );
}
-<ClassDocArg1>"\\"{B}*"\n" { yyLineNr++; }
+<ClassDocArg1>"\\"{B}*"\n" {
+ yyLineNr++;
+ }
<ClassDocArg1>"\n" {
warn(yyFileName,yyLineNr,
"Warning: missing argument after "
@@ -3394,7 +3406,8 @@ CHARLIT (("'"\\[0-7]{1,3}"'")|("'"\\."'")|("'"[^'\\\n]{1,4}"'"))
current->name=current->name.left(current->name.length()-5);
BEGIN(GroupDocArg2);
}
-<GroupDocArg1>"\\"{B}*"\n" { yyLineNr++; }
+<GroupDocArg1>"\\"{B}*"\n" { yyLineNr++;
+ }
<GroupDocArg1>"\n" {
warn(yyFileName,yyLineNr,
"Warning: missing group name after %s",
@@ -3408,7 +3421,8 @@ CHARLIT (("'"\\[0-7]{1,3}"'")|("'"\\."'")|("'"[^'\\\n]{1,4}"'"))
yyLineNr--;
unput('/');unput('*');unput('\n');
}
-<GroupDocArg2>"\\"{B}*"\n" { yyLineNr++; }
+<GroupDocArg2>"\\"{B}*"\n" { yyLineNr++;
+ }
<GroupDocArg2>[^\n\*]+ {
current->type += yytext;
current->type = current->type.stripWhiteSpace();
@@ -3428,7 +3442,8 @@ CHARLIT (("'"\\[0-7]{1,3}"'")|("'"\\."'")|("'"[^'\\\n]{1,4}"'"))
current->includeFile = stripQuotes(yytext);
BEGIN( ClassDocArg3 );
}
-<ClassDocArg2>"\\"{B}*"\n" { yyLineNr++; }
+<ClassDocArg2>"\\"{B}*"\n" { yyLineNr++;
+ }
<ClassDocArg2>"\n" { yyLineNr++;
newDocState();
}
@@ -3437,7 +3452,8 @@ CHARLIT (("'"\\[0-7]{1,3}"'")|("'"\\."'")|("'"[^'\\\n]{1,4}"'"))
current->includeName = yytext;
newDocState();
}
-<ClassDocArg3>"\\"{B}*"\n" { yyLineNr++; }
+<ClassDocArg3>"\\"{B}*"\n" { yyLineNr++;
+ }
<ClassDocArg3>"\n" { yyLineNr++;
newDocState();
}
@@ -3445,7 +3461,8 @@ CHARLIT (("'"\\[0-7]{1,3}"'")|("'"\\."'")|("'"[^'\\\n]{1,4}"'"))
current->name = stripQuotes(yytext);
newDocState();
}
-<FileDocArg1>"\\"{B}*"\n" { yyLineNr++; }
+<FileDocArg1>"\\"{B}*"\n" { yyLineNr++;
+ }
<FileDocArg1>"\n" {
current->name = yyFileName;
yyLineNr++;
@@ -3455,7 +3472,9 @@ CHARLIT (("'"\\[0-7]{1,3}"'")|("'"\\."'")|("'"[^'\\\n]{1,4}"'"))
current->name = stripQuotes(yytext);
BEGIN( PageDocArg2 );
}
-<PageDocArg1>"\\"{B}*"\n" { yyLineNr++; }
+<PageDocArg1>"\\"{B}*"\n" { yyLineNr++;
+ current->doc+="\n";
+ }
<PageDocArg1>"\n" {
warn(yyFileName,yyLineNr,
"Warning: missing argument after "
@@ -3476,11 +3495,14 @@ CHARLIT (("'"\\[0-7]{1,3}"'")|("'"\\."'")|("'"[^'\\\n]{1,4}"'"))
prependScope();
newDocState();
}
-<EnumDocArg1>"\\"{B}*"\n" { yyLineNr++; }
+<EnumDocArg1>"\\"{B}*"\n" { yyLineNr++;
+ current->doc+="\n";
+ }
<EnumDocArg1>"\n" {
warn(yyFileName,yyLineNr,
"Warning: missing argument after \\enum."
);
+ current->doc+="\n";
yyLineNr++;
BEGIN( Doc );
}
@@ -3504,6 +3526,7 @@ CHARLIT (("'"\\[0-7]{1,3}"'")|("'"\\."'")|("'"[^'\\\n]{1,4}"'"))
}
<GroupHeader>\n {
yyLineNr++;
+ current->doc+="\n";
//printf("Found memberGroup=`%s'\n",memberGroupHeader.data());
startGroupInDoc();
newDocState();
@@ -4255,7 +4278,7 @@ CHARLIT (("'"\\[0-7]{1,3}"'")|("'"\\."'")|("'"[^'\\\n]{1,4}"'"))
}
<Doc,JavaDoc,ClassDoc,PageDoc,ExampleDoc,ReadFormulaShort,ReadFormulaLong,ClassDocBrief,AfterDoc,AfterDocBrief>^{B}*(("//"{B}*)?)"*"+/[^/]
<Doc,JavaDoc,ClassDoc,PageDoc,ExampleDoc,ReadFormulaShort,ReadFormulaLong,ClassDocBrief,AfterDoc,AfterDocBrief>^{B}*(("//"{B}*)?)"*"+{B}+ {
- current->doc+=' ';
+ current->doc+=' ';
}
<Doc,ClassDoc,PageDoc,ExampleDoc,AfterDoc>"\\"[a-z_A-Z][a-z_A-Z0-9]*[\\] { // directory type of text
diff --git a/src/util.cpp b/src/util.cpp
index 9afb8ac..4efc7b9 100644
--- a/src/util.cpp
+++ b/src/util.cpp
@@ -2136,12 +2136,13 @@ bool getDefs(const QCString &scName,const QCString &memberName,
}
}
}
+ //printf("found %d candidate members\n",members.count());
if (members.count()!=1 && !strcmp(args,"()"))
{
// no exact match found, but if args="()" an arbitrary
// member will do
md=mn->last();
- while (md)
+ while (md && md->isLinkable())
{
//printf("Found member `%s'\n",md->name().data());
//printf("member is linkable md->name()=`%s'\n",md->name().data());
@@ -2363,6 +2364,7 @@ bool resolveRef(/* in */ const char *scName,
GroupDef *gd = 0;
// check if nameStr is a member or global.
+ //printf("getDefs(scope=%s,name=%s,args=%s\n",scopeStr.data(),nameStr.data(),argsStr.data());
if (getDefs(scopeStr,nameStr,argsStr,
md,cd,fd,nd,gd,
scopePos==0 && !memberScopeFirst,
@@ -2378,6 +2380,8 @@ bool resolveRef(/* in */ const char *scName,
else if (fd) *resContext=fd;
else if (gd) *resContext=gd;
else { *resContext=0; *resMember=0; return FALSE; }
+ //printf("member=%s (md=%p) anchor=%s linkable()=%d context=%s\n",
+ // md->name().data(),md,md->anchor().data(),md->isLinkable(),(*resContext)->name().data());
return TRUE;
}
else if (inSeeBlock && !nameStr.isEmpty() && (gd=Doxygen::groupSDict[nameStr]))
@@ -2539,6 +2543,7 @@ bool resolveLink(/* in */ const char *scName,
bool generateLink(OutputDocInterface &od,const char *clName,
const char *lr,bool inSeeBlock,const char *lt)
{
+ //printf("generateLink(clName=%s,lr=%s,lr=%s)\n",clName,lr,lt);
Definition *compound;
PageInfo *pageInfo;
QCString anchor,linkText=lt;
@@ -3386,7 +3391,7 @@ found:
//----------------------------------------------------------------------------
-void addRelatedPage(const char *name,const QCString &ptitle,
+PageInfo *addRelatedPage(const char *name,const QCString &ptitle,
const QCString &doc,QList<QCString> *anchors,
const char *fileName,int startLine,
const QList<ListItemInfo> *sli,
@@ -3474,6 +3479,7 @@ void addRelatedPage(const char *name,const QCString &ptitle,
Doxygen::sectionDict.insert(pageName,si);
}
}
+ return pi;
}
//----------------------------------------------------------------------------
@@ -3902,3 +3908,47 @@ void filterLatexString(QTextStream &t,const char *str,
}
}
}
+
+
+QCString rtfFormatBmkStr(const char *name)
+{
+ static QCString g_nextTag( "AAAAAAAAAA" );
+ static QDict<QCString> g_tagDict( 5003 );
+
+ g_tagDict.setAutoDelete(TRUE);
+
+ // To overcome the 40-character tag limitation, we
+ // substitute a short arbitrary string for the name
+ // supplied, and keep track of the correspondence
+ // between names and strings.
+ QCString key( name );
+ QCString* tag = g_tagDict.find( key );
+ if ( !tag )
+ {
+ // This particular name has not yet been added
+ // to the list. Add it, associating it with the
+ // next tag value, and increment the next tag.
+ tag = new QCString( g_nextTag.copy() ); // Make sure to use a deep copy!
+ g_tagDict.insert( key, tag );
+
+ // This is the increment part
+ char* nxtTag = g_nextTag.data() + g_nextTag.length() - 1;
+ for ( unsigned int i = 0; i < g_nextTag.length(); ++i, --nxtTag )
+ {
+ if ( ( ++(*nxtTag) ) > 'Z' )
+ {
+ (*nxtTag) = 'A';
+ }
+ else
+ {
+ // Since there was no carry, we can stop now
+ break;
+ }
+ }
+ }
+
+ return *tag;
+}
+
+
+
diff --git a/src/util.h b/src/util.h
index ee9e9f5..f20d138 100644
--- a/src/util.h
+++ b/src/util.h
@@ -190,7 +190,7 @@ int getScopeFragment(const QCString &s,int p,int *l);
int filterCRLF(char *buf,int len);
void addRefItem(const QList<ListItemInfo> *sli,const char *prefix,
const char *name,const char *title,const char *args=0);
-void addRelatedPage(const char *name,const QCString &ptitle,
+PageInfo *addRelatedPage(const char *name,const QCString &ptitle,
const QCString &doc,QList<QCString> *anchors,
const char *fileName,int startLine,
const QList<ListItemInfo> *sli,
@@ -201,6 +201,7 @@ QCString escapeCharsInString(const char *name,bool allowDots);
void addGroupListToTitle(OutputList &ol,Definition *d);
void filterLatexString(QTextStream &t,const char *str,
bool insideTabbing=FALSE,bool insidePre=FALSE);
+QCString rtfFormatBmkStr(const char *name);
#endif