diff options
-rw-r--r-- | svtools/inc/svtools/parhtml.hxx | 2 | ||||
-rw-r--r-- | svtools/source/svhtml/parhtml.cxx | 22 |
2 files changed, 20 insertions, 4 deletions
diff --git a/svtools/inc/svtools/parhtml.hxx b/svtools/inc/svtools/parhtml.hxx index f8c0c61729f8..fdfeeab9e4ee 100644 --- a/svtools/inc/svtools/parhtml.hxx +++ b/svtools/inc/svtools/parhtml.hxx @@ -144,6 +144,8 @@ private: sal_uInt32 nPre_LinePos; // Pos in der Line im PRE-Tag + int mnPendingOffToken; ///< OFF token pending for a <XX.../> ON/OFF ON token + String aEndToken; protected: diff --git a/svtools/source/svhtml/parhtml.cxx b/svtools/source/svhtml/parhtml.cxx index 68232e5db2a4..91bae59e65c8 100644 --- a/svtools/source/svhtml/parhtml.cxx +++ b/svtools/source/svhtml/parhtml.cxx @@ -297,7 +297,8 @@ HTMLParser::HTMLParser( SvStream& rIn, bool bReadNewDoc ) : bEndTokenFound(false), bPre_IgnoreNewPara(false), bReadNextChar(false), - bReadComment(false) + bReadComment(false), + mnPendingOffToken(0) { //#i76649, default to UTF-8 for HTML unless we know differently SetSrcEncoding(RTL_TEXTENCODING_UTF8); @@ -1057,6 +1058,15 @@ int HTMLParser::_GetNextToken() int nRet = 0; sSaveToken.Erase(); + if (mnPendingOffToken) + { + // HTML_<TOKEN>_OFF generated for HTML_<TOKEN>_ON + nRet = mnPendingOffToken; + mnPendingOffToken = 0; + aToken.Erase(); + return nRet; + } + // Delete options if (!maOptions.empty()) maOptions.clear(); @@ -1204,10 +1214,14 @@ int HTMLParser::_GetNextToken() ScanText( '>' ); // fdo#34666 fdo#36080 fdo#36390: closing "/>"?: - // return HTML_<TOKEN>_OFF instead of HTML_<TOKEN>_ON + // generate pending HTML_<TOKEN>_OFF for HTML_<TOKEN>_ON + // Do not convert this to a single HTML_<TOKEN>_OFF + // which lead to fdo#56772. if ((HTML_TOKEN_ONOFF & nRet) && (aToken.Len() >= 1) && - ('/' == aToken.GetChar(aToken.Len()-1))) { - ++nRet; // HTML_<TOKEN>_ON -> HTML_<TOKEN>_OFF; + ('/' == aToken.GetChar(aToken.Len()-1))) + { + mnPendingOffToken = nRet + 1; // HTML_<TOKEN>_ON -> HTML_<TOKEN>_OFF + aToken.Erase( aToken.Len()-1, 1); // remove trailing '/' } if( sal_Unicode(EOF) == nNextCh && rInput.IsEof() ) { |