]> git.lyx.org Git - lyx.git/blob - src/mathed/MathStream.cpp
Micro-optimization.
[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                 else if (s[0] == ' ' && ws.textMode())
97                         ws.os() << '\\';
98                 ws.pendingSpace(false);
99         }
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;
109 }
110
111
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), ascii_(0), line_(0), encoding_(encoding)
117 {}
118
119
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), ascii_(0), line_(0), encoding_(0)
124 {}
125
126
127 WriteStream::~WriteStream()
128 {
129         if (pendingbrace_)
130                 os_ << '}';
131         else if (pendingspace_)
132                 os_ << ' ';
133 }
134
135
136 void WriteStream::addlines(unsigned int n)
137 {
138         line_ += n;
139 }
140
141
142 void WriteStream::pendingSpace(bool how)
143 {
144         pendingspace_ = how;
145 }
146
147
148 void WriteStream::pendingBrace(bool brace)
149 {
150         pendingbrace_ = brace;
151 }
152
153
154 void WriteStream::textMode(bool textmode)
155 {
156         textmode_ = textmode;
157 }
158
159
160 void WriteStream::lockedMode(bool locked)
161 {
162         locked_ = locked;
163 }
164
165
166 void WriteStream::asciiOnly(bool ascii)
167 {
168         ascii_ = ascii;
169 }
170
171
172 WriteStream & operator<<(WriteStream & ws, MathAtom const & at)
173 {
174         at->write(ws);
175         return ws;
176 }
177
178
179 WriteStream & operator<<(WriteStream & ws, MathData const & ar)
180 {
181         write(ar, ws);
182         return ws;
183 }
184
185
186 WriteStream & operator<<(WriteStream & ws, char const * s)
187 {
188         if (ws.pendingBrace()) {
189                 ws.os() << '}';
190                 ws.pendingBrace(false);
191                 ws.pendingSpace(false);
192                 ws.textMode(true);
193         } else if (ws.pendingSpace() && strlen(s) > 0) {
194                 if (isAlphaASCII(s[0]))
195                         ws.os() << ' ';
196                 else if (s[0] == ' ' && ws.textMode())
197                         ws.os() << '\\';
198                 ws.pendingSpace(false);
199         }
200         ws.os() << s;
201         ws.addlines(int(count(s, s + strlen(s), '\n')));
202         return ws;
203 }
204
205
206 WriteStream & operator<<(WriteStream & ws, char c)
207 {
208         if (ws.pendingBrace()) {
209                 ws.os() << '}';
210                 ws.pendingBrace(false);
211                 ws.pendingSpace(false);
212                 ws.textMode(true);
213         } else if (ws.pendingSpace()) {
214                 if (isAlphaASCII(c))
215                         ws.os() << ' ';
216                 else if (c == ' ' && ws.textMode())
217                         ws.os() << '\\';
218                 ws.pendingSpace(false);
219         }
220         ws.os() << c;
221         if (c == '\n')
222                 ws.addlines(1);
223         return ws;
224 }
225
226
227 WriteStream & operator<<(WriteStream & ws, int i)
228 {
229         if (ws.pendingBrace()) {
230                 ws.os() << '}';
231                 ws.pendingBrace(false);
232                 ws.textMode(true);
233         }
234         ws.os() << i;
235         return ws;
236 }
237
238
239 WriteStream & operator<<(WriteStream & ws, unsigned int i)
240 {
241         if (ws.pendingBrace()) {
242                 ws.os() << '}';
243                 ws.pendingBrace(false);
244                 ws.textMode(true);
245         }
246         ws.os() << i;
247         return ws;
248 }
249
250
251 //////////////////////////////////////////////////////////////////////
252
253
254 MathStream::MathStream(odocstream & os)
255         : os_(os), tab_(0), line_(0), lastchar_(0), in_text_(false)
256 {}
257
258
259 void MathStream::cr()
260 {
261         os() << '\n';
262         for (int i = 0; i < tab(); ++i)
263                 os() << ' ';
264 }
265
266
267 void MathStream::defer(docstring const & s)
268 {
269         deferred_ << s;
270 }
271
272
273 void MathStream::defer(string const & s)
274 {
275         deferred_ << from_utf8(s);
276 }
277
278
279 docstring MathStream::deferred() const
280
281         return deferred_.str();
282 }
283
284
285 MathStream & operator<<(MathStream & ms, MathAtom const & at)
286 {
287         at->mathmlize(ms);
288         return ms;
289 }
290
291
292 MathStream & operator<<(MathStream & ms, MathData const & ar)
293 {
294         mathmlize(ar, ms);
295         return ms;
296 }
297
298
299 MathStream & operator<<(MathStream & ms, char const * s)
300 {
301         ms.os() << s;
302         return ms;
303 }
304
305
306 MathStream & operator<<(MathStream & ms, char c)
307 {
308         ms.os() << c;
309         return ms;
310 }
311
312
313 MathStream & operator<<(MathStream & ms, char_type c)
314 {
315         ms.os().put(c);
316         return ms;
317 }
318
319
320 MathStream & operator<<(MathStream & ms, MTag const & t)
321 {
322         ++ms.tab();
323         ms.cr();
324         ms.os() << '<' << from_ascii(t.tag_);
325         if (!t.attr_.empty())
326                 ms.os() << " " << from_ascii(t.attr_);
327         ms << '>';
328         return ms;
329 }
330
331
332 MathStream & operator<<(MathStream & ms, ETag const & t)
333 {
334         ms.cr();
335         if (ms.tab() > 0)
336                 --ms.tab();
337         ms.os() << "</" << from_ascii(t.tag_) << '>';
338         return ms;
339 }
340
341
342 MathStream & operator<<(MathStream & ms, docstring const & s)
343 {
344         ms.os() << s;
345         return ms;
346 }
347
348
349 SetMode::SetMode(MathStream & os, bool text)
350         : os_(os), opened_(false)
351 {
352         init(text, from_ascii(""));
353 }
354
355
356 SetMode::SetMode(MathStream & os, bool text, docstring attrs)
357         : os_(os), opened_(false)
358 {
359         init(text, attrs);
360 }
361
362
363 void SetMode::init(bool text, docstring attrs)
364 {
365         was_text_ = os_.inText();
366         if (was_text_)
367                 os_ << "</mtext>";
368         if (text) {
369                 os_.setTextMode();
370                 os_ << "<mtext";
371                 if (!attrs.empty())
372                         os_ << " " << attrs;
373                 os_ << ">";
374                 opened_ = true;
375         } else {
376                 if (!attrs.empty()) {
377                         os_ << "<mstyle " << attrs << ">";
378                         opened_ = true;
379                 }
380                 os_.setMathMode();
381         }
382 }
383
384
385 SetMode::~SetMode()
386 {
387         if (opened_) {
388                 if (os_.inText())
389                         os_ << "</mtext>";
390                 else
391                         os_ << "</mstyle>";
392         }
393         if (was_text_) {
394                 os_.setTextMode();
395                 os_ << "<mtext>";
396         } else {
397                 os_.setMathMode();
398         }
399 }
400
401
402 //////////////////////////////////////////////////////////////////////
403
404
405 MapleStream & operator<<(MapleStream & ms, MathAtom const & at)
406 {
407         at->maple(ms);
408         return ms;
409 }
410
411
412 MapleStream & operator<<(MapleStream & ms, MathData const & ar)
413 {
414         maple(ar, ms);
415         return ms;
416 }
417
418
419 MapleStream & operator<<(MapleStream & ms, char const * s)
420 {
421         ms.os() << s;
422         return ms;
423 }
424
425
426 MapleStream & operator<<(MapleStream & ms, char c)
427 {
428         ms.os() << c;
429         return ms;
430 }
431
432
433 MapleStream & operator<<(MapleStream & ms, int i)
434 {
435         ms.os() << i;
436         return ms;
437 }
438
439
440 MapleStream & operator<<(MapleStream & ms, char_type c)
441 {
442         ms.os().put(c);
443         return ms;
444 }
445
446
447 MapleStream & operator<<(MapleStream & ms, docstring const & s)
448 {
449         ms.os() << s;
450         return ms;
451 }
452
453
454 //////////////////////////////////////////////////////////////////////
455
456
457 MaximaStream & operator<<(MaximaStream & ms, MathAtom const & at)
458 {
459         at->maxima(ms);
460         return ms;
461 }
462
463
464 MaximaStream & operator<<(MaximaStream & ms, MathData const & ar)
465 {
466         maxima(ar, ms);
467         return ms;
468 }
469
470
471 MaximaStream & operator<<(MaximaStream & ms, char const * s)
472 {
473         ms.os() << s;
474         return ms;
475 }
476
477
478 MaximaStream & operator<<(MaximaStream & ms, char c)
479 {
480         ms.os() << c;
481         return ms;
482 }
483
484
485 MaximaStream & operator<<(MaximaStream & ms, int i)
486 {
487         ms.os() << i;
488         return ms;
489 }
490
491
492 MaximaStream & operator<<(MaximaStream & ms, docstring const & s)
493 {
494         ms.os() << s;
495         return ms;
496 }
497
498
499 MaximaStream & operator<<(MaximaStream & ms, char_type c)
500 {
501         ms.os().put(c);
502         return ms;
503 }
504
505
506 //////////////////////////////////////////////////////////////////////
507
508
509 MathematicaStream & operator<<(MathematicaStream & ms, MathAtom const & at)
510 {
511         at->mathematica(ms);
512         return ms;
513 }
514
515
516 MathematicaStream & operator<<(MathematicaStream & ms, MathData const & ar)
517 {
518         mathematica(ar, ms);
519         return ms;
520 }
521
522
523 MathematicaStream & operator<<(MathematicaStream & ms, char const * s)
524 {
525         ms.os() << s;
526         return ms;
527 }
528
529
530 MathematicaStream & operator<<(MathematicaStream & ms, char c)
531 {
532         ms.os() << c;
533         return ms;
534 }
535
536
537 MathematicaStream & operator<<(MathematicaStream & ms, int i)
538 {
539         ms.os() << i;
540         return ms;
541 }
542
543
544 MathematicaStream & operator<<(MathematicaStream & ms, docstring const & s)
545 {
546         ms.os() << s;
547         return ms;
548 }
549
550
551 MathematicaStream & operator<<(MathematicaStream & ms, char_type c)
552 {
553         ms.os().put(c);
554         return ms;
555 }
556
557
558 //////////////////////////////////////////////////////////////////////
559
560
561 OctaveStream & operator<<(OctaveStream & ns, MathAtom const & at)
562 {
563         at->octave(ns);
564         return ns;
565 }
566
567
568 OctaveStream & operator<<(OctaveStream & ns, MathData const & ar)
569 {
570         octave(ar, ns);
571         return ns;
572 }
573
574
575 OctaveStream & operator<<(OctaveStream & ns, char const * s)
576 {
577         ns.os() << s;
578         return ns;
579 }
580
581
582 OctaveStream & operator<<(OctaveStream & ns, char c)
583 {
584         ns.os() << c;
585         return ns;
586 }
587
588
589 OctaveStream & operator<<(OctaveStream & ns, int i)
590 {
591         ns.os() << i;
592         return ns;
593 }
594
595
596 OctaveStream & operator<<(OctaveStream & ns, docstring const & s)
597 {
598         ns.os() << s;
599         return ns;
600 }
601
602
603 OctaveStream & operator<<(OctaveStream & ns, char_type c)
604 {
605         ns.os().put(c);
606         return ns;
607 }
608
609
610 OctaveStream & operator<<(OctaveStream & os, string const & s)
611 {
612         os.os() << from_utf8(s);
613         return os;
614 }
615
616
617 } // namespace lyx