]> git.lyx.org Git - lyx.git/blobdiff - src/Converter.cpp
Do not issue module warnings when just cloning a buffer (#8864)
[lyx.git] / src / Converter.cpp
index a589b60b1f2add5a0e8fa334828edab56ce457a0..a27d742a713c70bd0c6f9eb021b60d19cd5880a3 100644 (file)
@@ -32,7 +32,7 @@
 #include "support/lstrings.h"
 #include "support/os.h"
 #include "support/Package.h"
-#include "support/Path.h"
+#include "support/PathChanger.h"
 #include "support/Systemcall.h"
 
 using namespace std;
@@ -50,7 +50,9 @@ string const token_base("$$b");
 string const token_to("$$o");
 string const token_path("$$p");
 string const token_orig_path("$$r");
+string const token_orig_from("$$f");
 string const token_encoding("$$e");
+string const token_latex_encoding("$$E");
 
 
 string const add_options(string const & command, string const & options)
@@ -97,7 +99,7 @@ Converter::Converter(string const & f, string const & t,
                     string const & c, string const & l)
        : from(f), to(t), command(c), flags(l),
          From(0), To(0), latex(false), xml(false),
-         need_aux(false)
+         need_aux(false), nice(false)
 {}
 
 
@@ -123,6 +125,8 @@ void Converter::readFlags()
                        result_file = flag_value;
                else if (flag_name == "parselog")
                        parselog = flag_value;
+               else if (flag_name == "nice")
+                       nice = true;
        }
        if (!result_dir.empty() && result_file.empty())
                result_file = "index." + formats.extension(to);
@@ -173,16 +177,25 @@ void Converters::add(string const & from, string const & to,
        }
        converter.readFlags();
 
-       // If we have both latex & pdflatex, we set latex_command to latex.
        // The latex_command is used to update the .aux file when running
        // a converter that uses it.
-       if (converter.latex
-           && (latex_command_.empty() || converter.latex_flavor == "latex"))
-               latex_command_ = subst(command, token_from, "");
-       // Similarly, set xelatex_command to xelatex.
-       if (converter.latex
-           && (xelatex_command_.empty() || converter.latex_flavor == "xelatex"))
-               xelatex_command_ = subst(command, token_from, "");
+       if (converter.latex) {
+               if (latex_command_.empty() ||
+                   converter.latex_flavor == "latex")
+                       latex_command_ = subst(command, token_from, "");
+               if (dvilualatex_command_.empty() ||
+                   converter.latex_flavor == "dvilualatex")
+                       dvilualatex_command_ = subst(command, token_from, "");
+               if (lualatex_command_.empty() ||
+                   converter.latex_flavor == "lualatex")
+                       lualatex_command_ = subst(command, token_from, "");
+               if (pdflatex_command_.empty() ||
+                   converter.latex_flavor == "pdflatex")
+                       pdflatex_command_ = subst(command, token_from, "");
+               if (xelatex_command_.empty() ||
+                   converter.latex_flavor == "xelatex")
+                       xelatex_command_ = subst(command, token_from, "");
+       }
 
        if (it == converterlist_.end()) {
                converterlist_.push_back(converter);
@@ -235,12 +248,15 @@ void Converters::updateLast(Formats const & formats)
 }
 
 
-OutputParams::FLAVOR Converters::getFlavor(Graph::EdgePath const & path)
+OutputParams::FLAVOR Converters::getFlavor(Graph::EdgePath const & path,
+                                          Buffer const * buffer)
 {
        for (Graph::EdgePath::const_iterator cit = path.begin();
             cit != path.end(); ++cit) {
                Converter const & conv = converterlist_[*cit];
-               if (conv.latex)
+               if (conv.latex) {
+                       if (conv.latex_flavor == "latex")
+                               return OutputParams::LATEX;
                        if (conv.latex_flavor == "xelatex")
                                return OutputParams::XETEX;
                        if (conv.latex_flavor == "lualatex")
@@ -249,10 +265,12 @@ OutputParams::FLAVOR Converters::getFlavor(Graph::EdgePath const & path)
                                return OutputParams::DVILUATEX;
                        if (conv.latex_flavor == "pdflatex")
                                return OutputParams::PDFLATEX;
+               }
                if (conv.xml)
                        return OutputParams::XML;
        }
-       return OutputParams::LATEX;
+       return buffer ? buffer->params().getOutputFlavor()
+                     : OutputParams::LATEX;
 }
 
 
