3 * This file is part of LyX, the document processor.
4 * Licence details can be found in the file COPYING.
8 * Full author contact details are available in file CREDITS.
13 #include "MathStream.h"
16 #include "MathExtern.h"
18 #include "support/textutils.h"
19 #include "support/docstring.h"
30 //////////////////////////////////////////////////////////////////////
33 NormalStream & operator<<(NormalStream & ns, MathAtom const & at)
40 NormalStream & operator<<(NormalStream & ns, MathData const & ar)
47 NormalStream & operator<<(NormalStream & ns, docstring const & s)
54 NormalStream & operator<<(NormalStream & ns, const string & s)
56 ns.os() << from_utf8(s);
61 NormalStream & operator<<(NormalStream & ns, char const * s)
68 NormalStream & operator<<(NormalStream & ns, char c)
75 NormalStream & operator<<(NormalStream & ns, int i)
83 /////////////////////////////////////////////////////////////////
86 WriteStream & operator<<(WriteStream & ws, docstring const & s)
88 // Skip leading '\n' if we had already output a newline char
90 (s.length() > 0 && (s[0] != '\n' || ws.canBreakLine())) ? 0 : 1;
92 // Check whether there's something to output
93 if (s.length() <= first)
96 if (ws.pendingBrace()) {
98 ws.pendingBrace(false);
99 ws.pendingSpace(false);
101 } else if (ws.pendingSpace()) {
102 if (isAlphaASCII(s[first]))
104 else if (s[first] == ' ' && ws.textMode())
106 ws.pendingSpace(false);
108 ws.os() << s.substr(first);
110 char_type lastchar = 0;
111 docstring::const_iterator dit = s.begin() + first;
112 docstring::const_iterator end = s.end();
113 for (; dit != end; ++dit) {
115 if (lastchar == '\n')
119 ws.canBreakLine(lastchar != '\n');
124 WriteStream::WriteStream(odocstream & os, bool fragile, bool latex, OutputType output,
125 Encoding const * encoding)
126 : os_(os), fragile_(fragile), firstitem_(false), latex_(latex),
127 output_(output), pendingspace_(false), pendingbrace_(false),
128 textmode_(false), locked_(0), ascii_(0), canbreakline_(true),
129 line_(0), encoding_(encoding)
133 WriteStream::WriteStream(odocstream & os)
134 : os_(os), fragile_(false), firstitem_(false), latex_(false),
135 output_(wsDefault), pendingspace_(false), pendingbrace_(false),
136 textmode_(false), locked_(0), ascii_(0), canbreakline_(true),
137 line_(0), encoding_(0)
141 WriteStream::~WriteStream()
145 else if (pendingspace_)
150 void WriteStream::addlines(unsigned int n)
156 void WriteStream::pendingSpace(bool how)
162 void WriteStream::pendingBrace(bool brace)
164 pendingbrace_ = brace;
168 void WriteStream::textMode(bool textmode)
170 textmode_ = textmode;
174 void WriteStream::lockedMode(bool locked)
180 void WriteStream::asciiOnly(bool ascii)
186 WriteStream & operator<<(WriteStream & ws, MathAtom const & at)
193 WriteStream & operator<<(WriteStream & ws, MathData const & ar)
200 WriteStream & operator<<(WriteStream & ws, char const * s)
207 WriteStream & operator<<(WriteStream & ws, char c)
209 if (c == '\n' && !ws.canBreakLine())
212 if (ws.pendingBrace()) {
214 ws.pendingBrace(false);
215 ws.pendingSpace(false);
217 } else if (ws.pendingSpace()) {
220 else if (c == ' ' && ws.textMode())
222 ws.pendingSpace(false);
227 ws.canBreakLine(c != '\n');
232 WriteStream & operator<<(WriteStream & ws, int i)
234 if (ws.pendingBrace()) {
236 ws.pendingBrace(false);
240 ws.canBreakLine(true);
245 WriteStream & operator<<(WriteStream & ws, unsigned int i)
247 if (ws.pendingBrace()) {
249 ws.pendingBrace(false);
253 ws.canBreakLine(true);
258 //////////////////////////////////////////////////////////////////////
261 MathStream::MathStream(odocstream & os)
262 : os_(os), tab_(0), line_(0), in_text_(false)
266 void MathStream::cr()
269 for (int i = 0; i < tab(); ++i)
274 void MathStream::defer(docstring const & s)
280 void MathStream::defer(string const & s)
282 deferred_ << from_utf8(s);
286 docstring MathStream::deferred() const
288 return deferred_.str();
292 MathStream & operator<<(MathStream & ms, MathAtom const & at)
299 MathStream & operator<<(MathStream & ms, MathData const & ar)
306 MathStream & operator<<(MathStream & ms, char const * s)
313 MathStream & operator<<(MathStream & ms, char c)
320 MathStream & operator<<(MathStream & ms, char_type c)
327 MathStream & operator<<(MathStream & ms, MTag const & t)
331 ms.os() << '<' << from_ascii(t.tag_);
332 if (!t.attr_.empty())
333 ms.os() << " " << from_ascii(t.attr_);
339 MathStream & operator<<(MathStream & ms, ETag const & t)
344 ms.os() << "</" << from_ascii(t.tag_) << '>';
349 MathStream & operator<<(MathStream & ms, docstring const & s)
356 //////////////////////////////////////////////////////////////////////
359 HtmlStream::HtmlStream(odocstream & os)
360 : os_(os), tab_(0), line_(0), in_text_(false)
364 void HtmlStream::defer(docstring const & s)
370 void HtmlStream::defer(string const & s)
372 deferred_ << from_utf8(s);
376 docstring HtmlStream::deferred() const
378 return deferred_.str();
382 HtmlStream & operator<<(HtmlStream & ms, MathAtom const & at)
389 HtmlStream & operator<<(HtmlStream & ms, MathData const & ar)
396 HtmlStream & operator<<(HtmlStream & ms, char const * s)
403 HtmlStream & operator<<(HtmlStream & ms, char c)
410 HtmlStream & operator<<(HtmlStream & ms, char_type c)
417 HtmlStream & operator<<(HtmlStream & ms, MTag const & t)
419 ms.os() << '<' << from_ascii(t.tag_);
420 if (!t.attr_.empty())
421 ms.os() << " " << from_ascii(t.attr_);
427 HtmlStream & operator<<(HtmlStream & ms, ETag const & t)
429 ms.os() << "</" << from_ascii(t.tag_) << '>';
434 HtmlStream & operator<<(HtmlStream & ms, docstring const & s)
441 //////////////////////////////////////////////////////////////////////
444 SetMode::SetMode(MathStream & os, bool text)
447 was_text_ = os_.inText();
448 os_.setTextMode(text);
454 os_.setTextMode(was_text_);
458 //////////////////////////////////////////////////////////////////////
461 SetHTMLMode::SetHTMLMode(HtmlStream & os, bool text)
464 was_text_ = os_.inText();
465 os_.setTextMode(text);
469 SetHTMLMode::~SetHTMLMode()
471 os_.setTextMode(was_text_);
475 //////////////////////////////////////////////////////////////////////
478 MapleStream & operator<<(MapleStream & ms, MathAtom const & at)
485 MapleStream & operator<<(MapleStream & ms, MathData const & ar)
492 MapleStream & operator<<(MapleStream & ms, char const * s)
499 MapleStream & operator<<(MapleStream & ms, char c)
506 MapleStream & operator<<(MapleStream & ms, int i)
513 MapleStream & operator<<(MapleStream & ms, char_type c)
520 MapleStream & operator<<(MapleStream & ms, docstring const & s)
527 //////////////////////////////////////////////////////////////////////
530 MaximaStream & operator<<(MaximaStream & ms, MathAtom const & at)
537 MaximaStream & operator<<(MaximaStream & ms, MathData const & ar)
544 MaximaStream & operator<<(MaximaStream & ms, char const * s)
551 MaximaStream & operator<<(MaximaStream & ms, char c)
558 MaximaStream & operator<<(MaximaStream & ms, int i)
565 MaximaStream & operator<<(MaximaStream & ms, docstring const & s)
572 MaximaStream & operator<<(MaximaStream & ms, char_type c)
579 //////////////////////////////////////////////////////////////////////
582 MathematicaStream & operator<<(MathematicaStream & ms, MathAtom const & at)
589 MathematicaStream & operator<<(MathematicaStream & ms, MathData const & ar)
596 MathematicaStream & operator<<(MathematicaStream & ms, char const * s)
603 MathematicaStream & operator<<(MathematicaStream & ms, char c)
610 MathematicaStream & operator<<(MathematicaStream & ms, int i)
617 MathematicaStream & operator<<(MathematicaStream & ms, docstring const & s)
624 MathematicaStream & operator<<(MathematicaStream & ms, char_type c)
631 //////////////////////////////////////////////////////////////////////
634 OctaveStream & operator<<(OctaveStream & ns, MathAtom const & at)
641 OctaveStream & operator<<(OctaveStream & ns, MathData const & ar)
648 OctaveStream & operator<<(OctaveStream & ns, char const * s)
655 OctaveStream & operator<<(OctaveStream & ns, char c)
662 OctaveStream & operator<<(OctaveStream & ns, int i)
669 OctaveStream & operator<<(OctaveStream & ns, docstring const & s)
676 OctaveStream & operator<<(OctaveStream & ns, char_type c)
683 OctaveStream & operator<<(OctaveStream & os, string const & s)
685 os.os() << from_utf8(s);