A bit more re-organization.
[lyx.git] / src / mathed / MathStream.cpp
blobc0325a97a8b639a3365126ab7c275f6bdf7fdb4e
1 /**
2 * \file MathStream.cpp
3 * This file is part of LyX, the document processor.
4 * Licence details can be found in the file COPYING.
6 * \author André Pönitz
8 * Full author contact details are available in file CREDITS.
9 */
11 #include <config.h>
13 #include "MathStream.h"
15 #include "MathData.h"
16 #include "MathExtern.h"
18 #include "support/textutils.h"
19 #include "support/docstring.h"
21 #include <algorithm>
22 #include <cstring>
23 #include <ostream>
25 using namespace std;
27 namespace lyx {
30 //////////////////////////////////////////////////////////////////////
33 NormalStream & operator<<(NormalStream & ns, MathAtom const & at)
35 at->normalize(ns);
36 return ns;
40 NormalStream & operator<<(NormalStream & ns, MathData const & ar)
42 normalize(ar, ns);
43 return ns;
47 NormalStream & operator<<(NormalStream & ns, docstring const & s)
49 ns.os() << s;
50 return ns;
54 NormalStream & operator<<(NormalStream & ns, const string & s)
56 ns.os() << from_utf8(s);
57 return ns;
61 NormalStream & operator<<(NormalStream & ns, char const * s)
63 ns.os() << s;
64 return ns;
68 NormalStream & operator<<(NormalStream & ns, char c)
70 ns.os() << c;
71 return ns;
75 NormalStream & operator<<(NormalStream & ns, int i)
77 ns.os() << i;
78 return ns;
83 /////////////////////////////////////////////////////////////////
86 WriteStream & operator<<(WriteStream & ws, docstring const & s)
88 if (ws.pendingBrace()) {
89 ws.os() << '}';
90 ws.pendingBrace(false);
91 ws.pendingSpace(false);
92 ws.textMode(true);
93 } else if (ws.pendingSpace() && s.length() > 0) {
94 if (isAlphaASCII(s[0]))
95 ws.os() << ' ';
96 else if (s[0] == ' ' && ws.textMode())
97 ws.os() << '\\';
98 ws.pendingSpace(false);
100 ws.os() << s;
101 int lf = 0;
102 docstring::const_iterator dit = s.begin();
103 docstring::const_iterator end = s.end();
104 for (; dit != end; ++dit)
105 if ((*dit) == '\n')
106 ++lf;
107 ws.addlines(lf);
108 return ws;
112 WriteStream::WriteStream(odocstream & os, bool fragile, bool latex, OutputType output,
113 Encoding const * encoding)
114 : os_(os), fragile_(fragile), firstitem_(false), latex_(latex),
115 output_(output), pendingspace_(false), pendingbrace_(false),
116 textmode_(false), locked_(0), line_(0), encoding_(encoding)
120 WriteStream::WriteStream(odocstream & os)
121 : os_(os), fragile_(false), firstitem_(false), latex_(false),
122 output_(wsDefault), pendingspace_(false), pendingbrace_(false),
123 textmode_(false), locked_(0), line_(0), encoding_(0)
127 WriteStream::~WriteStream()
129 if (pendingbrace_)
130 os_ << '}';
131 else if (pendingspace_)
132 os_ << ' ';
136 void WriteStream::addlines(unsigned int n)
138 line_ += n;
142 void WriteStream::pendingSpace(bool how)
144 pendingspace_ = how;
148 void WriteStream::pendingBrace(bool brace)
150 pendingbrace_ = brace;
154 void WriteStream::textMode(bool textmode)
156 textmode_ = textmode;
160 void WriteStream::lockedMode(bool locked)
162 locked_ = locked;
166 WriteStream & operator<<(WriteStream & ws, MathAtom const & at)
168 at->write(ws);
169 return ws;
173 WriteStream & operator<<(WriteStream & ws, MathData const & ar)
175 write(ar, ws);
176 return ws;
180 WriteStream & operator<<(WriteStream & ws, char const * s)
182 if (ws.pendingBrace()) {
183 ws.os() << '}';
184 ws.pendingBrace(false);
185 ws.pendingSpace(false);
186 ws.textMode(true);
187 } else if (ws.pendingSpace() && strlen(s) > 0) {
188 if (isAlphaASCII(s[0]))
189 ws.os() << ' ';
190 else if (s[0] == ' ' && ws.textMode())
191 ws.os() << '\\';
192 ws.pendingSpace(false);
194 ws.os() << s;
195 ws.addlines(int(count(s, s + strlen(s), '\n')));
196 return ws;
200 WriteStream & operator<<(WriteStream & ws, char c)
202 if (ws.pendingBrace()) {
203 ws.os() << '}';
204 ws.pendingBrace(false);
205 ws.pendingSpace(false);
206 ws.textMode(true);
207 } else if (ws.pendingSpace()) {
208 if (isAlphaASCII(c))
209 ws.os() << ' ';
210 else if (c == ' ' && ws.textMode())
211 ws.os() << '\\';
212 ws.pendingSpace(false);
214 ws.os() << c;
215 if (c == '\n')
216 ws.addlines(1);
217 return ws;
221 WriteStream & operator<<(WriteStream & ws, int i)
223 if (ws.pendingBrace()) {
224 ws.os() << '}';
225 ws.pendingBrace(false);
226 ws.textMode(true);
228 ws.os() << i;
229 return ws;
233 WriteStream & operator<<(WriteStream & ws, unsigned int i)
235 if (ws.pendingBrace()) {
236 ws.os() << '}';
237 ws.pendingBrace(false);
238 ws.textMode(true);
240 ws.os() << i;
241 return ws;
245 //////////////////////////////////////////////////////////////////////
248 MathStream::MathStream(odocstream & os)
249 : os_(os), tab_(0), line_(0), lastchar_(0)
253 MathStream & operator<<(MathStream & ms, MathAtom const & at)
255 at->mathmlize(ms);
256 return ms;
260 MathStream & operator<<(MathStream & ms, MathData const & ar)
262 mathmlize(ar, ms);
263 return ms;
267 MathStream & operator<<(MathStream & ms, char const * s)
269 ms.os() << s;
270 return ms;
274 MathStream & operator<<(MathStream & ms, char c)
276 ms.os() << c;
277 return ms;
281 MathStream & operator<<(MathStream & ms, MTag const & t)
283 ++ms.tab();
284 ms.cr();
285 ms.os() << '<' << from_ascii(t.tag_) << '>';
286 return ms;
290 MathStream & operator<<(MathStream & ms, ETag const & t)
292 ms.cr();
293 if (ms.tab() > 0)
294 --ms.tab();
295 ms.os() << "</" << from_ascii(t.tag_) << '>';
296 return ms;
300 void MathStream::cr()
302 os() << '\n';
303 for (int i = 0; i < tab(); ++i)
304 os() << ' ';
308 MathStream & operator<<(MathStream & ms, docstring const & s)
310 ms.os() << s;
311 return ms;
314 //////////////////////////////////////////////////////////////////////
317 MapleStream & operator<<(MapleStream & ms, MathAtom const & at)
319 at->maple(ms);
320 return ms;
324 MapleStream & operator<<(MapleStream & ms, MathData const & ar)
326 maple(ar, ms);
327 return ms;
331 MapleStream & operator<<(MapleStream & ms, char const * s)
333 ms.os() << s;
334 return ms;
338 MapleStream & operator<<(MapleStream & ms, char c)
340 ms.os() << c;
341 return ms;
345 MapleStream & operator<<(MapleStream & ms, int i)
347 ms.os() << i;
348 return ms;
352 MapleStream & operator<<(MapleStream & ms, char_type c)
354 ms.os().put(c);
355 return ms;
359 MapleStream & operator<<(MapleStream & ms, docstring const & s)
361 ms.os() << s;
362 return ms;
366 //////////////////////////////////////////////////////////////////////
369 MaximaStream & operator<<(MaximaStream & ms, MathAtom const & at)
371 at->maxima(ms);
372 return ms;
376 MaximaStream & operator<<(MaximaStream & ms, MathData const & ar)
378 maxima(ar, ms);
379 return ms;
383 MaximaStream & operator<<(MaximaStream & ms, char const * s)
385 ms.os() << s;
386 return ms;
390 MaximaStream & operator<<(MaximaStream & ms, char c)
392 ms.os() << c;
393 return ms;
397 MaximaStream & operator<<(MaximaStream & ms, int i)
399 ms.os() << i;
400 return ms;
404 MaximaStream & operator<<(MaximaStream & ms, docstring const & s)
406 ms.os() << s;
407 return ms;
411 MaximaStream & operator<<(MaximaStream & ms, char_type c)
413 ms.os().put(c);
414 return ms;
418 //////////////////////////////////////////////////////////////////////
421 MathematicaStream & operator<<(MathematicaStream & ms, MathAtom const & at)
423 at->mathematica(ms);
424 return ms;
428 MathematicaStream & operator<<(MathematicaStream & ms, MathData const & ar)
430 mathematica(ar, ms);
431 return ms;
435 MathematicaStream & operator<<(MathematicaStream & ms, char const * s)
437 ms.os() << s;
438 return ms;
442 MathematicaStream & operator<<(MathematicaStream & ms, char c)
444 ms.os() << c;
445 return ms;
449 MathematicaStream & operator<<(MathematicaStream & ms, int i)
451 ms.os() << i;
452 return ms;
456 MathematicaStream & operator<<(MathematicaStream & ms, docstring const & s)
458 ms.os() << s;
459 return ms;
463 MathematicaStream & operator<<(MathematicaStream & ms, char_type c)
465 ms.os().put(c);
466 return ms;
470 //////////////////////////////////////////////////////////////////////
473 OctaveStream & operator<<(OctaveStream & ns, MathAtom const & at)
475 at->octave(ns);
476 return ns;
480 OctaveStream & operator<<(OctaveStream & ns, MathData const & ar)
482 octave(ar, ns);
483 return ns;
487 OctaveStream & operator<<(OctaveStream & ns, char const * s)
489 ns.os() << s;
490 return ns;
494 OctaveStream & operator<<(OctaveStream & ns, char c)
496 ns.os() << c;
497 return ns;
501 OctaveStream & operator<<(OctaveStream & ns, int i)
503 ns.os() << i;
504 return ns;
508 OctaveStream & operator<<(OctaveStream & ns, docstring const & s)
510 ns.os() << s;
511 return ns;
515 OctaveStream & operator<<(OctaveStream & ns, char_type c)
517 ns.os().put(c);
518 return ns;
522 OctaveStream & operator<<(OctaveStream & os, string const & s)
524 os.os() << from_utf8(s);
525 return os;
529 } // namespace lyx