summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/lib/IWAParser.cpp13
-rw-r--r--src/lib/IWAText.cpp21
-rw-r--r--src/lib/IWAText.h2
-rw-r--r--src/lib/IWORKProperties.cpp1
-rw-r--r--src/lib/IWORKProperties.h1
-rw-r--r--src/lib/IWORKText.cpp2
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>())
{