Kaydet (Commit) c3c4847d authored tarafından Mike Kaganski's avatar Mike Kaganski

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: 's avatarMike Kaganski <mike.kaganski@collabora.com>
üst ea3a5036
......@@ -777,6 +777,26 @@ DECLARE_OOXMLEXPORT_TEST(testTdf73547, "tdf73547-dash.docx")
CPPUNIT_ASSERT_DOUBLES_EQUAL(35000.0, nSp, 5000.0); // was 100000
}
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: */
......@@ -357,6 +357,10 @@ void OOXMLFastContextHandler::endCharacterGroup()
}
}
void OOXMLFastContextHandler::pushBiDiEmbedLevel() {}
void OOXMLFastContextHandler::popBiDiEmbedLevel() {}
void OOXMLFastContextHandler::startParagraphGroup()
{
if (isForwardEvents())
......@@ -1228,6 +1232,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
*/
......
......@@ -139,6 +139,8 @@ public:
void endParagraphGroup();
void startCharacterGroup();
void endCharacterGroup();
virtual void pushBiDiEmbedLevel();
virtual void popBiDiEmbedLevel();
void startSdt();
void endSdt();
......@@ -335,6 +337,9 @@ public:
virtual void setDefaultHexValue() override;
virtual void setDefaultStringValue() override;
virtual void pushBiDiEmbedLevel() override;
virtual void popBiDiEmbedLevel() override;
private:
OOXMLValue::Pointer_t mpValue;
};
......
......@@ -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"/>
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment