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