]> git.lyx.org Git - lyx.git/blobdiff - src/texstream.h
Fix text direction issue for InsetInfo in RTL context
[lyx.git] / src / texstream.h
index f6f421133541fa3f65cbac16733b4695c553059a..2cfcd16da40379e3d9ad40147e56bd232a9fa205 100644 (file)
 namespace lyx {
 
 class TexRow;
+struct TexString;
 
 
-// declared below
-class otexstringstream;
-
 /** Wrapper class for odocstream.
     This class is used to automatically count the lines of the exported latex
     code.
@@ -31,7 +29,7 @@ class otexstringstream;
 class otexrowstream {
 public:
        ///
-       explicit otexrowstream(odocstream & os, bool enable = true);
+       explicit otexrowstream(odocstream & os);
        /// defaulted
        ~otexrowstream();
        ///
@@ -39,11 +37,11 @@ public:
        ///
        TexRow & texrow() { return *texrow_; }
        ///
-       unique_ptr<TexRow> && releaseTexRow();
+       unique_ptr<TexRow> releaseTexRow();
        ///
        void put(char_type const & c);
        ///
-       void append(docstring const & str, TexRow texrow);
+       void append(TexString ts);
 private:
        ///
        odocstream & os_;
@@ -54,6 +52,8 @@ private:
 ///
 otexrowstream & operator<<(otexrowstream &, odocstream_manip);
 ///
+otexrowstream & operator<<(otexrowstream &, TexString);
+///
 otexrowstream & operator<<(otexrowstream &, docstring const &);
 ///
 otexrowstream & operator<<(otexrowstream &, std::string const &);
@@ -79,12 +79,15 @@ otexrowstream & operator<<(otexrowstream & ots, Type value);
 class otexstream : public otexrowstream {
 public:
        ///
-       explicit otexstream(odocstream & os, bool enable = true)
-               : otexrowstream(os, enable), canbreakline_(false),
-                 protectspace_(false), parbreak_(true), lastchar_(0) {}
+       explicit otexstream(odocstream & os)
+               : otexrowstream(os), canbreakline_(false),
+                 protectspace_(false), terminate_command_(false),
+                 parbreak_(true), lastchar_(0) {}
        ///
        void put(char_type const & c);
        ///
+       void append(TexString ts);
+       ///
        void canBreakLine(bool breakline) { canbreakline_ = breakline; }
        ///
        bool canBreakLine() const { return canbreakline_; }
@@ -93,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');
@@ -109,11 +116,32 @@ private:
        ///
        bool protectspace_;
        ///
+       bool terminate_command_;
+       ///
        bool parbreak_;
        ///
        char_type lastchar_;
 };
 
+
+/// because we need to pass ods_ to the base class
+struct otexstringstream_helper { odocstringstream ods_; };
+
+/// otexstringstream : a odocstringstream with tex/row correspondence
+class otexstringstream : otexstringstream_helper, public otexstream {
+public:
+       otexstringstream() : otexstringstream_helper(), otexstream(ods_) {}
+       ///
+       docstring str() const { return ods_.str(); }
+       ///
+       size_t length();
+       ///
+       bool empty() { return 0 == length(); }
+       /// move-returns the contents and reset the texstream
+       TexString release();
+};
+
+
 /// Helper structs for breaking a line
 struct BreakLine {
        char n;
@@ -123,16 +151,26 @@ 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);
+///
 otexstream & operator<<(otexstream &, docstring const &);
 ///
 otexstream & operator<<(otexstream &, std::string const &);
@@ -145,6 +183,6 @@ template <typename Type>
 otexstream & operator<<(otexstream & ots, Type value);
 
 
-}
+} // namespace lyx
 
 #endif