Kaydet (Commit) 29dfcc75 authored tarafından Armin Le Grand's avatar Armin Le Grand Kaydeden (comit) Thorsten Behrens

tdf#94088 add import of HTML inline graphics

Related: fdo#63211 for saving. This one adds the import side, plus
fallbacks to use the new FillStyle attributes in HTML im/export in a
SvxBrushItem. Also added graphic import for inline graphics. Comment
markers inserted at places where functionality may be added in the
future when the new FillStyle attributes would be more used in this
content. Unit test checks PageBackground and ParagraphBaground import.

Change-Id: I3f198677db553ad198e0add3162603a4735398f1
Reviewed-on: https://gerrit.libreoffice.org/20129Reviewed-by: 's avatarThorsten Behrens <Thorsten.Behrens@CIB.de>
Tested-by: 's avatarThorsten Behrens <Thorsten.Behrens@CIB.de>
üst 9e36549c
......@@ -3904,7 +3904,6 @@ void SvxBrushItem::PurgeMedium() const
DELETEZ( pImpl->pStream );
}
const GraphicObject* SvxBrushItem::GetGraphicObject(OUString const & referer) const
{
if ( bLoadAgain && !maStrLink.isEmpty() && !pImpl->pGraphicObject )
......@@ -3913,26 +3912,53 @@ const GraphicObject* SvxBrushItem::GetGraphicObject(OUString const & referer) co
if (SvtSecurityOptions().isUntrustedReferer(referer)) {
return nullptr;
}
// tdf#94088 prepare graphic and state
Graphic aGraphic;
bool bGraphicLoaded = false;
// try to create stream directly from given URL
pImpl->pStream = utl::UcbStreamHelper::CreateStream( maStrLink, STREAM_STD_READ );
// tdf#94088 if we have a stream, try to load it directly as graphic
if( pImpl->pStream && !pImpl->pStream->GetError() )
{
Graphic aGraphic;
int nRes;
pImpl->pStream->Seek( STREAM_SEEK_TO_BEGIN );
nRes = GraphicFilter::GetGraphicFilter().
ImportGraphic( aGraphic, maStrLink, *pImpl->pStream,
GRFILTER_FORMAT_DONTKNOW, nullptr, GraphicFilterImportFlags::DontSetLogsizeForJpeg );
if( nRes != GRFILTER_OK )
if (GRFILTER_OK == GraphicFilter::GetGraphicFilter().ImportGraphic( aGraphic, maStrLink, *pImpl->pStream,
GRFILTER_FORMAT_DONTKNOW, nullptr, GraphicFilterImportFlags::DontSetLogsizeForJpeg ))
{
bLoadAgain = false;
bGraphicLoaded = true;
}
else
}
// tdf#94088 if no succeeded, try if the string (which is not epty) contains
// a 'data:' scheme url and try to load that (embedded graphics)
if(!bGraphicLoaded)
{
INetURLObject aGraphicURL( maStrLink );
if( INetProtocol::Data == aGraphicURL.GetProtocol() )
{
pImpl->pGraphicObject = new GraphicObject;
pImpl->pGraphicObject->SetGraphic( aGraphic );
const_cast < SvxBrushItem*> (this)->ApplyGraphicTransparency_Impl();
}
std::unique_ptr<SvMemoryStream> const pStream(aGraphicURL.getData());
if (pStream)
{
if (GRFILTER_OK == GraphicFilter::GetGraphicFilter().ImportGraphic(aGraphic, "", *pStream))
{
bGraphicLoaded = true;
// tdf#94088 delete the no longer needed data scheme URL which
// is potentially pretty // large, containing a base64 encoded copy of the graphic
const_cast< SvxBrushItem* >(this)->maStrLink.clear();
}
}
}
}
// tdf#94088 when we got a graphic, set it
if(bGraphicLoaded && GRAPHIC_NONE != aGraphic.GetType())
{
pImpl->pGraphicObject = new GraphicObject;
pImpl->pGraphicObject->SetGraphic( aGraphic );
const_cast < SvxBrushItem*> (this)->ApplyGraphicTransparency_Impl();
}
else
{
......
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=windows-1252"/>
<title></title>
<meta name="generator" content="LibreOfficeDev 5.1.0.0.alpha1 (Windows)"/>
<meta name="created" content="2015-11-27T14:43:09.574000000"/>
<meta name="changed" content="2015-11-27T14:52:03.499000000"/>
<style type="text/css">
@page { margin: 2cm }
p { margin-bottom: 0.25cm; line-height: 120% }
</style>
</head>
<body lang="de-DE" background="data:image/png;base64,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" dir="ltr">
<p style="margin-bottom: 0cm; line-height: 100%; background: url('data:image/png;base64,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') repeat scroll ">
Er h&ouml;rte leise Schritte hinter sich. Das bedeutete nichts Gutes.
Wer w&uuml;rde ihm schon folgen, sp&auml;t in der Nacht und dazu noch
in dieser engen Gasse mitten im &uuml;bel beleumundeten Hafenviertel?
Gerade jetzt, wo er das Ding seines Lebens gedreht hatte und mit der
Beute verschwinden wollte! Hatte einer seiner zahllosen Kollegen
dieselbe Idee gehabt, ihn beobachtet und abgewartet, um ihn nun um
die Fr&uuml;chte seiner Arbeit zu erleichtern? Oder geh&ouml;rten die
Schritte hinter ihm zu einem der unz&auml;hligen Gesetzesh&uuml;ter
dieser Stadt, und die st&auml;hlerne Acht um seine Handgelenke w&uuml;rde
gleich zuschnappen? Er konnte die Aufforderung stehen zu bleiben
schon h&ouml;ren. Gehetzt sah er sich um. Pl&ouml;tzlich erblickte er
den schmalen Durchgang. Blitzartig drehte er sich nach rechts und
verschwand zwischen den beiden Geb&auml;uden. Beinahe w&auml;re er
dabei &uuml;ber den umgest&uuml;rzten M&uuml;lleimer gefallen, der
mitten im Weg lag. Er versuchte, sich in der Dunkelheit seinen Weg zu
ertasten und erstarrte: Anscheinend gab es keinen anderen Ausweg aus
diesem kleinen Hof als den Durchgang, durch den er gekommen war. Die
Schritte wurden lauter und lauter, er sah eine dunkle Gestalt um die
Ecke biegen. Fieberhaft irrten seine Augen durch die n&auml;chtliche
Dunkelheit und suchten einen Ausweg. War jetzt wirklich alles vorbei,
waren alle M&uuml;he und alle Vorbereitungen umsonst? Er presste sich
ganz eng an die Wand hinter ihm und hoffte, der Verfolger w&uuml;rde
ihn &uuml;bersehen, als pl&ouml;tzlich neben ihm mit kaum
wahrnehmbarem Quietschen eine T&uuml;r im n&auml;chtlichen Wind hin
und her schwang. K&ouml;nnte dieses der flehentlich herbeigesehnte
Ausweg aus seinem Dilemma sein? Langsam bewegte er sich auf die
offene T&uuml;r zu, immer dicht an die Mauer gepresst. W&uuml;rde
diese T&uuml;r seine Rettung werden?</p>
</body>
</html>
\ No newline at end of file
......@@ -11,6 +11,8 @@
#include <com/sun/star/graphic/XGraphic.hpp>
#include <com/sun/star/graphic/GraphicType.hpp>
#include <com/sun/star/drawing/FillStyle.hpp>
#include <com/sun/star/drawing/BitmapMode.hpp>
#include <vcl/GraphicNativeTransform.hxx>
#include <sfx2/linkmgr.hxx>
......@@ -84,6 +86,46 @@ DECLARE_HTMLIMPORT_TEST(testInlinedImage, "inlined_image.html")
}
}
DECLARE_HTMLIMPORT_TEST(testInlinedImagesPageAndParagraph, "PageAndParagraphFilled.html")
{
SwXTextDocument* pTextDoc = dynamic_cast<SwXTextDocument *>(mxComponent.get());
CPPUNIT_ASSERT(pTextDoc);
// The document contains embedded pictures inlined for PageBackground and
// ParagraphBackground, check for their existance after import
SwDoc* pDoc = pTextDoc->GetDocShell()->GetDoc();
SwEditShell* pEditShell = pDoc->GetEditShell();
CPPUNIT_ASSERT(pEditShell);
// images are not linked, check for zero links
const sfx2::LinkManager& rLinkManager = pEditShell->GetLinkManager();
CPPUNIT_ASSERT_EQUAL(size_t(0), rLinkManager.GetLinks().size());
// get the pageStyle where the PageBackgroundFill is defined. Caution: for
// HTML mode this is *not* called 'Default Style', but 'HTML'. Name is empty
// due to being loaded embedded. BitmapMode is repeat.
uno::Reference<beans::XPropertySet> xPageProperties1(getStyles("PageStyles")->getByName("HTML"), uno::UNO_QUERY);
CPPUNIT_ASSERT_EQUAL(drawing::FillStyle_BITMAP, getProperty<drawing::FillStyle>(xPageProperties1, "FillStyle"));
CPPUNIT_ASSERT_EQUAL(OUString(""), getProperty<OUString>(xPageProperties1, "FillBitmapName"));
CPPUNIT_ASSERT_EQUAL(drawing::BitmapMode_REPEAT, getProperty<drawing::BitmapMode>(xPageProperties1, "FillBitmapMode"));
// we should have one paragraph
const int nParagraphs = getParagraphs();
CPPUNIT_ASSERT_EQUAL(1, nParagraphs);
if(nParagraphs)
{
// get the paragraph
uno::Reference< text::XTextRange > xPara = getParagraph( 0 );
uno::Reference< beans::XPropertySet > xParagraphProperties( xPara, uno::UNO_QUERY);
// check for Bitmap FillStyle, name empty, repeat
CPPUNIT_ASSERT_EQUAL(drawing::FillStyle_BITMAP, getProperty<drawing::FillStyle>(xParagraphProperties, "FillStyle"));
CPPUNIT_ASSERT_EQUAL(OUString(""), getProperty<OUString>(xParagraphProperties, "FillBitmapName"));
CPPUNIT_ASSERT_EQUAL(drawing::BitmapMode_REPEAT, getProperty<drawing::BitmapMode>(xParagraphProperties, "FillBitmapMode"));
}
}
CPPUNIT_PLUGIN_IMPLEMENT();
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
......@@ -1239,7 +1239,17 @@ bool CSS1Expression::GetURL( OUString& rURL ) const
if( aValue.getLength() > 5 )
{
rURL = aValue.copy( 4, aValue.getLength() - 5 );
rURL = comphelper::string::strip(rURL, ' ');
// tdf#94088 original stripped only spaces, but there may also be
// double quotes in CSS style URLs, so be prepared to spaces followed
// by a single quote followed by spaces
const sal_Unicode aSpace(' ');
const sal_Unicode aSingleQuote('\'');
rURL = comphelper::string::strip(rURL, aSpace);
rURL = comphelper::string::strip(rURL, aSingleQuote);
rURL = comphelper::string::strip(rURL, aSpace);
bRet = true;
}
......
......@@ -61,6 +61,7 @@
#include <editeng/lrspitem.hxx>
#include <editeng/protitem.hxx>
#include <editeng/flstitem.hxx>
#include <svx/unobrushitemhelper.hxx>
#include <frmatr.hxx>
#include <charatr.hxx>
......@@ -2870,6 +2871,20 @@ void SwHTMLParser::_SetAttr( bool bChkEnd, bool bBeforeTable,
OSL_ENSURE( false,
"LRSpace ueber mehrere Absaetze gesetzt!" );
// no break (shouldn't reach this point anyway)
// tdf#94088 expand RES_BACKGROUND to the new fill attribute
// definitions in the range [XATTR_FILL_FIRST .. XATTR_FILL_LAST].
// This is the right place in the future if the adapted fill attributes
// may be handled more directly in HTML import to handle them.
case RES_BACKGROUND:
{
const SvxBrushItem& rBrush = static_cast< SvxBrushItem& >(*pAttr->pItem);
SfxItemSet aNewSet(m_pDoc->GetAttrPool(), XATTR_FILL_FIRST, XATTR_FILL_LAST);
setSvxBrushItemAsFillAttributesToTargetSet(rBrush, aNewSet);
m_pDoc->getIDocumentContentOperations().InsertItemSet(*pAttrPam, aNewSet, SetAttrMode::DONTREPLACE);
break;
}
default:
// ggfs. ein Bookmark anspringen
......
......@@ -20,6 +20,9 @@
#include <svl/itemiter.hxx>
#include <svl/whiter.hxx>
// tdf#94088 SdrAllFillAttributesHelper needed
#include <svx/unobrushitemhelper.hxx>
#include "shellio.hxx"
#include "wrt_fn.hxx"
#include "node.hxx"
......@@ -54,6 +57,11 @@ Writer& Out_SfxItemSet( const SwAttrFnTab pTab, Writer& rWrt,
}
const SfxPoolItem* pItem(nullptr);
FnAttrOut pOut;
// tdf#94088 check if any FillAttribute is used [XATTR_FILL_FIRST .. XATTR_FILL_LAST]
// while processing the items
bool bFillItemUsed = false;
if( !bDeep || !pSet->GetParent() )
{
OSL_ENSURE( rSet.Count(), "It has been handled already, right?" );
......@@ -61,8 +69,17 @@ Writer& Out_SfxItemSet( const SwAttrFnTab pTab, Writer& rWrt,
pItem = aIter.GetCurItem();
do {
// pTab only covers POOLATTR_BEGIN..POOLATTR_END.
if( pItem->Which() <= POOLATTR_END && nullptr != ( pOut = pTab[ pItem->Which() - RES_CHRATR_BEGIN] ))
if( pItem->Which() <= POOLATTR_END )
{
if( nullptr != ( pOut = pTab[ pItem->Which() - RES_CHRATR_BEGIN]) )
{
(*pOut)( rWrt, *pItem );
}
}
else if(XATTR_FILLSTYLE == pItem->Which())
{
bFillItemUsed = true;
}
} while( !aIter.IsAtEnd() && nullptr != ( pItem = aIter.NextItem() ) );
}
else
......@@ -76,11 +93,35 @@ Writer& Out_SfxItemSet( const SwAttrFnTab pTab, Writer& rWrt,
*pItem != rPool.GetDefaultItem( nWhich )
|| ( pSet->GetParent() &&
*pItem != pSet->GetParent()->Get( nWhich ))
)) && nullptr != ( pOut = pTab[ nWhich - RES_CHRATR_BEGIN] ))
)))
{
if( nullptr != ( pOut = pTab[ nWhich - RES_CHRATR_BEGIN] ))
{
(*pOut)( rWrt, *pItem );
}
else if(XATTR_FILLSTYLE == pItem->Which())
{
bFillItemUsed = true;
}
}
nWhich = aIter.NextWhich();
}
}
if(bFillItemUsed)
{
// tdf#94088 if used, construct a SvxBrushItem and export it using the
// existing mechanisms.
// This is the right place in the future if the adapted fill attributes
// may be handled more directly in HTML export to handle them.
const SvxBrushItem aSvxBrushItem = getSvxBrushItemFromSourceSet(*pSet, RES_BACKGROUND, bDeep);
if( nullptr != ( pOut = pTab[RES_BACKGROUND - RES_CHRATR_BEGIN] ))
{
(*pOut)( rWrt, aSvxBrushItem );
}
}
return rWrt;
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment