[LyX/master] Fix pasting as LaTeX in documents with no modules
Jean-Marc Lasgouttes
lasgouttes at lyx.org
Sun Nov 6 11:27:40 UTC 2022
commit 90ea50811191dc891d2b3407c01527f1f2d745dd
Author: Jean-Marc Lasgouttes <lasgouttes at lyx.org>
Date: Thu Oct 27 17:26:53 2022 +0200
Fix pasting as LaTeX in documents with no modules
When there is no module, the old code would invoke tex2lyx with option
-m
instead of
-m ""
and an error would ensue.
This is because the QProcess command line parser used in Systemcall is
broken and does not recognize empty parameters as such. The solution
is to rewrite our parsecmd() parser to generate a list of parameters.
This is post-2.4.0 work.
The workaround used here is:
- set the list of modules to "," when it should be empty. In effect,
this is a list of two empty modules.
- change tex2lyx to accept empty module names and ignore them; this is
good in terms of robustness anyway.
Additionally, when there is no receiving buffer, set the defaults as
the BufferParams defaults instead of empty (this is cleaner, but
should not make a difference in practice).
In the long term, we should switch to use the QStringList-based API of
QProcess in Systemcall (see QTBUG-80640).
---
src/BufferParams.cpp | 6 ++++++
src/BufferParams.h | 4 ++++
src/Converter.cpp | 21 ++++++++++++---------
src/support/Systemcall.cpp | 5 +++++
src/tex2lyx/tex2lyx.cpp | 7 +++----
5 files changed, 30 insertions(+), 13 deletions(-)
diff --git a/src/BufferParams.cpp b/src/BufferParams.cpp
index f7516fc..6bb90d0 100644
--- a/src/BufferParams.cpp
+++ b/src/BufferParams.cpp
@@ -3840,5 +3840,11 @@ string const BufferParams::bibFileEncoding(string const & file) const
}
+BufferParams const & defaultBufferParams()
+{
+ static BufferParams default_params;
+ return default_params;
+}
+
} // namespace lyx
diff --git a/src/BufferParams.h b/src/BufferParams.h
index 890d884..77b4856 100644
--- a/src/BufferParams.h
+++ b/src/BufferParams.h
@@ -691,6 +691,10 @@ private:
support::copied_ptr<Impl, MemoryTraits> pimpl_;
};
+
+///
+BufferParams const & defaultBufferParams();
+
} // namespace lyx
#endif
diff --git a/src/Converter.cpp b/src/Converter.cpp
index 172b2a2..b63f771 100644
--- a/src/Converter.cpp
+++ b/src/Converter.cpp
@@ -646,21 +646,24 @@ Converters::RetVal Converters::convert(Buffer const * buffer,
to_utf8(makeRelPath(from_utf8(outfile.absFileName()), from_utf8(path)));
string command = conv.command();
+ BufferParams const & bparams = buffer ? buffer->params() : defaultBufferParams();
command = subst(command, token_from, quoteName(infile2));
command = subst(command, token_base, quoteName(from_base));
command = subst(command, token_to, quoteName(outfile2));
command = subst(command, token_path, quoteName(onlyPath(infile.absFileName())));
command = subst(command, token_orig_path, quoteName(onlyPath(orig_from.absFileName())));
command = subst(command, token_orig_from, quoteName(onlyFileName(orig_from.absFileName())));
- command = subst(command, token_textclass,
- buffer ? quoteName(buffer->params().documentClass().name())
- : string());
- command = subst(command, token_modules,
- buffer ? quoteName(buffer->params().getModules().asString())
- : string());
- command = subst(command, token_encoding,
- buffer ? quoteName(buffer->params().encoding().iconvName())
- : string());
+ command = subst(command, token_textclass, quoteName(bparams.documentClass().name()));
+ string modules = bparams.getModules().asString();
+ // FIXME: remove when SystemCall uses QProcess with the list API.
+ // Currently the QProcess parser is not able to encode an
+ // empty argument as ""; work around this by passing a
+ // single comma, that will be interpreted as a list of two
+ // empty module names.
+ if (modules.empty())
+ modules = ",";
+ command = subst(command, token_modules, quoteName(modules));
+ command = subst(command, token_encoding, quoteName(bparams.encoding().iconvName()));
command = subst(command, token_python, os::python());
if (!conv.parselog().empty())
diff --git a/src/support/Systemcall.cpp b/src/support/Systemcall.cpp
index d339e11..20fe103 100644
--- a/src/support/Systemcall.cpp
+++ b/src/support/Systemcall.cpp
@@ -392,6 +392,11 @@ void SystemcallPrivate::startProcess(QString const & cmd, string const & path,
* The cleanest solution would be to have parsecmd() produce a
* QStringList for arguments, instead of transforming the string
* into something that the QProcess splitter accepts.
+ *
+ * Another reason for doing that is that the Qt parser ignores
+ * empty "" arguments, which are needed in some instances (see
+ * e.g. the work around for modules in Converter:convert. See
+ * QTBUG-80640 for a discussion.
*/
QStringList arguments = QProcess::splitCommand(toqstr(latexEnvCmdPrefix(path, lpath)) + cmd_);
QString command = (arguments.empty()) ? QString() : arguments.first();
diff --git a/src/tex2lyx/tex2lyx.cpp b/src/tex2lyx/tex2lyx.cpp
index 1b11a45..0d588d2 100644
--- a/src/tex2lyx/tex2lyx.cpp
+++ b/src/tex2lyx/tex2lyx.cpp
@@ -699,8 +699,6 @@ int parse_class(string const & arg, string const &)
int parse_module(string const & arg, string const &)
{
- if (arg.empty())
- error_message("Missing modules string after -m switch");
split(arg, preloaded_modules, ',');
return 1;
}
@@ -924,11 +922,12 @@ bool tex2lyx(idocstream & is, ostream & os, string const & encoding,
// Load preloaded modules.
// This needs to be done after the preamble is parsed, since the text
- // class may not be known before. It neds to be done before parsing
+ // class may not be known before. It needs to be done before parsing
// body, since otherwise the commands/environments provided by the
// modules would be parsed as ERT.
+ // Empty module names are silently skipped.
for (auto const & module : preloaded_modules) {
- if (!addModule(module)) {
+ if (!module.empty() && !addModule(module)) {
cerr << "Error: Could not load module \""
<< module << "\"." << endl;
return false;
More information about the lyx-cvs
mailing list