#include "InsetMathEnv.h"
#include "InsetMathFrac.h"
#include "InsetMathKern.h"
-#include "MathMacro.h"
+#include "InsetMathMacro.h"
#include "InsetMathPar.h"
#include "InsetMathRef.h"
#include "InsetMathRoot.h"
#include "InsetMathStackrel.h"
#include "InsetMathString.h"
#include "InsetMathTabular.h"
-#include "MathMacroTemplate.h"
+#include "InsetMathMacroTemplate.h"
#include "MathExtern.h"
#include "MathFactory.h"
-#include "MathMacroArgument.h"
+#include "InsetMathMacroArgument.h"
#include "MathSupport.h"
#include "Buffer.h"
#include "support/convert.h"
#include "support/debug.h"
#include "support/docstream.h"
-#include "support/unique_ptr.h"
#include <sstream>
/*!
* 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()) {
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()) {
*/
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
{
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;
os << '\\' << to_utf8(cs);
}
else if (t.cat() == catLetter)
- os << t.character();
+ os << static_cast<uint32_t>(t.character());
else
- os << '[' << t.character() << ',' << t.cat() << ']';
+ os << '[' << static_cast<uint32_t>(t.character()) << ',' << t.cat() << ']';
return os;
}
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);
skipSpaces();
docstring res;
if (nextToken().character() == '[') {
- Token t = getToken();
+ // eat [
+ getToken();
for (Token t = getToken(); t.character() != ']' && good(); t = getToken()) {
if (t.cat() == catBegin) {
putback();
skipSpaces();
docstring res;
if (nextToken().cat() == catBegin) {
- Token t = getToken();
+ // eat catBegin
+ getToken();
for (Token t = getToken(); t.cat() != catEnd && good(); t = getToken()) {
if (t.cat() == catBegin) {
putback();
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_;
Token const & n = nextToken();
char_type c = n.character();
if (c && '0' < c && c <= '9') {
- cell->push_back(MathAtom(new MathMacroArgument(c - '0')));
+ cell->push_back(MathAtom(new InsetMathMacroArgument(c - '0')));
getToken();
} else
cell->push_back(MathAtom(new InsetMathHash()));
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)) {
else if (t.cat() == catOther) {
char_type c = t.character();
- if (isAsciiOrMathAlpha(c)
+ if (!Encodings::isUnicodeTextOnly(c)
|| mode_ & Parse::VERBATIM
|| !(mode_ & Parse::USETEXT)
|| mode == InsetMath::TEXT_MODE) {
MathAtom at = createInsetMath("text", buf);
at.nucleus()->cell(0).push_back(MathAtom(new InsetMathChar(c)));
while (nextToken().cat() == catOther
- && !isAsciiOrMathAlpha(nextToken().character())) {
+ && Encodings::isUnicodeTextOnly(nextToken().character())) {
c = getToken().character();
at.nucleus()->cell(0).push_back(MathAtom(new InsetMathChar(c)));
}
else if (t.cat() == catComment) {
docstring s;
while (good()) {
- Token const & t = getToken();
- if (t.cat() == catNewline)
+ Token const & tt = getToken();
+ if (tt.cat() == catNewline)
break;
- s += t.asInput();
+ s += tt.asInput();
}
cell->push_back(MathAtom(new InsetMathComment(buf, s)));
skipSpaces();
if (nextToken().cat() == catBegin)
parse(display, FLAG_ITEM, InsetMath::MATH_MODE);
- cell->push_back(MathAtom(new MathMacroTemplate(buf,
+ cell->push_back(MathAtom(new InsetMathMacroTemplate(buf,
name, nargs, 0, MacroTypeDef,
vector<MathData>(), def, display)));
if (nextToken().cat() == catBegin)
parse(display, FLAG_ITEM, InsetMath::MATH_MODE);
- cell->push_back(MathAtom(new MathMacroTemplate(buf,
+ cell->push_back(MathAtom(new InsetMathMacroTemplate(buf,
name, nargs, optionals, MacroTypeNewcommand,
optionalValues, def, display)));
if (nextToken().cat() == catBegin)
parse(display, FLAG_ITEM, InsetMath::MATH_MODE);
- cell->push_back(MathAtom(new MathMacroTemplate(buf,
+ cell->push_back(MathAtom(new InsetMathMacroTemplate(buf,
name, nargs, optionals, MacroTypeNewcommandx,
optionalValues, def, display)));
// 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
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);
} else {
- MathAtom at = MathAtom(new MathMacro(buf, t.cs()));
+ MathAtom at = MathAtom(new InsetMathMacro(buf, t.cs()));
cell->push_back(at);
cell->push_back(MathAtom(new InsetMathBrace(count)));
}
}
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);
grid.asHullInset()->numbered(cellrow, true);
else if (t.cs() == "hline") {
- grid.rowinfo(cellrow).lines_ ++;
+ grid.rowinfo(cellrow).lines++;
}
else if (t.cs() == "sqrt") {
parse(ar, FLAG_OPTION, mode);
if (!ar.empty()) {
cell->push_back(MathAtom(new InsetMathRoot(buf)));
- cell->back().nucleus()->cell(0) = ar;
- parse(cell->back().nucleus()->cell(1), FLAG_ITEM, mode);
- } else {
+ cell->back().nucleus()->cell(1) = ar;
+ } else
cell->push_back(MathAtom(new InsetMathSqrt(buf)));
- parse(cell->back().nucleus()->cell(0), FLAG_ITEM, mode);
- }
+ parse(cell->back().nucleus()->cell(0), FLAG_ITEM, mode);
}
else if (t.cs() == "cancelto") {
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())
cell->push_back(MathAtom(new InsetMathStackrel(buf, !ar.empty())));
if (!ar.empty())
cell->back().nucleus()->cell(2) = ar;
- parse(cell->back().nucleus()->cell(0), FLAG_ITEM, mode);
parse(cell->back().nucleus()->cell(1), FLAG_ITEM, mode);
+ parse(cell->back().nucleus()->cell(0), FLAG_ITEM, mode);
}
else if (t.cs() == "xrightarrow" || t.cs() == "xleftarrow") {
}
else if (t.cs() == "ref" || t.cs() == "eqref" || t.cs() == "prettyref"
- || t.cs() == "pageref" || t.cs() == "vpageref" || t.cs() == "vref") {
+ || t.cs() == "nameref" || t.cs() == "pageref"
+ || 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();
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") {
docstring s;
int num_tokens = 0;
while (true) {
- Token const & t = getToken();
+ Token const & tt = getToken();
++num_tokens;
if (!good()) {
s.clear();
putback();
break;
}
- s += t.character();
+ s += tt.character();
if (isValidLength(to_utf8(s)))
break;
}
if (s.empty())
- cell->push_back(MathAtom(new MathMacro(buf, t.cs())));
+ cell->push_back(MathAtom(new InsetMathMacro(buf, t.cs())));
else
cell->push_back(MathAtom(new InsetMathKern(s)));
}
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)));
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")
else {
// Since the Length class cannot use length variables
// we must not create an InsetMathSpace.
- cell->push_back(MathAtom(new MathMacro(buf, name)));
+ cell->push_back(MathAtom(new InsetMathMacro(buf, name)));
MathData ar;
mathed_parse_cell(ar, '{' + arg + '}', mode_);
cell->append(ar);
parse(cell->back().nucleus()->cell(0), FLAG_ITEM, mode);
} else {
docstring const arg = parse_verbatim_item();
- cell->push_back(MathAtom(new MathMacro(buf, t.cs())));
+ cell->push_back(MathAtom(new InsetMathMacro(buf, t.cs())));
MathData ar;
mathed_parse_cell(ar, '[' + opt + ']', mode_);
cell->append(ar);
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)));
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));
new InsetMathBig(t.cs(), delim)));
else {
cell->push_back(createInsetMath(t.cs(), buf));
- putback();
+ // For some reason delim.empty()
+ // is always false here
+ if (delim.at(0))
+ putback();
}
}
putback();
}
+ else if (l->inset == "underset" || l->inset == "overset") {
+ cell->push_back(createInsetMath(t.cs(), buf));
+ parse(cell->back().nucleus()->cell(1), FLAG_ITEM, mode);
+ parse(cell->back().nucleus()->cell(0), FLAG_ITEM, mode);
+ }
+
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);
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;
}
}
}
}
if (!is_unicode_symbol) {
MathAtom at = is_user_macro ?
- MathAtom(new MathMacro(buf, t.cs()))
+ MathAtom(new InsetMathMacro(buf, t.cs()))
: createInsetMath(t.cs(), buf);
InsetMath::mode_type m = mode;
//if (m == InsetMath::UNDECIDED_MODE)
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);
// 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();
if (flags & FLAG_LEAVE) {
- flags &= ~FLAG_LEAVE;
break;
}
}
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);
}
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);
}