On Wed, Sep 11, 2002 at 04:47:39PM +0200, Jean-Marc Lasgouttes wrote: > Andre> Just commit. Looks ok. > > Done. Is there something to do with 1.3.0cvs?
It seems to work for all cases I tried except for spaces nested in { }. Either {} or simple spaces work. I think the attached patch may fix all problems. Not thoroughly tested, though. Andre' -- Those who desire to give up Freedom in order to gain Security, will not have, nor do they deserve, either one. (T. Jefferson)
? tmp.diff ? 1.diff ? haveit ? script.diff ? all ? rmcopyright.sh ? shared_ptr.diff Index: math_inset.h =================================================================== RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/mathed/math_inset.h,v retrieving revision 1.146 diff -u -p -r1.146 math_inset.h --- math_inset.h 11 Sep 2002 09:14:56 -0000 1.146 +++ math_inset.h 27 Sep 2002 16:37:07 -0000 @@ -227,7 +227,7 @@ public: /// is the a relational operator (used for splitting equations) virtual bool isRelOp() const { return false; } /// -1: text mode, 1: math mode, 0 undecided - enum mode_type {UNDECIDED_MODE, TEXT_MODE, MATH_MODE, VERBATIM_MODE}; + enum mode_type {UNDECIDED_MODE, TEXT_MODE, MATH_MODE}; /// Dispatch result codes, see inset/inset.h enum result_type { UNDISPATCHED = 0, DISPATCHED, DISPATCHED_NOUPDATE, Index: math_parser.C =================================================================== RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/mathed/math_parser.C,v retrieving revision 1.251 diff -u -p -r1.251 math_parser.C --- math_parser.C 30 Aug 2002 08:36:35 -0000 1.251 +++ math_parser.C 27 Sep 2002 16:37:07 -0000 @@ -92,8 +92,6 @@ MathInset::mode_type asMode(string const return MathInset::MATH_MODE; if (str == "textmode" || str == "forcetext") return MathInset::TEXT_MODE; - if (str == "verbatimmode") - return MathInset::VERBATIM_MODE; return MathInset::UNDECIDED_MODE; } @@ -274,6 +272,10 @@ private: void lex(string const & s); /// bool good() const; + /// + string parse_verbatim_item(); + /// + string parse_verbatim_option(); /// int lineno_; @@ -524,6 +526,41 @@ bool Parser::parse(MathAtom & at) } +string Parser::parse_verbatim_option() +{ + string res; + if (nextToken().character() == '[') { + Token t = getToken(); + for (Token t = getToken(); t.character() != ']' && good(); t = +getToken()) { + if (t.cat() == catBegin) { + putback(); + res += '{' + parse_verbatim_item() + '}'; + } else + res += t.asString(); + } + } + return res; +} + + +string Parser::parse_verbatim_item() +{ + string res; + if (nextToken().cat() == catBegin) { + Token t = getToken(); + for (Token t = getToken(); t.cat() != catEnd && good(); t = +getToken()) { + if (t.cat() == catBegin) { + putback(); + res += '{' + parse_verbatim_item() + '}'; + } + else + res += t.asString(); + } + } + return res; +} + + MathArray Parser::parse(unsigned flags, mode_type mode) { MathArray ar; @@ -694,32 +731,28 @@ void Parser::parse1(MathGridInset & grid } else if (t.cat() == catSuper || t.cat() == catSub) { - if (mode == MathInset::VERBATIM_MODE) - cell->push_back(MathAtom(new MathStringInset(t.asString()))); - else { - bool up = (t.cat() == catSuper); - // we need no new script inset if the last thing was a scriptinset, - // which has that script already not the same script already - if (!cell->size()) - cell->push_back(MathAtom(new MathScriptInset(up))); - else if (cell->back()->asScriptInset() && - !cell->back()->asScriptInset()->has(up)) - cell->back().nucleus()->asScriptInset()->ensure(up); - else if (cell->back()->asScriptInset()) - cell->push_back(MathAtom(new MathScriptInset(up))); - else - cell->back() = MathAtom(new MathScriptInset(cell->back(), up)); - MathScriptInset * p = cell->back().nucleus()->asScriptInset(); - // special handling of {}-bases - // is this always correct? - if (p->nuc().size() == 1 && p->nuc().back()->asNestInset() && - p->nuc().back()->extraBraces()) - p->nuc() = p->nuc().back()->asNestInset()->cell(0); - parse(p->cell(up), FLAG_ITEM, mode); - if (limits) { - p->limits(limits); - limits = 0; - } + bool up = (t.cat() == catSuper); + // we need no new script inset if the last thing was a +scriptinset, + // which has that script already not the same script already + if (!cell->size()) + cell->push_back(MathAtom(new MathScriptInset(up))); + else if (cell->back()->asScriptInset() && + !cell->back()->asScriptInset()->has(up)) + cell->back().nucleus()->asScriptInset()->ensure(up); + else if (cell->back()->asScriptInset()) + cell->push_back(MathAtom(new MathScriptInset(up))); + else + cell->back() = MathAtom(new +MathScriptInset(cell->back(), up)); + MathScriptInset * p = cell->back().nucleus()->asScriptInset(); + // special handling of {}-bases + // is this always correct? + if (p->nuc().size() == 1 && p->nuc().back()->asNestInset() && + p->nuc().back()->extraBraces()) + p->nuc() = p->nuc().back()->asNestInset()->cell(0); + parse(p->cell(up), FLAG_ITEM, mode); + if (limits) { + p->limits(limits); + limits = 0; } } @@ -950,10 +983,8 @@ void Parser::parse1(MathGridInset & grid string const name = getArg('{', '}'); if (name == "array" || name == "subarray") { - string const valign = - asString(parse(FLAG_OPTION, MathInset::VERBATIM_MODE)) + 'c'; - string const halign = - asString(parse(FLAG_ITEM, MathInset::VERBATIM_MODE)); + string const valign = parse_verbatim_option() + 'c'; + string const halign = parse_verbatim_item(); cell->push_back(MathAtom(new MathArrayInset(name, valign[0], halign))); parse2(cell->back(), FLAG_END, mode, false); } @@ -1050,12 +1081,12 @@ void Parser::parse1(MathGridInset & grid } else if (t.cs() == "label") { - MathArray ar = parse(FLAG_ITEM, MathInset::VERBATIM_MODE); + string label = parse_verbatim_item(); if (grid.asHullInset()) { - grid.asHullInset()->label(cellrow, asString(ar)); + grid.asHullInset()->label(cellrow, label); } else { cell->push_back(createMathInset(t.cs())); - cell->push_back(MathAtom(new MathBraceInset(ar))); + cell->push_back(MathAtom(new +MathBraceInset(asArray(label)))); } } @@ -1132,14 +1163,12 @@ void Parser::parse1(MathGridInset & grid else if (l->inset == "parbox") { // read optional positioning and width - MathArray pos, width; - parse(pos, FLAG_OPTION, MathInset::VERBATIM_MODE); - - parse(width, FLAG_ITEM, MathInset::VERBATIM_MODE); + string pos = parse_verbatim_option(); + string width = parse_verbatim_item(); cell->push_back(createMathInset(t.cs())); parse(cell->back().nucleus()->cell(0), FLAG_ITEM, MathInset::TEXT_MODE); - cell->back().nucleus()->asParboxInset()->setPosition(asString(pos)); - cell->back().nucleus()->asParboxInset()->setWidth(asString(width)); + +cell->back().nucleus()->asParboxInset()->setPosition(pos); + +cell->back().nucleus()->asParboxInset()->setWidth(width); } else {