@@ -316,7 +334,7 @@ bool Converters::convert(Buffer const * buffer,
        // buffer is only invalid for importing, and then runparams is not
        // used anyway.
        OutputParams runparams(buffer ? &buffer->params().encoding() : 0);
-       runparams.flavor = getFlavor(edgepath);
+       runparams.flavor = getFlavor(edgepath, buffer);
 
        if (buffer) {
                runparams.use_japanese = buffer->params().bufferFormat() == "platex";
@@ -332,6 +350,8 @@ bool Converters::convert(Buffer const * buffer,
        // This has the added benefit that all other files that may be
        // generated by the converter are deleted when LyX closes and do not
        // clutter the real working directory.
+       // FIXME: This does not work if path is an UNC path on windows
+       //        (bug 6127).
        string const path(onlyPath(from_file.absFileName()));
        // Prevent the compiler from optimizing away p
        FileName pp(path);
@@ -354,7 +374,7 @@ bool Converters::convert(Buffer const * buffer,
                               << conv.from << " to " << conv.to);
                }
                infile = outfile;
-               outfile = FileName(conv.result_dir.empty()
+               outfile = FileName(conv.result_file.empty()
                        ? changeExtension(from_file.absFileName(), conv.To->extension())
                        : addName(subst(conv.result_dir,
                                        token_base, from_base),
@@ -364,6 +384,9 @@ bool Converters::convert(Buffer const * buffer,
                // if input and output files are equal, we use a
                // temporary file as intermediary (JMarc)
                FileName real_outfile;
+               if (!conv.result_file.empty())
+                       real_outfile = FileName(changeExtension(from_file.absFileName(),
+                               conv.To->extension()));
                if (outfile == infile) {
                        real_outfile = infile;
                        // when importing, a buffer does not necessarily exist
@@ -376,19 +399,41 @@ bool Converters::convert(Buffer const * buffer,
 
                if (conv.latex) {
                        run_latex = true;
-                       string const command = subst(conv.command, token_from, "");
+                       string command = conv.command;
+                       command = subst(command, token_from, "");
+                       command = subst(command, token_latex_encoding, buffer ?
+                               buffer->params().encoding().latexName() : string());
                        LYXERR(Debug::FILES, "Running " << command);
                        if (!runLaTeX(*buffer, command, runparams, errorList))
                                return false;
                } else {
-                       if (conv.need_aux && !run_latex
-                           && !latex_command_.empty()) {
-                               string const command = (buffer && buffer->params().useNonTeXFonts) ?
-                                       xelatex_command_ : latex_command_;
-                               LYXERR(Debug::FILES, "Running " << command
-                                       << " to update aux file");
-                               if (!runLaTeX(*buffer, command, runparams, errorList))
-                                       return false;
+                       if (conv.need_aux && !run_latex) {
+                               string command;
+                               switch (runparams.flavor) {
+                               case OutputParams::DVILUATEX:
+                                       command = dvilualatex_command_;
+                                       break;
+                               case OutputParams::LUATEX:
+                                       command = lualatex_command_;
+                                       break;
+                               case OutputParams::PDFLATEX:
+                                       command = pdflatex_command_;
+                                       break;
+                               case OutputParams::XETEX:
+                                       command = xelatex_command_;
+                                       break;
+                               default:
+                                       command = latex_command_;
+                                       break;
+                               }
+                               if (!command.empty()) {
+                                       LYXERR(Debug::FILES, "Running "
+                                               << command
+                                               << " to update aux file");
+                                       if (!runLaTeX(*buffer, command,
+                                                     runparams, errorList))
+                                               return false;
+                               }
                        }
 
                        // FIXME UNICODE
@@ -403,6 +448,7 @@ bool Converters::convert(Buffer const * buffer,
                        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 = libScriptSearch(command);
 
@@ -680,7 +726,7 @@ vector<Format const *> const
 Converters::getReachable(string const & from, bool const only_viewable,
                         bool const clear_visited, set<string> const & excludes)
 {
-       set<int> excluded_numbers;;
+       set<int> excluded_numbers;
 
        set<string>::const_iterator sit = excludes.begin();
        set<string>::const_iterator const end = excludes.end();