Kaydet (Commit) 89e7a000 authored tarafından Miklos Vajna's avatar Miklos Vajna

EPUB export: handle page size in fixed layout

Requires parsing master pages and page layouts.

Change-Id: Ia8b9e59a9355396d3776af06e8e67ec88033754b
Reviewed-on: https://gerrit.libreoffice.org/45645Tested-by: 's avatarJenkins <ci@libreoffice.org>
Reviewed-by: 's avatarMiklos Vajna <vmiklos@collabora.co.uk>
üst 913fbc82
...@@ -5658,3 +5658,176 @@ index 5d4e8f2..c3bc963 100644 ...@@ -5658,3 +5658,176 @@ index 5d4e8f2..c3bc963 100644
-- --
2.13.6 2.13.6
From 38aa728708641942371507b975193f0ab60f0b50 Mon Sep 17 00:00:00 2001
From: Miklos Vajna <vmiklos@collabora.co.uk>
Date: Wed, 29 Nov 2017 11:00:32 +0100
Subject: [PATCH] EPUBGenerator: fixed layout implies split on page break
---
Makefile.am | 3 +++
src/lib/EPUBGenerator.cpp | 8 ++++++++
src/lib/EPUBHTMLGenerator.cpp | 16 ++++++++++++++++
src/lib/EPUBHTMLGenerator.h | 5 +++++
src/lib/EPUBSplitGuard.cpp | 5 +++++
src/lib/EPUBSplitGuard.h | 4 +++-
src/test/EPUBTextGeneratorTest.cpp | 31 +++++++++++++++++++++++++++++++
7 files changed, 71 insertions(+), 1 deletion(-)
diff --git a/src/lib/EPUBGenerator.cpp b/src/lib/EPUBGenerator.cpp
index 4a62d7f..f608331 100644
--- a/src/lib/EPUBGenerator.cpp
+++ b/src/lib/EPUBGenerator.cpp
@@ -118,7 +118,12 @@ void EPUBGenerator::startNewHtmlFile()
m_splitGuard.onSplit();
+ librevenge::RVNGPropertyList pageProperties;
+ if (m_layoutMethod == EPUB_LAYOUT_METHOD_FIXED && m_currentHtml)
+ m_currentHtml->getPageProperties(pageProperties);
m_currentHtml = m_htmlManager.create(m_imageManager, m_fontManager, m_listStyleManager, m_paragraphStyleManager, m_spanStyleManager, m_tableStyleManager, m_stylesheetPath, m_stylesMethod, m_layoutMethod, m_version);
+ if (m_layoutMethod == EPUB_LAYOUT_METHOD_FIXED)
+ m_currentHtml->setPageProperties(pageProperties);
// restore state in the new file
m_currentHtml->startDocument(m_documentProps);
@@ -160,6 +165,9 @@ void EPUBGenerator::setStylesMethod(EPUBStylesMethod styles)
void EPUBGenerator::setLayoutMethod(EPUBLayoutMethod layout)
{
m_layoutMethod = layout;
+ if (m_layoutMethod == EPUB_LAYOUT_METHOD_FIXED)
+ // Fixed layout implies split on page break.
+ m_splitGuard.setSplitMethod(EPUB_SPLIT_METHOD_PAGE_BREAK);
}
void EPUBGenerator::writeContainer()
diff --git a/src/lib/EPUBHTMLGenerator.cpp b/src/lib/EPUBHTMLGenerator.cpp
index 4260858..7a53ce3 100644
--- a/src/lib/EPUBHTMLGenerator.cpp
+++ b/src/lib/EPUBHTMLGenerator.cpp
@@ -1173,6 +1173,22 @@ void EPUBHTMLGenerator::closePopup(EPUBXMLSink &main)
void EPUBHTMLGenerator::insertEquation(const RVNGPropertyList & /* propList */) {}
+void EPUBHTMLGenerator::getPageProperties(librevenge::RVNGPropertyList &propList) const
+{
+ propList.clear();
+ librevenge::RVNGPropertyList::Iter i(m_impl->m_actualPageProperties);
+ for (i.rewind(); i.next();)
+ propList.insert(i.key(), i()->clone());
+}
+
+void EPUBHTMLGenerator::setPageProperties(const librevenge::RVNGPropertyList &propList)
+{
+ m_impl->m_actualPageProperties.clear();
+ librevenge::RVNGPropertyList::Iter i(propList);
+ for (i.rewind(); i.next();)
+ m_impl->m_actualPageProperties.insert(i.key(), i()->clone());
+}
+
}
/* vim:set shiftwidth=2 softtabstop=2 expandtab: */
diff --git a/src/lib/EPUBHTMLGenerator.h b/src/lib/EPUBHTMLGenerator.h
index 3c6577f..ef7d542 100644
--- a/src/lib/EPUBHTMLGenerator.h
+++ b/src/lib/EPUBHTMLGenerator.h
@@ -112,6 +112,11 @@ public:
void insertBinaryObject(const librevenge::RVNGPropertyList &propList) override;
void insertEquation(const librevenge::RVNGPropertyList &propList) override;
+ /// Gets the actual page properties into propList.
+ void getPageProperties(librevenge::RVNGPropertyList &propList) const;
+ /// Sets the actual page properties from propList.
+ void setPageProperties(const librevenge::RVNGPropertyList &propList);
+
private:
EPUBXMLSink &openPopup();
void closePopup(EPUBXMLSink &main);
diff --git a/src/lib/EPUBSplitGuard.cpp b/src/lib/EPUBSplitGuard.cpp
index 890500b..4f7531d 100644
--- a/src/lib/EPUBSplitGuard.cpp
+++ b/src/lib/EPUBSplitGuard.cpp
@@ -40,6 +40,11 @@ void EPUBSplitGuard::setSplitSize(const unsigned size)
m_size = size;
}
+void EPUBSplitGuard::setSplitMethod(EPUBSplitMethod method)
+{
+ m_method = method;
+}
+
void EPUBSplitGuard::openLevel()
{
++m_nestingLevel;
diff --git a/src/lib/EPUBSplitGuard.h b/src/lib/EPUBSplitGuard.h
index 1a74079..ff55846 100644
--- a/src/lib/EPUBSplitGuard.h
+++ b/src/lib/EPUBSplitGuard.h
@@ -23,6 +23,8 @@ public:
void setSplitHeadingLevel(unsigned level);
void setCurrentHeadingLevel(unsigned level);
void setSplitSize(unsigned size);
+ /// Allows overwriting the value given in the constructor.
+ void setSplitMethod(EPUBSplitMethod method);
void openLevel();
void closeLevel();
@@ -39,7 +41,7 @@ private:
bool canSplit(EPUBSplitMethod method) const;
private:
- const EPUBSplitMethod m_method;
+ EPUBSplitMethod m_method;
unsigned m_headingLevel;
unsigned m_currentHeadingLevel;
unsigned m_size;
--
2.13.6
From d9921c47befa3eabcfc916e26e273667232be637 Mon Sep 17 00:00:00 2001
From: Miklos Vajna <vmiklos@collabora.co.uk>
Date: Wed, 29 Nov 2017 14:44:55 +0100
Subject: [PATCH] EPUBTextGenerator: page-break=auto is not a page break
---
src/lib/EPUBTextGenerator.cpp | 14 ++++++++++++--
src/test/EPUBTextGeneratorTest.cpp | 21 +++++++++++++++++++++
2 files changed, 33 insertions(+), 2 deletions(-)
diff --git a/src/lib/EPUBTextGenerator.cpp b/src/lib/EPUBTextGenerator.cpp
index c3bc963..02c299a 100644
--- a/src/lib/EPUBTextGenerator.cpp
+++ b/src/lib/EPUBTextGenerator.cpp
@@ -53,6 +53,16 @@ bool operator!=(const char *const left, const RVNGString &right)
return right != left;
}
+/// Determines if this break property a page break one.
+bool isPageBreak(const librevenge::RVNGProperty *property)
+{
+ if (!property)
+ return false;
+
+ librevenge::RVNGString str = property->getStr();
+ return str != "column" && str != "auto";
+}
+
}
struct EPUBTextGenerator::Impl : public EPUBGenerator
@@ -259,10 +269,10 @@ void EPUBTextGenerator::defineParagraphStyle(const librevenge::RVNGPropertyList
void EPUBTextGenerator::openParagraph(const librevenge::RVNGPropertyList &propList)
{
const RVNGProperty *const breakBefore = propList["fo:break-before"];
- if (breakBefore && ("column" != breakBefore->getStr()) && m_impl->getSplitGuard().splitOnPageBreak())
+ if (isPageBreak(breakBefore) && m_impl->getSplitGuard().splitOnPageBreak())
m_impl->startNewHtmlFile();
const RVNGProperty *const breakAfter = propList["fo:break-after"];
- m_impl->m_breakAfterPara = breakAfter && ("column" != breakAfter->getStr());
+ m_impl->m_breakAfterPara = isPageBreak(breakAfter);
if (m_impl->getSplitGuard().splitOnSize())
m_impl->startNewHtmlFile();
--
2.13.6
...@@ -92,6 +92,7 @@ public: ...@@ -92,6 +92,7 @@ public:
void testFootnote(); void testFootnote();
void testPopup(); void testPopup();
void testPopupAPI(); void testPopupAPI();
void testPageSize();
CPPUNIT_TEST_SUITE(EPUBExportTest); CPPUNIT_TEST_SUITE(EPUBExportTest);
CPPUNIT_TEST(testOutlineLevel); CPPUNIT_TEST(testOutlineLevel);
...@@ -132,6 +133,7 @@ public: ...@@ -132,6 +133,7 @@ public:
CPPUNIT_TEST(testFootnote); CPPUNIT_TEST(testFootnote);
CPPUNIT_TEST(testPopup); CPPUNIT_TEST(testPopup);
CPPUNIT_TEST(testPopupAPI); CPPUNIT_TEST(testPopupAPI);
CPPUNIT_TEST(testPageSize);
CPPUNIT_TEST_SUITE_END(); CPPUNIT_TEST_SUITE_END();
}; };
...@@ -763,6 +765,20 @@ void EPUBExportTest::testPopupAPI() ...@@ -763,6 +765,20 @@ void EPUBExportTest::testPopupAPI()
CPPUNIT_ASSERT(aAnchor != aData); CPPUNIT_ASSERT(aAnchor != aData);
} }
void EPUBExportTest::testPageSize()
{
uno::Sequence<beans::PropertyValue> aFilterData(comphelper::InitPropertySequence(
{
{"EPUBLayoutMethod", uno::makeAny(static_cast<sal_Int32>(libepubgen::EPUB_LAYOUT_METHOD_FIXED))}
}));
createDoc("hello.fodt", aFilterData);
// This failed, viewport was empty, so page size was lost.
mpXmlDoc = parseExport("OEBPS/sections/section0001.xhtml");
// 21,59cm x 27.94cm (letter).
assertXPath(mpXmlDoc, "/xhtml:html/xhtml:head/xhtml:meta[@name='viewport']", "content", "width=816, height=1056");
}
CPPUNIT_TEST_SUITE_REGISTRATION(EPUBExportTest); CPPUNIT_TEST_SUITE_REGISTRATION(EPUBExportTest);
} }
......
...@@ -397,6 +397,13 @@ void XMLParaContext::startElement(const OUString &/*rName*/, const css::uno::Ref ...@@ -397,6 +397,13 @@ void XMLParaContext::startElement(const OUString &/*rName*/, const css::uno::Ref
} }
} }
if (!mrImport.IsPageSpanOpened())
{
auto it = mrImport.GetMasterPages().find("Standard");
if (it != mrImport.GetMasterPages().end())
mrImport.GetGenerator().openPageSpan(it->second);
mrImport.SetPageSpanOpened(true);
}
mrImport.GetGenerator().openParagraph(aPropertyList); mrImport.GetGenerator().openParagraph(aPropertyList);
} }
......
...@@ -320,6 +320,102 @@ librevenge::RVNGPropertyList &XMLStyleContext::GetGraphicPropertyList() ...@@ -320,6 +320,102 @@ librevenge::RVNGPropertyList &XMLStyleContext::GetGraphicPropertyList()
return m_aGraphicPropertyList; return m_aGraphicPropertyList;
} }
XMLMasterPageContext::XMLMasterPageContext(XMLImport &rImport, XMLStylesContext &rStyles)
: XMLImportContext(rImport),
m_rStyles(rStyles)
{
// I'll remove this in a follow-up commit.
(void)m_rStyles;
}
void XMLMasterPageContext::startElement(const OUString &/*rName*/, const css::uno::Reference<css::xml::sax::XAttributeList> &xAttribs)
{
OUString aName;
OUString aPageLayoutName;
for (sal_Int16 i = 0; i < xAttribs->getLength(); ++i)
{
const OUString &rAttributeName = xAttribs->getNameByIndex(i);
const OUString &rAttributeValue = xAttribs->getValueByIndex(i);
if (rAttributeName == "style:name")
aName = rAttributeValue;
else if (rAttributeName == "style:page-layout-name")
aPageLayoutName = rAttributeValue;
}
auto it = mrImport.GetPageLayouts().find(aPageLayoutName);
if (it == mrImport.GetPageLayouts().end())
return;
librevenge::RVNGPropertyList::Iter itProp(it->second);
librevenge::RVNGPropertyList aPropertyList;
for (itProp.rewind(); itProp.next();)
aPropertyList.insert(itProp.key(), itProp()->clone());
mrImport.GetMasterPages()[aName] = aPropertyList;
}
/// Handler for <style:page-layout-properties>.
class XMLPageLayoutPropertiesContext : public XMLImportContext
{
public:
XMLPageLayoutPropertiesContext(XMLImport &rImport, XMLPageLayoutContext &rStyle);
void SAL_CALL startElement(const OUString &rName, const css::uno::Reference<css::xml::sax::XAttributeList> &xAttribs) override;
private:
XMLPageLayoutContext &m_rStyle;
};
XMLPageLayoutPropertiesContext::XMLPageLayoutPropertiesContext(XMLImport &rImport, XMLPageLayoutContext &rStyle)
: XMLImportContext(rImport)
, m_rStyle(rStyle)
{
}
void XMLPageLayoutPropertiesContext::startElement(const OUString &/*rName*/, const css::uno::Reference<css::xml::sax::XAttributeList> &xAttribs)
{
for (sal_Int16 i = 0; i < xAttribs->getLength(); ++i)
{
OString sName = OUStringToOString(xAttribs->getNameByIndex(i), RTL_TEXTENCODING_UTF8);
OString sValue = OUStringToOString(xAttribs->getValueByIndex(i), RTL_TEXTENCODING_UTF8);
m_rStyle.GetPropertyList().insert(sName.getStr(), sValue.getStr());
}
}
XMLPageLayoutContext::XMLPageLayoutContext(XMLImport &rImport, XMLStylesContext &rStyles)
: XMLImportContext(rImport),
m_rStyles(rStyles)
{
}
void XMLPageLayoutContext::startElement(const OUString &/*rName*/, const css::uno::Reference<css::xml::sax::XAttributeList> &xAttribs)
{
for (sal_Int16 i = 0; i < xAttribs->getLength(); ++i)
{
const OUString &rAttributeName = xAttribs->getNameByIndex(i);
const OUString &rAttributeValue = xAttribs->getValueByIndex(i);
if (rAttributeName == "style:name")
m_aName = rAttributeValue;
}
}
rtl::Reference<XMLImportContext> XMLPageLayoutContext::CreateChildContext(const OUString &rName, const css::uno::Reference<css::xml::sax::XAttributeList> &/*xAttribs*/)
{
if (rName == "style:page-layout-properties")
return new XMLPageLayoutPropertiesContext(mrImport, *this);
return nullptr;
}
void XMLPageLayoutContext::endElement(const OUString &/*rName*/)
{
if (m_aName.isEmpty())
return;
m_rStyles.GetCurrentPageLayouts()[m_aName] = m_aPropertyList;
}
librevenge::RVNGPropertyList &XMLPageLayoutContext::GetPropertyList()
{
return m_aPropertyList;
}
} // namespace exp } // namespace exp
} // namespace writerperfect } // namespace writerperfect
......
...@@ -52,6 +52,35 @@ private: ...@@ -52,6 +52,35 @@ private:
XMLStylesContext &m_rStyles; XMLStylesContext &m_rStyles;
}; };
/// Handler for <style:master-page>.
class XMLMasterPageContext : public XMLImportContext
{
public:
XMLMasterPageContext(XMLImport &rImport, XMLStylesContext &rStyles);
void SAL_CALL startElement(const OUString &rName, const css::uno::Reference<css::xml::sax::XAttributeList> &xAttribs) override;
private:
XMLStylesContext &m_rStyles;
};
/// Handler for <style:page-layout>.
class XMLPageLayoutContext : public XMLImportContext
{
public:
XMLPageLayoutContext(XMLImport &rImport, XMLStylesContext &rStyles);
rtl::Reference<XMLImportContext> CreateChildContext(const OUString &rName, const css::uno::Reference<css::xml::sax::XAttributeList> &xAttribs) override;
void SAL_CALL startElement(const OUString &rName, const css::uno::Reference<css::xml::sax::XAttributeList> &xAttribs) override;
void SAL_CALL endElement(const OUString &rName) override;
librevenge::RVNGPropertyList &GetPropertyList();
private:
OUString m_aName;
librevenge::RVNGPropertyList m_aPropertyList;
XMLStylesContext &m_rStyles;
};
} // namespace exp } // namespace exp
} // namespace writerperfect } // namespace writerperfect
......
...@@ -20,15 +20,17 @@ namespace writerperfect ...@@ -20,15 +20,17 @@ namespace writerperfect
namespace exp namespace exp
{ {
XMLStylesContext::XMLStylesContext(XMLImport &rImport, bool bAutomatic) XMLStylesContext::XMLStylesContext(XMLImport &rImport, StyleType eType)
: XMLImportContext(rImport), : XMLImportContext(rImport),
m_rParagraphStyles(bAutomatic ? mrImport.GetAutomaticParagraphStyles() : mrImport.GetParagraphStyles()), m_rParagraphStyles(eType == StyleType_AUTOMATIC ? mrImport.GetAutomaticParagraphStyles() : mrImport.GetParagraphStyles()),
m_rTextStyles(bAutomatic ? mrImport.GetAutomaticTextStyles() : mrImport.GetTextStyles()), m_rTextStyles(eType == StyleType_AUTOMATIC ? mrImport.GetAutomaticTextStyles() : mrImport.GetTextStyles()),
m_rCellStyles(bAutomatic ? mrImport.GetAutomaticCellStyles() : mrImport.GetCellStyles()), m_rCellStyles(eType == StyleType_AUTOMATIC ? mrImport.GetAutomaticCellStyles() : mrImport.GetCellStyles()),
m_rColumnStyles(bAutomatic ? mrImport.GetAutomaticColumnStyles() : mrImport.GetColumnStyles()), m_rColumnStyles(eType == StyleType_AUTOMATIC ? mrImport.GetAutomaticColumnStyles() : mrImport.GetColumnStyles()),
m_rRowStyles(bAutomatic ? mrImport.GetAutomaticRowStyles() : mrImport.GetRowStyles()), m_rRowStyles(eType == StyleType_AUTOMATIC ? mrImport.GetAutomaticRowStyles() : mrImport.GetRowStyles()),
m_rTableStyles(bAutomatic ? mrImport.GetAutomaticTableStyles() : mrImport.GetTableStyles()), m_rTableStyles(eType == StyleType_AUTOMATIC ? mrImport.GetAutomaticTableStyles() : mrImport.GetTableStyles()),
m_rGraphicStyles(bAutomatic ? mrImport.GetAutomaticGraphicStyles() : mrImport.GetGraphicStyles()) m_rGraphicStyles(eType == StyleType_AUTOMATIC ? mrImport.GetAutomaticGraphicStyles() : mrImport.GetGraphicStyles()),
m_rPageLayouts(mrImport.GetPageLayouts()),
m_eType(eType)
{ {
} }
...@@ -36,6 +38,10 @@ rtl::Reference<XMLImportContext> XMLStylesContext::CreateChildContext(const OUSt ...@@ -36,6 +38,10 @@ rtl::Reference<XMLImportContext> XMLStylesContext::CreateChildContext(const OUSt
{ {
if (rName == "style:style") if (rName == "style:style")
return new XMLStyleContext(mrImport, *this); return new XMLStyleContext(mrImport, *this);
if (m_eType == StyleType_MASTER && rName == "style:master-page")
return new XMLMasterPageContext(mrImport, *this);
if (m_eType == StyleType_AUTOMATIC && rName == "style:page-layout")
return new XMLPageLayoutContext(mrImport, *this);
return nullptr; return nullptr;
} }
...@@ -74,6 +80,11 @@ std::map<OUString, librevenge::RVNGPropertyList> &XMLStylesContext::GetCurrentGr ...@@ -74,6 +80,11 @@ std::map<OUString, librevenge::RVNGPropertyList> &XMLStylesContext::GetCurrentGr
return m_rGraphicStyles; return m_rGraphicStyles;
} }
std::map<OUString, librevenge::RVNGPropertyList> &XMLStylesContext::GetCurrentPageLayouts()
{
return m_rPageLayouts;
}
/// Handler for <style:font-face>. /// Handler for <style:font-face>.
class XMLFontFaceContext : public XMLImportContext class XMLFontFaceContext : public XMLImportContext
{ {
......
...@@ -21,11 +21,17 @@ namespace writerperfect ...@@ -21,11 +21,17 @@ namespace writerperfect
namespace exp namespace exp
{ {
/// Handler for <office:automatic-styles>/<office:styles>. /// Handler for <office:automatic-styles>/<office:master-styles>/<office:styles>.
class XMLStylesContext : public XMLImportContext class XMLStylesContext : public XMLImportContext
{ {
public: public:
XMLStylesContext(XMLImport &rImport, bool bAutomatic); enum StyleType
{
StyleType_NONE,
StyleType_AUTOMATIC,
StyleType_MASTER
};
XMLStylesContext(XMLImport &rImport, StyleType eType);
rtl::Reference<XMLImportContext> CreateChildContext(const OUString &rName, const css::uno::Reference<css::xml::sax::XAttributeList> &xAttribs) override; rtl::Reference<XMLImportContext> CreateChildContext(const OUString &rName, const css::uno::Reference<css::xml::sax::XAttributeList> &xAttribs) override;
...@@ -36,6 +42,7 @@ public: ...@@ -36,6 +42,7 @@ public:
std::map<OUString, librevenge::RVNGPropertyList> &GetCurrentRowStyles(); std::map<OUString, librevenge::RVNGPropertyList> &GetCurrentRowStyles();
std::map<OUString, librevenge::RVNGPropertyList> &GetCurrentTableStyles(); std::map<OUString, librevenge::RVNGPropertyList> &GetCurrentTableStyles();
std::map<OUString, librevenge::RVNGPropertyList> &GetCurrentGraphicStyles(); std::map<OUString, librevenge::RVNGPropertyList> &GetCurrentGraphicStyles();
std::map<OUString, librevenge::RVNGPropertyList> &GetCurrentPageLayouts();
private: private:
std::map<OUString, librevenge::RVNGPropertyList> &m_rParagraphStyles; std::map<OUString, librevenge::RVNGPropertyList> &m_rParagraphStyles;
std::map<OUString, librevenge::RVNGPropertyList> &m_rTextStyles; std::map<OUString, librevenge::RVNGPropertyList> &m_rTextStyles;
...@@ -44,6 +51,8 @@ private: ...@@ -44,6 +51,8 @@ private:
std::map<OUString, librevenge::RVNGPropertyList> &m_rRowStyles; std::map<OUString, librevenge::RVNGPropertyList> &m_rRowStyles;
std::map<OUString, librevenge::RVNGPropertyList> &m_rTableStyles; std::map<OUString, librevenge::RVNGPropertyList> &m_rTableStyles;
std::map<OUString, librevenge::RVNGPropertyList> &m_rGraphicStyles; std::map<OUString, librevenge::RVNGPropertyList> &m_rGraphicStyles;
std::map<OUString, librevenge::RVNGPropertyList> &m_rPageLayouts;
StyleType m_eType;
}; };
/// Handler for <office:font-face-decls>. /// Handler for <office:font-face-decls>.
......
...@@ -246,11 +246,13 @@ rtl::Reference<XMLImportContext> XMLOfficeDocContext::CreateChildContext(const O ...@@ -246,11 +246,13 @@ rtl::Reference<XMLImportContext> XMLOfficeDocContext::CreateChildContext(const O
else if (rName == "office:meta") else if (rName == "office:meta")
return new XMLMetaDocumentContext(mrImport); return new XMLMetaDocumentContext(mrImport);
else if (rName == "office:automatic-styles") else if (rName == "office:automatic-styles")
return new XMLStylesContext(mrImport, /*bAutomatic=*/true); return new XMLStylesContext(mrImport, XMLStylesContext::StyleType_AUTOMATIC);
else if (rName == "office:styles") else if (rName == "office:styles")
return new XMLStylesContext(mrImport, /*bAutomatic=*/false); return new XMLStylesContext(mrImport, XMLStylesContext::StyleType_NONE);
else if (rName == "office:font-face-decls") else if (rName == "office:font-face-decls")
return new XMLFontFaceDeclsContext(mrImport); return new XMLFontFaceDeclsContext(mrImport);
else if (rName == "office:master-styles")
return new XMLStylesContext(mrImport, XMLStylesContext::StyleType_MASTER);
return nullptr; return nullptr;
} }
...@@ -339,6 +341,16 @@ bool XMLImport::FillPopupData(const OUString &rURL, librevenge::RVNGPropertyList ...@@ -339,6 +341,16 @@ bool XMLImport::FillPopupData(const OUString &rURL, librevenge::RVNGPropertyList
return false; return false;
} }
void XMLImport::SetPageSpanOpened(bool bPageSpanOpened)
{
mbPageSpanOpened = bPageSpanOpened;
}
bool XMLImport::IsPageSpanOpened() const
{
return mbPageSpanOpened;
}
rtl::Reference<XMLImportContext> XMLImport::CreateContext(const OUString &rName, const css::uno::Reference<css::xml::sax::XAttributeList> &/*xAttribs*/) rtl::Reference<XMLImportContext> XMLImport::CreateContext(const OUString &rName, const css::uno::Reference<css::xml::sax::XAttributeList> &/*xAttribs*/)
{ {
if (rName == "office:document") if (rName == "office:document")
...@@ -421,6 +433,16 @@ std::map<OUString, librevenge::RVNGPropertyList> &XMLImport::GetGraphicStyles() ...@@ -421,6 +433,16 @@ std::map<OUString, librevenge::RVNGPropertyList> &XMLImport::GetGraphicStyles()
return maGraphicStyles; return maGraphicStyles;
} }
std::map<OUString, librevenge::RVNGPropertyList> &XMLImport::GetPageLayouts()
{
return maPageLayouts;
}
std::map<OUString, librevenge::RVNGPropertyList> &XMLImport::GetMasterPages()
{
return maMasterPages;
}
void XMLImport::startDocument() void XMLImport::startDocument()
{ {
mrGenerator.startDocument(librevenge::RVNGPropertyList()); mrGenerator.startDocument(librevenge::RVNGPropertyList());
...@@ -428,6 +450,11 @@ void XMLImport::startDocument() ...@@ -428,6 +450,11 @@ void XMLImport::startDocument()
void XMLImport::endDocument() void XMLImport::endDocument()
{ {
if (mbPageSpanOpened)
{
mrGenerator.closePageSpan();
mbPageSpanOpened = false;
}
mrGenerator.endDocument(); mrGenerator.endDocument();
} }
......
...@@ -52,12 +52,15 @@ class XMLImport : public cppu::WeakImplHelper ...@@ -52,12 +52,15 @@ class XMLImport : public cppu::WeakImplHelper
std::map<OUString, librevenge::RVNGPropertyList> maTableStyles; std::map<OUString, librevenge::RVNGPropertyList> maTableStyles;
std::map<OUString, librevenge::RVNGPropertyList> maAutomaticGraphicStyles; std::map<OUString, librevenge::RVNGPropertyList> maAutomaticGraphicStyles;
std::map<OUString, librevenge::RVNGPropertyList> maGraphicStyles; std::map<OUString, librevenge::RVNGPropertyList> maGraphicStyles;
std::map<OUString, librevenge::RVNGPropertyList> maPageLayouts;
std::map<OUString, librevenge::RVNGPropertyList> maMasterPages;
librevenge::RVNGPropertyListVector maCoverImages; librevenge::RVNGPropertyListVector maCoverImages;
/// Author, date, etc -- overwrites what would be from the document out of the box. /// Author, date, etc -- overwrites what would be from the document out of the box.
librevenge::RVNGPropertyList maMetaData; librevenge::RVNGPropertyList maMetaData;
const css::uno::Reference<css::uno::XComponentContext> &mxContext; const css::uno::Reference<css::uno::XComponentContext> &mxContext;
css::uno::Reference<css::uri::XUriReferenceFactory> mxUriReferenceFactory; css::uno::Reference<css::uri::XUriReferenceFactory> mxUriReferenceFactory;
OUString maMediaDir; OUString maMediaDir;
bool mbPageSpanOpened = false;
public: public:
XMLImport(const css::uno::Reference<css::uno::XComponentContext> &xContext, librevenge::RVNGTextInterface &rGenerator, const OUString &rURL, const css::uno::Sequence<css::beans::PropertyValue> &rDescriptor); XMLImport(const css::uno::Reference<css::uno::XComponentContext> &xContext, librevenge::RVNGTextInterface &rGenerator, const OUString &rURL, const css::uno::Sequence<css::beans::PropertyValue> &rDescriptor);
...@@ -79,9 +82,13 @@ public: ...@@ -79,9 +82,13 @@ public:
std::map<OUString, librevenge::RVNGPropertyList> &GetRowStyles(); std::map<OUString, librevenge::RVNGPropertyList> &GetRowStyles();
std::map<OUString, librevenge::RVNGPropertyList> &GetTableStyles(); std::map<OUString, librevenge::RVNGPropertyList> &GetTableStyles();
std::map<OUString, librevenge::RVNGPropertyList> &GetGraphicStyles(); std::map<OUString, librevenge::RVNGPropertyList> &GetGraphicStyles();
std::map<OUString, librevenge::RVNGPropertyList> &GetPageLayouts();
std::map<OUString, librevenge::RVNGPropertyList> &GetMasterPages();
const librevenge::RVNGPropertyListVector &GetCoverImages(); const librevenge::RVNGPropertyListVector &GetCoverImages();
const librevenge::RVNGPropertyList &GetMetaData(); const librevenge::RVNGPropertyList &GetMetaData();
bool FillPopupData(const OUString &rURL, librevenge::RVNGPropertyList &rPropList); bool FillPopupData(const OUString &rURL, librevenge::RVNGPropertyList &rPropList);
void SetPageSpanOpened(bool bPageSpanOpened);
bool IsPageSpanOpened() const;
// XDocumentHandler // XDocumentHandler
void SAL_CALL startDocument() override; void SAL_CALL startDocument() override;
......
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