diff options
author | ALONSO Laurent <laurent.alonso@inria.fr> | 2021-09-21 12:46:10 +0200 |
---|---|---|
committer | ALONSO Laurent <laurent.alonso@inria.fr> | 2021-09-21 12:46:10 +0200 |
commit | 9c3a8cb8858199fe017d27035bb4d6809492116f (patch) | |
tree | c626c521ab8bbdd589b5e686d9ccfd816bf35bd8 | |
parent | 161cd06164397f8eef8698b6781543b8e84a2bca (diff) |
iwa: try to retrieve the right-to-left properties in text's zones...
Change-Id: Ie30de95a6b9072234c6f42b1c625043e7d1e7aac
-rw-r--r-- | src/lib/IWAParser.cpp | 13 | ||||
-rw-r--r-- | src/lib/IWAText.cpp | 21 | ||||
-rw-r--r-- | src/lib/IWAText.h | 2 | ||||
-rw-r--r-- | src/lib/IWORKProperties.cpp | 1 | ||||
-rw-r--r-- | src/lib/IWORKProperties.h | 1 | ||||
-rw-r--r-- | src/lib/IWORKText.cpp | 2 |
6 files changed, 40 insertions, 0 deletions
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<unsigned, bool> 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<unsigned, IWORKStylePtr_t> 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<unsigned, IWORKStylePtr_t> &dropCaps) m_dropCaps = dropCaps; } +void IWAText::setRTLs(const std::map<unsigned, bool> &rtls) +{ + m_rtls = rtls; +} + void IWAText::setAttachments(const std::multimap<unsigned, std::function<void(unsigned, bool &)> > &attachments) { m_attachments = attachments; @@ -112,6 +118,7 @@ void IWAText::parse(IWORKText &collector, const std::function<void(unsigned, IWO auto sectionIt = m_sections.begin(); map<unsigned, IWORKStylePtr_t>::const_iterator paraIt = m_paras.begin(); map<unsigned, IWORKStylePtr_t>::const_iterator dropCapIt = m_dropCaps.begin(); + map<unsigned, bool>::const_iterator rtlIt = m_rtls.begin(); map<unsigned, IWORKStylePtr_t>::const_iterator spanIt = m_spans.begin(); map<unsigned, string>::const_iterator langIt = m_langs.begin(); map<unsigned, string>::const_iterator linkIt = m_links.begin(); @@ -128,6 +135,7 @@ void IWAText::parse(IWORKText &collector, const std::function<void(unsigned, IWO // at the end of the drop cap's letters IWORKStylePtr_t lastSpanStyle; boost::optional<std::size_t> 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::function<void(unsigned, IWO dropCapStyle=dropCapIt->second; ++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<void(unsigned, IWO } IWORKPropertyMap props; props.put<property::DropCap>(dropCap); + if (rtl) + props.put<property::WritingMode>("rl-tb"); + collector.setParagraphStyle(std::make_shared<IWORKStyle>(props, boost::none, paraIt->second)); + } + else if (rtl) + { + IWORKPropertyMap props; + props.put<property::WritingMode>("rl-tb"); collector.setParagraphStyle(std::make_shared<IWORKStyle>(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<unsigned, unsigned> &levels); void setLists(const std::map<unsigned, IWORKStylePtr_t> &lists); void setDropCaps(const std::map<unsigned, IWORKStylePtr_t> &dropCaps); + void setRTLs(const std::map<unsigned, bool> &rtls); void setAttachments(const std::multimap<unsigned, std::function<void(unsigned, bool &)> > &attachments); @@ -61,6 +62,7 @@ private: std::map<unsigned, IWORKStylePtr_t> m_lists; std::map<unsigned, unsigned> m_listLevels; std::map<unsigned, IWORKStylePtr_t> m_dropCaps; + std::map<unsigned, bool> m_rtls; std::multimap<unsigned, std::function<void(unsigned, bool &)> > 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<Hyphenate>()) props.insert("fo:hyphenate", styleStack.get<Hyphenate>()); + if (styleStack.has<WritingMode>() && !styleStack.get<WritingMode>().empty()) + props.insert("style:writing-mode", styleStack.get<WritingMode>().c_str()); if (styleStack.has<Tabs>()) { |