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