diff options
author | albert-github <albert.tests@gmail.com> | 2018-11-25 15:34:58 (GMT) |
---|---|---|
committer | albert-github <albert.tests@gmail.com> | 2018-11-25 15:34:58 (GMT) |
commit | 1c0a565a28582d0bc0776988ffef16565563e950 (patch) | |
tree | 2ec63650e76e2f1e57bfa1f6eef0d84059e07b52 /src | |
parent | 4c1d17ef7579dabd4db55dc4777185c290edb256 (diff) | |
download | Doxygen-1c0a565a28582d0bc0776988ffef16565563e950.zip Doxygen-1c0a565a28582d0bc0776988ffef16565563e950.tar.gz Doxygen-1c0a565a28582d0bc0776988ffef16565563e950.tar.bz2 |
Incorrect number tag sequence for xhtml with htmlinclude command possible
Analogous to the `\htmlonly` also with the `\htmlinclude` command it is possible that some parts are added that cannot be inside a `<p> ... <\/p>` and thus we have to temporary close (and later reopen) the paragraph.
The option `[block]` has been added to the `\htmlinclude` command (analogous to the `\htmlonly` command).
Problem can be seen with the default doxygen test 30 (`[030_htmlinclude.dox]: test the \htmlinclude command`).
Diffstat (limited to 'src')
-rw-r--r-- | src/docparser.cpp | 11 | ||||
-rw-r--r-- | src/docparser.h | 6 | ||||
-rw-r--r-- | src/doctokenizer.h | 1 | ||||
-rw-r--r-- | src/doctokenizer.l | 13 | ||||
-rw-r--r-- | src/htmldocvisitor.cpp | 7 | ||||
-rw-r--r-- | src/printdocvisitor.h | 5 | ||||
-rw-r--r-- | src/xmldocvisitor.cpp | 9 |
7 files changed, 46 insertions, 6 deletions
diff --git a/src/docparser.cpp b/src/docparser.cpp index 39978de..83f557b 100644 --- a/src/docparser.cpp +++ b/src/docparser.cpp @@ -5238,6 +5238,7 @@ void DocPara::handleInclude(const QCString &cmdName,DocInclude::Type t) { DBG(("handleInclude(%s)\n",qPrint(cmdName))); int tok=doctokenizerYYlex(); + bool isBlock = false; if (tok==TK_WORD && g_token->name=="{") { doctokenizerYYsetStateOptions(); @@ -5262,6 +5263,14 @@ void DocPara::handleInclude(const QCString &cmdName,DocInclude::Type t) } tok=doctokenizerYYlex(); } + else if (tok==TK_WORD && g_token->name=="[") + { + doctokenizerYYsetStateBlock(); + tok=doctokenizerYYlex(); + isBlock = (g_token->name.stripWhiteSpace() == "block"); + doctokenizerYYsetStatePara(); + tok=doctokenizerYYlex(); + } else if (tok!=TK_WHITESPACE) { warn_doc_error(g_fileName,doctokenizerYYlineno,"expected whitespace after %s command", @@ -5320,7 +5329,7 @@ void DocPara::handleInclude(const QCString &cmdName,DocInclude::Type t) } else { - DocInclude *inc = new DocInclude(this,fileName,g_context,t,g_isExample,g_exampleName,blockId); + DocInclude *inc = new DocInclude(this,fileName,g_context,t,g_isExample,g_exampleName,blockId,isBlock); m_children.append(inc); inc->parse(); } diff --git a/src/docparser.h b/src/docparser.h index e98198d..af02758 100644 --- a/src/docparser.h +++ b/src/docparser.h @@ -555,10 +555,10 @@ class DocInclude : public DocNode DocInclude(DocNode *parent,const QCString &file, const QCString context, Type t, bool isExample,const QCString exampleFile, - const QCString blockId) : + const QCString blockId, bool isBlock) : m_file(file), m_context(context), m_type(t), m_isExample(isExample), m_exampleFile(exampleFile), - m_blockId(blockId) { m_parent = parent; } + m_blockId(blockId), m_isBlock(isBlock) { m_parent = parent; } Kind kind() const { return Kind_Include; } QCString file() const { return m_file; } QCString extension() const { int i=m_file.findRev('.'); @@ -573,6 +573,7 @@ class DocInclude : public DocNode QCString blockId() const { return m_blockId; } bool isExample() const { return m_isExample; } QCString exampleFile() const { return m_exampleFile; } + bool isBlock() const { return m_isBlock; } void accept(DocVisitor *v) { v->visit(this); } void parse(); @@ -582,6 +583,7 @@ class DocInclude : public DocNode QCString m_text; Type m_type; bool m_isExample; + bool m_isBlock; QCString m_exampleFile; QCString m_blockId; }; diff --git a/src/doctokenizer.h b/src/doctokenizer.h index f510c33..d72a674 100644 --- a/src/doctokenizer.h +++ b/src/doctokenizer.h @@ -166,5 +166,6 @@ void doctokenizerYYsetStatePlantUML(); void doctokenizerYYsetStateSetScope(); void doctokenizerYYsetStatePlantUMLOpt(); void doctokenizerYYsetStateOptions(); +void doctokenizerYYsetStateBlock(); #endif diff --git a/src/doctokenizer.l b/src/doctokenizer.l index f50b9ae..dd2c183 100644 --- a/src/doctokenizer.l +++ b/src/doctokenizer.l @@ -455,6 +455,7 @@ REFWORD_NOCV {FILEMASK}|{LABELID}|{REFWORD2_NOCV}|{REFWORD3}|{REFWORD4_NOCV} %x St_SetScope %x St_SetScopeEnd %x St_Options +%x St_Block %x St_Sections %s St_SecLabel1 @@ -1219,6 +1220,12 @@ REFWORD_NOCV {FILEMASK}|{LABELID}|{REFWORD2_NOCV}|{REFWORD3}|{REFWORD4_NOCV} <St_Options>"}" { return TK_WORD; } +<St_Block>{ID} { + g_token->name+=yytext; + } +<St_Block>"]" { + return TK_WORD; + } <St_File>{FILEMASK} { g_token->name = yytext; return TK_WORD; @@ -1587,6 +1594,12 @@ void doctokenizerYYsetStateOptions() BEGIN(St_Options); } +void doctokenizerYYsetStateBlock() +{ + g_token->name=""; + BEGIN(St_Block); +} + void doctokenizerYYcleanup() { yy_delete_buffer( YY_CURRENT_BUFFER ); diff --git a/src/htmldocvisitor.cpp b/src/htmldocvisitor.cpp index e1ac6d6..130bbae 100644 --- a/src/htmldocvisitor.cpp +++ b/src/htmldocvisitor.cpp @@ -608,7 +608,12 @@ void HtmlDocVisitor::visit(DocInclude *inc) case DocInclude::DontInclude: break; case DocInclude::HtmlInclude: - m_t << inc->text(); + { + bool forced = false; + if (inc->isBlock()) forced = forceEndParagraph(inc); + m_t << inc->text(); + if (inc->isBlock()) forceStartParagraph(inc, forced); + } break; case DocInclude::LatexInclude: break; diff --git a/src/printdocvisitor.h b/src/printdocvisitor.h index 17d938e..4275300 100644 --- a/src/printdocvisitor.h +++ b/src/printdocvisitor.h @@ -187,7 +187,10 @@ class PrintDocVisitor : public DocVisitor case DocInclude::Include: printf("include"); break; case DocInclude::IncWithLines: printf("incwithlines"); break; case DocInclude::DontInclude: printf("dontinclude"); break; - case DocInclude::HtmlInclude: printf("htmlinclude"); break; + case DocInclude::HtmlInclude: + printf("htmlinclude"); + if (inc->isBlock()) printf(" block=\"yes\""); + break; case DocInclude::LatexInclude: printf("latexinclude"); break; case DocInclude::VerbInclude: printf("verbinclude"); break; case DocInclude::Snippet: printf("snippet"); break; diff --git a/src/xmldocvisitor.cpp b/src/xmldocvisitor.cpp index 4aa81ca..24e52cf 100644 --- a/src/xmldocvisitor.cpp +++ b/src/xmldocvisitor.cpp @@ -329,7 +329,14 @@ void XmlDocVisitor::visit(DocInclude *inc) case DocInclude::DontInclude: break; case DocInclude::HtmlInclude: - m_t << "<htmlonly>"; + if (inc->isBlock()) + { + m_t << "<htmlonly block=\"yes\">"; + } + else + { + m_t << "<htmlonly>"; + } filter(inc->text()); m_t << "</htmlonly>"; break; |