X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Fmathed%2FMathStream.cpp;h=b142f7e9c04b2d63632d86f57b78883eaf9d6023;hb=573500dd04f154f27318ac5ec469a337f97fe9f0;hp=83c95455e43fe77cddf761fe0b2908284b56ea80;hpb=f497296c30e6da2f97b16da8ad1c9e96feffb16b;p=lyx.git diff --git a/src/mathed/MathStream.cpp b/src/mathed/MathStream.cpp index 83c95455e4..b142f7e9c0 100644 --- a/src/mathed/MathStream.cpp +++ b/src/mathed/MathStream.cpp @@ -3,27 +3,28 @@ * This file is part of LyX, the document processor. * Licence details can be found in the file COPYING. * - * \author André Pönitz + * \author André Pönitz * * Full author contact details are available in file CREDITS. */ #include -#include "InsetMath.h" +#include "MathStream.h" + #include "MathData.h" #include "MathExtern.h" -#include "MathStream.h" -#include "support/lyxalgo.h" #include "support/textutils.h" +#include "support/docstring.h" +#include +#include +#include -namespace lyx { - -using std::strlen; - +using namespace std; +namespace lyx { ////////////////////////////////////////////////////////////////////// @@ -36,7 +37,7 @@ NormalStream & operator<<(NormalStream & ns, MathAtom const & at) } -NormalStream & operator<<(NormalStream & ns, MathArray const & ar) +NormalStream & operator<<(NormalStream & ns, MathData const & ar) { normalize(ar, ns); return ns; @@ -50,7 +51,7 @@ NormalStream & operator<<(NormalStream & ns, docstring const & s) } -NormalStream & operator<<(NormalStream & ns, const std::string & s) +NormalStream & operator<<(NormalStream & ns, const string & s) { ns.os() << from_utf8(s); return ns; @@ -84,9 +85,16 @@ NormalStream & operator<<(NormalStream & ns, int i) WriteStream & operator<<(WriteStream & ws, docstring const & s) { - if (ws.pendingSpace() && s.length() > 0) { + if (ws.pendingBrace()) { + ws.os() << '}'; + ws.pendingBrace(false); + ws.pendingSpace(false); + ws.textMode(true); + } else if (ws.pendingSpace() && s.length() > 0) { if (isAlphaASCII(s[0])) ws.os() << ' '; + else if (s[0] == ' ' && ws.textMode()) + ws.os() << '\\'; ws.pendingSpace(false); } ws.os() << s; @@ -101,21 +109,26 @@ WriteStream & operator<<(WriteStream & ws, docstring const & s) } -WriteStream::WriteStream(odocstream & os, bool fragile, bool latex) +WriteStream::WriteStream(odocstream & os, bool fragile, bool latex, OutputType output, + Encoding const * encoding) : os_(os), fragile_(fragile), firstitem_(false), latex_(latex), - pendingspace_(false), line_(0) + output_(output), pendingspace_(false), pendingbrace_(false), + textmode_(false), locked_(0), ascii_(0), line_(0), encoding_(encoding) {} WriteStream::WriteStream(odocstream & os) : os_(os), fragile_(false), firstitem_(false), latex_(false), - pendingspace_(false), line_(0) + output_(wsDefault), pendingspace_(false), pendingbrace_(false), + textmode_(false), locked_(0), ascii_(0), line_(0), encoding_(0) {} WriteStream::~WriteStream() { - if (pendingspace_) + if (pendingbrace_) + os_ << '}'; + else if (pendingspace_) os_ << ' '; } @@ -132,6 +145,30 @@ void WriteStream::pendingSpace(bool how) } +void WriteStream::pendingBrace(bool brace) +{ + pendingbrace_ = brace; +} + + +void WriteStream::textMode(bool textmode) +{ + textmode_ = textmode; +} + + +void WriteStream::lockedMode(bool locked) +{ + locked_ = locked; +} + + +void WriteStream::asciiOnly(bool ascii) +{ + ascii_ = ascii; +} + + WriteStream & operator<<(WriteStream & ws, MathAtom const & at) { at->write(ws); @@ -139,7 +176,7 @@ WriteStream & operator<<(WriteStream & ws, MathAtom const & at) } -WriteStream & operator<<(WriteStream & ws, MathArray const & ar) +WriteStream & operator<<(WriteStream & ws, MathData const & ar) { write(ar, ws); return ws; @@ -148,9 +185,16 @@ WriteStream & operator<<(WriteStream & ws, MathArray const & ar) WriteStream & operator<<(WriteStream & ws, char const * s) { - if (ws.pendingSpace() && strlen(s) > 0) { + if (ws.pendingBrace()) { + ws.os() << '}'; + ws.pendingBrace(false); + ws.pendingSpace(false); + ws.textMode(true); + } else if (ws.pendingSpace() && strlen(s) > 0) { if (isAlphaASCII(s[0])) ws.os() << ' '; + else if (s[0] == ' ' && ws.textMode()) + ws.os() << '\\'; ws.pendingSpace(false); } ws.os() << s; @@ -161,9 +205,16 @@ WriteStream & operator<<(WriteStream & ws, char const * s) WriteStream & operator<<(WriteStream & ws, char c) { - if (ws.pendingSpace()) { + if (ws.pendingBrace()) { + ws.os() << '}'; + ws.pendingBrace(false); + ws.pendingSpace(false); + ws.textMode(true); + } else if (ws.pendingSpace()) { if (isAlphaASCII(c)) ws.os() << ' '; + else if (c == ' ' && ws.textMode()) + ws.os() << '\\'; ws.pendingSpace(false); } ws.os() << c; @@ -175,6 +226,11 @@ WriteStream & operator<<(WriteStream & ws, char c) WriteStream & operator<<(WriteStream & ws, int i) { + if (ws.pendingBrace()) { + ws.os() << '}'; + ws.pendingBrace(false); + ws.textMode(true); + } ws.os() << i; return ws; } @@ -182,6 +238,11 @@ WriteStream & operator<<(WriteStream & ws, int i) WriteStream & operator<<(WriteStream & ws, unsigned int i) { + if (ws.pendingBrace()) { + ws.os() << '}'; + ws.pendingBrace(false); + ws.textMode(true); + } ws.os() << i; return ws; } @@ -191,10 +252,36 @@ WriteStream & operator<<(WriteStream & ws, unsigned int i) MathStream::MathStream(odocstream & os) - : os_(os), tab_(0), line_(0), lastchar_(0) + : os_(os), tab_(0), line_(0), lastchar_(0), in_text_(false) {} +void MathStream::cr() +{ + os() << '\n'; + for (int i = 0; i < tab(); ++i) + os() << ' '; +} + + +void MathStream::defer(docstring const & s) +{ + deferred_ << s; +} + + +void MathStream::defer(string const & s) +{ + deferred_ << from_utf8(s); +} + + +docstring MathStream::deferred() const +{ + return deferred_.str(); +} + + MathStream & operator<<(MathStream & ms, MathAtom const & at) { at->mathmlize(ms); @@ -202,7 +289,7 @@ MathStream & operator<<(MathStream & ms, MathAtom const & at) } -MathStream & operator<<(MathStream & ms, MathArray const & ar) +MathStream & operator<<(MathStream & ms, MathData const & ar) { mathmlize(ar, ms); return ms; @@ -223,11 +310,21 @@ MathStream & operator<<(MathStream & ms, char c) } +MathStream & operator<<(MathStream & ms, char_type c) +{ + ms.os().put(c); + return ms; +} + + MathStream & operator<<(MathStream & ms, MTag const & t) { ++ms.tab(); ms.cr(); - ms.os() << '<' << t.tag_ << '>'; + ms.os() << '<' << from_ascii(t.tag_); + if (!t.attr_.empty()) + ms.os() << " " << from_ascii(t.attr_); + ms << '>'; return ms; } @@ -237,25 +334,202 @@ MathStream & operator<<(MathStream & ms, ETag const & t) ms.cr(); if (ms.tab() > 0) --ms.tab(); - ms.os() << "'; + ms.os() << "'; return ms; } -void MathStream::cr() +MathStream & operator<<(MathStream & ms, docstring const & s) { - os() << '\n'; - for (int i = 0; i < tab(); ++i) - os() << ' '; + ms.os() << s; + return ms; } -MathStream & operator<<(MathStream & ms, docstring const & s) +////////////////////////////////////////////////////////////////////// + + +HtmlStream::HtmlStream(odocstream & os) + : os_(os), tab_(0), line_(0), lastchar_(0), in_text_(false) +{} + + +void HtmlStream::defer(docstring const & s) +{ + deferred_ << s; +} + + +void HtmlStream::defer(string const & s) +{ + deferred_ << from_utf8(s); +} + + +docstring HtmlStream::deferred() const +{ + return deferred_.str(); +} + + +HtmlStream & operator<<(HtmlStream & ms, MathAtom const & at) +{ + at->htmlize(ms); + return ms; +} + + +HtmlStream & operator<<(HtmlStream & ms, MathData const & ar) +{ + htmlize(ar, ms); + return ms; +} + + +HtmlStream & operator<<(HtmlStream & ms, char const * s) +{ + ms.os() << s; + return ms; +} + + +HtmlStream & operator<<(HtmlStream & ms, char c) +{ + ms.os() << c; + return ms; +} + + +HtmlStream & operator<<(HtmlStream & ms, char_type c) +{ + ms.os().put(c); + return ms; +} + + +HtmlStream & operator<<(HtmlStream & ms, MTag const & t) +{ + ms.os() << '<' << from_ascii(t.tag_); + if (!t.attr_.empty()) + ms.os() << " " << from_ascii(t.attr_); + ms << '>'; + return ms; +} + + +HtmlStream & operator<<(HtmlStream & ms, ETag const & t) +{ + ms.os() << "'; + return ms; +} + + +HtmlStream & operator<<(HtmlStream & ms, docstring const & s) { ms.os() << s; return ms; } + +////////////////////////////////////////////////////////////////////// + + +SetMode::SetMode(MathStream & os, bool text) + : os_(os), opened_(false) +{ + init(text, ""); +} + + +SetMode::SetMode(MathStream & os, bool text, string const & attrs) + : os_(os), opened_(false) +{ + init(text, attrs); +} + + +void SetMode::init(bool text, string const & attrs) +{ + was_text_ = os_.inText(); + if (was_text_) + os_ << ""; + if (text) { + os_.setTextMode(); + os_ << ""; + opened_ = true; + } else { + if (!attrs.empty()) { + os_ << ""; + opened_ = true; + } + os_.setMathMode(); + } +} + + +SetMode::~SetMode() +{ + if (opened_) { + if (os_.inText()) + os_ << ""; + else + os_ << ""; + } + if (was_text_) { + os_.setTextMode(); + os_ << ""; + } else { + os_.setMathMode(); + } +} + + +////////////////////////////////////////////////////////////////////// + + +SetHTMLMode::SetHTMLMode(HtmlStream & os, bool text) + : os_(os), opened_(false) +{ + init(text, ""); +} + + +SetHTMLMode::SetHTMLMode(HtmlStream & os, bool text, string attrs) + : os_(os), opened_(true) +{ + init(text, attrs); +} + + +void SetHTMLMode::init(bool text, string const & attrs) +{ + was_text_ = os_.inText(); + if (text) { + os_.setTextMode(); + if (attrs.empty()) + os_ << MTag("span"); + else + os_ << MTag("span", attrs); + opened_ = true; + } else + os_.setMathMode(); +} + + +SetHTMLMode::~SetHTMLMode() +{ + if (opened_) + os_ << ETag("span"); + if (was_text_) + os_.setTextMode(); + else + os_.setMathMode(); +} + + ////////////////////////////////////////////////////////////////////// @@ -266,7 +540,7 @@ MapleStream & operator<<(MapleStream & ms, MathAtom const & at) } -MapleStream & operator<<(MapleStream & ms, MathArray const & ar) +MapleStream & operator<<(MapleStream & ms, MathData const & ar) { maple(ar, ms); return ms; @@ -318,7 +592,7 @@ MaximaStream & operator<<(MaximaStream & ms, MathAtom const & at) } -MaximaStream & operator<<(MaximaStream & ms, MathArray const & ar) +MaximaStream & operator<<(MaximaStream & ms, MathData const & ar) { maxima(ar, ms); return ms; @@ -370,7 +644,7 @@ MathematicaStream & operator<<(MathematicaStream & ms, MathAtom const & at) } -MathematicaStream & operator<<(MathematicaStream & ms, MathArray const & ar) +MathematicaStream & operator<<(MathematicaStream & ms, MathData const & ar) { mathematica(ar, ms); return ms; @@ -422,7 +696,7 @@ OctaveStream & operator<<(OctaveStream & ns, MathAtom const & at) } -OctaveStream & operator<<(OctaveStream & ns, MathArray const & ar) +OctaveStream & operator<<(OctaveStream & ns, MathData const & ar) { octave(ar, ns); return ns; @@ -464,7 +738,7 @@ OctaveStream & operator<<(OctaveStream & ns, char_type c) } -OctaveStream & operator<<(OctaveStream & os, std::string const & s) +OctaveStream & operator<<(OctaveStream & os, string const & s) { os.os() << from_utf8(s); return os;