diff options
author | David Tardon <dtardon@redhat.com> | 2014-09-02 21:04:17 +0200 |
---|---|---|
committer | David Tardon <dtardon@redhat.com> | 2014-09-02 21:15:59 +0200 |
commit | 036cdf51e10fe1d6275057d3417471928331766a (patch) | |
tree | ca84f4d58f8f1b42a230e30daf6cbf551b5c1760 | |
parent | 605364fbd2a03d9e16fb4c45b15af2c68b962753 (diff) |
step 3a: parse text formatting
-rw-r--r-- | src/lib/SDFParser.cpp | 60 | ||||
-rw-r--r-- | src/lib/SDFParser.h | 10 |
2 files changed, 60 insertions, 10 deletions
diff --git a/src/lib/SDFParser.cpp b/src/lib/SDFParser.cpp index 0e0f389..e5f7ff4 100644 --- a/src/lib/SDFParser.cpp +++ b/src/lib/SDFParser.cpp @@ -21,6 +21,9 @@ SDFParser::SDFParser(const RVNGInputStreamPtr_t &input, librevenge::RVNGTextInte : m_input(input) , m_generator(generator) , m_paraJustify() + , m_text() + , m_inBold(false) + , m_inItalic(false) { } @@ -64,24 +67,61 @@ void SDFParser::parseLine() if (!m_paraJustify.empty()) paraPropList.insert("fo:text-align", m_paraJustify.c_str()); m_generator->openParagraph(paraPropList); - m_generator->openSpan(RVNGPropertyList()); - string text; + unsigned char c = 0; + do + { + bool isBold = m_inBold; + bool isItalic = m_inItalic; + + c = readText(); + + if (!m_text.empty()) + { + RVNGPropertyList spanPropList; + if (isBold) + spanPropList.insert("fo:font-weight", "bold"); + if (isItalic) + spanPropList.insert("fo:font-style", "italic"); + + m_generator->openSpan(spanPropList); + m_generator->insertText(m_text.c_str()); + m_generator->closeSpan(); + + m_text.clear(); + } + } + while (!(('\n' == c) || (0 == c))); + + m_generator->closeParagraph(); + // just in case + m_inBold = false; + m_inItalic = false; +} + +unsigned char SDFParser::readText() +{ while (!m_input->isEnd()) { const unsigned char c = readU8(m_input); - if ('\n' == c) + switch (c) + { + case '\n' : + return c; + case '*' : + m_inBold = !m_inBold; + return c; + case '/' : + m_inItalic = !m_inItalic; + return c; + default : + m_text.push_back(c); break; - - text.push_back(c); + } } - if (!text.empty()) - m_generator->insertText(text.c_str()); - - m_generator->closeSpan(); - m_generator->closeParagraph(); + return 0; } } // namespace libsdf diff --git a/src/lib/SDFParser.h b/src/lib/SDFParser.h index 827e181..fc0bdc8 100644 --- a/src/lib/SDFParser.h +++ b/src/lib/SDFParser.h @@ -34,11 +34,21 @@ public: private: void parseLine(); + /** Read a span of text up to the next control character. + + Enf-of-line is considered a control character, + therefore this always stops at the end of the line at most. + */ + unsigned char readText(); + private: const RVNGInputStreamPtr_t m_input; librevenge::RVNGTextInterface *m_generator; std::string m_paraJustify; + std::string m_text; + bool m_inBold; + bool m_inItalic; }; } // namespace libsdf |