commit f2af58c5b3296c85769821de0e15524e78c4233a
Author: Juergen Spitzmueller <[email protected]>
Date: Sat Jul 12 11:25:26 2025 +0200
Warn if a local layout has an unknown layout format (rest of #11261)
---
src/BufferParams.cpp | 9 +++++----
src/BufferParams.h | 2 +-
src/TextClass.cpp | 30 +++++++++++++++++++++++++-----
src/TextClass.h | 5 +++--
src/frontends/qt/GuiDocument.cpp | 6 +++---
5 files changed, 37 insertions(+), 15 deletions(-)
diff --git a/src/BufferParams.cpp b/src/BufferParams.cpp
index 8247b8904a..c5aaa27aee 100644
--- a/src/BufferParams.cpp
+++ b/src/BufferParams.cpp
@@ -3182,7 +3182,7 @@ LayoutFileIndex const & BufferParams::baseClassID() const
}
-void BufferParams::makeDocumentClass(bool clone, bool internal)
+void BufferParams::makeDocumentClass(bool clone, bool internal, bool fromgui)
{
if (!baseClass())
return;
@@ -3197,11 +3197,12 @@ void BufferParams::makeDocumentClass(bool clone, bool
internal)
TextClass::ReturnValues success = TextClass::OK;
if (!forced_local_layout_.empty())
success = doc_class_->read(to_utf8(forced_local_layout_),
- TextClass::MODULE);
+ TextClass::MODULE, !clone &&
!fromgui);
if (!local_layout_.empty() &&
(success == TextClass::OK || success == TextClass::OK_OLDFORMAT))
- success = doc_class_->read(to_utf8(local_layout_),
TextClass::MODULE);
- if (success != TextClass::OK && success != TextClass::OK_OLDFORMAT) {
+ success = doc_class_->read(to_utf8(local_layout_),
TextClass::MODULE, !clone && !fromgui);
+ if (success != TextClass::OK && success != TextClass::OK_OLDFORMAT
+ && success != TextClass::FORMAT_UNKNOWN) {
docstring const msg = _("Error reading internal layout
information");
frontend::Alert::warning(_("Read Error"), msg);
}
diff --git a/src/BufferParams.h b/src/BufferParams.h
index 7c66b465af..16d8be5048 100644
--- a/src/BufferParams.h
+++ b/src/BufferParams.h
@@ -159,7 +159,7 @@ public:
/// on to class BufferView::updateDocumentClass(). The exception, of
course,
/// is in GuiDocument, where we use a BufferParams simply to hold a
copy of
/// the parameters from the active Buffer.
- void makeDocumentClass(bool clone = false, bool internal = false);
+ void makeDocumentClass(bool clone = false, bool internal = false, bool
fromgui = false);
/// Returns the DocumentClass currently in use: the BaseClass as
modified
/// by modules.
DocumentClass const & documentClass() const;
diff --git a/src/TextClass.cpp b/src/TextClass.cpp
index b68bfb0ea1..134eae75a6 100644
--- a/src/TextClass.cpp
+++ b/src/TextClass.cpp
@@ -354,9 +354,16 @@ TextClass::ReturnValues
TextClass::readWithoutConv(FileName const & filename, Re
bool TextClass::read(FileName const & filename, ReadType rt)
{
ReturnValues const retval = readWithoutConv(filename, rt);
- if (retval != FORMAT_MISMATCH)
+ if (retval != FORMAT_MISMATCH && retval != FORMAT_UNKNOWN)
return retval == OK;
+ if (retval == FORMAT_UNKNOWN) {
+ docstring const msg =
+ bformat(_("The layout file %1$s has a version unkown to
LyX and could thus not be converted.\n"),
+ from_utf8(filename.absFileName()));
+ frontend::Alert::warning(_("Layout Conversion Error"), msg);
+ return false;
+ }
bool const worx = convertLayoutFormat(filename, rt);
if (!worx)
LYXERR0 ("Unable to convert " << filename <<
@@ -372,16 +379,25 @@ TextClass::ReturnValues TextClass::validate(std::string
const & str)
}
-TextClass::ReturnValues TextClass::read(std::string const & str, ReadType rt)
+TextClass::ReturnValues TextClass::read(std::string const & str, ReadType rt,
bool const warn)
{
Lexer lexrc(textClassTags);
istringstream is(str);
lexrc.setStream(is);
ReturnValues retval = read(lexrc, rt);
- if (retval != FORMAT_MISMATCH)
+ if (retval != FORMAT_MISMATCH && retval != FORMAT_UNKNOWN)
return retval;
+ if (retval == FORMAT_UNKNOWN && rt == MODULE) {
+ if (warn)
+ frontend::Alert::warning(_("Layout Conversion Error"),
+ _("A local layout of this
document has a version unknown to LyX "
+ "and could thus not be
converted.\n"
+ "Please check Document >
Settings > Local Layouts!"));
+ return FORMAT_UNKNOWN;
+ }
+
// write the layout string to a temporary file
TempFile tmp("TextClass_read");
FileName const tempfile = tmp.name();
@@ -412,8 +428,12 @@ TextClass::ReturnValues TextClass::read(Lexer & lexrc,
ReadType rt)
// The first usable line should be
// Format LAYOUT_FORMAT
- if (lexrc.lex() != TC_FORMAT || !lexrc.next()
- || lexrc.getInteger() != LAYOUT_FORMAT)
+ if (lexrc.lex() != TC_FORMAT || !lexrc.next())
+ return FORMAT_MISMATCH;
+ int const format = lexrc.getInteger();
+ if (format > LAYOUT_FORMAT)
+ return FORMAT_UNKNOWN;
+ else if (format != LAYOUT_FORMAT)
return FORMAT_MISMATCH;
// parsing
diff --git a/src/TextClass.h b/src/TextClass.h
index 8ff1f23c58..97ba6ea7ef 100644
--- a/src/TextClass.h
+++ b/src/TextClass.h
@@ -156,7 +156,8 @@ public:
OK,
OK_OLDFORMAT,
ERROR,
- FORMAT_MISMATCH
+ FORMAT_MISMATCH,
+ FORMAT_UNKNOWN
};
/// Performs the read of the layout file.
@@ -164,7 +165,7 @@ public:
// FIXME Should return ReturnValues....
bool read(support::FileName const & filename, ReadType rt = BASECLASS);
///
- ReturnValues read(std::string const & str, ReadType rt = MODULE);
+ ReturnValues read(std::string const & str, ReadType rt = MODULE, bool
warn = false);
///
ReturnValues read(support::Lexer & lex, ReadType rt = BASECLASS);
/// validates the layout information passed in str
diff --git a/src/frontends/qt/GuiDocument.cpp b/src/frontends/qt/GuiDocument.cpp
index 56e2d4cebd..312514cbb0 100644
--- a/src/frontends/qt/GuiDocument.cpp
+++ b/src/frontends/qt/GuiDocument.cpp
@@ -3133,7 +3133,7 @@ void GuiDocument::classChanged()
// or whatever else there could be). Our parameters come from the
document
// class. So when we set the base class, we also need to recreate the
document
// class. Otherwise, we still have the old one.
- bp_.makeDocumentClass();
+ bp_.makeDocumentClass(false, false, true);
paramsToDialog();
}
@@ -3418,7 +3418,7 @@ void GuiDocument::modulesChanged()
}
modulesChanged_ = true;
- bp_.makeDocumentClass();
+ bp_.makeDocumentClass(false, false, true);
paramsToDialog();
changed();
}
@@ -3593,7 +3593,7 @@ void GuiDocument::updateDefaultFormat()
if (idx >= 0) {
string const classname =
fromqstr(latexModule->classCO->getData(idx));
param_copy.setBaseClass(classname, buffer().layoutPos());
- param_copy.makeDocumentClass(true);
+ param_copy.makeDocumentClass(true, false, true);
}
outputModule->defaultFormatCO->blockSignals(true);
outputModule->defaultFormatCO->clear();
--
lyx-cvs mailing list
[email protected]
https://lists.lyx.org/mailman/listinfo/lyx-cvs