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);
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 canbreakline_(true), textmode_(false), locked_(0), ascii_(0),
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 canbreakline_(true), textmode_(false), locked_(0), ascii_(0),
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)
445 : os_(os), opened_(false)
451 SetMode::SetMode(MathStream & os, bool text, string const & attrs)
452 : os_(os), opened_(false)
458 void SetMode::init(bool text, string const & attrs)
460 was_text_ = os_.inText();
467 os_ << " " << from_utf8(attrs);
471 if (!attrs.empty()) {
472 os_ << "<mstyle " << from_utf8(attrs) << ">";
497 //////////////////////////////////////////////////////////////////////
500 SetHTMLMode::SetHTMLMode(HtmlStream & os, bool text)
501 : os_(os), opened_(false)
507 SetHTMLMode::SetHTMLMode(HtmlStream & os, bool text, string attrs)
508 : os_(os), opened_(true)
514 void SetHTMLMode::init(bool text, string const & attrs)
516 was_text_ = os_.inText();
522 os_ << MTag("span", attrs);
529 SetHTMLMode::~SetHTMLMode()
540 //////////////////////////////////////////////////////////////////////
543 MapleStream & operator<<(MapleStream & ms, MathAtom const & at)
550 MapleStream & operator<<(MapleStream & ms, MathData const & ar)
557 MapleStream & operator<<(MapleStream & ms, char const * s)
564 MapleStream & operator<<(MapleStream & ms, char c)
571 MapleStream & operator<<(MapleStream & ms, int i)
578 MapleStream & operator<<(MapleStream & ms, char_type c)
585 MapleStream & operator<<(MapleStream & ms, docstring const & s)
592 //////////////////////////////////////////////////////////////////////
595 MaximaStream & operator<<(MaximaStream & ms, MathAtom const & at)
602 MaximaStream & operator<<(MaximaStream & ms, MathData const & ar)
609 MaximaStream & operator<<(MaximaStream & ms, char const * s)
616 MaximaStream & operator<<(MaximaStream & ms, char c)
623 MaximaStream & operator<<(MaximaStream & ms, int i)
630 MaximaStream & operator<<(MaximaStream & ms, docstring const & s)
637 MaximaStream & operator<<(MaximaStream & ms, char_type c)
644 //////////////////////////////////////////////////////////////////////
647 MathematicaStream & operator<<(MathematicaStream & ms, MathAtom const & at)
654 MathematicaStream & operator<<(MathematicaStream & ms, MathData const & ar)
661 MathematicaStream & operator<<(MathematicaStream & ms, char const * s)
668 MathematicaStream & operator<<(MathematicaStream & ms, char c)
675 MathematicaStream & operator<<(MathematicaStream & ms, int i)
682 MathematicaStream & operator<<(MathematicaStream & ms, docstring const & s)
689 MathematicaStream & operator<<(MathematicaStream & ms, char_type c)
696 //////////////////////////////////////////////////////////////////////
699 OctaveStream & operator<<(OctaveStream & ns, MathAtom const & at)
706 OctaveStream & operator<<(OctaveStream & ns, MathData const & ar)
713 OctaveStream & operator<<(OctaveStream & ns, char const * s)
720 OctaveStream & operator<<(OctaveStream & ns, char c)
727 OctaveStream & operator<<(OctaveStream & ns, int i)
734 OctaveStream & operator<<(OctaveStream & ns, docstring const & s)
741 OctaveStream & operator<<(OctaveStream & ns, char_type c)
748 OctaveStream & operator<<(OctaveStream & os, string const & s)
750 os.os() << from_utf8(s);