]> git.lyx.org Git - lyx.git/blobdiff - src/mathed/math_mathmlstream.C
Andreas' patch to prevent crash on click on previewd inset
[lyx.git] / src / mathed / math_mathmlstream.C
index 5df3372c4098cb390f22cb0a0f9f6412b4bf6081..9f538ab799d20355821b370a6a4e178e2b5797d7 100644 (file)
-#include "math_inset.h"
+/**
+ * \file math_mathmlstream.C
+ * This file is part of LyX, the document processor.
+ * Licence details can be found in the file COPYING.
+ *
+ * \author André Pönitz
+ *
+ * Full author contact details are available in file CREDITS.
+ */
+
+#include <config.h>
+
 #include "math_mathmlstream.h"
+#include "math_inset.h"
+#include "math_data.h"
 #include "math_extern.h"
-#include "debug.h"
+#include "support/lyxalgo.h"
+
+using std::strlen;
+
+using std::ostream;
+
+
+namespace {
+
+       bool isAlpha(char c)
+       {
+               return ('a' <= c && c <= 'z') || ('A' <= c && c <= 'Z');
+       }
+
+}
+
+
+WriteStream::WriteStream(ostream & os, bool fragile, bool latex)
+       : os_(os), fragile_(fragile), firstitem_(false), latex_(latex),
+         pendingspace_(false), line_(0)
+{}
+
+
+WriteStream::WriteStream(ostream & os)
+       : os_(os), fragile_(false), firstitem_(false), latex_(false),
+         pendingspace_(false), line_(0)
+{}
+
+
+WriteStream::~WriteStream()
+{
+       if (pendingspace_)
+               os_ << ' ';
+}
+
+
+void WriteStream::addlines(unsigned int n)
+{
+       line_ += n;
+}
 
 
-MathMLStream::MathMLStream(std::ostream & os)
+void WriteStream::pendingSpace(bool how)
+{
+       pendingspace_ = how;
+}
+
+
+WriteStream & operator<<(WriteStream & ws, MathAtom const & at)
+{
+       at->write(ws);
+       return ws;
+}
+
+
+WriteStream & operator<<(WriteStream & ws, MathArray const & ar)
+{
+       write(ar, ws);
+       return ws;
+}
+
+
+WriteStream & operator<<(WriteStream & ws, char const * s)
+{
+       if (ws.pendingSpace() && strlen(s) > 0) {
+               if (isAlpha(s[0]))
+                       ws.os() << ' ';
+               ws.pendingSpace(false);
+       }
+       ws.os() << s;
+       ws.addlines(int(lyx::count(s, s + strlen(s), '\n')));
+       return ws;
+}
+
+
+WriteStream & operator<<(WriteStream & ws, char c)
+{
+       if (ws.pendingSpace()) {
+               if (isAlpha(c))
+                       ws.os() << ' ';
+               ws.pendingSpace(false);
+       }
+       ws.os() << c;
+       if (c == '\n')
+               ws.addlines(1);
+       return ws;
+}
+
+
+WriteStream & operator<<(WriteStream & ws, int i)
+{
+       ws.os() << i;
+       return ws;
+}
+
+
+WriteStream & operator<<(WriteStream & ws, unsigned int i)
+{
+       ws.os() << i;
+       return ws;
+}
+
+
+//////////////////////////////////////////////////////////////////////
+
+
+MathMLStream::MathMLStream(ostream & os)
        : os_(os), tab_(0), line_(0), lastchar_(0)
 {}
 
 
-MathMLStream & MathMLStream::operator<<(MathInset const * p)
+MathMLStream & operator<<(MathMLStream & ms, MathAtom const & at)
 {
-       if (p)
-               p->mathmlize(*this);
-       else
-               lyxerr << "MathMLStream::operator<<(NULL) called\n";
-       return *this;           
+       at->mathmlize(ms);
+       return ms;
 }
 
 
-MathMLStream & MathMLStream::operator<<(MathArray const & ar)
+MathMLStream & operator<<(MathMLStream & ms, MathArray const & ar)
 {
-       mathmlize(ar, *this);
-       return *this;           
+       mathmlize(ar, ms);
+       return ms;
 }
 
 
