X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Fsupport%2Fdocstream.h;h=e2f56f91c889b309a1b9c1e8b6d8d71cb0fce997;hb=dae8555234f0e5c8358b91c307d91b219c664617;hp=167bdd1e218a042dd2aa30a1f7bd4bab71d2d59b;hpb=1ef605f6254ef3f3b8cec5440a2e67e6f23a707b;p=lyx.git diff --git a/src/support/docstream.h b/src/support/docstream.h index 167bdd1e21..e2f56f91c8 100644 --- a/src/support/docstream.h +++ b/src/support/docstream.h @@ -12,6 +12,7 @@ #ifndef LYX_DOCSTREAM_H #define LYX_DOCSTREAM_H +#include "TexRow.h" #include "support/docstring.h" #if defined(_MSC_VER) && (_MSC_VER >= 1600) @@ -41,9 +42,9 @@ typedef std::basic_istream idocstream; \endcode, not \code os << c; \endcode . The latter will not output the character, but the code point - as number. This is because we can't overload operator<< (our character - type is not a real type but a typedef). Narrow characters of type char - can be output as usual. + as number if USE_WCHAR_T is not defined. This is because we can't overload + operator<< (our character type is not always a real type but sometimes a + typedef). Narrow characters of type char can be output as usual. */ typedef std::basic_ostream odocstream; @@ -79,32 +80,32 @@ public: /// UCS4 input stringstream typedef std::basic_istringstream idocstringstream; -/// UCS4 output stringstream -typedef std::basic_ostringstream odocstringstream; +/// UCS4 output manipulator +typedef odocstream & (*odocstream_manip)(odocstream &); /** Wrapper class for odocstream. - This class helps ensuring that no blank lines may be inadvertently output. - Use the special variables "breakln" and "safebreakln" as if 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. - Use countLines() to retrieve the number of \n output since previous call. + This class is used to automatically count the lines of the exported latex + code and also to ensure that no blank lines may be inadvertently output. + To this end, use the special variables "breakln" and "safebreakln" as if + 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 and can tell whether + a paragraph break was just output. */ class otexstream { public: /// - explicit otexstream(odocstream & os) - : os_(os), lines_(0), canbreakline_(false), protectspace_(false) - {} + otexstream(odocstream & os, TexRow & texrow) + : os_(os), texrow_(texrow), canbreakline_(false), + protectspace_(false), parbreak_(true), lastchar_(0) {} /// odocstream & os() { return os_; } /// - void put(char_type const & c); - /// - size_t countLines() { size_t l = lines_; lines_ = 0; return l; } + TexRow & texrow() { return texrow_; } /// - void addLines(size_t n) { lines_ += n; } + void put(char_type const & c); /// void canBreakLine(bool breakline) { canbreakline_ = breakline; } /// @@ -112,16 +113,31 @@ public: /// void protectSpace(bool protectspace) { protectspace_ = protectspace; } /// - bool protectSpace() const { return protectspace_; }; + bool protectSpace() const { return protectspace_; } + /// + 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_; /// - size_t lines_; + TexRow & texrow_; /// bool canbreakline_; /// bool protectspace_; + /// + bool parbreak_; + /// + char_type lastchar_; }; /// Helper structs for breaking a line @@ -141,17 +157,18 @@ otexstream & operator<<(otexstream &, BreakLine); /// otexstream & operator<<(otexstream &, SafeBreakLine); /// +otexstream & operator<<(otexstream &, odocstream_manip); +/// otexstream & operator<<(otexstream &, docstring const &); /// +otexstream & operator<<(otexstream &, std::string const &); +/// otexstream & operator<<(otexstream &, char const *); /// otexstream & operator<<(otexstream &, char); /// -otexstream & operator<<(otexstream &, double); -/// -otexstream & operator<<(otexstream &, int); -/// -otexstream & operator<<(otexstream &, unsigned int); +template +otexstream & operator<<(otexstream & ots, Type value); /// Helper struct for changing stream encoding struct SetEnc { @@ -171,7 +188,6 @@ SetEnc setEncoding(std::string const & encoding); \endcode */ odocstream & operator<<(odocstream & os, SetEnc e); -otexstream & operator<<(otexstream & os, SetEnc e); idocstream & operator<<(idocstream & os, SetEnc e); }