From 842c816a31537e32cec376c85c0a4363f74d7a54 Mon Sep 17 00:00:00 2001
From: Dimitri van Heesch
Date: Sat, 29 Mar 2014 19:36:56 +0100
Subject: Added optional [block] option to \htmlonly
---
doc/commands.doc | 15 ++++++++++-----
doc/install.doc | 2 +-
src/docparser.cpp | 16 ++++++++--------
src/docparser.h | 4 +++-
src/doctokenizer.l | 12 +++++++++++-
src/htmldocvisitor.cpp | 4 +++-
src/latexdocvisitor.cpp | 2 +-
testing/020/indexpage.xml | 2 ++
testing/020_only.dox | 3 +++
9 files changed, 42 insertions(+), 18 deletions(-)
diff --git a/doc/commands.doc b/doc/commands.doc
index 93a388b..4c3c2fc 100644
--- a/doc/commands.doc
+++ b/doc/commands.doc
@@ -2729,7 +2729,7 @@ class Receiver
\sa section \ref cmdfcurlyopen "\\f{" and section \ref formulas "formulas".
-\section cmdhtmlonly \\htmlonly
+\section cmdhtmlonly \\htmlonly ["[block]"]
\addindex \\htmlonly
Starts a block of text that will be verbatim included in the
@@ -2738,12 +2738,17 @@ class Receiver
This command can be used to include HTML code that is too complex
for doxygen (i.e. applets, java-scripts, and HTML tags that
- require attributes). You can use the \ref cmdlatexonly "\\latexonly" and
- \ref cmdendlatexonly "\\endlatexonly"
- pair to provide a proper \f$\mbox{\LaTeX}\f$ alternative.
+ require specific attributes).
+
+ Normally the contents between \ref cmdhtmlonly "\\htmlonly" and
+ \ref cmdendhtmlonly "\\endhtmlonly" is inserted as-is. When you
+ want to insert a HTML fragment that has block scope like a table or list
+ which should appear outside \..\
, this can lead to invalid HTML.
+ You can use \\htmlonly[block] to make doxygen
+ end the current paragraph and restart it after \\endhtmlonly.
\note environment variables (like \$(HOME) ) are resolved inside a
- HTML-only block.
+ HTML-only block.
\sa section \ref cmdmanonly "\\manonly",
\ref cmdlatexonly "\\latexonly",
diff --git a/doc/install.doc b/doc/install.doc
index 150ff55..839b845 100644
--- a/doc/install.doc
+++ b/doc/install.doc
@@ -21,7 +21,7 @@
First go to the
download page
-to get the latest distribution, if you did not downloaded doxygen already.
+to get the latest distribution, if you have not downloaded doxygen already.
\section install_src_unix Compiling from source on UNIX
diff --git a/src/docparser.cpp b/src/docparser.cpp
index 8465039..3f7a8bc 100644
--- a/src/docparser.cpp
+++ b/src/docparser.cpp
@@ -1320,7 +1320,7 @@ reparsetoken:
{
doctokenizerYYsetStateHtmlOnly();
tok = doctokenizerYYlex();
- children.append(new DocVerbatim(parent,g_context,g_token->verb,DocVerbatim::HtmlOnly,g_isExample,g_exampleName));
+ children.append(new DocVerbatim(parent,g_context,g_token->verb,DocVerbatim::HtmlOnly,g_isExample,g_exampleName,g_token->name=="block"));
if (tok==0) warn_doc_error(g_fileName,doctokenizerYYlineno,"htmlonly section ended without end marker");
doctokenizerYYsetStatePara();
}
@@ -1745,12 +1745,12 @@ DocAnchor::DocAnchor(DocNode *parent,const QCString &id,bool newAnchor)
DocVerbatim::DocVerbatim(DocNode *parent,const QCString &context,
const QCString &text, Type t,bool isExample,
- const QCString &exampleFile,const QCString &lang)
+ const QCString &exampleFile,bool isBlock,const QCString &lang)
: m_context(context), m_text(text), m_type(t),
- m_isExample(isExample), m_exampleFile(exampleFile),
- m_relPath(g_relPath), m_lang(lang)
-{
- m_parent = parent;
+ m_isExample(isExample), m_exampleFile(exampleFile),
+ m_relPath(g_relPath), m_lang(lang), m_isBlock(isBlock)
+{
+ m_parent = parent;
}
@@ -5280,7 +5280,7 @@ int DocPara::handleStartCode()
if (g_token->verb.at(i)=='\n') li=i+1;
i++;
}
- m_children.append(new DocVerbatim(this,g_context,stripIndentation(g_token->verb.mid(li)),DocVerbatim::Code,g_isExample,g_exampleName,lang));
+ m_children.append(new DocVerbatim(this,g_context,stripIndentation(g_token->verb.mid(li)),DocVerbatim::Code,g_isExample,g_exampleName,FALSE,lang));
if (retval==0) warn_doc_error(g_fileName,doctokenizerYYlineno,"code section ended without end marker");
doctokenizerYYsetStatePara();
return retval;
@@ -5468,7 +5468,7 @@ int DocPara::handleCommand(const QCString &cmdName)
{
doctokenizerYYsetStateHtmlOnly();
retval = doctokenizerYYlex();
- m_children.append(new DocVerbatim(this,g_context,g_token->verb,DocVerbatim::HtmlOnly,g_isExample,g_exampleName));
+ m_children.append(new DocVerbatim(this,g_context,g_token->verb,DocVerbatim::HtmlOnly,g_isExample,g_exampleName,g_token->name=="block"));
if (retval==0) warn_doc_error(g_fileName,doctokenizerYYlineno,"htmlonly section ended without end marker");
doctokenizerYYsetStatePara();
}
diff --git a/src/docparser.h b/src/docparser.h
index a6d9fc0..b37a4a5 100644
--- a/src/docparser.h
+++ b/src/docparser.h
@@ -436,7 +436,7 @@ class DocVerbatim : public DocNode
enum Type { Code, HtmlOnly, ManOnly, LatexOnly, RtfOnly, XmlOnly, Verbatim, Dot, Msc, DocbookOnly };
DocVerbatim(DocNode *parent,const QCString &context,
const QCString &text, Type t,bool isExample,
- const QCString &exampleFile,const QCString &lang=QCString());
+ const QCString &exampleFile,bool isBlock=FALSE,const QCString &lang=QCString());
Kind kind() const { return Kind_Verbatim; }
Type type() const { return m_type; }
QCString text() const { return m_text; }
@@ -446,6 +446,7 @@ class DocVerbatim : public DocNode
QCString exampleFile() const { return m_exampleFile; }
QCString relPath() const { return m_relPath; }
QCString language() const { return m_lang; }
+ bool isBlock() const { return m_isBlock; }
private:
QCString m_context;
@@ -455,6 +456,7 @@ class DocVerbatim : public DocNode
QCString m_exampleFile;
QCString m_relPath;
QCString m_lang;
+ bool m_isBlock;
};
diff --git a/src/doctokenizer.l b/src/doctokenizer.l
index 7ebe7d3..cf6d2ee 100644
--- a/src/doctokenizer.l
+++ b/src/doctokenizer.l
@@ -406,6 +406,7 @@ REFWORD {LABELID}|{REFWORD2}|{REFWORD3}|{LNKWORD2}
%x St_CodeOpt
%x St_XmlCode
%x St_HtmlOnly
+%x St_HtmlOnlyOption
%x St_ManOnly
%x St_LatexOnly
%x St_RtfOnly
@@ -767,6 +768,14 @@ REFWORD {LABELID}|{REFWORD2}|{REFWORD3}|{LNKWORD2}
. {
g_token->verb+=yytext;
}
+" [block]" { // the space is added in commentscan.l
+ g_token->name="block";
+ BEGIN(St_HtmlOnly);
+ }
+.|\n {
+ unput(*yytext);
+ BEGIN(St_HtmlOnly);
+ }
{CMD}"endhtmlonly" {
return RetVal_OK;
}
@@ -1255,7 +1264,8 @@ void doctokenizerYYsetStateXmlCode()
void doctokenizerYYsetStateHtmlOnly()
{
g_token->verb="";
- BEGIN(St_HtmlOnly);
+ g_token->name="";
+ BEGIN(St_HtmlOnlyOption);
}
void doctokenizerYYsetStateManOnly()
diff --git a/src/htmldocvisitor.cpp b/src/htmldocvisitor.cpp
index 9d6b069..fe2e591 100644
--- a/src/htmldocvisitor.cpp
+++ b/src/htmldocvisitor.cpp
@@ -357,7 +357,9 @@ void HtmlDocVisitor::visit(DocVerbatim *s)
forceStartParagraph(s);
break;
case DocVerbatim::HtmlOnly:
+ if (s->isBlock()) forceEndParagraph(s);
m_t << s->text();
+ if (s->isBlock()) forceStartParagraph(s);
break;
case DocVerbatim::ManOnly:
case DocVerbatim::LatexOnly:
@@ -1999,7 +2001,7 @@ void HtmlDocVisitor::forceEndParagraph(DocNode *n)
//printf("forceEnd first=%d last=%d\n",isFirst,isLast);
if (isFirst && isLast) return;
- m_t << "
" << endl;
+ m_t << "";
}
}
diff --git a/src/latexdocvisitor.cpp b/src/latexdocvisitor.cpp
index 7b0420a..441b697 100644
--- a/src/latexdocvisitor.cpp
+++ b/src/latexdocvisitor.cpp
@@ -175,7 +175,7 @@ void LatexDocVisitor::visit(DocURL *u)
void LatexDocVisitor::visit(DocLineBreak *)
{
if (m_hide) return;
- m_t << "\\newline\n";
+ m_t << "~\\newline\n";
}
void LatexDocVisitor::visit(DocHorRuler *)
diff --git a/testing/020/indexpage.xml b/testing/020/indexpage.xml
index d5bccda..87ceb53 100644
--- a/testing/020/indexpage.xml
+++ b/testing/020/indexpage.xml
@@ -6,6 +6,8 @@
Text.
HTML
+
+HTML with block
RTF
diff --git a/testing/020_only.dox b/testing/020_only.dox
index be21136..f8e2ce1 100644
--- a/testing/020_only.dox
+++ b/testing/020_only.dox
@@ -5,6 +5,9 @@
* \htmlonly
* HTML
* \endhtmlonly
+ * \htmlonly[block]
+ * HTML with block
+ * \endhtmlonly
* \rtfonly
* RTF
* \endrtfonly
--
cgit v0.12