X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Ftexstream.cpp;h=1523ca9470ebf2447af87ec8f8dc7e446c58403e;hb=3209e6604ef132c8488ad14719b29406899d8b00;hp=f748f8a4d27687c232b9e9ff4b8bcaf2767112f9;hpb=670efa8f646218f2a378f0cc614c4c37a9f6b89a;p=lyx.git diff --git a/src/texstream.cpp b/src/texstream.cpp index f748f8a4d2..1523ca9470 100644 --- a/src/texstream.cpp +++ b/src/texstream.cpp @@ -33,26 +33,19 @@ using lyx::support::split; namespace lyx { -otexrowstream::otexrowstream(odocstream & os, bool enable) - : os_(os), texrow_(make_unique(enable)) +otexrowstream::otexrowstream(odocstream & os) + : os_(os), texrow_(make_unique()) {} otexrowstream::~otexrowstream() = default; -unique_ptr && otexrowstream::releaseTexRow() +unique_ptr otexrowstream::releaseTexRow() { auto p = make_unique(); swap(texrow_, p); - return move(p); -} - - -void otexrowstream::append(docstring const & str, TexRow texrow) -{ - os_ << str; - texrow_->append(move(texrow)); + return p; } @@ -66,27 +59,61 @@ void otexrowstream::put(char_type const & c) void otexstream::put(char_type const & c) { + bool isprotected = false; if (protectspace_) { - if (!canbreakline_ && c == ' ') + if (!canbreakline_ && c == ' ') { os() << "{}"; + isprotected = true; + } protectspace_ = false; } + if (terminate_command_) { + if ((c == ' ' || c == '\0' || c == '\n') && !isprotected) + // A space or line break follows. Terminate with brackets. + os() << "{}"; + else if (c != '\\' && c != '{' && c != '}') + // Non-terminating character follows. Terminate with space. + os() << " "; + terminate_command_ = false; + } otexrowstream::put(c); lastChar(c); } +size_t otexstringstream::length() +{ + auto pos = ods_.tellp(); + return (pos >= 0) ? size_t(pos) : 0; +} + + +TexString otexstringstream::release() +{ + TexString ts(ods_.str(), move(texrow())); + // reset this + texrow() = TexRow(); + ods_.clear(); + ods_.str(docstring()); + return ts; +} + + BreakLine breakln; SafeBreakLine safebreakln; +TerminateCommand termcmd; otexstream & operator<<(otexstream & ots, BreakLine) { if (ots.canBreakLine()) { + if (ots.terminateCommand()) + ots << "{}"; ots.otexrowstream::put('\n'); ots.lastChar('\n'); } ots.protectSpace(false); + ots.terminateCommand(false); return ots; } @@ -95,10 +122,20 @@ otexstream & operator<<(otexstream & ots, SafeBreakLine) { otexrowstream & otrs = ots; if (ots.canBreakLine()) { + if (ots.terminateCommand()) + otrs << "{}"; otrs << "%\n"; ots.lastChar('\n'); } ots.protectSpace(false); + ots.terminateCommand(false); + return ots; +} + + +otexstream & operator<<(otexstream & ots, TerminateCommand) +{ + ots.terminateCommand(true); return ots; } @@ -112,6 +149,7 @@ otexrowstream & operator<<(otexrowstream & ots, odocstream_manip pf) return ots; } + otexstream & operator<<(otexstream & ots, odocstream_manip pf) { otexrowstream & otrs = ots; @@ -123,6 +161,51 @@ otexstream & operator<<(otexstream & ots, odocstream_manip pf) } +otexrowstream & operator<<(otexrowstream & ots, TexString ts) +{ + ts.validate(); + ots.os() << move(ts.str); + ots.texrow().append(move(ts.texrow)); + return ots; +} + + +otexstream & operator<<(otexstream & ots, TexString ts) +{ + size_t const len = ts.str.length(); + // Check whether there is something to output + if (len == 0) + return ots; + + otexrowstream & otrs = ots; + bool isprotected = false; + char_type const c = ts.str[0]; + if (ots.protectSpace()) { + if (!ots.canBreakLine() && c == ' ') { + otrs << "{}"; + isprotected = true; + } + ots.protectSpace(false); + } + if (ots.terminateCommand()) { + if ((c == ' ' || c == '\0' || c == '\n') && !isprotected) + // A space or line break follows. Terminate with brackets. + otrs << "{}"; + else if (c != '\\' && c != '{' && c != '}') + // Non-terminating character follows. Terminate with space. + otrs << " "; + ots.terminateCommand(false); + } + + if (len > 1) + ots.canBreakLine(ts.str[len - 2] != '\n'); + ots.lastChar(ts.str[len - 1]); + + otrs << move(ts); + return ots; +} + + otexrowstream & operator<<(otexrowstream & ots, docstring const & s) { ots.os() << s; @@ -139,11 +222,24 @@ otexstream & operator<<(otexstream & ots, docstring const & s) if (len == 0) return ots; otexrowstream & otrs = ots; + bool isprotected = false; + char_type const c = s[0]; if (ots.protectSpace()) { - if (!ots.canBreakLine() && s[0] == ' ') + if (!ots.canBreakLine() && c == ' ') { otrs << "{}"; + isprotected = true; + } ots.protectSpace(false); } + if (ots.terminateCommand()) { + if ((c == ' ' || c == '\0' || c == '\n') && !isprotected) + // A space or line break follows. Terminate with brackets. + otrs << "{}"; + else if (c != '\\' && c != '{' && c != '}') + // Non-terminating character follows. Terminate with space. + otrs << " "; + ots.terminateCommand(false); + } if (contains(s, 0xF0000)) { // Some encoding changes for the underlying stream are embedded @@ -234,7 +330,7 @@ template otexrowstream & operator<< (otexrowstream &, template otexrowstream & operator<< (otexrowstream &, unsigned long); -#ifdef LYX_USE_LONG_LONG +#ifdef HAVE_LONG_LONG_INT template otexrowstream & operator<< (otexrowstream &, unsigned long long); #endif @@ -246,6 +342,7 @@ otexstream & operator<<(otexstream & ots, Type value) ots.os() << value; ots.lastChar(0); ots.protectSpace(false); + ots.terminateCommand(false); return ots; } @@ -254,8 +351,8 @@ template otexstream & operator<< (otexstream &, double); template otexstream & operator<< (otexstream &, int); template otexstream & operator<< (otexstream &, unsigned int); template otexstream & operator<< (otexstream &, unsigned long); -#ifdef LYX_USE_LONG_LONG +#ifdef HAVE_LONG_LONG_INT template otexstream & operator<< (otexstream &, unsigned long long); #endif -} +} // namespace lyx