From 2ece10f3278aceff08c1cf1e4513d80792caf55b Mon Sep 17 00:00:00 2001 From: Richard Kimberly Heck Date: Wed, 26 Feb 2020 22:18:58 -0500 Subject: [PATCH] Fix problem with validation when using InsetLayout. (cherry picked from commit 2e444dd6570804d33c1fd44713dc3b3f15ec9c5c) --- src/TextClass.cpp | 11 +++++++---- src/insets/InsetLayout.cpp | 26 +++++++++++++++++++++++--- src/insets/InsetLayout.h | 3 ++- status.23x | 1 + 4 files changed, 33 insertions(+), 8 deletions(-) diff --git a/src/TextClass.cpp b/src/TextClass.cpp index 25965c6762..56a59520ae 100644 --- a/src/TextClass.cpp +++ b/src/TextClass.cpp @@ -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; } diff --git a/src/insets/InsetLayout.cpp b/src/insets/InsetLayout.cpp index 621e784174..1b8d329914 100644 --- a/src/insets/InsetLayout.cpp +++ b/src/insets/InsetLayout.cpp @@ -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:'.\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; } diff --git a/src/insets/InsetLayout.h b/src/insets/InsetLayout.h index c4a12a4018..d21706818b 100644 --- a/src/insets/InsetLayout.h +++ b/src/insets/InsetLayout.h @@ -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_; } /// diff --git a/status.23x b/status.23x index 7b202f9da9..8b96ff406a 100644 --- a/status.23x +++ b/status.23x @@ -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 -- 2.39.5