diff options
author | Miklos Vajna <vmiklos@collabora.co.uk> | 2018-03-09 15:14:36 +0100 |
---|---|---|
committer | Miklos Vajna <vmiklos@collabora.co.uk> | 2018-03-09 16:08:33 +0100 |
commit | 68c542cfa888f1aa03a08bfc13163c0f2f0c3a75 (patch) | |
tree | bfa1be24619c29a4ceed4a60c6b7617aa308b9f1 | |
parent | c5dd01c426c4a46d7fd00aaa85fe05414bb0ba2b (diff) |
sw XHTML import: PNG <object> is an image
The previous scheme was:
<object data="..." type="...">
<object data="..." type="image/png">alternate text</object>
</object>
Support also the case when the inner <object> is standalone, like:
<object data="..." type="image/png">alternate text</object>
Change-Id: I2dec2770ee3c1c538bcf26f6ff12c6e8f5969563
Reviewed-on: https://gerrit.libreoffice.org/51003
Reviewed-by: Miklos Vajna <vmiklos@collabora.co.uk>
Tested-by: Jenkins <ci@libreoffice.org>
-rw-r--r-- | sw/qa/extras/htmlexport/data/reqif-png-img.xhtml | 4 | ||||
-rw-r--r-- | sw/qa/extras/htmlexport/htmlexport.cxx | 9 | ||||
-rw-r--r-- | sw/source/filter/html/htmlgrin.cxx | 13 | ||||
-rw-r--r-- | sw/source/filter/html/htmlplug.cxx | 20 | ||||
-rw-r--r-- | sw/source/filter/html/swhtml.cxx | 3 | ||||
-rw-r--r-- | sw/source/filter/html/swhtml.hxx | 2 |
6 files changed, 41 insertions, 10 deletions
diff --git a/sw/qa/extras/htmlexport/data/reqif-png-img.xhtml b/sw/qa/extras/htmlexport/data/reqif-png-img.xhtml new file mode 100644 index 000000000000..f31795e35224 --- /dev/null +++ b/sw/qa/extras/htmlexport/data/reqif-png-img.xhtml @@ -0,0 +1,4 @@ +<reqif-xhtml:div><reqif-xhtml:br/> + <reqif-xhtml:object data="reqif-ole-img.png" type="image/png">OLE Object</reqif-xhtml:object> +</reqif-xhtml:div> + diff --git a/sw/qa/extras/htmlexport/htmlexport.cxx b/sw/qa/extras/htmlexport/htmlexport.cxx index f65b0014e799..1fcb66d5e4b7 100644 --- a/sw/qa/extras/htmlexport/htmlexport.cxx +++ b/sw/qa/extras/htmlexport/htmlexport.cxx @@ -402,6 +402,15 @@ DECLARE_HTMLEXPORT_ROUNDTRIP_TEST(testReqIfOleImg, "reqif-ole-img.xhtml") CPPUNIT_ASSERT_EQUAL(OUString("OLE Object"), getProperty<OUString>(xObject, "Title").trim()); } +DECLARE_HTMLEXPORT_ROUNDTRIP_TEST(testReqIfPngImg, "reqif-png-img.xhtml") +{ + uno::Reference<container::XNamed> xShape(getShape(1), uno::UNO_QUERY); + CPPUNIT_ASSERT(xShape.is()); + + // This was Object1, PNG without fallback was imported as OLE object. + CPPUNIT_ASSERT_EQUAL(OUString("Image1"), xShape->getName()); +} + CPPUNIT_PLUGIN_IMPLEMENT(); /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sw/source/filter/html/htmlgrin.cxx b/sw/source/filter/html/htmlgrin.cxx index 3c6d5022bfc0..dfa5f63976a4 100644 --- a/sw/source/filter/html/htmlgrin.cxx +++ b/sw/source/filter/html/htmlgrin.cxx @@ -306,6 +306,7 @@ void SwHTMLParser::InsertImage() // and now analyze OUString sAltNm, aId, aClass, aStyle, aMap, sHTMLGrfName; OUString sGrfNm; + OUString aGraphicData; sal_Int16 eVertOri = text::VertOrientation::TOP; sal_Int16 eHoriOri = text::HoriOrientation::NONE; bool bWidthProvided=false, bHeightProvided=false; @@ -344,6 +345,11 @@ void SwHTMLParser::InsertImage() if( !InternalImgToPrivateURL(sGrfNm) ) sGrfNm = INetURLObject::GetAbsURL( m_sBaseURL, sGrfNm ); break; + case HtmlOptionId::DATA: + aGraphicData = rOption.GetString(); + if (!InternalImgToPrivateURL(aGraphicData)) + aGraphicData = INetURLObject::GetAbsURL(m_sBaseURL, aGraphicData); + break; case HtmlOptionId::ALIGN: eVertOri = rOption.GetEnum( aHTMLImgVAlignTable, @@ -427,6 +433,9 @@ IMAGE_SETEVENT: } } + if (sGrfNm.isEmpty() && !aGraphicData.isEmpty()) + sGrfNm = aGraphicData; + if( sGrfNm.isEmpty() ) return; @@ -469,8 +478,10 @@ IMAGE_SETEVENT: sGrfNm.clear(); } } - else if (m_sBaseURL.isEmpty()) // sBaseURL is empty if the source is clipboard + else if (m_sBaseURL.isEmpty() || !aGraphicData.isEmpty()) { + // sBaseURL is empty if the source is clipboard + // aGraphicData is non-empty for <object data="..."> -> not a linked graphic. if (ERRCODE_NONE == GraphicFilter::GetGraphicFilter().ImportGraphic(aGraphic, aGraphicURL)) sGrfNm.clear(); } diff --git a/sw/source/filter/html/htmlplug.cxx b/sw/source/filter/html/htmlplug.cxx index 7ad6b589e2b3..8f39db95bbb4 100644 --- a/sw/source/filter/html/htmlplug.cxx +++ b/sw/source/filter/html/htmlplug.cxx @@ -293,7 +293,7 @@ void SwHTMLParser::SetSpace( const Size& rPixSpace, } } -void SwHTMLParser::InsertEmbed() +bool SwHTMLParser::InsertEmbed() { OUString aURL, aType, aName, aAlt, aId, aStyle, aClass; OUString aData; @@ -382,6 +382,10 @@ void SwHTMLParser::InsertEmbed() aCmdLst.Append( rOption.GetTokenString(), rOption.GetString() ); } + if (aType == "image/png" && m_aEmbeds.empty()) + // Toplevel <object> for PNG -> that's an image, not an OLE object. + return false; + SfxItemSet aItemSet( m_xDoc->GetAttrPool(), m_pCSS1Parser->GetWhichMap() ); SvxCSS1PropertyInfo aPropInfo; if( HasStyleOptions( aStyle, aId, aClass ) ) @@ -422,7 +426,7 @@ void SwHTMLParser::InsertEmbed() // do not insert plugin if it has neither URL nor type bool bHasType = !aType.isEmpty(); if( !bHasURL && !bHasType && !bHasData ) - return; + return true; if (!m_aEmbeds.empty()) { @@ -431,7 +435,7 @@ void SwHTMLParser::InsertEmbed() svt::EmbeddedObjectRef& rObj = pOLENode->GetOLEObj().GetObject(); Graphic aGraphic; if (GraphicFilter::GetGraphicFilter().ImportGraphic(aGraphic, aURLObj) != ERRCODE_NONE) - return; + return true; rObj.SetGraphic(aGraphic, aType); @@ -448,7 +452,7 @@ void SwHTMLParser::InsertEmbed() SwFrameFormat* pFormat = pOLENode->GetFlyFormat(); if (!pFormat) - return; + return true; SwAttrSet aAttrSet(pFormat->GetAttrSet()); aAttrSet.ClearItem(RES_CNTNT); @@ -456,7 +460,7 @@ void SwHTMLParser::InsertEmbed() SwFormatFrameSize aFrameSize(ATT_FIX_SIZE, aTwipSize.Width(), aTwipSize.Height()); aAttrSet.Put(aFrameSize); pOLENode->GetDoc()->SetFlyFrameAttr(*pFormat, aAttrSet); - return; + return true; } // create the plug-in @@ -559,13 +563,15 @@ void SwHTMLParser::InsertEmbed() } if (!bHasData) - return; + return true; SwOLENode* pOLENode = pNoTextNd->GetOLENode(); if (!pOLENode) - return; + return true; m_aEmbeds.push(pOLENode); + + return true; } #if HAVE_FEATURE_JAVA diff --git a/sw/source/filter/html/swhtml.cxx b/sw/source/filter/html/swhtml.cxx index d196c718921e..0b0cecace0f0 100644 --- a/sw/source/filter/html/swhtml.cxx +++ b/sw/source/filter/html/swhtml.cxx @@ -1418,7 +1418,8 @@ void SwHTMLParser::NextToken( HtmlTokenId nToken ) case HtmlTokenId::OBJECT_ON: if (m_bXHTML) { - InsertEmbed(); + if (!InsertEmbed()) + InsertImage(); break; } #if HAVE_FEATURE_JAVA diff --git a/sw/source/filter/html/swhtml.hxx b/sw/source/filter/html/swhtml.hxx index 911042defa20..8b9c9505d366 100644 --- a/sw/source/filter/html/swhtml.hxx +++ b/sw/source/filter/html/swhtml.hxx @@ -735,7 +735,7 @@ private: // the actual insert methods for <IMG>, <EMBED>, <APPLET> and <PARAM> void InsertImage(); // htmlgrin.cxx - void InsertEmbed(); // htmlplug.cxx + bool InsertEmbed(); // htmlplug.cxx #if HAVE_FEATURE_JAVA void NewObject(); // htmlplug.cxx |