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(otexrowstream & os, bool fragile, bool latex,
125 OutputType output, 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(otexrowstream & 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 void WriteStream::pushRowEntry(TexRow::RowEntry entry)
188 outer_row_entries_.push_back(entry);
192 void WriteStream::popRowEntry()
194 if (!outer_row_entries_.empty())
195 outer_row_entries_.pop_back();
199 bool WriteStream::startOuterRow()
201 size_t n = outer_row_entries_.size();
203 return texrow().start(outer_row_entries_[n - 1]);
209 WriteStream & operator<<(WriteStream & ws, MathAtom const & at)
216 WriteStream & operator<<(WriteStream & ws, MathData const & ar)
223 WriteStream & operator<<(WriteStream & ws, char const * s)
230 WriteStream & operator<<(WriteStream & ws, char c)
232 if (c == '\n' && !ws.canBreakLine())
235 if (ws.pendingBrace()) {
237 ws.pendingBrace(false);
238 ws.pendingSpace(false);
240 } else if (ws.pendingSpace()) {
243 else if (c == ' ' && ws.textMode())
245 ws.pendingSpace(false);
250 ws.canBreakLine(c != '\n');
255 WriteStream & operator<<(WriteStream & ws, int i)
257 if (ws.pendingBrace()) {
259 ws.pendingBrace(false);
263 ws.canBreakLine(true);
268 WriteStream & operator<<(WriteStream & ws, unsigned int i)
270 if (ws.pendingBrace()) {
272 ws.pendingBrace(false);
276 ws.canBreakLine(true);
281 //////////////////////////////////////////////////////////////////////
284 MathStream::MathStream(odocstream & os)
285 : os_(os), tab_(0), line_(0), in_text_(false)
289 void MathStream::cr()
292 for (int i = 0; i < tab(); ++i)
297 void MathStream::defer(docstring const & s)
303 void MathStream::defer(string const & s)
305 deferred_ << from_utf8(s);
309 docstring MathStream::deferred() const
311 return deferred_.str();
315 MathStream & operator<<(MathStream & ms, MathAtom const & at)
322 MathStream & operator<<(MathStream & ms, MathData const & ar)
329 MathStream & operator<<(MathStream & ms, char const * s)
336 MathStream & operator<<(MathStream & ms, char c)
343 MathStream & operator<<(MathStream & ms, char_type c)
350 MathStream & operator<<(MathStream & ms, MTag const & t)
354 ms.os() << '<' << from_ascii(t.tag_);
355 if (!t.attr_.empty())
356 ms.os() << " " << from_ascii(t.attr_);
362 MathStream & operator<<(MathStream & ms, ETag const & t)
367 ms.os() << "</" << from_ascii(t.tag_) << '>';
372 MathStream & operator<<(MathStream & ms, docstring const & s)
379 //////////////////////////////////////////////////////////////////////
382 HtmlStream::HtmlStream(odocstream & os)
383 : os_(os), tab_(0), line_(0), in_text_(false)
387 void HtmlStream::defer(docstring const & s)
393 void HtmlStream::defer(string const & s)
395 deferred_ << from_utf8(s);
399 docstring HtmlStream::deferred() const
401 return deferred_.str();
405 HtmlStream & operator<<(HtmlStream & ms, MathAtom const & at)
412 HtmlStream & operator<<(HtmlStream & ms, MathData const & ar)
419 HtmlStream & operator<<(HtmlStream & ms, char const * s)
426 HtmlStream & operator<<(HtmlStream & ms, char c)
433 HtmlStream & operator<<(HtmlStream & ms, char_type c)
440 HtmlStream & operator<<(HtmlStream & ms, MTag const & t)
442 ms.os() << '<' << from_ascii(t.tag_);
443 if (!t.attr_.empty())
444 ms.os() << " " << from_ascii(t.attr_);
450 HtmlStream & operator<<(HtmlStream & ms, ETag const & t)
452 ms.os() << "</" << from_ascii(t.tag_) << '>';
457 HtmlStream & operator<<(HtmlStream & ms, docstring const & s)
464 //////////////////////////////////////////////////////////////////////
467 SetMode::SetMode(MathStream & os, bool text)
470 was_text_ = os_.inText();
471 os_.setTextMode(text);
477 os_.setTextMode(was_text_);
481 //////////////////////////////////////////////////////////////////////
484 SetHTMLMode::SetHTMLMode(HtmlStream & os, bool text)
487 was_text_ = os_.inText();
488 os_.setTextMode(text);
492 SetHTMLMode::~SetHTMLMode()
494 os_.setTextMode(was_text_);
498 //////////////////////////////////////////////////////////////////////
501 MapleStream & operator<<(MapleStream & ms, MathAtom const & at)
508 MapleStream & operator<<(MapleStream & ms, MathData const & ar)
515 MapleStream & operator<<(MapleStream & ms, char const * s)
522 MapleStream & operator<<(MapleStream & ms, char c)
529 MapleStream & operator<<(MapleStream & ms, int i)
536 MapleStream & operator<<(MapleStream & ms, char_type c)
543 MapleStream & operator<<(MapleStream & ms, docstring const & s)
550 //////////////////////////////////////////////////////////////////////
553 MaximaStream & operator<<(MaximaStream & ms, MathAtom const & at)
560 MaximaStream & operator<<(MaximaStream & ms, MathData const & ar)
567 MaximaStream & operator<<(MaximaStream & ms, char const * s)
574 MaximaStream & operator<<(MaximaStream & ms, char c)
581 MaximaStream & operator<<(MaximaStream & ms, int i)
588 MaximaStream & operator<<(MaximaStream & ms, docstring const & s)
595 MaximaStream & operator<<(MaximaStream & ms, char_type c)
602 //////////////////////////////////////////////////////////////////////
605 MathematicaStream & operator<<(MathematicaStream & ms, MathAtom const & at)
612 MathematicaStream & operator<<(MathematicaStream & ms, MathData const & ar)
619 MathematicaStream & operator<<(MathematicaStream & ms, char const * s)
626 MathematicaStream & operator<<(MathematicaStream & ms, char c)
633 MathematicaStream & operator<<(MathematicaStream & ms, int i)
640 MathematicaStream & operator<<(MathematicaStream & ms, docstring const & s)
647 MathematicaStream & operator<<(MathematicaStream & ms, char_type c)
654 //////////////////////////////////////////////////////////////////////
657 OctaveStream & operator<<(OctaveStream & ns, MathAtom const & at)
664 OctaveStream & operator<<(OctaveStream & ns, MathData const & ar)
671 OctaveStream & operator<<(OctaveStream & ns, char const * s)
678 OctaveStream & operator<<(OctaveStream & ns, char c)
685 OctaveStream & operator<<(OctaveStream & ns, int i)
692 OctaveStream & operator<<(OctaveStream & ns, docstring const & s)
699 OctaveStream & operator<<(OctaveStream & ns, char_type c)
706 OctaveStream & operator<<(OctaveStream & os, string const & s)
708 os.os() << from_utf8(s);