]> git.lyx.org Git - lyx.git/blob - src/mathed/MathStream.cpp
* GuiView.cpp:
[lyx.git] / src / mathed / MathStream.cpp
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.
5  *
6  * \author André Pönitz
7  *
8  * Full author contact details are available in file CREDITS.
9  */
10
11 #include <config.h>
12
13 #include "MathStream.h"
14
15 #include "MathData.h"
16 #include "MathExtern.h"
17
18 #include "support/textutils.h"
19 #include "support/docstring.h"
20
21 #include <algorithm>
22 #include <cstring>
23 #include <ostream>
24
25 using namespace std;
26
27 namespace lyx {
28
29
30 //////////////////////////////////////////////////////////////////////
31
32
33 NormalStream & operator<<(NormalStream & ns, MathAtom const & at)
34 {
35         at->normalize(ns);
36         return ns;
37 }
38
39
40 NormalStream & operator<<(NormalStream & ns, MathData const & ar)
41 {
42         normalize(ar, ns);
43         return ns;
44 }
45
46
47 NormalStream & operator<<(NormalStream & ns, docstring const & s)
48 {
49         ns.os() << s;
50         return ns;
51 }
52
53
54 NormalStream & operator<<(NormalStream & ns, const string & s)
55 {
56         ns.os() << from_utf8(s);
57         return ns;
58 }
59
60
61 NormalStream & operator<<(NormalStream & ns, char const * s)
62 {
63         ns.os() << s;
64         return ns;
65 }
66
67
68 NormalStream & operator<<(NormalStream & ns, char c)
69 {
70         ns.os() << c;
71         return ns;
72 }
73
74
75 NormalStream & operator<<(NormalStream & ns, int i)
76 {
77         ns.os() << i;
78         return ns;
79 }
80
81
82
83 /////////////////////////////////////////////////////////////////
84
85
86 WriteStream & operator<<(WriteStream & ws, docstring const & s)
87 {
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                 ws.pendingSpace(false);
97         }
98         ws.os() << s;
99         int lf = 0;
100         docstring::const_iterator dit = s.begin();
101         docstring::const_iterator end = s.end();
102         for (; dit != end; ++dit)
103                 if ((*dit) == '\n')
104                         ++lf;
105         ws.addlines(lf);
106         return ws;
107 }
108
109
110 WriteStream::WriteStream(odocstream & os, bool fragile, bool latex, bool dryrun)
111         : os_(os), fragile_(fragile), firstitem_(false), latex_(latex),
112           dryrun_(dryrun), pendingspace_(false), pendingbrace_(false),
113           textmode_(false), line_(0)
114 {}
115
116
117 WriteStream::WriteStream(odocstream & os)
118         : os_(os), fragile_(false), firstitem_(false), latex_(false),
119           dryrun_(false), pendingspace_(false), pendingbrace_(false),
120           textmode_(false), line_(0)
121 {}
122
123
124 WriteStream::~WriteStream()
125 {
126         if (pendingbrace_)
127                 os_ << '}';
128         else if (pendingspace_)
129                 os_ << ' ';
130 }
131
132
133 void WriteStream::addlines(unsigned int n)
134 {
135         line_ += n;
136 }
137
138
139 void WriteStream::pendingSpace(bool how)
140 {
141         pendingspace_ = how;
142 }
143
144
145 void WriteStream::pendingBrace(bool brace)
146 {
147         pendingbrace_ = brace;
148 }
149
150
151 void WriteStream::textMode(bool textmode)
152 {
153         textmode_ = textmode;
154 }
155
156
157 WriteStream & operator<<(WriteStream & ws, MathAtom const & at)
158 {
159         at->write(ws);
160         return ws;
161 }
162
163
164 WriteStream & operator<<(WriteStream & ws, MathData const & ar)
165 {
166         write(ar, ws);
167         return ws;
168 }
169
170
171 WriteStream & operator<<(WriteStream & ws, char const * s)
172 {
173         if (ws.pendingBrace()) {
174                 ws.os() << '}';
175                 ws.pendingBrace(false);
176                 ws.pendingSpace(false);
177                 ws.textMode(true);
178         } else if (ws.pendingSpace() && strlen(s) > 0) {
179                 if (isAlphaASCII(s[0]))
180                         ws.os() << ' ';
181                 ws.pendingSpace(false);
182         }
183         ws.os() << s;
184         ws.addlines(int(count(s, s + strlen(s), '\n')));
185         return ws;
186 }
187
188
189 WriteStream & operator<<(WriteStream & ws, char c)
190 {
191         if (ws.pendingBrace()) {
192                 ws.os() << '}';
193                 ws.pendingBrace(false);
194                 ws.pendingSpace(false);
195                 ws.textMode(true);
196         } else if (ws.pendingSpace()) {
197                 if (isAlphaASCII(c))
198                         ws.os() << ' ';
199                 ws.pendingSpace(false);
200         }
201         ws.os() << c;
202         if (c == '\n')
203                 ws.addlines(1);
204         return ws;
205 }
206
207
208 WriteStream & operator<<(WriteStream & ws, int i)
209 {
210         if (ws.pendingBrace()) {
211                 ws.os() << '}';
212                 ws.pendingBrace(false);
213                 ws.textMode(true);
214         }
215         ws.os() << i;
216         return ws;
217 }
218
219
220 WriteStream & operator<<(WriteStream & ws, unsigned int i)
221 {
222         if (ws.pendingBrace()) {
223                 ws.os() << '}';
224                 ws.pendingBrace(false);
225                 ws.textMode(true);
226         }
227         ws.os() << i;
228         return ws;
229 }
230
231
232 //////////////////////////////////////////////////////////////////////
233
234
235 MathStream::MathStream(odocstream & os)
236         : os_(os), tab_(0), line_(0), lastchar_(0)
237 {}
238
239
240 MathStream & operator<<(MathStream & ms, MathAtom const & at)
241 {
242         at->mathmlize(ms);
243         return ms;
244 }
245
246
247 MathStream & operator<<(MathStream & ms, MathData const & ar)
248 {
249         mathmlize(ar, ms);
250         return ms;
251 }
252
253
254 MathStream & operator<<(MathStream & ms, char const * s)
255 {
256         ms.os() << s;
257         return ms;
258 }
259
260
261 MathStream & operator<<(MathStream & ms, char c)
262 {
263         ms.os() << c;
264         return ms;
265 }
266
267
268 MathStream & operator<<(MathStream & ms, MTag const & t)
269 {
270         ++ms.tab();
271         ms.cr();
272         ms.os() << '<' << from_ascii(t.tag_) << '>';
273         return ms;
274 }
275
276
277 MathStream & operator<<(MathStream & ms, ETag const & t)
278 {
279         ms.cr();
280         if (ms.tab() > 0)
281                 --ms.tab();
282         ms.os() << "</" << from_ascii(t.tag_) << '>';
283         return ms;
284 }
285
286
287 void MathStream::cr()
288 {
289         os() << '\n';
290         for (int i = 0; i < tab(); ++i)
291                 os() << ' ';
292 }
293
294
295 MathStream & operator<<(MathStream & ms, docstring const & s)
296 {
297         ms.os() << s;
298         return ms;
299 }
300
301 //////////////////////////////////////////////////////////////////////
302
303
304 MapleStream & operator<<(MapleStream & ms, MathAtom const & at)
305 {
306         at->maple(ms);
307         return ms;
308 }
309
310
311 MapleStream & operator<<(MapleStream & ms, MathData const & ar)
312 {
313         maple(ar, ms);
314         return ms;
315 }
316
317
318 MapleStream & operator<<(MapleStream & ms, char const * s)
319 {
320         ms.os() << s;
321         return ms;
322 }
323
324
325 MapleStream & operator<<(MapleStream & ms, char c)
326 {
327         ms.os() << c;
328         return ms;
329 }
330
331
332 MapleStream & operator<<(MapleStream & ms, int i)
333 {
334         ms.os() << i;
335         return ms;
336 }
337
338
339 MapleStream & operator<<(MapleStream & ms, char_type c)
340 {
341         ms.os().put(c);
342         return ms;
343 }
344
345
346 MapleStream & operator<<(MapleStream & ms, docstring const & s)
347 {
348         ms.os() << s;
349         return ms;
350 }
351
352
353 //////////////////////////////////////////////////////////////////////
354
355
356 MaximaStream & operator<<(MaximaStream & ms, MathAtom const & at)
357 {
358         at->maxima(ms);
359         return ms;
360 }
361
362
363 MaximaStream & operator<<(MaximaStream & ms, MathData const & ar)
364 {
365         maxima(ar, ms);
366         return ms;
367 }
368
369
370 MaximaStream & operator<<(MaximaStream & ms, char const * s)
371 {
372         ms.os() << s;
373         return ms;
374 }
375
376
377 MaximaStream & operator<<(MaximaStream & ms, char c)
378 {
379         ms.os() << c;
380         return ms;
381 }
382
383
384 MaximaStream & operator<<(MaximaStream & ms, int i)
385 {
386         ms.os() << i;
387         return ms;
388 }
389
390
391 MaximaStream & operator<<(MaximaStream & ms, docstring const & s)
392 {
393         ms.os() << s;
394         return ms;
395 }
396
397
398 MaximaStream & operator<<(MaximaStream & ms, char_type c)
399 {
400         ms.os().put(c);
401         return ms;
402 }
403
404
405 //////////////////////////////////////////////////////////////////////
406
407
408 MathematicaStream & operator<<(MathematicaStream & ms, MathAtom const & at)
409 {
410         at->mathematica(ms);
411         return ms;
412 }
413
414
415 MathematicaStream & operator<<(MathematicaStream & ms, MathData const & ar)
416 {
417         mathematica(ar, ms);
418         return ms;
419 }
420
421
422 MathematicaStream & operator<<(MathematicaStream & ms, char const * s)
423 {
424         ms.os() << s;
425         return ms;
426 }
427
428
429 MathematicaStream & operator<<(MathematicaStream & ms, char c)
430 {
431         ms.os() << c;
432         return ms;
433 }
434
435
436 MathematicaStream & operator<<(MathematicaStream & ms, int i)
437 {
438         ms.os() << i;
439         return ms;
440 }
441
442
443 MathematicaStream & operator<<(MathematicaStream & ms, docstring const & s)
444 {
445         ms.os() << s;
446         return ms;
447 }
448
449
450 MathematicaStream & operator<<(MathematicaStream & ms, char_type c)
451 {
452         ms.os().put(c);
453         return ms;
454 }
455
456
457 //////////////////////////////////////////////////////////////////////
458
459
460 OctaveStream & operator<<(OctaveStream & ns, MathAtom const & at)
461 {
462         at->octave(ns);
463         return ns;
464 }
465
466
467 OctaveStream & operator<<(OctaveStream & ns, MathData const & ar)
468 {
469         octave(ar, ns);
470         return ns;
471 }
472
473
474 OctaveStream & operator<<(OctaveStream & ns, char const * s)
475 {
476         ns.os() << s;
477         return ns;
478 }
479
480
481 OctaveStream & operator<<(OctaveStream & ns, char c)
482 {
483         ns.os() << c;
484         return ns;
485 }
486
487
488 OctaveStream & operator<<(OctaveStream & ns, int i)
489 {
490         ns.os() << i;
491         return ns;
492 }
493
494
495 OctaveStream & operator<<(OctaveStream & ns, docstring const & s)
496 {
497         ns.os() << s;
498         return ns;
499 }
500
501
502 OctaveStream & operator<<(OctaveStream & ns, char_type c)
503 {
504         ns.os().put(c);
505         return ns;
506 }
507
508
509 OctaveStream & operator<<(OctaveStream & os, string const & s)
510 {
511         os.os() << from_utf8(s);
512         return os;
513 }
514
515
516 } // namespace lyx