X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Fsupport%2Fdocstream.cpp;h=e8839e07f61420104c3ff49826f7dc4997123ce6;hb=36e5864a8264b428ee7a59a09b25830b49d9c5af;hp=56a78e832500fb15bcad9508e7ecfc5750dfa211;hpb=d866717ef7503a1373dd1cb3925e1ac97b079192;p=lyx.git diff --git a/src/support/docstream.cpp b/src/support/docstream.cpp index 56a78e8325..e8839e07f6 100644 --- a/src/support/docstream.cpp +++ b/src/support/docstream.cpp @@ -11,6 +11,7 @@ #include #include "support/docstream.h" +#include "support/lstrings.h" #include "support/unicode.h" #include @@ -23,6 +24,8 @@ using namespace std; using lyx::ucs4_codeset; +using lyx::support::contains; +using lyx::support::split; #if defined(_MSC_VER) && (_MSC_VER >= 1600) @@ -411,6 +414,7 @@ void otexstream::put(char_type const & c) protectspace_ = false; } os_.put(c); + lastchar_ = c; if (c == '\n') { texrow_.newline(); canbreakline_ = false; @@ -427,6 +431,7 @@ otexstream & operator<<(otexstream & ots, BreakLine) { if (ots.canBreakLine()) { ots.os().put('\n'); + ots.lastChar('\n'); ots.canBreakLine(false); ots.texrow().newline(); } @@ -439,6 +444,7 @@ otexstream & operator<<(otexstream & ots, SafeBreakLine) { if (ots.canBreakLine()) { ots.os() << "%\n"; + ots.lastChar('\n'); ots.canBreakLine(false); ots.texrow().newline(); } @@ -447,6 +453,17 @@ otexstream & operator<<(otexstream & ots, SafeBreakLine) } +otexstream & operator<<(otexstream & ots, odocstream_manip pf) +{ + ots.os() << pf; + if (pf == static_cast(endl)) { + ots.lastChar('\n'); + ots.texrow().newline(); + } + return ots; +} + + otexstream & operator<<(otexstream & ots, docstring const & s) { size_t const len = s.length(); @@ -460,29 +477,49 @@ otexstream & operator<<(otexstream & ots, docstring const & s) ots.os() << "{}"; ots.protectSpace(false); } - ots.os() << s; + + if (contains(s, 0xF0000)) { + // Some encoding changes for the underlying stream are embedded + // in the docstring. The encoding names to be used are enclosed + // between the code points 0xF0000 and 0xF0001, the first two + // characters of plane 15, which is a Private Use Area whose + // codepoints don't have any associated glyph. + docstring s1; + docstring s2 = split(s, s1, 0xF0000); + while (true) { + if (!s1.empty()) + ots.os() << s1; + if (s2.empty()) + break; + docstring enc; + docstring const s3 = split(s2, enc, 0xF0001); + if (!contains(s2, 0xF0001)) + s2 = split(enc, s1, 0xF0000); + else { + ots.os() << setEncoding(to_ascii(enc)); + s2 = split(s3, s1, 0xF0000); + } + } + } else + ots.os() << s; + + ots.lastChar(s[len - 1]); ots.texrow().newlines(count(s.begin(), s.end(), '\n')); ots.canBreakLine(s[len - 1] != '\n'); return ots; } -otexstream & operator<<(otexstream & ots, char const * s) +otexstream & operator<<(otexstream & ots, string const & s) { - size_t const len = strlen(s); + ots << from_utf8(s); + return ots; +} - // Check whether there's something to output - if (len == 0) - return ots; - if (ots.protectSpace()) { - if (!ots.canBreakLine() && s[0] == ' ') - ots.os() << "{}"; - ots.protectSpace(false); - } - ots.os() << s; - ots.texrow().newlines(count(s, s + len, '\n')); - ots.canBreakLine(s[len - 1] != '\n'); +otexstream & operator<<(otexstream & ots, char const * s) +{ + ots << from_utf8(s); return ots; } @@ -495,6 +532,7 @@ otexstream & operator<<(otexstream & ots, char c) ots.protectSpace(false); } ots.os() << c; + ots.lastChar(c); if (c == '\n') ots.texrow().newline(); ots.canBreakLine(c != '\n'); @@ -506,6 +544,7 @@ template otexstream & operator<<(otexstream & ots, Type value) { ots.os() << value; + ots.lastChar(0); ots.canBreakLine(true); ots.protectSpace(false); return ots;