Commit 0a37457c authored by dimitri's avatar dimitri

Doxygen-1.2.17-20020901

parent 55d2ef84
DOXYGEN Version 1.2.17-20020825 DOXYGEN Version 1.2.17-20020901
Please read the installation section of the manual for instructions. Please read the installation section of the manual for instructions.
-------- --------
Dimitri van Heesch (25 August 2002) Dimitri van Heesch (01 September 2002)
DOXYGEN Version 1.2.17_20020825 DOXYGEN Version 1.2.17_20020901
Please read INSTALL for compilation instructions. Please read INSTALL for compilation instructions.
...@@ -17,4 +17,4 @@ to subscribe to the lists or to visit the archives. ...@@ -17,4 +17,4 @@ to subscribe to the lists or to visit the archives.
Enjoy, Enjoy,
Dimitri van Heesch (dimitri@stack.nl) (25 August 2002) Dimitri van Heesch (dimitri@stack.nl) (01 September 2002)
1.2.17-20020825 1.2.17-20020901
...@@ -1039,7 +1039,11 @@ ALIASES = "english=\if english" \ ...@@ -1039,7 +1039,11 @@ ALIASES = "english=\if english" \
\addindex \\anchor \addindex \\anchor
This command places an invisible, named anchor into the documentation 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". \sa section \ref cmdref "\\ref".
......
Summary: A documentation system for C/C++. Summary: A documentation system for C/C++.
Name: doxygen Name: doxygen
Version: 1.2.17_20020825 Version: 1.2.17_20020901
Release: 1 Release: 1
Epoch: 1 Epoch: 1
Source0: ftp://ftp.stack.nl/pub/users/dimitri/%{name}-%{version}.src.tar.gz Source0: ftp://ftp.stack.nl/pub/users/dimitri/%{name}-%{version}.src.tar.gz
......
...@@ -164,6 +164,9 @@ ID [a-z_A-Z][a-z_A-Z0-9]* ...@@ -164,6 +164,9 @@ ID [a-z_A-Z][a-z_A-Z0-9]*
g_curArgTypeName+=g_curArgName; g_curArgTypeName+=g_curArgName;
BEGIN( ReadFuncArgType ); BEGIN( ReadFuncArgType );
} }
<ReadFuncArgType>"<="|">="|"->"|">>"|"<<" { // handle operators in defargs
g_curArgTypeName+=yytext;
}
<ReadFuncArgType,ReadFuncArgDef>[({<] { <ReadFuncArgType,ReadFuncArgDef>[({<] {
if (YY_START==ReadFuncArgType) if (YY_START==ReadFuncArgType)
{ {
...@@ -175,10 +178,10 @@ ID [a-z_A-Z][a-z_A-Z0-9]* ...@@ -175,10 +178,10 @@ ID [a-z_A-Z][a-z_A-Z0-9]*
g_curArgDefValue+=*yytext; g_curArgDefValue+=*yytext;
g_copyArgValue=&g_curArgDefValue; g_copyArgValue=&g_curArgDefValue;
} }
g_readArgContext = YY_START; g_readArgContext = YY_START;
if (*yytext=='(') if (*yytext=='(')
{ {
g_argRoundCount=0; g_argRoundCount=0;
BEGIN( CopyArgRound ); BEGIN( CopyArgRound );
} }
else if (*yytext=='{') else if (*yytext=='{')
...@@ -249,67 +252,74 @@ ID [a-z_A-Z][a-z_A-Z0-9]* ...@@ -249,67 +252,74 @@ ID [a-z_A-Z][a-z_A-Z0-9]*
BEGIN( ReadDocBlock ); BEGIN( ReadDocBlock );
} }
<ReadFuncArgType,ReadFuncArgDef>[,)>] { <ReadFuncArgType,ReadFuncArgDef>[,)>] {
g_curArgTypeName=removeRedundantWhiteSpace(g_curArgTypeName); if (*yytext==')' && g_curArgTypeName.stripWhiteSpace().isEmpty())
g_curArgDefValue=g_curArgDefValue.stripWhiteSpace(); {
//printf("curArgType=`%s' curArgDefVal=`%s'\n",g_curArgTypeName.data(),g_curArgDefValue.data()); g_curArgTypeName+=*yytext;
int l=g_curArgTypeName.length(); }
if (l>0) else
{ {
int i=l-1; g_curArgTypeName=removeRedundantWhiteSpace(g_curArgTypeName);
while (i>=0 && (isspace(g_curArgTypeName.at(i)) || g_curArgTypeName.at(i)=='.')) i--; g_curArgDefValue=g_curArgDefValue.stripWhiteSpace();
while (i>=0 && isId(g_curArgTypeName.at(i))) i--; //printf("curArgType=`%s' curArgDefVal=`%s'\n",g_curArgTypeName.data(),g_curArgDefValue.data());
//printf("g_curArgTypeName=`%s' i=%d\n",g_curArgTypeName.data(),i); int l=g_curArgTypeName.length();
Argument *a = new Argument; if (l>0)
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
{ {
int bi=g_curArgTypeName.find('('); int i=l-1;
int fi=bi-1; while (i>=0 && (isspace(g_curArgTypeName.at(i)) || g_curArgTypeName.at(i)=='.')) i--;
//printf("func arg fi=%d\n",fi); while (i>=0 && isId(g_curArgTypeName.at(i))) i--;
while (fi>=0 && isId(g_curArgTypeName.at(fi))) fi--; //printf("g_curArgTypeName=`%s' i=%d\n",g_curArgTypeName.data(),i);
if (fi>=0) 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); int bi=g_curArgTypeName.find('(');
a->name = g_curArgTypeName.mid(fi+1,bi-fi-1); int fi=bi-1;
a->array = g_curArgTypeName.right(l-bi); //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)!=':') g_curArgAttrib.resize(0);
{ // type contains a name g_curArgTypeName.resize(0);
a->type = removeRedundantWhiteSpace(g_curArgTypeName.left(i+1)); g_curArgDefValue.resize(0);
a->name = g_curArgTypeName.right(l-i-1); 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} { <ReadFuncArgType,ReadFuncArgPtr>{ID} {
......
...@@ -1130,8 +1130,10 @@ static int yyread(char *buf,int max_size) ...@@ -1130,8 +1130,10 @@ static int yyread(char *buf,int max_size)
return c; return c;
} }
//ATTR ((({BN}+[^\>]+)/">")?) //LINKMASK [a-z_A-Z0-9:#.,~&*/\[\]<>()\-\+]+({B}*("const"|"volatile"))?
//ATTR ((({BN}+[^\>]+)/">")?)
%} %}
CMD ("\\"|"@") CMD ("\\"|"@")
BN [ \t\n\r] BN [ \t\n\r]
BL [ \t\r]*"\n" BL [ \t\r]*"\n"
...@@ -1200,7 +1202,7 @@ OPARG "("[a-z_A-Z0-9,\<\> \t\*\&]*")" ...@@ -1200,7 +1202,7 @@ OPARG "("[a-z_A-Z0-9,\<\> \t\*\&]*")"
OPNORM {OPNEW}|{OPDEL}|"+"|"-"|"*"|"/"|"%"|"^"|"&"|"|"|"~"|"!"|"="|"<"|">"|"+="|"-="|"*="|"/="|"%="|"^="|"&="|"|="|"<<"|">>"|"<<="|">>="|"=="|"!="|"<="|">="|"&&"|"||"|"++"|"--"|","|"->*"|"->"|"[]"|"()" OPNORM {OPNEW}|{OPDEL}|"+"|"-"|"*"|"/"|"%"|"^"|"&"|"|"|"~"|"!"|"="|"<"|">"|"+="|"-="|"*="|"/="|"%="|"^="|"&="|"|="|"<<"|">>"|"<<="|">>="|"=="|"!="|"<="|">="|"&&"|"||"|"++"|"--"|","|"->*"|"->"|"[]"|"()"
OPCAST {B}+[^(\r\n.,]+ OPCAST {B}+[^(\r\n.,]+
OPMASK ({B}*{OPNORM}({OPARG}?))|({OPCAST}{OPARG}) 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 %option noyywrap
...@@ -1785,7 +1787,7 @@ LINKMASK [a-z_A-Z0-9:#.,~&*/\[\]<>()\-\+]+({B}*("const"|"volatile"))? ...@@ -1785,7 +1787,7 @@ LINKMASK [a-z_A-Z0-9:#.,~&*/\[\]<>()\-\+]+({B}*("const"|"volatile"))?
if (inBlock()) endBlock(); if (inBlock()) endBlock();
inReturnBlock=TRUE; inReturnBlock=TRUE;
currentListIndent.push("P"); currentListIndent.push("P");
outDoc->startSimpleSect(BaseOutputDocInterface::Return,0,0,theTranslator->trReturns()+":"); outDoc->startSimpleSect(BaseOutputDocInterface::Return,0,0,theTranslator->trReturns()+": ");
outDoc->writeDescItem(); outDoc->writeDescItem();
} }
} }
......
...@@ -1392,6 +1392,7 @@ QCString DocLink::parse(bool isJavaLink) ...@@ -1392,6 +1392,7 @@ QCString DocLink::parse(bool isJavaLink)
printf("Error: Unsupported symbol %s found at line %d\n", printf("Error: Unsupported symbol %s found at line %d\n",
g_token->name.data(),doctokenizerYYlineno); g_token->name.data(),doctokenizerYYlineno);
break; break;
case TK_LNKWORD:
case TK_WORD: case TK_WORD:
if (isJavaLink) // special case to detect closing } if (isJavaLink) // special case to detect closing }
{ {
...@@ -3894,7 +3895,7 @@ void DocRoot::parse() ...@@ -3894,7 +3895,7 @@ void DocRoot::parse()
DocNode *validatingParseDoc(const char *fileName,int startLine, DocNode *validatingParseDoc(const char *fileName,int startLine,
const char *context,const char *input) 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); printf("========== validating %s at line %d\n",fileName,startLine);
g_token = new TokenInfo; g_token = new TokenInfo;
......
...@@ -1793,8 +1793,10 @@ void writeDotGraphFromFile(const char *inFile,const char *outDir, ...@@ -1793,8 +1793,10 @@ void writeDotGraphFromFile(const char *inFile,const char *outDir,
QCString imgName = (QCString)outFile+"."+imgExt; QCString imgName = (QCString)outFile+"."+imgExt;
if (format==BITMAP) if (format==BITMAP)
{ {
dotArgs.sprintf("-T%s \"%s\" -o \"%s\"",imgExt.data(), dotArgs.sprintf("-T%s \"%s\" -o \"%s\"",
inFile,imgName.data()); imgExt.data(),
inFile,
imgName.data());
} }
else // format==EPS else // format==EPS
{ {
......
...@@ -200,11 +200,38 @@ static void addRelatedPage(Entry *root) ...@@ -200,11 +200,38 @@ static void addRelatedPage(Entry *root)
if (!g->groupname.isEmpty() && (gd=Doxygen::groupSDict[g->groupname])) break; if (!g->groupname.isEmpty() && (gd=Doxygen::groupSDict[g->groupname])) break;
} }
//printf("addRelatedPage() %s gd=%p\n",root->name.data(),gd); //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->fileName,root->startLine,
root->sli, root->sli,
gd,root->tagInfo 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) ...@@ -1919,7 +1946,6 @@ static void buildFunctionList(Entry *root)
isMember=memIndex<ts || memIndex>te; isMember=memIndex<ts || memIndex>te;
} }
} }
if (root->parent && if (root->parent &&
!root->parent->name.isEmpty() && !root->parent->name.isEmpty() &&
(root->parent->section & Entry::COMPOUND_MASK) && (root->parent->section & Entry::COMPOUND_MASK) &&
...@@ -1967,7 +1993,8 @@ static void buildFunctionList(Entry *root) ...@@ -1967,7 +1993,8 @@ static void buildFunctionList(Entry *root)
if (rnd) rnsName = rnd->name().copy(); if (rnd) rnsName = rnd->name().copy();
NamespaceList *unl = fd ? fd->getUsedNamespaces() : 0; NamespaceList *unl = fd ? fd->getUsedNamespaces() : 0;
ClassList *ucl = fd ? fd->getUsedClasses() : 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 ( if (
matchArguments(md->argumentList(),root->argList,0,nsName,FALSE,unl,ucl) matchArguments(md->argumentList(),root->argList,0,nsName,FALSE,unl,ucl)
) )
...@@ -2060,7 +2087,6 @@ static void buildFunctionList(Entry *root) ...@@ -2060,7 +2087,6 @@ static void buildFunctionList(Entry *root)
root->type,name,root->args,root->exception, root->type,name,root->args,root->exception,
root->protection,root->virt,root->stat,FALSE, root->protection,root->virt,root->stat,FALSE,
MemberDef::Function,tArgList,root->argList); MemberDef::Function,tArgList,root->argList);
//printf("new member %p\n",md);
if (root->tagInfo) if (root->tagInfo)
...@@ -2297,100 +2323,112 @@ static void transferFunctionDocumentation() ...@@ -2297,100 +2323,112 @@ static void transferFunctionDocumentation()
MemberName *mn; MemberName *mn;
for (;(mn=mnli.current());++mnli) for (;(mn=mnli.current());++mnli)
{ {
MemberDef *md,*mdef=0,*mdec=0; //printf("memberName=%s count=%d\n",mn->memberName(),mn->count());
MemberNameIterator mni(*mn); MemberDef *mdef=0,*mdec=0;
MemberNameIterator mni1(*mn);
/* find a matching function declaration and definition for this function */ /* find a matching function declaration and definition for this function */
for (;(md=mni.current());++mni) for (;(mdec=mni1.current());++mni1)
{
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 */
{ {
//printf("Found member %s: definition in %s (doc=`%s') and declaration in %s (doc=`%s')\n", if (mdec->isPrototype() ||
// mn->memberName(), (mdec->isVariable() && mdec->isExternal())
// mdef->getFileDef()->name().data(),mdef->documentation().data(), )
// mdec->getFileDef()->name().data(),mdec->documentation().data() {
// ); MemberNameIterator mni2(*mn);
for (;(mdef=mni2.current());++mni2)
// 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()); if (
mdef->setDocumentation(mdec->documentation(),mdec->docFile(),mdec->docLine()); (mdef->isFunction() && !mdef->isStatic() && !mdef->isPrototype()) ||
mdef->setDocsForDefinition(mdec->isDocsForDefinition()); (mdef->isVariable() && !mdef->isExternal() && !mdef->isStatic())
ArgumentList *mdecAl = new ArgumentList; )
stringToArgumentList(mdec->argsString(),mdecAl);
if (mdec->argumentList())
{ {
transferArgumentDocumentation(mdec->argumentList(),mdecAl); //printf("mdef=(%p,%s) mdec=(%p,%s)\n",
} // mdef, mdef ? mdef->name().data() : "",
mdef->setDeclArgumentList(mdecAl); // mdec, mdec ? mdec->name().data() : "");
} if (mdef && mdec &&
if (mdec->getStartBodyLine()!=-1 && mdef->getStartBodyLine()==-1) matchArguments(mdef->argumentList(),mdec->argumentList())
{ ) /* match found */
mdef->setBodySegment(mdec->getStartBodyLine(),mdec->getEndBodyLine()); {
mdef->setBodyDef(mdec->getBodyDef()); //printf("Found member %s: definition in %s (doc=`%s') and declaration in %s (doc=`%s')\n",
mdef->setBodyMember(mdec); // mn->memberName(),
} // mdef->getFileDef()->name().data(),mdef->documentation().data(),
else if (mdef->getStartBodyLine()!=-1 && mdec->getStartBodyLine()==-1) // mdec->getFileDef()->name().data(),mdec->documentation().data()
{ // );
mdec->setBodySegment(mdef->getStartBodyLine(),mdef->getEndBodyLine());
mdec->setBodyDef(mdef->getBodyDef()); // first merge argument documentation
mdec->setBodyMember(mdef); transferArgumentDocumentation(mdec->argumentList(),mdef->argumentList());
}
mdec->mergeMemberSpecifiers(mdef->getMemberSpecifiers()); /* copy documentation between function definition and declaration */
mdef->mergeMemberSpecifiers(mdec->getMemberSpecifiers()); 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. // copy group info.
//if (mdec->getGroupDef()==0 && mdef->getGroupDef()!=0) //if (mdec->getGroupDef()==0 && mdef->getGroupDef()!=0)
//{ //{
// mdef->setGroupDef(mdec->getGroupDef(),mdec->getGroupPri(),mdec->docFile(),mdec->docLine(),mdec->hasDocumentation()); // mdef->setGroupDef(mdec->getGroupDef(),mdec->getGroupPri(),mdec->docFile(),mdec->docLine(),mdec->hasDocumentation());
//} //}
//else if (mdef->getGroupDef()==0 && mdec->getGroupDef()!=0) //else if (mdef->getGroupDef()==0 && mdec->getGroupDef()!=0)
//{ //{
// mdec->setGroupDef(mdef->getGroupDef(),mdef->getGroupPri(),mdef->docFile(),mdef->docLine(),mdef->hasDocumentation()); // mdec->setGroupDef(mdef->getGroupDef(),mdef->getGroupPri(),mdef->docFile(),mdef->docLine(),mdef->hasDocumentation());
//} //}
mdec->setRefItems(mdef->specialListItems()); mdec->setRefItems(mdef->specialListItems());
mdef->setRefItems(mdec->specialListItems()); mdef->setRefItems(mdec->specialListItems());
mdef->setMemberDeclaration(mdec);
mdec->setMemberDefinition(mdef);
}
}
}
}
} }
} }
} }
...@@ -5972,7 +6010,16 @@ static void generatePageDocs() ...@@ -5972,7 +6010,16 @@ static void generatePageDocs()
outputList->endSection(si->label,si->type); outputList->endSection(si->label,si->type);
} }
outputList->startTextBlock(); 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(); outputList->endTextBlock();
endFile(*outputList); endFile(*outputList);
//outputList->enable(OutputGenerator::Man); //outputList->enable(OutputGenerator::Man);
......
...@@ -162,7 +162,7 @@ void GroupDef::addMembersToMemberGroup() ...@@ -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()); //printf("GroupDef(%s)::insertMember(%s)\n", title.data(), md->name().data());
MemberNameInfo *mni=0; MemberNameInfo *mni=0;
...@@ -173,10 +173,17 @@ void GroupDef::insertMember(MemberDef *md,bool docOnly) ...@@ -173,10 +173,17 @@ void GroupDef::insertMember(MemberDef *md,bool docOnly)
for ( ; (srcMi=srcMnii.current()) ; ++srcMnii ) for ( ; (srcMi=srcMnii.current()) ; ++srcMnii )
{ {
MemberDef *srcMd = srcMi->memberDef; 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)); mni->append(new MemberInfo(md,md->protection(),md->virtualness(),FALSE));
...@@ -187,6 +194,7 @@ void GroupDef::insertMember(MemberDef *md,bool docOnly) ...@@ -187,6 +194,7 @@ void GroupDef::insertMember(MemberDef *md,bool docOnly)
mni->append(new MemberInfo(md,md->protection(),md->virtualness(),FALSE)); mni->append(new MemberInfo(md,md->protection(),md->virtualness(),FALSE));
allMemberNameInfoSDict->append(mni->memberName(),mni); allMemberNameInfoSDict->append(mni->memberName(),mni);
} }
//printf("Added member!\n");
allMemberList->append(md); allMemberList->append(md);
switch(md->memberType()) switch(md->memberType())
{ {
...@@ -241,7 +249,7 @@ void GroupDef::insertMember(MemberDef *md,bool docOnly) ...@@ -241,7 +249,7 @@ void GroupDef::insertMember(MemberDef *md,bool docOnly)
md->getClassDef() ? md->getClassDef()->name().data() : "", md->getClassDef() ? md->getClassDef()->name().data() : "",
name().data()); name().data());
} }
//addMemberToGroup(md,groupId); return TRUE;
} }
void GroupDef::removeMember(MemberDef *md) void GroupDef::removeMember(MemberDef *md)
...@@ -723,10 +731,13 @@ void addMemberToGroups(Entry *root,MemberDef *md) ...@@ -723,10 +731,13 @@ void addMemberToGroups(Entry *root,MemberDef *md)
if (insertit) if (insertit)
{ {
//printf("insertMember\n"); //printf("insertMember\n");
fgd->insertMember(md); bool success = fgd->insertMember(md);
md->setGroupDef(fgd,pri,root->fileName,root->startLine,root->doc.length() != 0); if (success)
ClassDef *cd = md->getClassDefOfAnonymousType(); {
if (cd) cd->setGroupDefForAllMembers(fgd,pri,root->fileName,root->startLine,root->doc.length() != 0); 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);
}
} }
} }
} }
......
...@@ -55,7 +55,7 @@ class GroupDef : public Definition ...@@ -55,7 +55,7 @@ class GroupDef : public Definition
void addParentGroup(const GroupDef *def); void addParentGroup(const GroupDef *def);
void addPage(PageInfo *def); // pages in this group void addPage(PageInfo *def); // pages in this group
void addExample(const PageInfo *def); // examples 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); void removeMember(MemberDef *md);
bool containsGroup(const GroupDef *def); // true if def is already a subgroup bool containsGroup(const GroupDef *def); // true if def is already a subgroup
void writeDetailedDocumentation(OutputList &ol); void writeDetailedDocumentation(OutputList &ol);
......
...@@ -17,6 +17,725 @@ ...@@ -17,6 +17,725 @@
*/ */
#include "htmldocvisitor.h" #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) void HtmlDocVisitor::filter(const char *str)
{ {
......
...@@ -20,646 +20,109 @@ ...@@ -20,646 +20,109 @@
#define _HTMLDOCVISITOR_H #define _HTMLDOCVISITOR_H
#include "docvisitor.h" #include "docvisitor.h"
#include "docparser.h"
#include "language.h" class QTextStream;
#include "doxygen.h" class BaseCodeDocInterface;
#include "outputgen.h" class QCString;
#include "code.h"
#include "dot.h"
/*! @brief Concrete visitor implementation for HTML output. */ /*! @brief Concrete visitor implementation for HTML output. */
class HtmlDocVisitor : public DocVisitor class HtmlDocVisitor : public DocVisitor
{ {
public: public:
HtmlDocVisitor(QTextStream &t,BaseCodeDocInterface &ci) HtmlDocVisitor(QTextStream &t,BaseCodeDocInterface &ci);
: m_t(t), m_ci(ci), m_insidePre(FALSE), m_hide(FALSE) {}
//-------------------------------------- //--------------------------------------
// visitor functions for leaf nodes // visitor functions for leaf nodes
//-------------------------------------- //--------------------------------------
void visit(DocWord *w) void visit(DocWord *);
{ void visit(DocLinkedWord *);
if (m_hide) return; void visit(DocWhiteSpace *);
filter(w->word()); void visit(DocSymbol *);
} void visit(DocURL *);
void visit(DocLinkedWord *w) void visit(DocLineBreak *);
{ void visit(DocHorRuler *);
if (m_hide) return; void visit(DocStyleChange *);
startLink(w->ref(),w->file(),w->anchor()); void visit(DocVerbatim *);
filter(w->word()); void visit(DocAnchor *);
endLink(); void visit(DocInclude *);
} void visit(DocIncOperator *);
void visit(DocWhiteSpace *w) void visit(DocFormula *);
{
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 << " ";
}
//-------------------------------------- //--------------------------------------
// visitor functions for compound nodes // visitor functions for compound nodes
//-------------------------------------- //--------------------------------------
void visitPre(DocAutoList *l) void visitPre(DocAutoList *);
{ void visitPost(DocAutoList *);
if (l->isEnumList()) void visitPre(DocAutoListItem *);
{ void visitPost(DocAutoListItem *);
m_t << "<ol>\n"; void visitPre(DocPara *) ;
} void visitPost(DocPara *);
else void visitPre(DocRoot *);
{ void visitPost(DocRoot *);
m_t << "<ul>\n"; void visitPre(DocSimpleSect *);
} void visitPost(DocSimpleSect *);
} void visitPre(DocTitle *);
void visitPost(DocAutoList *l) void visitPost(DocTitle *);
{ void visitPre(DocSimpleList *);
if (l->isEnumList()) void visitPost(DocSimpleList *);
{ void visitPre(DocSimpleListItem *);
m_t << "</ol>\n"; void visitPost(DocSimpleListItem *);
} void visitPre(DocSection *);
else void visitPost(DocSection *);
{ void visitPre(DocHtmlList *);
m_t << "</ul>\n"; void visitPost(DocHtmlList *) ;
} void visitPre(DocHtmlListItem *);
} void visitPost(DocHtmlListItem *);
void visitPre(DocAutoListItem *) void visitPre(DocHtmlPre *);
{ void visitPost(DocHtmlPre *);
m_t << "<li>"; void visitPre(DocHtmlDescList *);
} void visitPost(DocHtmlDescList *);
void visitPost(DocAutoListItem *) void visitPre(DocHtmlDescTitle *);
{ void visitPost(DocHtmlDescTitle *);
m_t << "</li>"; void visitPre(DocHtmlDescData *);
} void visitPost(DocHtmlDescData *);
void visitPre(DocPara *) void visitPre(DocHtmlTable *);
{ void visitPost(DocHtmlTable *);
} void visitPre(DocHtmlRow *);
void visitPost(DocPara *p) void visitPost(DocHtmlRow *) ;
{ void visitPre(DocHtmlCell *);
if (!p->isLast() && // omit <p> for last paragraph void visitPost(DocHtmlCell *);
!(p->parent() && // and for parameter sections void visitPre(DocHtmlCaption *);
p->parent()->kind()==DocNode::Kind_ParamSect void visitPost(DocHtmlCaption *);
) void visitPre(DocIndexEntry *);
) m_t << "\n<p>\n"; void visitPost(DocIndexEntry *);
} void visitPre(DocInternal *);
void visitPre(DocRoot *) void visitPost(DocInternal *);
{ void visitPre(DocHRef *);
//m_t << "<hr><h4><font color=\"red\">New parser:</font></h4>\n"; void visitPost(DocHRef *);
} void visitPre(DocHtmlHeader *);
void visitPost(DocRoot *) void visitPost(DocHtmlHeader *);
{ void visitPre(DocImage *);
//m_t << "<hr><h4><font color=\"red\">Old parser:</font></h4>\n"; void visitPost(DocImage *);
} void visitPre(DocDotFile *);
void visitPre(DocSimpleSect *s) void visitPost(DocDotFile *);
{ void visitPre(DocLink *);
m_t << "<dl compact><dt><b>"; void visitPost(DocLink *);
switch(s->type()) void visitPre(DocRef *);
{ void visitPost(DocRef *);
case DocSimpleSect::See: void visitPre(DocSecRefItem *);
m_t << theTranslator->trSeeAlso(); break; void visitPost(DocSecRefItem *);
case DocSimpleSect::Return: void visitPre(DocSecRefList *);
m_t << theTranslator->trReturns(); break; void visitPost(DocSecRefList *);
case DocSimpleSect::Author: void visitPre(DocLanguage *);
m_t << theTranslator->trAuthor(TRUE,TRUE); break; void visitPost(DocLanguage *);
case DocSimpleSect::Authors: void visitPre(DocParamSect *);
m_t << theTranslator->trAuthor(TRUE,FALSE); break; void visitPost(DocParamSect *);
case DocSimpleSect::Version: void visitPre(DocParamList *);
m_t << theTranslator->trVersion(); break; void visitPost(DocParamList *);
case DocSimpleSect::Since: void visitPre(DocXRefItem *);
m_t << theTranslator->trSince(); break; void visitPost(DocXRefItem *);
case DocSimpleSect::Date: void visitPre(DocInternalRef *);
m_t << theTranslator->trDate(); break; void visitPost(DocInternalRef *);
case DocSimpleSect::Note: void visitPre(DocCopy *);
m_t << theTranslator->trNote(); break; void visitPost(DocCopy *);
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 *)
{
}
private: private:
......
...@@ -30,6 +30,7 @@ ...@@ -30,6 +30,7 @@
#include "dot.h" #include "dot.h"
#include "language.h" #include "language.h"
#include "htmlhelp.h" #include "htmlhelp.h"
#include "docparser.h"
#include "htmldocvisitor.h" #include "htmldocvisitor.h"
// #define GROUP_COLOR "#ff8080" // #define GROUP_COLOR "#ff8080"
......
...@@ -17,8 +17,830 @@ ...@@ -17,8 +17,830 @@
*/ */
#include "latexdocvisitor.h" #include "latexdocvisitor.h"
#include "docparser.h"
#include "language.h"
#include "doxygen.h"
#include "outputgen.h"
#include "code.h"
#include "dot.h"
#include "util.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) void LatexDocVisitor::filter(const char *str)
{ {
filterLatexString(m_t,str,FALSE,m_insidePre); filterLatexString(m_t,str,FALSE,m_insidePre);
......
...@@ -20,749 +20,109 @@ ...@@ -20,749 +20,109 @@
#define _LATEXDOCVISITOR_H #define _LATEXDOCVISITOR_H
#include "docvisitor.h" #include "docvisitor.h"
#include "docparser.h"
#include "language.h" class QTextStream;
#include "doxygen.h" class BaseCodeDocInterface;
#include "outputgen.h" class QCString;
#include "code.h"
#include "dot.h"
/*! @brief Concrete visitor implementation for LaTeX output. */ /*! @brief Concrete visitor implementation for LaTeX output. */
class LatexDocVisitor : public DocVisitor class LatexDocVisitor : public DocVisitor
{ {
public: public:
LatexDocVisitor(QTextStream &t,BaseCodeDocInterface &ci) LatexDocVisitor(QTextStream &t,BaseCodeDocInterface &ci);
: m_t(t), m_ci(ci), m_insidePre(FALSE), m_hide(FALSE) {}
//-------------------------------------- //--------------------------------------
// visitor functions for leaf nodes // visitor functions for leaf nodes
//-------------------------------------- //--------------------------------------
void visit(DocWord *w) void visit(DocWord *);
{ void visit(DocLinkedWord *);
if (m_hide) return; void visit(DocWhiteSpace *);
filter(w->word()); void visit(DocSymbol *);
} void visit(DocURL *);
void visit(DocLinkedWord *w) void visit(DocLineBreak *);
{ void visit(DocHorRuler *);
if (m_hide) return; void visit(DocStyleChange *);
startLink(w->ref(),w->file(),w->anchor()); void visit(DocVerbatim *);
filter(w->word()); void visit(DocAnchor *);
endLink(); void visit(DocInclude *);
} void visit(DocIncOperator *);
void visit(DocWhiteSpace *w) void visit(DocFormula *);
{
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();
}
//-------------------------------------- //--------------------------------------
// visitor functions for compound nodes // visitor functions for compound nodes
//-------------------------------------- //--------------------------------------
void visitPre(DocAutoList *l) void visitPre(DocAutoList *);
{ void visitPost(DocAutoList *);
if (l->isEnumList()) void visitPre(DocAutoListItem *);
{ void visitPost(DocAutoListItem *);
m_t << "\\begin{enumerate}" << endl; void visitPre(DocPara *);
} void visitPost(DocPara *);
else void visitPre(DocRoot *);
{ void visitPost(DocRoot *);
m_t << "\\begin{itemize}" << endl; void visitPre(DocSimpleSect *);
} void visitPost(DocSimpleSect *);
} void visitPre(DocTitle *);
void visitPost(DocAutoList *l) void visitPost(DocTitle *);
{ void visitPre(DocSimpleList *);
if (l->isEnumList()) void visitPost(DocSimpleList *);
{ void visitPre(DocSimpleListItem *);
m_t << "\\end{enumerate}" << endl; void visitPost(DocSimpleListItem *);
} void visitPre(DocSection *s);
else void visitPost(DocSection *);
{ void visitPre(DocHtmlList *s);
m_t << "\\end{itemize}" << endl; void visitPost(DocHtmlList *s);
} void visitPre(DocHtmlListItem *);
} void visitPost(DocHtmlListItem *);
void visitPre(DocAutoListItem *) void visitPre(DocHtmlPre *);
{ void visitPost(DocHtmlPre *);
m_t << "\\item "; void visitPre(DocHtmlDescList *);
} void visitPost(DocHtmlDescList *);
void visitPost(DocAutoListItem *) void visitPre(DocHtmlDescTitle *);
{ void visitPost(DocHtmlDescTitle *);
} void visitPre(DocHtmlDescData *);
void visitPre(DocPara *) void visitPost(DocHtmlDescData *);
{ void visitPre(DocHtmlTable *t);
} void visitPost(DocHtmlTable *t);
void visitPost(DocPara *p) void visitPre(DocHtmlCaption *);
{ void visitPost(DocHtmlCaption *);
if (!p->isLast() && // omit <p> for last paragraph void visitPre(DocHtmlRow *);
!(p->parent() && // and for parameter sections void visitPost(DocHtmlRow *) ;
p->parent()->kind()==DocNode::Kind_ParamSect void visitPre(DocHtmlCell *);
) void visitPost(DocHtmlCell *);
) m_t << endl << endl; void visitPre(DocIndexEntry *);
} void visitPost(DocIndexEntry *);
void visitPre(DocRoot *) void visitPre(DocInternal *);
{ void visitPost(DocInternal *);
} void visitPre(DocHRef *);
void visitPost(DocRoot *) void visitPost(DocHRef *);
{ void visitPre(DocHtmlHeader *);
} void visitPost(DocHtmlHeader *) ;
void visitPre(DocSimpleSect *s) void visitPre(DocImage *);
{ void visitPost(DocImage *);
m_t << "\\begin{Desc}\n\\item["; void visitPre(DocDotFile *);
switch(s->type()) void visitPost(DocDotFile *);
{ void visitPre(DocLink *lnk);
case DocSimpleSect::See: void visitPost(DocLink *);
m_t << theTranslator->trSeeAlso(); break; void visitPre(DocRef *ref);
case DocSimpleSect::Return: void visitPost(DocRef *);
m_t << theTranslator->trReturns(); break; void visitPre(DocSecRefItem *);
case DocSimpleSect::Author: void visitPost(DocSecRefItem *);
m_t << theTranslator->trAuthor(TRUE,TRUE); break; void visitPre(DocSecRefList *);
case DocSimpleSect::Authors: void visitPost(DocSecRefList *);
m_t << theTranslator->trAuthor(TRUE,FALSE); break; void visitPre(DocLanguage *);
case DocSimpleSect::Version: void visitPost(DocLanguage *);
m_t << theTranslator->trVersion(); break; void visitPre(DocParamSect *);
case DocSimpleSect::Since: void visitPost(DocParamSect *);
m_t << theTranslator->trSince(); break; void visitPre(DocParamList *);
case DocSimpleSect::Date: void visitPost(DocParamList *);
m_t << theTranslator->trDate(); break; void visitPre(DocXRefItem *);
case DocSimpleSect::Note: void visitPost(DocXRefItem *);
m_t << theTranslator->trNote(); break; void visitPre(DocInternalRef *);
case DocSimpleSect::Warning: void visitPost(DocInternalRef *);
m_t << theTranslator->trWarning(); break; void visitPre(DocCopy *);
case DocSimpleSect::Pre: void visitPost(DocCopy *);
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 *)
{
}
private: private:
......
...@@ -29,6 +29,7 @@ ...@@ -29,6 +29,7 @@
#include "version.h" #include "version.h"
#include "dot.h" #include "dot.h"
#include "page.h" #include "page.h"
#include "docparser.h"
#include "latexdocvisitor.h" #include "latexdocvisitor.h"
//static QCString filterTitle(const char *s) //static QCString filterTitle(const char *s)
......
...@@ -71,7 +71,9 @@ HEADERS = bufstr.h \ ...@@ -71,7 +71,9 @@ HEADERS = bufstr.h \
printdocvisitor.h \ printdocvisitor.h \
qtbc.h \ qtbc.h \
reflist.h \ reflist.h \
rtfdocvisitor.h \
rtfgen.h \ rtfgen.h \
rtfstyle.h \
scanner.h \ scanner.h \
searchindex.h \ searchindex.h \
section.h \ section.h \
...@@ -162,7 +164,9 @@ SOURCES = ce_lex.cpp \ ...@@ -162,7 +164,9 @@ SOURCES = ce_lex.cpp \
pngenc.cpp \ pngenc.cpp \
pre.cpp \ pre.cpp \
reflist.cpp \ reflist.cpp \
rtfdocvisitor.cpp \
rtfgen.cpp \ rtfgen.cpp \
rtfstyle.cpp \
scanner.cpp \ scanner.cpp \
searchindex.cpp \ searchindex.cpp \
suffixtree.cpp \ suffixtree.cpp \
......
...@@ -552,7 +552,14 @@ ClassDef *MemberDef::getClassDefOfAnonymousType() ...@@ -552,7 +552,14 @@ ClassDef *MemberDef::getClassDefOfAnonymousType()
*/ */
bool MemberDef::isBriefSectionVisible() const 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 // only include static members with file/namespace scope if
// explicitly enabled in the config file // explicitly enabled in the config file
...@@ -609,6 +616,12 @@ bool MemberDef::isBriefSectionVisible() const ...@@ -609,6 +616,12 @@ bool MemberDef::isBriefSectionVisible() const
!hasDocs !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 && bool visible = visibleIfStatic && visibleIfDocumented &&
visibleIfEnabled && visibleIfPrivate && visibleIfEnabled && visibleIfPrivate &&
visibleIfDocVirtual && visibleIfNotDefaultCDTor && visibleIfDocVirtual && visibleIfNotDefaultCDTor &&
......
...@@ -245,6 +245,12 @@ class MemberDef : public Definition ...@@ -245,6 +245,12 @@ class MemberDef : public Definition
} }
void setBodyMember(MemberDef *md) { bodyMemb = md; } void setBodyMember(MemberDef *md) { bodyMemb = md; }
void setDocsForDefinition(bool b) { docsForDefinition = b; } 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; bool visited;
...@@ -270,8 +276,6 @@ class MemberDef : public Definition ...@@ -270,8 +276,6 @@ class MemberDef : public Definition
QCString init; // initializer QCString init; // initializer
int initLines; // number of lines in the initializer int initLines; // number of lines in the initializer
QCString decl; // member declaration in class 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 def; // member definition in code (fully qualified name)
QCString anc; // HTML anchor name QCString anc; // HTML anchor name
MemberDef *bodyMemb; // Member containing the definition MemberDef *bodyMemb; // Member containing the definition
...@@ -281,7 +285,6 @@ class MemberDef : public Definition ...@@ -281,7 +285,6 @@ class MemberDef : public Definition
bool stat; // is it a static function? bool stat; // is it a static function?
int memSpec; // The specifiers present for this member int memSpec; // The specifiers present for this member
MemberType mtype; // returns the kind of 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 proto; // is it a prototype;
bool docEnumValues; // is an enum with documented enum values. bool docEnumValues; // is an enum with documented enum values.
bool annScope; // member is part of an annoymous scope bool annScope; // member is part of an annoymous scope
......
...@@ -25,7 +25,8 @@ class PageInfo ...@@ -25,7 +25,8 @@ class PageInfo
public: public:
PageInfo(const char *f, int l,const char *n,const char *d,const char *t) : PageInfo(const char *f, int l,const char *n,const char *d,const char *t) :
defFileName(f), defLine(l), name(n), 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 // where the page definition was found
QCString defFileName; QCString defFileName;
...@@ -40,6 +41,9 @@ class PageInfo ...@@ -40,6 +41,9 @@ class PageInfo
QCString reference; QCString reference;
QCString fileName; QCString fileName;
// class, file or namespace in which the page was found
Definition *context;
// functions to get a uniform interface with Definitions // functions to get a uniform interface with Definitions
QCString getOutputFileBase() const { return fileName; } QCString getOutputFileBase() const { return fileName; }
bool isReference() const { return !reference.isEmpty(); } bool isReference() const { return !reference.isEmpty(); }
......
/******************************************************************************
*
*
*
*
* 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 << "}";
}
}
/******************************************************************************
*
*
*
*
* 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
...@@ -33,6 +33,7 @@ ...@@ -33,6 +33,7 @@
#include "dot.h" #include "dot.h"
#include "version.h" #include "version.h"
#include "page.h" #include "page.h"
#include "rtfstyle.h"
//#define DBG_RTF(x) x; //#define DBG_RTF(x) x;
#define DBG_RTF(x) #define DBG_RTF(x)
...@@ -40,64 +41,6 @@ ...@@ -40,64 +41,6 @@
// used for table column width calculation // used for table column width calculation
#define PAGEWIDTH 8748 #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() static QCString dateToRTFDateString()
{ {
const QDateTime &d = QDateTime::currentDateTime(); const QDateTime &d = QDateTime::currentDateTime();
...@@ -106,7 +49,7 @@ static QCString dateToRTFDateString() ...@@ -106,7 +49,7 @@ static QCString dateToRTFDateString()
d.date().year(), d.date().month(), d.date().day(), d.date().year(), d.date().month(), d.date().day(),
d.time().hour(),d.time().minute(),d.time().second()); d.time().hour(),d.time().minute(),d.time().second());
return result; return result;
} }
RTFGenerator::RTFGenerator() : OutputGenerator() RTFGenerator::RTFGenerator() : OutputGenerator()
{ {
...@@ -143,307 +86,6 @@ OutputGenerator *RTFGenerator::copy() ...@@ -143,307 +86,6 @@ OutputGenerator *RTFGenerator::copy()
return result; 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) void RTFGenerator::writeStyleSheetFile(QFile &file)
{ {
QTextStream t(&file); QTextStream t(&file);
...@@ -453,171 +95,14 @@ void RTFGenerator::writeStyleSheetFile(QFile &file) ...@@ -453,171 +95,14 @@ void RTFGenerator::writeStyleSheetFile(QFile &file)
t << "# Remove a hash to activate a line.\n\n"; t << "# Remove a hash to activate a line.\n\n";
int i; 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 << " = " t << "# " << rtf_Style_Default[i].name << " = "
<< Rtf_Style_Default[i].reference << rtf_Style_Default[i].reference
<< Rtf_Style_Default[i].definition << endl; << 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) void RTFGenerator::writeExtensionsFile(QFile &file)
{ {
QTextStream t(&file); QTextStream t(&file);
...@@ -670,52 +155,6 @@ void RTFGenerator::writeExtensionsFile(QFile &file) ...@@ -670,52 +155,6 @@ void RTFGenerator::writeExtensionsFile(QFile &file)
t << "#Keywords = \n\n"; 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() void RTFGenerator::init()
{ {
...@@ -726,18 +165,16 @@ void RTFGenerator::init() ...@@ -726,18 +165,16 @@ void RTFGenerator::init()
err("Could not create output directory %s\n",dir.data()); err("Could not create output directory %s\n",dir.data());
exit(1); exit(1);
} }
Rtf_Style.setAutoDelete(TRUE); rtf_Style.setAutoDelete(TRUE);
g_tagDict.setAutoDelete(TRUE);
// first duplicate strings of Rtf_Style_Default // first duplicate strings of rtf_Style_Default
const struct Rtf_Style_Default* def = Rtf_Style_Default; const struct Rtf_Style_Default* def = rtf_Style_Default;
while(def->reference != 0) while(def->reference != 0)
{ {
if (def->definition == 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); StyleData* styleData = new StyleData(def->reference, def->definition);
Rtf_Style.insert(def->name, styleData); rtf_Style.insert(def->name, styleData);
def++; def++;
} }
...@@ -745,7 +182,7 @@ void RTFGenerator::init() ...@@ -745,7 +182,7 @@ void RTFGenerator::init()
QCString &rtfStyleSheetFile = Config_getString("RTF_STYLESHEET_FILE"); QCString &rtfStyleSheetFile = Config_getString("RTF_STYLESHEET_FILE");
if (!rtfStyleSheetFile.isEmpty()) if (!rtfStyleSheetFile.isEmpty())
{ {
loadStylesheet(rtfStyleSheetFile, Rtf_Style); loadStylesheet(rtfStyleSheetFile, rtf_Style);
} }
// If user has defined an extension file, load its contents. // If user has defined an extension file, load its contents.
...@@ -807,7 +244,7 @@ void RTFGenerator::beginRTFDocument() ...@@ -807,7 +244,7 @@ void RTFGenerator::beginRTFDocument()
// sort styles ascending by \s-number via an intermediate QArray // sort styles ascending by \s-number via an intermediate QArray
QArray<const StyleData*> array(128); QArray<const StyleData*> array(128);
array.fill(0); array.fill(0);
QDictIterator<StyleData> iter(Rtf_Style); QDictIterator<StyleData> iter(rtf_Style);
const StyleData* style; const StyleData* style;
for(; (style = iter.current()); ++iter) for(; (style = iter.current()); ++iter)
{ {
...@@ -847,40 +284,40 @@ void RTFGenerator::beginRTFChapter() ...@@ -847,40 +284,40 @@ void RTFGenerator::beginRTFChapter()
{ {
t <<"\n"; t <<"\n";
DBG_RTF(t << "{\\comment BeginRTFChapter}\n") DBG_RTF(t << "{\\comment BeginRTFChapter}\n")
t << Rtf_Style_Reset; t << rtf_Style_Reset;
// if we are compact, no extra page breaks... // if we are compact, no extra page breaks...
if (Config_getBool("COMPACT_RTF")) if (Config_getBool("COMPACT_RTF"))
{ {
// t <<"\\sect\\sectd\\sbknone\n"; // t <<"\\sect\\sectd\\sbknone\n";
t <<"\\sect\\sbknone\n"; t <<"\\sect\\sbknone\n";
RtfwriteRuler_thick(); rtfwriteRuler_thick();
} }
else else
t <<"\\sect\\sbkpage\n"; t <<"\\sect\\sbkpage\n";
//t <<"\\sect\\sectd\\sbkpage\n"; //t <<"\\sect\\sectd\\sbkpage\n";
t << Rtf_Style["Heading1"]->reference << "\n"; t << rtf_Style["Heading1"]->reference << "\n";
} }
void RTFGenerator::beginRTFSection() void RTFGenerator::beginRTFSection()
{ {
t <<"\n"; t <<"\n";
DBG_RTF(t << "{\\comment BeginRTFSection}\n") DBG_RTF(t << "{\\comment BeginRTFSection}\n")
t << Rtf_Style_Reset; t << rtf_Style_Reset;
// if we are compact, no extra page breaks... // if we are compact, no extra page breaks...
if (Config_getBool("COMPACT_RTF")) if (Config_getBool("COMPACT_RTF"))
{ {
// t <<"\\sect\\sectd\\sbknone\n"; // t <<"\\sect\\sectd\\sbknone\n";
t <<"\\sect\\sbknone\n"; t <<"\\sect\\sbknone\n";
RtfwriteRuler_emboss(); rtfwriteRuler_emboss();
} }
else else
t <<"\\sect\\sbkpage\n"; t <<"\\sect\\sbkpage\n";
//t <<"\\sect\\sectd\\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 *, void RTFGenerator::startFile(const char *name,const char *,
...@@ -929,13 +366,13 @@ void RTFGenerator::startIndexSection(IndexSections is) ...@@ -929,13 +366,13 @@ void RTFGenerator::startIndexSection(IndexSections is)
break; break;
case isTitlePageAuthor: case isTitlePageAuthor:
t << "}\n"; t << "}\n";
if (subject) t << "{\\subject " << subject << "}\n"; if (rtf_subject) t << "{\\subject " << rtf_subject << "}\n";
if (comments) t << "{\\comment " << comments << "}\n"; if (rtf_comments) t << "{\\comment " << rtf_comments << "}\n";
if (company) t << "{\\company " << company << "}\n"; if (rtf_company) t << "{\\company " << rtf_company << "}\n";
if (author) t << "{\\author " << author << "}\n"; if (rtf_author) t << "{\\author " << rtf_author << "}\n";
if (manager) t << "{\\manager " << manager << "}\n"; if (rtf_manager) t << "{\\manager " << rtf_manager << "}\n";
if (documentType) t << "{\\category " << documentType << "}\n"; if (rtf_documentType) t << "{\\category " << rtf_documentType << "}\n";
if (keywords) t << "{\\keywords " << keywords << "}\n"; if (rtf_keywords) t << "{\\keywords " << rtf_keywords << "}\n";
t << "{\\comment "; t << "{\\comment ";
break; break;
case isMainPage: case isMainPage:
...@@ -1081,9 +518,9 @@ void RTFGenerator::endIndexSection(IndexSections is) ...@@ -1081,9 +518,9 @@ void RTFGenerator::endIndexSection(IndexSections is)
switch (is) switch (is)
{ {
case isTitlePageStart: case isTitlePageStart:
if (title) if (rtf_title)
// User has overridden document title in extensions file // User has overridden document title in extensions file
t << "}" << title; t << "}" << rtf_title;
else else
t << "}" << Config_getString("PROJECT_NAME"); t << "}" << Config_getString("PROJECT_NAME");
break; break;
...@@ -1093,42 +530,42 @@ void RTFGenerator::endIndexSection(IndexSections is) ...@@ -1093,42 +530,42 @@ void RTFGenerator::endIndexSection(IndexSections is)
t << "{\\creatim " << dateToRTFDateString() << "}\n}"; t << "{\\creatim " << dateToRTFDateString() << "}\n}";
DBG_RTF(t << "{\\comment end of infoblock}\n"); DBG_RTF(t << "{\\comment end of infoblock}\n");
// setup for this section // setup for this section
t << Rtf_Style_Reset <<"\n"; t << rtf_Style_Reset <<"\n";
t <<"\\sectd\\pgnlcrm\n"; t <<"\\sectd\\pgnlcrm\n";
t <<"{\\footer "<<Rtf_Style["Footer"]->reference << "{\\chpgn}}\n"; t <<"{\\footer "<<rtf_Style["Footer"]->reference << "{\\chpgn}}\n";
// the title entry // the title entry
DBG_RTF(t << "{\\comment begin title page}\n") 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"; 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"; 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 << "{\\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"; 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 << "\\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 << "{\\field\\fldedit {\\*\\fldinst AUTHOR \\\\*MERGEFORMAT}{\\fldrslt AUTHOR}}\\par" << endl;
t << "Version " << Config_getString("PROJECT_NUMBER") << "\\par"; t << "Version " << Config_getString("PROJECT_NUMBER") << "\\par";
t << "{\\field\\fldedit {\\*\\fldinst CREATEDATE \\\\*MERGEFORMAT}" t << "{\\field\\fldedit {\\*\\fldinst CREATEDATE \\\\*MERGEFORMAT}"
...@@ -1139,16 +576,16 @@ void RTFGenerator::endIndexSection(IndexSections is) ...@@ -1139,16 +576,16 @@ void RTFGenerator::endIndexSection(IndexSections is)
// table of contents section // table of contents section
DBG_RTF(t << "{\\comment Table of contents}\n") DBG_RTF(t << "{\\comment Table of contents}\n")
t << "\\vertalt\n"; t << "\\vertalt\n";
t << Rtf_Style_Reset << endl; t << rtf_Style_Reset << endl;
t << Rtf_Style["Heading1"]->reference; t << rtf_Style["Heading1"]->reference;
t << theTranslator->trRTFTableOfContents() << "\\par"<< endl; 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 << "{\\field\\fldedit {\\*\\fldinst TOC \\\\f \\\\*MERGEFORMAT}{\\fldrslt Table of contents}}\\par\n";
t << Rtf_Style_Reset << endl; t << rtf_Style_Reset << endl;
} }
break; break;
case isMainPage: case isMainPage:
t << "\\par " << Rtf_Style_Reset << endl; t << "\\par " << rtf_Style_Reset << endl;
if (!Doxygen::mainPage || Doxygen::mainPage->title.isEmpty()) if (!Doxygen::mainPage || Doxygen::mainPage->title.isEmpty())
{ {
t << "{\\tc \\v " << theTranslator->trMainPage() << "}"<< endl; t << "{\\tc \\v " << theTranslator->trMainPage() << "}"<< endl;
...@@ -1162,37 +599,37 @@ void RTFGenerator::endIndexSection(IndexSections is) ...@@ -1162,37 +599,37 @@ void RTFGenerator::endIndexSection(IndexSections is)
t << ".rtf\" \\\\*MERGEFORMAT}{\\fldrslt includedstuff}}\n"; t << ".rtf\" \\\\*MERGEFORMAT}{\\fldrslt includedstuff}}\n";
break; break;
//case isPackageIndex: //case isPackageIndex:
// t << "\\par " << Rtf_Style_Reset << endl; // t << "\\par " << rtf_Style_Reset << endl;
// t << "{\\tc \\v " << theTranslator->trPackageList() << "}"<< endl; // t << "{\\tc \\v " << theTranslator->trPackageList() << "}"<< endl;
// t << "{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \"packages.rtf\" \\\\*MERGEFORMAT}{\\fldrslt includedstuff}}\n"; // t << "{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \"packages.rtf\" \\\\*MERGEFORMAT}{\\fldrslt includedstuff}}\n";
// break; // break;
case isModuleIndex: case isModuleIndex:
t << "\\par " << Rtf_Style_Reset << endl; t << "\\par " << rtf_Style_Reset << endl;
t << "{\\tc \\v " << theTranslator->trModuleIndex() << "}"<< endl; t << "{\\tc \\v " << theTranslator->trModuleIndex() << "}"<< endl;
t << "{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \"modules.rtf\" \\\\*MERGEFORMAT}{\\fldrslt includedstuff}}\n"; t << "{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \"modules.rtf\" \\\\*MERGEFORMAT}{\\fldrslt includedstuff}}\n";
break; break;
case isNamespaceIndex: case isNamespaceIndex:
t << "\\par " << Rtf_Style_Reset << endl; t << "\\par " << rtf_Style_Reset << endl;
t << "{\\tc \\v " << theTranslator->trNamespaceIndex() << "}"<< endl; t << "{\\tc \\v " << theTranslator->trNamespaceIndex() << "}"<< endl;
t << "{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \"namespaces.rtf\" \\\\*MERGEFORMAT}{\\fldrslt includedstuff}}\n"; t << "{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \"namespaces.rtf\" \\\\*MERGEFORMAT}{\\fldrslt includedstuff}}\n";
break; break;
case isClassHierarchyIndex: case isClassHierarchyIndex:
t << "\\par " << Rtf_Style_Reset << endl; t << "\\par " << rtf_Style_Reset << endl;
t << "{\\tc \\v " << theTranslator->trHierarchicalIndex() << "}"<< endl; t << "{\\tc \\v " << theTranslator->trHierarchicalIndex() << "}"<< endl;
t << "{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \"hierarchy.rtf\" \\\\*MERGEFORMAT}{\\fldrslt includedstuff}}\n"; t << "{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \"hierarchy.rtf\" \\\\*MERGEFORMAT}{\\fldrslt includedstuff}}\n";
break; break;
case isCompoundIndex: case isCompoundIndex:
t << "\\par " << Rtf_Style_Reset << endl; t << "\\par " << rtf_Style_Reset << endl;
t << "{\\tc \\v " << theTranslator->trCompoundIndex() << "}"<< endl; t << "{\\tc \\v " << theTranslator->trCompoundIndex() << "}"<< endl;
t << "{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \"annotated.rtf\" \\\\*MERGEFORMAT}{\\fldrslt includedstuff}}\n"; t << "{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \"annotated.rtf\" \\\\*MERGEFORMAT}{\\fldrslt includedstuff}}\n";
break; break;
case isFileIndex: case isFileIndex:
t << "\\par " << Rtf_Style_Reset << endl; t << "\\par " << rtf_Style_Reset << endl;
t << "{\\tc \\v " << theTranslator->trFileIndex() << "}"<< endl; t << "{\\tc \\v " << theTranslator->trFileIndex() << "}"<< endl;
t << "{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \"files.rtf\" \\\\*MERGEFORMAT}{\\fldrslt includedstuff}}\n"; t << "{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \"files.rtf\" \\\\*MERGEFORMAT}{\\fldrslt includedstuff}}\n";
break; break;
case isPageIndex: case isPageIndex:
t << "\\par " << Rtf_Style_Reset << endl; t << "\\par " << rtf_Style_Reset << endl;
t << "{\\tc \\v " << theTranslator->trPageIndex() << "}"<< endl; t << "{\\tc \\v " << theTranslator->trPageIndex() << "}"<< endl;
t << "{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \"pages.rtf\" \\\\*MERGEFORMAT}{\\fldrslt includedstuff}}\n"; t << "{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \"pages.rtf\" \\\\*MERGEFORMAT}{\\fldrslt includedstuff}}\n";
break; break;
...@@ -1203,7 +640,7 @@ void RTFGenerator::endIndexSection(IndexSections is) ...@@ -1203,7 +640,7 @@ void RTFGenerator::endIndexSection(IndexSections is)
// t << "{\\tc \\v " << theTranslator->trPackageDocumentation() << "}"<< endl; // t << "{\\tc \\v " << theTranslator->trPackageDocumentation() << "}"<< endl;
// while (pd) // while (pd)
// { // {
// t << "\\par " << Rtf_Style_Reset << endl; // t << "\\par " << rtf_Style_Reset << endl;
// t << "{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \""; // t << "{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \"";
// t << pd->getOutputFileBase(); // t << pd->getOutputFileBase();
// t << ".rtf\" \\\\*MERGEFORMAT}{\\fldrslt includedstuff}}\n"; // t << ".rtf\" \\\\*MERGEFORMAT}{\\fldrslt includedstuff}}\n";
...@@ -1221,7 +658,7 @@ void RTFGenerator::endIndexSection(IndexSections is) ...@@ -1221,7 +658,7 @@ void RTFGenerator::endIndexSection(IndexSections is)
{ {
if (!gd->isReference()) if (!gd->isReference())
{ {
t << "\\par " << Rtf_Style_Reset << endl; t << "\\par " << rtf_Style_Reset << endl;
t << "{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \""; t << "{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \"";
t << gd->getOutputFileBase(); t << gd->getOutputFileBase();
t << ".rtf\" \\\\*MERGEFORMAT}{\\fldrslt includedstuff}}\n"; t << ".rtf\" \\\\*MERGEFORMAT}{\\fldrslt includedstuff}}\n";
...@@ -1238,7 +675,7 @@ void RTFGenerator::endIndexSection(IndexSections is) ...@@ -1238,7 +675,7 @@ void RTFGenerator::endIndexSection(IndexSections is)
{ {
if (nd->isLinkableInProject()) if (nd->isLinkableInProject())
{ {
t << "\\par " << Rtf_Style_Reset << endl; t << "\\par " << rtf_Style_Reset << endl;
t << "{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \""; t << "{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \"";
t << nd->getOutputFileBase(); t << nd->getOutputFileBase();
t << ".rtf\" \\\\*MERGEFORMAT}{\\fldrslt includedstuff}}\n"; t << ".rtf\" \\\\*MERGEFORMAT}{\\fldrslt includedstuff}}\n";
...@@ -1249,7 +686,7 @@ void RTFGenerator::endIndexSection(IndexSections is) ...@@ -1249,7 +686,7 @@ void RTFGenerator::endIndexSection(IndexSections is)
{ {
if (nd->isLinkableInProject()) if (nd->isLinkableInProject())
{ {
t << "\\par " << Rtf_Style_Reset << endl; t << "\\par " << rtf_Style_Reset << endl;
beginRTFSection(); beginRTFSection();
t << "{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \""; t << "{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \"";
t << nd->getOutputFileBase(); t << nd->getOutputFileBase();
...@@ -1270,7 +707,7 @@ void RTFGenerator::endIndexSection(IndexSections is) ...@@ -1270,7 +707,7 @@ void RTFGenerator::endIndexSection(IndexSections is)
{ {
if (cd->isLinkableInProject() && cd->templateMaster()==0) if (cd->isLinkableInProject() && cd->templateMaster()==0)
{ {
t << "\\par " << Rtf_Style_Reset << endl; t << "\\par " << rtf_Style_Reset << endl;
t << "{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \""; t << "{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \"";
t << cd->getOutputFileBase(); t << cd->getOutputFileBase();
t << ".rtf\" \\\\*MERGEFORMAT}{\\fldrslt includedstuff}}\n"; t << ".rtf\" \\\\*MERGEFORMAT}{\\fldrslt includedstuff}}\n";
...@@ -1281,7 +718,7 @@ void RTFGenerator::endIndexSection(IndexSections is) ...@@ -1281,7 +718,7 @@ void RTFGenerator::endIndexSection(IndexSections is)
{ {
if (cd->isLinkableInProject() && cd->templateMaster()==0) if (cd->isLinkableInProject() && cd->templateMaster()==0)
{ {
t << "\\par " << Rtf_Style_Reset << endl; t << "\\par " << rtf_Style_Reset << endl;
beginRTFSection(); beginRTFSection();
t << "{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \""; t << "{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \"";
t << cd->getOutputFileBase(); t << cd->getOutputFileBase();
...@@ -1305,7 +742,7 @@ void RTFGenerator::endIndexSection(IndexSections is) ...@@ -1305,7 +742,7 @@ void RTFGenerator::endIndexSection(IndexSections is)
{ {
if (isFirst) if (isFirst)
{ {
t << "\\par " << Rtf_Style_Reset << endl; t << "\\par " << rtf_Style_Reset << endl;
t << "{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \""; t << "{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \"";
t << fd->getOutputFileBase(); t << fd->getOutputFileBase();
t << ".rtf\" \\\\*MERGEFORMAT}{\\fldrslt includedstuff}}\n"; t << ".rtf\" \\\\*MERGEFORMAT}{\\fldrslt includedstuff}}\n";
...@@ -1313,7 +750,7 @@ void RTFGenerator::endIndexSection(IndexSections is) ...@@ -1313,7 +750,7 @@ void RTFGenerator::endIndexSection(IndexSections is)
} }
else else
{ {
t << "\\par " << Rtf_Style_Reset << endl; t << "\\par " << rtf_Style_Reset << endl;
beginRTFSection(); beginRTFSection();
t << "{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \""; t << "{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \"";
t << fd->getOutputFileBase(); t << fd->getOutputFileBase();
...@@ -1334,14 +771,14 @@ void RTFGenerator::endIndexSection(IndexSections is) ...@@ -1334,14 +771,14 @@ void RTFGenerator::endIndexSection(IndexSections is)
PageInfo *pi=pdi.toFirst(); PageInfo *pi=pdi.toFirst();
if (pi) if (pi)
{ {
t << "\\par " << Rtf_Style_Reset << endl; t << "\\par " << rtf_Style_Reset << endl;
t << "{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \""; t << "{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \"";
t << pi->getOutputFileBase(); t << pi->getOutputFileBase();
t << ".rtf\" \\\\*MERGEFORMAT}{\\fldrslt includedstuff}}\n"; t << ".rtf\" \\\\*MERGEFORMAT}{\\fldrslt includedstuff}}\n";
} }
for (++pdi;(pi=pdi.current());++pdi) for (++pdi;(pi=pdi.current());++pdi)
{ {
t << "\\par " << Rtf_Style_Reset << endl; t << "\\par " << rtf_Style_Reset << endl;
beginRTFSection(); beginRTFSection();
t << "{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \""; t << "{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \"";
t << pi->getOutputFileBase(); t << pi->getOutputFileBase();
...@@ -1359,7 +796,7 @@ void RTFGenerator::endIndexSection(IndexSections is) ...@@ -1359,7 +796,7 @@ void RTFGenerator::endIndexSection(IndexSections is)
{ {
if (!pi->getGroupDef() && !pi->isReference()) 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 << "{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \"";
t << pi->getOutputFileBase(); t << pi->getOutputFileBase();
t << ".rtf\" \\\\*MERGEFORMAT}{\\fldrslt includedstuff}}\n"; t << ".rtf\" \\\\*MERGEFORMAT}{\\fldrslt includedstuff}}\n";
...@@ -1370,9 +807,9 @@ void RTFGenerator::endIndexSection(IndexSections is) ...@@ -1370,9 +807,9 @@ void RTFGenerator::endIndexSection(IndexSections is)
break; break;
case isEndIndex: case isEndIndex:
beginRTFChapter(); beginRTFChapter();
t << Rtf_Style["Heading1"]->reference; t << rtf_Style["Heading1"]->reference;
t << theTranslator->trRTFGeneralIndex() << "\\par "<< endl; t << theTranslator->trRTFGeneralIndex() << "\\par "<< endl;
t << Rtf_Style_Reset << endl; t << rtf_Style_Reset << endl;
t << "{\\tc \\v " << theTranslator->trRTFGeneralIndex() << "}" << endl; t << "{\\tc \\v " << theTranslator->trRTFGeneralIndex() << "}" << endl;
t << "{\\field\\fldedit {\\*\\fldinst INDEX \\\\c2 \\\\*MERGEFORMAT}{\\fldrslt INDEX}}\n"; t << "{\\field\\fldedit {\\*\\fldinst INDEX \\\\c2 \\\\*MERGEFORMAT}{\\fldrslt INDEX}}\n";
...@@ -1388,8 +825,8 @@ void RTFGenerator::lastIndexPage() ...@@ -1388,8 +825,8 @@ void RTFGenerator::lastIndexPage()
t <<"\\sect \\sectd \\sbknone\n"; t <<"\\sect \\sectd \\sbknone\n";
// set footer // set footer
t <<"{\\footer "<< Rtf_Style["Footer"]->reference << "{\\chpgn}}\n"; t <<"{\\footer "<< rtf_Style["Footer"]->reference << "{\\chpgn}}\n";
//t << Rtf_Style["Heading1"]->reference << "\n"; //t << rtf_Style["Heading1"]->reference << "\n";
} }
...@@ -1413,7 +850,7 @@ void RTFGenerator::startIndexList() ...@@ -1413,7 +850,7 @@ void RTFGenerator::startIndexList()
DBG_RTF(t << "{\\comment (startIndexList)}" << endl) DBG_RTF(t << "{\\comment (startIndexList)}" << endl)
t << "{" << endl; t << "{" << endl;
incrementIndentLevel(); incrementIndentLevel();
t << Rtf_Style_Reset << Rtf_LCList_DepthStyle() << endl; t << rtf_Style_Reset << rtf_LCList_DepthStyle() << endl;
newParagraph(); newParagraph();
m_omitParagraph = TRUE; m_omitParagraph = TRUE;
} }
...@@ -1471,16 +908,16 @@ void RTFGenerator::writeListItem() ...@@ -1471,16 +908,16 @@ void RTFGenerator::writeListItem()
{ {
DBG_RTF(t << "{\\comment (writeListItem)}" << endl) DBG_RTF(t << "{\\comment (writeListItem)}" << endl)
newParagraph(); newParagraph();
t << Rtf_Style_Reset; t << rtf_Style_Reset;
if (listItemInfo[m_listLevel].isEnum) if (listItemInfo[m_listLevel].isEnum)
{ {
t << Rtf_EList_DepthStyle() << endl; t << rtf_EList_DepthStyle() << endl;
t << listItemInfo[m_listLevel].number << ".\\tab "; t << listItemInfo[m_listLevel].number << ".\\tab ";
listItemInfo[m_listLevel].number++; listItemInfo[m_listLevel].number++;
} }
else else
{ {
t << Rtf_BList_DepthStyle() << endl; t << rtf_BList_DepthStyle() << endl;
} }
m_omitParagraph = TRUE; m_omitParagraph = TRUE;
} }
...@@ -1489,12 +926,12 @@ void RTFGenerator::writeIndexItem(const char *ref,const char *fn, ...@@ -1489,12 +926,12 @@ void RTFGenerator::writeIndexItem(const char *ref,const char *fn,
const char *name) const char *name)
{ {
DBG_RTF(t << "{\\comment (writeIndexItem)}" << endl) DBG_RTF(t << "{\\comment (writeIndexItem)}" << endl)
//t << Rtf_LCList_DepthStyle() << endl; //t << rtf_LCList_DepthStyle() << endl;
docify(name); docify(name);
if (!ref && fn) if (!ref && fn)
{ {
t << "\\tab "; t << "\\tab ";
WriteRTFReference(fn); writeRTFReference(fn);
t << endl; t << endl;
} }
else else
...@@ -1556,7 +993,7 @@ void RTFGenerator::writeStartAnnoItem(const char *,const char *f, ...@@ -1556,7 +993,7 @@ void RTFGenerator::writeStartAnnoItem(const char *,const char *f,
if (f && Config_getBool("RTF_HYPERLINKS")) if (f && Config_getBool("RTF_HYPERLINKS"))
{ {
t << "{\\field {\\*\\fldinst { HYPERLINK \\\\l \""; t << "{\\field {\\*\\fldinst { HYPERLINK \\\\l \"";
t << formatBmkStr(f); t << rtfFormatBmkStr(f);
t << "\" }{}"; t << "\" }{}";
t << "}{\\fldrslt {\\cs37\\ul\\cf2 "; t << "}{\\fldrslt {\\cs37\\ul\\cf2 ";
...@@ -1577,7 +1014,7 @@ void RTFGenerator::writeEndAnnoItem(const char *name) ...@@ -1577,7 +1014,7 @@ void RTFGenerator::writeEndAnnoItem(const char *name)
if (name) if (name)
{ {
t << "\\tab "; t << "\\tab ";
WriteRTFReference(name); writeRTFReference(name);
t << endl; t << endl;
} }
else else
...@@ -1611,7 +1048,7 @@ void RTFGenerator::endIndexValue(const char *name,bool hasBrief) ...@@ -1611,7 +1048,7 @@ void RTFGenerator::endIndexValue(const char *name,bool hasBrief)
if (name) if (name)
{ {
t << "\\tab "; t << "\\tab ";
WriteRTFReference(name); writeRTFReference(name);
t << endl; t << endl;
} }
else else
...@@ -1626,14 +1063,14 @@ void RTFGenerator::startSubsection() ...@@ -1626,14 +1063,14 @@ void RTFGenerator::startSubsection()
//beginRTFSubSection(); //beginRTFSubSection();
t <<"\n"; t <<"\n";
DBG_RTF(t << "{\\comment Begin SubSection}\n") DBG_RTF(t << "{\\comment Begin SubSection}\n")
t << Rtf_Style_Reset; t << rtf_Style_Reset;
t << Rtf_Style["Heading3"]->reference << "\n"; t << rtf_Style["Heading3"]->reference << "\n";
} }
void RTFGenerator::endSubsection() void RTFGenerator::endSubsection()
{ {
newParagraph(); newParagraph();
t << Rtf_Style_Reset << endl; t << rtf_Style_Reset << endl;
} }
void RTFGenerator::startSubsubsection() void RTFGenerator::startSubsubsection()
...@@ -1642,7 +1079,7 @@ void RTFGenerator::startSubsubsection() ...@@ -1642,7 +1079,7 @@ void RTFGenerator::startSubsubsection()
t << "\n"; t << "\n";
DBG_RTF(t << "{\\comment Begin SubSubSection}\n") DBG_RTF(t << "{\\comment Begin SubSubSection}\n")
t << "{" << endl; t << "{" << endl;
t << Rtf_Style_Reset << Rtf_Style["Heading4"]->reference << "\n"; t << rtf_Style_Reset << rtf_Style["Heading4"]->reference << "\n";
} }
void RTFGenerator::endSubsubsection() void RTFGenerator::endSubsubsection()
...@@ -1735,7 +1172,7 @@ void RTFGenerator::startTextLink(const char *f,const char *anchor) ...@@ -1735,7 +1172,7 @@ void RTFGenerator::startTextLink(const char *f,const char *anchor)
} }
t << "{\\field {\\*\\fldinst { HYPERLINK \\\\l \""; t << "{\\field {\\*\\fldinst { HYPERLINK \\\\l \"";
t << formatBmkStr(ref); t << rtfFormatBmkStr(ref);
t << "\" }{}"; t << "\" }{}";
t << "}{\\fldrslt {\\cs37\\ul\\cf2 "; t << "}{\\fldrslt {\\cs37\\ul\\cf2 ";
} }
...@@ -1766,7 +1203,7 @@ void RTFGenerator::writeObjectLink(const char *ref, const char *f, ...@@ -1766,7 +1203,7 @@ void RTFGenerator::writeObjectLink(const char *ref, const char *f,
} }
t << "{\\field {\\*\\fldinst { HYPERLINK \\\\l \""; t << "{\\field {\\*\\fldinst { HYPERLINK \\\\l \"";
t << formatBmkStr(refName); t << rtfFormatBmkStr(refName);
t << "\" }{}"; t << "\" }{}";
t << "}{\\fldrslt {\\cs37\\ul\\cf2 "; t << "}{\\fldrslt {\\cs37\\ul\\cf2 ";
...@@ -1800,7 +1237,7 @@ void RTFGenerator::endPageRef(const char *clname, const char *anchor) ...@@ -1800,7 +1237,7 @@ void RTFGenerator::endPageRef(const char *clname, const char *anchor)
ref+='_'; ref+='_';
ref+=anchor; ref+=anchor;
} }
WriteRTFReference(ref); writeRTFReference(ref);
endEmphasis(); endEmphasis();
t << ")"; t << ")";
} }
...@@ -1822,7 +1259,7 @@ void RTFGenerator::writeCodeLink(const char *ref,const char *f, ...@@ -1822,7 +1259,7 @@ void RTFGenerator::writeCodeLink(const char *ref,const char *f,
} }
t << "{\\field {\\*\\fldinst { HYPERLINK \\\\l \""; t << "{\\field {\\*\\fldinst { HYPERLINK \\\\l \"";
t << formatBmkStr(refName); t << rtfFormatBmkStr(refName);
t << "\" }{}"; t << "\" }{}";
t << "}{\\fldrslt {\\cs37\\ul\\cf2 "; t << "}{\\fldrslt {\\cs37\\ul\\cf2 ";
...@@ -1841,13 +1278,13 @@ void RTFGenerator::startTitleHead(const char *) ...@@ -1841,13 +1278,13 @@ void RTFGenerator::startTitleHead(const char *)
DBG_RTF(t <<"{\\comment startTitleHead}" << endl) DBG_RTF(t <<"{\\comment startTitleHead}" << endl)
// beginRTFSection(); // 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) void RTFGenerator::endTitleHead(const char *fileName,const char *name)
{ {
DBG_RTF(t <<"{\\comment endTitleHead}" << endl) DBG_RTF(t <<"{\\comment endTitleHead}" << endl)
t << "\\par " << Rtf_Style_Reset << endl; t << "\\par " << rtf_Style_Reset << endl;
if (name) if (name)
{ {
// make table of contents entry // make table of contents entry
...@@ -1883,8 +1320,8 @@ void RTFGenerator::startGroupHeader() ...@@ -1883,8 +1320,8 @@ void RTFGenerator::startGroupHeader()
{ {
DBG_RTF(t <<"{\\comment startGroupHeader}" << endl) DBG_RTF(t <<"{\\comment startGroupHeader}" << endl)
newParagraph(); newParagraph();
t << Rtf_Style_Reset; t << rtf_Style_Reset;
t << Rtf_Style["Heading3"]->reference; t << rtf_Style["Heading3"]->reference;
t << endl; t << endl;
} }
...@@ -1892,7 +1329,7 @@ void RTFGenerator::endGroupHeader() ...@@ -1892,7 +1329,7 @@ void RTFGenerator::endGroupHeader()
{ {
DBG_RTF(t <<"{\\comment endGroupHeader}" << endl) DBG_RTF(t <<"{\\comment endGroupHeader}" << endl)
newParagraph(); newParagraph();
t << Rtf_Style_Reset << endl; t << rtf_Style_Reset << endl;
} }
void RTFGenerator::startMemberDoc(const char *clname, void RTFGenerator::startMemberDoc(const char *clname,
...@@ -1906,10 +1343,10 @@ void RTFGenerator::startMemberDoc(const char *clname, ...@@ -1906,10 +1343,10 @@ void RTFGenerator::startMemberDoc(const char *clname,
addIndexItem(memname,clname); addIndexItem(memname,clname);
addIndexItem(clname,memname); addIndexItem(clname,memname);
} }
t << Rtf_Style_Reset << Rtf_Style["Heading4"]->reference; t << rtf_Style_Reset << rtf_Style["Heading4"]->reference;
//styleStack.push(Rtf_Style_Heading4); //styleStack.push(rtf_Style_Heading4);
t << "{" << endl; t << "{" << endl;
//printf("RTFGenerator::startMemberDoc() `%s'\n",Rtf_Style["Heading4"]->reference); //printf("RTFGenerator::startMemberDoc() `%s'\n",rtf_Style["Heading4"]->reference);
startBold(); startBold();
t << endl; t << endl;
} }
...@@ -1920,7 +1357,7 @@ void RTFGenerator::endMemberDoc() ...@@ -1920,7 +1357,7 @@ void RTFGenerator::endMemberDoc()
t << "}" << endl; t << "}" << endl;
//const char *style = styleStack.pop(); //const char *style = styleStack.pop();
//printf("RTFGenerator::endMemberDoc() `%s'\n",style); //printf("RTFGenerator::endMemberDoc() `%s'\n",style);
//ASSERT(style==Rtf_Style["Heading4"]->reference); //ASSERT(style==rtf_Style["Heading4"]->reference);
endBold(); endBold();
newParagraph(); newParagraph();
} }
...@@ -1946,10 +1383,10 @@ void RTFGenerator::endDoxyAnchor(const char *fName,const char *anchor) ...@@ -1946,10 +1383,10 @@ void RTFGenerator::endDoxyAnchor(const char *fName,const char *anchor)
DBG_RTF(t << "{\\comment endDoxyAnchor}" << endl) DBG_RTF(t << "{\\comment endDoxyAnchor}" << endl)
t << "{\\bkmkstart "; t << "{\\bkmkstart ";
t << formatBmkStr(ref); t << rtfFormatBmkStr(ref);
t << "}" << endl; t << "}" << endl;
t << "{\\bkmkend "; t << "{\\bkmkend ";
t << formatBmkStr(ref); t << rtfFormatBmkStr(ref);
t << "}" << endl; t << "}" << endl;
} }
...@@ -1979,13 +1416,13 @@ void RTFGenerator::startIndent() ...@@ -1979,13 +1416,13 @@ void RTFGenerator::startIndent()
incrementIndentLevel(); incrementIndentLevel();
DBG_RTF(t << "{\\comment (startIndent) }" << endl) DBG_RTF(t << "{\\comment (startIndent) }" << endl)
t << "{" << endl; t << "{" << endl;
t << Rtf_Style_Reset << Rtf_CList_DepthStyle() << endl; t << rtf_Style_Reset << rtf_CList_DepthStyle() << endl;
//styleStack.push(style); //styleStack.push(style);
} }
void RTFGenerator::endIndent() void RTFGenerator::endIndent()
{ {
//const char *style = /* Rtf_CList_DepthStyle(); */ //const char *style = /* rtf_CList_DepthStyle(); */
t << "}" << endl; t << "}" << endl;
decrementIndentLevel(); decrementIndentLevel();
} }
...@@ -1995,7 +1432,7 @@ void RTFGenerator::startDescription() ...@@ -1995,7 +1432,7 @@ void RTFGenerator::startDescription()
{ {
DBG_RTF(t << "{\\comment (startDescription)}" << endl) DBG_RTF(t << "{\\comment (startDescription)}" << endl)
t << "{" << endl; t << "{" << endl;
t << Rtf_Style_Reset << Rtf_CList_DepthStyle(); t << rtf_Style_Reset << rtf_CList_DepthStyle();
} }
void RTFGenerator::endDescription() void RTFGenerator::endDescription()
...@@ -2024,7 +1461,7 @@ void RTFGenerator::startMemberDescription() ...@@ -2024,7 +1461,7 @@ void RTFGenerator::startMemberDescription()
DBG_RTF(t << "{\\comment (startMemberDescription)}" << endl) DBG_RTF(t << "{\\comment (startMemberDescription)}" << endl)
t << "{" << endl; t << "{" << endl;
incrementIndentLevel(); incrementIndentLevel();
t << Rtf_Style_Reset << Rtf_CList_DepthStyle(); t << rtf_Style_Reset << rtf_CList_DepthStyle();
startEmphasis(); startEmphasis();
} }
...@@ -2053,7 +1490,7 @@ void RTFGenerator::endDescTitle() ...@@ -2053,7 +1490,7 @@ void RTFGenerator::endDescTitle()
t << "}"; t << "}";
newParagraph(); newParagraph();
incrementIndentLevel(); incrementIndentLevel();
t << Rtf_Style_Reset << Rtf_DList_DepthStyle(); t << rtf_Style_Reset << rtf_DList_DepthStyle();
} }
void RTFGenerator::writeDescItem() void RTFGenerator::writeDescItem()
...@@ -2075,7 +1512,7 @@ void RTFGenerator::startSection(const char *,const char *title,SectionInfo::Sect ...@@ -2075,7 +1512,7 @@ void RTFGenerator::startSection(const char *,const char *title,SectionInfo::Sect
{ {
DBG_RTF(t << "{\\comment (startSection)}" << endl) DBG_RTF(t << "{\\comment (startSection)}" << endl)
t << "{"; t << "{";
t<< Rtf_Style_Reset; t<< rtf_Style_Reset;
int num=4; int num=4;
switch(type) switch(type)
{ {
...@@ -2087,7 +1524,7 @@ void RTFGenerator::startSection(const char *,const char *title,SectionInfo::Sect ...@@ -2087,7 +1524,7 @@ void RTFGenerator::startSection(const char *,const char *title,SectionInfo::Sect
QCString heading; QCString heading;
heading.sprintf("Heading%d",num); heading.sprintf("Heading%d",num);
// set style // set style
t << Rtf_Style[heading]->reference; t << rtf_Style[heading]->reference;
// make table of contents entry // make table of contents entry
t << "{\\tc\\tcl" << num << " \\v "; t << "{\\tc\\tcl" << num << " \\v ";
docify(title); docify(title);
...@@ -2117,7 +1554,7 @@ void RTFGenerator::writeSectionRef(const char *ref,const char *, ...@@ -2117,7 +1554,7 @@ void RTFGenerator::writeSectionRef(const char *ref,const char *,
endBold(); endBold();
t << " ("; t << " (";
docify(theTranslator->trPageAbbreviation()); docify(theTranslator->trPageAbbreviation());
WriteRTFReference(lab); writeRTFReference(lab);
t << ")" << endl; t << ")" << endl;
} }
} }
...@@ -2127,7 +1564,7 @@ void RTFGenerator::writeSectionRefItem(const char *,const char *lab, ...@@ -2127,7 +1564,7 @@ void RTFGenerator::writeSectionRefItem(const char *,const char *lab,
{ {
docify(title); docify(title);
t << "\\tab"; t << "\\tab";
WriteRTFReference(lab); writeRTFReference(lab);
t << endl; t << endl;
} }
...@@ -2258,7 +1695,7 @@ void RTFGenerator::endClassDiagram(ClassDiagram &d, ...@@ -2258,7 +1695,7 @@ void RTFGenerator::endClassDiagram(ClassDiagram &d,
// display the file // display the file
t << "{" << endl; t << "{" << endl;
t << Rtf_Style_Reset << endl; t << rtf_Style_Reset << endl;
t << "\\par\\pard \\qc {\\field\\flddirty {\\*\\fldinst INCLUDEPICTURE "; t << "\\par\\pard \\qc {\\field\\flddirty {\\*\\fldinst INCLUDEPICTURE ";
t << fileName << ".png"; t << fileName << ".png";
t << " \\\\d \\\\*MERGEFORMAT}{\\fldrslt IMAGE}}\\par" << endl; t << " \\\\d \\\\*MERGEFORMAT}{\\fldrslt IMAGE}}\\par" << endl;
...@@ -2273,7 +1710,7 @@ void RTFGenerator::writeFormula(const char *,const char *text) ...@@ -2273,7 +1710,7 @@ void RTFGenerator::writeFormula(const char *,const char *text)
void RTFGenerator::startMemberItem(int) void RTFGenerator::startMemberItem(int)
{ {
DBG_RTF(t <<"{\\comment startMemberItem }" << endl) 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) void RTFGenerator::endMemberItem(bool)
...@@ -2299,14 +1736,14 @@ void RTFGenerator::writeAnchor(const char *fileName,const char *name) ...@@ -2299,14 +1736,14 @@ void RTFGenerator::writeAnchor(const char *fileName,const char *name)
} }
DBG_RTF(t <<"{\\comment writeAncheor (" << anchor << ")}" << endl) DBG_RTF(t <<"{\\comment writeAncheor (" << anchor << ")}" << endl)
t << "{\\bkmkstart " << formatBmkStr(anchor) << "}" << endl; t << "{\\bkmkstart " << rtfFormatBmkStr(anchor) << "}" << endl;
t << "{\\bkmkend " << formatBmkStr(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 << "{\\field\\fldedit {\\*\\fldinst PAGEREF ";
t << formatBmkStr(label); t << rtfFormatBmkStr(label);
t << " \\\\*MERGEFORMAT}{\\fldrslt pagenum}}"; t << " \\\\*MERGEFORMAT}{\\fldrslt pagenum}}";
} }
...@@ -2314,8 +1751,8 @@ void RTFGenerator::startCodeFragment() ...@@ -2314,8 +1751,8 @@ void RTFGenerator::startCodeFragment()
{ {
t << "{" << endl; t << "{" << endl;
newParagraph(); newParagraph();
t << Rtf_Style_Reset << Rtf_Code_DepthStyle(); t << rtf_Style_Reset << rtf_Code_DepthStyle();
//styleStack.push(Rtf_Style_CodeExample); //styleStack.push(rtf_Style_CodeExample);
} }
void RTFGenerator::endCodeFragment() void RTFGenerator::endCodeFragment()
...@@ -2323,7 +1760,7 @@ void RTFGenerator::endCodeFragment() ...@@ -2323,7 +1760,7 @@ void RTFGenerator::endCodeFragment()
newParagraph(); newParagraph();
//styleStack.pop(); //styleStack.pop();
//printf("RTFGenerator::endCodeFrament() top=%s\n",styleStack.top()); //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) DBG_RTF(t << "{\\comment (endCodeFragment) }" << endl)
t << "}" << endl; t << "}" << endl;
m_omitParagraph = TRUE; m_omitParagraph = TRUE;
...@@ -2360,7 +1797,7 @@ void RTFGenerator::startImage(const char *name,const char *,bool) ...@@ -2360,7 +1797,7 @@ void RTFGenerator::startImage(const char *name,const char *,bool)
{ {
newParagraph(); newParagraph();
t << "{" << endl; t << "{" << endl;
t << Rtf_Style_Reset << endl; t << rtf_Style_Reset << endl;
t << "\\par\\pard \\qc {\\field\\flddirty {\\*\\fldinst INCLUDEPICTURE "; t << "\\par\\pard \\qc {\\field\\flddirty {\\*\\fldinst INCLUDEPICTURE ";
t << name; t << name;
t << " \\\\d \\\\*MERGEFORMAT}{\\fldrslt IMAGE}}\\par" << endl; t << " \\\\d \\\\*MERGEFORMAT}{\\fldrslt IMAGE}}\\par" << endl;
...@@ -2384,7 +1821,7 @@ void RTFGenerator::startDotFile(const char *name,bool) ...@@ -2384,7 +1821,7 @@ void RTFGenerator::startDotFile(const char *name,bool)
writeDotGraphFromFile(name,outDir,baseName,BITMAP); writeDotGraphFromFile(name,outDir,baseName,BITMAP);
newParagraph(); newParagraph();
t << "{" << endl; t << "{" << endl;
t << Rtf_Style_Reset << endl; t << rtf_Style_Reset << endl;
t << "\\par\\pard \\qc {\\field\\flddirty {\\*\\fldinst INCLUDEPICTURE "; t << "\\par\\pard \\qc {\\field\\flddirty {\\*\\fldinst INCLUDEPICTURE ";
t << outDir << "\\" << baseName; t << outDir << "\\" << baseName;
t << " \\\\d \\\\*MERGEFORMAT}{\\fldrslt IMAGE}}\\par" << endl; t << " \\\\d \\\\*MERGEFORMAT}{\\fldrslt IMAGE}}\\par" << endl;
...@@ -2401,7 +1838,7 @@ void RTFGenerator::startDescTable() ...@@ -2401,7 +1838,7 @@ void RTFGenerator::startDescTable()
DBG_RTF(t << "{\\comment (startDescTable) }" << endl) DBG_RTF(t << "{\\comment (startDescTable) }" << endl)
//t << "{" << endl; //t << "{" << endl;
//incrementIndentLevel(); //incrementIndentLevel();
//t << Rtf_Style_Reset << Rtf_CList_DepthStyle(); //t << rtf_Style_Reset << rtf_CList_DepthStyle();
} }
void RTFGenerator::endDescTable() void RTFGenerator::endDescTable()
...@@ -2409,12 +1846,12 @@ void RTFGenerator::endDescTable() ...@@ -2409,12 +1846,12 @@ void RTFGenerator::endDescTable()
//decrementIndentLevel(); //decrementIndentLevel();
DBG_RTF(t << "{\\comment (endDescTable)}" << endl) DBG_RTF(t << "{\\comment (endDescTable)}" << endl)
//t << "}" << endl; //t << "}" << endl;
//t << Rtf_Style_Reset << styleStack.top(); //t << rtf_Style_Reset << styleStack.top();
} }
void RTFGenerator::startDescTableTitle() void RTFGenerator::startDescTableTitle()
{ {
//t << Rtf_BList_DepthStyle() << endl; //t << rtf_BList_DepthStyle() << endl;
DBG_RTF(t << "{\\comment (startDescTableTitle) }" << endl) DBG_RTF(t << "{\\comment (startDescTableTitle) }" << endl)
startBold(); startBold();
startEmphasis(); startEmphasis();
...@@ -2464,57 +1901,57 @@ void RTFGenerator::decrementIndentLevel() ...@@ -2464,57 +1901,57 @@ void RTFGenerator::decrementIndentLevel()
} }
// a style for list formatted with "list continue" style // 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); 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 // 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); 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 // 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); 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 // 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); 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); 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); QCString n=makeIndexName("CodeExample",m_listLevel);
return Rtf_Style[n]->reference; return rtf_Style[n]->reference;
} }
void RTFGenerator::startTextBlock(bool dense) void RTFGenerator::startTextBlock(bool dense)
{ {
DBG_RTF(t << "{\\comment startTextBlock}" << endl) DBG_RTF(t << "{\\comment startTextBlock}" << endl)
t << "{" << endl; t << "{" << endl;
t << Rtf_Style_Reset; t << rtf_Style_Reset;
if (dense) // no spacing between "paragraphs" if (dense) // no spacing between "paragraphs"
{ {
t << Rtf_Style["DenseText"]->reference; t << rtf_Style["DenseText"]->reference;
} }
else // some spacing else // some spacing
{ {
t << Rtf_Style["BodyText"]->reference; t << rtf_Style["BodyText"]->reference;
} }
} }
...@@ -2537,7 +1974,7 @@ void RTFGenerator::startMemberSubtitle() ...@@ -2537,7 +1974,7 @@ void RTFGenerator::startMemberSubtitle()
{ {
DBG_RTF(t << "{\\comment startMemberSubtitle}" << endl) DBG_RTF(t << "{\\comment startMemberSubtitle}" << endl)
t << "{" << endl; t << "{" << endl;
t << Rtf_Style_Reset << Rtf_CList_DepthStyle() << endl; t << rtf_Style_Reset << rtf_CList_DepthStyle() << endl;
} }
void RTFGenerator::endMemberSubtitle() void RTFGenerator::endMemberSubtitle()
...@@ -2742,7 +2179,7 @@ void RTFGenerator::endDotGraph(DotClassGraph &g) ...@@ -2742,7 +2179,7 @@ void RTFGenerator::endDotGraph(DotClassGraph &g)
// display the file // display the file
t << "{" << endl; t << "{" << endl;
t << Rtf_Style_Reset << endl; t << rtf_Style_Reset << endl;
t << "\\par\\pard \\qc {\\field\\flddirty {\\*\\fldinst INCLUDEPICTURE "; t << "\\par\\pard \\qc {\\field\\flddirty {\\*\\fldinst INCLUDEPICTURE ";
t << fileName << "." << Config_getEnum("DOT_IMAGE_FORMAT"); t << fileName << "." << Config_getEnum("DOT_IMAGE_FORMAT");
t << " \\\\d \\\\*MERGEFORMAT}{\\fldrslt IMAGE}}\\par" << endl; t << " \\\\d \\\\*MERGEFORMAT}{\\fldrslt IMAGE}}\\par" << endl;
...@@ -2761,7 +2198,7 @@ void RTFGenerator::endInclDepGraph(DotInclDepGraph &g) ...@@ -2761,7 +2198,7 @@ void RTFGenerator::endInclDepGraph(DotInclDepGraph &g)
// display the file // display the file
t << "{" << endl; t << "{" << endl;
t << Rtf_Style_Reset << endl; t << rtf_Style_Reset << endl;
t << "\\par\\pard \\qc {\\field\\flddirty {\\*\\fldinst INCLUDEPICTURE "; t << "\\par\\pard \\qc {\\field\\flddirty {\\*\\fldinst INCLUDEPICTURE ";
t << fileName << "." << Config_getEnum("DOT_IMAGE_FORMAT"); t << fileName << "." << Config_getEnum("DOT_IMAGE_FORMAT");
t << " \\\\d \\\\*MERGEFORMAT}{\\fldrslt IMAGE}}\\par" << endl; t << " \\\\d \\\\*MERGEFORMAT}{\\fldrslt IMAGE}}\\par" << endl;
...@@ -2870,14 +2307,14 @@ void RTFGenerator::startMemberGroupHeader(bool hasHeader) ...@@ -2870,14 +2307,14 @@ void RTFGenerator::startMemberGroupHeader(bool hasHeader)
DBG_RTF(t << "{\\comment startMemberGroupHeader}" << endl) DBG_RTF(t << "{\\comment startMemberGroupHeader}" << endl)
t << "{" << endl; t << "{" << endl;
if (hasHeader) incrementIndentLevel(); if (hasHeader) incrementIndentLevel();
t << Rtf_Style_Reset << Rtf_Style["GroupHeader"]->reference; t << rtf_Style_Reset << rtf_Style["GroupHeader"]->reference;
} }
void RTFGenerator::endMemberGroupHeader() void RTFGenerator::endMemberGroupHeader()
{ {
DBG_RTF(t << "{\\comment endMemberGroupHeader}" << endl) DBG_RTF(t << "{\\comment endMemberGroupHeader}" << endl)
newParagraph(); newParagraph();
t << Rtf_Style_Reset << Rtf_CList_DepthStyle(); t << rtf_Style_Reset << rtf_CList_DepthStyle();
} }
void RTFGenerator::startMemberGroupDocs() void RTFGenerator::startMemberGroupDocs()
...@@ -2896,7 +2333,7 @@ void RTFGenerator::endMemberGroupDocs() ...@@ -2896,7 +2333,7 @@ void RTFGenerator::endMemberGroupDocs()
void RTFGenerator::startMemberGroup() void RTFGenerator::startMemberGroup()
{ {
DBG_RTF(t << "{\\comment startMemberGroup}" << endl) 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) void RTFGenerator::endMemberGroup(bool hasHeader)
...@@ -2925,7 +2362,7 @@ void RTFGenerator::startSimpleSect(SectionTypes,const char *file,const char *anc ...@@ -2925,7 +2362,7 @@ void RTFGenerator::startSimpleSect(SectionTypes,const char *file,const char *anc
t << "}"; t << "}";
newParagraph(); newParagraph();
incrementIndentLevel(); incrementIndentLevel();
t << Rtf_Style_Reset << Rtf_DList_DepthStyle(); t << rtf_Style_Reset << rtf_DList_DepthStyle();
} }
void RTFGenerator::endSimpleSect() void RTFGenerator::endSimpleSect()
...@@ -2949,7 +2386,7 @@ void RTFGenerator::startParamList(ParamListTypes,const char *title) ...@@ -2949,7 +2386,7 @@ void RTFGenerator::startParamList(ParamListTypes,const char *title)
t << "}"; t << "}";
newParagraph(); newParagraph();
incrementIndentLevel(); incrementIndentLevel();
t << Rtf_Style_Reset << Rtf_DList_DepthStyle(); t << rtf_Style_Reset << rtf_DList_DepthStyle();
} }
void RTFGenerator::endParamList() void RTFGenerator::endParamList()
......
...@@ -107,7 +107,7 @@ class RTFGenerator : public OutputGenerator ...@@ -107,7 +107,7 @@ class RTFGenerator : public OutputGenerator
//void memberGroupSeparator() {} //void memberGroupSeparator() {}
void insertMemberAlign() {} void insertMemberAlign() {}
void writeRuler(){RtfwriteRuler_thin();}; void writeRuler() { rtfwriteRuler_thin(); }
void writeAnchor(const char *fileName,const char *name); void writeAnchor(const char *fileName,const char *name);
void startCodeFragment(); void startCodeFragment();
...@@ -262,12 +262,12 @@ class RTFGenerator : public OutputGenerator ...@@ -262,12 +262,12 @@ class RTFGenerator : public OutputGenerator
RTFGenerator(const RTFGenerator &); RTFGenerator(const RTFGenerator &);
RTFGenerator &operator=(const RTFGenerator &); RTFGenerator &operator=(const RTFGenerator &);
const char *Rtf_BList_DepthStyle(); const char *rtf_BList_DepthStyle();
const char *Rtf_CList_DepthStyle(); const char *rtf_CList_DepthStyle();
const char *Rtf_EList_DepthStyle(); const char *rtf_EList_DepthStyle();
const char *Rtf_LCList_DepthStyle(); const char *rtf_LCList_DepthStyle();
const char *Rtf_DList_DepthStyle(); const char *rtf_DList_DepthStyle();
const char *Rtf_Code_DepthStyle(); const char *rtf_Code_DepthStyle();
void incrementIndentLevel(); void incrementIndentLevel();
void decrementIndentLevel(); void decrementIndentLevel();
int col; int col;
...@@ -280,11 +280,11 @@ class RTFGenerator : public OutputGenerator ...@@ -280,11 +280,11 @@ class RTFGenerator : public OutputGenerator
void beginRTFDocument(); void beginRTFDocument();
void beginRTFChapter(); void beginRTFChapter();
void beginRTFSection(); void beginRTFSection();
void RtfwriteRuler_doubleline() { t << "{\\pard\\widctlpar\\brdrb\\brdrdb\\brdrw15\\brsp20 \\adjustright \\par}" << endl; }; 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_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_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 rtfwriteRuler_thin() { t << "{\\pard\\widctlpar\\brdrb\\brdrs\\brdrw5\\brsp20 \\adjustright \\par}" << endl; };
void WriteRTFReference(const char *label); void writeRTFReference(const char *label);
char *getMultiByte(int c); char *getMultiByte(int c);
}; };
......
/******************************************************************************
*
*
*
*
* 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++;
}
}
/******************************************************************************
*
*
*
*
* 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
...@@ -282,6 +282,12 @@ static void addSection() ...@@ -282,6 +282,12 @@ static void addSection()
{ {
//printf("New section pageName=%s label=%s title=%s\n", //printf("New section pageName=%s label=%s title=%s\n",
// current->name.data(),sectionLabel.data(),sectionTitle.data()); // 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 (sectionLabel.isEmpty()) return;
if (Doxygen::sectionDict.find(sectionLabel)==0) if (Doxygen::sectionDict.find(sectionLabel)==0)
{ {
...@@ -3343,7 +3349,9 @@ CHARLIT (("'"\\[0-7]{1,3}"'")|("'"\\."'")|("'"[^'\\\n]{1,4}"'")) ...@@ -3343,7 +3349,9 @@ CHARLIT (("'"\\[0-7]{1,3}"'")|("'"\\."'")|("'"[^'\\\n]{1,4}"'"))
current->name = yytext; current->name = yytext;
newDocState(); newDocState();
} }
<NameSpaceDocArg1>"\\"{B}*"\n" { yyLineNr++; } <NameSpaceDocArg1>"\\"{B}*"\n" {
yyLineNr++;
}
<NameSpaceDocArg1>"\n" { <NameSpaceDocArg1>"\n" {
warn(yyFileName,yyLineNr, warn(yyFileName,yyLineNr,
"Warning: missing argument after " "Warning: missing argument after "
...@@ -3355,7 +3363,9 @@ CHARLIT (("'"\\[0-7]{1,3}"'")|("'"\\."'")|("'"[^'\\\n]{1,4}"'")) ...@@ -3355,7 +3363,9 @@ CHARLIT (("'"\\[0-7]{1,3}"'")|("'"\\."'")|("'"[^'\\\n]{1,4}"'"))
current->name = yytext; current->name = yytext;
newDocState(); newDocState();
} }
<PackageDocArg1>"\\"{B}*"\n" { yyLineNr++; } <PackageDocArg1>"\\"{B}*"\n" {
yyLineNr++;
}
<PackageDocArg1>"\n" { <PackageDocArg1>"\n" {
warn(yyFileName,yyLineNr, warn(yyFileName,yyLineNr,
"Warning: missing argument after " "Warning: missing argument after "
...@@ -3376,7 +3386,9 @@ CHARLIT (("'"\\[0-7]{1,3}"'")|("'"\\."'")|("'"[^'\\\n]{1,4}"'")) ...@@ -3376,7 +3386,9 @@ CHARLIT (("'"\\[0-7]{1,3}"'")|("'"\\."'")|("'"[^'\\\n]{1,4}"'"))
prependScope(); prependScope();
BEGIN( ClassDocArg2 ); BEGIN( ClassDocArg2 );
} }
<ClassDocArg1>"\\"{B}*"\n" { yyLineNr++; } <ClassDocArg1>"\\"{B}*"\n" {
yyLineNr++;
}
<ClassDocArg1>"\n" { <ClassDocArg1>"\n" {
warn(yyFileName,yyLineNr, warn(yyFileName,yyLineNr,
"Warning: missing argument after " "Warning: missing argument after "
...@@ -3394,7 +3406,8 @@ CHARLIT (("'"\\[0-7]{1,3}"'")|("'"\\."'")|("'"[^'\\\n]{1,4}"'")) ...@@ -3394,7 +3406,8 @@ CHARLIT (("'"\\[0-7]{1,3}"'")|("'"\\."'")|("'"[^'\\\n]{1,4}"'"))
current->name=current->name.left(current->name.length()-5); current->name=current->name.left(current->name.length()-5);
BEGIN(GroupDocArg2); BEGIN(GroupDocArg2);
} }
<GroupDocArg1>"\\"{B}*"\n" { yyLineNr++; } <GroupDocArg1>"\\"{B}*"\n" { yyLineNr++;
}
<GroupDocArg1>"\n" { <GroupDocArg1>"\n" {
warn(yyFileName,yyLineNr, warn(yyFileName,yyLineNr,
"Warning: missing group name after %s", "Warning: missing group name after %s",
...@@ -3408,7 +3421,8 @@ CHARLIT (("'"\\[0-7]{1,3}"'")|("'"\\."'")|("'"[^'\\\n]{1,4}"'")) ...@@ -3408,7 +3421,8 @@ CHARLIT (("'"\\[0-7]{1,3}"'")|("'"\\."'")|("'"[^'\\\n]{1,4}"'"))
yyLineNr--; yyLineNr--;
unput('/');unput('*');unput('\n'); unput('/');unput('*');unput('\n');
} }
<GroupDocArg2>"\\"{B}*"\n" { yyLineNr++; } <GroupDocArg2>"\\"{B}*"\n" { yyLineNr++;
}
<GroupDocArg2>[^\n\*]+ { <GroupDocArg2>[^\n\*]+ {
current->type += yytext; current->type += yytext;
current->type = current->type.stripWhiteSpace(); current->type = current->type.stripWhiteSpace();
...@@ -3428,7 +3442,8 @@ CHARLIT (("'"\\[0-7]{1,3}"'")|("'"\\."'")|("'"[^'\\\n]{1,4}"'")) ...@@ -3428,7 +3442,8 @@ CHARLIT (("'"\\[0-7]{1,3}"'")|("'"\\."'")|("'"[^'\\\n]{1,4}"'"))
current->includeFile = stripQuotes(yytext); current->includeFile = stripQuotes(yytext);
BEGIN( ClassDocArg3 ); BEGIN( ClassDocArg3 );
} }
<ClassDocArg2>"\\"{B}*"\n" { yyLineNr++; } <ClassDocArg2>"\\"{B}*"\n" { yyLineNr++;
}
<ClassDocArg2>"\n" { yyLineNr++; <ClassDocArg2>"\n" { yyLineNr++;
newDocState(); newDocState();
} }
...@@ -3437,7 +3452,8 @@ CHARLIT (("'"\\[0-7]{1,3}"'")|("'"\\."'")|("'"[^'\\\n]{1,4}"'")) ...@@ -3437,7 +3452,8 @@ CHARLIT (("'"\\[0-7]{1,3}"'")|("'"\\."'")|("'"[^'\\\n]{1,4}"'"))
current->includeName = yytext; current->includeName = yytext;
newDocState(); newDocState();
} }
<ClassDocArg3>"\\"{B}*"\n" { yyLineNr++; } <ClassDocArg3>"\\"{B}*"\n" { yyLineNr++;
}
<ClassDocArg3>"\n" { yyLineNr++; <ClassDocArg3>"\n" { yyLineNr++;
newDocState(); newDocState();
} }
...@@ -3445,7 +3461,8 @@ CHARLIT (("'"\\[0-7]{1,3}"'")|("'"\\."'")|("'"[^'\\\n]{1,4}"'")) ...@@ -3445,7 +3461,8 @@ CHARLIT (("'"\\[0-7]{1,3}"'")|("'"\\."'")|("'"[^'\\\n]{1,4}"'"))
current->name = stripQuotes(yytext); current->name = stripQuotes(yytext);
newDocState(); newDocState();
} }
<FileDocArg1>"\\"{B}*"\n" { yyLineNr++; } <FileDocArg1>"\\"{B}*"\n" { yyLineNr++;
}
<FileDocArg1>"\n" { <FileDocArg1>"\n" {
current->name = yyFileName; current->name = yyFileName;
yyLineNr++; yyLineNr++;
...@@ -3455,7 +3472,9 @@ CHARLIT (("'"\\[0-7]{1,3}"'")|("'"\\."'")|("'"[^'\\\n]{1,4}"'")) ...@@ -3455,7 +3472,9 @@ CHARLIT (("'"\\[0-7]{1,3}"'")|("'"\\."'")|("'"[^'\\\n]{1,4}"'"))
current->name = stripQuotes(yytext); current->name = stripQuotes(yytext);
BEGIN( PageDocArg2 ); BEGIN( PageDocArg2 );
} }
<PageDocArg1>"\\"{B}*"\n" { yyLineNr++; } <PageDocArg1>"\\"{B}*"\n" { yyLineNr++;
current->doc+="\n";
}
<PageDocArg1>"\n" { <PageDocArg1>"\n" {
warn(yyFileName,yyLineNr, warn(yyFileName,yyLineNr,
"Warning: missing argument after " "Warning: missing argument after "
...@@ -3476,11 +3495,14 @@ CHARLIT (("'"\\[0-7]{1,3}"'")|("'"\\."'")|("'"[^'\\\n]{1,4}"'")) ...@@ -3476,11 +3495,14 @@ CHARLIT (("'"\\[0-7]{1,3}"'")|("'"\\."'")|("'"[^'\\\n]{1,4}"'"))
prependScope(); prependScope();
newDocState(); newDocState();
} }
<EnumDocArg1>"\\"{B}*"\n" { yyLineNr++; } <EnumDocArg1>"\\"{B}*"\n" { yyLineNr++;
current->doc+="\n";
}
<EnumDocArg1>"\n" { <EnumDocArg1>"\n" {
warn(yyFileName,yyLineNr, warn(yyFileName,yyLineNr,
"Warning: missing argument after \\enum." "Warning: missing argument after \\enum."
); );
current->doc+="\n";
yyLineNr++; yyLineNr++;
BEGIN( Doc ); BEGIN( Doc );
} }
...@@ -3504,6 +3526,7 @@ CHARLIT (("'"\\[0-7]{1,3}"'")|("'"\\."'")|("'"[^'\\\n]{1,4}"'")) ...@@ -3504,6 +3526,7 @@ CHARLIT (("'"\\[0-7]{1,3}"'")|("'"\\."'")|("'"[^'\\\n]{1,4}"'"))
} }
<GroupHeader>\n { <GroupHeader>\n {
yyLineNr++; yyLineNr++;
current->doc+="\n";
//printf("Found memberGroup=`%s'\n",memberGroupHeader.data()); //printf("Found memberGroup=`%s'\n",memberGroupHeader.data());
startGroupInDoc(); startGroupInDoc();
newDocState(); newDocState();
...@@ -4255,7 +4278,7 @@ CHARLIT (("'"\\[0-7]{1,3}"'")|("'"\\."'")|("'"[^'\\\n]{1,4}"'")) ...@@ -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}*)?)"*"+/[^/]
<Doc,JavaDoc,ClassDoc,PageDoc,ExampleDoc,ReadFormulaShort,ReadFormulaLong,ClassDocBrief,AfterDoc,AfterDocBrief>^{B}*(("//"{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 <Doc,ClassDoc,PageDoc,ExampleDoc,AfterDoc>"\\"[a-z_A-Z][a-z_A-Z0-9]*[\\] { // directory type of text
......
...@@ -2136,12 +2136,13 @@ bool getDefs(const QCString &scName,const QCString &memberName, ...@@ -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,"()")) if (members.count()!=1 && !strcmp(args,"()"))
{ {
// no exact match found, but if args="()" an arbitrary // no exact match found, but if args="()" an arbitrary
// member will do // member will do
md=mn->last(); md=mn->last();
while (md) while (md && md->isLinkable())
{ {
//printf("Found member `%s'\n",md->name().data()); //printf("Found member `%s'\n",md->name().data());
//printf("member is linkable md->name()=`%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, ...@@ -2363,6 +2364,7 @@ bool resolveRef(/* in */ const char *scName,
GroupDef *gd = 0; GroupDef *gd = 0;
// check if nameStr is a member or global. // 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, if (getDefs(scopeStr,nameStr,argsStr,
md,cd,fd,nd,gd, md,cd,fd,nd,gd,
scopePos==0 && !memberScopeFirst, scopePos==0 && !memberScopeFirst,
...@@ -2378,6 +2380,8 @@ bool resolveRef(/* in */ const char *scName, ...@@ -2378,6 +2380,8 @@ bool resolveRef(/* in */ const char *scName,
else if (fd) *resContext=fd; else if (fd) *resContext=fd;
else if (gd) *resContext=gd; else if (gd) *resContext=gd;
else { *resContext=0; *resMember=0; return FALSE; } 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; return TRUE;
} }
else if (inSeeBlock && !nameStr.isEmpty() && (gd=Doxygen::groupSDict[nameStr])) else if (inSeeBlock && !nameStr.isEmpty() && (gd=Doxygen::groupSDict[nameStr]))
...@@ -2539,6 +2543,7 @@ bool resolveLink(/* in */ const char *scName, ...@@ -2539,6 +2543,7 @@ bool resolveLink(/* in */ const char *scName,
bool generateLink(OutputDocInterface &od,const char *clName, bool generateLink(OutputDocInterface &od,const char *clName,
const char *lr,bool inSeeBlock,const char *lt) const char *lr,bool inSeeBlock,const char *lt)
{ {
//printf("generateLink(clName=%s,lr=%s,lr=%s)\n",clName,lr,lt);
Definition *compound; Definition *compound;
PageInfo *pageInfo; PageInfo *pageInfo;
QCString anchor,linkText=lt; QCString anchor,linkText=lt;
...@@ -3386,7 +3391,7 @@ found: ...@@ -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 QCString &doc,QList<QCString> *anchors,
const char *fileName,int startLine, const char *fileName,int startLine,
const QList<ListItemInfo> *sli, const QList<ListItemInfo> *sli,
...@@ -3474,6 +3479,7 @@ void addRelatedPage(const char *name,const QCString &ptitle, ...@@ -3474,6 +3479,7 @@ void addRelatedPage(const char *name,const QCString &ptitle,
Doxygen::sectionDict.insert(pageName,si); Doxygen::sectionDict.insert(pageName,si);
} }
} }
return pi;
} }
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
...@@ -3902,3 +3908,47 @@ void filterLatexString(QTextStream &t,const char *str, ...@@ -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;
}
...@@ -190,7 +190,7 @@ int getScopeFragment(const QCString &s,int p,int *l); ...@@ -190,7 +190,7 @@ int getScopeFragment(const QCString &s,int p,int *l);
int filterCRLF(char *buf,int len); int filterCRLF(char *buf,int len);
void addRefItem(const QList<ListItemInfo> *sli,const char *prefix, void addRefItem(const QList<ListItemInfo> *sli,const char *prefix,
const char *name,const char *title,const char *args=0); 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 QCString &doc,QList<QCString> *anchors,
const char *fileName,int startLine, const char *fileName,int startLine,
const QList<ListItemInfo> *sli, const QList<ListItemInfo> *sli,
...@@ -201,6 +201,7 @@ QCString escapeCharsInString(const char *name,bool allowDots); ...@@ -201,6 +201,7 @@ QCString escapeCharsInString(const char *name,bool allowDots);
void addGroupListToTitle(OutputList &ol,Definition *d); void addGroupListToTitle(OutputList &ol,Definition *d);
void filterLatexString(QTextStream &t,const char *str, void filterLatexString(QTextStream &t,const char *str,
bool insideTabbing=FALSE,bool insidePre=FALSE); bool insideTabbing=FALSE,bool insidePre=FALSE);
QCString rtfFormatBmkStr(const char *name);
#endif #endif
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment