From 2e444dd6570804d33c1fd44713dc3b3f15ec9c5c 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. --- src/TextClass.cpp | 11 +++++++---- src/insets/InsetLayout.cpp | 26 +++++++++++++++++++++++--- src/insets/InsetLayout.h | 3 ++- 3 files changed, 32 insertions(+), 8 deletions(-) diff --git a/src/TextClass.cpp b/src/TextClass.cpp index 9f22d6d8a1..4ac03ab31a 100644 --- a/src/TextClass.cpp +++ b/src/TextClass.cpp @@ -745,6 +745,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!"; @@ -753,15 +754,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 b523457c60..dbe290939d 100644 --- a/src/insets/InsetLayout.cpp +++ b/src/insets/InsetLayout.cpp @@ -78,7 +78,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, @@ -216,6 +217,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; @@ -232,13 +235,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; @@ -250,8 +260,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: @@ -378,6 +392,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; } @@ -408,6 +425,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 bed2136c4f..3db9ad1679 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_; } ///