diff options
-rw-r--r-- | src/lib/SDFParser.cpp | 54 | ||||
-rw-r--r-- | src/lib/SDFParser.h | 3 |
2 files changed, 56 insertions, 1 deletions
diff --git a/src/lib/SDFParser.cpp b/src/lib/SDFParser.cpp index e5f7ff4..55143c3 100644 --- a/src/lib/SDFParser.cpp +++ b/src/lib/SDFParser.cpp @@ -85,7 +85,7 @@ void SDFParser::parseLine() spanPropList.insert("fo:font-style", "italic"); m_generator->openSpan(spanPropList); - m_generator->insertText(m_text.c_str()); + writeText(); m_generator->closeSpan(); m_text.clear(); @@ -124,6 +124,58 @@ unsigned char SDFParser::readText() return 0; } +void SDFParser::writeText() +{ + string text; + text.reserve(m_text.size()); + + bool wasSpace = false; + + for (string::const_iterator it = m_text.begin(); m_text.end() != it; ++it) + { + switch (*it) + { + case ' ' : + if (wasSpace) + { + insertText(text); + m_generator->insertSpace(); + } + else + { + text.push_back(*it); + wasSpace = true; + } + break; + case '\t' : + wasSpace = false; + insertText(text); + m_generator->insertTab(); + break; + case '\r' : + wasSpace = false; + insertText(text); + m_generator->insertLineBreak(); + break; + default : + wasSpace = false; + text.push_back(*it); + break; + } + } + + insertText(text); +} + +void SDFParser::insertText(std::string &text) +{ + if (!text.empty()) + { + m_generator->insertText(text.c_str()); + text.clear(); + } +} + } // namespace libsdf /* vim:set shiftwidth=2 softtabstop=2 expandtab: */ diff --git a/src/lib/SDFParser.h b/src/lib/SDFParser.h index fc0bdc8..617453f 100644 --- a/src/lib/SDFParser.h +++ b/src/lib/SDFParser.h @@ -41,6 +41,9 @@ private: */ unsigned char readText(); + void writeText(); + void insertText(std::string &text); + private: const RVNGInputStreamPtr_t m_input; librevenge::RVNGTextInterface *m_generator; |