-MathMLStream & MathMLStream::operator<<(char const * s)
+MathMLStream & operator<<(MathMLStream & ms, char const * s)
 {
-       os_ << s;
-       return *this;           
+       ms.os() << s;
+       return ms;
 }
 
 
-MathMLStream & MathMLStream::operator<<(char c)
+MathMLStream & operator<<(MathMLStream & ms, char c)
 {
-       os_ << c;
-       return *this;           
+       ms.os() << c;
+       return ms;
 }
 
 
-MathMLStream & MathMLStream::operator<<(MTag const & t)
+MathMLStream & operator<<(MathMLStream & ms, MTag const & t)
 {
-       ++tab_;
-       cr();
-       os_ << '<' << t.tag_ << '>';
-       return *this;           
+       ++ms.tab();
+       ms.cr();
+       ms.os() << '<' << t.tag_ << '>';
+       return ms;
 }
 
 
-MathMLStream & MathMLStream::operator<<(ETag const & t)
+MathMLStream & operator<<(MathMLStream & ms, ETag const & t)
 {
-       cr();
-       if (tab_ > 0)
-               --tab_;
-       os_ << "</" << t.tag_ << '>';
-       return *this;           
+       ms.cr();
+       if (ms.tab() > 0)
+               --ms.tab();
+       ms.os() << "</" << t.tag_ << '>';
+       return ms;
 }
 
 
 void MathMLStream::cr()
 {
-       os_ << '\n';
-       for (int i = 0; i < tab_; ++i)
-               os_ << ' ';
+       os() << '\n';
+       for (int i = 0; i < tab(); ++i)
+               os() << ' ';
 }
 
 
-
 //////////////////////////////////////////////////////////////////////
 
 
-MapleStream & MapleStream::operator<<(MathInset const * p)
+MapleStream & operator<<(MapleStream & ms, MathAtom const & at)
 {
-       if (p)
-               p->maplize(*this);
-       else
-               lyxerr << "MathMLStream::operator<<(NULL) called\n";
-       return *this;           
+       at->maple(ms);
+       return ms;
 }
 
 
-MapleStream & MapleStream::operator<<(MathArray const & ar)
+MapleStream & operator<<(MapleStream & ms, MathArray const & ar)
 {
-       maplize(ar, *this);
-       return *this;           
+       maple(ar, ms);
+       return ms;
 }
 
 
-MapleStream & MapleStream::operator<<(char const * s)
+MapleStream & operator<<(MapleStream & ms, char const * s)
 {
-       os_ << s;
-       return *this;           
+       ms.os() << s;
+       return ms;
 }
 
 
-MapleStream & MapleStream::operator<<(char c)
+MapleStream & operator<<(MapleStream & ms, char c)
 {
-       os_ << c;
-       return *this;           
+       ms.os() << c;
+       return ms;
 }
 
 
-MapleStream & MapleStream::operator<<(int i)
+MapleStream & operator<<(MapleStream & ms, int i)
 {
-       os_ << i;
-       return *this;           
+       ms.os() << i;
+       return ms;
 }
 
 
 //////////////////////////////////////////////////////////////////////
 
 
-OctaveStream & OctaveStream::operator<<(MathInset const * p)
+MaximaStream & operator<<(MaximaStream & ms, MathAtom const & at)
 {
-       if (p)
-               p->octavize(*this);
-       else
-               lyxerr << "MathMLStream::operator<<(NULL) called\n";
-       return *this;           
+       at->maxima(ms);
+       return ms;
 }
 
 
-OctaveStream & OctaveStream::operator<<(MathArray const & ar)
+MaximaStream & operator<<(MaximaStream & ms, MathArray const & ar)
 {
-       octavize(ar, *this);
-       return *this;           
+       maxima(ar, ms);
+       return ms;
 }
 
 
-OctaveStream & OctaveStream::operator<<(char const * s)
+MaximaStream & operator<<(MaximaStream & ms, char const * s)
 {
-       os_ << s;
-       return *this;           
+       ms.os() << s;
+       return ms;
 }
 
 
-OctaveStream & OctaveStream::operator<<(char c)
+MaximaStream & operator<<(MaximaStream & ms, char c)
 {
-       os_ << c;
-       return *this;           
+       ms.os() << c;
+       return ms;
+}
+
+
+MaximaStream & operator<<(MaximaStream & ms, int i)
+{
+       ms.os() << i;
+       return ms;
 }
 
 
 //////////////////////////////////////////////////////////////////////
 
 
