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"
15 #include "MathFactory.h"
17 #include "MathExtern.h"
21 #include "support/docstring.h"
22 #include "support/RefChanger.h"
23 #include "support/textutils.h"
34 //////////////////////////////////////////////////////////////////////
37 NormalStream & operator<<(NormalStream & ns, MathAtom const & at)
44 NormalStream & operator<<(NormalStream & ns, MathData const & ar)
51 NormalStream & operator<<(NormalStream & ns, docstring const & s)
58 NormalStream & operator<<(NormalStream & ns, const string & s)
60 ns.os() << from_utf8(s);
65 NormalStream & operator<<(NormalStream & ns, char const * s)
72 NormalStream & operator<<(NormalStream & ns, char c)
79 NormalStream & operator<<(NormalStream & ns, int i)
87 /////////////////////////////////////////////////////////////////
90 WriteStream & operator<<(WriteStream & ws, docstring const & s)
92 // Skip leading '\n' if we had already output a newline char
94 (s.length() > 0 && (s[0] != '\n' || ws.canBreakLine())) ? 0 : 1;
96 // Check whether there's something to output
97 if (s.length() <= first)
100 if (ws.pendingBrace()) {
102 ws.pendingBrace(false);
103 ws.pendingSpace(false);
105 } else if (ws.pendingSpace()) {
106 if (isAlphaASCII(s[first]))
108 else if (s[first] == ' ' && ws.textMode())
110 ws.pendingSpace(false);
112 ws.os() << s.substr(first);
114 char_type lastchar = 0;
115 docstring::const_iterator dit = s.begin() + first;
116 docstring::const_iterator end = s.end();
117 for (; dit != end; ++dit) {
119 if (lastchar == '\n')
123 ws.canBreakLine(lastchar != '\n');
128 WriteStream::WriteStream(otexrowstream & os, bool fragile, bool latex,
129 OutputType output, Encoding const * encoding)
130 : os_(os), fragile_(fragile), firstitem_(false), latex_(latex),
131 output_(output), pendingspace_(false), pendingbrace_(false),
132 textmode_(false), locked_(0), ascii_(0), canbreakline_(true),
133 mathsout_(false), ulemcmd_(NONE), line_(0), encoding_(encoding),
134 row_entry_(TexRow::row_none)
138 WriteStream::~WriteStream()
142 else if (pendingspace_)
147 void WriteStream::addlines(unsigned int n)
153 void WriteStream::pendingSpace(bool how)
159 void WriteStream::pendingBrace(bool brace)
161 pendingbrace_ = brace;
165 void WriteStream::textMode(bool textmode)
167 textmode_ = textmode;
171 void WriteStream::lockedMode(bool locked)
177 void WriteStream::asciiOnly(bool ascii)
183 Changer WriteStream::changeRowEntry(TexRow::RowEntry entry)
185 return make_change(row_entry_, entry);
189 bool WriteStream::startOuterRow()
191 if (TexRow::isNone(row_entry_))
193 return texrow().start(row_entry_);
197 WriteStream & operator<<(WriteStream & ws, MathAtom const & at)
204 WriteStream & operator<<(WriteStream & ws, MathData const & ar)
211 WriteStream & operator<<(WriteStream & ws, char const * s)
218 WriteStream & operator<<(WriteStream & ws, char c)
220 if (c == '\n' && !ws.canBreakLine())
223 if (ws.pendingBrace()) {
225 ws.pendingBrace(false);
226 ws.pendingSpace(false);
228 } else if (ws.pendingSpace()) {
231 else if (c == ' ' && ws.textMode())
233 ws.pendingSpace(false);
238 ws.canBreakLine(c != '\n');
243 WriteStream & operator<<(WriteStream & ws, int i)
245 if (ws.pendingBrace()) {
247 ws.pendingBrace(false);
251 ws.canBreakLine(true);
256 WriteStream & operator<<(WriteStream & ws, unsigned int i)
258 if (ws.pendingBrace()) {
260 ws.pendingBrace(false);
264 ws.canBreakLine(true);
269 //////////////////////////////////////////////////////////////////////
272 MathStream::MathStream(odocstream & os)
273 : os_(os), tab_(0), line_(0), in_text_(false)
277 void MathStream::cr()
280 for (int i = 0; i < tab(); ++i)
285 void MathStream::defer(docstring const & s)
291 void MathStream::defer(string const & s)
293 deferred_ << from_utf8(s);
297 docstring MathStream::deferred() const
299 return deferred_.str();
303 MathStream & operator<<(MathStream & ms, MathAtom const & at)
310 MathStream & operator<<(MathStream & ms, MathData const & ar)
317 MathStream & operator<<(MathStream & ms, char const * s)
324 MathStream & operator<<(MathStream & ms, char c)
331 MathStream & operator<<(MathStream & ms, char_type c)
338 MathStream & operator<<(MathStream & ms, MTag const & t)
342 ms.os() << '<' << from_ascii(t.tag_);
343 if (!t.attr_.empty())
344 ms.os() << " " << from_ascii(t.attr_);
350 MathStream & operator<<(MathStream & ms, ETag const & t)
355 ms.os() << "</" << from_ascii(t.tag_) << '>';
360 MathStream & operator<<(MathStream & ms, docstring const & s)
367 //////////////////////////////////////////////////////////////////////
370 HtmlStream::HtmlStream(odocstream & os)
371 : os_(os), tab_(0), line_(0), in_text_(false)
375 void HtmlStream::defer(docstring const & s)
381 void HtmlStream::defer(string const & s)
383 deferred_ << from_utf8(s);
387 docstring HtmlStream::deferred() const
389 return deferred_.str();
393 HtmlStream & operator<<(HtmlStream & ms, MathAtom const & at)
400 HtmlStream & operator<<(HtmlStream & ms, MathData const & ar)
407 HtmlStream & operator<<(HtmlStream & ms, char const * s)
414 HtmlStream & operator<<(HtmlStream & ms, char c)
421 HtmlStream & operator<<(HtmlStream & ms, char_type c)
428 HtmlStream & operator<<(HtmlStream & ms, MTag const & t)
430 ms.os() << '<' << from_ascii(t.tag_);
431 if (!t.attr_.empty())
432 ms.os() << " " << from_ascii(t.attr_);
438 HtmlStream & operator<<(HtmlStream & ms, ETag const & t)
440 ms.os() << "</" << from_ascii(t.tag_) << '>';
445 HtmlStream & operator<<(HtmlStream & ms, docstring const & s)
452 //////////////////////////////////////////////////////////////////////
455 SetMode::SetMode(MathStream & os, bool text)
458 was_text_ = os_.inText();
459 os_.setTextMode(text);
465 os_.setTextMode(was_text_);
469 //////////////////////////////////////////////////////////////////////
472 SetHTMLMode::SetHTMLMode(HtmlStream & os, bool text)
475 was_text_ = os_.inText();
476 os_.setTextMode(text);
480 SetHTMLMode::~SetHTMLMode()
482 os_.setTextMode(was_text_);
486 //////////////////////////////////////////////////////////////////////
489 MapleStream & operator<<(MapleStream & ms, MathAtom const & at)
496 MapleStream & operator<<(MapleStream & ms, MathData const & ar)
503 MapleStream & operator<<(MapleStream & ms, char const * s)
510 MapleStream & operator<<(MapleStream & ms, char c)
517 MapleStream & operator<<(MapleStream & ms, int i)
524 MapleStream & operator<<(MapleStream & ms, char_type c)
531 MapleStream & operator<<(MapleStream & ms, docstring const & s)
538 //////////////////////////////////////////////////////////////////////
541 MaximaStream & operator<<(MaximaStream & ms, MathAtom const & at)
548 MaximaStream & operator<<(MaximaStream & ms, MathData const & ar)
555 MaximaStream & operator<<(MaximaStream & ms, char const * s)
562 MaximaStream & operator<<(MaximaStream & ms, char c)
569 MaximaStream & operator<<(MaximaStream & ms, int i)
576 MaximaStream & operator<<(MaximaStream & ms, docstring const & s)
583 MaximaStream & operator<<(MaximaStream & ms, char_type c)
590 //////////////////////////////////////////////////////////////////////
593 MathematicaStream & operator<<(MathematicaStream & ms, MathAtom const & at)
600 MathematicaStream & operator<<(MathematicaStream & ms, MathData const & ar)
607 MathematicaStream & operator<<(MathematicaStream & ms, char const * s)
614 MathematicaStream & operator<<(MathematicaStream & ms, char c)
621 MathematicaStream & operator<<(MathematicaStream & ms, int i)
628 MathematicaStream & operator<<(MathematicaStream & ms, docstring const & s)
635 MathematicaStream & operator<<(MathematicaStream & ms, char_type c)
642 //////////////////////////////////////////////////////////////////////
645 OctaveStream & operator<<(OctaveStream & ns, MathAtom const & at)
652 OctaveStream & operator<<(OctaveStream & ns, MathData const & ar)
659 OctaveStream & operator<<(OctaveStream & ns, char const * s)
666 OctaveStream & operator<<(OctaveStream & ns, char c)
673 OctaveStream & operator<<(OctaveStream & ns, int i)
680 OctaveStream & operator<<(OctaveStream & ns, docstring const & s)
687 OctaveStream & operator<<(OctaveStream & ns, char_type c)
694 OctaveStream & operator<<(OctaveStream & os, string const & s)
696 os.os() << from_utf8(s);
701 docstring convertDelimToXMLEscape(docstring const & name)
703 if (name.size() == 1) {
704 char_type const c = name[0];
706 return from_ascii("<");
708 return from_ascii(">");
712 MathWordList const & words = mathedWordList();
713 MathWordList::const_iterator it = words.find(name);
714 if (it != words.end()) {
715 docstring const escape = it->second.xmlname;
718 LYXERR0("Unable to find `" << name <<"' in the mathWordList.");