From 9c3a8cb8858199fe017d27035bb4d6809492116f Mon Sep 17 00:00:00 2001 From: ALONSO Laurent Date: Tue, 21 Sep 2021 12:46:10 +0200 Subject: iwa: try to retrieve the right-to-left properties in text's zones... Change-Id: Ie30de95a6b9072234c6f42b1c625043e7d1e7aac --- src/lib/IWAParser.cpp | 13 +++++++++++++ src/lib/IWAText.cpp | 21 +++++++++++++++++++++ src/lib/IWAText.h | 2 ++ src/lib/IWORKProperties.cpp | 1 + src/lib/IWORKProperties.h | 1 + src/lib/IWORKText.cpp | 2 ++ 6 files changed, 40 insertions(+) diff --git a/src/lib/IWAParser.cpp b/src/lib/IWAParser.cpp index 8519856..938d761 100644 --- a/src/lib/IWAParser.cpp +++ b/src/lib/IWAParser.cpp @@ -934,6 +934,19 @@ bool IWAParser::parseText(const unsigned id, bool createNoteAsFootnote, const st } textParser.setLanguages(langs); } + if (get(msg).message(24)) + { + map rtls; + for (const auto &it : get(msg).message(24).message(1)) + { + if (it.uint32(1) && (get(it.uint32(1)) < length)) + { + if (it.bool_(2)) + rtls[get(it.uint32(1))]=get(it.bool_(2)); + } + } + textParser.setRTLs(rtls); + } if (get(msg).message(28)) { map dropCaps; diff --git a/src/lib/IWAText.cpp b/src/lib/IWAText.cpp index de73e2e..28e8629 100644 --- a/src/lib/IWAText.cpp +++ b/src/lib/IWAText.cpp @@ -51,6 +51,7 @@ IWAText::IWAText(const std::string &text, IWORKLanguageManager &langManager) , m_lists() , m_listLevels() , m_dropCaps() + , m_rtls() , m_attachments() { @@ -101,6 +102,11 @@ void IWAText::setDropCaps(const std::map &dropCaps) m_dropCaps = dropCaps; } +void IWAText::setRTLs(const std::map &rtls) +{ + m_rtls = rtls; +} + void IWAText::setAttachments(const std::multimap > &attachments) { m_attachments = attachments; @@ -112,6 +118,7 @@ void IWAText::parse(IWORKText &collector, const std::function::const_iterator paraIt = m_paras.begin(); map::const_iterator dropCapIt = m_dropCaps.begin(); + map::const_iterator rtlIt = m_rtls.begin(); map::const_iterator spanIt = m_spans.begin(); map::const_iterator langIt = m_langs.begin(); map::const_iterator linkIt = m_links.begin(); @@ -128,6 +135,7 @@ void IWAText::parse(IWORKText &collector, const std::function endDropCapPos; + bool rtl=false; std::size_t pos = 0; librevenge::RVNGString::Iter iter(m_text); @@ -220,6 +228,11 @@ void IWAText::parse(IWORKText &collector, const std::functionsecond; ++dropCapIt; } + if ((rtlIt != m_rtls.end()) && (rtlIt->first==pos)) + { + rtl=rtlIt->second; + ++rtlIt; + } // handle paragraph style change if ((paraIt != m_paras.end()) && (paraIt->first == pos)) { @@ -233,6 +246,14 @@ void IWAText::parse(IWORKText &collector, const std::function(dropCap); + if (rtl) + props.put("rl-tb"); + collector.setParagraphStyle(std::make_shared(props, boost::none, paraIt->second)); + } + else if (rtl) + { + IWORKPropertyMap props; + props.put("rl-tb"); collector.setParagraphStyle(std::make_shared(props, boost::none, paraIt->second)); } else diff --git a/src/lib/IWAText.h b/src/lib/IWAText.h index 9678d3c..d01043e 100644 --- a/src/lib/IWAText.h +++ b/src/lib/IWAText.h @@ -42,6 +42,7 @@ public: void setListLevels(const std::map &levels); void setLists(const std::map &lists); void setDropCaps(const std::map &dropCaps); + void setRTLs(const std::map &rtls); void setAttachments(const std::multimap > &attachments); @@ -61,6 +62,7 @@ private: std::map m_lists; std::map m_listLevels; std::map m_dropCaps; + std::map m_rtls; std::multimap > m_attachments; }; diff --git a/src/lib/IWORKProperties.cpp b/src/lib/IWORKProperties.cpp index 6d876e9..9cb4f22 100644 --- a/src/lib/IWORKProperties.cpp +++ b/src/lib/IWORKProperties.cpp @@ -116,6 +116,7 @@ IWORK_IMPLEMENT_PROPERTY(Tracking); IWORK_IMPLEMENT_PROPERTY(Underline); IWORK_IMPLEMENT_PROPERTY(VerticalAlignment); IWORK_IMPLEMENT_PROPERTY(WidowControl); +IWORK_IMPLEMENT_PROPERTY(WritingMode); } diff --git a/src/lib/IWORKProperties.h b/src/lib/IWORKProperties.h index 87285bd..9493343 100644 --- a/src/lib/IWORKProperties.h +++ b/src/lib/IWORKProperties.h @@ -123,6 +123,7 @@ IWORK_DECLARE_PROPERTY(Tracking, double); IWORK_DECLARE_PROPERTY(Underline, bool); IWORK_DECLARE_PROPERTY(VerticalAlignment, IWORKVerticalAlignment); IWORK_DECLARE_PROPERTY(WidowControl, bool); +IWORK_DECLARE_PROPERTY(WritingMode, std::string); } diff --git a/src/lib/IWORKText.cpp b/src/lib/IWORKText.cpp index 6404cc1..b2d088b 100644 --- a/src/lib/IWORKText.cpp +++ b/src/lib/IWORKText.cpp @@ -235,6 +235,8 @@ void fillParaPropList(const IWORKStyleStack &styleStack, RVNGPropertyList &props props.insert("fo:widows", enableWidows ? "0" : "2"); if (styleStack.has()) props.insert("fo:hyphenate", styleStack.get()); + if (styleStack.has() && !styleStack.get().empty()) + props.insert("style:writing-mode", styleStack.get().c_str()); if (styleStack.has()) { -- cgit v1.2.3