X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Fmathed%2Fmath_extern.C;h=502c640e2d2d236725422e4b5f67f7bedd49e667;hb=e093e5e80c334995a77445c8e66a9f3c9594dda1;hp=1681338fc174ceeda7d209a250d9340dd93b187c;hpb=7ea7dabed1b72cc25dcbdc482ac006f2b61dacfd;p=lyx.git diff --git a/src/mathed/math_extern.C b/src/mathed/math_extern.C index 1681338fc1..502c640e2d 100644 --- a/src/mathed/math_extern.C +++ b/src/mathed/math_extern.C @@ -1,22 +1,22 @@ - // This file contains most of the magic that extracts "context // information" from the unstructered layout-oriented stuff in an // MathArray. #include +#include "math_amsarrayinset.h" #include "math_charinset.h" #include "math_deliminset.h" #include "math_diffinset.h" #include "math_exfuncinset.h" #include "math_exintinset.h" -#include "math_funcinset.h" #include "math_fracinset.h" #include "math_matrixinset.h" #include "math_mathmlstream.h" #include "math_scriptinset.h" #include "math_stringinset.h" #include "math_symbolinset.h" +#include "math_unknowninset.h" #include "Lsstream.h" #include "debug.h" @@ -28,7 +28,7 @@ using std::find_if; ostream & operator<<(ostream & os, MathArray const & ar) { - NormalStream ns(os); + NormalStream ns(os); ns << ar; return os; } @@ -42,7 +42,7 @@ typedef MathInset * ReplaceArgumentFunc(const MathArray & ar); -// try to extract a super/subscript +// try to extract a super/subscript // modify iterator position to point behind the thing bool extractScript(MathArray & ar, MathArray::iterator & pos, MathArray::iterator last) @@ -106,6 +106,8 @@ MathArray::iterator extractArgument(MathArray & ar, MathScriptInset const * asScript(MathArray::const_iterator it) { + if (!it->nucleus()) + return 0; if (it->nucleus()->asScriptInset()) return 0; ++it; @@ -119,16 +121,10 @@ MathScriptInset const * asScript(MathArray::const_iterator it) // returns sequence of char with same code starting at it up to end // it might be less, though... MathArray::const_iterator charSequence(MathArray::const_iterator it, - MathArray::const_iterator end, string & s, MathTextCodes & c) + MathArray::const_iterator end, string & s) { - MathCharInset const * p = (*it)->asCharInset(); - c = p->code(); - for (; it != end; ++it) { - p = (*it)->asCharInset(); - if (!p || p->code() != c) - break; - s += p->getChar(); - } + for (; it != end && (*it)->asCharInset(); ++it) + s += (*it)->getChar(); return it; } @@ -144,7 +140,7 @@ void extractStrings(MathArray & ar) // create proper string inset MathStringInset * p = new MathStringInset; MathArray::const_iterator - jt = charSequence(it, ar.end(), p->str_, p->code_); + jt = charSequence(it, ar.end(), p->str_); // clean up (*it).reset(p); @@ -163,14 +159,23 @@ MathInset * singleItem(MathArray & ar) void extractMatrices(MathArray & ar) { //lyxerr << "\nMatrices from: " << ar << "\n"; + // first pass for explicitly delimited stuff for (MathArray::iterator it = ar.begin(); it != ar.end(); ++it) { MathDelimInset * del = (*it)->asDelimInset(); if (!del) continue; MathInset * arr = singleItem(del->cell(0)); - if (!arr || !arr->asArrayInset()) + if (!arr || !arr->asGridInset()) + continue; + *it = MathAtom(new MathMatrixInset(*(arr->asGridInset()))); + } + + // second pass for AMS "pmatrix" etc + for (MathArray::iterator it = ar.begin(); it != ar.end(); ++it) { + MathAMSArrayInset * ams = (*it)->asAMSArrayInset(); + if (!ams) continue; - *it = MathAtom(new MathMatrixInset(*(arr->asArrayInset()))); + *it = MathAtom(new MathMatrixInset(*ams)); } //lyxerr << "\nMatrices to: " << ar << "\n"; } @@ -197,8 +202,17 @@ bool extractString(MathInset * p, string & str) bool extractNumber(MathArray const & ar, int & i) { string s; - MathTextCodes c; - charSequence(ar.begin(), ar.end(), s, c); + charSequence(ar.begin(), ar.end(), s); + istringstream is(s.c_str()); + is >> i; + return is; +} + + +bool extractNumber(MathArray const & ar, double & i) +{ + string s; + charSequence(ar.begin(), ar.end(), s); istringstream is(s.c_str()); is >> i; return is; @@ -260,13 +274,13 @@ void replaceNested( ar.erase(it + 1, jt + 1); (*it).reset(p); } -} +} // // split scripts into seperate super- and subscript insets. sub goes in -// front of super... +// front of super... // void splitScripts(MathArray & ar) @@ -286,13 +300,13 @@ void splitScripts(MathArray & ar) // create extra script inset and move superscript over MathScriptInset * q = new MathScriptInset; - q->ensure(true); + q->ensure(true); q->up().data_.swap(p->up().data_); p->removeScript(true); // insert new inset behind ++i; - ar.insert(i, MathAtom(q)); + ar.insert(i, MathAtom(q)); } //lyxerr << "\nScripts to: " << ar << "\n"; } @@ -385,10 +399,10 @@ void extractFunctions(MathArray & ar) string name; // is it a function? - if ((*it)->asFuncInset()) { + if ((*it)->asUnknownInset()) { // it certainly is if it is well known... - name = (*it)->asFuncInset()->name(); - } else { + name = (*it)->asUnknownInset()->name(); + } else { // is this a user defined function? // it it probably not, if it doesn't have a name. if (!extractString((*it).nucleus(), name)) @@ -408,7 +422,7 @@ void extractFunctions(MathArray & ar) // 'sin' '^2' 'x' -> 'sin(x)' '^2' MathArray exp; extractScript(exp, jt, ar.end()); - + // create a proper inset as replacement MathExFuncInset * p = new MathExFuncInset(name); @@ -417,7 +431,7 @@ void extractFunctions(MathArray & ar) // replace the function name by a real function inset (*it).reset(p); - + // remove the source of the argument from the array ar.erase(it + 1, st); @@ -425,7 +439,7 @@ void extractFunctions(MathArray & ar) ar.insert(i + 1, exp); //lyxerr << "\nFunctions to: " << ar << "\n"; } -} +} // @@ -480,7 +494,7 @@ void extractIntegrals(MathArray & ar) // collect subscript if any MathArray::iterator st = it + 1; if (st != ar.end()) - if (MathScriptInset * sub = (*st)->asScriptInset()) + if (MathScriptInset * sub = (*st)->asScriptInset()) if (sub->hasDown()) { p->cell(2) = sub->down().data_; ++st; @@ -488,7 +502,7 @@ void extractIntegrals(MathArray & ar) // collect superscript if any if (st != ar.end()) - if (MathScriptInset * sup = (*st)->asScriptInset()) + if (MathScriptInset * sup = (*st)->asScriptInset()) if (sup->hasUp()) { p->cell(3) = sup->up().data_; ++st; @@ -499,7 +513,7 @@ void extractIntegrals(MathArray & ar) // use the "thing" behind the 'd' as differential MathArray::iterator tt = extractArgument(p->cell(1), jt + 1, ar.end()); - + // remove used parts ar.erase(it + 1, tt); (*it).reset(p); @@ -632,7 +646,7 @@ void extractDiff(MathArray & ar) // is this a "differential fraction"? if (!testDiffFrac(it->nucleus())) continue; - + MathFracInset * f = (*it)->asFracInset(); if (!f) { lyxerr << "should not happen\n"; @@ -643,20 +657,20 @@ void extractDiff(MathArray & ar) MathDiffInset * diff = new MathDiffInset; // collect function, let jt point behind last used item - MathArray::iterator jt = it + 1; - //int n = 1; + MathArray::iterator jt = it + 1; + //int n = 1; MathArray & numer = f->cell(0); if (numer.size() > 1 && numer.at(1)->asScriptInset()) { // this is something like d^n f(x) / d... or d^n / d... // FIXME - //n = 1; - if (numer.size() > 2) + //n = 1; + if (numer.size() > 2) diff->cell(0) = MathArray(numer.begin() + 2, numer.end()); else jt = extractArgument(diff->cell(0), jt, ar.end()); } else { // simply d f(x) / d... or d/d... - if (numer.size() > 1) + if (numer.size() > 1) diff->cell(0) = MathArray(numer.begin() + 1, numer.end()); else jt = extractArgument(diff->cell(0), jt, ar.end()); @@ -725,7 +739,7 @@ void write(MathArray const & dat, WriteStream & wi) q->write2(p, wi); ++it; continue; - } + } } p->write(wi); } @@ -748,7 +762,7 @@ void octavize(MathArray const & dat, OctaveStream & os) if (it + 1 != ar.end()) { if (MathScriptInset const * q = asScript(it)) { q->octavize2(p, os); - ++it; + ++it; continue; } } @@ -766,7 +780,7 @@ void maplize(MathArray const & dat, MapleStream & os) if (it + 1 != ar.end()) { if (MathScriptInset const * q = asScript(it)) { q->maplize2(p, os); - ++it; + ++it; continue; } } @@ -790,7 +804,7 @@ void mathmlize(MathArray const & dat, MathMLStream & os) if (it + 1 != ar.end()) { if (MathScriptInset const * q = asScript(it)) { q->mathmlize2(p, os); - ++it; + ++it; continue; } } @@ -799,4 +813,3 @@ void mathmlize(MathArray const & dat, MathMLStream & os) os << ETag("mrow"); } } -