summaryrefslogtreecommitdiff
path: root/writerperfect
diff options
context:
space:
mode:
authorMiklos Vajna <vmiklos@collabora.co.uk>2017-11-30 08:49:10 +0100
committerMiklos Vajna <vmiklos@collabora.co.uk>2017-11-30 15:36:10 +0100
commit98770243f7f5387aae06e83ed4de0d68e02abb02 (patch)
tree7df0c5a943bbfb34251625b0270813ab8e4e1b8a /writerperfect
parent1a48cdaf91633b354fb1110c566c766a4398fba0 (diff)
EPUB export: allow setting custom metadata explicitly
If not set, fall back to the existing auto-find. The testcase now asserts that the priority is: - api - if that is not set, then xmp - if that is not set, then doc (And at the end libepubgen itself has some defaults as well.) Change-Id: Ie8fc646b81c4a287690fd2eeed43f4786b7938bf Reviewed-on: https://gerrit.libreoffice.org/45552 Tested-by: Jenkins <ci@libreoffice.org> Reviewed-by: Miklos Vajna <vmiklos@collabora.co.uk>
Diffstat (limited to 'writerperfect')
-rw-r--r--writerperfect/qa/uitest/epubexport/epubexport.py4
-rw-r--r--writerperfect/qa/unit/EPUBExportTest.cxx25
-rw-r--r--writerperfect/qa/unit/data/writer/epubexport/meta-xmp.fodt8
-rw-r--r--writerperfect/source/writer/EPUBExportDialog.cxx2
-rw-r--r--writerperfect/source/writer/exp/xmlimp.cxx54
-rw-r--r--writerperfect/source/writer/exp/xmlmetai.cxx28
-rw-r--r--writerperfect/source/writer/exp/xmlmetai.hxx14
7 files changed, 104 insertions, 31 deletions
diff --git a/writerperfect/qa/uitest/epubexport/epubexport.py b/writerperfect/qa/uitest/epubexport/epubexport.py
index aaac6759adac..8db15c5bf891 100644
--- a/writerperfect/qa/uitest/epubexport/epubexport.py
+++ b/writerperfect/qa/uitest/epubexport/epubexport.py
@@ -79,8 +79,8 @@ class EPUBExportTest(UITestCase):
self.ui_test.execute_blocking_action(action=uiComponent.execute, dialog_handler=handleDialog)
propertyValues = uiComponent.getPropertyValues()
filterData = [i.Value for i in propertyValues if i.Name == "FilterData"][0]
- # The EPUBCoverImage key was missing, EPUBExportDialog::OKClickHdl() did not set it.
- coverImage = [i.Value for i in filterData if i.Name == "EPUBCoverImage"][0]
+ # The RVNGCoverImage key was missing, EPUBExportDialog::OKClickHdl() did not set it.
+ coverImage = [i.Value for i in filterData if i.Name == "RVNGCoverImage"][0]
self.assertEqual("cover.png", coverImage)
# vim: set shiftwidth=4 softtabstop=4 expandtab:
diff --git a/writerperfect/qa/unit/EPUBExportTest.cxx b/writerperfect/qa/unit/EPUBExportTest.cxx
index 82452d958152..1760caa05096 100644
--- a/writerperfect/qa/unit/EPUBExportTest.cxx
+++ b/writerperfect/qa/unit/EPUBExportTest.cxx
@@ -62,6 +62,7 @@ public:
void testParaAutostyleCharProps();
void testMeta();
void testMetaXMP();
+ void testMetaAPI();
void testCoverImage();
void testParaNamedstyle();
void testCharNamedstyle();
@@ -96,6 +97,7 @@ public:
CPPUNIT_TEST(testParaAutostyleCharProps);
CPPUNIT_TEST(testMeta);
CPPUNIT_TEST(testMetaXMP);
+ CPPUNIT_TEST(testMetaAPI);
CPPUNIT_TEST(testCoverImage);
CPPUNIT_TEST(testParaNamedstyle);
CPPUNIT_TEST(testCharNamedstyle);
@@ -350,12 +352,33 @@ void EPUBExportTest::testMetaXMP()
assertXPathContent(mpXmlDoc, "/opf:package/opf:metadata/opf:meta[@property='dcterms:modified']", "2016-11-20T17:16:07Z");
}
+void EPUBExportTest::testMetaAPI()
+{
+ uno::Sequence<beans::PropertyValue> aFilterData(comphelper::InitPropertySequence(
+ {
+ {"RVNGIdentifier", uno::makeAny(OUString("deadc0de-e394-4cd6-9b83-7172794612e5"))},
+ {"RVNGTitle", uno::makeAny(OUString("unknown title from api"))},
+ {"RVNGInitialCreator", uno::makeAny(OUString("unknown author from api"))},
+ {"RVNGLanguage", uno::makeAny(OUString("hu"))},
+ {"RVNGDate", uno::makeAny(OUString("2015-11-20T17:16:07Z"))}
+ }));
+ createDoc("meta-xmp.fodt", aFilterData);
+ mpXmlDoc = parseExport("OEBPS/content.opf");
+
+ // These were values from XMP (deadbeef, etc.), not from API.
+ assertXPathContent(mpXmlDoc, "/opf:package/opf:metadata/dc:identifier", "deadc0de-e394-4cd6-9b83-7172794612e5");
+ assertXPathContent(mpXmlDoc, "/opf:package/opf:metadata/dc:title", "unknown title from api");
+ assertXPathContent(mpXmlDoc, "/opf:package/opf:metadata/dc:creator", "unknown author from api");
+ assertXPathContent(mpXmlDoc, "/opf:package/opf:metadata/dc:language", "hu");
+ assertXPathContent(mpXmlDoc, "/opf:package/opf:metadata/opf:meta[@property='dcterms:modified']", "2015-11-20T17:16:07Z");
+}
+
void EPUBExportTest::testCoverImage()
{
OUString aCoverURL = m_directories.getURLFromSrc(DATA_DIRECTORY) + "meta.cover-image.png";
uno::Sequence<beans::PropertyValue> aFilterData(comphelper::InitPropertySequence(
{
- {"EPUBCoverImage", uno::makeAny(aCoverURL)}
+ {"RVNGCoverImage", uno::makeAny(aCoverURL)}
}));
createDoc("hello.fodt", aFilterData);
mpXmlDoc = parseExport("OEBPS/content.opf");
diff --git a/writerperfect/qa/unit/data/writer/epubexport/meta-xmp.fodt b/writerperfect/qa/unit/data/writer/epubexport/meta-xmp.fodt
index b245e9d7abce..9287ecb25a9e 100644
--- a/writerperfect/qa/unit/data/writer/epubexport/meta-xmp.fodt
+++ b/writerperfect/qa/unit/data/writer/epubexport/meta-xmp.fodt
@@ -1,5 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
-<office:document office:mimetype="application/vnd.oasis.opendocument.text" office:version="1.2" xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0" xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0">
+<office:document xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0" xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0" xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0" xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0" xmlns:draw="urn:oasis:names:tc:opendocument:xmlns:drawing:1.0" xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:meta="urn:oasis:names:tc:opendocument:xmlns:meta:1.0" xmlns:number="urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0" xmlns:svg="urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0" xmlns:chart="urn:oasis:names:tc:opendocument:xmlns:chart:1.0" xmlns:dr3d="urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0" xmlns:math="http://www.w3.org/1998/Math/MathML" xmlns:form="urn:oasis:names:tc:opendocument:xmlns:form:1.0" xmlns:script="urn:oasis:names:tc:opendocument:xmlns:script:1.0" xmlns:config="urn:oasis:names:tc:opendocument:xmlns:config:1.0" xmlns:ooo="http://openoffice.org/2004/office" xmlns:ooow="http://openoffice.org/2004/writer" xmlns:oooc="http://openoffice.org/2004/calc" xmlns:dom="http://www.w3.org/2001/xml-events" xmlns:xforms="http://www.w3.org/2002/xforms" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:rpt="http://openoffice.org/2005/report" xmlns:of="urn:oasis:names:tc:opendocument:xmlns:of:1.2" xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns:grddl="http://www.w3.org/2003/g/data-view#" xmlns:officeooo="http://openoffice.org/2009/office" xmlns:tableooo="http://openoffice.org/2009/table" xmlns:drawooo="http://openoffice.org/2010/draw" xmlns:calcext="urn:org:documentfoundation:names:experimental:calc:xmlns:calcext:1.0" xmlns:loext="urn:org:documentfoundation:names:experimental:office:xmlns:loext:1.0" xmlns:field="urn:openoffice:names:experimental:ooo-ms-interop:xmlns:field:1.0" xmlns:formx="urn:openoffice:names:experimental:ooxml-odf-interop:xmlns:form:1.0" xmlns:css3t="http://www.w3.org/TR/css3-text/" office:version="1.2" office:mimetype="application/vnd.oasis.opendocument.text">
+ <office:meta>
+ <meta:initial-creator>unknown author from doc</meta:initial-creator>
+ <dc:title>unknown title from doc</dc:title>
+ <dc:language>de</dc:language>
+ <dc:date>2014-09-27T09:51:19.243117081</dc:date>
+ </office:meta>
<office:body>
<office:text>
<text:p><text:span>Hello world!</text:span></text:p>
diff --git a/writerperfect/source/writer/EPUBExportDialog.cxx b/writerperfect/source/writer/EPUBExportDialog.cxx
index 5c0eb9d1e930..da42954a5d02 100644
--- a/writerperfect/source/writer/EPUBExportDialog.cxx
+++ b/writerperfect/source/writer/EPUBExportDialog.cxx
@@ -125,7 +125,7 @@ IMPL_LINK_NOARG(EPUBExportDialog, CoverClickHdl, Button *, void)
IMPL_LINK_NOARG(EPUBExportDialog, OKClickHdl, Button *, void)
{
if (!m_pCoverPath->GetText().isEmpty())
- mrFilterData["EPUBCoverImage"] <<= m_pCoverPath->GetText();
+ mrFilterData["RVNGCoverImage"] <<= m_pCoverPath->GetText();
EndDialog(RET_OK);
}
diff --git a/writerperfect/source/writer/exp/xmlimp.cxx b/writerperfect/source/writer/exp/xmlimp.cxx
index 57f89c870b9a..bb3d067660b7 100644
--- a/writerperfect/source/writer/exp/xmlimp.cxx
+++ b/writerperfect/source/writer/exp/xmlimp.cxx
@@ -56,7 +56,7 @@ OUString FindCoverImage(const OUString &rDocumentBaseURL, OUString &rMimeType, c
// See if filter data contains a cover image explicitly.
for (sal_Int32 i = 0; i < rFilterData.getLength(); ++i)
{
- if (rFilterData[i].Name == "EPUBCoverImage")
+ if (rFilterData[i].Name == "RVNGCoverImage")
{
rFilterData[i].Value >>= aRet;
break;
@@ -113,8 +113,45 @@ OUString FindCoverImage(const OUString &rDocumentBaseURL, OUString &rMimeType, c
}
/// 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)
+void FindXMPMetadata(const uno::Reference<uno::XComponentContext> &xContext, const OUString &rDocumentBaseURL, const uno::Sequence<beans::PropertyValue> &rFilterData, librevenge::RVNGPropertyList &rMetaData)
{
+ // See if filter data contains metadata explicitly.
+ OUString aValue;
+ for (sal_Int32 i = 0; i < rFilterData.getLength(); ++i)
+ {
+ if (rFilterData[i].Name == "RVNGIdentifier")
+ {
+ rFilterData[i].Value >>= aValue;
+ if (!aValue.isEmpty())
+ rMetaData.insert("dc:identifier", aValue.toUtf8().getStr());
+ }
+ else if (rFilterData[i].Name == "RVNGTitle")
+ {
+ rFilterData[i].Value >>= aValue;
+ if (!aValue.isEmpty())
+ rMetaData.insert("dc:title", aValue.toUtf8().getStr());
+ }
+ else if (rFilterData[i].Name == "RVNGInitialCreator")
+ {
+ rFilterData[i].Value >>= aValue;
+ if (!aValue.isEmpty())
+ rMetaData.insert("meta:initial-creator", aValue.toUtf8().getStr());
+ }
+ else if (rFilterData[i].Name == "RVNGLanguage")
+ {
+ rFilterData[i].Value >>= aValue;
+ if (!aValue.isEmpty())
+ rMetaData.insert("dc:language", aValue.toUtf8().getStr());
+ }
+ else if (rFilterData[i].Name == "RVNGDate")
+ {
+ rFilterData[i].Value >>= aValue;
+ if (!aValue.isEmpty())
+ rMetaData.insert("dc:date", aValue.toUtf8().getStr());
+ }
+ }
+
+ // If not set explicitly, try to pick it up from the base directory.
if (rDocumentBaseURL.isEmpty())
return;
@@ -138,7 +175,7 @@ void FindXMPMetadata(const uno::Reference<uno::XComponentContext> &xContext, con
uno::Reference<io::XInputStream> xStream(new utl::OStreamWrapper(aStream));
aInputSource.aInputStream = xStream;
uno::Reference<xml::sax::XParser> xParser = xml::sax::Parser::create(xContext);
- rtl::Reference<XMPParser> xXMP(new XMPParser());
+ rtl::Reference<XMPParser> xXMP(new XMPParser(rMetaData));
uno::Reference<xml::sax::XDocumentHandler> xDocumentHandler(xXMP.get());
xParser->setDocumentHandler(xDocumentHandler);
try
@@ -150,17 +187,6 @@ void FindXMPMetadata(const uno::Reference<uno::XComponentContext> &xContext, con
SAL_WARN("writerperfect", "FindXMPMetadata: parseStream() failed:" << rException.Message);
return;
}
-
- if (!xXMP->m_aIdentifier.isEmpty())
- rMetaData.insert("dc:identifier", xXMP->m_aIdentifier.toUtf8().getStr());
- if (!xXMP->m_aTitle.isEmpty())
- rMetaData.insert("dc:title", xXMP->m_aTitle.toUtf8().getStr());
- if (!xXMP->m_aCreator.isEmpty())
- rMetaData.insert("meta:initial-creator", xXMP->m_aCreator.toUtf8().getStr());
- if (!xXMP->m_aLanguage.isEmpty())
- rMetaData.insert("dc:language", xXMP->m_aLanguage.toUtf8().getStr());
- if (!xXMP->m_aDate.isEmpty())
- rMetaData.insert("dc:date", xXMP->m_aDate.toUtf8().getStr());
}
}
diff --git a/writerperfect/source/writer/exp/xmlmetai.cxx b/writerperfect/source/writer/exp/xmlmetai.cxx
index 09e56c8c2388..7ee2024968ae 100644
--- a/writerperfect/source/writer/exp/xmlmetai.cxx
+++ b/writerperfect/source/writer/exp/xmlmetai.cxx
@@ -37,7 +37,8 @@ XMLDcTitleContext::XMLDcTitleContext(XMLImport &rImport, XMLMetaDocumentContext
void XMLDcTitleContext::characters(const OUString &rChars)
{
OString sCharU8 = OUStringToOString(rChars, RTL_TEXTENCODING_UTF8);
- mrMeta.m_aPropertyList.insert("dc:title", librevenge::RVNGString(sCharU8.getStr()));
+ if (!mrMeta.m_aPropertyList["dc:title"])
+ mrMeta.m_aPropertyList.insert("dc:title", librevenge::RVNGString(sCharU8.getStr()));
}
/// Handler for <dc:language>.
@@ -59,7 +60,8 @@ XMLDcLanguageContext::XMLDcLanguageContext(XMLImport &rImport, XMLMetaDocumentCo
void XMLDcLanguageContext::characters(const OUString &rChars)
{
OString sCharU8 = OUStringToOString(rChars, RTL_TEXTENCODING_UTF8);
- mrMeta.m_aPropertyList.insert("dc:language", librevenge::RVNGString(sCharU8.getStr()));
+ if (!mrMeta.m_aPropertyList["dc:language"])
+ mrMeta.m_aPropertyList.insert("dc:language", librevenge::RVNGString(sCharU8.getStr()));
}
/// Handler for <dc:date>.
@@ -81,7 +83,8 @@ XMLDcDateContext::XMLDcDateContext(XMLImport &rImport, XMLMetaDocumentContext &r
void XMLDcDateContext::characters(const OUString &rChars)
{
OString sCharU8 = OUStringToOString(rChars, RTL_TEXTENCODING_UTF8);
- mrMeta.m_aPropertyList.insert("dc:date", librevenge::RVNGString(sCharU8.getStr()));
+ if (!mrMeta.m_aPropertyList["dc:date"])
+ mrMeta.m_aPropertyList.insert("dc:date", librevenge::RVNGString(sCharU8.getStr()));
}
/// Handler for <meta:generator>.
@@ -125,7 +128,8 @@ XMLMetaInitialCreatorContext::XMLMetaInitialCreatorContext(XMLImport &rImport, X
void XMLMetaInitialCreatorContext::characters(const OUString &rChars)
{
OString sCharU8 = OUStringToOString(rChars, RTL_TEXTENCODING_UTF8);
- mrMeta.m_aPropertyList.insert("meta:initial-creator", librevenge::RVNGString(sCharU8.getStr()));
+ if (!mrMeta.m_aPropertyList["meta:initial-creator"])
+ mrMeta.m_aPropertyList.insert("meta:initial-creator", librevenge::RVNGString(sCharU8.getStr()));
}
XMLMetaDocumentContext::XMLMetaDocumentContext(XMLImport &rImport)
@@ -157,7 +161,10 @@ void XMLMetaDocumentContext::endElement(const OUString &/*rName*/)
mrImport.GetGenerator().setDocumentMetaData(m_aPropertyList);
}
-XMPParser::XMPParser() = default;
+XMPParser::XMPParser(librevenge::RVNGPropertyList &rMetaData)
+ : mrMetaData(rMetaData)
+{
+}
XMPParser::~XMPParser() = default;
@@ -167,6 +174,17 @@ void XMPParser::startDocument()
void XMPParser::endDocument()
{
+
+ if (!mrMetaData["dc:identifier"] && !m_aIdentifier.isEmpty())
+ mrMetaData.insert("dc:identifier", m_aIdentifier.toUtf8().getStr());
+ if (!mrMetaData["dc:title"] && !m_aTitle.isEmpty())
+ mrMetaData.insert("dc:title", m_aTitle.toUtf8().getStr());
+ if (!mrMetaData["meta:initial-creator"] && !m_aCreator.isEmpty())
+ mrMetaData.insert("meta:initial-creator", m_aCreator.toUtf8().getStr());
+ if (!mrMetaData["dc:language"] && !m_aLanguage.isEmpty())
+ mrMetaData.insert("dc:language", m_aLanguage.toUtf8().getStr());
+ if (!mrMetaData["dc:date"] && !m_aDate.isEmpty())
+ mrMetaData.insert("dc:date", m_aDate.toUtf8().getStr());
}
void XMPParser::startElement(const OUString &rName, const uno::Reference<xml::sax::XAttributeList> &/*xAttribs*/)
diff --git a/writerperfect/source/writer/exp/xmlmetai.hxx b/writerperfect/source/writer/exp/xmlmetai.hxx
index a011e6b83184..fab55277f0e5 100644
--- a/writerperfect/source/writer/exp/xmlmetai.hxx
+++ b/writerperfect/source/writer/exp/xmlmetai.hxx
@@ -39,7 +39,7 @@ class XMPParser: public cppu::WeakImplHelper
>
{
public:
- explicit XMPParser();
+ explicit XMPParser(librevenge::RVNGPropertyList &rMetaData);
virtual ~XMPParser() override;
// XDocumentHandler
@@ -59,22 +59,22 @@ public:
virtual void SAL_CALL setDocumentLocator(const css::uno::Reference<css::xml::sax::XLocator> &xLocator) override;
- OUString m_aIdentifier;
- OUString m_aTitle;
- OUString m_aCreator;
- OUString m_aLanguage;
- OUString m_aDate;
-
private:
+ librevenge::RVNGPropertyList &mrMetaData;
bool m_bInIdentifier = false;
+ OUString m_aIdentifier;
bool m_bInTitle = false;
bool m_bInTitleItem = false;
+ OUString m_aTitle;
bool m_bInCreator = false;
bool m_bInCreatorItem = false;
+ OUString m_aCreator;
bool m_bInLanguage = false;
bool m_bInLanguageItem = false;
+ OUString m_aLanguage;
bool m_bInDate = false;
bool m_bInDateItem = false;
+ OUString m_aDate;
};
} // namespace exp