From 66f7c2930ad5ba39f4b874a0d3b00fd55edfe4c4 Mon Sep 17 00:00:00 2001 From: Juergen Spitzmueller Date: Mon, 12 Dec 2016 15:55:28 +0100 Subject: [PATCH] texstream: implement way to terminate a command depending on the context i.e., * space if non terminating char follows * {} if space follows * nothing if \, { or } follow --- src/texstream.cpp | 55 ++++++++++++++++++++++++++++++++++++++++++++--- src/texstream.h | 17 ++++++++++++++- 2 files changed, 68 insertions(+), 4 deletions(-) diff --git a/src/texstream.cpp b/src/texstream.cpp index 5b0e927591..10033a9255 100644 --- a/src/texstream.cpp +++ b/src/texstream.cpp @@ -59,11 +59,23 @@ 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') && !isprotected) + // A space 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); } @@ -89,6 +101,7 @@ TexString otexstringstream::release() BreakLine breakln; SafeBreakLine safebreakln; +TerminateCommand termcmd; otexstream & operator<<(otexstream & ots, BreakLine) @@ -98,6 +111,7 @@ otexstream & operator<<(otexstream & ots, BreakLine) ots.lastChar('\n'); } ots.protectSpace(false); + ots.terminateCommand(false); return ots; } @@ -110,6 +124,14 @@ otexstream & operator<<(otexstream & ots, SafeBreakLine) ots.lastChar('\n'); } ots.protectSpace(false); + ots.terminateCommand(false); + return ots; +} + + +otexstream & operator<<(otexstream & ots, TerminateCommand) +{ + ots.terminateCommand(true); return ots; } @@ -152,11 +174,24 @@ otexstream & operator<<(otexstream & ots, TexString ts) return ots; otexrowstream & otrs = ots; + bool isprotected = false; + char const c = ts.str[0]; if (ots.protectSpace()) { - if (!ots.canBreakLine() && ts.str[0] == ' ') + if (!ots.canBreakLine() && c == ' ') { otrs << "{}"; + isprotected = true; + } ots.protectSpace(false); } + if (ots.terminateCommand()) { + if ((c == ' ' || c == '\0') && !isprotected) + // A space 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'); @@ -183,11 +218,24 @@ otexstream & operator<<(otexstream & ots, docstring const & s) if (len == 0) return ots; otexrowstream & otrs = ots; + bool isprotected = false; + char 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') && !isprotected) + // A space 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 @@ -290,6 +338,7 @@ otexstream & operator<<(otexstream & ots, Type value) ots.os() << value; ots.lastChar(0); ots.protectSpace(false); + ots.terminateCommand(false); return ots; } diff --git a/src/texstream.h b/src/texstream.h index e5450ce741..bf4eb38bba 100644 --- a/src/texstream.h +++ b/src/texstream.h @@ -81,7 +81,8 @@ public: /// explicit otexstream(odocstream & os) : otexrowstream(os), canbreakline_(false), - protectspace_(false), parbreak_(true), lastchar_(0) {} + protectspace_(false), terminate_command_(false), + parbreak_(true), lastchar_(0) {} /// void put(char_type const & c); /// @@ -95,6 +96,10 @@ public: /// bool protectSpace() const { return protectspace_; } /// + void terminateCommand(bool terminate) { terminate_command_ = terminate; } + /// + bool terminateCommand() const { return terminate_command_; } + /// void lastChar(char_type const & c) { parbreak_ = (!canbreakline_ && c == '\n'); @@ -111,6 +116,8 @@ private: /// bool protectspace_; /// + bool terminate_command_; + /// bool parbreak_; /// char_type lastchar_; @@ -144,14 +151,22 @@ struct SafeBreakLine { char n; }; +/// Helper structs for terminating a command +struct TerminateCommand { + char n; +}; + extern BreakLine breakln; extern SafeBreakLine safebreakln; +extern TerminateCommand termcmd; /// otexstream & operator<<(otexstream &, BreakLine); /// otexstream & operator<<(otexstream &, SafeBreakLine); /// +otexstream & operator<<(otexstream &, TerminateCommand); +/// otexstream & operator<<(otexstream &, odocstream_manip); /// otexstream & operator<<(otexstream &, TexString);