diff options
author | Miklos Vajna <vmiklos@collabora.co.uk> | 2017-11-30 16:34:05 +0100 |
---|---|---|
committer | Miklos Vajna <vmiklos@collabora.co.uk> | 2017-12-01 09:17:22 +0100 |
commit | 7f0641de763d2fd425c80f630f3ae6bcde778e7a (patch) | |
tree | 441c90c06805f1114de9b190eb748029c1010e77 /writerperfect | |
parent | 7dcb4fef3b2383f4dd4d5d5c9ebbe8f19f8f4c8e (diff) |
EPUB export: allow setting custom media dir explicitly
The default is the same <base directory>/<base name>/ as before.
Change-Id: Idb500193a7f6bd901d861e857147832a3ada91d3
Reviewed-on: https://gerrit.libreoffice.org/45602
Tested-by: Jenkins <ci@libreoffice.org>
Reviewed-by: Miklos Vajna <vmiklos@collabora.co.uk>
Diffstat (limited to 'writerperfect')
-rw-r--r-- | writerperfect/qa/unit/EPUBExportTest.cxx | 23 | ||||
-rw-r--r-- | writerperfect/qa/unit/data/writer/epubexport/popup-api.odt | bin | 0 -> 10103 bytes | |||
-rw-r--r-- | writerperfect/qa/unit/data/writer/epubexport/popup/libreoffice.png | bin | 766 -> 714 bytes | |||
-rw-r--r-- | writerperfect/source/writer/exp/xmlimp.cxx | 44 | ||||
-rw-r--r-- | writerperfect/source/writer/exp/xmlimp.hxx | 1 |
5 files changed, 58 insertions, 10 deletions
diff --git a/writerperfect/qa/unit/EPUBExportTest.cxx b/writerperfect/qa/unit/EPUBExportTest.cxx index 1f7b64250724..335347de60ff 100644 --- a/writerperfect/qa/unit/EPUBExportTest.cxx +++ b/writerperfect/qa/unit/EPUBExportTest.cxx @@ -90,6 +90,7 @@ public: void testImageLink(); void testFootnote(); void testPopup(); + void testPopupAPI(); CPPUNIT_TEST_SUITE(EPUBExportTest); CPPUNIT_TEST(testOutlineLevel); @@ -128,6 +129,7 @@ public: CPPUNIT_TEST(testImageLink); CPPUNIT_TEST(testFootnote); CPPUNIT_TEST(testPopup); + CPPUNIT_TEST(testPopupAPI); CPPUNIT_TEST_SUITE_END(); }; @@ -724,6 +726,27 @@ void EPUBExportTest::testPopup() assertXPath(mpXmlDoc, "//xhtml:body/xhtml:aside[2]/xhtml:img", 1); } +void EPUBExportTest::testPopupAPI() +{ + // Make sure that the popup works with data from a media directory. + OUString aMediaDir = m_directories.getURLFromSrc(DATA_DIRECTORY) + "popup"; + uno::Sequence<beans::PropertyValue> aFilterData(comphelper::InitPropertySequence( + { + {"RVNGMediaDir", uno::makeAny(aMediaDir)} + })); + createDoc("popup-api.odt", aFilterData); + + // We have a non-empty anchor image. + mpXmlDoc = parseExport("OEBPS/sections/section0001.xhtml"); + OUString aAnchor = getXPath(mpXmlDoc, "//xhtml:body/xhtml:p[1]/xhtml:a/xhtml:img", "src"); + CPPUNIT_ASSERT(!aAnchor.isEmpty()); + // We have a non-empty popup image. + OUString aData = getXPath(mpXmlDoc, "//xhtml:body/xhtml:aside[1]/xhtml:img", "src"); + CPPUNIT_ASSERT(!aData.isEmpty()); + // The anchor is different from the popup image. + CPPUNIT_ASSERT(aAnchor != aData); +} + CPPUNIT_TEST_SUITE_REGISTRATION(EPUBExportTest); } diff --git a/writerperfect/qa/unit/data/writer/epubexport/popup-api.odt b/writerperfect/qa/unit/data/writer/epubexport/popup-api.odt Binary files differnew file mode 100644 index 000000000000..30f4cc8f526e --- /dev/null +++ b/writerperfect/qa/unit/data/writer/epubexport/popup-api.odt diff --git a/writerperfect/qa/unit/data/writer/epubexport/popup/libreoffice.png b/writerperfect/qa/unit/data/writer/epubexport/popup/libreoffice.png Binary files differindex fdad35484e7c..cc74f136fbdf 100644 --- a/writerperfect/qa/unit/data/writer/epubexport/popup/libreoffice.png +++ b/writerperfect/qa/unit/data/writer/epubexport/popup/libreoffice.png diff --git a/writerperfect/source/writer/exp/xmlimp.cxx b/writerperfect/source/writer/exp/xmlimp.cxx index fdbc1d398243..f933487a59b8 100644 --- a/writerperfect/source/writer/exp/xmlimp.cxx +++ b/writerperfect/source/writer/exp/xmlimp.cxx @@ -113,6 +113,37 @@ OUString FindCoverImage(const OUString &rDocumentBaseURL, OUString &rMimeType, c return aRet; } +/// Determines the base directory for cover images, XMP metadata, popup images. +OUString FindMediaDir(const OUString &rDocumentBaseURL, const uno::Sequence<beans::PropertyValue> &rFilterData) +{ + OUString aMediaDir; + + // See if filter data contains a media directory explicitly. + for (sal_Int32 i = 0; i < rFilterData.getLength(); ++i) + { + if (rFilterData[i].Name == "RVNGMediaDir") + { + rFilterData[i].Value >>= aMediaDir; + break; + } + } + + if (!aMediaDir.isEmpty()) + return aMediaDir + "/"; + + // Not set explicitly, try to pick it up from the base directory. + INetURLObject aURL(rDocumentBaseURL); + try + { + aMediaDir = rtl::Uri::convertRelToAbs(rDocumentBaseURL, aURL.GetBase()) + "/"; + } + catch (const rtl::MalformedUriException &rException) + { + SAL_WARN("writerperfect", "FindMediaDir: convertRelToAbs() failed:" << rException.getMessage()); + } + return aMediaDir; +} + /// Picks up XMP metadata from the base directory. void FindXMPMetadata(const uno::Reference<uno::XComponentContext> &xContext, const OUString &rDocumentBaseURL, const uno::Sequence<beans::PropertyValue> &rFilterData, librevenge::RVNGPropertyList &rMetaData) { @@ -256,6 +287,8 @@ XMLImport::XMLImport(const uno::Reference<uno::XComponentContext> &xContext, lib } } + maMediaDir = FindMediaDir(rURL, aFilterData); + OUString aMimeType; OUString aCoverImage = FindCoverImage(rURL, aMimeType, aFilterData); if (!aCoverImage.isEmpty()) @@ -303,16 +336,7 @@ bool XMLImport::FillPopupData(const OUString &rURL, librevenge::RVNGPropertyList if (!bRelative) return false; - OUString aAbs; - INetURLObject aBaseURL(maDocumentBaseURL); - try - { - aAbs = rtl::Uri::convertRelToAbs(maDocumentBaseURL, aBaseURL.GetBase() + "/" + rURL); - } - catch (const rtl::MalformedUriException &rException) - { - SAL_WARN("writerperfect", "XMLImport::FillPopupData: convertRelToAbs() failed:" << rException.getMessage()); - } + OUString aAbs = maMediaDir + rURL; if (aAbs.isEmpty()) return false; diff --git a/writerperfect/source/writer/exp/xmlimp.hxx b/writerperfect/source/writer/exp/xmlimp.hxx index 7b517cbe1325..0777e71953a4 100644 --- a/writerperfect/source/writer/exp/xmlimp.hxx +++ b/writerperfect/source/writer/exp/xmlimp.hxx @@ -58,6 +58,7 @@ class XMLImport : public cppu::WeakImplHelper const css::uno::Reference<css::uno::XComponentContext> &mxContext; css::uno::Reference<css::uri::XUriReferenceFactory> mxUriReferenceFactory; OUString maDocumentBaseURL; + OUString maMediaDir; public: XMLImport(const css::uno::Reference<css::uno::XComponentContext> &xContext, librevenge::RVNGTextInterface &rGenerator, const OUString &rURL, const css::uno::Sequence<css::beans::PropertyValue> &rDescriptor); |