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
......@@ -1041,6 +1041,10 @@ ALIASES = "english=\if english" \
This command places an invisible, named anchor into the documentation
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".
<hr>
......
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)
{
......@@ -249,6 +252,12 @@ ID [a-z_A-Z][a-z_A-Z0-9]*
BEGIN( ReadDocBlock );
}
<ReadFuncArgType,ReadFuncArgDef>[,)>] {
if (*yytext==')' && g_curArgTypeName.stripWhiteSpace().isEmpty())
{
g_curArgTypeName+=*yytext;
}
else
{
g_curArgTypeName=removeRedundantWhiteSpace(g_curArgTypeName);
g_curArgDefValue=g_curArgDefValue.stripWhiteSpace();
//printf("curArgType=`%s' curArgDefVal=`%s'\n",g_curArgTypeName.data(),g_curArgDefValue.data());
......@@ -312,6 +321,7 @@ ID [a-z_A-Z][a-z_A-Z0-9]*
BEGIN( ReadFuncArgType );
}
}
}
<ReadFuncArgType,ReadFuncArgPtr>{ID} {
QCString name=yytext; //resolveDefines(yytext);
//printf("resolveName `%s'->`%s'\n",yytext,name.data());
......
......@@ -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,21 +2323,24 @@ 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)
for (;(mdec=mni1.current());++mni1)
{
if (mdec->isPrototype() ||
(mdec->isVariable() && mdec->isExternal())
)
{
MemberNameIterator mni2(*mn);
for (;(mdef=mni2.current());++mni2)
{
if (
(mdef->isFunction() && !mdef->isStatic() && !mdef->isPrototype()) ||
(mdef->isVariable() && !mdef->isExternal() && !mdef->isStatic())
)
{
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() : "");
......@@ -2365,12 +2394,14 @@ static void transferFunctionDocumentation()
}
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);
......@@ -2391,6 +2422,13 @@ static void transferFunctionDocumentation()
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;
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()) &&
srcMd->getOuterScope()==md->getOuterScope())
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,12 +731,15 @@ void addMemberToGroups(Entry *root,MemberDef *md)
if (insertit)
{
//printf("insertMember\n");
fgd->insertMember(md);
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 &&
......
......@@ -246,6 +246,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;
private:
......@@ -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();
......@@ -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();
......
......@@ -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