Fix problem with validation when using InsetLayout.

(cherry picked from commit 2e444dd657)
This commit is contained in:
Richard Kimberly Heck 2020-02-26 22:18:58 -05:00
parent 20996d46fc
commit 2ece10f327
4 changed files with 33 additions and 8 deletions

View File

@ -731,6 +731,7 @@ TextClass::ReturnValues TextClass::read(Lexer & lexrc, ReadType rt)
break;
}
docstring const name = subst(lexrc.getDocString(), '_', ' ');
bool const validating = (rt == VALIDATION);
if (name.empty()) {
string s = "Could not read name for InsetLayout: `$$Token' "
+ lexrc.getString() + " is probably not valid UTF-8!";
@ -739,15 +740,17 @@ TextClass::ReturnValues TextClass::read(Lexer & lexrc, ReadType rt)
// Since we couldn't read the name, we just scan the rest
// of the style and discard it.
il.read(lexrc, *this);
// Let's try to continue rather than abort.
// error = true;
// Let's try to continue rather than abort, unless we're validating
// in which case we want to report the error
if (validating)
error = true;
} else if (hasInsetLayout(name)) {
InsetLayout & il = insetlayoutlist_[name];
error = !il.read(lexrc, *this);
error = !il.read(lexrc, *this, validating);
} else {
InsetLayout il;
il.setName(name);
error = !il.read(lexrc, *this);
error = !il.read(lexrc, *this, validating);
if (!error)
insetlayoutlist_[name] = il;
}

View File

@ -77,7 +77,8 @@ InsetLayout::InsetLaTeXType translateLaTeXType(std::string const & str)
} // namespace
bool InsetLayout::read(Lexer & lex, TextClass const & tclass)
bool InsetLayout::read(Lexer & lex, TextClass const & tclass,
bool validating)
{
enum {
IL_ADDTOTOC,
@ -203,6 +204,8 @@ bool InsetLayout::read(Lexer & lex, TextClass const & tclass)
switch (le) {
case Lexer::LEX_UNDEF:
lex.printError("Unknown InsetLayout tag");
if (validating)
return false;
continue;
default:
break;
@ -219,13 +222,20 @@ bool InsetLayout::read(Lexer & lex, TextClass const & tclass)
LYXERR0("Flex insets must have names of the form `Flex:<name>'.\n"
"This one has the name `" << to_utf8(name_) << "'\n"
"Ignoring LyXType declaration.");
// this is not really a reason to abort
if (validating)
return false;
break;
}
string lt;
lex >> lt;
lyxtype_ = translateLyXType(lt);
if (lyxtype_ == NOLYXTYPE)
if (lyxtype_ == NOLYXTYPE) {
LYXERR0("Unknown LyXType `" << lt << "'.");
// this is not really a reason to abort
if (validating)
return false;
}
if (lyxtype_ == CHARSTYLE) {
// by default, charstyles force the plain layout
multipar_ = false;
@ -237,8 +247,12 @@ bool InsetLayout::read(Lexer & lex, TextClass const & tclass)
string lt;
lex >> lt;
latextype_ = translateLaTeXType(lt);
if (latextype_ == ILT_ERROR)
if (latextype_ == ILT_ERROR) {
LYXERR0("Unknown LaTeXType `" << lt << "'.");
// this is not really a reason to abort
if (validating)
return false;
}
break;
}
case IL_LABELSTRING:
@ -350,6 +364,9 @@ bool InsetLayout::read(Lexer & lex, TextClass const & tclass)
tclass.insetLayouts().end();
for (; lit != len; ++lit)
lyxerr << lit->second.name() << "\n";
// this is not really a reason to abort
if (validating)
return false;
}
break;
}
@ -380,6 +397,9 @@ bool InsetLayout::read(Lexer & lex, TextClass const & tclass)
tclass.insetLayouts().end();
for (; lit != len; ++lit)
lyxerr << lit->second.name() << "\n";
// this is not really a reason to abort
if (validating)
return false;
}
break;
}

View File

@ -56,7 +56,8 @@ public:
ILT_ERROR
};
///
bool read(Lexer & lexrc, TextClass const & tclass);
bool read(Lexer & lexrc, TextClass const & tclass,
bool validating = false);
///
docstring name() const { return name_; }
///

View File

@ -68,6 +68,7 @@ What's new
- Fix a crash reported on lyx users.
There was an uninitialized buffer member of MathData in LFUN dispatch.
- Fix problem with validation of InsetLayout.
* INTERNALS