diff --git a/src/BufferParams.cpp b/src/BufferParams.cpp index f7516fc026..6bb90d0be0 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 890d8843a7..77b4856b4d 100644 --- a/src/BufferParams.h +++ b/src/BufferParams.h @@ -691,6 +691,10 @@ private: support::copied_ptr pimpl_; }; + +/// +BufferParams const & defaultBufferParams(); + } // namespace lyx #endif diff --git a/src/Converter.cpp b/src/Converter.cpp index 172b2a2091..b63f77146a 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 d339e11b80..20fe1034b9 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 1b11a45ba4..0d588d2838 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;