sw/qa/extras/ooxmlexport/data/tdf119143.docx |binary sw/qa/extras/ooxmlexport/ooxmlexport11.cxx | 20 +++++++++++++++ writerfilter/source/ooxml/OOXMLFastContextHandler.cxx | 18 +++++++++++++ writerfilter/source/ooxml/OOXMLFastContextHandler.hxx | 5 +++ writerfilter/source/ooxml/model.xml | 24 ++++++++++++++++++ 5 files changed, 67 insertions(+)
New commits: commit c18e2c314a8f694abd3d31a168f670078d183011 Author: Mike Kaganski <mike.kagan...@collabora.com> AuthorDate: Mon Aug 27 12:34:12 2018 +0300 Commit: Andras Timar <andras.ti...@collabora.com> CommitDate: Tue Aug 28 16:21: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.kagan...@collabora.com> Reviewed-on: https://gerrit.libreoffice.org/59671 Tested-by: Mike Kaganski <mike.kagan...@collabora.com> Reviewed-by: Andras Timar <andras.ti...@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/ooxmlexport11.cxx b/sw/qa/extras/ooxmlexport/ooxmlexport11.cxx index a00d8f4f546d..131953eb9723 100644 --- a/sw/qa/extras/ooxmlexport/ooxmlexport11.cxx +++ b/sw/qa/extras/ooxmlexport/ooxmlexport11.cxx @@ -315,6 +315,26 @@ DECLARE_OOXMLEXPORT_TEST(testTdf112118_DOCX, "tdf112118.docx") } } +DECLARE_OOXMLEXPORT_TEST(testTdf119143, "tdf119143.docx") +{ + // The runs inside <w:dir> were ignored + const OUString sParaText = getParagraph(1)->getString(); + CPPUNIT_ASSERT_EQUAL( + OUString::fromUtf8( + u8"عندما يريد العالم أن يتكلّم ، فهو يتحدّث " + u8"بلغة " + u8"يونيكود. تسجّل الآن لحضور المؤتمر الدولي العاشر " + u8"ليونيكود (Unicode Conference)، الذي سيعقد في 10-12 " + u8"آذار 1997 بمدينة مَايِنْتْس، ألمانيا. و سيجمع المؤتمر " + u8"بين خبراء من كافة قطاعات الصناعة على الشبكة " + u8"العالمية انترنيت ويونيكود، حيث ستتم، على الصعيدين " + u8"الدولي والمحلي على حد سواء مناقشة سبل استخدام " + u8"يونكود في النظم القائمة وفيما يخص التطبيقات " + u8"الحاسوبية، الخطوط، تصميم النصوص والحوسبة متعددة " + u8"اللغات."), + 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 138954023f89..8647b4525727 100644 --- a/writerfilter/source/ooxml/OOXMLFastContextHandler.cxx +++ b/writerfilter/source/ooxml/OOXMLFastContextHandler.cxx @@ -357,6 +357,10 @@ void OOXMLFastContextHandler::endCharacterGroup() } } +void OOXMLFastContextHandler::pushBiDiEmbedLevel() {} + +void OOXMLFastContextHandler::popBiDiEmbedLevel() {} + void OOXMLFastContextHandler::startParagraphGroup() { if (isForwardEvents()) @@ -1230,6 +1234,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, bRtl ? u"\u202B" : u"\u202A"); // RLE / LRE +} + +void OOXMLFastContextHandlerValue::popBiDiEmbedLevel() +{ + OOXMLFactory::characters(this, u"\u202C"); // PDF (POP DIRECTIONAL FORMATTING) +} + /* class OOXMLFastContextHandlerTable */ diff --git a/writerfilter/source/ooxml/OOXMLFastContextHandler.hxx b/writerfilter/source/ooxml/OOXMLFastContextHandler.hxx index a89644dc6e2d..8876ff76ad2d 100644 --- a/writerfilter/source/ooxml/OOXMLFastContextHandler.hxx +++ b/writerfilter/source/ooxml/OOXMLFastContextHandler.hxx @@ -137,6 +137,8 @@ public: void endParagraphGroup(); void startCharacterGroup(); void endCharacterGroup(); + virtual void pushBiDiEmbedLevel(); + virtual void popBiDiEmbedLevel(); void startSdt(); void endSdt(); @@ -333,6 +335,9 @@ public: virtual void setDefaultHexValue() override; virtual void setDefaultStringValue() override; + virtual void pushBiDiEmbedLevel() override; + virtual void popBiDiEmbedLevel() override; + private: OOXMLValue::Pointer_t mpValue; }; diff --git a/writerfilter/source/ooxml/model.xml b/writerfilter/source/ooxml/model.xml index 25f8a267bb8a..36328c035d75 100644 --- a/writerfilter/source/ooxml/model.xml +++ b/writerfilter/source/ooxml/model.xml @@ -13943,12 +13943,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> @@ -18144,6 +18159,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"/> _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits