summaryrefslogtreecommitdiff
path: root/writerfilter
diff options
context:
space:
mode:
authorMiklos Vajna <vmiklos@collabora.com>2020-10-21 18:34:21 +0200
committerMiklos Vajna <vmiklos@collabora.com>2020-10-27 14:06:56 +0100
commit48b3970d78fb8139ed4331477b0e06cdeec6f94e (patch)
tree8536a747d97c2c410baca53f36b601ccaafc1c03 /writerfilter
parentc2eb3259894b56e0dc8fe4762c66e05f37d48e40 (diff)
writerfilter: add OOXML tokenizer for <w:altChunk r:id="..."/>
This is just the tokenizer, the domain mapper part still has to be done. (cherry picked from commit 37a8142720b82d7ce6db0c09593de5cab11c51fd) Conflicts: writerfilter/source/ooxml/Handler.cxx Change-Id: Iba171edeac42f1fa62b49dd0d188d41a539bb0c0 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/104868 Tested-by: Jenkins CollaboraOffice <jenkinscollaboraoffice@gmail.com> Reviewed-by: Miklos Vajna <vmiklos@collabora.com>
Diffstat (limited to 'writerfilter')
-rw-r--r--writerfilter/source/ooxml/Handler.cxx25
-rw-r--r--writerfilter/source/ooxml/Handler.hxx13
-rw-r--r--writerfilter/source/ooxml/OOXMLFastContextHandler.cxx6
-rw-r--r--writerfilter/source/ooxml/OOXMLFastContextHandler.hxx1
-rw-r--r--writerfilter/source/ooxml/factoryimpl_ns.py2
-rw-r--r--writerfilter/source/ooxml/model.xml7
6 files changed, 53 insertions, 1 deletions
diff --git a/writerfilter/source/ooxml/Handler.cxx b/writerfilter/source/ooxml/Handler.cxx
index 459e0adc480a..26b3caa57f56 100644
--- a/writerfilter/source/ooxml/Handler.cxx
+++ b/writerfilter/source/ooxml/Handler.cxx
@@ -399,6 +399,31 @@ void OOXMLHyperlinkURLHandler::sprm(Sprm & /*rSprm*/)
{
}
+OOXMLAltChunkHandler::OOXMLAltChunkHandler(OOXMLFastContextHandler* pContext)
+ : mpFastContext(pContext)
+{
+}
+
+OOXMLAltChunkHandler::~OOXMLAltChunkHandler()
+{
+ mpFastContext->clearProps();
+ mpFastContext->newProperty(NS_ooxml::LN_CT_AltChunk,
+ OOXMLValue::Pointer_t(new OOXMLStringValue(m_aStreamName)));
+}
+
+void OOXMLAltChunkHandler::attribute(Id nName, Value& rValue)
+{
+ switch (nName)
+ {
+ case NS_ooxml::LN_CT_AltChunk:
+ m_aStreamName = mpFastContext->getTargetForId(rValue.getString());
+ break;
+ default:
+ break;
+ }
+}
+
+void OOXMLAltChunkHandler::sprm(Sprm& /*rSprm*/) {}
}}
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerfilter/source/ooxml/Handler.hxx b/writerfilter/source/ooxml/Handler.hxx
index 47ae7d562a53..5c4623c93c7e 100644
--- a/writerfilter/source/ooxml/Handler.hxx
+++ b/writerfilter/source/ooxml/Handler.hxx
@@ -156,6 +156,19 @@ public:
virtual void sprm(Sprm & sprm) override;
};
+/// Looks up the stream name for a '<w:altChunk r:id="..."/>' reference.
+class OOXMLAltChunkHandler : public Properties
+{
+ OOXMLFastContextHandler * mpFastContext;
+ OUString m_aStreamName;
+
+public:
+ explicit OOXMLAltChunkHandler(OOXMLFastContextHandler * pContext);
+ virtual ~OOXMLAltChunkHandler() override;
+
+ virtual void attribute(Id name, Value & val) override;
+ virtual void sprm(Sprm & sprm) override;
+};
}}
#endif // INCLUDED_WRITERFILTER_SOURCE_OOXML_HANDLER_HXX
diff --git a/writerfilter/source/ooxml/OOXMLFastContextHandler.cxx b/writerfilter/source/ooxml/OOXMLFastContextHandler.cxx
index 7d3c081b2676..d64192c115e4 100644
--- a/writerfilter/source/ooxml/OOXMLFastContextHandler.cxx
+++ b/writerfilter/source/ooxml/OOXMLFastContextHandler.cxx
@@ -1099,6 +1099,12 @@ void OOXMLFastContextHandlerProperties::handleHyperlinkURL() {
getPropertySet()->resolve(aHyperlinkURLHandler);
}
+void OOXMLFastContextHandlerProperties::handleAltChunk()
+{
+ OOXMLAltChunkHandler aHandler(this);
+ getPropertySet()->resolve(aHandler);
+}
+
void OOXMLFastContextHandlerProperties::setPropertySet
(const OOXMLPropertySet::Pointer_t& pPropertySet)
{
diff --git a/writerfilter/source/ooxml/OOXMLFastContextHandler.hxx b/writerfilter/source/ooxml/OOXMLFastContextHandler.hxx
index 0cc3fb1791a9..4f2a070c85de 100644
--- a/writerfilter/source/ooxml/OOXMLFastContextHandler.hxx
+++ b/writerfilter/source/ooxml/OOXMLFastContextHandler.hxx
@@ -285,6 +285,7 @@ public:
void handleOLE();
void handleFontRel();
void handleHyperlinkURL();
+ void handleAltChunk();
virtual void setPropertySet(const OOXMLPropertySet::Pointer_t& pPropertySet) override;
virtual OOXMLPropertySet::Pointer_t getPropertySet() const override;
diff --git a/writerfilter/source/ooxml/factoryimpl_ns.py b/writerfilter/source/ooxml/factoryimpl_ns.py
index 41fa714678c7..4375a2513682 100644
--- a/writerfilter/source/ooxml/factoryimpl_ns.py
+++ b/writerfilter/source/ooxml/factoryimpl_ns.py
@@ -429,7 +429,7 @@ def factoryChooseAction(actionNode):
ret.append(" {")
extra_space = " "
- if actionNode.getAttribute("action") in ("handleXNotes", "handleHdrFtr", "handleComment", "handlePicture", "handleBreak", "handleOutOfOrderBreak", "handleOLE", "handleFontRel", "handleHyperlinkURL"):
+ if actionNode.getAttribute("action") in ("handleXNotes", "handleHdrFtr", "handleComment", "handlePicture", "handleBreak", "handleOutOfOrderBreak", "handleOLE", "handleFontRel", "handleHyperlinkURL", "handleAltChunk"):
ret.append(" %sif (OOXMLFastContextHandlerProperties* pProperties = dynamic_cast<OOXMLFastContextHandlerProperties*>(pHandler))" % extra_space)
ret.append(" %s pProperties->%s();" % (extra_space, actionNode.getAttribute("action")))
elif actionNode.getAttribute("action") == "propagateCharacterPropertiesAsSet":
diff --git a/writerfilter/source/ooxml/model.xml b/writerfilter/source/ooxml/model.xml
index eb84d6e6a4e8..4ac953bacb1d 100644
--- a/writerfilter/source/ooxml/model.xml
+++ b/writerfilter/source/ooxml/model.xml
@@ -18110,6 +18110,10 @@
<action name="start" action="sendPropertiesWithId" sendtokenid="ooxml:paratrackchange"/>
<action name="start" action="clearProps"/>
</resource>
+ <resource name="CT_AltChunk" resource="Properties">
+ <attribute name="r:id" tokenid="ooxml:CT_AltChunk"/>
+ <action name="start" action="handleAltChunk"/>
+ </resource>
<resource name="ST_RubyAlign" resource="List">
<value tokenid="ooxml:Value_ST_RubyAlign_center">center</value>
<value tokenid="ooxml:Value_ST_RubyAlign_distributeLetter">distributeLetter</value>
@@ -19029,6 +19033,9 @@
<attribute name="name" tokenid="ooxml:CT_Font_name"/>
</resource>
<resource name="CT_FontsList" resource="Table" tokenid="ooxml:FONTTABLE"/>
+ <resource name="EG_BlockLevelElts" resource="Properties">
+ <attribute name="name" tokenid="ooxml:EG_BlockLevelElts_altChunk"/>
+ </resource>
<resource name="EG_RunLevelElts" resource="Stream">
<element name="proofErr" tokenid="ooxml:EG_RunLevelElts_proofErr"/>
<element name="permStart" tokenid="ooxml:EG_RunLevelElts_permStart"/>