EPUB export: handle custom media dir in cover image / XMP metadata

By changing the default to <media dir>/cover.<extension> and <media
dir>/<basename>.xmp.

Change-Id: I736aefafba5aa5208917d9ed40119ca7721cdde3
Reviewed-on: https://gerrit.libreoffice.org/45604
Tested-by: Jenkins <ci@libreoffice.org>
Reviewed-by: Miklos Vajna <vmiklos@collabora.co.uk>
This commit is contained in:
Miklos Vajna
2017-12-01 09:18:01 +01:00
parent 3ed60d22c3
commit 1a0a026a57
3 changed files with 57 additions and 75 deletions

Before

Width:  |  Height:  |  Size: 766 B

After

Width:  |  Height:  |  Size: 766 B

+57 -75
View File
@@ -49,70 +49,6 @@ OUString GetMimeType(const OUString &rExtension)
return it == vMimeTypes.end() ? OUString() : it->second;
}
/// Picks up a cover image from the base directory.
OUString FindCoverImage(const OUString &rDocumentBaseURL, OUString &rMimeType, const uno::Sequence<beans::PropertyValue> &rFilterData)
{
OUString aRet;
// See if filter data contains a cover image explicitly.
for (sal_Int32 i = 0; i < rFilterData.getLength(); ++i)
{
if (rFilterData[i].Name == "RVNGCoverImage")
{
rFilterData[i].Value >>= aRet;
break;
}
}
if (!aRet.isEmpty())
{
INetURLObject aRetURL(aRet);
rMimeType = GetMimeType(aRetURL.GetExtension());
return aRet;
}
// Not set explicitly, try to pick it up from the base directory.
if (rDocumentBaseURL.isEmpty())
return aRet;
INetURLObject aDocumentBaseURL(rDocumentBaseURL);
static const std::initializer_list<OUStringLiteral> vExtensions =
{
"gif",
"jpg",
"png",
"svg"
};
for (const auto &rExtension : vExtensions)
{
try
{
aRet = rtl::Uri::convertRelToAbs(rDocumentBaseURL, aDocumentBaseURL.GetBase() + ".cover-image." + rExtension);
}
catch (const rtl::MalformedUriException &rException)
{
SAL_WARN("writerperfect", "FindCoverImage: convertRelToAbs() failed:" << rException.getMessage());
}
if (!aRet.isEmpty())
{
SvFileStream aStream(aRet, StreamMode::READ);
if (aStream.IsOpen())
{
rMimeType = GetMimeType(rExtension);
// File exists.
return aRet;
}
else
aRet.clear();
}
}
return aRet;
}
/// Determines the base directory for cover images, XMP metadata, popup images.
OUString FindMediaDir(const OUString &rDocumentBaseURL, const uno::Sequence<beans::PropertyValue> &rFilterData)
{
@@ -144,6 +80,61 @@ OUString FindMediaDir(const OUString &rDocumentBaseURL, const uno::Sequence<bean
return aMediaDir;
}
/// Picks up a cover image from the base directory.
OUString FindCoverImage(const OUString &rDocumentBaseURL, OUString &rMimeType, const uno::Sequence<beans::PropertyValue> &rFilterData)
{
OUString aRet;
// See if filter data contains a cover image explicitly.
for (sal_Int32 i = 0; i < rFilterData.getLength(); ++i)
{
if (rFilterData[i].Name == "RVNGCoverImage")
{
rFilterData[i].Value >>= aRet;
break;
}
}
if (!aRet.isEmpty())
{
INetURLObject aRetURL(aRet);
rMimeType = GetMimeType(aRetURL.GetExtension());
return aRet;
}
// Not set explicitly, try to pick it up from the base directory.
if (rDocumentBaseURL.isEmpty())
return aRet;
static const std::initializer_list<OUStringLiteral> vExtensions =
{
"gif",
"jpg",
"png",
"svg"
};
OUString aMediaDir = FindMediaDir(rDocumentBaseURL, rFilterData);
for (const auto &rExtension : vExtensions)
{
aRet = aMediaDir + "cover." + rExtension;
if (!aRet.isEmpty())
{
SvFileStream aStream(aRet, StreamMode::READ);
if (aStream.IsOpen())
{
rMimeType = GetMimeType(rExtension);
// File exists.
return aRet;
}
else
aRet.clear();
}
}
return aRet;
}
/// 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)
{
@@ -187,18 +178,9 @@ void FindXMPMetadata(const uno::Reference<uno::XComponentContext> &xContext, con
if (rDocumentBaseURL.isEmpty())
return;
OUString aMediaDir = FindMediaDir(rDocumentBaseURL, rFilterData);
INetURLObject aDocumentBaseURL(rDocumentBaseURL);
OUString aURL;
try
{
aURL = rtl::Uri::convertRelToAbs(rDocumentBaseURL, aDocumentBaseURL.GetBase() + ".xmp");
}
catch (const rtl::MalformedUriException &rException)
{
SAL_WARN("writerperfect", "FindXMPMetadata: convertRelToAbs() failed:" << rException.getMessage());
return;
}
OUString aURL = aMediaDir + aDocumentBaseURL.GetBase() + ".xmp";
SvFileStream aStream(aURL, StreamMode::READ);
if (!aStream.IsOpen())
return;