]> 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 c76b574995795c71119d30d382c6940c127a1004..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,6 +50,7 @@ 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");
 
@@ -98,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)
 {}
 
 
@@ -124,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);
@@ -174,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);
@@ -236,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")
@@ -250,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;
 }
 
 
@@ -317,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";
@@ -333,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);
@@ -388,14 +407,33 @@ bool Converters::convert(Buffer const * buffer,
                        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
@@ -410,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);
 
@@ -687,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();