#include <config.h>
+#include "InsetMath.h"
+#include "MathData.h"
+#include "MathExtern.h"
#include "MathStream.h"
-#include "MathMLStream.h"
+
+#include "support/lyxalgo.h"
+
+
+namespace {
+
+bool isAlpha(char c)
+{
+ return ('a' <= c && c <= 'z') || ('A' <= c && c <= 'Z');
+}
+
+
+bool isAlpha(lyx::char_type c)
+{
+ return c < 0x80 && isAlpha(static_cast<char>(c));
+}
+
+}
namespace lyx {
-using std::string;
+using std::strlen;
+
-WriteStream & operator<<(WriteStream & ws, string const & s)
+
+//////////////////////////////////////////////////////////////////////
+
+
+NormalStream & operator<<(NormalStream & ns, MathAtom const & at)
{
- ws << s.c_str();
- return ws;
+ at->normalize(ns);
+ return ns;
}
-NormalStream & operator<<(NormalStream & ns, string const & s)
+NormalStream & operator<<(NormalStream & ns, MathArray const & ar)
+{
+ normalize(ar, ns);
+ return ns;
+}
+
+
+NormalStream & operator<<(NormalStream & ns, docstring const & s)
+{
+ ns.os() << s;
+ return ns;
+}
+
+
+NormalStream & operator<<(NormalStream & ns, const std::string & s)
{
- // FIXME UNICODE
ns.os() << from_utf8(s);
return ns;
}
-MapleStream & operator<<(MapleStream & ms, string const & s)
+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;
+}
+
+
+
+/////////////////////////////////////////////////////////////////
+
+
+WriteStream & operator<<(WriteStream & ws, docstring const & s)
+{
+ if (ws.pendingSpace() && s.length() > 0) {
+ if (isAlpha(s[0]))
+ ws.os() << ' ';
+ ws.pendingSpace(false);
+ }
+ ws.os() << s;
+ int lf = 0;
+ docstring::const_iterator dit = s.begin();
+ docstring::const_iterator end = s.end();
+ for (; dit != end; ++dit)
+ if ((*dit) == '\n')
+ ++lf;
+ ws.addlines(lf);
+ return ws;
+}
+
+
+WriteStream::WriteStream(odocstream & os, bool fragile, bool latex)
+ : os_(os), fragile_(fragile), firstitem_(false), latex_(latex),
+ pendingspace_(false), line_(0)
+{}
+
+
+WriteStream::WriteStream(odocstream & 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;
+}
+
+
+void WriteStream::pendingSpace(bool how)
+{
+ pendingspace_ = how;
+}
+
+
+WriteStream & operator<<(WriteStream & ws, MathAtom const & at)
{
- // FIXME UNICODE
- ms.os() << from_utf8(s);
+ 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(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;
+}
+
+
+//////////////////////////////////////////////////////////////////////
+
+
+MathStream::MathStream(odocstream & os)
+ : os_(os), tab_(0), line_(0), lastchar_(0)
+{}
+
+
+MathStream & operator<<(MathStream & ms, MathAtom const & at)
+{
+ at->mathmlize(ms);
return ms;
}
-MaximaStream & operator<<(MaximaStream & ms, string const & s)
+MathStream & operator<<(MathStream & ms, MathArray const & ar)
{
- // FIXME UNICODE
- ms.os() << from_utf8(s);
+ mathmlize(ar, ms);
return ms;
}
-MathematicaStream & operator<<(MathematicaStream & ms, string const & s)
+MathStream & operator<<(MathStream & ms, char const * s)
{
- // FIXME UNICODE
- ms.os() << from_utf8(s);
+ ms.os() << s;
return ms;
}
-MathMLStream & operator<<(MathMLStream & ms, string const & s)
+MathStream & operator<<(MathStream & ms, char c)
{
- // FIXME UNICODE
- ms.os() << from_utf8(s);
+ ms.os() << c;
return ms;
}
-OctaveStream & operator<<(OctaveStream & os, string const & s)
+MathStream & operator<<(MathStream & ms, MTag const & t)
+{
+ ++ms.tab();
+ ms.cr();
+ ms.os() << '<' << t.tag_ << '>';
+ return ms;
+}
+
+
+MathStream & operator<<(MathStream & ms, ETag const & t)
+{
+ ms.cr();
+ if (ms.tab() > 0)
+ --ms.tab();
+ ms.os() << "</" << t.tag_ << '>';
+ return ms;
+}
+
+
+void MathStream::cr()
+{
+ os() << '\n';
+ for (int i = 0; i < tab(); ++i)
+ os() << ' ';
+}
+
+
+MathStream & operator<<(MathStream & ms, docstring const & s)
+{
+ ms.os() << s;
+ return ms;
+}
+
+//////////////////////////////////////////////////////////////////////
+
+
+MapleStream & operator<<(MapleStream & ms, MathAtom const & at)
+{
+ at->maple(ms);
+ return ms;
+}
+
+
+MapleStream & operator<<(MapleStream & ms, MathArray const & ar)
+{
+ maple(ar, ms);
+ return ms;
+}
+
+
+MapleStream & operator<<(MapleStream & ms, char const * s)
+{
+ ms.os() << s;
+ return ms;
+}
+
+
+MapleStream & operator<<(MapleStream & ms, char c)
+{
+ ms.os() << c;
+ return ms;
+}
+
+
+MapleStream & operator<<(MapleStream & ms, int i)
+{
+ ms.os() << i;
+ return ms;
+}
+
+
+MapleStream & operator<<(MapleStream & ms, char_type c)
+{
+ ms.os().put(c);
+ return ms;
+}
+
+
+MapleStream & operator<<(MapleStream & ms, docstring const & s)
+{
+ ms.os() << s;
+ return ms;
+}
+
+
+//////////////////////////////////////////////////////////////////////
+
+
+MaximaStream & operator<<(MaximaStream & ms, MathAtom const & at)
+{
+ at->maxima(ms);
+ return ms;
+}
+
+
+MaximaStream & operator<<(MaximaStream & ms, MathArray const & ar)
+{
+ maxima(ar, ms);
+ return ms;
+}
+
+
+MaximaStream & operator<<(MaximaStream & ms, char const * s)
+{
+ ms.os() << s;
+ return ms;
+}
+
+
+MaximaStream & operator<<(MaximaStream & ms, char c)
+{
+ ms.os() << c;
+ return ms;
+}
+
+
+MaximaStream & operator<<(MaximaStream & ms, int i)
+{
+ ms.os() << i;
+ return ms;
+}
+
+
+MaximaStream & operator<<(MaximaStream & ms, docstring const & s)
+{
+ ms.os() << s;
+ return ms;
+}
+
+
+MaximaStream & operator<<(MaximaStream & ms, char_type c)
+{
+ ms.os().put(c);
+ return ms;
+}
+
+
+//////////////////////////////////////////////////////////////////////
+
+
+MathematicaStream & operator<<(MathematicaStream & ms, MathAtom const & at)
+{
+ at->mathematica(ms);
+ return ms;
+}
+
+
+MathematicaStream & operator<<(MathematicaStream & ms, MathArray const & ar)
+{
+ mathematica(ar, ms);
+ return ms;
+}
+
+
+MathematicaStream & operator<<(MathematicaStream & ms, char const * s)
+{
+ ms.os() << s;
+ return ms;
+}
+
+
+MathematicaStream & operator<<(MathematicaStream & ms, char c)
+{
+ ms.os() << c;
+ return ms;
+}
+
+
+MathematicaStream & operator<<(MathematicaStream & ms, int i)
+{
+ ms.os() << i;
+ return ms;
+}
+
+
+MathematicaStream & operator<<(MathematicaStream & ms, docstring const & s)
+{
+ ms.os() << s;
+ return ms;
+}
+
+
+MathematicaStream & operator<<(MathematicaStream & ms, char_type c)
+{
+ ms.os().put(c);
+ return ms;
+}
+
+
+//////////////////////////////////////////////////////////////////////
+
+
+OctaveStream & operator<<(OctaveStream & ns, MathAtom const & at)
+{
+ at->octave(ns);
+ return ns;
+}
+
+
+OctaveStream & operator<<(OctaveStream & ns, MathArray const & ar)
+{
+ octave(ar, ns);
+ return ns;
+}
+
+
+OctaveStream & operator<<(OctaveStream & ns, char const * s)
+{
+ ns.os() << s;
+ return ns;
+}
+
+
+OctaveStream & operator<<(OctaveStream & ns, char c)
+{
+ ns.os() << c;
+ return ns;
+}
+
+
+OctaveStream & operator<<(OctaveStream & ns, int i)
+{
+ ns.os() << i;
+ return ns;
+}
+
+
+OctaveStream & operator<<(OctaveStream & ns, docstring const & s)
+{
+ ns.os() << s;
+ return ns;
+}
+
+
+OctaveStream & operator<<(OctaveStream & ns, char_type c)
+{
+ ns.os().put(c);
+ return ns;
+}
+
+
+OctaveStream & operator<<(OctaveStream & os, std::string const & s)
{
- // FIXME UNICODE
os.os() << from_utf8(s);
return os;
}