diff options
author | Mike Kaganski <mike.kaganski@collabora.com> | 2018-08-27 12:34:12 +0300 |
---|---|---|
committer | Andras Timar <andras.timar@collabora.com> | 2018-09-21 00:24:37 -0700 |
commit | 6a03a91c4ee7fb875aa7818b026ff0fa6d72c83c (patch) | |
tree | ed577bfa6c3f02ebbdec7914b4238e25d600b976 | |
parent | dab16fd108e13b94deea01cd2fa325e9ab94fb22 (diff) |
tdf#119143: introduce tentative directional embedding import support
ECMA-376-1:2016 states that w:dir is functionally equivalent to LRE/RLE+PDF
pair around the enclosed runs. So this patch does just that.
Change-Id: Ibf9775338cc38a3bbc38a42a33fc64ae787b478f
Reviewed-on: https://gerrit.libreoffice.org/59643
Tested-by: Jenkins
Reviewed-by: Mike Kaganski <mike.kaganski@collabora.com>
Reviewed-on: https://gerrit.libreoffice.org/59672
Reviewed-by: Aron Budea <aron.budea@collabora.com>
Tested-by: Aron Budea <aron.budea@collabora.com>
(cherry picked from commit 348a1e11045ca8d9dbceab43a68d44dbde3f922c)
-rw-r--r-- | sw/qa/extras/ooxmlexport/data/tdf119143.docx | bin | 0 -> 17052 bytes | |||
-rw-r--r-- | sw/qa/extras/ooxmlexport/ooxmlexport9.cxx | 42 | ||||
-rw-r--r-- | writerfilter/source/ooxml/OOXMLFastContextHandler.cxx | 18 | ||||
-rw-r--r-- | writerfilter/source/ooxml/OOXMLFastContextHandler.hxx | 5 | ||||
-rw-r--r-- | writerfilter/source/ooxml/model.xml | 24 |
5 files changed, 89 insertions, 0 deletions
diff --git a/sw/qa/extras/ooxmlexport/data/tdf119143.docx b/sw/qa/extras/ooxmlexport/data/tdf119143.docx Binary files differnew file mode 100644 index 000000000000..be0bc03f71c1 --- /dev/null +++ b/sw/qa/extras/ooxmlexport/data/tdf119143.docx diff --git a/sw/qa/extras/ooxmlexport/ooxmlexport9.cxx b/sw/qa/extras/ooxmlexport/ooxmlexport9.cxx index 079fadcca914..7e6b07bde3ec 100644 --- a/sw/qa/extras/ooxmlexport/ooxmlexport9.cxx +++ b/sw/qa/extras/ooxmlexport/ooxmlexport9.cxx @@ -733,6 +733,48 @@ DECLARE_OOXMLEXPORT_TEST(testTdf116976, "tdf116976.docx") getProperty<sal_Int16>(getShape(1), "RelativeWidth")); } +DECLARE_OOXMLEXPORT_TEST(testTdf119143, "tdf119143.docx") +{ + const char sParaTextExpected[] = + "\xD8\xB9\xD9\x86\xD8\xAF\xD9\x85\xD8\xA7 \xD9\x8A\xD8\xB1\xD9\x8A\xD8\xAF \xD8\xA7\xD9\x84" + "\xD8\xB9\xD8\xA7\xD9\x84\xD9\x85 \xD8\xA3\xD9\x86 \xD9\x8A\xD8\xAA\xD9\x83\xD9\x84\xD9\x91" + "\xD9\x85 \xE2\x80\xAC \xD8\x8C \xD9\x81\xD9\x87\xD9\x88 \xD9\x8A\xD8\xAA\xD8\xAD\xD8\xAF" + "\xD9\x91\xD8\xAB \xD8\xA8\xD9\x84\xD8\xBA\xD8\xA9 \xD9\x8A\xD9\x88\xD9\x86\xD9\x8A\xD9\x83" + "\xD9\x88\xD8\xAF. \xD8\xAA\xD8\xB3\xD8\xAC\xD9\x91\xD9\x84 \xD8\xA7\xD9\x84\xD8\xA2\xD9" + "\x86 \xD9\x84\xD8\xAD\xD8\xB6\xD9\x88\xD8\xB1 \xD8\xA7\xD9\x84\xD9\x85\xD8\xA4\xD8\xAA\xD9" + "\x85\xD8\xB1 \xD8\xA7\xD9\x84\xD8\xAF\xD9\x88\xD9\x84\xD9\x8A \xD8\xA7\xD9\x84\xD8\xB9\xD8" + "\xA7\xD8\xB4\xD8\xB1 \xD9\x84\xD9\x8A\xD9\x88\xD9\x86\xD9\x8A\xD9\x83\xD9\x88\xD8\xAF (Uni" + "code Conference)\xD8\x8C \xD8\xA7\xD9\x84\xD8\xB0\xD9\x8A \xD8\xB3\xD9\x8A\xD8\xB9\xD9\x82" + "\xD8\xAF \xD9\x81\xD9\x8A 10-12 \xD8\xA2\xD8\xB0\xD8\xA7\xD8\xB1 1997 \xD8\xA8\xD9\x85\xD8" + "\xAF\xD9\x8A\xD9\x86\xD8\xA9 \xD9\x85\xD9\x8E\xD8\xA7\xD9\x8A\xD9\x90\xD9\x86\xD9\x92\xD8" + "\xAA\xD9\x92\xD8\xB3\xD8\x8C \xD8\xA3\xD9\x84\xD9\x85\xD8\xA7\xD9\x86\xD9\x8A\xD8\xA7. " + "\xD9\x88 \xD8\xB3\xD9\x8A\xD8\xAC\xD9\x85\xD8\xB9 \xD8\xA7\xD9\x84\xD9\x85\xD8\xA4\xD8\xAA" + "\xD9\x85\xD8\xB1 \xD8\xA8\xD9\x8A\xD9\x86 \xD8\xAE\xD8\xA8\xD8\xB1\xD8\xA7\xD8\xA1 \xD9" + "\x85\xD9\x86 \xD9\x83\xD8\xA7\xD9\x81\xD8\xA9 \xD9\x82\xD8\xB7\xD8\xA7\xD8\xB9\xD8\xA7\xD8" + "\xAA \xD8\xA7\xD9\x84\xD8\xB5\xD9\x86\xD8\xA7\xD8\xB9\xD8\xA9 \xD8\xB9\xD9\x84\xD9\x89 " + "\xD8\xA7\xD9\x84\xD8\xB4\xD8\xA8\xD9\x83\xD8\xA9 \xD8\xA7\xD9\x84\xD8\xB9\xD8\xA7\xD9\x84" + "\xD9\x85\xD9\x8A\xD8\xA9 \xD8\xA7\xD9\x86\xD8\xAA\xD8\xB1\xD9\x86\xD9\x8A\xD8\xAA \xD9\x88" + "\xD9\x8A\xD9\x88\xD9\x86\xD9\x8A\xD9\x83\xD9\x88\xD8\xAF\xD8\x8C \xD8\xAD\xD9\x8A\xD8\xAB " + "\xD8\xB3\xD8\xAA\xD8\xAA\xD9\x85\xD8\x8C \xD8\xB9\xD9\x84\xD9\x89 \xD8\xA7\xD9\x84\xD8\xB5" + "\xD8\xB9\xD9\x8A\xD8\xAF\xD9\x8A\xD9\x86 \xD8\xA7\xD9\x84\xD8\xAF\xD9\x88\xD9\x84\xD9\x8A " + "\xD9\x88\xD8\xA7\xD9\x84\xD9\x85\xD8\xAD\xD9\x84\xD9\x8A \xD8\xB9\xD9\x84\xD9\x89 \xD8\xAD" + "\xD8\xAF \xD8\xB3\xD9\x88\xD8\xA7\xD8\xA1 \xD9\x85\xD9\x86\xD8\xA7\xD9\x82\xD8\xB4\xD8\xA9" + " \xD8\xB3\xD8\xA8\xD9\x84 \xD8\xA7\xD8\xB3\xD8\xAA\xD8\xAE\xD8\xAF\xD8\xA7\xD9\x85 \xD9" + "\x8A\xD9\x88\xD9\x86\xD9\x83\xD9\x88\xD8\xAF \xD9\x81\xD9\x8A \xD8\xA7\xD9\x84\xD9\x86\xD8" + "\xB8\xD9\x85 \xD8\xA7\xD9\x84\xD9\x82\xD8\xA7\xD8\xA6\xD9\x85\xD8\xA9 \xD9\x88\xD9\x81\xD9" + "\x8A\xD9\x85\xD8\xA7 \xD9\x8A\xD8\xAE\xD8\xB5 \xD8\xA7\xD9\x84\xD8\xAA\xD8\xB7\xD8\xA8\xD9" + "\x8A\xD9\x82\xD8\xA7\xD8\xAA \xD8\xA7\xD9\x84\xD8\xAD\xD8\xA7\xD8\xB3\xD9\x88\xD8\xA8\xD9" + "\x8A\xD8\xA9\xD8\x8C \xD8\xA7\xD9\x84\xD8\xAE\xD8\xB7\xD9\x88\xD8\xB7\xD8\x8C \xD8\xAA\xD8" + "\xB5\xD9\x85\xD9\x8A\xD9\x85 \xD8\xA7\xD9\x84\xD9\x86\xD8\xB5\xD9\x88\xD8\xB5 \xD9\x88\xD8" + "\xA7\xD9\x84\xD8\xAD\xD9\x88\xD8\xB3\xD8\xA8\xD8\xA9 \xD9\x85\xD8\xAA\xD8\xB9\xD8\xAF\xD8" + "\xAF\xD8\xA9 \xD8\xA7\xD9\x84\xD9\x84\xD8\xBA\xD8\xA7\xD8\xAA."; + // The runs inside <w:dir> were ignored + const OUString sParaText = getParagraph(1)->getString(); + CPPUNIT_ASSERT_EQUAL( + OUString::fromUtf8(sParaTextExpected), + sParaText); +} + CPPUNIT_PLUGIN_IMPLEMENT(); /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/writerfilter/source/ooxml/OOXMLFastContextHandler.cxx b/writerfilter/source/ooxml/OOXMLFastContextHandler.cxx index 388f02603f85..6958d15aaae2 100644 --- a/writerfilter/source/ooxml/OOXMLFastContextHandler.cxx +++ b/writerfilter/source/ooxml/OOXMLFastContextHandler.cxx @@ -387,6 +387,10 @@ void OOXMLFastContextHandler::endCharacterGroup() } } +void OOXMLFastContextHandler::pushBiDiEmbedLevel() {} + +void OOXMLFastContextHandler::popBiDiEmbedLevel() {} + void OOXMLFastContextHandler::startParagraphGroup() { if (isForwardEvents()) @@ -1276,6 +1280,20 @@ void OOXMLFastContextHandlerValue::setDefaultStringValue() setValue(pValue); } } + +// ECMA-376-1:2016 17.3.2.8; https://www.unicode.org/reports/tr9/#Explicit_Directional_Embeddings +void OOXMLFastContextHandlerValue::pushBiDiEmbedLevel() +{ + const bool bRtl + = mpValue.get() && mpValue.get()->getInt() == NS_ooxml::LN_Value_ST_Direction_rtl; + OOXMLFactory::characters(this, OUString(sal_Unicode(bRtl ? 0x202B : 0x202A))); // RLE / LRE +} + +void OOXMLFastContextHandlerValue::popBiDiEmbedLevel() +{ + OOXMLFactory::characters(this, OUString(sal_Unicode(0x202C))); // PDF (POP DIRECTIONAL FORMATTING) +} + /* class OOXMLFastContextHandlerTable */ diff --git a/writerfilter/source/ooxml/OOXMLFastContextHandler.hxx b/writerfilter/source/ooxml/OOXMLFastContextHandler.hxx index 62a4e00822df..e21132210d1b 100644 --- a/writerfilter/source/ooxml/OOXMLFastContextHandler.hxx +++ b/writerfilter/source/ooxml/OOXMLFastContextHandler.hxx @@ -144,6 +144,8 @@ public: void endParagraphGroup(); void startCharacterGroup(); void endCharacterGroup(); + virtual void pushBiDiEmbedLevel(); + virtual void popBiDiEmbedLevel(); void startSdt(); void endSdt(); @@ -341,6 +343,9 @@ public: virtual void setDefaultHexValue() override; virtual void setDefaultStringValue() override; + virtual void pushBiDiEmbedLevel() override; + virtual void popBiDiEmbedLevel() override; + protected: OOXMLValue::Pointer_t mpValue; }; diff --git a/writerfilter/source/ooxml/model.xml b/writerfilter/source/ooxml/model.xml index 76d718450e50..884c559fc2fe 100644 --- a/writerfilter/source/ooxml/model.xml +++ b/writerfilter/source/ooxml/model.xml @@ -13939,12 +13939,27 @@ <element name="sdt"> <ref name="CT_SdtRun"/> </element> + <element name="dir"> + <ref name="CT_DirContentRun"/> + </element> <element name="r"> <ref name="CT_R"/> </element> <ref name="EG_RunLevelElts"/> </choice> </define> + <define name="CT_DirContentRun"> + <ref name="EG_PContent"/> + <attribute name="val"> + <ref name="ST_Direction"/> + </attribute> + </define> + <define name="ST_Direction"> + <choice> + <value>ltr</value> + <value>rtl</value> + </choice> + </define> <define name="CT_SdtContentRun"> <ref name="EG_PContent"/> </define> @@ -18128,6 +18143,15 @@ <resource name="CT_SdtEndPr" resource="Properties"> <element name="rPr" tokenid="ooxml:CT_SdtEndPr_rPr"/> </resource> + <resource name="CT_DirContentRun" resource="Value"> + <attribute name="val" tokenid="ooxml:CT_DirContentRun_val" action="setValue"/> + <action name="start" action="pushBiDiEmbedLevel"/> + <action name="end" action="popBiDiEmbedLevel"/> + </resource> + <resource name="ST_Direction" resource="List"> + <value tokenid="ooxml:Value_ST_Direction_ltr">ltr</value> + <value tokenid="ooxml:Value_ST_Direction_rtl">rtl</value> + </resource> <resource name="CT_SdtContentRun" resource="Stream"/> <resource name="CT_SdtContentBlock" resource="Stream"/> <resource name="CT_SdtContentRow" resource="Stream"/> |