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(false);
233 WriteStream & operator<<(WriteStream & ws, int i)
235 if (ws.pendingBrace()) {
237 ws.pendingBrace(false);
241 ws.canBreakLine(true);
246 WriteStream & operator<<(WriteStream & ws, unsigned int i)
248 if (ws.pendingBrace()) {
250 ws.pendingBrace(false);
254 ws.canBreakLine(true);
259 //////////////////////////////////////////////////////////////////////
262 MathStream::MathStream(odocstream & os)
263 : os_(os), tab_(0), line_(0), in_text_(false)
267 void MathStream::cr()
270 for (int i = 0; i < tab(); ++i)
275 void MathStream::defer(docstring const & s)
281 void MathStream::defer(string const & s)
283 deferred_ << from_utf8(s);
287 docstring MathStream::deferred() const
289 return deferred_.str();
293 MathStream & operator<<(MathStream & ms, MathAtom const & at)
300 MathStream & operator<<(MathStream & ms, MathData const & ar)
307 MathStream & operator<<(MathStream & ms, char const * s)
314 MathStream & operator<<(MathStream & ms, char c)
321 MathStream & operator<<(MathStream & ms, char_type c)
328 MathStream & operator<<(MathStream & ms, MTag const & t)
332 ms.os() << '<' << from_ascii(t.tag_);
333 if (!t.attr_.empty())
334 ms.os() << " " << from_ascii(t.attr_);
340 MathStream & operator<<(MathStream & ms, ETag const & t)
345 ms.os() << "</" << from_ascii(t.tag_) << '>';
350 MathStream & operator<<(MathStream & ms, docstring const & s)
357 //////////////////////////////////////////////////////////////////////
360 HtmlStream::HtmlStream(odocstream & os)
361 : os_(os), tab_(0), line_(0), in_text_(false)
365 void HtmlStream::defer(docstring const & s)
371 void HtmlStream::defer(string const & s)
373 deferred_ << from_utf8(s);
377 docstring HtmlStream::deferred() const
379 return deferred_.str();
383 HtmlStream & operator<<(HtmlStream & ms, MathAtom const & at)
390 HtmlStream & operator<<(HtmlStream & ms, MathData const & ar)
397 HtmlStream & operator<<(HtmlStream & ms, char const * s)
404 HtmlStream & operator<<(HtmlStream & ms, char c)
411 HtmlStream & operator<<(HtmlStream & ms, char_type c)
418 HtmlStream & operator<<(HtmlStream & ms, MTag const & t)
420 ms.os() << '<' << from_ascii(t.tag_);
421 if (!t.attr_.empty())
422 ms.os() << " " << from_ascii(t.attr_);
428 HtmlStream & operator<<(HtmlStream & ms, ETag const & t)
430 ms.os() << "</" << from_ascii(t.tag_) << '>';
435 HtmlStream & operator<<(HtmlStream & ms, docstring const & s)
442 //////////////////////////////////////////////////////////////////////
445 SetMode::SetMode(MathStream & os, bool text)
446 : os_(os), opened_(false)
452 SetMode::SetMode(MathStream & os, bool text, string const & attrs)
453 : os_(os), opened_(false)
459 void SetMode::init(bool text, string const & attrs)
461 was_text_ = os_.inText();
468 os_ << " " << from_utf8(attrs);
472 if (!attrs.empty()) {
473 os_ << "<mstyle " << from_utf8(attrs) << ">";
498 //////////////////////////////////////////////////////////////////////
501 SetHTMLMode::SetHTMLMode(HtmlStream & os, bool text)
502 : os_(os), opened_(false)
508 SetHTMLMode::SetHTMLMode(HtmlStream & os, bool text, string attrs)
509 : os_(os), opened_(true)
515 void SetHTMLMode::init(bool text, string const & attrs)
517 was_text_ = os_.inText();
523 os_ << MTag("span", attrs);
530 SetHTMLMode::~SetHTMLMode()
541 //////////////////////////////////////////////////////////////////////
544 MapleStream & operator<<(MapleStream & ms, MathAtom const & at)
551 MapleStream & operator<<(MapleStream & ms, MathData const & ar)
558 MapleStream & operator<<(MapleStream & ms, char const * s)
565 MapleStream & operator<<(MapleStream & ms, char c)
572 MapleStream & operator<<(MapleStream & ms, int i)
579 MapleStream & operator<<(MapleStream & ms, char_type c)
586 MapleStream & operator<<(MapleStream & ms, docstring const & s)
593 //////////////////////////////////////////////////////////////////////
596 MaximaStream & operator<<(MaximaStream & ms, MathAtom const & at)
603 MaximaStream & operator<<(MaximaStream & ms, MathData const & ar)
610 MaximaStream & operator<<(MaximaStream & ms, char const * s)
617 MaximaStream & operator<<(MaximaStream & ms, char c)
624 MaximaStream & operator<<(MaximaStream & ms, int i)
631 MaximaStream & operator<<(MaximaStream & ms, docstring const & s)
638 MaximaStream & operator<<(MaximaStream & ms, char_type c)
645 //////////////////////////////////////////////////////////////////////
648 MathematicaStream & operator<<(MathematicaStream & ms, MathAtom const & at)
655 MathematicaStream & operator<<(MathematicaStream & ms, MathData const & ar)
662 MathematicaStream & operator<<(MathematicaStream & ms, char const * s)
669 MathematicaStream & operator<<(MathematicaStream & ms, char c)
676 MathematicaStream & operator<<(MathematicaStream & ms, int i)
683 MathematicaStream & operator<<(MathematicaStream & ms, docstring const & s)
690 MathematicaStream & operator<<(MathematicaStream & ms, char_type c)
697 //////////////////////////////////////////////////////////////////////
700 OctaveStream & operator<<(OctaveStream & ns, MathAtom const & at)
707 OctaveStream & operator<<(OctaveStream & ns, MathData const & ar)
714 OctaveStream & operator<<(OctaveStream & ns, char const * s)
721 OctaveStream & operator<<(OctaveStream & ns, char c)
728 OctaveStream & operator<<(OctaveStream & ns, int i)
735 OctaveStream & operator<<(OctaveStream & ns, docstring const & s)
742 OctaveStream & operator<<(OctaveStream & ns, char_type c)
749 OctaveStream & operator<<(OctaveStream & os, string const & s)
751 os.os() << from_utf8(s);