-NormalStream & NormalStream::operator<<(MathInset const * p)
+MathematicaStream & operator<<(MathematicaStream & ms, MathAtom const & at)
+{
+       at->mathematica(ms);
+       return ms;
+}
+
+
+MathematicaStream & operator<<(MathematicaStream & ms, MathArray const & ar)
 {
-       if (p)
-               p->normalize(*this);
-       else
-               lyxerr << "MathMLStream::operator<<(NULL) called\n";
-       return *this;           
+       mathematica(ar, ms);
+       return ms;
 }
 
 
-NormalStream & NormalStream::operator<<(MathArray const & ar)
+MathematicaStream & operator<<(MathematicaStream & ms, char const * s)
 {
-       normalize(ar, *this);
-       return *this;           
+       ms.os() << s;
+       return ms;
 }
 
 
-NormalStream & NormalStream::operator<<(char const * s)
+MathematicaStream & operator<<(MathematicaStream & ms, char c)
 {
-       os_ << s;
-       return *this;           
+       ms.os() << c;
+       return ms;
 }
 
 
-NormalStream & NormalStream::operator<<(char c)
+MathematicaStream & operator<<(MathematicaStream & ms, int i)
 {
-       os_ << c;
-       return *this;           
+       ms.os() << i;
+       return ms;
 }
 
 
@@ -181,49 +298,78 @@ NormalStream & NormalStream::operator<<(char c)
 //////////////////////////////////////////////////////////////////////
 
 
-WriteStream::WriteStream
-               (Buffer const * buffer_, std::ostream & os_, bool fragile_)
-       : buffer(buffer_), os(os_), fragile(fragile_), line_(0)
-{}
+OctaveStream & operator<<(OctaveStream & ns, MathAtom const & at)
+{
+       at->octave(ns);
+       return ns;
+}
 
 
-WriteStream::WriteStream(std::ostream & os_)
-       : buffer(0), os(os_), fragile(false), line_(0)
-{}
+OctaveStream & operator<<(OctaveStream & ns, MathArray const & ar)
+{
+       octave(ar, ns);
+       return ns;
+}
 
 
-WriteStream & WriteStream::operator<<(MathInset const * p)
+OctaveStream & operator<<(OctaveStream & ns, char const * s)
 {
-       if (p)
-               p->write(*this);
-       else
-               lyxerr << "MathMLStream::operator<<(NULL) called\n";
-       return *this;           
+       ns.os() << s;
+       return ns;
 }
 
 
-WriteStream & WriteStream::operator<<(MathArray const & ar)
+OctaveStream & operator<<(OctaveStream & ns, char c)
 {
-       write(ar, *this);
-       return *this;           
+       ns.os() << c;
+       return ns;
 }
 
 
-WriteStream & WriteStream::operator<<(char const * s)
+OctaveStream & operator<<(OctaveStream & ns, int i)
 {
-       os << s;
-       for ( ; *s ; ++s) {
-               if (*s == '\n')
-                       ++line_;
-       }
-       return *this;           
+       ns.os() << i;
+       return ns;
 }
 
 
-WriteStream & WriteStream::operator<<(char c)
+//////////////////////////////////////////////////////////////////////
+
+
+NormalStream & operator<<(NormalStream & ns, MathAtom const & at)
 {
-       os << c;
-       if (c == '\n')
-               ++line_;
-       return *this;           
+       at->normalize(ns);
+       return ns;
+}
+
+
+NormalStream & operator<<(NormalStream & ns, MathArray const & ar)
+{
+       normalize(ar, ns);
+       return ns;
+}
+
+
+NormalStream & operator<<(NormalStream & ns, char const * s)
+{
+       ns.os() << s;
+       return ns;
 }
+
+
+NormalStream & operator<<(NormalStream & ns, char c)
+{
+       ns.os() << c;
+       return ns;
+}
+
+
+NormalStream & operator<<(NormalStream & ns, int i)
+{
+       ns.os() << i;
+       return ns;
+}
+
+
+
+//////////////////////////////////////////////////////////////////////