From 8d13a1a9d0e6a5e4f50563b6d1b6840176e4a5cc Mon Sep 17 00:00:00 2001
From: albert-github
Date: Sun, 3 Mar 2019 15:59:48 +0100
Subject: Show line numbers in "split" examples
With the commands like `\skip`, `\skipline` it is possible to show parts of a file for further explanation / tutorials. They can be started with `\include` or `\dontinclude` but in case `\include` specifies that the line numbers have to be shown they are only shown in the full example and not in the split up example
- show line numbers in split up example in case `lineno` is required
- add `lineno` option to `\dontinclude` so here also line numbers can be shown.
---
doc/commands.doc | 4 +++-
src/docbookvisitor.cpp | 17 ++++++++++++++++-
src/docparser.cpp | 28 ++++++++++++++++++++++++++++
src/docparser.h | 7 ++++++-
src/htmldocvisitor.cpp | 13 ++++++++++---
src/latexdocvisitor.cpp | 17 ++++++++++++++++-
src/mandocvisitor.cpp | 17 ++++++++++++++++-
src/rtfdocvisitor.cpp | 17 ++++++++++++++++-
src/xmldocvisitor.cpp | 17 ++++++++++++++++-
9 files changed, 127 insertions(+), 10 deletions(-)
diff --git a/doc/commands.doc b/doc/commands.doc
index 0e66c1d..b6c8f6b 100644
--- a/doc/commands.doc
+++ b/doc/commands.doc
@@ -2186,7 +2186,7 @@ Commands for displaying examples
\htmlonly
\endhtmlonly
-\section cmddontinclude \\dontinclude
+\section cmddontinclude \\dontinclude[{lineno}]
\addindex \\dontinclude
This command can be used to parse a source file without actually
@@ -2197,6 +2197,8 @@ Commands for displaying examples
\ref cfg_example_path "EXAMPLE_PATH"
tag of doxygen's configuration file.
+ You can add option `{lineno}` to enable line numbers for the included code if desired.
+
The class and member declarations and definitions inside the code fragment
are 'remembered' during the parsing of the comment block that contained
the \c \\dontinclude command.
diff --git a/src/docbookvisitor.cpp b/src/docbookvisitor.cpp
index 3e4874d..076b96d 100644
--- a/src/docbookvisitor.cpp
+++ b/src/docbookvisitor.cpp
@@ -479,10 +479,25 @@ DB_VIS_C
popEnabled();
if (!m_hide)
{
+ FileDef *fd;
+ if (!op->includeFileName().isEmpty())
+ {
+ QFileInfo cfi( op->includeFileName() );
+ fd = createFileDef( cfi.dirPath().utf8(), cfi.fileName().utf8() );
+ }
+
Doxygen::parserManager->getParser(m_langExt)
->parseCode(m_ci,op->context(),
op->text(),langExt,op->isExample(),
- op->exampleFile());
+ op->exampleFile(),
+ fd, // fileDef
+ op->line(), // startLine
+ -1, // endLine
+ FALSE, // inline fragment
+ 0, // memberDef
+ op->lineno() // show line numbers
+ );
+ if (fd) delete fd;
}
pushEnabled();
m_hide=TRUE;
diff --git a/src/docparser.cpp b/src/docparser.cpp
index f1ac262..6397bb8 100644
--- a/src/docparser.cpp
+++ b/src/docparser.cpp
@@ -112,6 +112,8 @@ static QCString g_includeFileName;
static QCString g_includeFileText;
static uint g_includeFileOffset;
static uint g_includeFileLength;
+static uint g_includeFileLine;
+static bool g_includeFileLineNo;
/** Parser's context to store all global variables.
@@ -143,6 +145,8 @@ struct DocParserContext
QCString includeFileText;
uint includeFileOffset;
uint includeFileLength;
+ uint includeFileLine;
+ bool includeFileLineNo;
TokenInfo *token;
};
@@ -190,6 +194,8 @@ static void docParserPushContext(bool saveParamInfo=TRUE)
ctx->includeFileText = g_includeFileText;
ctx->includeFileOffset = g_includeFileOffset;
ctx->includeFileLength = g_includeFileLength;
+ ctx->includeFileLine = g_includeFileLine;
+ ctx->includeFileLineNo = g_includeFileLineNo;
ctx->token = g_token;
g_token = new TokenInfo;
@@ -228,6 +234,8 @@ static void docParserPopContext(bool keepParamInfo=FALSE)
g_includeFileText = ctx->includeFileText;
g_includeFileOffset = ctx->includeFileOffset;
g_includeFileLength = ctx->includeFileLength;
+ g_includeFileLine = ctx->includeFileLine;
+ g_includeFileLineNo = ctx->includeFileLineNo;
delete g_token;
g_token = ctx->token;
@@ -2004,6 +2012,8 @@ void DocInclude::parse()
DBG(("DocInclude::parse(file=%s,text=%s)\n",qPrint(m_file),qPrint(m_text)));
switch(m_type)
{
+ case DontIncWithLines:
+ // fall through
case IncWithLines:
// fall through
case Include:
@@ -2014,6 +2024,8 @@ void DocInclude::parse()
g_includeFileText = m_text;
g_includeFileOffset = 0;
g_includeFileLength = m_text.length();
+ g_includeFileLine = 0;
+ g_includeFileLineNo = (m_type == DontIncWithLines || m_type == IncWithLines);
//printf("g_includeFile=<<%s>>\n",g_includeFileText.data());
break;
case VerbInclude:
@@ -2052,6 +2064,7 @@ void DocIncOperator::parse()
const char *p = g_includeFileText;
uint l = g_includeFileLength;
uint o = g_includeFileOffset;
+ uint il = g_includeFileLine;
DBG(("DocIncOperator::parse() text=%s off=%d len=%d\n",qPrint(p),o,l));
uint so = o,bo;
bool nonEmpty = FALSE;
@@ -2063,6 +2076,7 @@ void DocIncOperator::parse()
char c = p[o];
if (c=='\n')
{
+ g_includeFileLine++;
if (nonEmpty) break; // we have a pattern to match
so=o+1; // no pattern, skip empty line
}
@@ -2074,10 +2088,12 @@ void DocIncOperator::parse()
}
if (g_includeFileText.mid(so,o-so).find(m_pattern)!=-1)
{
+ m_line = il;
m_text = g_includeFileText.mid(so,o-so);
DBG(("DocIncOperator::parse() Line: %s\n",qPrint(m_text)));
}
g_includeFileOffset = QMIN(l,o+1); // set pointer to start of new line
+ m_lineno = g_includeFileLineNo;
break;
case SkipLine:
while (oincludeFileName().isEmpty())
+ {
+ QFileInfo cfi( op->includeFileName() );
+ fd = createFileDef( cfi.dirPath().utf8(), cfi.fileName().utf8() );
+ }
Doxygen::parserManager->getParser(m_langExt)
->parseCode(
m_ci,
@@ -770,14 +776,15 @@ void HtmlDocVisitor::visit(DocIncOperator *op)
langExt,
op->isExample(),
op->exampleFile(),
- 0, // fileDef
- -1, // startLine
+ fd, // fileDef
+ op->line(), // startLine
-1, // endLine
FALSE, // inline fragment
0, // memberDef
- TRUE, // show line numbers
+ op->lineno(), // show line numbers
m_ctx // search context
);
+ if (fd) delete fd;
}
pushEnabled();
m_hide=TRUE;
diff --git a/src/latexdocvisitor.cpp b/src/latexdocvisitor.cpp
index 008d638..31f05ad 100644
--- a/src/latexdocvisitor.cpp
+++ b/src/latexdocvisitor.cpp
@@ -572,9 +572,24 @@ void LatexDocVisitor::visit(DocIncOperator *op)
popEnabled();
if (!m_hide)
{
+ FileDef *fd;
+ if (!op->includeFileName().isEmpty())
+ {
+ QFileInfo cfi( op->includeFileName() );
+ fd = createFileDef( cfi.dirPath().utf8(), cfi.fileName().utf8() );
+ }
+
Doxygen::parserManager->getParser(m_langExt)
->parseCode(m_ci,op->context(),op->text(),langExt,
- op->isExample(),op->exampleFile());
+ op->isExample(),op->exampleFile(),
+ fd, // fileDef
+ op->line(), // startLine
+ -1, // endLine
+ FALSE, // inline fragment
+ 0, // memberDef
+ op->lineno() // show line numbers
+ );
+ if (fd) delete fd;
}
pushEnabled();
m_hide=TRUE;
diff --git a/src/mandocvisitor.cpp b/src/mandocvisitor.cpp
index df6af42..1c5cfec 100644
--- a/src/mandocvisitor.cpp
+++ b/src/mandocvisitor.cpp
@@ -387,9 +387,24 @@ void ManDocVisitor::visit(DocIncOperator *op)
popEnabled();
if (!m_hide)
{
+ FileDef *fd;
+ if (!op->includeFileName().isEmpty())
+ {
+ QFileInfo cfi( op->includeFileName() );
+ fd = createFileDef( cfi.dirPath().utf8(), cfi.fileName().utf8() );
+ }
+
Doxygen::parserManager->getParser(m_langExt)
->parseCode(m_ci,op->context(),op->text(),langExt,
- op->isExample(),op->exampleFile());
+ op->isExample(),op->exampleFile(),
+ fd, // fileDef
+ op->line(), // startLine
+ -1, // endLine
+ FALSE, // inline fragment
+ 0, // memberDef
+ op->lineno() // show line numbers
+ );
+ if (fd) delete fd;
}
pushEnabled();
m_hide=TRUE;
diff --git a/src/rtfdocvisitor.cpp b/src/rtfdocvisitor.cpp
index afe6dee..00ccc0e 100644
--- a/src/rtfdocvisitor.cpp
+++ b/src/rtfdocvisitor.cpp
@@ -550,9 +550,24 @@ void RTFDocVisitor::visit(DocIncOperator *op)
popEnabled();
if (!m_hide)
{
+ FileDef *fd;
+ if (!op->includeFileName().isEmpty())
+ {
+ QFileInfo cfi( op->includeFileName() );
+ fd = createFileDef( cfi.dirPath().utf8(), cfi.fileName().utf8() );
+ }
+
Doxygen::parserManager->getParser(m_langExt)
->parseCode(m_ci,op->context(),op->text(),langExt,
- op->isExample(),op->exampleFile());
+ op->isExample(),op->exampleFile(),
+ fd, // fileDef
+ op->line(), // startLine
+ -1, // endLine
+ FALSE, // inline fragment
+ 0, // memberDef
+ op->lineno() // show line numbers
+ );
+ if (fd) delete fd;
}
pushEnabled();
m_hide=TRUE;
diff --git a/src/xmldocvisitor.cpp b/src/xmldocvisitor.cpp
index f85a16e..5099f67 100644
--- a/src/xmldocvisitor.cpp
+++ b/src/xmldocvisitor.cpp
@@ -420,10 +420,25 @@ void XmlDocVisitor::visit(DocIncOperator *op)
popEnabled();
if (!m_hide)
{
+ FileDef *fd;
+ if (!op->includeFileName().isEmpty())
+ {
+ QFileInfo cfi( op->includeFileName() );
+ fd = createFileDef( cfi.dirPath().utf8(), cfi.fileName().utf8() );
+ }
+
Doxygen::parserManager->getParser(m_langExt)
->parseCode(m_ci,op->context(),
op->text(),langExt,op->isExample(),
- op->exampleFile());
+ op->exampleFile(),
+ fd, // fileDef
+ op->line(), // startLine
+ -1, // endLine
+ FALSE, // inline fragment
+ 0, // memberDef
+ op->lineno() // show line numbers
+ );
+ if (fd) delete fd;
}
pushEnabled();
m_hide=TRUE;
--
cgit v0.12