X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Fmathed%2FMathParser.cpp;h=1958900e3d2f0155e64609f5fa1ab3273b59bd3b;hb=4ed0312c51704780af1c452d3a82a84171b3725a;hp=8539ab66194dd9121d983c642ef207dfd664defa;hpb=60ac25a435a7dfbbee62530e793be65c62c44b0d;p=lyx.git diff --git a/src/mathed/MathParser.cpp b/src/mathed/MathParser.cpp index 8539ab6619..1958900e3d 100644 --- a/src/mathed/MathParser.cpp +++ b/src/mathed/MathParser.cpp @@ -77,7 +77,6 @@ following hack as starting point to write some macros: #include "support/convert.h" #include "support/debug.h" #include "support/docstream.h" -#include "support/unique_ptr.h" #include @@ -158,11 +157,11 @@ docstring escapeSpecialChars(docstring const & str, bool textmode) /*! * Add the row \p cellrow to \p grid. - * \returns wether the row could be added. Adding a row can fail for + * \returns whether the row could be added. Adding a row can fail for * environments like "equation" that have a fixed number of rows. */ -bool addRow(InsetMathGrid & grid, InsetMathGrid::row_type & cellrow, - docstring const & vskip, bool allow_newpage_ = true) +bool addRow(InsetMathGrid & grid, row_type & cellrow, + docstring const & vskip, bool allow_newpage = true) { ++cellrow; if (cellrow == grid.nrows()) { @@ -179,24 +178,24 @@ bool addRow(InsetMathGrid & grid, InsetMathGrid::row_type & cellrow, lyxerr << "ignoring extra row"; if (!vskip.empty()) lyxerr << " with extra space " << to_utf8(vskip); - if (!allow_newpage_) + if (!allow_newpage) lyxerr << " with no page break allowed"; lyxerr << '.' << endl; return false; } } grid.vcrskip(Length(to_utf8(vskip)), cellrow - 1); - grid.rowinfo(cellrow - 1).allow_newpage_ = allow_newpage_; + grid.rowinfo(cellrow - 1).allow_newpage = allow_newpage; return true; } /*! * Add the column \p cellcol to \p grid. - * \returns wether the column could be added. Adding a column can fail for + * \returns whether the column could be added. Adding a column can fail for * environments like "eqnarray" that have a fixed number of columns. */ -bool addCol(InsetMathGrid & grid, InsetMathGrid::col_type & cellcol) +bool addCol(InsetMathGrid & grid, col_type & cellcol) { ++cellcol; if (cellcol == grid.ncols()) { @@ -237,11 +236,11 @@ bool addCol(InsetMathGrid & grid, InsetMathGrid::col_type & cellcol) */ void delEmptyLastRow(InsetMathGrid & grid) { - InsetMathGrid::row_type const row = grid.nrows() - 1; - for (InsetMathGrid::col_type col = 0; col < grid.ncols(); ++col) { - InsetMathGrid::idx_type const idx = grid.index(row, col); + row_type const row = grid.nrows() - 1; + for (col_type col = 0; col < grid.ncols(); ++col) { + idx_type const idx = grid.index(row, col); if (!grid.cell(idx).empty() || - grid.cellinfo(idx).multi_ != InsetMathGrid::CELL_NORMAL) + grid.cellinfo(idx).multi != InsetMathGrid::CELL_NORMAL) return; } // Copy the row information of the empty row (which would contain the @@ -360,7 +359,7 @@ ostream & operator<<(ostream & os, Token const & t) { if (!t.cs().empty()) { docstring const & cs = t.cs(); - // FIXME: For some strange reason, the stream operator instanciate + // FIXME: For some strange reason, the stream operator instantiate // a new Token before outputting the contents of t.cs(). // Because of this the line // os << '\\' << cs; @@ -371,9 +370,9 @@ ostream & operator<<(ostream & os, Token const & t) os << '\\' << to_utf8(cs); } else if (t.cat() == catLetter) - os << t.character(); + os << static_cast(t.character()); else - os << '[' << t.character() << ',' << t.cat() << ']'; + os << '[' << static_cast(t.character()) << ',' << t.cat() << ']'; return os; } @@ -622,7 +621,7 @@ void Parser::tokenize(istream & is) void Parser::tokenize(docstring const & buffer) { - idocstringstream is(mode_ & Parse::VERBATIM + idocstringstream is((mode_ & Parse::VERBATIM) ? escapeSpecialChars(buffer, mode_ & Parse::TEXTMODE) : buffer, ios::in | ios::binary); @@ -744,8 +743,9 @@ docstring Parser::parse_verbatim_option() skipSpaces(); docstring res; if (nextToken().character() == '[') { - Token t = getToken(); - for (t = getToken(); t.character() != ']' && good(); t = getToken()) { + // eat [ + getToken(); + for (Token t = getToken(); t.character() != ']' && good(); t = getToken()) { if (t.cat() == catBegin) { putback(); res += '{' + parse_verbatim_item() + '}'; @@ -762,8 +762,9 @@ docstring Parser::parse_verbatim_item() skipSpaces(); docstring res; if (nextToken().cat() == catBegin) { - Token t = getToken(); - for (t = getToken(); t.cat() != catEnd && good(); t = getToken()) { + // eat catBegin + getToken(); + for (Token t = getToken(); t.cat() != catEnd && good(); t = getToken()) { if (t.cat() == catBegin) { putback(); res += '{' + parse_verbatim_item() + '}'; @@ -795,9 +796,8 @@ void Parser::parse2(MathAtom & at, const unsigned flags, const mode_type mode, bool Parser::parse1(InsetMathGrid & grid, unsigned flags, const mode_type mode, const bool numbered) { - int limits = 0; - InsetMathGrid::row_type cellrow = 0; - InsetMathGrid::col_type cellcol = 0; + row_type cellrow = 0; + col_type cellcol = 0; MathData * cell = &grid.cell(grid.index(cellrow, cellcol)); Buffer * buf = buffer_; @@ -942,27 +942,11 @@ bool Parser::parse1(InsetMathGrid & grid, unsigned flags, cell->push_back(MathAtom(new InsetMathSpace(string(1, t.character()), ""))); else if (t.cat() == catBegin) { - bool const inbraces = nextToken().cat() == catBegin || - (!cell->empty() && cell->back()->asMacro()); MathData ar; parse(ar, FLAG_BRACE_LAST, mode); // do not create a BraceInset if they were written by LyX // this helps to keep the annoyance of "a choose b" to a minimum - InsetMathMacro const * ma = !inbraces && ar.size() ? ar[0]->asMacro() : 0; - InsetMathChar const * mc = ma && ar.size() > 1 ? ar[1]->asCharInset(): 0; - bool braced = mc && mc->getChar() == '['; - // If this is a macro, it may have optional - // arguments, even if only defaults are used. - // In this case, there is no following '['. - if (!inbraces && !braced && ma && buf) { - if (mode_ & Parse::TRACKMACRO) - braced = buf->usermacros_with_opts.count(ma->name()); - else { - MacroData const * md = buf->getMacro(ma->name(), false); - braced = md && md->optionals(); - } - } - if ((ar.size() == 1 && ar[0]->extraBraces()) || braced) + if (ar.size() == 1 && ar[0]->extraBraces()) cell->append(ar); else cell->push_back(MathAtom(new InsetMathBrace(ar))); @@ -1020,10 +1004,6 @@ bool Parser::parse1(InsetMathGrid & grid, unsigned flags, p->nuc().erase(0); parse(p->cell(p->idxOfScript(up)), FLAG_ITEM, mode); - if (limits) { - p->limits(limits); - limits = 0; - } } else if (t.character() == ']' && (flags & FLAG_BRACK_LAST)) { @@ -1150,11 +1130,8 @@ bool Parser::parse1(InsetMathGrid & grid, unsigned flags, name, nargs, optionals, MacroTypeNewcommand, optionalValues, def, display))); - if (buf && (mode_ & Parse::TRACKMACRO)) { + if (buf && (mode_ & Parse::TRACKMACRO)) buf->usermacros.insert(name); - if (optionals) - buf->usermacros_with_opts.insert(name); - } } else if (t.cs() == "newcommandx" || @@ -1274,11 +1251,8 @@ bool Parser::parse1(InsetMathGrid & grid, unsigned flags, name, nargs, optionals, MacroTypeNewcommandx, optionalValues, def, display))); - if (buf && (mode_ & Parse::TRACKMACRO)) { + if (buf && (mode_ & Parse::TRACKMACRO)) buf->usermacros.insert(name); - if (optionals) - buf->usermacros_with_opts.insert(name); - } } else if (t.cs() == "(") { @@ -1395,7 +1369,7 @@ bool Parser::parse1(InsetMathGrid & grid, unsigned flags, // otherwise parse it as an user macro MathData count; parse(count, FLAG_ITEM, mode); - int cols; + int cols = 0; // limit arbitrarily to 100 columns if (extractNumber(count, cols) && cols > 0 && cols < 100) { // resize the table if necessary @@ -1403,20 +1377,20 @@ bool Parser::parse1(InsetMathGrid & grid, unsigned flags, for (int i = 1; i < cols; ++i) { if (addCol(grid, cellcol)) { size_t const idx = grid.index(cellrow, cellcol); - grid.cellinfo(idx).multi_ = + grid.cellinfo(idx).multi = InsetMathGrid::CELL_PART_OF_MULTICOLUMN; } } // the first cell is the real thing, not a dummy cell = &grid.cell(first); - grid.cellinfo(first).multi_ = + grid.cellinfo(first).multi = InsetMathGrid::CELL_BEGIN_OF_MULTICOLUMN; // read special alignment MathData align; parse(align, FLAG_ITEM, mode); - grid.cellinfo(first).align_ = asString(align); + grid.cellinfo(first).align = asString(align); // parse the remaining contents into the "real" cell parse(*cell, FLAG_ITEM, mode); @@ -1428,9 +1402,8 @@ bool Parser::parse1(InsetMathGrid & grid, unsigned flags, } else if (t.cs() == "limits" || t.cs() == "nolimits") { - CatCode const cat = nextToken().cat(); - if (cat == catSuper || cat == catSub) - limits = t.cs() == "limits" ? 1 : -1; + if (!cell->empty()) + cell->back()->limits(t.cs() == "limits" ? LIMITS : NO_LIMITS); else { MathAtom at = createInsetMath(t.cs(), buf); cell->push_back(at); @@ -1446,7 +1419,7 @@ bool Parser::parse1(InsetMathGrid & grid, unsigned flags, grid.asHullInset()->numbered(cellrow, true); else if (t.cs() == "hline") { - grid.rowinfo(cellrow).lines_ ++; + grid.rowinfo(cellrow).lines++; } else if (t.cs() == "sqrt") { @@ -1523,7 +1496,7 @@ bool Parser::parse1(InsetMathGrid & grid, unsigned flags, if (ar[i].size() == 1) script[i] = ar[i][0].nucleus()->asScriptInset(); } - bool const hasscript[2] = {script[0] ? true : false, script[1] ? true : false}; + bool const hasscript[2] = {script[0] != nullptr, script[1] != nullptr}; cell->push_back(MathAtom(new InsetMathSideset(buf, hasscript[0], hasscript[1]))); if (hasscript[0]) { if (script[0]->hasDown()) @@ -1573,7 +1546,8 @@ bool Parser::parse1(InsetMathGrid & grid, unsigned flags, else if (t.cs() == "ref" || t.cs() == "eqref" || t.cs() == "prettyref" || t.cs() == "nameref" || t.cs() == "pageref" - || t.cs() == "vpageref" || t.cs() == "vref") { + || t.cs() == "vpageref" || t.cs() == "vref" + || t.cs() == "formatted" || t.cs() == "labelonly") { cell->push_back(MathAtom(new InsetMathRef(buf, t.cs()))); docstring const opt = parse_verbatim_option(); docstring const ref = parse_verbatim_item(); @@ -1626,7 +1600,7 @@ bool Parser::parse1(InsetMathGrid & grid, unsigned flags, docstring const halign = parse_verbatim_item(); cell->push_back(MathAtom(new InsetMathArray(buf, name, InsetMathGrid::guessColumns(halign), 1, (char)valign[0], halign))); - parse2(cell->back(), FLAG_END, mode, false); + parse2(cell->back(), FLAG_END, InsetMath::MATH_MODE, false); } else if (name == "tabular") { @@ -1820,7 +1794,6 @@ bool Parser::parse1(InsetMathGrid & grid, unsigned flags, asArray(label, ar); if (grid.asHullInset()) { grid.asHullInset()->label(cellrow, label); - grid.asHullInset()->numbered(cellrow, true); } else { cell->push_back(createInsetMath(t.cs(), buf)); cell->push_back(MathAtom(new InsetMathBrace(ar))); @@ -1908,7 +1881,7 @@ bool Parser::parse1(InsetMathGrid & grid, unsigned flags, bool const prot = nextToken().character() == '*'; if (prot) getToken(); - docstring const name = t.cs(); + docstring const & name = t.cs(); docstring const arg = parse_verbatim_item(); Length length; if (prot && arg == "\\fill") @@ -1988,8 +1961,8 @@ bool Parser::parse1(InsetMathGrid & grid, unsigned flags, cmd = Encodings::fromLaTeXCommand(cmd, Encodings::MATH_CMD | Encodings::TEXT_CMD, termination, rem); - for (size_t i = 0; i < cmd.size(); ++i) - cell->push_back(MathAtom(new InsetMathChar(cmd[i]))); + for (char_type c : cmd) + cell->push_back(MathAtom(new InsetMathChar(c))); if (!rem.empty()) { char_type c = rem[0]; cell->push_back(MathAtom(new InsetMathChar(c))); @@ -2007,7 +1980,7 @@ bool Parser::parse1(InsetMathGrid & grid, unsigned flags, BufferParams::package_off; bool const is_user_macro = no_mhchem || - (buf && (mode_ & Parse::TRACKMACRO + (buf && ((mode_ & Parse::TRACKMACRO) ? buf->usermacros.count(t.cs()) != 0 : buf->getMacro(t.cs(), false) != 0)); @@ -2062,7 +2035,7 @@ bool Parser::parse1(InsetMathGrid & grid, unsigned flags, else { MathAtom at = createInsetMath(t.cs(), buf); - for (InsetMath::idx_type i = 0; i < at->nargs(); ++i) + for (idx_type i = 0; i < at->nargs(); ++i) parse(at.nucleus()->cell(i), FLAG_ITEM, asMode(mode, l->extra)); cell->push_back(at); @@ -2103,19 +2076,17 @@ bool Parser::parse1(InsetMathGrid & grid, unsigned flags, Encodings::MATH_CMD | Encodings::TEXT_CMD, is_combining, termination); } - if (c) { + if (c && buf && buf->params().encoding().encodable(c)) { if (termination) { if (nextToken().cat() == catBegin) { getToken(); if (nextToken().cat() == catEnd) { getToken(); - num_tokens += 2; } else putback(); } else { while (nextToken().cat() == catSpace) { getToken(); - ++num_tokens; } } } @@ -2136,7 +2107,7 @@ bool Parser::parse1(InsetMathGrid & grid, unsigned flags, if (at->currentMode() != InsetMath::UNDECIDED_MODE) m = at->currentMode(); //lyxerr << "default creation: m2: " << m << endl; - InsetMath::idx_type start = 0; + idx_type start = 0; // this fails on \bigg[...\bigg] //MathData opt; //parse(opt, FLAG_OPTION, InsetMath::VERBATIM_MODE); @@ -2144,7 +2115,7 @@ bool Parser::parse1(InsetMathGrid & grid, unsigned flags, // start = 1; // at.nucleus()->cell(0) = opt; //} - for (InsetMath::idx_type i = start; i < at->nargs(); ++i) { + for (idx_type i = start; i < at->nargs(); ++i) { parse(at.nucleus()->cell(i), FLAG_ITEM, m); if (mode == InsetMath::MATH_MODE) skipSpaces(); @@ -2156,7 +2127,6 @@ bool Parser::parse1(InsetMathGrid & grid, unsigned flags, if (flags & FLAG_LEAVE) { - flags &= ~FLAG_LEAVE; break; } } @@ -2179,14 +2149,14 @@ char const * latexkeys::MathMLtype() const bool mathed_parse_cell(MathData & ar, docstring const & str, Parse::flags f) { - return Parser(str, f, ar.buffer()).parse(ar, 0, f & Parse::TEXTMODE ? + return Parser(str, f, ar.buffer()).parse(ar, 0, (f & Parse::TEXTMODE) ? InsetMath::TEXT_MODE : InsetMath::MATH_MODE); } bool mathed_parse_cell(MathData & ar, istream & is, Parse::flags f) { - return Parser(is, f, ar.buffer()).parse(ar, 0, f & Parse::TEXTMODE ? + return Parser(is, f, ar.buffer()).parse(ar, 0, (f & Parse::TEXTMODE) ? InsetMath::TEXT_MODE : InsetMath::MATH_MODE); } @@ -2208,7 +2178,7 @@ bool mathed_parse_normal(Buffer * buf, MathAtom & t, Lexer & lex, bool mathed_parse_normal(InsetMathGrid & grid, docstring const & str, Parse::flags f) { - return Parser(str, f, &grid.buffer()).parse1(grid, 0, f & Parse::TEXTMODE ? + return Parser(str, f, &grid.buffer()).parse1(grid, 0, (f & Parse::TEXTMODE) ? InsetMath::TEXT_MODE : InsetMath::MATH_MODE, false); }