[Libreoffice-commits] core.git: Branch 'distro/collabora/cp-5.3' - sw/qa writerfilter/source

Libreoffice Gerrit user logerrit at kemper.freedesktop.org
Tue Sep 4 14:02:40 UTC 2018


 sw/qa/extras/ooxmlexport/data/tdf119143.docx          |binary
 sw/qa/extras/ooxmlexport/ooxmlexport9.cxx             |   42 ++++++++++++++++++
 writerfilter/source/ooxml/OOXMLFastContextHandler.cxx |   18 +++++++
 writerfilter/source/ooxml/OOXMLFastContextHandler.hxx |    5 ++
 writerfilter/source/ooxml/model.xml                   |   24 ++++++++++
 5 files changed, 89 insertions(+)

New commits:
commit 348a1e11045ca8d9dbceab43a68d44dbde3f922c
Author:     Mike Kaganski <mike.kaganski at collabora.com>
AuthorDate: Mon Aug 27 12:34:12 2018 +0300
Commit:     Aron Budea <aron.budea at collabora.com>
CommitDate: Tue Sep 4 16:02:20 2018 +0200

    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 at collabora.com>
    Reviewed-on: https://gerrit.libreoffice.org/59672
    Reviewed-by: Aron Budea <aron.budea at collabora.com>
    Tested-by: Aron Budea <aron.budea at collabora.com>

diff --git a/sw/qa/extras/ooxmlexport/data/tdf119143.docx b/sw/qa/extras/ooxmlexport/data/tdf119143.docx
new file mode 100644
index 000000000000..be0bc03f71c1
Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf119143.docx differ
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"/>


More information about the Libreoffice-commits mailing list