Commit 04dd14e8 authored by Dimitri van Heesch's avatar Dimitri van Heesch

Release-1.3-rc2-20021224

parent 1a8ff6f0
DOXYGEN Version 1.3-rc2 DOXYGEN Version 1.3-rc2-20021224
Please read the installation section of the manual Please read the installation section of the manual
(http://www.doxygen.org/install.html) for instructions. (http://www.doxygen.org/install.html) for instructions.
-------- --------
Dimitri van Heesch (16 December 2002) Dimitri van Heesch (24 December 2002)
DOXYGEN Version 1.3_rc2 DOXYGEN Version 1.3_rc2_20021224
Please read INSTALL for compilation instructions. Please read INSTALL for compilation instructions.
...@@ -17,4 +17,4 @@ to subscribe to the lists or to visit the archives. ...@@ -17,4 +17,4 @@ to subscribe to the lists or to visit the archives.
Enjoy, Enjoy,
Dimitri van Heesch (dimitri@stack.nl) (16 December 2002) Dimitri van Heesch (dimitri@stack.nl) (24 December 2002)
1.3-rc2 1.3-rc2-20021224
...@@ -62,7 +62,8 @@ PREDEFINED = MY_MACRO()= ...@@ -62,7 +62,8 @@ PREDEFINED = MY_MACRO()=
manual for more information. manual for more information.
</ol> </ol>
<li><b>When I set EXTRACT_ALL to NO none of my functions are shown in the documentation.</b></li> <li><b>When I set EXTRACT_ALL to NO none of my functions are shown in the
documentation.</b></li>
In order for global functions, variables, enums, typedefs, and defines In order for global functions, variables, enums, typedefs, and defines
to be documented you should document the file in which these commands are to be documented you should document the file in which these commands are
...@@ -73,6 +74,9 @@ Alternatively, you can put all members in a group (or module) ...@@ -73,6 +74,9 @@ Alternatively, you can put all members in a group (or module)
using the \\ingroup command and then document the group using a comment using the \\ingroup command and then document the group using a comment
block containing the \\defgroup command. block containing the \\defgroup command.
For member functions or functions that are part of a namespace you should
document either the class or namespace.
<li><b>How can I make doxygen ignore some code fragment?</b> <li><b>How can I make doxygen ignore some code fragment?</b>
<p> <p>
You can use Doxygen's preprocessor for this: You can use Doxygen's preprocessor for this:
......
...@@ -181,8 +181,9 @@ Thanks go to: ...@@ -181,8 +181,9 @@ Thanks go to:
All language maintainers for providing translations into many languages. All language maintainers for providing translations into many languages.
<li>Erik Jan Lingen of <a href="http://www.habanera.nl/">Habanera</a>, Mark <li>Erik Jan Lingen of <a href="http://www.habanera.nl/">Habanera</a>, Mark
Roddy, Paul Schwartz, Charles Duffy, Vadym Voznyuk, Philip Walton, Roddy, Paul Schwartz, Charles Duffy, Vadym Voznyuk, Philip Walton,
Dwight Browne, Andreas Fredriksson, Karel Lindveld, and Ivan Lee Dwight Browne, Andreas Fredriksson, Karel Lindveld, Ivan Lee, Albert
for donating money. Vernon, Adam McKee, Vijapurapu Anatharac, Ben Hunsberger and
Walter Wartenweiler for donating money.
<li>The Comms group of <a href="http://www.symbian.com">Symbian</a> for donating <li>The Comms group of <a href="http://www.symbian.com">Symbian</a> for donating
an ultra cool <a href="http://www.psion.com/revoplus">Revo plus</a> an ultra cool <a href="http://www.psion.com/revoplus">Revo plus</a>
organizer! organizer!
......
Summary: A documentation system for C/C++. Summary: A documentation system for C/C++.
Name: doxygen Name: doxygen
Version: 1.3_rc2 Version: 1.3_rc2_20021224
Release: 1 Release: 1
Epoch: 1 Epoch: 1
Source0: ftp://ftp.stack.nl/pub/users/dimitri/%{name}-%{version}.src.tar.gz Source0: ftp://ftp.stack.nl/pub/users/dimitri/%{name}-%{version}.src.tar.gz
......
...@@ -41,7 +41,7 @@ static void replaceCommentMarker(const char *s,int len) ...@@ -41,7 +41,7 @@ static void replaceCommentMarker(const char *s,int len)
p++; p++;
} }
// replace start of comment marker by spaces // replace start of comment marker by spaces
while ((c=*p) && (c=='/' || c=='!')) while ((c=*p) && (c=='/' || c=='!' || c=='#'))
{ {
g_outBuf->addChar(' '); g_outBuf->addChar(' ');
p++; p++;
...@@ -109,6 +109,12 @@ static int yyread(char *buf,int max_size) ...@@ -109,6 +109,12 @@ static int yyread(char *buf,int max_size)
copyToOutput(yytext+i,yyleng-i); copyToOutput(yytext+i,yyleng-i);
BEGIN(SComment); BEGIN(SComment);
} }
<Scan>"//##Documentation".*\n { /* Start of Rational Rose ANSI C++ comment block */
int i=17; //=strlen("//##Documentation");
copyToOutput("/**",3);
copyToOutput(yytext+i,yyleng-i);
BEGIN(SComment);
}
<Scan>"//".*\n { /* one line C++ comment */ <Scan>"//".*\n { /* one line C++ comment */
copyToOutput(yytext,yyleng); copyToOutput(yytext,yyleng);
} }
...@@ -180,6 +186,12 @@ static int yyread(char *buf,int max_size) ...@@ -180,6 +186,12 @@ static int yyread(char *buf,int max_size)
<SComment>\n[ \t]*"//!".*/\n { <SComment>\n[ \t]*"//!".*/\n {
replaceCommentMarker(yytext,yyleng); replaceCommentMarker(yytext,yyleng);
} }
<SComment>^[ \t]*"//##".*/\n {
replaceCommentMarker(yytext,yyleng);
}
<SComment>\n[ \t]*"//##".*/\n {
replaceCommentMarker(yytext,yyleng);
}
<SComment>\n { /* end of special comment */ <SComment>\n { /* end of special comment */
copyToOutput(" */",3); copyToOutput(" */",3);
copyToOutput(yytext,yyleng); copyToOutput(yytext,yyleng);
......
...@@ -620,6 +620,28 @@ void Definition::setRefItems(const QList<ListItemInfo> *sli) ...@@ -620,6 +620,28 @@ void Definition::setRefItems(const QList<ListItemInfo> *sli)
} }
} }
void Definition::mergeRefItems(Definition *d)
{
if (d->specialListItems())
{
// deep copy the list
if (m_specialListItems==0)
{
m_specialListItems=new QList<ListItemInfo>;
m_specialListItems->setAutoDelete(TRUE);
}
QListIterator<ListItemInfo> slii(*d->specialListItems());
ListItemInfo *lii;
for (slii.toFirst();(lii=slii.current());++slii)
{
if (getSpecialListId(lii->type)==-1)
{
m_specialListItems->append(new ListItemInfo(*lii));
}
}
}
}
int Definition::getSpecialListId(const char *listName) const int Definition::getSpecialListId(const char *listName) const
{ {
if (m_specialListItems) if (m_specialListItems)
......
...@@ -113,6 +113,7 @@ class Definition ...@@ -113,6 +113,7 @@ class Definition
//int testId() const { return m_testId; } //int testId() const { return m_testId; }
//int bugId() const { return m_bugId; } //int bugId() const { return m_bugId; }
void setRefItems(const QList<ListItemInfo> *sli); void setRefItems(const QList<ListItemInfo> *sli);
void mergeRefItems(Definition *d);
int getSpecialListId(const char *listName) const; int getSpecialListId(const char *listName) const;
const QList<ListItemInfo> *specialListItems() const; const QList<ListItemInfo> *specialListItems() const;
......
...@@ -74,6 +74,7 @@ static bool g_inSeeBlock; ...@@ -74,6 +74,7 @@ static bool g_inSeeBlock;
static bool g_insideHtmlLink; static bool g_insideHtmlLink;
static QStack<DocNode> g_nodeStack; static QStack<DocNode> g_nodeStack;
static QStack<DocStyleChange> g_styleStack; static QStack<DocStyleChange> g_styleStack;
static QStack<DocStyleChange> g_initialStyleStack;
static QList<Definition> g_copyStack; static QList<Definition> g_copyStack;
static QString g_fileName; static QString g_fileName;
...@@ -84,6 +85,7 @@ struct DocParserContext ...@@ -84,6 +85,7 @@ struct DocParserContext
bool insideHtmlLink; bool insideHtmlLink;
QStack<DocNode> nodeStack; QStack<DocNode> nodeStack;
QStack<DocStyleChange> styleStack; QStack<DocStyleChange> styleStack;
QStack<DocStyleChange> initialStyleStack;
QList<Definition> copyStack; QList<Definition> copyStack;
MemberDef *memberDef; MemberDef *memberDef;
QString fileName; QString fileName;
...@@ -102,6 +104,7 @@ static void docParserPushContext() ...@@ -102,6 +104,7 @@ static void docParserPushContext()
ctx->insideHtmlLink = g_insideHtmlLink; ctx->insideHtmlLink = g_insideHtmlLink;
ctx->nodeStack = g_nodeStack; ctx->nodeStack = g_nodeStack;
ctx->styleStack = g_styleStack; ctx->styleStack = g_styleStack;
ctx->initialStyleStack = g_initialStyleStack;
ctx->copyStack = g_copyStack; ctx->copyStack = g_copyStack;
ctx->fileName = g_fileName; ctx->fileName = g_fileName;
g_parserStack.push(ctx); g_parserStack.push(ctx);
...@@ -115,6 +118,7 @@ static void docParserPopContext() ...@@ -115,6 +118,7 @@ static void docParserPopContext()
g_insideHtmlLink = ctx->insideHtmlLink; g_insideHtmlLink = ctx->insideHtmlLink;
g_nodeStack = ctx->nodeStack; g_nodeStack = ctx->nodeStack;
g_styleStack = ctx->styleStack; g_styleStack = ctx->styleStack;
g_initialStyleStack = ctx->initialStyleStack;
g_copyStack = ctx->copyStack; g_copyStack = ctx->copyStack;
g_fileName = ctx->fileName; g_fileName = ctx->fileName;
delete ctx; delete ctx;
...@@ -296,7 +300,7 @@ static void checkUndocumentedParams() ...@@ -296,7 +300,7 @@ static void checkUndocumentedParams()
"Warning: The following parameters of "+ "Warning: The following parameters of "+
scope + QString(g_memberDef->name()) + scope + QString(g_memberDef->name()) +
QString(argListToString(al)) + QString(argListToString(al)) +
" are not documented:"; " are not documented:\n";
for (ali.toFirst();(a=ali.current());++ali) for (ali.toFirst();(a=ali.current());++ali)
{ {
QString argName = g_memberDef->isDefine() ? a->type : a->name; QString argName = g_memberDef->isDefine() ? a->type : a->name;
...@@ -559,6 +563,9 @@ static int handleStyleArgument(DocNode *parent,QList<DocNode> &children, ...@@ -559,6 +563,9 @@ static int handleStyleArgument(DocNode *parent,QList<DocNode> &children,
) ? tok : RetVal_OK; ) ? tok : RetVal_OK;
} }
/*! Called when a style change starts. For instance a \<b\> command is
* encountered.
*/
static void handleStyleEnter(DocNode *parent,QList<DocNode> &children, static void handleStyleEnter(DocNode *parent,QList<DocNode> &children,
DocStyleChange::Style s,const HtmlAttribList *attribs) DocStyleChange::Style s,const HtmlAttribList *attribs)
{ {
...@@ -568,6 +575,9 @@ static void handleStyleEnter(DocNode *parent,QList<DocNode> &children, ...@@ -568,6 +575,9 @@ static void handleStyleEnter(DocNode *parent,QList<DocNode> &children,
g_styleStack.push(sc); g_styleStack.push(sc);
} }
/*! Called when a style change ends. For instance a \</b\> command is
* encountered.
*/
static void handleStyleLeave(DocNode *parent,QList<DocNode> &children, static void handleStyleLeave(DocNode *parent,QList<DocNode> &children,
DocStyleChange::Style s,const char *tagName) DocStyleChange::Style s,const char *tagName)
{ {
...@@ -577,9 +587,17 @@ static void handleStyleLeave(DocNode *parent,QList<DocNode> &children, ...@@ -577,9 +587,17 @@ static void handleStyleLeave(DocNode *parent,QList<DocNode> &children,
g_styleStack.top()->position()!=g_nodeStack.count() // wrong position g_styleStack.top()->position()!=g_nodeStack.count() // wrong position
) )
{ {
warn_doc_error(g_fileName,doctokenizerYYlineno,"Warning: found </%s> tag without matching <%s> in the same paragraph", if (g_styleStack.isEmpty())
{
warn_doc_error(g_fileName,doctokenizerYYlineno,"Warning: found </%s> tag without matching <%s>",
tagName,tagName); tagName,tagName);
} }
else
{
warn_doc_error(g_fileName,doctokenizerYYlineno,"Warning: found </%s> tag while expecting </%s>",
tagName,g_styleStack.top()->styleString());
}
}
else // end the section else // end the section
{ {
DocStyleChange *sc= new DocStyleChange(parent,g_nodeStack.count(),s,FALSE); DocStyleChange *sc= new DocStyleChange(parent,g_nodeStack.count(),s,FALSE);
...@@ -588,6 +606,10 @@ static void handleStyleLeave(DocNode *parent,QList<DocNode> &children, ...@@ -588,6 +606,10 @@ static void handleStyleLeave(DocNode *parent,QList<DocNode> &children,
} }
} }
/*! Called at the end of a paragraph to close all open style changes
* (e.g. a <b> without a </b>). The closed styles are pushed onto a stack
* and entered again at the start of a new paragraph.
*/
static void handlePendingStyleCommands(DocNode *parent,QList<DocNode> &children) static void handlePendingStyleCommands(DocNode *parent,QList<DocNode> &children)
{ {
if (!g_styleStack.isEmpty()) if (!g_styleStack.isEmpty())
...@@ -595,27 +617,53 @@ static void handlePendingStyleCommands(DocNode *parent,QList<DocNode> &children) ...@@ -595,27 +617,53 @@ static void handlePendingStyleCommands(DocNode *parent,QList<DocNode> &children)
DocStyleChange *sc = g_styleStack.top(); DocStyleChange *sc = g_styleStack.top();
while (sc && sc->position()>=g_nodeStack.count()) while (sc && sc->position()>=g_nodeStack.count())
{ // there are unclosed style modifiers in the paragraph { // there are unclosed style modifiers in the paragraph
const char *cmd="";
switch (sc->style())
{
case DocStyleChange::Bold: cmd = "b"; break;
case DocStyleChange::Italic: cmd = "em"; break;
case DocStyleChange::Code: cmd = "code"; break;
case DocStyleChange::Center: cmd = "center"; break;
case DocStyleChange::Small: cmd = "small"; break;
case DocStyleChange::Subscript: cmd = "subscript"; break;
case DocStyleChange::Superscript: cmd = "superscript"; break;
case DocStyleChange::Preformatted: cmd = "pre"; break;
}
warn_doc_error(g_fileName,doctokenizerYYlineno,"Warning: end of paragraph without end of style "
"command </%s>",cmd);
children.append(new DocStyleChange(parent,g_nodeStack.count(),sc->style(),FALSE)); children.append(new DocStyleChange(parent,g_nodeStack.count(),sc->style(),FALSE));
g_initialStyleStack.push(sc);
g_styleStack.pop(); g_styleStack.pop();
sc = g_styleStack.top(); sc = g_styleStack.top();
} }
} }
} }
static void handleInitialStyleCommands(DocPara *parent,QList<DocNode> &children)
{
DocStyleChange *sc;
while ((sc=g_initialStyleStack.pop()))
{
handleStyleEnter(parent,children,sc->style(),&sc->attribs());
}
}
const char *DocStyleChange::styleString() const
{
switch (m_style)
{
case DocStyleChange::Bold: return "b";
case DocStyleChange::Italic: return "em";
case DocStyleChange::Code: return "code";
case DocStyleChange::Center: return "center";
case DocStyleChange::Small: return "small";
case DocStyleChange::Subscript: return "subscript";
case DocStyleChange::Superscript: return "superscript";
case DocStyleChange::Preformatted: return "pre";
}
return "<invalid>";
}
static void handleUnclosedStyleCommands()
{
if (!g_initialStyleStack.isEmpty())
{
DocStyleChange *sc = g_initialStyleStack.top();
g_initialStyleStack.pop();
handleUnclosedStyleCommands();
warn_doc_error(g_fileName,doctokenizerYYlineno,
"Warning: end of comment block while expecting "
"command </%s>",sc->styleString());
}
}
static void handleLinkedWord(DocNode *parent,QList<DocNode> &children) static void handleLinkedWord(DocNode *parent,QList<DocNode> &children)
{ {
Definition *compound=0; Definition *compound=0;
...@@ -828,13 +876,13 @@ static bool defaultHandleToken(DocNode *parent,int tok, QList<DocNode> &children ...@@ -828,13 +876,13 @@ static bool defaultHandleToken(DocNode *parent,int tok, QList<DocNode> &children
{ {
handleStyleEnter(parent,children,DocStyleChange::Preformatted,&g_token->attribs); handleStyleEnter(parent,children,DocStyleChange::Preformatted,&g_token->attribs);
parent->setInsidePreformatted(TRUE); parent->setInsidePreformatted(TRUE);
doctokenizerYYsetInsidePre(TRUE); //doctokenizerYYsetInsidePre(TRUE);
} }
else else
{ {
handleStyleLeave(parent,children,DocStyleChange::Preformatted,tokenName); handleStyleLeave(parent,children,DocStyleChange::Preformatted,tokenName);
parent->setInsidePreformatted(FALSE); parent->setInsidePreformatted(FALSE);
doctokenizerYYsetInsidePre(FALSE); //doctokenizerYYsetInsidePre(FALSE);
} }
break; break;
case HTML_CODE: case HTML_CODE:
...@@ -2394,8 +2442,78 @@ int DocHtmlDescTitle::parse() ...@@ -2394,8 +2442,78 @@ int DocHtmlDescTitle::parse()
switch (tok) switch (tok)
{ {
case TK_COMMAND: case TK_COMMAND:
{
QString cmdName=g_token->name;
bool isJavaLink=FALSE;
switch (CmdMapper::map(cmdName))
{
case CMD_REF:
{
int tok=doctokenizerYYlex();
if (tok!=TK_WHITESPACE)
{
warn_doc_error(g_fileName,doctokenizerYYlineno,"Warning: expected whitespace after %s command",
g_token->name.data());
}
else
{
doctokenizerYYsetStateRef();
tok=doctokenizerYYlex(); // get the reference id
if (tok!=TK_WORD)
{
warn_doc_error(g_fileName,doctokenizerYYlineno,"Warning: unexpected token %s as the argument of %s",
tokToString(tok),cmdName.data());
}
else
{
DocRef *ref = new DocRef(this,g_token->name);
m_children.append(ref);
ref->parse();
}
doctokenizerYYsetStatePara();
}
}
break;
case CMD_JAVALINK:
isJavaLink=TRUE;
// fall through
case CMD_LINK:
{
int tok=doctokenizerYYlex();
if (tok!=TK_WHITESPACE)
{
warn_doc_error(g_fileName,doctokenizerYYlineno,"Warning: expected whitespace after %s command",
cmdName.data());
}
else
{
doctokenizerYYsetStateLink();
tok=doctokenizerYYlex();
if (tok!=TK_WORD)
{
warn_doc_error(g_fileName,doctokenizerYYlineno,"Warning: unexpected token %s as the argument of %s",
tokToString(tok),cmdName.data());
}
else
{
doctokenizerYYsetStatePara();
DocLink *lnk = new DocLink(this,g_token->name);
m_children.append(lnk);
QString leftOver = lnk->parse(isJavaLink);
if (!leftOver.isEmpty())
{
m_children.append(new DocWord(this,leftOver));
}
}
}
}
break;
default:
warn_doc_error(g_fileName,doctokenizerYYlineno,"Warning: Illegal command %s as part of a <dt> tag", warn_doc_error(g_fileName,doctokenizerYYlineno,"Warning: Illegal command %s as part of a <dt> tag",
g_token->name.data()); g_token->name.data());
}
}
break; break;
case TK_SYMBOL: case TK_SYMBOL:
warn_doc_error(g_fileName,doctokenizerYYlineno,"Warning: Unsupported symbol %s found", warn_doc_error(g_fileName,doctokenizerYYlineno,"Warning: Unsupported symbol %s found",
...@@ -2413,6 +2531,17 @@ int DocHtmlDescTitle::parse() ...@@ -2413,6 +2531,17 @@ int DocHtmlDescTitle::parse()
{ {
// ignore </dt> tag. // ignore </dt> tag.
} }
else if (tagId==HTML_DT)
{
// missing <dt> tag.
retval = RetVal_DescTitle;
goto endtitle;
}
else if (tagId==HTML_DL && g_token->endTag)
{
retval=RetVal_EndDesc;
goto endtitle;
}
else else
{ {
warn_doc_error(g_fileName,doctokenizerYYlineno,"Warning: Unexpected html tag <%s%s> found within <dt> context", warn_doc_error(g_fileName,doctokenizerYYlineno,"Warning: Unexpected html tag <%s%s> found within <dt> context",
...@@ -2518,7 +2647,7 @@ int DocHtmlDescList::parse() ...@@ -2518,7 +2647,7 @@ int DocHtmlDescList::parse()
{ {
retval=dd->parse(); retval=dd->parse();
} }
else else if (retval!=RetVal_DescTitle)
{ {
// error // error
break; break;
...@@ -3630,7 +3759,7 @@ int DocPara::handleHtmlStartTag(const QString &tagName,const HtmlAttribList &tag ...@@ -3630,7 +3759,7 @@ int DocPara::handleHtmlStartTag(const QString &tagName,const HtmlAttribList &tag
case HTML_PRE: case HTML_PRE:
handleStyleEnter(this,m_children,DocStyleChange::Preformatted,&g_token->attribs); handleStyleEnter(this,m_children,DocStyleChange::Preformatted,&g_token->attribs);
setInsidePreformatted(TRUE); setInsidePreformatted(TRUE);
doctokenizerYYsetInsidePre(TRUE); //doctokenizerYYsetInsidePre(TRUE);
break; break;
case HTML_P: case HTML_P:
retval=TK_NEWPARA; retval=TK_NEWPARA;
...@@ -3759,13 +3888,20 @@ int DocPara::handleHtmlStartTag(const QString &tagName,const HtmlAttribList &tag ...@@ -3759,13 +3888,20 @@ int DocPara::handleHtmlStartTag(const QString &tagName,const HtmlAttribList &tag
{ {
HtmlAttribListIterator li(tagHtmlAttribs); HtmlAttribListIterator li(tagHtmlAttribs);
HtmlAttrib *opt; HtmlAttrib *opt;
bool found=FALSE;
for (li.toFirst();(opt=li.current());++li) for (li.toFirst();(opt=li.current());++li)
{ {
//printf("option name=%s value=%s\n",opt->name.data(),opt->value.data());
if (opt->name=="src" && !opt->value.isEmpty()) if (opt->name=="src" && !opt->value.isEmpty())
{ {
DocImage *img = new DocImage(this,opt->value,DocImage::Html); DocImage *img = new DocImage(this,opt->value,DocImage::Html);
m_children.append(img); m_children.append(img);
found = TRUE;
}
} }
if (!found)
{
warn_doc_error(g_fileName,doctokenizerYYlineno,"Warning: IMG tag does not have a SRC attribute!\n");
} }
} }
break; break;
...@@ -3849,9 +3985,9 @@ int DocPara::handleHtmlEndTag(const QString &tagName) ...@@ -3849,9 +3985,9 @@ int DocPara::handleHtmlEndTag(const QString &tagName)
handleStyleLeave(this,m_children,DocStyleChange::Small,"small"); handleStyleLeave(this,m_children,DocStyleChange::Small,"small");
break; break;
case HTML_PRE: case HTML_PRE:
handleStyleLeave(this,m_children,DocStyleChange::Preformatted,"preformatted"); handleStyleLeave(this,m_children,DocStyleChange::Preformatted,"pre");
setInsidePreformatted(FALSE); setInsidePreformatted(FALSE);
doctokenizerYYsetInsidePre(FALSE); //doctokenizerYYsetInsidePre(FALSE);
break; break;
case HTML_P: case HTML_P:
// ignore </p> tag // ignore </p> tag
...@@ -3918,6 +4054,7 @@ int DocPara::parse() ...@@ -3918,6 +4054,7 @@ int DocPara::parse()
{ {
DBG(("DocPara::parse() start\n")); DBG(("DocPara::parse() start\n"));
g_nodeStack.push(this); g_nodeStack.push(this);
handleInitialStyleCommands(this,m_children);
int tok; int tok;
int retval=0; int retval=0;
while ((tok=doctokenizerYYlex())) // get the next token while ((tok=doctokenizerYYlex())) // get the next token
...@@ -4369,6 +4506,8 @@ void DocText::parse() ...@@ -4369,6 +4506,8 @@ void DocText::parse()
} }
} }
handleUnclosedStyleCommands();
DocNode *n = g_nodeStack.pop(); DocNode *n = g_nodeStack.pop();
ASSERT(n==this); ASSERT(n==this);
} }
...@@ -4423,6 +4562,8 @@ void DocRoot::parse() ...@@ -4423,6 +4562,8 @@ void DocRoot::parse()
retval = in->parse(); retval = in->parse();
} }
handleUnclosedStyleCommands();
DocNode *n = g_nodeStack.pop(); DocNode *n = g_nodeStack.pop();
ASSERT(n==this); ASSERT(n==this);
} }
...@@ -4443,6 +4584,7 @@ DocNode *validatingParseDoc(const char *fileName,int startLine, ...@@ -4443,6 +4584,7 @@ DocNode *validatingParseDoc(const char *fileName,int startLine,
g_memberDef = md; g_memberDef = md;
g_nodeStack.clear(); g_nodeStack.clear();
g_styleStack.clear(); g_styleStack.clear();
g_initialStyleStack.clear();
g_inSeeBlock = FALSE; g_inSeeBlock = FALSE;
g_insideHtmlLink = FALSE; g_insideHtmlLink = FALSE;
g_includeFileText = ""; g_includeFileText = "";
...@@ -4491,6 +4633,7 @@ DocNode *validatingParseText(const char *input) ...@@ -4491,6 +4633,7 @@ DocNode *validatingParseText(const char *input)
g_memberDef = 0; g_memberDef = 0;
g_nodeStack.clear(); g_nodeStack.clear();
g_styleStack.clear(); g_styleStack.clear();
g_initialStyleStack.clear();
g_inSeeBlock = FALSE; g_inSeeBlock = FALSE;
g_insideHtmlLink = FALSE; g_insideHtmlLink = FALSE;
g_includeFileText = ""; g_includeFileText = "";
......
...@@ -283,6 +283,7 @@ class DocStyleChange : public DocNode ...@@ -283,6 +283,7 @@ class DocStyleChange : public DocNode
{ if (attribs) m_attribs=*attribs; } { if (attribs) m_attribs=*attribs; }
Kind kind() const { return Kind_StyleChange; } Kind kind() const { return Kind_StyleChange; }
Style style() const { return m_style; } Style style() const { return m_style; }
const char *styleString() const;
bool enable() const { return m_enable; } bool enable() const { return m_enable; }
uint position() const { return m_position; } uint position() const { return m_position; }
DocNode *parent() const { return m_parent; } DocNode *parent() const { return m_parent; }
......
...@@ -162,26 +162,27 @@ static void parseHtmlAttribs(const char *att) ...@@ -162,26 +162,27 @@ static void parseHtmlAttribs(const char *att)
while (i<len && c==' ') { c=attribs.at(++i); } while (i<len && c==' ') { c=attribs.at(++i); }
if (attribs.at(i)=='=') // option has value if (attribs.at(i)=='=') // option has value
{ {
i++; c=attribs.at(++i);
// skip spaces // skip spaces
while (i<len && c==' ') { c=attribs.at(++i); } while (i<len && c==' ') { c=attribs.at(++i); }
if (attribs.at(i)=='\'') // option '...' if (attribs.at(i)=='\'') // option '...'
{ {
i++; c=attribs.at(++i);
startAttrib=i; startAttrib=i;
// search for matching quote // search for matching quote
while (i<len && c!='\'') { c=attribs.at(++i); } while (i<len && c!='\'') { c=attribs.at(++i); }
endAttrib=i; endAttrib=i;
i++; c=attribs.at(++i);
} }
else if (attribs.at(i)=='"') // option "..." else if (attribs.at(i)=='"') // option "..."
{ {
i++; c=attribs.at(++i);
startAttrib=i; startAttrib=i;
// search for matching quote // search for matching quote
while (i<len && c!='"') { c=attribs.at(++i); } while (i<len && c!='"') { c=attribs.at(++i); }
endAttrib=i; endAttrib=i;
i++; c=attribs.at(++i);
} }
else // value without any quotes else // value without any quotes
{ {
...@@ -189,7 +190,7 @@ static void parseHtmlAttribs(const char *att) ...@@ -189,7 +190,7 @@ static void parseHtmlAttribs(const char *att)
// search for separator // search for separator
while (i<len && c!=' ') { c=attribs.at(++i); } while (i<len && c!=' ') { c=attribs.at(++i); }
endAttrib=i; endAttrib=i;
i++; c=attribs.at(++i);
} }
opt.value = attribs.mid(startAttrib,endAttrib-startAttrib); opt.value = attribs.mid(startAttrib,endAttrib-startAttrib);
} }
...@@ -378,7 +379,7 @@ LABELID [a-z_A-Z][a-z_A-Z0-9\-]* ...@@ -378,7 +379,7 @@ LABELID [a-z_A-Z][a-z_A-Z0-9\-]*
g_token->isEMailAddr=FALSE; g_token->isEMailAddr=FALSE;
return TK_URL; return TK_URL;
} }
<St_Para>[a-z_A-Z0-9.-]+"@"[a-z_A-Z0-9-]+("."[a-z_A-Z0-9\-])+[a-z_A-Z0-9\-]+ { // Mail address <St_Para>[a-z_A-Z0-9.-]+"@"[a-z_A-Z0-9-]+("."[a-z_A-Z0-9\-]+)+[a-z_A-Z0-9\-]+ { // Mail address
g_token->name=yytext; g_token->name=yytext;
g_token->isEMailAddr=TRUE; g_token->isEMailAddr=TRUE;
return TK_URL; return TK_URL;
...@@ -598,7 +599,7 @@ LABELID [a-z_A-Z][a-z_A-Z0-9\-]* ...@@ -598,7 +599,7 @@ LABELID [a-z_A-Z][a-z_A-Z0-9\-]*
return 0; return 0;
} }
<St_Ref>{ID} { <St_Ref>({ID}[.-])*{ID} {
g_token->name=yytext; g_token->name=yytext;
return TK_WORD; return TK_WORD;
} }
......
...@@ -2524,8 +2524,8 @@ static void transferFunctionDocumentation() ...@@ -2524,8 +2524,8 @@ static void transferFunctionDocumentation()
// mdec->setGroupDef(mdef->getGroupDef(),mdef->getGroupPri(),mdef->docFile(),mdef->docLine(),mdef->hasDocumentation()); // mdec->setGroupDef(mdef->getGroupDef(),mdef->getGroupPri(),mdef->docFile(),mdef->docLine(),mdef->hasDocumentation());
//} //}
mdec->setRefItems(mdef->specialListItems()); mdec->mergeRefItems(mdef);
mdef->setRefItems(mdec->specialListItems()); mdef->mergeRefItems(mdec);
mdef->setMemberDeclaration(mdec); mdef->setMemberDeclaration(mdec);
mdec->setMemberDefinition(mdef); mdec->setMemberDefinition(mdef);
......
...@@ -166,7 +166,7 @@ void HtmlDocVisitor::visit(DocStyleChange *s) ...@@ -166,7 +166,7 @@ void HtmlDocVisitor::visit(DocStyleChange *s)
else else
{ {
m_insidePre=FALSE; m_insidePre=FALSE;
m_t << "</pre>\n"; m_t << "</pre>";
} }
} }
} }
...@@ -279,24 +279,26 @@ void HtmlDocVisitor::visitPre(DocAutoList *l) ...@@ -279,24 +279,26 @@ void HtmlDocVisitor::visitPre(DocAutoList *l)
{ {
if (l->isEnumList()) if (l->isEnumList())
{ {
m_t << "<ol>\n"; m_t << "<ol>";
} }
else else
{ {
m_t << "<ul>\n"; m_t << "<ul>";
} }
if (!l->isPreformatted()) m_t << "\n";
} }
void HtmlDocVisitor::visitPost(DocAutoList *l) void HtmlDocVisitor::visitPost(DocAutoList *l)
{ {
if (l->isEnumList()) if (l->isEnumList())
{ {
m_t << "</ol>\n"; m_t << "</ol>";
} }
else else
{ {
m_t << "</ul>\n"; m_t << "</ul>";
} }
if (!l->isPreformatted()) m_t << "\n";
} }
void HtmlDocVisitor::visitPre(DocAutoListItem *) void HtmlDocVisitor::visitPre(DocAutoListItem *)
...@@ -319,7 +321,10 @@ void HtmlDocVisitor::visitPost(DocPara *p) ...@@ -319,7 +321,10 @@ void HtmlDocVisitor::visitPost(DocPara *p)
!(p->parent() && // and for parameter sections !(p->parent() && // and for parameter sections
p->parent()->kind()==DocNode::Kind_ParamSect p->parent()->kind()==DocNode::Kind_ParamSect
) )
) m_t << "\n<p>\n"; )
{
m_t << "<p>";
}
} }
void HtmlDocVisitor::visitPre(DocRoot *) void HtmlDocVisitor::visitPre(DocRoot *)
...@@ -391,14 +396,16 @@ void HtmlDocVisitor::visitPost(DocTitle *) ...@@ -391,14 +396,16 @@ void HtmlDocVisitor::visitPost(DocTitle *)
m_t << "</b></dt><dd>"; m_t << "</b></dt><dd>";
} }
void HtmlDocVisitor::visitPre(DocSimpleList *) void HtmlDocVisitor::visitPre(DocSimpleList *sl)
{ {
m_t << "<ul>\n"; m_t << "<ul>";
if (!sl->isPreformatted()) m_t << "\n";
} }
void HtmlDocVisitor::visitPost(DocSimpleList *) void HtmlDocVisitor::visitPost(DocSimpleList *sl)
{ {
m_t << "</ul>\n"; m_t << "</ul>";
if (!sl->isPreformatted()) m_t << "\n";
} }
void HtmlDocVisitor::visitPre(DocSimpleListItem *) void HtmlDocVisitor::visitPre(DocSimpleListItem *)
...@@ -406,9 +413,10 @@ void HtmlDocVisitor::visitPre(DocSimpleListItem *) ...@@ -406,9 +413,10 @@ void HtmlDocVisitor::visitPre(DocSimpleListItem *)
m_t << "<li>"; m_t << "<li>";
} }
void HtmlDocVisitor::visitPost(DocSimpleListItem *) void HtmlDocVisitor::visitPost(DocSimpleListItem *li)
{ {
m_t << "</li>\n"; m_t << "</li>";
if (!li->isPreformatted()) m_t << "\n";
} }
void HtmlDocVisitor::visitPre(DocSection *s) void HtmlDocVisitor::visitPre(DocSection *s)
...@@ -435,14 +443,16 @@ void HtmlDocVisitor::visitPre(DocHtmlList *s) ...@@ -435,14 +443,16 @@ void HtmlDocVisitor::visitPre(DocHtmlList *s)
void HtmlDocVisitor::visitPost(DocHtmlList *s) void HtmlDocVisitor::visitPost(DocHtmlList *s)
{ {
if (s->type()==DocHtmlList::Ordered) if (s->type()==DocHtmlList::Ordered)
m_t << "</ol>\n"; m_t << "</ol>";
else else
m_t << "</ul>\n"; m_t << "</ul>";
if (!s->isPreformatted()) m_t << "\n";
} }
void HtmlDocVisitor::visitPre(DocHtmlListItem *i) void HtmlDocVisitor::visitPre(DocHtmlListItem *i)
{ {
m_t << "<li" << htmlAttribsToString(i->attribs()) << ">\n"; m_t << "<li" << htmlAttribsToString(i->attribs()) << ">";
if (!i->isPreformatted()) m_t << "\n";
} }
void HtmlDocVisitor::visitPost(DocHtmlListItem *) void HtmlDocVisitor::visitPost(DocHtmlListItem *)
......
...@@ -706,6 +706,11 @@ void MemberDef::writeDeclaration(OutputList &ol, ...@@ -706,6 +706,11 @@ void MemberDef::writeDeclaration(OutputList &ol,
if (cd) d=cd; else if (nd) d=nd; else if (fd) d=fd; else d=gd; if (cd) d=cd; else if (nd) d=nd; else if (fd) d=fd; else d=gd;
QCString cname = d->name(); QCString cname = d->name();
QCString cfname = d->getOutputFileBase(); QCString cfname = d->getOutputFileBase();
QCString osname = cname;
// in case of class members that are put in a group the name of the outerscope
// differs from the cname.
if (getOuterScope()) osname=getOuterScope()->name();
HtmlHelp *htmlHelp=0; HtmlHelp *htmlHelp=0;
bool hasHtmlHelp = Config_getBool("GENERATE_HTML") && Config_getBool("GENERATE_HTMLHELP"); bool hasHtmlHelp = Config_getBool("GENERATE_HTML") && Config_getBool("GENERATE_HTMLHELP");
...@@ -926,7 +931,7 @@ void MemberDef::writeDeclaration(OutputList &ol, ...@@ -926,7 +931,7 @@ void MemberDef::writeDeclaration(OutputList &ol,
!annMemb) !annMemb)
{ {
ol.startMemberDescription(); ol.startMemberDescription();
ol.parseDoc(briefFile(),briefLine(),cname,this,briefDescription(),FALSE); ol.parseDoc(briefFile(),briefLine(),osname,this,briefDescription(),FALSE);
if (detailsVisible) if (detailsVisible)
{ {
ol.pushGeneratorState(); ol.pushGeneratorState();
...@@ -1590,8 +1595,8 @@ void MemberDef::warnIfUndocumented() ...@@ -1590,8 +1595,8 @@ void MemberDef::warnIfUndocumented()
(prot!=Private || Config_getBool("EXTRACT_PRIVATE")) (prot!=Private || Config_getBool("EXTRACT_PRIVATE"))
) )
{ {
warn_undoc(m_defFileName,m_defLine,"Warning: Member %s of %s %s is not documented.", warn_undoc(m_defFileName,m_defLine,"Warning: Member %s%s of %s %s is not documented.",
name().data(),t,d->name().data()); name().data(),argsString()?argsString():"",t,d->name().data());
} }
} }
......
...@@ -442,7 +442,7 @@ void loadStylesheet(const char *name, QDict<StyleData>& dict) ...@@ -442,7 +442,7 @@ void loadStylesheet(const char *name, QDict<StyleData>& dict)
{ {
QCString s(4096); // string buffer of max line length QCString s(4096); // string buffer of max line length
s = t.readLine().stripWhiteSpace(); s = t.readLine().stripWhiteSpace();
if (s.length()==0 || s.at(0)=='#') continue; // skip blanks & comments if (s.isEmpty() || s.at(0)=='#') continue; // skip blanks & comments
int sepLength; int sepLength;
int sepStart = separator.match(s,0,&sepLength); int sepStart = separator.match(s,0,&sepLength);
if (sepStart<=0) // no valid assignment statement if (sepStart<=0) // no valid assignment statement
......
...@@ -851,11 +851,6 @@ CHARLIT (("'"\\[0-7]{1,3}"'")|("'"\\."'")|("'"[^'\\\n]{1,4}"'")) ...@@ -851,11 +851,6 @@ CHARLIT (("'"\\[0-7]{1,3}"'")|("'"\\."'")|("'"[^'\\\n]{1,4}"'"))
<FindMembers>{BN}{1,80} { <FindMembers>{BN}{1,80} {
lineCount(); lineCount();
} }
<FindMembers>{B}*"package"{BN}+ { // Java package
lineCount();
BEGIN(PackageName);
}
<PackageName>{ID}("."{ID})* { <PackageName>{ID}("."{ID})* {
//current->name = yytext; //current->name = yytext;
//current->fileName = yyFileName; //current->fileName = yyFileName;
...@@ -1284,6 +1279,11 @@ CHARLIT (("'"\\[0-7]{1,3}"'")|("'"\\."'")|("'"[^'\\\n]{1,4}"'")) ...@@ -1284,6 +1279,11 @@ CHARLIT (("'"\\[0-7]{1,3}"'")|("'"\\."'")|("'"[^'\\\n]{1,4}"'"))
else // insideJava else // insideJava
BEGIN(JavaImport); BEGIN(JavaImport);
} }
else if (insideJava && strcmp(yytext,"package")==0)
{
lineCount();
BEGIN(PackageName);
}
else if (insideIDL && strcmp(yytext,"case")==0) else if (insideIDL && strcmp(yytext,"case")==0)
{ {
BEGIN(IDLUnionCase); BEGIN(IDLUnionCase);
...@@ -1913,7 +1913,7 @@ CHARLIT (("'"\\[0-7]{1,3}"'")|("'"\\."'")|("'"[^'\\\n]{1,4}"'")) ...@@ -1913,7 +1913,7 @@ CHARLIT (("'"\\[0-7]{1,3}"'")|("'"\\."'")|("'"[^'\\\n]{1,4}"'"))
current = new Entry(*current); current = new Entry(*current);
if (current->section==Entry::NAMESPACE_SEC || if (current->section==Entry::NAMESPACE_SEC ||
current->section==Entry::INTERFACE_SEC || current->section==Entry::INTERFACE_SEC ||
insideJava insideJava || insidePHP
) )
{ // namespaces and interfaces and java classes ends with a closing bracket without semicolon { // namespaces and interfaces and java classes ends with a closing bracket without semicolon
current->reset(); current->reset();
......
...@@ -101,7 +101,7 @@ class TranslatorGerman : public Translator ...@@ -101,7 +101,7 @@ class TranslatorGerman : public Translator
{ {
QCString result="\\usepackage{ngerman}\n"; QCString result="\\usepackage{ngerman}\n";
result+="\\usepackage{t1enc}% Trennung verbessern bei Umlauten\n"; result+="\\usepackage{t1enc}% Trennung verbessern bei Umlauten\n";
result+="%\\usepackage[latin1]{inputenc}% Kodierung (cp850,latin1,ansinew)"; result+="%\\usepackage[latin1]{inputenc}% Kodierung (cp850,latin1,ansinew)\n";
return result; return result;
} }
......
...@@ -669,25 +669,25 @@ class TranslatorEnglish : public Translator ...@@ -669,25 +669,25 @@ class TranslatorEnglish : public Translator
} }
virtual QCString trPublicMembers() virtual QCString trPublicMembers()
{ return "Public Methods"; } { return "Public Member Functions"; }
virtual QCString trPublicSlots() virtual QCString trPublicSlots()
{ return "Public Slots"; } { return "Public Slots"; }
virtual QCString trSignals() virtual QCString trSignals()
{ return "Signals"; } { return "Signals"; }
virtual QCString trStaticPublicMembers() virtual QCString trStaticPublicMembers()
{ return "Static Public Methods"; } { return "Static Public Member Functions"; }
virtual QCString trProtectedMembers() virtual QCString trProtectedMembers()
{ return "Protected Methods"; } { return "Protected Member Functions"; }
virtual QCString trProtectedSlots() virtual QCString trProtectedSlots()
{ return "Protected Slots"; } { return "Protected Slots"; }
virtual QCString trStaticProtectedMembers() virtual QCString trStaticProtectedMembers()
{ return "Static Protected Methods"; } { return "Static Protected Member Functions"; }
virtual QCString trPrivateMembers() virtual QCString trPrivateMembers()
{ return "Private Methods"; } { return "Private Member Functions"; }
virtual QCString trPrivateSlots() virtual QCString trPrivateSlots()
{ return "Private Slots"; } { return "Private Slots"; }
virtual QCString trStaticPrivateMembers() virtual QCString trStaticPrivateMembers()
{ return "Static Private Methods"; } { return "Static Private Member Functions"; }
/*! this function is used to produce a comma-separated list of items. /*! this function is used to produce a comma-separated list of items.
* use generateMarker(i) to indicate where item i should be put. * use generateMarker(i) to indicate where item i should be put.
...@@ -1126,7 +1126,7 @@ class TranslatorEnglish : public Translator ...@@ -1126,7 +1126,7 @@ class TranslatorEnglish : public Translator
/*! Used as a section header for KDE-2 IDL methods */ /*! Used as a section header for KDE-2 IDL methods */
virtual QCString trDCOPMethods() virtual QCString trDCOPMethods()
{ {
return "DCOP Methods"; return "DCOP Member Functions";
} }
////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////
......
...@@ -1414,6 +1414,22 @@ private: ...@@ -1414,6 +1414,22 @@ private:
{ {
return decode( "Spisak zastarelih funkcija èlanica" ); return decode( "Spisak zastarelih funkcija èlanica" );
} }
//////////////////////////////////////////////////////////////////////////
// new since 1.2.18
//////////////////////////////////////////////////////////////////////////
/*! Used as a header for declaration section of the events found in
* a C# program
*/
virtual QCString trEvents()
{
return "Dogaðaji";
}
/*! Header used for the documentation section of a class' events. */
virtual QCString trEventDocumentation()
{
return "Dokumentacija dogaðaja";
}
}; };
......
...@@ -317,15 +317,16 @@ QCString generateMarker(int id) ...@@ -317,15 +317,16 @@ QCString generateMarker(int id)
*/ */
QCString stripFromPath(const QCString &path) QCString stripFromPath(const QCString &path)
{ {
const char *s=Config_getList("STRIP_FROM_PATH").first(); QStrList &l = Config_getList("STRIP_FROM_PATH");
const char *s=l.first();
while (s) while (s)
{ {
QCString prefix = s; QCString prefix = s;
if (path.left(prefix.length())==prefix) if (stricmp(path.left(prefix.length()),prefix)==0) // case insensitive compare
{ {
return path.right(path.length()-prefix.length()); return path.right(path.length()-prefix.length());
} }
s = Config_getList("STRIP_FROM_PATH").next(); s = l.next();
} }
return path; return path;
} }
...@@ -1691,7 +1692,7 @@ static bool matchArgument(const Argument *srcA,const Argument *dstA, ...@@ -1691,7 +1692,7 @@ static bool matchArgument(const Argument *srcA,const Argument *dstA,
{ {
dstPos++; dstPos++;
while (dstPos<dstAType.length() && isId(dstAType.at(dstPos))) dstPos++; while (dstPos<dstAType.length() && isId(dstAType.at(dstPos))) dstPos++;
if (dstPos!=dstAType.length()) if (dstPos!=dstAType.length() || !srcA->name.isEmpty())
{ {
NOMATCH NOMATCH
return FALSE; // nope not a name -> no match return FALSE; // nope not a name -> no match
...@@ -1718,13 +1719,17 @@ static bool matchArgument(const Argument *srcA,const Argument *dstA, ...@@ -1718,13 +1719,17 @@ static bool matchArgument(const Argument *srcA,const Argument *dstA,
{ {
srcPos++; srcPos++;
while (srcPos<srcAType.length() && isId(srcAType.at(srcPos))) srcPos++; while (srcPos<srcAType.length() && isId(srcAType.at(srcPos))) srcPos++;
if (srcPos!=srcAType.length()) if (srcPos!=srcAType.length() || !dstA->name.isEmpty())
{ {
NOMATCH NOMATCH
return FALSE; // nope not a name -> no match return FALSE; // nope not a name -> no match
} }
} }
} }
else
{
printf("something else!\n");
}
} }
MATCH MATCH
return TRUE; return TRUE;
...@@ -2574,8 +2579,6 @@ bool resolveLink(/* in */ const char *scName, ...@@ -2574,8 +2579,6 @@ bool resolveLink(/* in */ const char *scName,
/* out */ QCString &resAnchor /* out */ QCString &resAnchor
) )
{ {
//printf("resolveLink clName=`%s' lr=`%s'\n",scName,lr);
*resContext=0; *resContext=0;
*resPageInfo=0; *resPageInfo=0;
...@@ -2583,6 +2586,8 @@ bool resolveLink(/* in */ const char *scName, ...@@ -2583,6 +2586,8 @@ bool resolveLink(/* in */ const char *scName,
FileDef *fd; FileDef *fd;
GroupDef *gd; GroupDef *gd;
PageInfo *pi; PageInfo *pi;
ClassDef *cd;
NamespaceDef *nd;
bool ambig; bool ambig;
if (linkRef.isEmpty()) // no reference name! if (linkRef.isEmpty()) // no reference name!
{ {
...@@ -2620,7 +2625,17 @@ bool resolveLink(/* in */ const char *scName, ...@@ -2620,7 +2625,17 @@ bool resolveLink(/* in */ const char *scName,
*resContext=fd; *resContext=fd;
return TRUE; return TRUE;
} }
else // probably a class or member reference else if ((cd=getClass(linkRef)))
{
*resContext=cd;
return TRUE;
}
else if ((nd=Doxygen::namespaceSDict.find(linkRef)))
{
*resContext=nd;
return TRUE;
}
else // probably a member reference
{ {
MemberDef *md; MemberDef *md;
bool res = resolveRef(scName,lr,inSeeBlock,resContext,&md); bool res = resolveRef(scName,lr,inSeeBlock,resContext,&md);
......
...@@ -58,7 +58,16 @@ inline void writeXMLCodeString(QTextStream &t,const char *s) ...@@ -58,7 +58,16 @@ inline void writeXMLCodeString(QTextStream &t,const char *s)
char c; char c;
while ((c=*s++)) while ((c=*s++))
{ {
if (c==' ') t << "<sp/>"; else t << c; switch(c)
{
case ' ': t << "<sp/>"; break;
case '<': t << "&lt;"; break;
case '>': t << "&gt;"; break;
case '&': t << "&amp;"; break;
case '\'': t << "&apos;"; break;
case '"': t << "&quot;"; break;
default: t << c; break;
}
} }
} }
...@@ -367,7 +376,7 @@ static void writeXMLDocBlock(QTextStream &t, ...@@ -367,7 +376,7 @@ static void writeXMLDocBlock(QTextStream &t,
QCString stext = text.stripWhiteSpace(); QCString stext = text.stripWhiteSpace();
if (stext.isEmpty()) return; if (stext.isEmpty()) return;
// convert the documentation string into an abstract syntax tree // convert the documentation string into an abstract syntax tree
DocNode *root = validatingParseDoc(fileName,lineNr,scope,md,stext,FALSE); DocNode *root = validatingParseDoc(fileName,lineNr,scope,md,text+"\n",FALSE);
// create a code generator // create a code generator
XMLCodeGenerator *xmlCodeGen = new XMLCodeGenerator(t); XMLCodeGenerator *xmlCodeGen = new XMLCodeGenerator(t);
// create a parse tree visitor for XML // create a parse tree visitor for XML
......
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