diff options
-rw-r--r-- | doc/commands.doc | 8 | ||||
-rw-r--r-- | doc/doxygen.sty | 2 | ||||
-rw-r--r-- | src/commentcnv.l | 41 | ||||
-rw-r--r-- | src/doxygen.sty | 4 | ||||
-rw-r--r-- | src/latexdocvisitor.cpp | 5 | ||||
-rw-r--r-- | src/latexgen.cpp | 19 |
6 files changed, 72 insertions, 7 deletions
diff --git a/doc/commands.doc b/doc/commands.doc index ab7c569..7644f69 100644 --- a/doc/commands.doc +++ b/doc/commands.doc @@ -2698,6 +2698,8 @@ class Receiver <hr> \section cmdfcurlyopen \\f{environment}{ + \addindex \\f{ + Marks the start of a formula that is in a specific environment. \note The second \c { is optional and is only to help editors (such as \c Vim) to do proper syntax highlighting by making the number of opening and closing braces @@ -2707,6 +2709,8 @@ class Receiver <hr> \section cmdfcurlyclose \\f} + \addindex \\f} + Marks the end of a formula that is in a specific environment. \sa section \ref cmdfcurlyopen "\\f{" and section \ref formulas "formulas". @@ -3032,7 +3036,7 @@ class Receiver \section cmdchardot \\. \addindex \\\. - This command writes a dot (\c .) to the output. This can be useful to + This command writes a dot (`.`) to the output. This can be useful to prevent ending a brief description when JAVADOC_AUTOBRIEF is enabled or to prevent starting a numbered list when the dot follows a number at the start of a line. @@ -3040,7 +3044,7 @@ class Receiver <hr> \section cmddcolon \\:: - \addindex \\\:: + \addindex \\:: This command writes a double colon (\c \::) to the output. This character sequence has to be escaped in some cases, because it is used to reference to documented entities. diff --git a/doc/doxygen.sty b/doc/doxygen.sty index 45bec34..8013dad 100644 --- a/doc/doxygen.sty +++ b/doc/doxygen.sty @@ -381,6 +381,8 @@ } \newcommand{\doxyref}[3]{\textbf{#1} (\textnormal{#2}\,\pageref{#3})} +\newcommand{\lcurly}{\{} +\newcommand{\rcurly}{\}} \newenvironment{DoxyCompactList} {\begin{list}{}{ \setlength{\leftmargin}{0.5cm} diff --git a/src/commentcnv.l b/src/commentcnv.l index 6433974..b12623c 100644 --- a/src/commentcnv.l +++ b/src/commentcnv.l @@ -52,6 +52,13 @@ struct CondCtx bool skip; }; +struct CommentCtx +{ + CommentCtx(int line) + : lineNr(line) {} + int lineNr; +}; + static BufStr * g_inBuf; static BufStr * g_outBuf; static int g_inBufPos; @@ -64,6 +71,7 @@ static QCString g_fileName; static int g_lineNr; static int g_condCtx; static QStack<CondCtx> g_condStack; +static QStack<CommentCtx> g_commentStack; static QCString g_blockName; static int g_lastCommentContext; static bool g_inSpecialComment; @@ -256,8 +264,10 @@ void replaceComment(int offset); { g_pythonDocString = TRUE; g_nestingCount=0; + g_commentStack.clear(); /* to be on the save side */ copyToOutput(yytext,(int)yyleng); BEGIN(CComment); + g_commentStack.push(new CommentCtx(g_lineNr)); } } <Scan>![><!]/.*\n { @@ -269,7 +279,9 @@ void replaceComment(int offset); { copyToOutput(yytext,(int)yyleng); g_nestingCount=0; + g_commentStack.clear(); /* to be on the save side */ BEGIN(CComment); + g_commentStack.push(new CommentCtx(g_lineNr)); } } <Scan>[Cc\*][><!]/.*\n { @@ -284,7 +296,9 @@ void replaceComment(int offset); { copyToOutput(yytext,(int)yyleng); g_nestingCount=0; + g_commentStack.clear(); /* to be on the save side */ BEGIN(CComment); + g_commentStack.push(new CommentCtx(g_lineNr)); } else { @@ -378,8 +392,10 @@ void replaceComment(int offset); <Scan>"/*"[*!]? { /* start of a C comment */ g_specialComment=(int)yyleng==3; g_nestingCount=0; + g_commentStack.clear(); /* to be on the save side */ copyToOutput(yytext,(int)yyleng); BEGIN(CComment); + g_commentStack.push(new CommentCtx(g_lineNr)); } <Scan>"#"("#")? { if (g_lang!=SrcLangExt_Python) @@ -390,7 +406,9 @@ void replaceComment(int offset); { copyToOutput(yytext,(int)yyleng); g_nestingCount=0; + g_commentStack.clear(); /* to be on the save side */ BEGIN(CComment); + g_commentStack.push(new CommentCtx(g_lineNr)); } } <Scan>"--!" { @@ -402,7 +420,9 @@ void replaceComment(int offset); { copyToOutput(yytext,(int)yyleng); g_nestingCount=0; + g_commentStack.clear(); /* to be on the save side */ BEGIN(CComment); + g_commentStack.push(new CommentCtx(g_lineNr)); } } <Scan>![><!] { @@ -414,7 +434,9 @@ void replaceComment(int offset); { copyToOutput(yytext,(int)yyleng); g_nestingCount=0; + g_commentStack.clear(); /* to be on the save side */ BEGIN(CComment); + g_commentStack.push(new CommentCtx(g_lineNr)); } } <CComment>"{@code"/[ \t\n] { @@ -606,6 +628,7 @@ void replaceComment(int offset); } <CComment>"/"+"*" { /* nested C comment */ g_nestingCount++; + g_commentStack.push(new CommentCtx(g_lineNr)); copyToOutput(yytext,(int)yyleng); } <CComment>"*"+"/" { /* end of C comment */ @@ -623,6 +646,7 @@ void replaceComment(int offset); else { g_nestingCount--; + CommentCtx *ctx = g_commentStack.pop(); } } } @@ -951,6 +975,8 @@ void convertCppComments(BufStr *inBuf,BufStr *outBuf,const char *fileName) g_lineNr = 1; g_condStack.clear(); g_condStack.setAutoDelete(TRUE); + g_commentStack.clear(); + g_commentStack.setAutoDelete(TRUE); printlex(yy_flex_debug, TRUE, __FILE__, fileName); isFixedForm = FALSE; @@ -962,7 +988,9 @@ void convertCppComments(BufStr *inBuf,BufStr *outBuf,const char *fileName) if (g_lang==SrcLangExt_Markdown) { g_nestingCount=0; + g_commentStack.clear(); /* to be on the save side */ BEGIN(CComment); + g_commentStack.push(new CommentCtx(g_lineNr)); } else { @@ -979,9 +1007,20 @@ void convertCppComments(BufStr *inBuf,BufStr *outBuf,const char *fileName) } if (g_nestingCount>0 || (YY_START==CComment && g_lang!=SrcLangExt_Markdown)) { + QString tmp= "(probable line reference: "; + bool first = TRUE; + while (!g_commentStack.isEmpty()) + { + CommentCtx *ctx = g_commentStack.pop(); + if (!first) tmp += ", "; + tmp += QString::number(ctx->lineNr); + first = FALSE; + } + tmp += ")"; warn(g_fileName,g_lineNr,"Reached end of file while still inside a (nested) comment. " - "Nesting level %d",g_nestingCount+1); // add one for "normal" expected end of comment + "Nesting level %d %s",g_nestingCount+1,tmp.data()); // add one for "normal" expected end of comment } + g_commentStack.clear(); if (Debug::isFlagSet(Debug::CommentCnv)) { g_outBuf->at(g_outBuf->curPos())='\0'; diff --git a/src/doxygen.sty b/src/doxygen.sty index 199abf8..072104b 100644 --- a/src/doxygen.sty +++ b/src/doxygen.sty @@ -450,6 +450,10 @@ \textbf{#1} (\textnormal{#2}\,\pageref{#3})% } +% Used by @addindex +\newcommand{\lcurly}{\{} +\newcommand{\rcurly}{\}} + % Used for syntax highlighting \definecolor{comment}{rgb}{0.5,0.0,0.0} \definecolor{keyword}{rgb}{0.0,0.5,0.0} diff --git a/src/latexdocvisitor.cpp b/src/latexdocvisitor.cpp index 91064a3..bc8e5a5 100644 --- a/src/latexdocvisitor.cpp +++ b/src/latexdocvisitor.cpp @@ -44,6 +44,9 @@ static QCString escapeLabelName(const char *s) case '%': result+="\\%"; break; case '|': result+="\\texttt{\"|}"; break; case '!': result+="\"!"; break; + case '{': result+="\\lcurly{}"; break; + case '}': result+="\\rcurly{}"; break; + case '~': result+="````~"; break; // to get it a bit better in index together with other special characters default: result+=c; } } @@ -79,6 +82,8 @@ QCString LatexDocVisitor::escapeMakeIndexChars(const char *s) case '|': m_t << "\\texttt{\"|}"; break; case '[': m_t << "["; break; case ']': m_t << "]"; break; + case '{': m_t << "\\lcurly{}"; break; + case '}': m_t << "\\rcurly{}"; break; default: str[0]=c; filter(str); break; } } diff --git a/src/latexgen.cpp b/src/latexgen.cpp index 8b8c835..04750f5 100644 --- a/src/latexgen.cpp +++ b/src/latexgen.cpp @@ -1375,8 +1375,10 @@ void LatexGenerator::startMemberDoc(const char *clname, t << "}"; if (clname) { - t << "!" << clname << "@{"; - docify(clname); + t << "!"; + escapeLabelName(clname); + t << "@{"; + escapeMakeIndexChars(clname); t << "}"; } t << "}" << endl; @@ -2013,13 +2015,18 @@ void LatexGenerator::escapeLabelName(const char *s) { switch (c) { + case '|': t << "\\texttt{\"|}"; break; + case '!': t << "\"!"; break; case '%': t << "\\%"; break; + case '{': t << "\\lcurly{}"; break; + case '}': t << "\\rcurly{}"; break; + case '~': t << "````~"; break; // to get it a bit better in index together with other special characters // NOTE: adding a case here, means adding it to while below as well! default: i=0; // collect as long string as possible, before handing it to docify result[i++]=c; - while ((c=*p) && c!='%') + while ((c=*p) && c!='|' && c!='!' && c!='%' && c!='{' && c!='}' && c!='~') { result[i++]=c; p++; @@ -2042,16 +2049,20 @@ void LatexGenerator::escapeMakeIndexChars(const char *s) { switch (c) { + case '!': t << "\"!"; break; case '"': t << "\"\""; break; case '@': t << "\"@"; break; + case '|': t << "\\texttt{\"|}"; break; case '[': t << "["; break; case ']': t << "]"; break; + case '{': t << "\\lcurly{}"; break; + case '}': t << "\\rcurly{}"; break; // NOTE: adding a case here, means adding it to while below as well! default: i=0; // collect as long string as possible, before handing it to docify result[i++]=c; - while ((c=*p) && c!='"' && c!='@' && c!='[' && c!=']') + while ((c=*p) && c!='"' && c!='@' && c!='[' && c!=']' && c!='!' && c!='{' && c!='}' && c!='|') { result[i++]=c; p++; |