5 #include "math_inset.h"
6 #include "math_charinset.h"
7 #include "math_scriptinset.h"
8 #include "math_stringinset.h"
9 #include "math_mathmlstream.h"
10 #include "math_support.h"
11 #include "math_data.h"
13 #include "support/LAssert.h"
16 MathArray::MathArray()
20 MathArray::MathArray(MathArray const & ar, size_type from, size_type to)
21 : bf_(ar.begin() + from, ar.begin() + to)
25 void MathArray::substitute(MathMacro const & m)
27 for (iterator it = begin(); it != end(); ++it)
28 it->nucleus()->substitute(m);
32 MathScriptInset const * MathArray::asScript(const_iterator it) const
34 if (it->nucleus()->asScriptInset())
36 const_iterator jt = it + 1;
41 return jt->nucleus()->asScriptInset();
45 MathAtom & MathArray::at(size_type pos)
47 lyx::Assert(pos < size());
52 MathAtom const & MathArray::at(size_type pos) const
54 lyx::Assert(pos < size());
59 void MathArray::insert(size_type pos, MathAtom const & t)
61 bf_.insert(begin() + pos, t);
65 void MathArray::insert(size_type pos, MathArray const & ar)
67 bf_.insert(begin() + pos, ar.begin(), ar.end());
71 void MathArray::push_back(MathAtom const & t)
77 void MathArray::push_back(MathArray const & ar)
83 void MathArray::clear()
89 void MathArray::swap(MathArray & ar)
96 bool MathArray::empty() const
102 MathArray::size_type MathArray::size() const
108 void MathArray::erase()
114 void MathArray::erase(size_type pos)
121 void MathArray::erase(size_type pos1, size_type pos2)
123 bf_.erase(begin() + pos1, begin() + pos2);
127 MathAtom & MathArray::back()
133 void MathArray::dump2() const
135 NormalStream ns(lyxerr);
136 for (const_iterator it = begin(); it != end(); ++it)
137 ns << it->nucleus() << ' ';
141 void MathArray::dump() const
143 NormalStream ns(lyxerr);
144 for (const_iterator it = begin(); it != end(); ++it)
145 ns << "<" << it->nucleus() << ">";
149 // returns sequence of char with same code starting at it up to end
150 // it might be less, though...
151 string charSequence(MathArray::const_iterator it, MathArray::const_iterator end)
154 MathCharInset const * p = it->nucleus()->asCharInset();
158 for (MathTextCodes c = p->code(); it != end; ++it) {
161 p = it->nucleus()->asCharInset();
162 if (!p || p->code() != c)
170 MathArray MathArray::glueChars() const
173 const_iterator it = begin();
174 while (it != end()) {
175 if (it->nucleus() && it->nucleus()->asCharInset()) {
176 string s = charSequence(it, end());
177 MathTextCodes c = it->nucleus()->asCharInset()->code();
178 ar.push_back(MathAtom(new MathStringInset(s, c)));
189 bool needAsterisk(MathAtom const &, MathAtom const &)
195 MathArray MathArray::guessAsterisks() const
200 ar.push_back(*begin());
201 for (const_iterator it = begin(), jt = begin()+1 ; jt != end(); ++it, ++jt) {
202 if (needAsterisk(*it, *jt))
203 ar.push_back(MathAtom(new MathCharInset('*')));
206 ar.push_back(*end());
211 void MathArray::write(MathWriteInfo & wi) const
213 MathArray ar = glueChars();
214 for (const_iterator it = ar.begin(); it != ar.end(); ++it) {
215 MathInset const * p = it->nucleus();
216 if (MathScriptInset const * q = ar.asScript(it)) {
226 void MathArray::writeNormal(NormalStream & os) const
228 MathArray ar = glueChars();
229 for (const_iterator it = ar.begin(); it != ar.end(); ++it) {
230 MathInset const * p = it->nucleus();
231 if (MathScriptInset const * q = ar.asScript(it)) {
232 q->writeNormal(p, os);
240 void MathArray::octavize(OctaveStream & os) const
242 MathArray ar = glueChars();
243 for (const_iterator it = ar.begin(); it != ar.end(); ++it) {
244 MathInset const * p = it->nucleus();
245 if (MathScriptInset const * q = ar.asScript(it)) {
254 void MathArray::maplize(MapleStream & os) const
256 MathArray ar = glueChars();
257 for (const_iterator it = ar.begin(); it != ar.end(); ++it) {
258 MathInset const * p = it->nucleus();
259 if (MathScriptInset const * q = ar.asScript(it)) {
268 void MathArray::mathmlize(MathMLStream & os) const
270 MathArray ar = glueChars();
273 else if (ar.size() == 1)
274 os << ar.begin()->nucleus();
277 for (const_iterator it = ar.begin(); it != ar.end(); ++it) {
278 MathInset const * p = it->nucleus();
279 if (MathScriptInset const * q = ar.asScript(it)) {
290 void MathArray::validate(LaTeXFeatures & features) const
292 for (const_iterator it = begin(); it != end(); ++it)
294 it->nucleus()->validate(features);
298 void MathArray::pop_back()
301 lyxerr << "pop_back from empty array!\n";
308 MathArray::const_iterator MathArray::begin() const
314 MathArray::const_iterator MathArray::end() const
320 MathArray::iterator MathArray::begin()
326 MathArray::iterator MathArray::end()
332 bool MathArray::isMatrix() const
334 return size() == 1 && begin()->nucleus() && begin()->nucleus()->isMatrix();