summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Tardon <dtardon@redhat.com>2014-09-02 21:04:17 +0200
committerDavid Tardon <dtardon@redhat.com>2014-09-02 21:15:59 +0200
commit036cdf51e10fe1d6275057d3417471928331766a (patch)
treeca84f4d58f8f1b42a230e30daf6cbf551b5c1760
parent605364fbd2a03d9e16fb4c45b15af2c68b962753 (diff)
step 3a: parse text formatting
-rw-r--r--src/lib/SDFParser.cpp60
-rw-r--r--src/lib/SDFParser.h10
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