summaryrefslogtreecommitdiff
path: root/writerperfect/source/writer/exp/txtparai.cxx
diff options
context:
space:
mode:
authorMiklos Vajna <vmiklos@collabora.co.uk>2017-09-07 13:02:49 +0200
committerMiklos Vajna <vmiklos@collabora.co.uk>2017-09-07 14:12:15 +0200
commit3829949e91c578bc9e99858ec170f0c6736d9828 (patch)
treefc2967c9f51a01ea82711796732be8ed63f5da09 /writerperfect/source/writer/exp/txtparai.cxx
parent41a85500a70533e1c9791c3a4f8b6c24f2143682 (diff)
EPUB export: handle nested spans
ODT export uses nested spans to represent a combination of named character style + automatic style (instead of having a parent for the automatic style), but librevenge doesn't allow nested spans, so handle this explicitly. The alternative would have been to remember the attribute list as member data, but the underlying SvXMLAttributeList is reused after startElement() returns, so it by the time characters() is invoked, it won't have the data we need anymore. (Would be a trade-off between doing the attributes -> property list conversion exactly once or depending the number of characters() invocation anyway.) Change-Id: I1dd2f060c421c126340db471a257093b30431d17 Reviewed-on: https://gerrit.libreoffice.org/42046 Reviewed-by: Miklos Vajna <vmiklos@collabora.co.uk> Tested-by: Jenkins <ci@libreoffice.org>
Diffstat (limited to 'writerperfect/source/writer/exp/txtparai.cxx')
-rw-r--r--writerperfect/source/writer/exp/txtparai.cxx35
1 files changed, 21 insertions, 14 deletions
diff --git a/writerperfect/source/writer/exp/txtparai.cxx b/writerperfect/source/writer/exp/txtparai.cxx
index 9658d79f48b9..984070ba7fc4 100644
--- a/writerperfect/source/writer/exp/txtparai.cxx
+++ b/writerperfect/source/writer/exp/txtparai.cxx
@@ -74,56 +74,63 @@ namespace exp
class XMLSpanContext : public XMLImportContext
{
public:
- XMLSpanContext(XMLImport &rImport);
+ XMLSpanContext(XMLImport &rImport, const librevenge::RVNGPropertyList *pPropertyList);
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;
void SAL_CALL characters(const OUString &rChars) override;
+
+private:
+ librevenge::RVNGPropertyList m_aPropertyList;
};
-XMLSpanContext::XMLSpanContext(XMLImport &rImport)
+XMLSpanContext::XMLSpanContext(XMLImport &rImport, const librevenge::RVNGPropertyList *pPropertyList)
: XMLImportContext(rImport)
{
+ if (!pPropertyList)
+ return;
+
+ // Inherit properties from parent span.
+ librevenge::RVNGPropertyList::Iter itProp(*pPropertyList);
+ for (itProp.rewind(); itProp.next();)
+ m_aPropertyList.insert(itProp.key(), itProp()->clone());
}
XMLImportContext *XMLSpanContext::CreateChildContext(const OUString &rName, const css::uno::Reference<css::xml::sax::XAttributeList> &/*xAttribs*/)
{
if (rName == "draw:frame")
return new XMLTextFrameContext(mrImport);
+ if (rName == "text:span")
+ return new XMLSpanContext(mrImport, &m_aPropertyList);
return nullptr;
}
void XMLSpanContext::startElement(const OUString &/*rName*/, const css::uno::Reference<css::xml::sax::XAttributeList> &xAttribs)
{
- librevenge::RVNGPropertyList aPropertyList;
for (sal_Int16 i = 0; i < xAttribs->getLength(); ++i)
{
const OUString &rAttributeName = xAttribs->getNameByIndex(i);
const OUString &rAttributeValue = xAttribs->getValueByIndex(i);
if (rAttributeName == "text:style-name")
- FillStyles(rAttributeValue, mrImport.GetAutomaticTextStyles(), mrImport.GetTextStyles(), aPropertyList);
+ FillStyles(rAttributeValue, mrImport.GetAutomaticTextStyles(), mrImport.GetTextStyles(), m_aPropertyList);
else
{
OString sName = OUStringToOString(rAttributeName, RTL_TEXTENCODING_UTF8);
OString sValue = OUStringToOString(rAttributeValue, RTL_TEXTENCODING_UTF8);
- aPropertyList.insert(sName.getStr(), sValue.getStr());
+ m_aPropertyList.insert(sName.getStr(), sValue.getStr());
}
}
-
- mrImport.GetGenerator().openSpan(aPropertyList);
-}
-
-void XMLSpanContext::endElement(const OUString &/*rName*/)
-{
- mrImport.GetGenerator().closeSpan();
}
void XMLSpanContext::characters(const OUString &rChars)
{
+ mrImport.GetGenerator().openSpan(m_aPropertyList);
+
OString sCharU8 = OUStringToOString(rChars, RTL_TEXTENCODING_UTF8);
mrImport.GetGenerator().insertText(librevenge::RVNGString(sCharU8.getStr()));
+
+ mrImport.GetGenerator().closeSpan();
}
/// Handler for <text:a>.
@@ -178,7 +185,7 @@ XMLParaContext::XMLParaContext(XMLImport &rImport)
XMLImportContext *XMLParaContext::CreateChildContext(const OUString &rName, const css::uno::Reference<css::xml::sax::XAttributeList> &/*xAttribs*/)
{
if (rName == "text:span")
- return new XMLSpanContext(mrImport);
+ return new XMLSpanContext(mrImport, nullptr);
if (rName == "text:a")
return new XMLHyperlinkContext(mrImport);
return nullptr;