#include "Converter.h"
#include "Buffer.h"
-#include "buffer_funcs.h"
#include "BufferParams.h"
#include "ConverterCache.h"
+#include "TextClass.h"
#include "Encoding.h"
#include "ErrorList.h"
#include "Format.h"
#include "LaTeX.h"
#include "LyXRC.h"
#include "Mover.h"
+#include "OutputParams.h"
#include "ParagraphList.h"
#include "Session.h"
string const token_path("$$p");
string const token_orig_path("$$r");
string const token_orig_from("$$f");
+string const token_textclass("$$c");
+string const token_modules("$$m");
string const token_encoding("$$e");
string const token_latex_encoding("$$E");
-
+string const token_python("$${python}");
string const add_options(string const & command, string const & options)
{
Converter::Converter(string const & f, string const & t,
string const & c, string const & l)
: from_(f), to_(t), command_(c), flags_(l),
- From_(nullptr), To_(nullptr), latex_(false), xml_(false),
+ From_(nullptr), To_(nullptr), latex_(false), docbook_(false),
need_aux_(false), nice_(false), need_auth_(false)
{}
latex_flavor_ = flag_value.empty() ?
"latex" : flag_value;
} else if (flag_name == "xml")
- xml_ = true;
+ docbook_ = true;
else if (flag_name == "needaux") {
need_aux_ = true;
latex_flavor_ = flag_value.empty() ?
}
+void Converter::setCommand(std::string const & command)
+{
+ command_ = subst(command, token_python, os::python());
+}
+
+
Converter const * Converters::getConverter(string const & from,
string const & to) const
{
}
-OutputParams::FLAVOR Converters::getFlavor(Graph::EdgePath const & path,
- Buffer const * buffer)
+Flavor Converters::getFlavor(Graph::EdgePath const & path,
+ Buffer const * buffer) const
{
for (auto const & edge : path) {
Converter const & conv = converterlist_[edge];
if (conv.latex() || conv.need_aux()) {
if (conv.latex_flavor() == "latex")
- return OutputParams::LATEX;
+ return Flavor::LaTeX;
if (conv.latex_flavor() == "xelatex")
- return OutputParams::XETEX;
+ return Flavor::XeTeX;
if (conv.latex_flavor() == "lualatex")
- return OutputParams::LUATEX;
+ return Flavor::LuaTeX;
if (conv.latex_flavor() == "dvilualatex")
- return OutputParams::DVILUATEX;
+ return Flavor::DviLuaTeX;
if (conv.latex_flavor() == "pdflatex")
- return OutputParams::PDFLATEX;
+ return Flavor::PdfLaTeX;
}
- if (conv.xml())
- return OutputParams::DOCBOOK5;
+ if (conv.docbook())
+ return Flavor::DocBook5;
}
return buffer ? buffer->params().getOutputFlavor()
- : OutputParams::LATEX;
+ : Flavor::LaTeX;
}
-string Converters::getHyperrefDriver(Graph::EdgePath const & path)
+string Converters::getHyperrefDriver(Graph::EdgePath const & path) const
{
for (auto const & edge : path) {
Converter const & conv = converterlist_[edge];
bool const has_shell_escape = contains(conv_command, "-shell-escape")
|| contains(conv_command, "-enable-write18");
if (conv.latex() && has_shell_escape && !use_shell_escape) {
+ // Only change font if gui is available otherwise Qt6 crashes
+ string const cmd = use_gui ? "<tt>" + conv_command + "</tt>"
+ : conv_command;
docstring const shellescape_warning =
bformat(_("<p>The following LaTeX backend has been "
"configured to allow execution of external programs "
"for any document:</p>"
- "<center><p><tt>%1$s</tt></p></center>"
+ "<center><p>%1$s</p></center>"
"<p>This is a dangerous configuration. Please, "
"consider using the support offered by LyX for "
"allowing this privilege only to documents that "
"actually need it, instead.</p>"),
- from_utf8(conv_command));
+ from_utf8(cmd));
frontend::Alert::error(_("Security Warning"),
shellescape_warning , false);
} else if (!conv.latex())
? (has_token ? conv_command.insert(token_pos, "-shell-escape ")
: conv_command.append(" -shell-escape"))
: conv_command;
+ // Only change font if gui is available otherwise Qt6 crashes
+ string const cmd = use_gui ? "<tt>" + command + "</tt>" : command;
docstring const security_warning = (use_shell_escape
? bformat(_("<p>The following LaTeX backend has been requested "
"to allow execution of external programs:</p>"
- "<center><p><tt>%1$s</tt></p></center>"
+ "<center><p>%1$s</p></center>"
"<p>The external programs can execute arbitrary commands on "
"your system, including dangerous ones, if instructed to do "
"so by a maliciously crafted LyX document.</p>"),
- from_utf8(command))
+ from_utf8(cmd))
: bformat(_("<p>The requested operation requires the use of a "
"converter from %2$s to %3$s:</p>"
- "<blockquote><p><tt>%1$s</tt></p></blockquote>"
+ "<blockquote><p>%1$s</p></blockquote>"
"<p>This external program can execute arbitrary commands on "
"your system, including dangerous ones, if instructed to do "
"so by a maliciously crafted LyX document.</p>"),
- from_utf8(command), from_utf8(conv.from()),
+ from_utf8(cmd), from_utf8(conv.from()),
from_utf8(conv.to())));
if (lyxrc.use_converter_needauth_forbidden && !use_shell_escape) {
frontend::Alert::error(
return FAILURE;
}
- // buffer is only invalid for importing, and then runparams is not
+ // buffer can only be null for importing, and then runparams is not
// used anyway.
OutputParams runparams(buffer ? &buffer->params().encoding() : nullptr);
runparams.flavor = getFlavor(edgepath, buffer);
|| suffixIs(bp.bufferFormat(), "-ja"))
&& bp.encoding().package() == Encoding::japanese;
runparams.use_indices = bp.use_indices;
- runparams.bibtex_command = bp.bibtexCommand();
+ runparams.bibtex_command = bp.bibtexCommand(true);
runparams.index_command = (bp.index_command == "default") ?
string() : bp.index_command;
runparams.document_language = bp.language->lang();
LASSERT(buffer, return FAILURE);
string command;
switch (runparams.flavor) {
- case OutputParams::DVILUATEX:
+ case Flavor::DviLuaTeX:
command = dvilualatex_command_;
break;
- case OutputParams::LUATEX:
+ case Flavor::LuaTeX:
command = lualatex_command_;
break;
- case OutputParams::PDFLATEX:
+ case Flavor::PdfLaTeX:
command = pdflatex_command_;
break;
- case OutputParams::XETEX:
+ case Flavor::XeTeX:
command = xelatex_command_;
break;
default:
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_encoding, buffer ? 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())
command += " 2> " + quoteName(infile2 + ".out");
if (res == Systemcall::KILLED) {
frontend::Alert::warning(
_("Converter killed"),
- bformat(_("The following converter was killed by the user.\n %1$s\n"),
+ bformat(_("The following converter was killed by the user.\n %1$s\n"),
from_utf8(command)));
return KILLED;
}
-
+
if (!real_outfile.empty()) {
Mover const & mover = getMover(conv.to());
if (!mover.rename(outfile, real_outfile))
if (res == Systemcall::KILLED) {
frontend::Alert::warning(
_("Converter killed"),
- bformat(_("The following converter was killed by the user.\n %1$s\n"),
+ bformat(_("The following converter was killed by the user.\n %1$s\n"),
from_utf8(command)));
return KILLED;
}
bformat(_("The conversion process was killed while running:\n%1$s"),
wrapParas(from_utf8(command))));
return KILLED;
- }
+ }
if (res == Systemcall::TIMEOUT) {
Alert::information(_("Process Timed Out"),
bformat(_("The conversion process:\n%1$s\ntimed out before completing."),
wrapParas(from_utf8(command))));
return KILLED;
- }
+ }
if (conv.to() == "program") {
Alert::error(_("Build errors"),
_("There were errors during the build process."));
}
-bool Converters::formatIsUsed(string const & format)
+bool Converters::formatIsUsed(string const & format) const
{
for (auto const & cvt : converterlist_) {
if (cvt.from() == format || cvt.to() == format)
FileName const & filename, ErrorList & errorList)
{
OutputParams runparams(nullptr);
- runparams.flavor = OutputParams::LATEX;
+ runparams.flavor = Flavor::LaTeX;
LaTeX latex("", runparams, filename);
TeXErrors terr;
int const result = latex.scanLogFile(terr);
// do the LaTeX run(s)
string const name = buffer.latexName();
- LaTeX latex(command, runparams, FileName(makeAbsPath(name)),
+ LaTeX latex(command, runparams, makeAbsPath(name),
buffer.filePath(), buffer.layoutPos(),
buffer.isClone(), buffer.freshStartRequired());
TeXErrors terr;