Commit ea4b32cb authored by Dimitri van Heesch's avatar Dimitri van Heesch

Release-1.3-20030430

parent 2eef94da
DOXYGEN Version 1.3-20030421
DOXYGEN Version 1.3-20030430
Please read the installation section of the manual
(http://www.doxygen.org/install.html) for instructions.
--------
Dimitri van Heesch (21 April 2003)
Dimitri van Heesch (30 April 2003)
DOXYGEN Version 1.3_20030421
DOXYGEN Version 1.3_20030430
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) (21 April 2003)
Dimitri van Heesch (dimitri@stack.nl) (30 April 2003)
1.3-20030421
1.3-20030430
......@@ -203,6 +203,7 @@ followed by the descriptions of the tags grouped by category.
\refitem cfg_warn_logfile WARN_LOGFILE
\refitem cfg_warnings WARNINGS
\refitem cfg_xml_dtd XML_DTD
\refitem cfg_xml_output XML_OUTPUT
\refitem cfg_xml_schema XML_SCHEMA
\endsecreflist
......@@ -1200,6 +1201,13 @@ EXTRA_PACKAGES = times
generate an XML file that captures the structure of
the code including all documentation.
\anchor cfg_xml_output
<dt>\c XML_OUTPUT <dd>
\addindex XML_OUTPUT
The \c XML_OUTPUT tag is used to specify where the XML pages will be put.
If a relative path is entered the value of \c OUTPUT_DIRECTORY will be
put in front of it. If left blank \c xml will be used as the default path.
\anchor cfg_xml_schema
<dt>\c XML_SCHEMA <dd>
\addindex XML_SCHEMA
......
Summary: A documentation system for C/C++.
Name: doxygen
Version: 1.3_20030421
Version: 1.3_20030430
Release: 1
Epoch: 1
Source0: ftp://ftp.stack.nl/pub/users/dimitri/%{name}-%{version}.src.tar.gz
......
......@@ -36,15 +36,6 @@
#include "debug.h"
#include "docparser.h"
static QCString stripExtension(const char *fName)
{
QCString result=fName;
if (result.right(Doxygen::htmlFileExtension.length())==Doxygen::htmlFileExtension)
{
result=result.left(result.length()-Doxygen::htmlFileExtension.length());
}
return result;
}
// constructs a new class definition
ClassDef::ClassDef(
......@@ -86,6 +77,7 @@ ClassDef::ClassDef(
m_nspace=0;
m_fileDef=0;
m_usesImplClassDict=0;
m_usedByImplClassDict=0;
m_usesIntfClassDict=0;
memberGroupSDict = new MemberGroupSDict;
memberGroupSDict->setAutoDelete(TRUE);
......@@ -120,6 +112,7 @@ ClassDef::~ClassDef()
delete m_allMemberNameInfoSDict;
delete m_exampleSDict;
delete m_usesImplClassDict;
delete m_usedByImplClassDict;
delete m_usesIntfClassDict;
delete m_incInfo;
delete memberGroupSDict;
......@@ -586,7 +579,7 @@ void ClassDef::distributeMemberGroupDocumentation()
void ClassDef::findSectionsInDocumentation()
{
docFindSections(documentation(),0,this,0,docFile());
docFindSections(documentation(),this,0,docFile());
MemberGroupSDict::Iterator mgli(*memberGroupSDict);
MemberGroup *mg;
for (;(mg=mgli.current());++mgli)
......@@ -2043,17 +2036,35 @@ void ClassDef::addUsedClass(ClassDef *cd,const char *accessName)
m_usesImplClassDict->setAutoDelete(TRUE);
}
UsesClassDef *ucd=m_usesImplClassDict->find(cd->name());
if (ucd==0 /*|| ucd->templSpecifiers!=templSpec*/)
if (ucd==0)
{
ucd = new UsesClassDef(cd);
m_usesImplClassDict->insert(cd->name(),ucd);
//ucd->templSpecifiers = templSpec;
//printf("Adding used class %s to class %s\n",
// cd->name().data(),name().data());
}
ucd->addAccessor(accessName);
}
void ClassDef::addUsedByClass(ClassDef *cd,const char *accessName)
{
if (m_usedByImplClassDict==0)
{
m_usedByImplClassDict = new UsesClassDict(17);
m_usedByImplClassDict->setAutoDelete(TRUE);
}
UsesClassDef *ucd=m_usedByImplClassDict->find(cd->name());
if (ucd==0)
{
ucd = new UsesClassDef(cd);
m_usedByImplClassDict->insert(cd->name(),ucd);
//printf("Adding used by class %s to class %s\n",
// cd->name().data(),name().data());
}
ucd->addAccessor(accessName);
}
#if 0
/*! Builds up a dictionary of all classes that are used by the state of this
* class (the "implementation").
......
......@@ -164,6 +164,11 @@ class ClassDef : public Definition
return m_usesImplClassDict;
}
UsesClassDict *usedByImplementationClasses() const
{
return m_usedByImplClassDict;
}
UsesClassDict *usedInterfaceClasses() const
{
return m_usesIntfClassDict;
......@@ -270,6 +275,7 @@ class ClassDef : public Definition
void setGroupDefForAllMembers(GroupDef *g,Grouping::GroupPri_t pri,const QCString &fileName,int startLine,bool hasDocs);
void addInnerCompound(Definition *d);
void addUsedClass(ClassDef *cd,const char *accessName);
void addUsedByClass(ClassDef *cd,const char *accessName);
//void initTemplateMapping();
//void setTemplateArgumentMapping(const char *formal,const char *actual);
//QCString getTemplateArgumentMapping(const char *formal) const;
......@@ -389,6 +395,7 @@ class ClassDef : public Definition
/* classes for the collaboration diagram */
UsesClassDict *m_usesImplClassDict;
UsesClassDict *m_usedByImplClassDict;
UsesClassDict *m_usesIntfClassDict;
/*! Template instances that exists of this class, the key in the
......
......@@ -2225,6 +2225,15 @@ void Config::create()
"moment. \n",
FALSE
);
cs = addString(
"XML_OUTPUT",
"The XML_OUTPUT tag is used to specify where the XML pages will be put. \n"
"If a relative path is entered the value of OUTPUT_DIRECTORY will be \n"
"put in front of it. If left blank `xml' will be used as the default path. \n"
);
cs->setDefaultValue("xml");
cs->setWidgetType(ConfigString::Dir);
cs->addDependency("GENERATE_XML");
cs = addString(
"XML_SCHEMA",
"The XML_SCHEMA tag can be used to specify an XML schema, \n"
......
......@@ -30,7 +30,7 @@
#include "doxygen.h"
#include "debug.h"
#include "util.h"
#include "page.h"
#include "pagedef.h"
#include "docparser.h"
#include "doctokenizer.h"
......@@ -447,7 +447,7 @@ static bool findDocsForMemberOrCompound(const char *commandName,
FileDef *fd=0;
NamespaceDef *nd=0;
GroupDef *gd=0;
PageInfo *pi=0;
PageDef *pd=0;
bool found = getDefs(
g_context.find('.')==-1?g_context.latin1():"", // `find('.') is a hack to detect files
name.latin1(),
......@@ -494,11 +494,11 @@ static bool findDocsForMemberOrCompound(const char *commandName,
*pDef=gd;
return TRUE;
}
pi = Doxygen::pageSDict->find(cmdArg);
if (pi) // page
pd = Doxygen::pageSDict->find(cmdArg);
if (pd) // page
{
*pDoc=pi->doc;
*pDef=(Definition *)pi;
*pDoc=pd->documentation();
*pDef=pd;
return TRUE;
}
bool ambig;
......@@ -1624,7 +1624,7 @@ DocRef::DocRef(DocNode *parent,const QString &target) :
m_parent(parent), m_refToSection(FALSE), m_refToAnchor(FALSE)
{
Definition *compound = 0;
PageInfo *pageInfo = 0;
//PageInfo *pageInfo = 0;
QCString anchor;
ASSERT(!target.isEmpty());
SectionInfo *sec = Doxygen::sectionDict[target];
......@@ -1639,16 +1639,17 @@ DocRef::DocRef(DocNode *parent,const QString &target) :
m_refToAnchor = sec->type==SectionInfo::Anchor;
m_refToSection = sec->type!=SectionInfo::Anchor;
}
else if (resolveLink(g_context,target,TRUE,&compound,&pageInfo,anchor))
else if (resolveLink(g_context,target,TRUE,&compound,/*&pageInfo,*/anchor))
{
m_text = linkToText(target);
m_anchor = anchor;
if (pageInfo) // ref to page
{
m_file = pageInfo->getOutputFileBase();
m_ref = pageInfo->getReference();
}
else if (compound) // ref to compound
//if (pageInfo) // ref to page
//{
// m_file = pageInfo->getOutputFileBase();
// m_ref = pageInfo->getReference();
//}
//else
if (compound) // ref to compound
{
if (anchor.isEmpty() && /* compound link */
compound->definitionType()==Definition::TypeGroup && /* is group */
......@@ -1713,7 +1714,7 @@ DocLink::DocLink(DocNode *parent,const QString &target) :
m_parent(parent)
{
Definition *compound;
PageInfo *page;
//PageInfo *page;
QCString anchor;
m_refText = target;
if (!m_refText.isEmpty() && m_refText.at(0)=='#')
......@@ -1721,7 +1722,7 @@ DocLink::DocLink(DocNode *parent,const QString &target) :
m_refText = m_refText.right(m_refText.length()-1);
}
if (resolveLink(g_context,stripKnownExtensions(target),g_inSeeBlock,
&compound,&page,anchor))
&compound,/*&page,*/anchor))
{
m_anchor = anchor;
if (compound)
......@@ -1729,11 +1730,11 @@ DocLink::DocLink(DocNode *parent,const QString &target) :
m_file = compound->getOutputFileBase();
m_ref = compound->getReference();
}
else if (page)
{
m_file = page->getOutputFileBase();
m_ref = page->getReference();
}
//else if (page)
//{
// m_file = page->getOutputFileBase();
// m_ref = page->getReference();
//}
}
else // oops, bogus target
{
......@@ -4742,8 +4743,11 @@ DocNode *validatingParseText(const char *input)
return txt;
}
void docFindSections(const char *input,PageInfo *pi,Definition *d,MemberGroup *mg,const char *fileName)
void docFindSections(const char *input,
Definition *d,
MemberGroup *mg,
const char *fileName)
{
doctokenizerYYFindSections(input,pi,d,mg,fileName);
doctokenizerYYFindSections(input,d,mg,fileName);
}
......@@ -63,7 +63,10 @@ DocNode *validatingParseDoc(const char *fileName,int startLine,
DocNode *validatingParseText(const char *input);
/*! Searches for section and anchor commands in the input */
void docFindSections(const char *input,PageInfo *pi,Definition *d,MemberGroup *m,const char *fileName);
void docFindSections(const char *input,
Definition *d,
MemberGroup *m,
const char *fileName);
//---------------------------------------------------------------------------
......
......@@ -24,7 +24,6 @@
#include "htmlattrib.h"
class Definition;
class PageInfo;
class MemberGroup;
enum Tokens
......@@ -110,7 +109,7 @@ extern FILE *doctokenizerYYin;
const char *tokToString(int token);
// operations on the scanner
void doctokenizerYYFindSections(const char *input,PageInfo *pi,Definition *d,
void doctokenizerYYFindSections(const char *input,Definition *d,
MemberGroup *mg,const char *fileName);
void doctokenizerYYinit(const char *input,const char *fileName);
void doctokenizerYYcleanup();
......
......@@ -30,7 +30,7 @@
#include "section.h"
#include "membergroup.h"
#include "definition.h"
#include "page.h"
#include "doxygen.h"
#define YY_NEVER_INTERACTIVE 1
......@@ -45,7 +45,6 @@ static QString g_fileName;
static bool g_insidePre;
// context for section finding phase
static PageInfo *g_pageInfo;
static Definition *g_definition;
static MemberGroup *g_memberGroup;
static QCString g_secLabel;
......@@ -217,10 +216,6 @@ static void processSection()
{
file = g_definition->getOutputFileBase();
}
else if (g_pageInfo)
{
file = g_pageInfo->getOutputFileBase();
}
else
{
warn(g_fileName,yylineno,"Found section/anchor %s without context\n",g_secLabel.data());
......@@ -809,14 +804,13 @@ LABELID [a-z_A-Z][a-z_A-Z0-9\-]*
//--------------------------------------------------------------------------
void doctokenizerYYFindSections(const char *input,PageInfo *pi,Definition *d,
void doctokenizerYYFindSections(const char *input,Definition *d,
MemberGroup *mg,const char *fileName)
{
if (input==0) return;
g_inputString = input;
//printf("parsing --->`%s'<---\n",input);
g_inputPos = 0;
g_pageInfo = pi;
g_definition = d;
g_memberGroup = mg;
g_fileName = fileName;
......
......@@ -1086,31 +1086,47 @@ void DotClassGraph::addClass(ClassDef *cd,DotNode *n,int prot,
void DotClassGraph::buildGraph(ClassDef *cd,DotNode *n,int distance,bool base)
{
//printf("DocClassGraph::buildGraph(%s,distance=%d,base=%d)\n",
// cd->name().data(),distance,base);
// ---- Add inheritance relations
BaseClassListIterator bcli(base ? *cd->baseClasses() : *cd->subClasses());
BaseClassDef *bcd;
for ( ; (bcd=bcli.current()) ; ++bcli )
if (m_graphType == Inheritance)
{
//printf("-------- inheritance relation %s->%s templ=`%s'\n",
// cd->name().data(),bcd->classDef->name().data(),bcd->templSpecifiers.data());
addClass(bcd->classDef,n,bcd->prot,0,distance,bcd->usedName,
bcd->templSpecifiers,base);
BaseClassListIterator bcli(base ? *cd->baseClasses() : *cd->subClasses());
BaseClassDef *bcd;
for ( ; (bcd=bcli.current()) ; ++bcli )
{
//printf("-------- inheritance relation %s->%s templ=`%s'\n",
// cd->name().data(),bcd->classDef->name().data(),bcd->templSpecifiers.data());
addClass(bcd->classDef,n,bcd->prot,0,distance,bcd->usedName,
bcd->templSpecifiers,base);
}
}
if (m_graphType != Inheritance)
else // m_graphType != Inheritance
{
ASSERT(m_graphType==Implementation);
// ---- Add usage relations
UsesClassDict *dict =
m_graphType==Implementation ? cd->usedImplementationClasses() :
cd->usedInterfaceClasses();
base ? cd->usedImplementationClasses() :
cd->usedByImplementationClasses()
;
if (dict)
{
UsesClassDictIterator ucdi(*dict);
UsesClassDef *ucd;
for (;(ucd=ucdi.current());++ucdi)
{
//if (base)
//{
// printf("%s uses %s\n",cd->name().data(),ucd->classDef->name().data());
//}
//else
//{
// printf("%s is used by %s\n",cd->name().data(),ucd->classDef->name().data());
//}
//printf("drawing\n");
QCString label;
QDictIterator<void> dvi(*ucd->accessors);
const char *s;
......@@ -1128,7 +1144,7 @@ void DotClassGraph::buildGraph(ClassDef *cd,DotNode *n,int distance,bool base)
}
}
addClass(ucd->classDef,n,EdgeInfo::Purple,label,distance,0,
ucd->templSpecifiers,base);
ucd->templSpecifiers,base);
}
}
}
......
This diff is collapsed.
......@@ -37,7 +37,7 @@
class PageSList;
class PageSDict;
class PageInfo;
class PageDef;
typedef QList<QCString> StringList;
typedef QDict<FileDef> FileDict;
......@@ -64,7 +64,7 @@ class Doxygen
static ClassSDict hiddenClasses;
static PageSDict *exampleSDict;
static PageSDict *pageSDict;
static PageInfo *mainPage;
static PageDef *mainPage;
static bool insideMainPage;
static FileNameDict *includeNameDict;
static FileNameDict *exampleNameDict;
......
......@@ -105,7 +105,7 @@ void FileDef::distributeMemberGroupDocumentation()
void FileDef::findSectionsInDocumentation()
{
docFindSections(documentation(),0,this,0,docFile());
docFindSections(documentation(),this,0,docFile());
MemberGroupSDict::Iterator mgli(*memberGroupSDict);
MemberGroup *mg;
for (;(mg=mgli.current());++mgli)
......
......@@ -5,8 +5,6 @@
* Modified by Dimitri van Heesch (c) 2003
*
* Folder Tree View for offline help on browsers that do not support HTML Help.
* Uses the FTV structure from:
* http://www.geocities.com/Paris/LeftBank/2178/ftexample.html
*/
#include <stdio.h>
......@@ -506,30 +504,37 @@ void FTVHelp::generateLink(QTextStream &t,FTVNode *n)
QCString *dest;
//printf("FTVHelp::generateLink(ref=%s,file=%s,anchor=%s\n",
// n->ref.data(),n->file.data(),n->anchor.data());
if (!n->ref.isEmpty()) // link to entity imported via tag file
if (n->file.isEmpty()) // no link
{
t << "<a class=\"elRef\" ";
t << "doxygen=\"" << n->ref << ":";
if ((dest=Doxygen::tagDestinationDict[n->ref])) t << *dest << "/";
t << "\" ";
t << "<b>" << n->name << "</b>";
}
else // local link
else // link into other frame
{
t << "<a class=\"el\" ";
}
t << "href=\"";
if (!n->ref.isEmpty())
{
if ((dest=Doxygen::tagDestinationDict[n->ref])) t << *dest << "/";
}
if (!n->file.isEmpty()) t << n->file << Doxygen::htmlFileExtension;
if (!n->anchor.isEmpty()) t << "#" << n->anchor;
t << "\" target=\"basefrm\">";
t << n->name;
t << "</a>";
if (!n->ref.isEmpty())
{
t << "&nbsp;[external]";
if (!n->ref.isEmpty()) // link to entity imported via tag file
{
t << "<a class=\"elRef\" ";
t << "doxygen=\"" << n->ref << ":";
if ((dest=Doxygen::tagDestinationDict[n->ref])) t << *dest << "/";
t << "\" ";
}
else // local link
{
t << "<a class=\"el\" ";
}
t << "href=\"";
if (!n->ref.isEmpty())
{
if ((dest=Doxygen::tagDestinationDict[n->ref])) t << *dest << "/";
}
t << n->file << Doxygen::htmlFileExtension;
if (!n->anchor.isEmpty()) t << "#" << n->anchor;
t << "\" target=\"basefrm\">";
t << n->name;
t << "</a>";
if (!n->ref.isEmpty())
{
t << "&nbsp;[external]";
}
}
}
......@@ -634,7 +639,7 @@ void FTVHelp::generateTreeView()
t << cssfi.fileName();
}
t << "\">" << endl;
t << " <title>Test</title>\n";
t << " <title>TreeView</title>\n";
t << " <style type=\"text/css\">\n";
t << " <!--\n";
t << " .directory { font-size: 10pt; font-weight: bold; }\n";
......
......@@ -29,10 +29,11 @@
#include "message.h"
#include "membergroup.h"
#include "doxygen.h"
#include "page.h"
#include "pagedef.h"
#include "docparser.h"
GroupDef::GroupDef(const char *df,int dl,const char *na,const char *t) :
Definition(df,dl,na)
GroupDef::GroupDef(const char *df,int dl,const char *na,const char *t,
const char *refFileName) : Definition(df,dl,na)
{
fileList = new FileList;
classSDict = new ClassSDict(257);
......@@ -42,7 +43,14 @@ GroupDef::GroupDef(const char *df,int dl,const char *na,const char *t) :
exampleDict = new PageSDict(257);
allMemberList = new MemberList;
allMemberNameInfoSDict = new MemberNameInfoSDict(17);
fileName = (QCString)"group_"+na;
if (refFileName)
{
fileName=stripExtension(refFileName);
}
else
{
fileName = (QCString)"group_"+na;
}
setGroupTitle( t );
memberGroupSDict = new MemberGroupSDict;
memberGroupSDict->setAutoDelete(TRUE);
......@@ -106,7 +114,7 @@ void GroupDef::distributeMemberGroupDocumentation()
void GroupDef::findSectionsInDocumentation()
{
docFindSections(documentation(),0,this,0,docFile());
docFindSections(documentation(),this,0,docFile());
MemberGroupSDict::Iterator mgli(*memberGroupSDict);
MemberGroup *mg;
for (;(mg=mgli.current());++mgli)
......@@ -145,16 +153,16 @@ void GroupDef::addNamespace(const NamespaceDef *def)
namespaceList->append(def);
}
void GroupDef::addPage(PageInfo *def)
void GroupDef::addPage(PageDef *def)
{
//printf("Making page %s part of a group\n",def->name.data());
pageDict->append(def->name,def);
pageDict->append(def->name(),def);
def->makePartOfGroup(this);
}
void GroupDef::addExample(const PageInfo *def)
void GroupDef::addExample(const PageDef *def)
{
exampleDict->append(def->name,def);
exampleDict->append(def->name(),def);
}
......@@ -555,13 +563,13 @@ void GroupDef::writeDocumentation(OutputList &ol)
writeDetailedDocumentation(ol);
}
PageInfo *pi=0;
PageDef *pd=0;
PageSDict::Iterator pdi(*pageDict);
for (pdi.toFirst();(pi=pdi.current());++pdi)
for (pdi.toFirst();(pd=pdi.current());++pdi)
{
if (!pi->isReference())
if (!pd->isReference())
{
QCString pageName = pi->getOutputFileBase();
QCString pageName = pd->getOutputFileBase();
if (!Config_getString("GENERATE_TAGFILE").isEmpty())
{
......@@ -569,15 +577,15 @@ void GroupDef::writeDocumentation(OutputList &ol)
}
SectionInfo *si=0;
if (!pi->title.isEmpty() && !pi->name.isEmpty() &&
(si=Doxygen::sectionDict[pi->name])!=0)
if (!pd->title().isEmpty() && !pd->name().isEmpty() &&
(si=Doxygen::sectionDict[pd->name()])!=0)
{
ol.startSection(si->label,si->title,SectionInfo::Subsection);
ol.docify(si->title);
ol.endSection(si->label,SectionInfo::Subsection);
}
ol.startTextBlock();
ol.parseDoc(pi->defFileName,pi->defLine,0,0,pi->doc,FALSE);
ol.parseDoc(pd->docFile(),pd->docLine(),0,0,pd->documentation(),FALSE);
ol.endTextBlock();
}
}
......@@ -760,7 +768,7 @@ void addMemberToGroups(Entry *root,MemberDef *md)
}
void addExampleToGroups(Entry *root,PageInfo *eg)
void addExampleToGroups(Entry *root,PageDef *eg)
{
QListIterator<Grouping> gli(*root->groups);
Grouping *g;
......@@ -778,7 +786,14 @@ void addExampleToGroups(Entry *root,PageInfo *eg)
QCString GroupDef::getOutputFileBase() const
{
return convertNameToFile(fileName);
if (isReference())
{
return fileName;
}
else
{
return convertNameToFile(fileName);
}
}
void GroupDef::addListReferences()
......
......@@ -36,12 +36,12 @@ class NamespaceList;
class MemberGroupSDict;
class MemberNameInfoSDict;
class PageSDict;
class PageInfo;
class PageDef;
class GroupDef : public Definition
{
public:
GroupDef(const char *fileName,int line,const char *name,const char *title);
GroupDef(const char *fileName,int line,const char *name,const char *title,const char *refFileName=0);
~GroupDef();
DefType definitionType() { return TypeGroup; }
QCString getOutputFileBase() const;
......@@ -53,8 +53,8 @@ class GroupDef : public Definition
void addNamespace(const NamespaceDef *def);
void addGroup(const GroupDef *def);
void addParentGroup(const GroupDef *def);
void addPage(PageInfo *def); // pages in this group
void addExample(const PageInfo *def); // examples in this group
void addPage(PageDef *def); // pages in this group
void addExample(const PageDef *def); // examples in this group
bool insertMember(MemberDef *def,bool docOnly=FALSE);
void removeMember(MemberDef *md);
bool containsGroup(const GroupDef *def); // true if def is already a subgroup
......@@ -152,8 +152,8 @@ void addClassToGroups(Entry *root,ClassDef *cd);
void addNamespaceToGroups(Entry *root,NamespaceDef *nd);
void addGroupToGroups(Entry *root,GroupDef *subGroup);
void addMemberToGroups(Entry *root,MemberDef *md);
void addPageToGroups(Entry *root,PageInfo *pi);
void addExampleToGroups(Entry *root,PageInfo *eg);
void addPageToGroups(Entry *root,PageDef *pd);
void addExampleToGroups(Entry *root,PageDef *eg);
#endif
......@@ -263,23 +263,18 @@ void HtmlDocVisitor::visit(DocIncOperator *op)
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
bool bDisplay = f->text().at(0)=='\\';
if (bDisplay) m_t << "<p class=formulaDsp>" << endl;
m_t << "<img class=formula"
<< (bDisplay ? "Dsp" : "Inl");
m_t << " alt=\"";
filterQuotedCdataAttr(f->text());
m_t << "\"";
/// @todo cache image dimensions on formula generation and give height/width
/// for faster preloading and better rendering of the page
m_t << " src=\"" << f->name() << ".png\">";
if (f->text().at(0)=='\\')
m_t << endl << "</center><p>" << endl;
if (bDisplay)
m_t << endl << "<p>" << endl;
else
m_t << " ";
}
......
......@@ -88,6 +88,9 @@ static const char *defaultStyleSheet =
" margin-top : 2px; \n"
" margin-bottom : 2px \n"
"}\n"
"p.formulaDsp { text-align: center; }\n"
"img.formulaDsp { }\n"
"img.formulaInl { vertical-align: middle; }\n"
"span.keyword { color: #008000 }\n"
"span.keywordtype { color: #604020 }\n"
"span.keywordflow { color: #e08000 }\n"
......
......@@ -34,7 +34,7 @@
#include "htmlhelp.h"
#include "ftvhelp.h"
#include "dot.h"
#include "page.h"
#include "pagedef.h"
//#include "packagedef.h"
int annotatedClasses;
......@@ -2080,22 +2080,22 @@ void writeExampleIndex(OutputList &ol)
ol.endTextBlock();
ol.startItemList();
PageSDict::Iterator pdi(*Doxygen::exampleSDict);
PageInfo *pi=0;
for (pdi.toFirst();(pi=pdi.current());++pdi)
PageDef *pd=0;
for (pdi.toFirst();(pd=pdi.current());++pdi)
{
ol.writeListItem();
QCString n=pi->getOutputFileBase();
if (!pi->title.isEmpty())
QCString n=pd->getOutputFileBase();
if (!pd->title().isEmpty())
{
ol.writeObjectLink(0,n,0,pi->title);
if (hasHtmlHelp) htmlHelp->addContentsItem(FALSE,pi->title,n);
if (hasFtvHelp) ftvHelp->addContentsItem(FALSE,pi->getReference(),n,0,pi->title);
ol.writeObjectLink(0,n,0,pd->title());
if (hasHtmlHelp) htmlHelp->addContentsItem(FALSE,pd->title(),n);
if (hasFtvHelp) ftvHelp->addContentsItem(FALSE,pd->getReference(),n,0,pd->title());
}
else
{
ol.writeObjectLink(0,n,0,pi->name);
if (hasHtmlHelp) htmlHelp->addContentsItem(FALSE,pi->name,n);
if (hasFtvHelp) ftvHelp->addContentsItem(FALSE,pi->getReference(),n,0,pi->name);
ol.writeObjectLink(0,n,0,pd->name());
if (hasHtmlHelp) htmlHelp->addContentsItem(FALSE,pd->name(),n);
if (hasFtvHelp) ftvHelp->addContentsItem(FALSE,pd->getReference(),n,0,pd->name());
}
ol.writeString("\n");
}
......@@ -2118,13 +2118,13 @@ void countRelatedPages(int &docPages,int &indexPages)
{
docPages=indexPages=0;
PageSDict::Iterator pdi(*Doxygen::pageSDict);
PageInfo *pi=0;
for (pdi.toFirst();(pi=pdi.current());++pdi)
PageDef *pd=0;
for (pdi.toFirst();(pd=pdi.current());++pdi)
{
if (!pi->getGroupDef() && (!pi->isReference() || Config_getBool("ALLEXTERNALS")))
if (!pd->getGroupDef() && (!pd->isReference() || Config_getBool("ALLEXTERNALS")))
{
indexPages++;
if (!pi->isReference()) docPages++;
if (!pd->isReference()) docPages++;
}
}
}
......@@ -2183,33 +2183,28 @@ void writePageIndex(OutputList &ol)
ol.endTextBlock();
startIndexHierarchy(ol,0);
PageSDict::Iterator pdi(*Doxygen::pageSDict);
PageInfo *pi=0;
for (pdi.toFirst();(pi=pdi.current());++pdi)
PageDef *pd=0;
for (pdi.toFirst();(pd=pdi.current());++pdi)
{
if (!pi->getGroupDef() && (!pi->isReference() || Config_getBool("ALLEXTERNALS")))
if (!pd->getGroupDef() && (!pd->isReference() || Config_getBool("ALLEXTERNALS")))
{
QCString pageName,pageTitle;
QCString pageTitle;
if (Config_getBool("CASE_SENSE_NAMES"))
pageName=pi->name.copy();
if (pd->title().isEmpty())
pageTitle=pd->name();
else
pageName=pi->name.lower();
pageTitle=pd->title();
if (pi->title.isEmpty())
pageTitle=pi->name;
else
pageTitle=pi->title;
ol.writeIndexItem(pi->getReference(),pi->getOutputFileBase(),pageTitle);
if (pi->isReference())
ol.writeIndexItem(pd->getReference(),pd->getOutputFileBase(),pageTitle);
if (pd->isReference())
{
ol.startTypewriter();
ol.docify(" [external]");
ol.endTypewriter();
}
ol.writeString("\n");
if (hasHtmlHelp) htmlHelp->addContentsItem(FALSE,pageTitle,pageName);
if (hasFtvHelp) ftvHelp->addContentsItem(FALSE,pi->getReference(),pi->getOutputFileBase(),0,pageTitle);
if (hasHtmlHelp) htmlHelp->addContentsItem(FALSE,pageTitle,pd->getOutputFileBase());
if (hasFtvHelp) ftvHelp->addContentsItem(FALSE,pd->getReference(),pd->getOutputFileBase(),0,pageTitle);
}
}
endIndexHierarchy(ol,0);
......@@ -2344,13 +2339,13 @@ void writeGroupTreeNode(OutputList &ol, GroupDef *gd,int level)
// write pages
PageSDict::Iterator pli(*gd->pageDict);
PageInfo *pi = 0;
for (pli.toFirst();(pi=pli.current());++pli)
PageDef *pd = 0;
for (pli.toFirst();(pd=pli.current());++pli)
{
SectionInfo *si=0;
if (!pi->name.isEmpty()) si=Doxygen::sectionDict[pi->name];
if (!pd->name().isEmpty()) si=Doxygen::sectionDict[pd->name()];
if(htmlHelp) htmlHelp->addContentsItem(FALSE,
convertToHtml(pi->title),
convertToHtml(pd->title()),
gd->getOutputFileBase(),
si ? si->label.data() : 0
);
......@@ -2358,7 +2353,7 @@ void writeGroupTreeNode(OutputList &ol, GroupDef *gd,int level)
gd->getReference(),
gd->getOutputFileBase(),
si ? si->label.data() : 0,
convertToHtml(pi->title)
convertToHtml(pd->title())
);
}
......@@ -2549,18 +2544,18 @@ void writeGroupTreeNode(OutputList &ol, GroupDef *gd,int level)
}
PageSDict::Iterator eli(*(gd->exampleDict));
PageInfo *pi=eli.toFirst();
while (pi)
PageDef *pd=eli.toFirst();
while (pd)
{
if(htmlHelp)
{
htmlHelp->addContentsItem(FALSE,pi->getReference(),pi->getOutputFileBase());
htmlHelp->addContentsItem(FALSE,pd->getReference(),pd->getOutputFileBase());
}
if(ftvHelp)
{
ftvHelp->addContentsItem(FALSE,pi->getReference(),pi->getOutputFileBase(),0,pi->name);
ftvHelp->addContentsItem(FALSE,pd->getReference(),pd->getOutputFileBase(),0,pd->name());
}
pi=++eli;
pd=++eli;
}
if (htmlHelp) htmlHelp->decContentsDepth();
......@@ -2710,18 +2705,18 @@ void writeIndex(OutputList &ol)
ol.disableAllBut(OutputGenerator::Html);
QCString defFileName =
Doxygen::mainPage ? Doxygen::mainPage->defFileName.data() : "<generated>";
Doxygen::mainPage ? Doxygen::mainPage->getDefFileName().data() : "<generated>";
int defLine =
Doxygen::mainPage ? Doxygen::mainPage->defLine : 1;
Doxygen::mainPage ? Doxygen::mainPage->getDefLine() : 1;
QCString title;
if (!Doxygen::mainPage || Doxygen::mainPage->title.isEmpty())
if (!Doxygen::mainPage || Doxygen::mainPage->title().isEmpty())
{
title = theTranslator->trMainPage();
}
else
{
title = substitute(Doxygen::mainPage->title,"%","");
title = substitute(Doxygen::mainPage->title(),"%","");
}
QCString indexName="index";
......@@ -2742,9 +2737,9 @@ void writeIndex(OutputList &ol)
if (!Config_getBool("DISABLE_INDEX")) writeQuickLinks(ol,TRUE);
ol.startTitleHead(0);
if (Doxygen::mainPage && !Doxygen::mainPage->title.isEmpty())
if (Doxygen::mainPage && !Doxygen::mainPage->title().isEmpty())
{
ol.parseDoc(defFileName,defLine,0,0,Doxygen::mainPage->title,FALSE);
ol.parseDoc(defFileName,defLine,0,0,Doxygen::mainPage->title(),FALSE);
}
else
{
......@@ -2764,21 +2759,22 @@ void writeIndex(OutputList &ol)
{
Doxygen::insideMainPage=TRUE;
ol.parseDoc(defFileName,defLine,0,0,
Doxygen::mainPage->doc,FALSE,Doxygen::mainPage->sectionDict);
Doxygen::mainPage->documentation(),FALSE
/*,Doxygen::mainPage->sectionDict*/);
if (!Config_getString("GENERATE_TAGFILE").isEmpty())
{
Doxygen::tagFile << " <compound kind=\"page\">" << endl
<< " <filename>"
<< convertToXML(Doxygen::mainPage->fileName)
<< convertToXML(Doxygen::mainPage->getOutputFileBase())
<< "</filename>"
<< endl
<< " <title>"
<< convertToXML(Doxygen::mainPage->title)
<< convertToXML(Doxygen::mainPage->title())
<< "</title>"
<< endl
<< " <name>"
<< convertToXML(Doxygen::mainPage->name)
<< convertToXML(Doxygen::mainPage->name())
<< "</name>"
<< endl;
......@@ -2820,9 +2816,9 @@ void writeIndex(OutputList &ol)
if (Doxygen::mainPage)
{
ol.startIndexSection(isMainPage);
if (!Doxygen::mainPage->title.isEmpty())
if (!Doxygen::mainPage->title().isEmpty())
{
ol.parseDoc(defFileName,defLine,0,0,Doxygen::mainPage->title,FALSE);
ol.parseDoc(defFileName,defLine,0,0,Doxygen::mainPage->title(),FALSE);
}
else
{
......@@ -2927,7 +2923,7 @@ void writeIndex(OutputList &ol)
{
Doxygen::insideMainPage=TRUE;
ol.disable(OutputGenerator::Man);
startFile(ol,Doxygen::mainPage->name,0,Doxygen::mainPage->title);
startFile(ol,Doxygen::mainPage->name(),0,Doxygen::mainPage->title());
//SectionInfo *si=0;
//if (!Doxygen::mainPage->title.isEmpty() && !Doxygen::mainPage->name.isEmpty() &&
// (si=Doxygen::sectionDict[Doxygen::mainPage->name])!=0)
......@@ -2938,7 +2934,8 @@ void writeIndex(OutputList &ol)
//}
ol.startTextBlock();
ol.parseDoc(defFileName,defLine,0,0,
Doxygen::mainPage->doc,FALSE,Doxygen::mainPage->sectionDict);
Doxygen::mainPage->documentation(),FALSE
/*,Doxygen::mainPage->sectionDict*/);
ol.endTextBlock();
endFile(ol);
ol.enable(OutputGenerator::Man);
......
......@@ -28,7 +28,7 @@
#include "language.h"
#include "version.h"
#include "dot.h"
#include "page.h"
#include "pagedef.h"
#include "docparser.h"
#include "latexdocvisitor.h"
......@@ -747,15 +747,15 @@ void LatexGenerator::endIndexSection(IndexSections is)
{
t << "}\n";
PageSDict::Iterator pdi(*Doxygen::exampleSDict);
PageInfo *pi=pdi.toFirst();
if (pi)
PageDef *pd=pdi.toFirst();
if (pd)
{
t << "\\input{" << pi->getOutputFileBase() << "}\n";
t << "\\input{" << pd->getOutputFileBase() << "}\n";
}
for (++pdi;(pi=pdi.current());++pdi)
for (++pdi;(pd=pdi.current());++pdi)
{
if (compactLatex) t << "\\input" ; else t << "\\include";
t << "{" << pi->getOutputFileBase() << "}\n";
t << "{" << pd->getOutputFileBase() << "}\n";
}
}
break;
......@@ -763,14 +763,14 @@ void LatexGenerator::endIndexSection(IndexSections is)
{
t << "}\n";
PageSDict::Iterator pdi(*Doxygen::pageSDict);
PageInfo *pi=pdi.toFirst();
PageDef *pd=pdi.toFirst();
bool first=TRUE;
for (pdi.toFirst();(pi=pdi.current());++pdi)
for (pdi.toFirst();(pd=pdi.current());++pdi)
{
if (!pi->getGroupDef() && !pi->isReference())
if (!pd->getGroupDef() && !pd->isReference())
{
if (compactLatex || first) t << "\\input" ; else t << "\\include";
t << "{" << pi->getOutputFileBase() << "}\n";
t << "{" << pd->getOutputFileBase() << "}\n";
first=FALSE;
}
}
......
......@@ -1985,6 +1985,6 @@ void MemberDef::setDeclArgumentList(ArgumentList *al)
void MemberDef::findSectionsInDocumentation()
{
docFindSections(documentation(),0,this,0,docFile());
docFindSections(documentation(),this,0,docFile());
}
......@@ -217,7 +217,7 @@ void MemberGroup::addListReferences(Definition *def)
void MemberGroup::findSectionsInDocumentation()
{
docFindSections(doc,0,0,this,m_docFile);
docFindSections(doc,0,this,m_docFile);
memberList->findSectionsInDocumentation();
}
......@@ -65,7 +65,7 @@ void NamespaceDef::distributeMemberGroupDocumentation()
void NamespaceDef::findSectionsInDocumentation()
{
docFindSections(documentation(),0,this,0,docFile());
docFindSections(documentation(),this,0,docFile());
MemberGroupSDict::Iterator mgli(*memberGroupSDict);
MemberGroup *mg;
for (;(mg=mgli.current());++mgli)
......
......@@ -15,6 +15,7 @@
*
*/
#if 0
#include "sortdict.h"
#include "config.h"
#include "docparser.h"
......@@ -127,4 +128,4 @@ class PageSDict : public SDict<PageInfo>
return stricmp(((PageInfo *)i1)->name,((PageInfo *)i2)->name);
}
};
#endif
#include "pagedef.h"
#include "groupdef.h"
#include "docparser.h"
PageDef::PageDef(const char *f,int l,const char *n,
......@@ -12,3 +14,14 @@ PageDef::PageDef(const char *f,int l,const char *n,
PageDef::~PageDef()
{
}
void PageDef::findSectionsInDocumentation()
{
docFindSections(documentation(),this,0,docFile());
}
GroupDef *PageDef::getGroupDef() const
{
return partOfGroups() ? partOfGroups()->getFirst() : 0;
}
......@@ -29,9 +29,21 @@ class PageDef : public Definition
PageDef(const char *f,int l,const char *n,const char *d,const char *t);
~PageDef();
DefType definitionType() { return TypePage; }
bool isLinkableInProject() const
{
return hasDocumentation() && !isReference();
}
bool isLinkable() const
{
return isLinkableInProject() || isReference();
}
// functions to get a uniform interface with Definitions
QCString getOutputFileBase() const { return m_fileName; }
void findSectionsInDocumentation();
QCString title() const { return m_title; }
GroupDef *getGroupDef() const;
void setFileName(const char *name) { m_fileName = name; }
#if 0
bool isReference() const { return !reference.isEmpty(); }
......@@ -126,6 +138,7 @@ class PageDef : public Definition
private:
QCString m_fileName;
QCString m_title;
GroupDef *m_inGroup;
};
class PageSDict : public SDict<PageDef>
......
......@@ -23,7 +23,7 @@
#include "docparser.h"
#include "message.h"
#include "doxygen.h"
#include "page.h"
#include "pagedef.h"
#include <qdir.h>
#include <qstack.h>
......@@ -1344,7 +1344,7 @@ public:
void generatePerlModForNamespace(NamespaceDef *nd);
void generatePerlModForFile(FileDef *fd);
void generatePerlModForGroup(GroupDef *gd);
void generatePerlModForPage(PageInfo *pi);
void generatePerlModForPage(PageDef *pi);
bool createOutputFile(QFile &f, const char *s);
bool createOutputDir(QDir &perlModDir);
......@@ -1908,10 +1908,10 @@ void PerlModGenerator::generatePerlModForGroup(GroupDef *gd)
{
m_output.openList("pages");
PageSDict::Iterator pli(*pl);
PageInfo *pi;
for (pli.toFirst();(pi=pli.current());++pli)
PageDef *pd;
for (pli.toFirst();(pd=pli.current());++pli)
m_output.openHash()
.addFieldQuotedString("title", pi->title)
.addFieldQuotedString("title", pd->title())
.closeHash();
m_output.closeList();
}
......@@ -1947,22 +1947,22 @@ void PerlModGenerator::generatePerlModForGroup(GroupDef *gd)
m_output.closeHash();
}
void PerlModGenerator::generatePerlModForPage(PageInfo *pi)
void PerlModGenerator::generatePerlModForPage(PageDef *pd)
{
// + name
// + title
// + documentation
if (pi->isReference()) return;
if (pd->isReference()) return;
m_output.openHash()
.addFieldQuotedString("name", pi->name);
.addFieldQuotedString("name", pd->name());
SectionInfo *si = Doxygen::sectionDict.find(pi->name);
SectionInfo *si = Doxygen::sectionDict.find(pd->name());
if (si)
m_output.addFieldQuotedString("title", si->title);
addPerlModDocBlock(m_output,"detailed",pi->defFileName,pi->defLine,0,0,pi->doc);
addPerlModDocBlock(m_output,"detailed",pd->docFile(),pd->docLine(),0,0,pd->documentation());
m_output.closeHash();
}
......@@ -2007,16 +2007,22 @@ bool PerlModGenerator::generatePerlModOutput()
GroupSDict::Iterator gli(Doxygen::groupSDict);
GroupDef *gd;
for (;(gd=gli.current());++gli)
{
generatePerlModForGroup(gd);
}
m_output.closeList();
m_output.openList("pages");
PageSDict::Iterator pdi(*Doxygen::pageSDict);
PageInfo *pi=0;
for (pdi.toFirst();(pi=pdi.current());++pdi)
generatePerlModForPage(pi);
PageDef *pd=0;
for (pdi.toFirst();(pd=pdi.current());++pdi)
{
generatePerlModForPage(pd);
}
if (Doxygen::mainPage)
{
generatePerlModForPage(Doxygen::mainPage);
}
m_output.closeList();
m_output.closeHash().add(";\n1;\n");
......
......@@ -560,7 +560,11 @@ static bool replaceFunctionMacro(const QCString &expr,QCString *rest,int pos,int
}
else
{
if (g_nospaces)
if (hash && substArg.isEmpty())
{
resExpr+="@E"; // empty argument will be remove later on
}
else if (g_nospaces)
{
resExpr+=substArg;
}
......@@ -715,10 +719,9 @@ static void expandExpression(QCString &expr,QCString *rest,int pos)
}
}
/*! replaces all occurrences of @@ in \a s by @
/*! replaces all occurrences of @@@@ in \a s by @@
* and removes all occurrences of @@E.
* All identifiers found are replaced by 0L
* \par assumption:
* \a s only contains pairs of @@'s.
*/
QCString removeIdsAndMarkers(const char *s)
{
......@@ -731,12 +734,16 @@ QCString removeIdsAndMarkers(const char *s)
{
while ((c=*p))
{
if (c=='@') // replace @@ with @
if (c=='@') // replace @@ with @ and remove @E
{
if (*(p+1)=='@')
{
result+=c;
}
else if (*(p+1)=='E')
{
// skip
}
p+=2;
}
else if (isdigit(c)) // number
......
......@@ -32,7 +32,7 @@
#include "language.h"
#include "dot.h"
#include "version.h"
#include "page.h"
#include "pagedef.h"
#include "rtfstyle.h"
#include "rtfdocvisitor.h"
#include "docparser.h"
......@@ -585,13 +585,13 @@ void RTFGenerator::endIndexSection(IndexSections is)
break;
case isMainPage:
t << "\\par " << rtf_Style_Reset << endl;
if (!Doxygen::mainPage || Doxygen::mainPage->title.isEmpty())
if (!Doxygen::mainPage || Doxygen::mainPage->title().isEmpty())
{
t << "{\\tc \\v " << theTranslator->trMainPage() << "}"<< endl;
}
else
{
t << "{\\tc \\v " << substitute(Doxygen::mainPage->title,"%","") << "}"<< endl;
t << "{\\tc \\v " << substitute(Doxygen::mainPage->title(),"%","") << "}"<< endl;
}
t << "{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \"";
if (Config_getBool("GENERATE_TREEVIEW")) t << "main"; else t << "index";
......@@ -767,20 +767,20 @@ void RTFGenerator::endIndexSection(IndexSections is)
//t << "}\n";
t << "{\\tc \\v " << theTranslator->trExampleDocumentation() << "}"<< endl;
PageSDict::Iterator pdi(*Doxygen::exampleSDict);
PageInfo *pi=pdi.toFirst();
if (pi)
PageDef *pd=pdi.toFirst();
if (pd)
{
t << "\\par " << rtf_Style_Reset << endl;
t << "{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \"";
t << pi->getOutputFileBase();
t << pd->getOutputFileBase();
t << ".rtf\" \\\\*MERGEFORMAT}{\\fldrslt includedstuff}}\n";
}
for (++pdi;(pi=pdi.current());++pdi)
for (++pdi;(pd=pdi.current());++pdi)
{
t << "\\par " << rtf_Style_Reset << endl;
beginRTFSection();
t << "{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \"";
t << pi->getOutputFileBase();
t << pd->getOutputFileBase();
t << ".rtf\" \\\\*MERGEFORMAT}{\\fldrslt includedstuff}}\n";
}
}
......@@ -789,15 +789,15 @@ void RTFGenerator::endIndexSection(IndexSections is)
{
t << "{\\tc \\v " << theTranslator->trPageDocumentation() << "}"<< endl;
PageSDict::Iterator pdi(*Doxygen::pageSDict);
PageInfo *pi=pdi.toFirst();
PageDef *pd=pdi.toFirst();
bool first=TRUE;
for (pdi.toFirst();(pi=pdi.current());++pdi)
for (pdi.toFirst();(pd=pdi.current());++pdi)
{
if (!pi->getGroupDef() && !pi->isReference())
if (!pd->getGroupDef() && !pd->isReference())
{
if (first) t << "\\par " << rtf_Style_Reset << endl;
t << "{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \"";
t << pi->getOutputFileBase();
t << pd->getOutputFileBase();
t << ".rtf\" \\\\*MERGEFORMAT}{\\fldrslt includedstuff}}\n";
first=FALSE;
}
......
......@@ -484,7 +484,7 @@ static int yyread(char *buf,int max_size)
/* start command character */
CMD ("\\"|"@")
SECTIONCMD {CMD}("image"|"author"|"internal"|"version"|"date"|"deprecated"|"param"|"exception"|"return"[s]?|"retval"|"bug"|"warning"|"par"|"sa"|"see"|"pre"|"post"|"invariant"|"note"|"remark"[s]?|"todo"|"test"|"xrefitem"|"ingroup"|"latexonly"|"htmlonly"|"{"|"verbatim"|"dotfile"|"defgroup"|"addtogroup"|"weakgroup")|("<"{PRE}">")
SECTIONCMD {CMD}("image"|"author"|"internal"|"version"|"date"|"deprecated"|"param"|"exception"|"return"[s]?|"retval"|"bug"|"warning"|"par"|"sa"|"see"|"pre"|"post"|"invariant"|"note"|"remark"[s]?|"todo"|"test"|"xrefitem"|"ingroup"|"latexonly"|"htmlonly"|"{"|"verbatim"|"dotfile"|"defgroup"|"addtogroup"|"weakgroup"|"class"|"namespace"|"union"|"struct"|"fn"|"var"|"typedef"|"def"|"overload")|("<"{PRE}">")
BN [ \t\n\r]
BL [ \t\r]*"\n"
B [ \t]
......@@ -1895,11 +1895,11 @@ PHPKW ("require"|"require_once"|"include"|"include_once"|"echo")[^a-zA-Z0-9_;]
lastStringContext=YY_START;
BEGIN( CopyString );
}
<ReadBody,ReadNSBody>"/*"{B}* { current->program += yytext ;
<ReadBody,ReadNSBody>"/*"{B}* { current->program += yytext ;
lastContext = ReadBody ;
BEGIN( Comment ) ;
}
<ReadBody,ReadNSBody>"/*"{BL} { current->program += yytext ;
<ReadBody,ReadNSBody>"/*"{BL} { current->program += yytext ;
++yyLineNr ;
lastContext = ReadBody ;
BEGIN( Comment ) ;
......
......@@ -40,7 +40,7 @@
#include "version.h"
#include "groupdef.h"
#include "reflist.h"
#include "page.h"
#include "pagedef.h"
#ifndef _WIN32
#include <unistd.h>
......@@ -809,10 +809,10 @@ void linkifyText(const TextGeneratorIntf &out,const char *scName,const char *nam
// word.data(),scopeName.data(),searchName.data()
// );
// check if `word' is a documented class name
if (!word.isEmpty() &&
!(isdigit(word.at(0)) || word.at(0)=='-') &&
// do not try to link digits
// (saves a lot of time for large arrays)
if (//!word.isEmpty() &&
//!(isdigit(word.at(0)) || word.at(0)=='-') &&
// // do not try to link digits
// // (saves a lot of time for large arrays)
!rightScopeMatch(word,searchName) &&
!rightScopeMatch(scopeName,word)
)
......@@ -822,10 +822,14 @@ void linkifyText(const TextGeneratorIntf &out,const char *scName,const char *nam
bool found=FALSE;
do // for each scope (starting with full scope and going to empty scope)
{
QCString fullName = word.copy();
QCString fullName = word;
replaceNamespaceAliases(fullName,fullName.length());
if (scopeOffset>0)
{
fullName.prepend(scopeName.left(scopeOffset)+"::");
QCString prefix = scopeName.left(scopeOffset);
replaceNamespaceAliases(prefix,scopeOffset);
fullName.prepend(prefix+"::");
}
//printf("Trying class %s\n",fullName.data());
......@@ -1406,6 +1410,7 @@ static void trimNamespaceScope(QCString &t1,QCString &t2,const QCString &nsName)
if (i1!=-1 && i2==-1) // only t1 has a scope
{
QCString scope=t1.left(i1);
replaceNamespaceAliases(scope,i1);
int so=nsName.length();
do
......@@ -1432,6 +1437,7 @@ static void trimNamespaceScope(QCString &t1,QCString &t2,const QCString &nsName)
else if (i1==-1 && i2!=-1) // only t2 has a scope
{
QCString scope=t2.left(i2);
replaceNamespaceAliases(scope,i2);
int so=nsName.length();
do
......@@ -2644,17 +2650,17 @@ bool resolveLink(/* in */ const char *scName,
/* in */ const char *lr,
/* in */ bool inSeeBlock,
/* out */ Definition **resContext,
/* out */ PageInfo **resPageInfo,
/* out PageInfo **resPageInfo,*/
/* out */ QCString &resAnchor
)
{
*resContext=0;
*resPageInfo=0;
//*resPageInfo=0;
QCString linkRef=lr;
FileDef *fd;
GroupDef *gd;
PageInfo *pi;
PageDef *pd;
ClassDef *cd;
NamespaceDef *nd;
bool ambig;
......@@ -2662,25 +2668,25 @@ bool resolveLink(/* in */ const char *scName,
{
return FALSE;
}
else if ((pi=Doxygen::pageSDict->find(linkRef))) // link to a page
else if ((pd=Doxygen::pageSDict->find(linkRef))) // link to a page
{
GroupDef *gd = pi->getGroupDef();
GroupDef *gd = pd->getGroupDef();
if (gd)
{
SectionInfo *si=0;
if (!pi->name.isEmpty()) si=Doxygen::sectionDict[pi->name];
if (!pd->name().isEmpty()) si=Doxygen::sectionDict[pd->name()];
*resContext=gd;
if (si) resAnchor = si->label;
}
else
{
*resPageInfo=pi;
*resContext=pd;
}
return TRUE;
}
else if ((pi=Doxygen::exampleSDict->find(linkRef))) // link to an example
else if ((pd=Doxygen::exampleSDict->find(linkRef))) // link to an example
{
*resPageInfo=pi;
*resContext=pd;
return TRUE;
}
else if ((gd=Doxygen::groupSDict[linkRef])) // link to a group
......@@ -2726,21 +2732,22 @@ bool generateLink(OutputDocInterface &od,const char *clName,
{
//printf("generateLink(clName=%s,lr=%s,lr=%s)\n",clName,lr,lt);
Definition *compound;
PageInfo *pageInfo;
//PageDef *pageDef=0;
QCString anchor,linkText=linkToText(lt);
//printf("generateLink linkText=%s\n",linkText.data());
if (resolveLink(clName,lr,inSeeBlock,&compound,&pageInfo,anchor))
if (resolveLink(clName,lr,inSeeBlock,&compound,/*&pageInfo,*/anchor))
{
if (pageInfo) // link to page
{
od.writeObjectLink(pageInfo->getReference(),
pageInfo->getOutputFileBase(),anchor,linkText);
if (!pageInfo->isReference())
{
writePageRef(od,pageInfo->getOutputFileBase(),anchor);
}
}
else if (compound) // link to compound
//if (pageInfo) // link to page
//{
// od.writeObjectLink(pageInfo->getReference(),
// pageInfo->getOutputFileBase(),anchor,linkText);
// if (!pageInfo->isReference())
// {
// writePageRef(od,pageInfo->getOutputFileBase(),anchor);
// }
//}
//else
if (compound) // link to compound
{
if (lt==0 && anchor.isEmpty() && /* compound link */
compound->definitionType()==Definition::TypeGroup /* is group */
......@@ -3594,7 +3601,7 @@ found:
//----------------------------------------------------------------------------
PageInfo *addRelatedPage(const char *name,const QCString &ptitle,
PageDef *addRelatedPage(const char *name,const QCString &ptitle,
const QCString &doc,
QList<QCString> * /*anchors*/,
const char *fileName,int startLine,
......@@ -3603,12 +3610,12 @@ PageInfo *addRelatedPage(const char *name,const QCString &ptitle,
TagInfo *tagInfo
)
{
PageInfo *pi=0;
PageDef *pd=0;
//printf("addRelatedPage(name=%s gd=%p)\n",name,gd);
if ((pi=Doxygen::pageSDict->find(name)) && !tagInfo)
if ((pd=Doxygen::pageSDict->find(name)) && !tagInfo)
{
// append documentation block to the page.
pi->doc+="\n\n"+doc;
pd->setDocumentation(pd->documentation()+"\n\n"+doc,fileName,startLine);
//printf("Adding page docs `%s' pi=%p name=%s\n",doc.data(),pi,name);
}
else // new page
......@@ -3620,43 +3627,30 @@ PageInfo *addRelatedPage(const char *name,const QCString &ptitle,
baseName=baseName.left(baseName.length()-Doxygen::htmlFileExtension.length());
QCString title=ptitle.stripWhiteSpace();
pi=new PageInfo(fileName,startLine,baseName,doc,title);
pd=new PageDef(fileName,startLine,baseName,doc,title);
if (sli)
{
if (pi->xrefListItems==0)
{
pi->xrefListItems=new QList<ListItemInfo>;
pi->xrefListItems->setAutoDelete(TRUE);
}
QListIterator<ListItemInfo> slii(*sli);
ListItemInfo *lii;
for (slii.toFirst();(lii=slii.current());++slii)
{
pi->xrefListItems->append(new ListItemInfo(*lii));
}
}
pd->setRefItems(sli);
if (tagInfo)
{
pi->reference = tagInfo->tagName;
pd->setReference(tagInfo->tagName);
}
QCString pageName;
if (Config_getBool("CASE_SENSE_NAMES"))
pageName=pi->name.copy();
pageName=pd->name();
else
pageName=pi->name.lower();
pageName=pd->name().lower();
//setFileNameForSections(anchors,pageName,pi);
pi->fileName = pageName;
pd->setFileName(pageName);
//pi->addSections(anchors);
//printf("Appending page `%s'\n",baseName.data());
Doxygen::pageSDict->append(baseName,pi);
Doxygen::pageSDict->append(baseName,pd);
if (gd) gd->addPage(pi);
if (gd) gd->addPage(pd);
if (!pi->title.isEmpty())
if (!pd->title().isEmpty())
{
//outputList->writeTitle(pi->name,pi->title);
......@@ -3666,16 +3660,16 @@ PageInfo *addRelatedPage(const char *name,const QCString &ptitle,
{
file=gd->getOutputFileBase();
}
else if (pi->getGroupDef())
else if (pd->getGroupDef())
{
file=pi->getGroupDef()->getOutputFileBase().copy();
file=pd->getGroupDef()->getOutputFileBase().copy();
}
else
{
file=pageName;
}
SectionInfo *si=new SectionInfo(
file,pi->name,pi->title,SectionInfo::Page,pi->reference);
file,pd->name(),pd->title(),SectionInfo::Page,pd->getReference());
//printf("si->label=`%s' si->definition=%s si->fileName=`%s'\n",
// si->label.data(),si->definition?si->definition->name().data():"<none>",
// si->fileName.data());
......@@ -3684,7 +3678,7 @@ PageInfo *addRelatedPage(const char *name,const QCString &ptitle,
Doxygen::sectionDict.insert(pageName,si);
}
}
return pi;
return pd;
}
//----------------------------------------------------------------------------
......@@ -4161,5 +4155,30 @@ QCString rtfFormatBmkStr(const char *name)
return *tag;
}
QCString stripExtension(const char *fName)
{
QCString result=fName;
if (result.right(Doxygen::htmlFileExtension.length())==Doxygen::htmlFileExtension)
{
result=result.left(result.length()-Doxygen::htmlFileExtension.length());
}
return result;
}
void replaceNamespaceAliases(QCString &scope,int i)
{
//printf("replaceNamespaceAliases(%s,%d)\n",scope.data(),i);
while (i>0)
{
QCString *s = Doxygen::namespaceAliasDict[scope.left(i)];
if (s)
{
scope=*s+scope.right(scope.length()-i);
i=s->length();
}
i=scope.findRev("::",i-1);
}
//printf("replaceNamespaceAliases() result=%s\n",scope.data());
}
......@@ -47,7 +47,7 @@ class Definition;
struct TagInfo;
class MemberNameInfoSDict;
struct ListItemInfo;
class PageInfo;
class PageDef;
//--------------------------------------------------------------------
......@@ -96,19 +96,18 @@ bool getDefs(const QCString &scopeName,
bool resolveRef(/* in */ const char *scName,
/* in */ const char *name,
/* in */ bool inSeeBlock,
/* out */ Definition **resContext,
/* out */ MemberDef **resMember
);
bool resolveLink(/* in */ const char *scName,
/* in */ const char *lr,
/* in */ bool inSeeBlock,
/* out */ Definition **resContext,
/* out */ PageInfo **resPageInfo,
/* out */ QCString &resAnchor
);
/* in */ const char *name,
/* in */ bool inSeeBlock,
/* out */ Definition **resContext,
/* out */ MemberDef **resMember
);
bool resolveLink(/* in */ const char *scName,
/* in */ const char *lr,
/* in */ bool inSeeBlock,
/* out */ Definition **resContext,
/* out */ QCString &resAnchor
);
bool generateRef(OutputDocInterface &od,const char *,
const char *,bool inSeeBlock,const char * =0);
......@@ -184,7 +183,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);
PageInfo *addRelatedPage(const char *name,const QCString &ptitle,
PageDef *addRelatedPage(const char *name,const QCString &ptitle,
const QCString &doc,QList<QCString> *anchors,
const char *fileName,int startLine,
const QList<ListItemInfo> *sli,
......@@ -198,6 +197,8 @@ void filterLatexString(QTextStream &t,const char *str,
bool insideItem=FALSE);
QCString rtfFormatBmkStr(const char *name);
QCString linkToText(const char *link);
QCString stripExtension(const char *fName);
void replaceNamespaceAliases(QCString &scope,int i);
#endif
......@@ -29,7 +29,7 @@
#include "outputgen.h"
#include "dot.h"
#include "code.h"
#include "page.h"
#include "pagedef.h"
#include "filename.h"
#include "version.h"
#include "xmldocvisitor.h"
......@@ -840,8 +840,8 @@ static void generateXMLForClass(ClassDef *cd,QTextStream &ti)
<< "\" kind=\"" << cd->compoundTypeString()
<< "\"><name>" << convertToXML(cd->name()) << "</name>" << endl;
QCString outputDirectory = Config_getString("OUTPUT_DIRECTORY");
QCString fileName=outputDirectory+"/xml/"+cd->getOutputFileBase()+".xml";
QCString outputDirectory = Config_getString("XML_OUTPUT");
QCString fileName=outputDirectory+"/"+cd->getOutputFileBase()+".xml";
QFile f(fileName);
if (!f.open(IO_WriteOnly))
{
......@@ -1031,8 +1031,8 @@ static void generateXMLForNamespace(NamespaceDef *nd,QTextStream &ti)
<< "\" kind=\"namespace\"" << "><name>"
<< convertToXML(nd->name()) << "</name>" << endl;
QCString outputDirectory = Config_getString("OUTPUT_DIRECTORY");
QCString fileName=outputDirectory+"/xml/"+nd->getOutputFileBase()+".xml";
QCString outputDirectory = Config_getString("XML_OUTPUT");
QCString fileName=outputDirectory+"/"+nd->getOutputFileBase()+".xml";
QFile f(fileName);
if (!f.open(IO_WriteOnly))
{
......@@ -1122,8 +1122,8 @@ static void generateXMLForFile(FileDef *fd,QTextStream &ti)
<< "\" kind=\"file\"><name>" << convertToXML(fd->name())
<< "</name>" << endl;
QCString outputDirectory = Config_getString("OUTPUT_DIRECTORY");
QCString fileName=outputDirectory+"/xml/"+fd->getOutputFileBase()+".xml";
QCString outputDirectory = Config_getString("XML_OUTPUT");
QCString fileName=outputDirectory+"/"+fd->getOutputFileBase()+".xml";
QFile f(fileName);
if (!f.open(IO_WriteOnly))
{
......@@ -1255,8 +1255,8 @@ static void generateXMLForGroup(GroupDef *gd,QTextStream &ti)
ti << " <compound refid=\"" << gd->getOutputFileBase()
<< "\" kind=\"group\"><name>" << convertToXML(gd->name()) << "</name>" << endl;
QCString outputDirectory = Config_getString("OUTPUT_DIRECTORY");
QCString fileName=outputDirectory+"/xml/"+gd->getOutputFileBase()+".xml";
QCString outputDirectory = Config_getString("XML_OUTPUT");
QCString fileName=outputDirectory+"/"+gd->getOutputFileBase()+".xml";
QFile f(fileName);
if (!f.open(IO_WriteOnly))
{
......@@ -1309,11 +1309,11 @@ static void generateXMLForGroup(GroupDef *gd,QTextStream &ti)
if (pl)
{
PageSDict::Iterator pli(*pl);
PageInfo *pi;
for (pli.toFirst();(pi=pli.current());++pli)
PageDef *pd;
for (pli.toFirst();(pd=pli.current());++pli)
{
t << " <innerpage refid=\"" << pi->getOutputFileBase()
<< "\">" << convertToXML(pi->title) << "</innerpage>" << endl;
t << " <innerpage refid=\"" << pd->getOutputFileBase()
<< "\">" << convertToXML(pd->title()) << "</innerpage>" << endl;
}
}
......@@ -1356,22 +1356,23 @@ static void generateXMLForGroup(GroupDef *gd,QTextStream &ti)
ti << " </compound>" << endl;
}
static void generateXMLForPage(PageInfo *pi,QTextStream &ti)
static void generateXMLForPage(PageDef *pd,QTextStream &ti)
{
// + name
// + title
// + documentation
if (pi->isReference()) return;
if (pd->isReference()) return;
QCString pageName = pi->getOutputFileBase();
QCString pageName = pd->getOutputFileBase();
if (pageName=="index") pageName="indexpage"; // to prevent overwriting the generated index page.
ti << " <compound refid=\"" << pageName
<< "\" kind=\"page\"><name>" << convertToXML(pi->name) << "</name>" << endl;
<< "\" kind=\"page\"><name>" << convertToXML(pd->name())
<< "</name>" << endl;
QCString outputDirectory = Config_getString("OUTPUT_DIRECTORY");
QCString fileName=outputDirectory+"/xml/"+pageName+".xml";
QCString outputDirectory = Config_getString("XML_OUTPUT");
QCString fileName=outputDirectory+"/"+pageName+".xml";
QFile f(fileName);
if (!f.open(IO_WriteOnly))
{
......@@ -1384,14 +1385,15 @@ static void generateXMLForPage(PageInfo *pi,QTextStream &ti)
writeXMLHeader(t);
t << " <compounddef id=\"" << pageName;
t << "\" kind=\"page\">" << endl;
t << " <compoundname>" << convertToXML(pi->name) << "</compoundname>" << endl;
SectionInfo *si = Doxygen::sectionDict.find(pi->name);
t << " <compoundname>" << convertToXML(pd->name())
<< "</compoundname>" << endl;
SectionInfo *si = Doxygen::sectionDict.find(pd->name());
if (si)
{
t << " <title>" << si->title << "</title>" << endl;
t << " <title>" << convertToXML(si->title) << "</title>" << endl;
}
t << " <detaileddescription>" << endl;
writeXMLDocBlock(t,pi->defFileName,pi->defLine,0,0,pi->doc);
writeXMLDocBlock(t,pd->docFile(),pd->docLine(),0,0,pd->documentation());
t << " </detaileddescription>" << endl;
t << " </compounddef>" << endl;
t << "</doxygen>" << endl;
......@@ -1410,7 +1412,7 @@ void generateXML()
// + related pages
// - examples
QCString outputDirectory = Config_getString("OUTPUT_DIRECTORY");
QCString outputDirectory = Config_getString("XML_OUTPUT");
if (outputDirectory.isEmpty())
{
outputDirectory=QDir::currentDirPath();
......@@ -1423,7 +1425,7 @@ void generateXML()
dir.setPath(QDir::currentDirPath());
if (!dir.mkdir(outputDirectory))
{
err("Error: tag OUTPUT_DIRECTORY: Output directory `%s' does not "
err("Error: tag XML_OUTPUT: Output directory `%s' does not "
"exist and cannot be created\n",outputDirectory.data());
exit(1);
}
......@@ -1447,14 +1449,8 @@ void generateXML()
return;
}
}
QDir xmlDir(outputDirectory+"/xml");
if (!xmlDir.exists() && !xmlDir.mkdir(outputDirectory+"/xml"))
{
err("Could not create xml directory in %s\n",outputDirectory.data());
return;
}
QCString fileName=outputDirectory+"/xml/index.xml";
QDir xmlDir(outputDirectory);
QCString fileName=outputDirectory+"/index.xml";
QFile f(fileName);
if (!f.open(IO_WriteOnly))
{
......@@ -1494,10 +1490,10 @@ void generateXML()
generateXMLForGroup(gd,t);
}
PageSDict::Iterator pdi(*Doxygen::pageSDict);
PageInfo *pi=0;
for (pdi.toFirst();(pi=pdi.current());++pdi)
PageDef *pd=0;
for (pdi.toFirst();(pd=pdi.current());++pdi)
{
generateXMLForPage(pi,t);
generateXMLForPage(pd,t);
}
if (Doxygen::mainPage)
{
......
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