Commit f3e7209f authored by dimitri's avatar dimitri

Release-1.3-rc1-20021128

parent e952dab5
DOXYGEN Version 1.3-rc1
DOXYGEN Version 1.3-rc1-20021128
Please read the installation section of the manual
(http://www.doxygen.org/install.html) for instructions.
--------
Dimitri van Heesch (15 November 2002)
Dimitri van Heesch (28 November 2002)
DOXYGEN Version 1.3_rc1
DOXYGEN Version 1.3_rc1_20021128
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) (15 November 2002)
Dimitri van Heesch (dimitri@stack.nl) (28 November 2002)
1.3-rc1
1.3-rc1-20021128
......@@ -376,7 +376,8 @@ doxygen. Unrecognized commands are treated as normal text.
\addindex \\internal
This command writes the message `For internal use only' to the output and
all text \e after a \c \\internal command is ignored.
all text \e after a \c \\internal command until the end of the
comment block is ignored.
You can use \ref cfg_internal_docs "INTERNAL_DOCS" in the config file
to show or hide the internal documentation.
......
......@@ -229,7 +229,8 @@ generator -> gen
\endverbatim
At the time I was looking into lex and yacc, where a lot of things start with
"yy", so the "y" slipped in and made things pronounceable.
"yy", so the "y" slipped in and made things pronounceable
(the proper pronouncement is Docs-ee-gen, so with a long "e").
<li><b>What was the reason to develop doxygen?</b>
......
......@@ -37,7 +37,6 @@ Xavier Outhier: xouthier@yahoo.fr
German
Jens Seidel: jensseidel@users.sf.net
Jens Breitenstein: Jens.Breitenstein@tlc.de
Greek
Harry Kalogirou: harkal@rainbow.cs.unipi.gr
......
Summary: A documentation system for C/C++.
Name: doxygen
Version: 1.3_rc1
Version: 1.3_rc1_20021128
Release: 1
Epoch: 1
Source0: ftp://ftp.stack.nl/pub/users/dimitri/%{name}-%{version}.src.tar.gz
......
......@@ -34,6 +34,7 @@
#include "dot.h"
#include "defargs.h"
#include "debug.h"
#include "docparser.h"
static QCString stripExtension(const char *fName)
{
......@@ -553,6 +554,41 @@ void ClassDef::distributeMemberGroupDocumentation()
}
}
void ClassDef::findSectionsInDocumentation()
{
docFindSections(documentation(),0,this,0);
MemberGroupSDict::Iterator mgli(*memberGroupSDict);
MemberGroup *mg;
for (;(mg=mgli.current());++mgli)
{
mg->findSectionsInDocumentation();
}
pubTypes.findSectionsInDocumentation();
pubMethods.findSectionsInDocumentation();
pubAttribs.findSectionsInDocumentation();
pubSlots.findSectionsInDocumentation();
signals.findSectionsInDocumentation();
dcopMethods.findSectionsInDocumentation();
pubStaticMethods.findSectionsInDocumentation();
pubStaticAttribs.findSectionsInDocumentation();
proTypes.findSectionsInDocumentation();
proMethods.findSectionsInDocumentation();
proAttribs.findSectionsInDocumentation();
proSlots.findSectionsInDocumentation();
proStaticMethods.findSectionsInDocumentation();
proStaticAttribs.findSectionsInDocumentation();
priTypes.findSectionsInDocumentation();
priMethods.findSectionsInDocumentation();
priAttribs.findSectionsInDocumentation();
priSlots.findSectionsInDocumentation();
priStaticMethods.findSectionsInDocumentation();
priStaticAttribs.findSectionsInDocumentation();
friends.findSectionsInDocumentation();
related.findSectionsInDocumentation();
properties.findSectionsInDocumentation();
events.findSectionsInDocumentation();
}
// add a file name to the used files set
void ClassDef::insertUsedFile(const char *f)
......@@ -1558,7 +1594,7 @@ void ClassDef::writeDeclaration(OutputList &ol,MemberDef *md,bool inGroup)
}
}
ol.docify(" {");
ol.endMemberItem(FALSE);
ol.endMemberItem();
// write user defined member groups
MemberGroupSDict::Iterator mgli(*memberGroupSDict);
......
......@@ -259,6 +259,7 @@ class ClassDef : public Definition
bool addExample(const char *anchor,const char *name, const char *file);
void addMembersToMemberGroup();
void distributeMemberGroupDocumentation();
void findSectionsInDocumentation();
void setNamespace(NamespaceDef *nd) { m_nspace = nd; }
void setTemplateArguments(ArgumentList *al);
void mergeMembers();
......
......@@ -112,7 +112,7 @@ void ClassSDict::writeDeclaration(OutputList &ol,const ClassDef::CompoundType *f
ol.docify(cd->localName());
ol.endBold();
}
ol.endMemberItem(FALSE);
ol.endMemberItem();
if (!cd->briefDescription().isEmpty())
{
ol.startMemberDescription();
......
......@@ -74,6 +74,9 @@ CommandMap cmdMap[] =
{ "sa", CMD_SA },
{ "secreflist", CMD_SECREFLIST },
{ "section", CMD_SECTION },
{ "subsection", CMD_SUBSECTION },
{ "subsubsection", CMD_SUBSUBSECTION },
{ "paragraph", CMD_PARAGRAPH },
{ "see", CMD_SA },
{ "since", CMD_SINCE },
{ "skip", CMD_SKIP },
......
......@@ -73,33 +73,36 @@ enum CommandType
CMD_RETVAL = 39 | SIMPLESECT_BIT,
CMD_SA = 40 | SIMPLESECT_BIT ,
CMD_SECTION = 41,
CMD_SINCE = 42 | SIMPLESECT_BIT,
CMD_SKIP = 43,
CMD_SKIPLINE = 44,
CMD_STARTCODE = 45,
CMD_JAVALINK = 46,
CMD_TEST = 47 | SIMPLESECT_BIT,
CMD_TODO = 48 | SIMPLESECT_BIT,
CMD_UNTIL = 49,
CMD_VERBATIM = 50,
CMD_VERBINCLUDE = 51,
CMD_VERSION = 52 | SIMPLESECT_BIT,
CMD_WARNING = 53 | SIMPLESECT_BIT ,
CMD_BSLASH = 54,
CMD_AT = 55,
CMD_LESS = 56,
CMD_GREATER = 57,
CMD_AMP = 58,
CMD_DOLLAR = 59,
CMD_HASH = 60,
CMD_PERCENT = 61,
CMD_LINEBREAK = 62,
CMD_FORMULA = 63,
CMD_SECREFLIST = 64,
CMD_ENDSECREFLIST= 65,
CMD_LANGSWITCH = 66,
CMD_AUTHORS = 67 | SIMPLESECT_BIT,
CMD_INTERNALREF = 68
CMD_SUBSECTION = 42,
CMD_SUBSUBSECTION= 43,
CMD_PARAGRAPH = 44,
CMD_SINCE = 45 | SIMPLESECT_BIT,
CMD_SKIP = 46,
CMD_SKIPLINE = 47,
CMD_STARTCODE = 48,
CMD_JAVALINK = 49,
CMD_TEST = 50 | SIMPLESECT_BIT,
CMD_TODO = 51 | SIMPLESECT_BIT,
CMD_UNTIL = 52,
CMD_VERBATIM = 53,
CMD_VERBINCLUDE = 54,
CMD_VERSION = 55 | SIMPLESECT_BIT,
CMD_WARNING = 56 | SIMPLESECT_BIT ,
CMD_BSLASH = 57,
CMD_AT = 58,
CMD_LESS = 59,
CMD_GREATER = 60,
CMD_AMP = 61,
CMD_DOLLAR = 62,
CMD_HASH = 63,
CMD_PERCENT = 64,
CMD_LINEBREAK = 65,
CMD_FORMULA = 66,
CMD_SECREFLIST = 67,
CMD_ENDSECREFLIST= 68,
CMD_LANGSWITCH = 69,
CMD_AUTHORS = 70 | SIMPLESECT_BIT,
CMD_INTERNALREF = 71
};
enum HtmlTagType
......
This diff is collapsed.
......@@ -30,6 +30,9 @@
class DocNode;
class MemberDef;
class PageInfo;
class Definition;
class MemberGroup;
//---------------------------------------------------------------------------
......@@ -55,6 +58,9 @@ 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);
//---------------------------------------------------------------------------
/*! @brief Abstract node interface with type information. */
......@@ -200,16 +206,18 @@ class DocLinkedWord : public DocNode
class DocURL : public DocNode
{
public:
DocURL(DocNode *parent,const QString &url) :
m_parent(parent), m_url(url) {}
DocURL(DocNode *parent,const QString &url,bool isEmail) :
m_parent(parent), m_url(url), m_isEmail(isEmail) {}
QString url() const { return m_url; }
Kind kind() const { return Kind_URL; }
DocNode *parent() const { return m_parent; }
void accept(DocVisitor *v) { v->visit(this); }
bool isEmail() const { return m_isEmail; }
private:
DocNode *m_parent;
QString m_url;
bool m_isEmail;
};
/*! @brief Node representing a line break */
......@@ -912,6 +920,7 @@ class DocPara : public CompAccept<DocPara>, public DocNode
void handleInclude(const QString &cmdName,DocInclude::Type t);
void handleLink(const QString &cmdName,bool isJavaLink);
void handleRef(const QString &cmdName);
void handleSection(const QString &cmdName);
int handleLanguageSwitch();
private:
......
......@@ -23,6 +23,10 @@
#include <qlist.h>
#include "htmlattrib.h"
class Definition;
class PageInfo;
class MemberGroup;
enum Tokens
{
TK_WORD = 1,
......@@ -41,17 +45,20 @@ enum Tokens
RetVal_SimpleSec = 0x10001,
RetVal_ListItem = 0x10002,
RetVal_Section = 0x10003,
RetVal_EndList = 0x10004,
RetVal_EndPre = 0x10005,
RetVal_DescData = 0x10006,
RetVal_DescTitle = 0x10007,
RetVal_EndDesc = 0x10008,
RetVal_TableRow = 0x10009,
RetVal_TableCell = 0x1000A,
RetVal_TableHCell = 0x1000B,
RetVal_EndTable = 0x1000C,
RetVal_Internal = 0x1000D,
RetVal_SwitchLang = 0x1000E
RetVal_Subsection = 0x10004,
RetVal_Subsubsection = 0x10005,
RetVal_Paragraph = 0x10006,
RetVal_EndList = 0x10007,
RetVal_EndPre = 0x10008,
RetVal_DescData = 0x10009,
RetVal_DescTitle = 0x1000A,
RetVal_EndDesc = 0x1000B,
RetVal_TableRow = 0x1000C,
RetVal_TableCell = 0x1000D,
RetVal_TableHCell = 0x1000E,
RetVal_EndTable = 0x1000F,
RetVal_Internal = 0x10010,
RetVal_SwitchLang = 0x10011
};
struct TokenInfo
......@@ -89,6 +96,9 @@ struct TokenInfo
// whitespace
QString chars;
// url
bool isEMailAddr;
};
// globals
......@@ -100,6 +110,8 @@ extern FILE *doctokenizerYYin;
const char *tokToString(int token);
// operations on the scanner
void doctokenizerYYFindSections(const char *input,PageInfo *pi,Definition *d,
MemberGroup *mg);
void doctokenizerYYinit(const char *input,const char *fileName);
void doctokenizerYYcleanup();
void doctokenizerYYpushContext();
......@@ -119,5 +131,7 @@ void doctokenizerYYsetStateLink();
void doctokenizerYYsetStateRef();
void doctokenizerYYsetStateInternalRef();
void doctokenizerYYsetStateText();
void doctokenizerYYsetStateSkipTitle();
void doctokenizerYYsetInsidePre(bool b);
#endif
......@@ -27,16 +27,30 @@
#include "cmdmapper.h"
#include "config.h"
#include "message.h"
#include "section.h"
#include "membergroup.h"
#include "definition.h"
#include "page.h"
#define YY_NEVER_INTERACTIVE 1
//--------------------------------------------------------------------------
// context for tokenizer phase
static int g_commentState;
TokenInfo *g_token = 0;
static int g_inputPos = 0;
static const char *g_inputString;
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;
static QCString g_secTitle;
static SectionInfo::SectionType g_secType;
struct DocLexerContext
{
......@@ -189,6 +203,41 @@ static void parseHtmlAttribs(const char *att)
//--------------------------------------------------------------------------
static void processSection()
{
//printf("found section/anchor with name `%s'\n",g_secLabel.data());
QCString file;
if (g_memberGroup)
{
file = g_memberGroup->parent()->getOutputFileBase();
}
else if (g_definition)
{
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());
}
SectionInfo *si=0;
if ((si=Doxygen::sectionDict.find(g_secLabel))==0)
{
si = new SectionInfo(file,g_secLabel,g_secTitle,g_secType);
Doxygen::sectionDict.insert(g_secLabel,si);
}
else if (!si->generated)
{
warn(g_fileName,yylineno,"Duplicate section/anchor label %s found!\n",
g_secLabel.data());
}
}
//--------------------------------------------------------------------------
#undef YY_INPUT
#define YY_INPUT(buf,result,max_size) result=yyread(buf,max_size);
......@@ -237,14 +286,15 @@ OPMASK ({BLANK}*{OPNORM}({FUNCARG}?))|({OPCAST}{FUNCARG})
LNKWORD1 ("::"|"#")?{SCOPEMASK}
CVSPEC {BLANK}*("const"|"volatile")
LNKWORD2 {SCOPEPRE}*"operator"{OPMASK}
WORD1 [^ \t\n\r\\@<>{}&$#,.]+|"{"|"}"
WORD2 "."|","
WORD1NQ [^ \t\n\r\\@<>{}&$#,."]+
WORD2NQ "."|","
WORD1 [^ \t\n\r\\@<>(){}&$#,.]+|"{"|"}"
WORD2 "."|","|"("|")"
WORD1NQ [^ \t\n\r\\@<>(){}&$#,."]+
WORD2NQ "."|","|"("|")"
HTMLTAG "<"(("/")?){ID}({WS}+{ATTRIB})*">"
HTMLKEYL "strong"|"center"|"table"|"caption"|"small"|"code"|"dfn"|"var"|"img"|"pre"|"sub"|"tr"|"td"|"th"|"ol"|"ul"|"li"|"tt"|"kbd"|"em"|"hr"|"dl"|"dt"|"dd"|"br"|"i"|"a"|"b"|"p"
HTMLKEYU "STRONG"|"CENTER"|"TABLE"|"CAPTION"|"SMALL"|"CODE"|"DFN"|"VAR"|"IMG"|"PRE"|"SUB"|"TR"|"TD"|"TH"|"OL"|"UL"|"LI"|"TT"|"KBD"|"EM"|"HR"|"DL"|"DT"|"DD"|"BR"|"I"|"A"|"B"|"P"
HTMLKEYW {HTMLKEYL}|{HTMLKEYU}
LABELID [a-z_A-Z][a-z_A-Z0-9\-]*
%option noyywrap
%option yylineno
......@@ -269,6 +319,12 @@ HTMLKEYW {HTMLKEYL}|{HTMLKEYU}
%x St_Ref2
%x St_IntRef
%x St_Text
%x St_SkipTitle
%x St_Sections
%s St_SecLabel1
%s St_SecLabel2
%s St_SecTitle
%%
<St_Para>\r /* skip carriage return */
......@@ -315,12 +371,14 @@ HTMLKEYW {HTMLKEYL}|{HTMLKEYU}
g_token->name = yytext+1;
return TK_COMMAND;
}
<St_Para>("http:"|"https:"|"ftp:"|"file:"|"news:"){URLMASK} {
<St_Para>("http:"|"https:"|"ftp:"|"file:"|"news:"){URLMASK} { // URL
g_token->name=yytext;
g_token->isEMailAddr=FALSE;
return TK_URL;
}
<St_Para>[a-z_A-Z0-9.-]+"@"[a-z_A-Z0-9-]+"."[a-z_A-Z0-9.-]+ {
<St_Para>[a-z_A-Z0-9.-]+"@"[a-z_A-Z0-9-]+"."[a-z_A-Z0-9.-]+ { // Mail address
g_token->name=yytext;
g_token->isEMailAddr=TRUE;
return TK_URL;
}
<St_Para>"$"{ID}":"[^\n$]+"$" { /* RCS tag */
......@@ -408,9 +466,20 @@ HTMLKEYW {HTMLKEYL}|{HTMLKEYU}
return TK_COMMAND;
}
<St_Para>({BLANK}*\n)+{BLANK}*\n {
if (g_insidePre)
{
/* Inside a <pre>..</pre> blank lines are treated
* as whitespace.
*/
g_token->chars=yytext;
return TK_WHITESPACE;
}
else
{
/* start of a new paragraph */
return TK_NEWPARA;
}
}
<St_Code>{CMD}"endcode" {
return RetVal_OK;
}
......@@ -621,6 +690,56 @@ HTMLKEYW {HTMLKEYL}|{HTMLKEYU}
}
<St_Comment>[^-\n]+ /* inside html comment */
<St_Comment>. /* inside html comment */
/* State for skipping title (all chars until the end of the line) */
<St_SkipTitle>.
<St_SkipTitle>\n { return 0; }
/* State for the pass used to find the anchors and sections */
<St_Sections>[^\n@\\]+
<St_Sections>"@@"|"\\\\"
<St_Sections>{CMD}"anchor"{BLANK}+ {
g_secType = SectionInfo::Anchor;
BEGIN(St_SecLabel1);
}
<St_Sections>{CMD}"section"{BLANK}+ {
g_secType = SectionInfo::Section;
BEGIN(St_SecLabel2);
}
<St_Sections>{CMD}"subsection"{BLANK}+ {
g_secType = SectionInfo::Subsection;
BEGIN(St_SecLabel2);
}
<St_Sections>{CMD}"subsubsection"{BLANK}+ {
g_secType = SectionInfo::Subsubsection;
BEGIN(St_SecLabel2);
}
<St_Sections>{CMD}"paragraph"{BLANK}+ {
g_secType = SectionInfo::Paragraph;
BEGIN(St_SecLabel2);
}
<St_Sections>.
<St_Sections>\n
<St_SecLabel1>{LABELID} {
g_secLabel = yytext;
processSection();
BEGIN(St_Sections);
}
<St_SecLabel2>{LABELID}{BLANK}+ {
g_secLabel = yytext;
g_secLabel = g_secLabel.stripWhiteSpace();
BEGIN(St_SecTitle);
}
<St_SecTitle>[^\n]*\n {
g_secTitle = yytext;
g_secTitle = g_secTitle.stripWhiteSpace();
processSection();
BEGIN(St_Sections);
}
/* Generic rules that work for all states */
<*>\n {
warn(g_fileName,yylineno,"Error: Unexpected new line character");
}
......@@ -636,11 +755,27 @@ HTMLKEYW {HTMLKEYL}|{HTMLKEYU}
//--------------------------------------------------------------------------
void doctokenizerYYFindSections(const char *input,PageInfo *pi,Definition *d,
MemberGroup *mg)
{
if (input==0) return;
g_inputString = input;
//printf("parsing --->`%s'<---\n",input);
g_inputPos = 0;
g_pageInfo = pi;
g_definition = d;
g_memberGroup = mg;
BEGIN(St_Sections);
doctokenizerYYlineno = 1;
doctokenizerYYlex();
}
void doctokenizerYYinit(const char *input,const char *fileName)
{
g_inputString = input;
g_inputPos = 0;
g_fileName = fileName;
g_insidePre = FALSE;
BEGIN(St_Para);
}
......@@ -718,11 +853,21 @@ void doctokenizerYYsetStateText()
BEGIN(St_Text);
}
void doctokenizerYYsetStateSkipTitle()
{
BEGIN(St_SkipTitle);
}
void doctokenizerYYcleanup()
{
yy_delete_buffer( YY_CURRENT_BUFFER );
}
void doctokenizerYYsetInsidePre(bool b)
{
g_insidePre = b;
}
extern "C" { // some bogus code to keep the compiler happy
void doctokenizerYYdummy() { yy_flex_realloc(0,0); }
}
......@@ -1149,7 +1149,7 @@ static MemberDef *addVariableToClass(
/*const QCString &scope,*/
const QCString &name,
bool fromAnnScope,
int indentDepth,
/*int indentDepth,*/
MemberDef *fromAnnMemb,
Protection prot)
{
......@@ -1236,7 +1236,7 @@ static MemberDef *addVariableToClass(
md->addSectionsToDefinition(root->anchors);
md->setFromAnonymousScope(fromAnnScope);
md->setFromAnonymousMember(fromAnnMemb);
md->setIndentDepth(indentDepth);
//md->setIndentDepth(indentDepth);
md->setBodySegment(root->bodyLine,root->endBodyLine);
md->setInitializer(root->initializer);
md->setMaxInitLines(root->initLines);
......@@ -1284,7 +1284,7 @@ static MemberDef *addVariableToFile(
const QCString &scope,
const QCString &name,
bool fromAnnScope,
int indentDepth,
/*int indentDepth,*/
MemberDef *fromAnnMemb)
{
Debug::print(Debug::Variables,0,
......@@ -1403,7 +1403,7 @@ static MemberDef *addVariableToFile(
md->addSectionsToDefinition(root->anchors);
md->setFromAnonymousScope(fromAnnScope);
md->setFromAnonymousMember(fromAnnMemb);
md->setIndentDepth(indentDepth);
//md->setIndentDepth(indentDepth);
md->setBodySegment(root->bodyLine,root->endBodyLine);
md->setInitializer(root->initializer);
md->setMaxInitLines(root->initLines);
......@@ -1661,7 +1661,7 @@ void buildVarList(Entry *root)
if (cd)
{
addVariableToClass(root,cd,MemberDef::Friend,/*scope,*/
root->name,FALSE,0,0,Public);
root->name,FALSE,/*0,*/0,Public);
}
}
goto nextMember;
......@@ -1693,44 +1693,51 @@ void buildVarList(Entry *root)
scope=classScope;
if (!scope.isEmpty() && !name.isEmpty() && (cd=getClass(scope)))
{
// TODO: clean up this mess!
MemberDef *md=0;
// if cd is an annonymous scope we insert the member
// into a non-annonymous scope as well.
int indentDepth=0;
//int indentDepth=0;
int si=scope.find('@');
//int anonyScopes = 0;
bool added=FALSE;
if (si!=-1)
{
//printf("name=`%s' scope=%s\n",name.data(),scope.data());
QCString pScope;
ClassDef *pcd=0;
pScope = scope.left(QMAX(si-2,0));
indentDepth = scope.right(scope.length()-si).contains("::")+1;
if (!pScope.isEmpty())
pScope.prepend(annScopePrefix);
else if (annScopePrefix.length()>2)
pScope=annScopePrefix.left(annScopePrefix.length()-2);
//printf("pScope=`%s'\n",pScope.data());
if (name.at(0)!='@')
{
if (!pScope.isEmpty() && (pcd=getClass(pScope)))
{
//Protection p = (Protection)QMAX((int)root->protection,(int)cd->protection());
md=addVariableToClass(root,pcd,mtype,/*pScope,*/name,TRUE,indentDepth,0,root->protection);
md=addVariableToClass(root,pcd,mtype,name,
TRUE,0,root->protection);
added=TRUE;
}
else // annonymous scope inside namespace or file => put variable in the global scope
{
//printf("Inserting member in global scope %s!\n",pScope.data());
//md=addVariableToFile(root,mtype,pScope,name,!pScope.isEmpty(),indentDepth,0);
md=addVariableToFile(root,mtype,pScope,name,TRUE,indentDepth,0);
md=addVariableToFile(root,mtype,pScope,name,TRUE,0);
added=TRUE;
}
}
}
addVariableToClass(root,cd,mtype,/*scope,*/name,FALSE,indentDepth,md,root->protection);
//printf("name=`%s' scope=%s scope.right=%s indentDepth=%d anonyScopes=%d\n",
// name.data(),scope.data(),
// scope.right(scope.length()-si).data(),
// indentDepth,
// anonyScopes);
addVariableToClass(root,cd,mtype,name,
FALSE,md,root->protection);
}
else if (!name.isEmpty()) // global variable
{
//printf("Inserting member in global scope %s!\n",scope.data());
addVariableToFile(root,mtype,scope,name,FALSE,0,0);
addVariableToFile(root,mtype,scope,name,FALSE,/*0,*/0);
}
//if (mtype==MemberDef::Typedef)
//{
......@@ -5719,6 +5726,53 @@ static void distributeMemberGroupDocumentation()
//----------------------------------------------------------------------------
static void findSectionsInDocumentation()
{
// for each class
ClassSDict::Iterator cli(Doxygen::classSDict);
ClassDef *cd;
for ( ; (cd=cli.current()) ; ++cli )
{
cd->findSectionsInDocumentation();
}
// for each file
FileName *fn=Doxygen::inputNameList.first();
while (fn)
{
FileDef *fd=fn->first();
while (fd)
{
fd->findSectionsInDocumentation();
fd=fn->next();
}
fn=Doxygen::inputNameList.next();
}
// for each namespace
NamespaceSDict::Iterator nli(Doxygen::namespaceSDict);
NamespaceDef *nd;
for ( ; (nd=nli.current()) ; ++nli )
{
nd->findSectionsInDocumentation();
}
// for each group
GroupSDict::Iterator gli(Doxygen::groupSDict);
GroupDef *gd;
for (gli.toFirst();(gd=gli.current());++gli)
{
gd->findSectionsInDocumentation();
}
// for each page
PageSDict::Iterator pdi(*Doxygen::pageSDict);
PageInfo *pi=0;
for (pdi.toFirst();(pi=pdi.current());++pdi)
{
pi->findSectionsInDocumentation();
}
if (Doxygen::mainPage) Doxygen::mainPage->findSectionsInDocumentation();
}
//----------------------------------------------------------------------------
static void findDefineDocumentation(Entry *root)
{
if ((root->section==Entry::DEFINEDOC_SEC ||
......@@ -5896,8 +5950,10 @@ static void findMainPage(Entry *root)
// a page name is a label as well!
SectionInfo *si=new SectionInfo(
Doxygen::mainPage->name,Doxygen::mainPage->title,SectionInfo::Section);
si->fileName=indexName;
indexName,
Doxygen::mainPage->name,
Doxygen::mainPage->title,
SectionInfo::Section);
Doxygen::sectionDict.insert(indexName,si);
}
else
......@@ -7700,8 +7756,10 @@ void parseInput()
msg("Adding source references...\n");
addSourceReferences();
msg("Adding todo/test/bug list items...\n");
addListReferences();
}
void generateOutput()
......@@ -7775,6 +7833,9 @@ void generateOutput()
msg("Resolving user defined references...\n");
resolveUserReferences();
msg("Finding anchor and section in the documentation...\n");
findSectionsInDocumentation();
msg("Generating index page...\n");
writeIndex(*outputList);
......
......@@ -29,6 +29,7 @@
#include "dot.h"
#include "message.h"
#include "code.h"
#include "docparser.h"
//#include "xml.h"
/*! create a new file definition, where \a p is the file path,
......@@ -97,6 +98,23 @@ void FileDef::distributeMemberGroupDocumentation()
}
}
void FileDef::findSectionsInDocumentation()
{
docFindSections(documentation(),0,this,0);
MemberGroupSDict::Iterator mgli(*memberGroupSDict);
MemberGroup *mg;
for (;(mg=mgli.current());++mgli)
{
mg->findSectionsInDocumentation();
}
decDefineMembers.findSectionsInDocumentation();
decProtoMembers.findSectionsInDocumentation();
decTypedefMembers.findSectionsInDocumentation();
decEnumMembers.findSectionsInDocumentation();
decFuncMembers.findSectionsInDocumentation();
decVarMembers.findSectionsInDocumentation();
}
void FileDef::writeDetailedDocumentation(OutputList &ol)
{
if ((!briefDescription().isEmpty() && Config_getBool("REPEAT_BRIEF")) ||
......@@ -369,7 +387,7 @@ void FileDef::writeDocumentation(OutputList &ol)
ol.docify(nd->displayName());
ol.endBold();
}
ol.endMemberItem(FALSE);
ol.endMemberItem();
}
}
if (found) ol.endMemberList();
......
......@@ -145,6 +145,7 @@ class FileDef : public Definition
void addMembersToMemberGroup();
void distributeMemberGroupDocumentation();
void findSectionsInDocumentation();
void addListReferences();
......
......@@ -104,6 +104,23 @@ void GroupDef::distributeMemberGroupDocumentation()
}
}
void GroupDef::findSectionsInDocumentation()
{
docFindSections(documentation(),0,this,0);
MemberGroupSDict::Iterator mgli(*memberGroupSDict);
MemberGroup *mg;
for (;(mg=mgli.current());++mgli)
{
mg->findSectionsInDocumentation();
}
decDefineMembers.findSectionsInDocumentation();
decProtoMembers.findSectionsInDocumentation();
decTypedefMembers.findSectionsInDocumentation();
decEnumMembers.findSectionsInDocumentation();
decFuncMembers.findSectionsInDocumentation();
decVarMembers.findSectionsInDocumentation();
}
void GroupDef::addFile(const FileDef *def)
{
if (Config_getBool("SORT_MEMBER_DOCS"))
......@@ -435,7 +452,7 @@ void GroupDef::writeDocumentation(OutputList &ol)
{
Doxygen::tagFile << " <file>" << convertToXML(fd->name()) << "</file>" << endl;
}
ol.endMemberItem(FALSE);
ol.endMemberItem();
if (!fd->briefDescription().isEmpty() && Config_getBool("BRIEF_MEMBER_DESC"))
{
ol.startMemberDescription();
......@@ -466,7 +483,7 @@ void GroupDef::writeDocumentation(OutputList &ol)
{
Doxygen::tagFile << " <namespace>" << convertToXML(nd->name()) << "</namespace>" << endl;
}
ol.endMemberItem(FALSE);
ol.endMemberItem();
if (!nd->briefDescription().isEmpty() && Config_getBool("BRIEF_MEMBER_DESC"))
{
ol.startMemberDescription();
......@@ -496,7 +513,7 @@ void GroupDef::writeDocumentation(OutputList &ol)
{
Doxygen::tagFile << " <subgroup>" << convertToXML(gd->name()) << "</subgroup>" << endl;
}
ol.endMemberItem(FALSE);
ol.endMemberItem();
if (!gd->briefDescription().isEmpty() && Config_getBool("BRIEF_MEMBER_DESC"))
{
ol.startMemberDescription();
......
......@@ -74,6 +74,7 @@ class GroupDef : public Definition
void addMembersToMemberGroup();
void distributeMemberGroupDocumentation();
void findSectionsInDocumentation();
void addListReferences();
......
......@@ -110,7 +110,9 @@ void HtmlDocVisitor::visit(DocSymbol *s)
void HtmlDocVisitor::visit(DocURL *u)
{
if (m_hide) return;
m_t << "<a href=\"" << u->url() << "\">";
m_t << "<a href=\"";
if (u->isEmail()) m_t << "mailto:";
m_t << u->url() << "\">";
filter(u->url());
m_t << "</a>";
}
......@@ -156,7 +158,7 @@ void HtmlDocVisitor::visit(DocStyleChange *s)
case DocStyleChange::Preformatted:
if (s->enable())
{
m_t << "<pre" << htmlAttribsToString(s->attribs()) << ">\n";
m_t << "<pre" << htmlAttribsToString(s->attribs()) << ">";
m_insidePre=TRUE;
}
else
......
......@@ -766,7 +766,7 @@ void HtmlGenerator::startMemberItem(int annoType)
}
}
void HtmlGenerator::endMemberItem(bool)
void HtmlGenerator::endMemberItem()
{
//DBG_HTML(t << "<!-- endMemberItem(" << (int)inGroup << "," << fileName << "," << headerName << " -->" << endl)
if (Config_getBool("HTML_ALIGN_MEMBERS"))
......
......@@ -94,7 +94,10 @@ class HtmlGenerator : public OutputGenerator
void endMemberSubtitle();
void startMemberList();
void endMemberList();
void startAnonTypeScope(int) {}
void endAnonTypeScope(int) {}
void startMemberItem(int);
void endMemberItem();
void startMemberGroupHeader(bool);
void endMemberGroupHeader();
......@@ -104,7 +107,6 @@ class HtmlGenerator : public OutputGenerator
void endMemberGroup(bool);
void insertMemberAlign();
void endMemberItem(bool);
void startMemberDescription();
void endMemberDescription();
......
......@@ -158,7 +158,9 @@ void LatexDocVisitor::visit(DocURL *u)
if (m_hide) return;
if (Config_getBool("PDF_HYPERLINKS"))
{
m_t << "\\href{" << u->url() << "}";
m_t << "\\href{";
if (u->isEmail()) m_t << "mailto:";
m_t << u->url() << "}";
}
m_t << "{\\tt ";
filter(u->url());
......
......@@ -1238,59 +1238,6 @@ void LatexGenerator::endSection(const char *lab,SectionInfo::SectionType)
t << "}\\label{" << lab << "}" << endl;
}
//void LatexGenerator::writeSectionRef(const char *ref,const char *,
// const char *lab,const char *text)
//{
// if (ref) // external reference
// {
// docify(text);
// }
// else // local reference
// {
// if (text && Config_getBool("PDF_HYPERLINKS"))
// {
// t << "\\hyperlink{";
// if (lab) t << lab;
// t << "}{";
// docify(text);
// t << "}";
// //t << " {\\rm (p.\\,\\pageref{" << lab << "})}";
// }
// else
// {
// if (strcmp(lab,text)!=0) // lab!=text
// {
// // todo: don't hardcode p. here!
// t << "{\\bf ";
// docify(text);
// t << "} {\\rm (p.\\,\\pageref{" << lab << "})}";
// }
// else
// {
// t << "\\ref{" << lab << "}";
// }
// }
// }
//}
//
//void LatexGenerator::writeSectionRefItem(const char *,const char *lab,
// const char *title)
//{
// t << "\\item \\contentsline{section}{";
// docify(title);
// t << "}{\\ref{" << lab << "}}{}" << endl;
//}
//
// TODO: remove this function
//void LatexGenerator::writeSectionRefAnchor(const char *,const char *lab,
// const char *title)
//{
// startBold();
// docify(title);
// endBold();
// t << " (p.\\,\\pageref{" << lab << "})" << endl;
//}
//void LatexGenerator::docifyStatic(QTextStream &t,const char *str)
void LatexGenerator::docify(const char *str)
......@@ -1364,38 +1311,38 @@ void LatexGenerator::endClassDiagram(ClassDiagram &d,
d.writeFigure(t,dir,fileName);
}
//void LatexGenerator::writeFormula(const char *,const char *text)
//{
// t << text;
//}
void LatexGenerator::startMemberItem(int annType)
void LatexGenerator::startAnonTypeScope(int indent)
{
if (!insideTabbing)
if (indent==0)
{
t << "\\item " << endl;
switch(annType)
{
case 0: break;
case 1:
default:
t << "\\begin{tabbing}" << endl;
t << "xx\\=xx\\=xx\\=xx\\=xx\\=xx\\=xx\\=xx\\=xx\\=\\kill" << endl;
//printf("LatexGenerator::startMemberItem() insideTabbing=TRUE\n");
insideTabbing=TRUE;
break;
}
}
}
void LatexGenerator::endMemberItem(bool endItem)
void LatexGenerator::endAnonTypeScope(int indent)
{
if (insideTabbing && endItem)
if (indent==0)
{
t << endl << "\\end{tabbing}";
//printf("LatexGenerator::endMemberItem() insideTabbing=FALSE\n");
insideTabbing=FALSE;
}
}
void LatexGenerator::startMemberItem(int)
{
//printf("LatexGenerator::startMemberItem(%d)\n",annType);
if (!insideTabbing)
{
t << "\\item " << endl;
}
}
void LatexGenerator::endMemberItem()
{
if (insideTabbing)
{
t << "\\\\";
......@@ -1414,95 +1361,20 @@ void LatexGenerator::writeNonBreakableSpace(int)
void LatexGenerator::startMemberList()
{
if (!insideTabbing)
{
t << "\\begin{CompactItemize}" << endl;
}
}
void LatexGenerator::endMemberList()
{
//printf("LatexGenerator::endMemberList(%d)\n",insideTabbing);
if (!insideTabbing)
{
t << "\\end{CompactItemize}" << endl;
}
}
//void LatexGenerator::startImage(const char *name,const char *size,bool hasCaption)
//{
// if (hasCaption)
// {
// t << "\\begin{figure}[H]" << endl;
// t << "\\begin{center}" << endl;
// }
// else
// {
// t << "\\mbox{";
// }
// QCString gfxName = name;
// if (gfxName.right(4)==".eps") gfxName.left(gfxName.length()-4);
// // "\\epsfig{file=" << name;
// t << "\\includegraphics";
// if (size) t << "[" << size << "]";
// t << "{" << gfxName << "}";
// if (hasCaption)
// {
// t << "\\caption{";
// }
// else
// {
// t << "}" << endl;
// }
//}
//
//void LatexGenerator::endImage(bool hasCaption)
//{
// if (hasCaption)
// {
// t << "}" << endl;
// t << "\\end{center}" << endl;
// t << "\\end{figure}" << endl;
// }
//}
//
//void LatexGenerator::startDotFile(const char *name,bool hasCaption)
//{
// QCString baseName=name;
// int i;
// if ((i=baseName.findRev('/'))!=-1 || (i=baseName.findRev('\\'))!=-1)
// {
// baseName=baseName.right(baseName.length()-i-1);
// }
// QCString outDir = Config_getString("LATEX_OUTPUT");
// writeDotGraphFromFile(name,outDir,baseName,EPS);
// if (hasCaption)
// {
// t << "\\begin{figure}[H]" << endl;
// t << "\\begin{center}" << endl;
// }
// else
// t << "\\mbox{";
// t << "\\includegraphics";
// if( Config_getBool("USE_PDFLATEX") )
// {
// t << "{" << baseName << ".pdf}";
// }
// else
// {
// t << "{" << baseName << ".eps}";
// }
//
// if (hasCaption)
// t << "\\caption{";
// else
// t << "}" << endl;
//}
//
//void LatexGenerator::endDotFile(bool hasCaption)
//{
// if (hasCaption)
// {
// t << "}" << endl;
// t << "\\end{center}" << endl;
// t << "\\end{figure}" << endl;
// }
//}
//
void LatexGenerator::startMemberGroupHeader(bool hasHeader)
{
......@@ -1615,19 +1487,6 @@ void LatexGenerator::endParamList()
t << "\\end{Desc}" << endl;
}
//void LatexGenerator::startSectionRefList()
//{
// t << "\\footnotesize" << endl;
// t << "\\begin{multicols}{2}" << endl;
// t << "\\begin{CompactList}" << endl;
//}
//void LatexGenerator::endSectionRefList()
//{
// t << "\\end{CompactList}" << endl;
// t << "\\end{multicols}" << endl;
// t << "\\normalsize" << endl;
//}
void LatexGenerator::printDoc(DocNode *n)
{
......
......@@ -102,8 +102,10 @@ class LatexGenerator : public OutputGenerator
void endMemberSubtitle() {}
void startMemberList();
void endMemberList();
void startAnonTypeScope(int);
void endAnonTypeScope(int);
void startMemberItem(int);
void endMemberItem(bool);
void endMemberItem();
void startMemberGroupHeader(bool);
void endMemberGroupHeader();
......
......@@ -473,21 +473,32 @@ void ManGenerator::endDescItem()
firstCol=TRUE;
}
void ManGenerator::startMemberItem(int annType)
void ManGenerator::startAnonTypeScope(int indentLevel)
{
if (firstCol && !insideTabbing) t << ".in +1c\n";
t << "\n.ti -1c\n.RI \"";
firstCol=FALSE;
if (annType!=0) insideTabbing=TRUE;
if (indentLevel==0)
{
insideTabbing=TRUE;
}
}
void ManGenerator::endMemberItem(bool endItem)
void ManGenerator::endAnonTypeScope(int indentLevel)
{
if (endItem)
if (indentLevel==0)
{
insideTabbing=FALSE;
t << "\"\n.br\n.RI \"";
}
}
void ManGenerator::startMemberItem(int)
{
if (firstCol && !insideTabbing) t << ".in +1c\n";
t << "\n.ti -1c\n.RI \"";
firstCol=FALSE;
}
void ManGenerator::endMemberItem()
{
t << "\"\n.br";
}
......@@ -619,5 +630,6 @@ void ManGenerator::printDoc(DocNode *n)
ManDocVisitor *visitor = new ManDocVisitor(t,*this);
n->accept(visitor);
delete visitor;
firstCol=FALSE;
}
......@@ -100,8 +100,10 @@ class ManGenerator : public OutputGenerator
void writeListItem();
void startMemberList();
void endMemberList();
void startAnonTypeScope(int);
void endAnonTypeScope(int);
void startMemberItem(int);
void endMemberItem(bool);
void endMemberItem();
void startMemberGroupHeader(bool);
void endMemberGroupHeader();
......
......@@ -30,8 +30,14 @@
#include "membergroup.h"
#include "groupdef.h"
#include "defargs.h"
#include "docparser.h"
//#include "xml.h"
//-----------------------------------------------------------------------------
int MemberDef::s_indentLevel = 0;
//-----------------------------------------------------------------------------
static QCString addTemplateNames(const QCString &s,const QCString &n,const QCString &t)
......@@ -307,7 +313,7 @@ MemberDef::MemberDef(const char *df,int dl,
annUsed=FALSE;
annShown=FALSE;
annEnumType=0;
indDepth=0;
//indDepth=0;
section=0;
bodyMemb=0;
explExt=FALSE;
......@@ -560,9 +566,11 @@ bool MemberDef::isBriefSectionVisible() const
// 0,"", //grpId,grpId==-1?"<none>":Doxygen::memberDocDict[grpId]->data(),
// "", //getFileDef()->name().data(),
// argsString());
QCString *pMemGrp = Doxygen::memberDocDict[grpId];
bool hasDocs = hasDocumentation() ||
// part of a documented member group
(grpId!=-1 && !Doxygen::memberDocDict[grpId]->isEmpty());
(grpId!=-1 && pMemGrp && !pMemGrp->isEmpty());
// only include static members with file/namespace scope if
// explicitly enabled in the config file
......@@ -636,6 +644,7 @@ bool MemberDef::isBriefSectionVisible() const
return visible;
}
void MemberDef::writeDeclaration(OutputList &ol,
ClassDef *cd,NamespaceDef *nd,FileDef *fd,GroupDef *gd,
bool inGroup
......@@ -705,6 +714,7 @@ void MemberDef::writeDeclaration(OutputList &ol,
ClassDef *annoClassDef=getClassDefOfAnonymousType();
// start a new member declaration
///printf("startMemberItem for %s\n",name().data());
ol.startMemberItem((annoClassDef || annMemb || annEnumType) ? 1 : 0);
// If there is no detailed description we need to write the anchor here.
......@@ -728,11 +738,10 @@ void MemberDef::writeDeclaration(OutputList &ol,
ol.popGeneratorState();
}
//printf("member name=%s indDepth=%d\n",name().data(),indDepth);
if (annoClassDef || annMemb)
{
int j;
for (j=0;j<indDepth;j++)
for (j=0;j<s_indentLevel;j++)
{
ol.writeNonBreakableSpace(3);
}
......@@ -752,6 +761,7 @@ void MemberDef::writeDeclaration(OutputList &ol,
if (ltype.left(7)=="friend ") ltype=ltype.right(ltype.length()-7);
static QRegExp r("@[0-9]+");
bool endAnonScopeNeeded=FALSE;
int l,i=r.match(ltype,0,&l);
if (i!=-1) // member has an anonymous type
{
......@@ -761,10 +771,13 @@ void MemberDef::writeDeclaration(OutputList &ol,
if (annoClassDef) // type is an anonymous compound
{
int ir=i+l;
//printf("<<<<<<<<<<<<<<\n");
ol.startAnonTypeScope(s_indentLevel++);
annoClassDef->writeDeclaration(ol,annMemb,inGroup);
//printf(">>>>>>>>>>>>>> startMemberItem(2)\n");
ol.startMemberItem(2);
int j;
for (j=0;j<indDepth;j++)
for (j=0;j< s_indentLevel-1;j++)
{
ol.writeNonBreakableSpace(3);
}
......@@ -775,6 +788,7 @@ void MemberDef::writeDeclaration(OutputList &ol,
{
ol.docify(";");
}
endAnonScopeNeeded=TRUE;
}
else
{
......@@ -900,9 +914,11 @@ void MemberDef::writeDeclaration(OutputList &ol,
ol.endDoxyAnchor(cfname,anchor());
}
ol.endMemberItem((annoClassDef!=0 && indDepth==0) || annEnumType);
//printf("endMember %s annoClassDef=%p annEnumType=%p\n",
// name().data(),annoClassDef,annEnumType);
ol.endMemberItem();
if (endAnonScopeNeeded) ol.endAnonTypeScope(--s_indentLevel);
//ol.endMemberItem(gId!=-1,gFile,gHeader,annoClassDef || annMemb);
// write brief description
if (!briefDescription().isEmpty() &&
Config_getBool("BRIEF_MEMBER_DESC") &&
......@@ -1944,8 +1960,15 @@ void MemberDef::setArgumentList(ArgumentList *al)
if (defArgList) delete defArgList;
defArgList = al;
}
void MemberDef::setDeclArgumentList(ArgumentList *al)
{
if (declArgList) delete declArgList;
declArgList = al;
}
void MemberDef::findSectionsInDocumentation()
{
docFindSections(documentation(),0,this,0);
}
......@@ -21,6 +21,7 @@
#include "qtbc.h"
#include <qlist.h>
#include <qdict.h>
#include <qstack.h>
#include "entry.h"
#include "definition.h"
......@@ -221,8 +222,8 @@ class MemberDef : public Definition
void setFromAnonymousMember(MemberDef *m) { annMemb=m; }
bool fromAnonymousScope() const { return annScope; }
bool anonymousDeclShown() const { return annUsed; }
void setIndentDepth( int i) { indDepth=i; }
int indentDepth() { return indDepth; }
//void setIndentDepth( int i) { indDepth=i; }
//int indentDepth() { return indDepth; }
bool visibleMemberGroup(bool hideNoHeader);
MemberDef *templateMaster() const { return m_templateMaster; }
......@@ -251,6 +252,7 @@ class MemberDef : public Definition
void writeEnumDeclaration(OutputList &typeDecl,
ClassDef *cd,NamespaceDef *nd,FileDef *fd,GroupDef *gd);
void findSectionsInDocumentation();
bool visited;
......@@ -290,7 +292,7 @@ class MemberDef : public Definition
bool annScope; // member is part of an annoymous scope
bool annUsed;
bool annShown;
int indDepth; // indentation depth for this member if inside an annonymous scope
//int indDepth; // indentation depth for this member if inside an annonymous scope
int maxInitLines; // when the initializer will be displayed
int userInitLines; // result of explicit \hideinitializer or \showinitializer
MemberList *section; // declation list containing this member
......@@ -323,6 +325,7 @@ class MemberDef : public Definition
// disable copying of member defs
MemberDef(const MemberDef &);
MemberDef &operator=(const MemberDef &);
static int s_indentLevel;
};
#endif
......@@ -27,6 +27,7 @@
#include "scanner.h"
#include "groupdef.h"
#include "doxygen.h"
#include "docparser.h"
//static QCString idToName(int id)
//{
......@@ -35,7 +36,8 @@
// return result;
//}
MemberGroup::MemberGroup(int id,const char *hdr,const char *d) /* : Definition(idToName(id)) */
MemberGroup::MemberGroup(Definition *parent,
int id,const char *hdr,const char *d) /* : Definition(idToName(id)) */
{
//printf("New member group id=%d header=%s desc=%s\n",id,hdr,d);
memberList = new MemberList;
......@@ -46,6 +48,7 @@ MemberGroup::MemberGroup(int id,const char *hdr,const char *d) /* : Definition(i
inSameSection = TRUE;
inDeclSection = 0;
m_numDecMembers = -1;
m_parent = parent;
//printf("Member group docs=`%s'\n",doc.data());
}
......@@ -210,3 +213,10 @@ void MemberGroup::addListReferences(Definition *def)
{
memberList->addListReferences(def);
}
void MemberGroup::findSectionsInDocumentation()
{
docFindSections(doc,0,0,this);
memberList->findSectionsInDocumentation();
}
......@@ -36,7 +36,7 @@ class Definition;
class MemberGroup
{
public:
MemberGroup(int id,const char *header,const char *docs);
MemberGroup(Definition *parent,int id,const char *header,const char *docs);
~MemberGroup();
QCString header() const { return grpHeader; }
int groupId() const { return grpId; }
......@@ -54,6 +54,7 @@ class MemberGroup
void addToDeclarationSection();
int countDecMembers(/*bool sectionPerType*/);
void distributeMemberGroupDocumentation();
void findSectionsInDocumentation();
int varCount() const;
int funcCount() const;
int enumCount() const;
......@@ -67,6 +68,7 @@ class MemberGroup
void setInGroup(bool b);
void addListReferences(Definition *d);
MemberList *members() const { return memberList; }
Definition *parent() const { return m_parent; }
private:
MemberList *memberList; // list of all members in the group
......@@ -78,6 +80,7 @@ class MemberGroup
MemberList *inDeclSection;
bool inSameSection;
int m_numDecMembers;
Definition *m_parent;
};
class MemberGroupList : public QList<MemberGroup>
......
......@@ -344,7 +344,7 @@ void MemberList::writePlainDeclarations(OutputList &ol,
ol.insertMemberAlign();
//ol+=typeDecl; // append the enum values.
md->writeEnumDeclaration(ol,cd,nd,fd,gd);
ol.endMemberItem(FALSE);
ol.endMemberItem();
if (!md->briefDescription().isEmpty() && Config_getBool("BRIEF_MEMBER_DESC"))
{
ol.startMemberDescription();
......@@ -537,6 +537,25 @@ void MemberList::addListReferences(Definition *def)
}
}
void MemberList::findSectionsInDocumentation()
{
MemberListIterator mli(*this);
MemberDef *md;
for ( ; (md=mli.current()) ; ++mli)
{
md->findSectionsInDocumentation();
}
if (memberGroupList)
{
MemberGroupListIterator mgli(*memberGroupList);
MemberGroup *mg;
for (;(mg=mgli.current());++mgli)
{
mg->findSectionsInDocumentation();
}
}
}
//--------------------------------------------------------------------------
int MemberSDict::compareItems(GCI item1, GCI item2)
......
......@@ -57,6 +57,7 @@ class MemberList : public QList<MemberDef>
void addMemberGroup(MemberGroup *mg);
void setInGroup(bool group) { m_inGroup=group; }
void addListReferences(Definition *def);
void findSectionsInDocumentation();
private:
int m_varCnt,m_funcCnt,m_enumCnt,m_enumValCnt,m_typeCnt;
......
......@@ -25,6 +25,7 @@
#include "memberlist.h"
#include "doxygen.h"
#include "message.h"
#include "docparser.h"
NamespaceDef::NamespaceDef(const char *df,int dl,
const char *name,const char *lref) :
......@@ -61,6 +62,24 @@ void NamespaceDef::distributeMemberGroupDocumentation()
mg->distributeMemberGroupDocumentation();
}
}
void NamespaceDef::findSectionsInDocumentation()
{
docFindSections(documentation(),0,this,0);
MemberGroupSDict::Iterator mgli(*memberGroupSDict);
MemberGroup *mg;
for (;(mg=mgli.current());++mgli)
{
mg->findSectionsInDocumentation();
}
decDefineMembers.findSectionsInDocumentation();
decProtoMembers.findSectionsInDocumentation();
decTypedefMembers.findSectionsInDocumentation();
decEnumMembers.findSectionsInDocumentation();
decFuncMembers.findSectionsInDocumentation();
decVarMembers.findSectionsInDocumentation();
}
void NamespaceDef::insertUsedFile(const char *f)
{
if (files.find(f)==-1)
......
......@@ -72,6 +72,7 @@ class NamespaceDef : public Definition
}
void addMembersToMemberGroup();
void distributeMemberGroupDocumentation();
void findSectionsInDocumentation();
virtual Definition *findInnerCompound(const char *name);
void addInnerCompound(Definition *d);
......
......@@ -302,8 +302,10 @@ class OutputGenerator : public BaseOutputDocInterface
virtual void endMemberSubtitle() = 0;
virtual void startMemberList() = 0;
virtual void endMemberList() = 0;
virtual void startAnonTypeScope(int) = 0;
virtual void endAnonTypeScope(int) = 0;
virtual void startMemberItem(int) = 0;
virtual void endMemberItem(bool) = 0;
virtual void endMemberItem() = 0;
virtual void startMemberGroupHeader(bool) = 0;
virtual void endMemberGroupHeader() = 0;
virtual void startMemberGroupDocs() = 0;
......
......@@ -161,10 +161,14 @@ class OutputList : public OutputDocInterface
{ forall(&OutputGenerator::startMemberList); }
void endMemberList()
{ forall(&OutputGenerator::endMemberList); }
void startAnonTypeScope(int i1)
{ forall(&OutputGenerator::startAnonTypeScope,i1); }
void endAnonTypeScope(int i1)
{ forall(&OutputGenerator::endAnonTypeScope,i1); }
void startMemberItem(int i1)
{ forall(&OutputGenerator::startMemberItem,i1); }
void endMemberItem(bool b2)
{ forall(&OutputGenerator::endMemberItem,b2); }
void endMemberItem()
{ forall(&OutputGenerator::endMemberItem); }
void startMemberGroupHeader(bool b)
{ forall(&OutputGenerator::startMemberGroupHeader,b); }
void endMemberGroupHeader()
......
......@@ -17,8 +17,10 @@
#include "sortdict.h"
#include "config.h"
#include "docparser.h"
#include "section.h"
#include "doxygen.h"
class PageInfo
{
......@@ -76,6 +78,10 @@ class PageInfo
}
}
}
void findSectionsInDocumentation()
{
docFindSections(doc,this,0,0);
}
void writeDocAnchorsToTagFile()
{
......
......@@ -202,6 +202,7 @@ void RTFDocVisitor::visit(DocURL *u)
m_t << "{\\field "
"{\\*\\fldinst "
"{ HYPERLINK \\\\l \"";
if (u->isEmail()) m_t << "mailto:";
m_t << u->url();
m_t << "\" }"
"{}";
......
......@@ -1722,7 +1722,7 @@ void RTFGenerator::startMemberItem(int)
t << rtf_Style_Reset << rtf_BList_DepthStyle() << endl; // set style to apropriate depth
}
void RTFGenerator::endMemberItem(bool)
void RTFGenerator::endMemberItem()
{
DBG_RTF(t <<"{\\comment endMemberItem }" << endl)
newParagraph();
......
......@@ -103,8 +103,10 @@ class RTFGenerator : public OutputGenerator
void endMemberSubtitle();
void startMemberList();
void endMemberList();
void startAnonTypeScope(int) {}
void endAnonTypeScope(int) {}
void startMemberItem(int);
void endMemberItem(bool);
void endMemberItem();
//void memberGroupSpacing(bool) {}
//void memberGroupSeparator() {}
void insertMemberAlign() {}
......
This diff is collapsed.
......@@ -29,9 +29,15 @@ class PageInfo;
struct SectionInfo
{
enum SectionType { Page, Section, Subsection, Subsubsection, Paragraph, Anchor };
SectionInfo(const char *l,const char *t,SectionType st,const char *r=0)
{ label=l; title=t; type=st; ref=r; definition=0; pageRef=0; generated=FALSE; }
enum SectionType { Page, Section, Subsection,
Subsubsection, Paragraph, Anchor
};
SectionInfo(const char *f,const char *l,const char *t,
SectionType st,const char *r=0)
{ label=l; title=t; type=st; ref=r;
definition=0; pageRef=0; generated=FALSE;
fileName=f;
}
~SectionInfo() {}
QCString label;
QCString title;
......
......@@ -857,27 +857,9 @@ void TagFileParser::addDocAnchors(Entry *e,QStrList &l)
while (s)
{
QCString *anchorName = new QCString(s);
//if (anchorName->left(5)=="_todo")
//{
// int todoItemId = todoList.addRefItem();
// char anchorLabel[12];
// sprintf(anchorLabel,"_todo%06d",todoItemId);
// RefItem *item = todoList.getRefItem(todoItemId);
// item->listAnchor = anchorLabel;
//}
//else if (anchorName->left(5)=="_test")
//{
// int testItemId = testList.addRefItem();
// char anchorLabel[12];
// sprintf(anchorLabel,"_test%06d",testItemId);
// RefItem *item = testList.getRefItem(testItemId);
// item->listAnchor = anchorLabel;
//}
//else
//{
if (Doxygen::sectionDict.find(*anchorName)==0)
{
SectionInfo *si=new SectionInfo(*anchorName,*anchorName,
SectionInfo *si=new SectionInfo(e->fileName,*anchorName,*anchorName,
SectionInfo::Anchor,m_tagName);
Doxygen::sectionDict.insert(*anchorName,si);
e->anchors->append(anchorName);
......@@ -886,7 +868,6 @@ void TagFileParser::addDocAnchors(Entry *e,QStrList &l)
{
err("Duplicate anchor %s found\n",anchorName->data());
}
//}
s=l.next();
}
}
......
This diff is collapsed.
......@@ -657,9 +657,10 @@ QCString removeRedundantWhiteSpace(const QCString &s)
result+=", ";
}
else if (i>0 &&
(isId(s.at(i)) && s.at(i-1)==')') ||
((isId(s.at(i)) && s.at(i-1)==')') ||
(s.at(i)=='\'' && s.at(i-1)==' ')
)
)
{
result+=' ';
result+=s.at(i);
......@@ -670,7 +671,7 @@ QCString removeRedundantWhiteSpace(const QCString &s)
csp=0;
}
else if (!isspace(c) ||
( i!=0 && i!=l-1 &&
( i>0 && i<l-1 &&
(isId(s.at(i-1)) || s.at(i-1)==')' || s.at(i-1)==',' || s.at(i-1)=='>' || s.at(i-1)==']') &&
isId(s.at(i+1))
)
......@@ -3157,7 +3158,7 @@ void addMembersToMemberGroup(MemberList *ml,
MemberGroup *mg = memberGroupSDict->find(groupId);
if (mg==0)
{
mg = new MemberGroup(groupId,*pGrpHeader,pDocs ? pDocs->data() : 0);
mg = new MemberGroup(context,groupId,*pGrpHeader,pDocs ? pDocs->data() : 0);
memberGroupSDict->append(groupId,mg);
}
mg->insertMember(context,fmd); // insert in member group
......@@ -3178,7 +3179,7 @@ void addMembersToMemberGroup(MemberList *ml,
MemberGroup *mg = memberGroupSDict->find(groupId);
if (mg==0)
{
mg = new MemberGroup(groupId,*pGrpHeader,pDocs ? pDocs->data() : 0);
mg = new MemberGroup(context,groupId,*pGrpHeader,pDocs ? pDocs->data() : 0);
memberGroupSDict->append(groupId,mg);
}
md = ml->take(index); // remove from member list
......@@ -3551,20 +3552,21 @@ PageInfo *addRelatedPage(const char *name,const QCString &ptitle,
//outputList->writeTitle(pi->name,pi->title);
// a page name is a label as well!
SectionInfo *si=new SectionInfo(
pi->name,pi->title,SectionInfo::Page,pi->reference);
QCString file;
if (gd)
{
si->fileName=gd->getOutputFileBase();
file=gd->getOutputFileBase();
}
else if (pi->getGroupDef())
{
si->fileName=pi->getGroupDef()->getOutputFileBase().copy();
file=pi->getGroupDef()->getOutputFileBase().copy();
}
else
{
si->fileName=pageName;
file=pageName;
}
SectionInfo *si=new SectionInfo(
file,pi->name,pi->title,SectionInfo::Page,pi->reference);
//printf("si->label=`%s' si->definition=%s si->fileName=`%s'\n",
// si->label.data(),si->definition?si->definition->name().data():"<none>",
// si->fileName.data());
......
......@@ -95,7 +95,9 @@ void XmlDocVisitor::visit(DocSymbol *s)
void XmlDocVisitor::visit(DocURL *u)
{
if (m_hide) return;
m_t << "<ulink url=\"" << u->url() << "\">";
m_t << "<ulink url=\"";
if (u->isEmail()) m_t << "mailto:";
m_t << u->url() << "\">";
filter(u->url());
m_t << "</ulink>";
}
......
......@@ -34,6 +34,7 @@
#include "version.h"
#include "xmldocvisitor.h"
#include "docparser.h"
#include "language.h"
#include <qdir.h>
#include <qfile.h>
......@@ -56,7 +57,8 @@ static void writeXMLHeader(QTextStream &t)
{
QCString dtdName = Config_getString("XML_DTD");
QCString schemaName = Config_getString("XML_SCHEMA");
t << "<?xml version='1.0' encoding='ISO-8859-1' standalone='";
t << "<?xml version='1.0' encoding='" << theTranslator->idLanguageCharset()
<< "' standalone='";
if (dtdName.isEmpty() && schemaName.isEmpty()) t << "yes"; else t << "no";
t << "'?>" << endl;
if (!dtdName.isEmpty())
......@@ -789,6 +791,7 @@ static void generateXMLForClass(ClassDef *cd,QTextStream &ti)
return;
}
QTextStream t(&f);
t.setEncoding(QTextStream::Latin1);
writeXMLHeader(t);
t << " <compounddef id=\""
......@@ -975,6 +978,7 @@ static void generateXMLForNamespace(NamespaceDef *nd,QTextStream &ti)
return;
}
QTextStream t(&f);
t.setEncoding(QTextStream::Latin1);
writeXMLHeader(t);
t << " <compounddef id=\""
......@@ -1065,6 +1069,7 @@ static void generateXMLForFile(FileDef *fd,QTextStream &ti)
return;
}
QTextStream t(&f);
t.setEncoding(QTextStream::Latin1);
writeXMLHeader(t);
t << " <compounddef id=\""
......@@ -1198,6 +1203,7 @@ static void generateXMLForGroup(GroupDef *gd,QTextStream &ti)
}
QTextStream t(&f);
t.setEncoding(QTextStream::Latin1);
writeXMLHeader(t);
t << " <compounddef id=\""
<< gd->getOutputFileBase() << "\" kind=\"group\">" << endl;
......@@ -1312,6 +1318,7 @@ static void generateXMLForPage(PageInfo *pi,QTextStream &ti)
}
QTextStream t(&f);
t.setEncoding(QTextStream::Latin1);
writeXMLHeader(t);
t << " <compounddef id=\"" << pageName;
t << "\" kind=\"page\">" << endl;
......@@ -1393,6 +1400,7 @@ void generateXML()
return;
}
QTextStream t(&f);
t.setEncoding(QTextStream::Latin1);
writeXMLHeader(t);
ClassSDict::Iterator cli(Doxygen::classSDict);
ClassDef *cd;
......
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