summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Tardon <dtardon@redhat.com>2014-09-02 21:15:39 +0200
committerDavid Tardon <dtardon@redhat.com>2014-09-02 21:16:02 +0200
commit9fe48fbd9552db24d9ab76a7747826539a007ee3 (patch)
tree5b895d246f2a7388a09c33b1a488ac4536783ec8
parent036cdf51e10fe1d6275057d3417471928331766a (diff)
step 3b: output consecutive spaces in text correctlyHEADmaster
-rw-r--r--src/lib/SDFParser.cpp54
-rw-r--r--src/lib/SDFParser.h3
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;