sw/qa/extras/htmlexport/data/reqif-chinese.odt |binary sw/qa/extras/htmlexport/htmlexport.cxx | 22 ++++++++++++++++++++++ sw/source/filter/html/htmlatr.cxx | 10 +++++----- sw/source/filter/html/htmlbas.cxx | 3 ++- sw/source/filter/html/htmlfldw.cxx | 5 ++--- sw/source/filter/html/htmlflywriter.cxx | 2 +- sw/source/filter/html/htmlforw.cxx | 6 +++--- sw/source/filter/html/htmlftn.cxx | 4 ++-- sw/source/filter/html/wrthtml.cxx | 4 ++-- sw/source/filter/html/wrthtml.hxx | 2 +- 10 files changed, 40 insertions(+), 18 deletions(-)
New commits: commit ed3d2080f011a934541d7e6202b76fec3ddcac61 Author: Miklos Vajna <vmik...@collabora.com> AuthorDate: Mon Jan 13 17:07:34 2020 +0100 Commit: Miklos Vajna <vmik...@collabora.com> CommitDate: Tue Jan 14 10:44:53 2020 +0100 sw reqif-xhtml export: fix non-well-formed output on Chinese text And also search for the '"<" OOO_something' pattern, and fix up all cases where we forgot to call GetNamespace() when opening an element. (cherry picked from commit 186ef501a305d452da1f36aa51106dba181dc324) Conflicts: sw/source/filter/html/htmlbas.cxx sw/source/filter/html/htmlfldw.cxx sw/source/filter/html/htmlflywriter.cxx sw/source/filter/html/htmlforw.cxx sw/source/filter/html/htmlftn.cxx sw/source/filter/html/wrthtml.cxx Change-Id: I015e807c1ad0f96c7c4aaa97f7f61ae134cf3754 diff --git a/sw/qa/extras/htmlexport/data/reqif-chinese.odt b/sw/qa/extras/htmlexport/data/reqif-chinese.odt new file mode 100644 index 000000000000..b99c57caee10 Binary files /dev/null and b/sw/qa/extras/htmlexport/data/reqif-chinese.odt differ diff --git a/sw/qa/extras/htmlexport/htmlexport.cxx b/sw/qa/extras/htmlexport/htmlexport.cxx index 91a20f9c0ab1..47288ae65ced 100644 --- a/sw/qa/extras/htmlexport/htmlexport.cxx +++ b/sw/qa/extras/htmlexport/htmlexport.cxx @@ -781,6 +781,28 @@ CPPUNIT_TEST_FIXTURE(SwHtmlDomExportTest, testRTFOLEMimeType) aType); } +CPPUNIT_TEST_FIXTURE(SwHtmlDomExportTest, testChinese) +{ + // Load a document with Chinese text in it. + OUString aURL = m_directories.getURLFromSrc(DATA_DIRECTORY) + "reqif-chinese.odt"; + mxComponent = loadFromDesktop(aURL, "com.sun.star.text.TextDocument", {}); + + // Export it. + uno::Reference<frame::XStorable> xStorable(mxComponent, uno::UNO_QUERY); + uno::Sequence<beans::PropertyValue> aStoreProperties = { + comphelper::makePropertyValue("FilterName", OUString("HTML (StarWriter)")), + comphelper::makePropertyValue("FilterOptions", OUString("xhtmlns=reqif-xhtml")), + }; + xStorable->storeToURL(maTempFile.GetURL(), aStoreProperties); + SvMemoryStream aStream; + HtmlExportTest::wrapFragment(maTempFile, aStream); + xmlDocPtr pDoc = parseXmlStream(&aStream); + + // Without the accompanying fix in place, this test would have failed as the output was not + // well-formed. + CPPUNIT_ASSERT(pDoc); +} + CPPUNIT_PLUGIN_IMPLEMENT(); /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sw/source/filter/html/htmlatr.cxx b/sw/source/filter/html/htmlatr.cxx index e9764e79c0b5..807396ace498 100644 --- a/sw/source/filter/html/htmlatr.cxx +++ b/sw/source/filter/html/htmlatr.cxx @@ -780,7 +780,7 @@ void OutHTML_SwFormat( Writer& rWrt, const SwFormat& rFormat, // The align=... attribute does behave strange in netscape // if there are controls in a paragraph, because the control and // all text behind the control does not recognize this attribute. - OString sOut = "<" OOO_STRING_SVTOOLS_HTML_division; + OString sOut = "<" + rHWrt.GetNamespace() + OOO_STRING_SVTOOLS_HTML_division; rWrt.Strm().WriteOString( sOut ); rHWrt.m_bTextAttr = false; @@ -2652,7 +2652,7 @@ static Writer& OutHTML_SvxColor( Writer& rWrt, const SfxPoolItem& rHt ) } else { - OString sOut = "<" OOO_STRING_SVTOOLS_HTML_font " " + OString sOut = "<" + rHTMLWrt.GetNamespace() + OOO_STRING_SVTOOLS_HTML_font " " OOO_STRING_SVTOOLS_HTML_O_color "="; rWrt.Strm().WriteOString( sOut ); HTMLOutFuncs::Out_Color( rWrt.Strm(), aColor ).WriteChar( '>' ); @@ -2712,7 +2712,7 @@ static Writer& OutHTML_SvxFont( Writer& rWrt, const SfxPoolItem& rHt ) } else { - OString sOut = "<" OOO_STRING_SVTOOLS_HTML_font " " + OString sOut = "<" + rHTMLWrt.GetNamespace() + OOO_STRING_SVTOOLS_HTML_font " " OOO_STRING_SVTOOLS_HTML_O_face "=\""; rWrt.Strm().WriteOString( sOut ); HTMLOutFuncs::Out_String( rWrt.Strm(), aNames, rHTMLWrt.m_eDestEnc, &rHTMLWrt.m_aNonConvertableCharacters ) @@ -2752,7 +2752,7 @@ static Writer& OutHTML_SvxFontHeight( Writer& rWrt, const SfxPoolItem& rHt ) } else { - OString sOut = "<" OOO_STRING_SVTOOLS_HTML_font; + OString sOut = "<" + rHTMLWrt.GetNamespace() + OOO_STRING_SVTOOLS_HTML_font; sal_uInt32 nHeight = static_cast<const SvxFontHeightItem&>(rHt).GetHeight(); sal_uInt16 nSize = rHTMLWrt.GetHTMLFontSize( nHeight ); @@ -2792,7 +2792,7 @@ static Writer& OutHTML_SvxLanguage( Writer& rWrt, const SfxPoolItem& rHt ) if( rHTMLWrt.m_bTagOn ) { - OString sOut = "<" OOO_STRING_SVTOOLS_HTML_span; + OString sOut = "<" + rHTMLWrt.GetNamespace() + OOO_STRING_SVTOOLS_HTML_span; rWrt.Strm().WriteOString( sOut ); rHTMLWrt.OutLanguage( static_cast<const SvxLanguageItem &>(rHt).GetLanguage() ); rWrt.Strm().WriteChar( '>' ); diff --git a/sw/source/filter/html/htmlbas.cxx b/sw/source/filter/html/htmlbas.cxx index 2626291fb236..b7aa565dfac0 100644 --- a/sw/source/filter/html/htmlbas.cxx +++ b/sw/source/filter/html/htmlbas.cxx @@ -254,7 +254,7 @@ void SwHTMLParser::InsertBasicDocEvent( const OUString& aEvent, const OUString& pDocSh ); } -void SwHTMLWriter::OutBasic() +void SwHTMLWriter::OutBasic(SwHTMLWriter & rHTMLWrt) { #if HAVE_FEATURE_SCRIPTING if( !m_bCfgStarBasic ) @@ -285,6 +285,7 @@ void SwHTMLWriter::OutBasic() OutNewLine(); OStringBuffer sOut; sOut.append('<').append(OOO_STRING_SVTOOLS_HTML_meta) + .append(rHTMLWrt.GetNamespace()) .append(' ').append(OOO_STRING_SVTOOLS_HTML_O_httpequiv) .append("=\"") .append(OOO_STRING_SVTOOLS_HTML_META_content_script_type) diff --git a/sw/source/filter/html/htmlfldw.cxx b/sw/source/filter/html/htmlfldw.cxx index dfa4ae71bb3a..68527d90807a 100644 --- a/sw/source/filter/html/htmlfldw.cxx +++ b/sw/source/filter/html/htmlfldw.cxx @@ -443,6 +443,7 @@ static Writer& OutHTML_SwField( Writer& rWrt, const SwField* pField, Writer& OutHTML_SwFormatField( Writer& rWrt, const SfxPoolItem& rHt ) { + SwHTMLWriter& rHTMLWrt = static_cast<SwHTMLWriter&>(rWrt); const SwFormatField & rField = static_cast<const SwFormatField&>(rHt); const SwField* pField = rField.GetField(); const SwFieldType* pFieldTyp = pField->GetTyp(); @@ -510,7 +511,7 @@ Writer& OutHTML_SwFormatField( Writer& rWrt, const SfxPoolItem& rHt ) OUString sComment(convertLineEnd(rComment, GetSystemLineEnd())); OStringBuffer sOut; // TODO: ??? - sOut.append('<').append(OOO_STRING_SVTOOLS_HTML_comment) + sOut.append('<').append(rHTMLWrt.GetNamespace()).append(OOO_STRING_SVTOOLS_HTML_comment) .append(' ').append(OUStringToOString(sComment, static_cast<SwHTMLWriter&>(rWrt).m_eDestEnc)).append(" -->"); rWrt.Strm().WriteCharPtr( sOut.getStr() ); @@ -518,7 +519,6 @@ Writer& OutHTML_SwFormatField( Writer& rWrt, const SfxPoolItem& rHt ) } else if( SwFieldIds::Script == pFieldTyp->Which() ) { - SwHTMLWriter& rHTMLWrt = static_cast<SwHTMLWriter&>(rWrt); if( rHTMLWrt.m_bLFPossible ) rHTMLWrt.OutNewLine( true ); @@ -544,7 +544,6 @@ Writer& OutHTML_SwFormatField( Writer& rWrt, const SfxPoolItem& rHt ) OSL_ENSURE( pTextField, "Where is the txt fld?" ); if( pTextField ) { - SwHTMLWriter& rHTMLWrt = static_cast<SwHTMLWriter&>(rWrt); // ReqIF-XHTML doesn't allow specifying a background color. bool bFieldShadings = SwViewOption::IsFieldShadings() && !rHTMLWrt.mbReqIF; if (bFieldShadings) diff --git a/sw/source/filter/html/htmlflywriter.cxx b/sw/source/filter/html/htmlflywriter.cxx index 6725f12cd809..60cb3ebe311d 100644 --- a/sw/source/filter/html/htmlflywriter.cxx +++ b/sw/source/filter/html/htmlflywriter.cxx @@ -1659,7 +1659,7 @@ static Writer& OutHTML_FrameFormatAsSpacer( Writer& rWrt, const SwFrameFormat& r rHTMLWrt.OutNewLine( true ); OStringBuffer sOut; - sOut.append('<').append(OOO_STRING_SVTOOLS_HTML_spacer).append(' ') + sOut.append('<').append(rHTMLWrt.GetNamespace()).append(OOO_STRING_SVTOOLS_HTML_spacer).append(' ') .append(OOO_STRING_SVTOOLS_HTML_O_type).append("=\"") .append(OOO_STRING_SVTOOLS_HTML_SPTYPE_block).append("\""); rWrt.Strm().WriteCharPtr( sOut.makeStringAndClear().getStr() ); diff --git a/sw/source/filter/html/htmlforw.cxx b/sw/source/filter/html/htmlforw.cxx index 97cf96ef90cc..b1e1bd5db0ac 100644 --- a/sw/source/filter/html/htmlforw.cxx +++ b/sw/source/filter/html/htmlforw.cxx @@ -449,7 +449,7 @@ void SwHTMLWriter::OutForm( bool bOn, // die neue Form wird geoeffnet if( m_bLFPossible ) OutNewLine(); - OString sOut = "<" OOO_STRING_SVTOOLS_HTML_form; + OString sOut = "<" + GetNamespace() + OOO_STRING_SVTOOLS_HTML_form; uno::Reference< beans::XPropertySet > xFormPropSet( rFormComps, uno::UNO_QUERY ); @@ -578,7 +578,7 @@ void SwHTMLWriter::OutHiddenControls( { if( m_bLFPossible ) OutNewLine( true ); - OString sOut = "<" OOO_STRING_SVTOOLS_HTML_input " " + OString sOut = "<" + GetNamespace() + OOO_STRING_SVTOOLS_HTML_input " " OOO_STRING_SVTOOLS_HTML_O_type "=\"" OOO_STRING_SVTOOLS_HTML_IT_hidden "\""; @@ -1207,7 +1207,7 @@ Writer& OutHTML_DrawFrameFormatAsControl( Writer& rWrt, nSel++; rHTMLWrt.OutNewLine(); // jede Option bekommt eine eigene Zeile - sOut = "<" OOO_STRING_SVTOOLS_HTML_option; + sOut = "<" + rHTMLWrt.GetNamespace() + OOO_STRING_SVTOOLS_HTML_option; if( !sVal.isEmpty() || bEmptyVal ) { sOut += " " OOO_STRING_SVTOOLS_HTML_O_value "=\""; diff --git a/sw/source/filter/html/htmlftn.cxx b/sw/source/filter/html/htmlftn.cxx index 614505f8416e..82dfb51cdb63 100644 --- a/sw/source/filter/html/htmlftn.cxx +++ b/sw/source/filter/html/htmlftn.cxx @@ -352,7 +352,7 @@ void SwHTMLWriter::OutFootEndNotes() if( m_bLFPossible ) OutNewLine(); OStringBuffer sOut; - sOut.append('<').append(OOO_STRING_SVTOOLS_HTML_division) + sOut.append('<').append(GetNamespace()).append(OOO_STRING_SVTOOLS_HTML_division) .append(' ').append(OOO_STRING_SVTOOLS_HTML_O_id).append("=\""); Strm().WriteCharPtr( sOut.makeStringAndClear().getStr() ); HTMLOutFuncs::Out_String( Strm(), sFootnoteName, m_eDestEnc, &m_aNonConvertableCharacters ); @@ -530,7 +530,7 @@ static void lcl_html_outFootEndNoteInfo( Writer& rWrt, OUString *pParts, rHTMLWrt.OutNewLine(); OStringBuffer sOut; - sOut.append('<').append(OOO_STRING_SVTOOLS_HTML_meta).append(' ') + sOut.append('<').append(rHTMLWrt.GetNamespace()).append(OOO_STRING_SVTOOLS_HTML_meta).append(' ') .append(OOO_STRING_SVTOOLS_HTML_O_name).append("=\"").append(pName) .append("\" ").append(OOO_STRING_SVTOOLS_HTML_O_content).append("=\""); rWrt.Strm().WriteCharPtr( sOut.makeStringAndClear().getStr() ); diff --git a/sw/source/filter/html/wrthtml.cxx b/sw/source/filter/html/wrthtml.cxx index 79f7e0822c14..492eced82a07 100644 --- a/sw/source/filter/html/wrthtml.cxx +++ b/sw/source/filter/html/wrthtml.cxx @@ -420,7 +420,7 @@ sal_uLong SwHTMLWriter::WriteStream() &m_aNonConvertableCharacters ); OStringBuffer sOut; - sOut.append('<').append(OOO_STRING_SVTOOLS_HTML_division) + sOut.append('<').append(GetNamespace()).append(OOO_STRING_SVTOOLS_HTML_division) .append(' ').append(OOO_STRING_SVTOOLS_HTML_O_id) .append("=\"").append(aName).append('\"').append('>') .append(aStartTags); @@ -1072,7 +1072,7 @@ const SwPageDesc *SwHTMLWriter::MakeHeader( sal_uInt16 &rHeaderAttrs ) // and now ... the BASIC and JavaScript! if( pDoc->GetDocShell() ) // only with DocShell BASIC is possible - OutBasic(); + OutBasic(*this); DecIndentLevel(); // indent content of <HEAD> OutNewLine(); diff --git a/sw/source/filter/html/wrthtml.hxx b/sw/source/filter/html/wrthtml.hxx index ed81edd7be62..a3fc7a115b34 100644 --- a/sw/source/filter/html/wrthtml.hxx +++ b/sw/source/filter/html/wrthtml.hxx @@ -447,7 +447,7 @@ public: void OutFootEndNoteSym( const SwFormatFootnote& rFormatFootnote, const OUString& rNum, sal_uInt16 nScript ); - void OutBasic(); + void OutBasic(SwHTMLWriter& rHTMLWrt); void OutAndSetDefList( sal_uInt16 nNewLvl ); _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits