diff --git a/src/support/docstream.cpp b/src/support/docstream.cpp index e8839e07f6..38cabc453c 100644 --- a/src/support/docstream.cpp +++ b/src/support/docstream.cpp @@ -414,12 +414,9 @@ void otexstream::put(char_type const & c) protectspace_ = false; } os_.put(c); - lastchar_ = c; - if (c == '\n') { + lastChar(c); + if (c == '\n') texrow_.newline(); - canbreakline_ = false; - } else - canbreakline_ = true; } @@ -432,7 +429,6 @@ otexstream & operator<<(otexstream & ots, BreakLine) if (ots.canBreakLine()) { ots.os().put('\n'); ots.lastChar('\n'); - ots.canBreakLine(false); ots.texrow().newline(); } ots.protectSpace(false); @@ -445,7 +441,6 @@ otexstream & operator<<(otexstream & ots, SafeBreakLine) if (ots.canBreakLine()) { ots.os() << "%\n"; ots.lastChar('\n'); - ots.canBreakLine(false); ots.texrow().newline(); } ots.protectSpace(false); @@ -503,9 +498,10 @@ otexstream & operator<<(otexstream & ots, docstring const & s) } else ots.os() << s; + if (len > 1) + ots.canBreakLine(s[len - 2] != '\n'); ots.lastChar(s[len - 1]); ots.texrow().newlines(count(s.begin(), s.end(), '\n')); - ots.canBreakLine(s[len - 1] != '\n'); return ots; } @@ -535,7 +531,6 @@ otexstream & operator<<(otexstream & ots, char c) ots.lastChar(c); if (c == '\n') ots.texrow().newline(); - ots.canBreakLine(c != '\n'); return ots; } @@ -545,7 +540,6 @@ otexstream & operator<<(otexstream & ots, Type value) { ots.os() << value; ots.lastChar(0); - ots.canBreakLine(true); ots.protectSpace(false); return ots; } diff --git a/src/support/docstream.h b/src/support/docstream.h index 6da05e36a8..e2f56f91c8 100644 --- a/src/support/docstream.h +++ b/src/support/docstream.h @@ -90,15 +90,16 @@ typedef odocstream & (*odocstream_manip)(odocstream &); they were iomanip's to ensure that the next output will start at the beginning of a line. Using "breakln", a '\n' char will be output if needed, while using "safebreakln", "%\n" will be output if needed. - The class also records the last output character. + The class also records the last output character and can tell whether + a paragraph break was just output. */ class otexstream { public: /// otexstream(odocstream & os, TexRow & texrow) - : os_(os), texrow_(texrow), - canbreakline_(false), protectspace_(false), lastchar_(0) {} + : os_(os), texrow_(texrow), canbreakline_(false), + protectspace_(false), parbreak_(true), lastchar_(0) {} /// odocstream & os() { return os_; } /// @@ -114,9 +115,16 @@ public: /// bool protectSpace() const { return protectspace_; } /// - void lastChar(char_type const & c) { lastchar_ = c; } + void lastChar(char_type const & c) + { + parbreak_ = (!canbreakline_ && c == '\n'); + canbreakline_ = (c != '\n'); + lastchar_ = c; + } /// char_type lastChar() const { return lastchar_; } + /// + bool afterParbreak() const { return parbreak_; } private: /// odocstream & os_; @@ -127,6 +135,8 @@ private: /// bool protectspace_; /// + bool parbreak_; + /// char_type lastchar_; };