summaryrefslogtreecommitdiff
path: root/writerperfect/source/writer
diff options
context:
space:
mode:
authorMark Hung <marklh9@gmail.com>2019-05-30 22:59:29 +0800
committerMiklos Vajna <vmiklos@collabora.com>2019-05-31 09:12:23 +0200
commit966dc7f2cf500bb529394e1865e2cc6e5b264ab0 (patch)
tree68509d47df70595ca536f3ac6ae69516ef37e0a7 /writerperfect/source/writer
parent92418d9454e5842d34dd8140115ba42515c0d816 (diff)
EPUB export: fix not properly paired openPageSpan
Fix the test case converting abi11105.abw to EPUB file. ( the attachment at <https://bugzilla.abisource.com/show_bug.cgi?id=11105#c1> ) soffice.bin: .../sax/source/expatwrap/saxwriter.cxx:1184: virtual void (anonymous namespace)::SAXWriter::endElement(const rtl::OUString &): Assertion `aName == m_pSaxWriterHelper->m_DebugStartedElements.top()' failed. We used to invoke handlePageSpan when starting a paragraph or a table element that has master-page-name defined in the referred style, and invoke closePageSpan when XMLBodyContentContext. Limit the handling of page span to top-level paragraph or tables so that it doesn't messed up in the nested ( paragraph that changed it's page style in a table cell ) case. Change-Id: Ic8637663aaa7506ced9758bd7ccd7233309e8557 Reviewed-on: https://gerrit.libreoffice.org/73214 Tested-by: Jenkins Reviewed-by: Miklos Vajna <vmiklos@collabora.com>
Diffstat (limited to 'writerperfect/source/writer')
-rw-r--r--writerperfect/source/writer/exp/txtparai.cxx6
-rw-r--r--writerperfect/source/writer/exp/txtparai.hxx5
-rw-r--r--writerperfect/source/writer/exp/xmltbli.cxx6
-rw-r--r--writerperfect/source/writer/exp/xmltbli.hxx5
-rw-r--r--writerperfect/source/writer/exp/xmltext.cxx9
-rw-r--r--writerperfect/source/writer/exp/xmltext.hxx3
6 files changed, 23 insertions, 11 deletions
diff --git a/writerperfect/source/writer/exp/txtparai.cxx b/writerperfect/source/writer/exp/txtparai.cxx
index 7ab5171fad01..65f521c6a20f 100644
--- a/writerperfect/source/writer/exp/txtparai.cxx
+++ b/writerperfect/source/writer/exp/txtparai.cxx
@@ -503,8 +503,9 @@ void XMLHyperlinkContext::characters(const OUString& rChars)
GetImport().GetGenerator().closeSpan();
}
-XMLParaContext::XMLParaContext(XMLImport& rImport)
+XMLParaContext::XMLParaContext(XMLImport& rImport, bool bTopLevel)
: XMLImportContext(rImport)
+ , m_bTopLevel(bTopLevel)
{
}
@@ -535,7 +536,8 @@ void XMLParaContext::startElement(
GetImport().GetParagraphStyles(), aPropertyList);
FillStyles(m_aStyleName, GetImport().GetAutomaticTextStyles(),
GetImport().GetTextStyles(), m_aTextPropertyList);
- GetImport().HandlePageSpan(aPropertyList);
+ if (m_bTopLevel)
+ GetImport().HandlePageSpan(aPropertyList);
}
else
{
diff --git a/writerperfect/source/writer/exp/txtparai.hxx b/writerperfect/source/writer/exp/txtparai.hxx
index b87a5762b7a3..561be4f0a115 100644
--- a/writerperfect/source/writer/exp/txtparai.hxx
+++ b/writerperfect/source/writer/exp/txtparai.hxx
@@ -24,7 +24,7 @@ namespace exp
class XMLParaContext : public XMLImportContext
{
public:
- XMLParaContext(XMLImport& rImport);
+ XMLParaContext(XMLImport& rImport, bool bTopLevel = false);
rtl::Reference<XMLImportContext> CreateChildContext(
const OUString& rName,
@@ -40,6 +40,9 @@ private:
OUString m_aStyleName;
/// List of properties spans should inherit from this paragraph.
librevenge::RVNGPropertyList m_aTextPropertyList;
+ /// If the context is a direct child of XMLBodyContentContext.
+ /// Only direct child of XMLBodyContentContext has to handle page span.
+ bool m_bTopLevel;
};
/// Shared child context factory for paragraph and span contexts.
diff --git a/writerperfect/source/writer/exp/xmltbli.cxx b/writerperfect/source/writer/exp/xmltbli.cxx
index a54210ad147f..a96582ecc3f9 100644
--- a/writerperfect/source/writer/exp/xmltbli.cxx
+++ b/writerperfect/source/writer/exp/xmltbli.cxx
@@ -184,8 +184,9 @@ int XMLTableRowContext::GetColumn() const { return m_nColumn; }
void XMLTableRowContext::SetColumn(int nColumn) { m_nColumn = nColumn; }
-XMLTableContext::XMLTableContext(XMLImport& rImport)
+XMLTableContext::XMLTableContext(XMLImport& rImport, bool bTopLevel)
: XMLImportContext(rImport)
+ , m_bTopLevel(bTopLevel)
{
}
@@ -224,7 +225,8 @@ void XMLTableContext::startElement(
{
FillStyles(rAttributeValue, GetImport().GetAutomaticTableStyles(),
GetImport().GetTableStyles(), m_aPropertyList);
- GetImport().HandlePageSpan(m_aPropertyList);
+ if (m_bTopLevel)
+ GetImport().HandlePageSpan(m_aPropertyList);
}
else
{
diff --git a/writerperfect/source/writer/exp/xmltbli.hxx b/writerperfect/source/writer/exp/xmltbli.hxx
index 6b7d7b267cbe..dff4dda2f988 100644
--- a/writerperfect/source/writer/exp/xmltbli.hxx
+++ b/writerperfect/source/writer/exp/xmltbli.hxx
@@ -22,7 +22,7 @@ namespace exp
class XMLTableContext : public XMLImportContext
{
public:
- XMLTableContext(XMLImport& rImport);
+ XMLTableContext(XMLImport& rImport, bool bTopLevel = false);
rtl::Reference<XMLImportContext>
CreateChildContext(const OUString& rName,
@@ -35,6 +35,9 @@ public:
private:
bool m_bTableOpened = false;
+ /// If the context is a direct child of XMLBodyContentContext.
+ /// Only direct child of XMLBodyContentContext has to handle page span.
+ bool m_bTopLevel;
librevenge::RVNGPropertyList m_aPropertyList;
librevenge::RVNGPropertyListVector m_aColumns;
};
diff --git a/writerperfect/source/writer/exp/xmltext.cxx b/writerperfect/source/writer/exp/xmltext.cxx
index 8177be04b573..d976ebdbf846 100644
--- a/writerperfect/source/writer/exp/xmltext.cxx
+++ b/writerperfect/source/writer/exp/xmltext.cxx
@@ -35,17 +35,18 @@ void XMLBodyContentContext::endElement(const OUString& /*rName*/)
rtl::Reference<XMLImportContext> XMLBodyContentContext::CreateChildContext(
const OUString& rName, const css::uno::Reference<css::xml::sax::XAttributeList>& /*xAttribs*/)
{
- return CreateTextChildContext(GetImport(), rName);
+ return CreateTextChildContext(GetImport(), rName, true);
}
-rtl::Reference<XMLImportContext> CreateTextChildContext(XMLImport& rImport, const OUString& rName)
+rtl::Reference<XMLImportContext> CreateTextChildContext(XMLImport& rImport, const OUString& rName,
+ bool bTopLevel)
{
if (rName == "text:p" || rName == "text:h")
- return new XMLParaContext(rImport);
+ return new XMLParaContext(rImport, bTopLevel);
if (rName == "text:section")
return new XMLSectionContext(rImport);
if (rName == "table:table")
- return new XMLTableContext(rImport);
+ return new XMLTableContext(rImport, bTopLevel);
if (rName == "text:list")
return new XMLTextListContext(rImport);
return nullptr;
diff --git a/writerperfect/source/writer/exp/xmltext.hxx b/writerperfect/source/writer/exp/xmltext.hxx
index b635176ce4ce..756a7ddbcb64 100644
--- a/writerperfect/source/writer/exp/xmltext.hxx
+++ b/writerperfect/source/writer/exp/xmltext.hxx
@@ -29,7 +29,8 @@ public:
};
/// Context factory for body text, section, table cell, etc.
-rtl::Reference<XMLImportContext> CreateTextChildContext(XMLImport& rImport, const OUString& rName);
+rtl::Reference<XMLImportContext> CreateTextChildContext(XMLImport& rImport, const OUString& rName,
+ bool bTopLevel = false);
} // namespace exp
} // namespace writerperfect