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/docstring.h"
19 #include "support/RefChanger.h"
20 #include "support/textutils.h"
31 //////////////////////////////////////////////////////////////////////
34 NormalStream & operator<<(NormalStream & ns, MathAtom const & at)
41 NormalStream & operator<<(NormalStream & ns, MathData const & ar)
48 NormalStream & operator<<(NormalStream & ns, docstring const & s)
55 NormalStream & operator<<(NormalStream & ns, const string & s)
57 ns.os() << from_utf8(s);
62 NormalStream & operator<<(NormalStream & ns, char const * s)
69 NormalStream & operator<<(NormalStream & ns, char c)
76 NormalStream & operator<<(NormalStream & ns, int i)
84 /////////////////////////////////////////////////////////////////
87 WriteStream & operator<<(WriteStream & ws, docstring const & s)
89 // Skip leading '\n' if we had already output a newline char
91 (s.length() > 0 && (s[0] != '\n' || ws.canBreakLine())) ? 0 : 1;
93 // Check whether there's something to output
94 if (s.length() <= first)
97 if (ws.pendingBrace()) {
99 ws.pendingBrace(false);
100 ws.pendingSpace(false);
102 } else if (ws.pendingSpace()) {
103 if (isAlphaASCII(s[first]))
105 else if (s[first] == ' ' && ws.textMode())
107 ws.pendingSpace(false);
109 ws.os() << s.substr(first);
111 char_type lastchar = 0;
112 docstring::const_iterator dit = s.begin() + first;
113 docstring::const_iterator end = s.end();
114 for (; dit != end; ++dit) {
116 if (lastchar == '\n')
120 ws.canBreakLine(lastchar != '\n');
125 WriteStream::WriteStream(otexrowstream & os, bool fragile, bool latex,
126 OutputType output, Encoding const * encoding)
127 : os_(os), fragile_(fragile), firstitem_(false), latex_(latex),
128 output_(output), pendingspace_(false), pendingbrace_(false),
129 textmode_(false), locked_(0), ascii_(0), canbreakline_(true),
130 line_(0), encoding_(encoding), row_entry_(TexRow::row_none)
134 WriteStream::~WriteStream()
138 else if (pendingspace_)
143 void WriteStream::addlines(unsigned int n)
149 void WriteStream::pendingSpace(bool how)
155 void WriteStream::pendingBrace(bool brace)
157 pendingbrace_ = brace;
161 void WriteStream::textMode(bool textmode)
163 textmode_ = textmode;
167 void WriteStream::lockedMode(bool locked)
173 void WriteStream::asciiOnly(bool ascii)
179 Changer WriteStream::changeRowEntry(TexRow::RowEntry entry)
181 return make_change(row_entry_, entry);
185 bool WriteStream::startOuterRow()
187 if (TexRow::isNone(row_entry_))
189 return texrow().start(row_entry_);
193 WriteStream & operator<<(WriteStream & ws, MathAtom const & at)
200 WriteStream & operator<<(WriteStream & ws, MathData const & ar)
207 WriteStream & operator<<(WriteStream & ws, char const * s)
214 WriteStream & operator<<(WriteStream & ws, char c)
216 if (c == '\n' && !ws.canBreakLine())
219 if (ws.pendingBrace()) {
221 ws.pendingBrace(false);
222 ws.pendingSpace(false);
224 } else if (ws.pendingSpace()) {
227 else if (c == ' ' && ws.textMode())
229 ws.pendingSpace(false);
234 ws.canBreakLine(c != '\n');
239 WriteStream & operator<<(WriteStream & ws, int i)
241 if (ws.pendingBrace()) {
243 ws.pendingBrace(false);
247 ws.canBreakLine(true);
252 WriteStream & operator<<(WriteStream & ws, unsigned int i)
254 if (ws.pendingBrace()) {
256 ws.pendingBrace(false);
260 ws.canBreakLine(true);
265 //////////////////////////////////////////////////////////////////////
268 MathStream::MathStream(odocstream & os)
269 : os_(os), tab_(0), line_(0), in_text_(false)
273 void MathStream::cr()
276 for (int i = 0; i < tab(); ++i)
281 void MathStream::defer(docstring const & s)
287 void MathStream::defer(string const & s)
289 deferred_ << from_utf8(s);
293 docstring MathStream::deferred() const
295 return deferred_.str();
299 MathStream & operator<<(MathStream & ms, MathAtom const & at)
306 MathStream & operator<<(MathStream & ms, MathData const & ar)
313 MathStream & operator<<(MathStream & ms, char const * s)
320 MathStream & operator<<(MathStream & ms, char c)
327 MathStream & operator<<(MathStream & ms, char_type c)
334 MathStream & operator<<(MathStream & ms, MTag const & t)
338 ms.os() << '<' << from_ascii(t.tag_);
339 if (!t.attr_.empty())
340 ms.os() << " " << from_ascii(t.attr_);
346 MathStream & operator<<(MathStream & ms, ETag const & t)
351 ms.os() << "</" << from_ascii(t.tag_) << '>';
356 MathStream & operator<<(MathStream & ms, docstring const & s)
363 //////////////////////////////////////////////////////////////////////
366 HtmlStream::HtmlStream(odocstream & os)
367 : os_(os), tab_(0), line_(0), in_text_(false)
371 void HtmlStream::defer(docstring const & s)
377 void HtmlStream::defer(string const & s)
379 deferred_ << from_utf8(s);
383 docstring HtmlStream::deferred() const
385 return deferred_.str();
389 HtmlStream & operator<<(HtmlStream & ms, MathAtom const & at)
396 HtmlStream & operator<<(HtmlStream & ms, MathData const & ar)
403 HtmlStream & operator<<(HtmlStream & ms, char const * s)
410 HtmlStream & operator<<(HtmlStream & ms, char c)
417 HtmlStream & operator<<(HtmlStream & ms, char_type c)
424 HtmlStream & operator<<(HtmlStream & ms, MTag const & t)
426 ms.os() << '<' << from_ascii(t.tag_);
427 if (!t.attr_.empty())
428 ms.os() << " " << from_ascii(t.attr_);
434 HtmlStream & operator<<(HtmlStream & ms, ETag const & t)
436 ms.os() << "</" << from_ascii(t.tag_) << '>';
441 HtmlStream & operator<<(HtmlStream & ms, docstring const & s)
448 //////////////////////////////////////////////////////////////////////
451 SetMode::SetMode(MathStream & os, bool text)
454 was_text_ = os_.inText();
455 os_.setTextMode(text);
461 os_.setTextMode(was_text_);
465 //////////////////////////////////////////////////////////////////////
468 SetHTMLMode::SetHTMLMode(HtmlStream & os, bool text)
471 was_text_ = os_.inText();
472 os_.setTextMode(text);
476 SetHTMLMode::~SetHTMLMode()
478 os_.setTextMode(was_text_);
482 //////////////////////////////////////////////////////////////////////
485 MapleStream & operator<<(MapleStream & ms, MathAtom const & at)
492 MapleStream & operator<<(MapleStream & ms, MathData const & ar)
499 MapleStream & operator<<(MapleStream & ms, char const * s)
506 MapleStream & operator<<(MapleStream & ms, char c)
513 MapleStream & operator<<(MapleStream & ms, int i)
520 MapleStream & operator<<(MapleStream & ms, char_type c)
527 MapleStream & operator<<(MapleStream & ms, docstring const & s)
534 //////////////////////////////////////////////////////////////////////
537 MaximaStream & operator<<(MaximaStream & ms, MathAtom const & at)
544 MaximaStream & operator<<(MaximaStream & ms, MathData const & ar)
551 MaximaStream & operator<<(MaximaStream & ms, char const * s)
558 MaximaStream & operator<<(MaximaStream & ms, char c)
565 MaximaStream & operator<<(MaximaStream & ms, int i)
572 MaximaStream & operator<<(MaximaStream & ms, docstring const & s)
579 MaximaStream & operator<<(MaximaStream & ms, char_type c)
586 //////////////////////////////////////////////////////////////////////
589 MathematicaStream & operator<<(MathematicaStream & ms, MathAtom const & at)
596 MathematicaStream & operator<<(MathematicaStream & ms, MathData const & ar)
603 MathematicaStream & operator<<(MathematicaStream & ms, char const * s)
610 MathematicaStream & operator<<(MathematicaStream & ms, char c)
617 MathematicaStream & operator<<(MathematicaStream & ms, int i)
624 MathematicaStream & operator<<(MathematicaStream & ms, docstring const & s)
631 MathematicaStream & operator<<(MathematicaStream & ms, char_type c)
638 //////////////////////////////////////////////////////////////////////
641 OctaveStream & operator<<(OctaveStream & ns, MathAtom const & at)
648 OctaveStream & operator<<(OctaveStream & ns, MathData const & ar)
655 OctaveStream & operator<<(OctaveStream & ns, char const * s)
662 OctaveStream & operator<<(OctaveStream & ns, char c)
669 OctaveStream & operator<<(OctaveStream & ns, int i)
676 OctaveStream & operator<<(OctaveStream & ns, docstring const & s)
683 OctaveStream & operator<<(OctaveStream & ns, char_type c)
690 OctaveStream & operator<<(OctaveStream & os, string const & s)
692 os.os() << from_utf8(s);