]> git.lyx.org Git - lyx.git/blobdiff - src/graphics/GraphicsConverter.cpp
Comment.
[lyx.git] / src / graphics / GraphicsConverter.cpp
index 84918b0657cea13a69d6512eb2aeb0a83f52546d..4bd5cf1ef4f1ca77d22193747dddab51edd5691f 100644 (file)
@@ -25,6 +25,7 @@
 #include "support/os.h"
 
 #include "support/bind.h"
+#include "support/TempFile.h"
 
 #include <sstream>
 #include <fstream>
@@ -142,9 +143,9 @@ Converter::Impl::Impl(FileName const & from_file, string const & to_file_base,
                << "\n--------------------------------------\n");
 
        // Output the script to file.
-       static int counter = 0;
-       script_file_ = FileName(onlyPath(to_file_base) + "lyxconvert" +
-               convert<string>(counter++) + ".py");
+       TempFile tempfile(to_file_.onlyPath(), "lyxconvertXXXXXX.py");
+       tempfile.setAutoRemove(false);
+       script_file_ = tempfile.name();
 
        ofstream fs(script_file_.toFilesystemEncoding().c_str());
        if (!fs.good()) {
@@ -255,6 +256,13 @@ static void build_conversion_command(string const & command, ostream & script)
 }
 
 
+static string const strip_digit(string const & format)
+{
+       // Strip trailing digits from format names e.g. "pdf6" -> "pdf"
+       return format.substr(0, format.find_last_not_of("0123456789") + 1);
+}
+
+
 static void build_script(string const & from_file,
                  string const & to_file,
                  string const & from_format,
@@ -280,16 +288,16 @@ static void build_script(string const & from_file,
                theConverters().getPath(from_format, to_format);
 
        // Create a temporary base file-name for all intermediate steps.
-       // Remember to remove the temp file because we only want the name...
-       static int counter = 0;
-       string const tmp = "gconvert" + convert<string>(counter++);
-       string const to_base = FileName::tempName(tmp).toFilesystemEncoding();
+       string const from_ext = getExtension(from_file);
+       TempFile tempfile(addExtension("gconvertXXXXXX", from_ext));
+       tempfile.setAutoRemove(false);
+       string outfile = tempfile.name().toFilesystemEncoding();
+       string const to_base = from_ext.empty() ? outfile : removeExtension(outfile);
 
        // Create a copy of the file in case the original name contains
        // problematic characters like ' or ". We can work around that problem
        // in python, but the converters might be shell scripts and have more
        // troubles with it.
-       string outfile = addExtension(to_base, getExtension(from_file));
        script << "infile = "
                        << quoteName(from_file, quote_python)
                        << "\n"
@@ -315,15 +323,16 @@ static void build_script(string const & from_file,
 
                ostringstream os;
                os << os::python() << ' '
-                  << libScriptSearch("$$s/scripts/convertDefault.py",
-                                     quote_python) << ' ';
-               if (!from_format.empty())
-                       os << from_format << ':';
+                  << commandPrep("$$s/scripts/convertDefault.py") << ' ';
+               if (from_format.empty())
+                       os << "unknown ";
+               else
+                       os << strip_digit(from_format) << ' ';
                // The extra " quotes around infile and outfile are needed
                // because the filename may contain spaces and it is used
                // as argument of os.system().
                os << "' + '\"' + infile + '\"' + ' "
-                  << to_format << ":' + '\"' + outfile + '\"' + '";
+                  << strip_digit(to_format) << " ' + '\"' + outfile + '\"' + '";
                string const command = os.str();
 
                LYXERR(Debug::GRAPHICS,
@@ -349,17 +358,18 @@ static void build_script(string const & from_file,
                // Build the conversion command
                string const infile      = outfile;
                string const infile_base = changeExtension(infile, string());
-               outfile = conv.result_file.empty()
-                       ? addExtension(to_base, conv.To->extension())
-                       : addName(subst(conv.result_dir,
+               outfile = conv.result_file().empty()
+                       ? addExtension(to_base, conv.To()->extension())
+                       : addName(subst(conv.result_dir(),
                                        token_base, infile_base),
-                                 subst(conv.result_file,
+                                 subst(conv.result_file(),
                                        token_base, onlyFileName(infile_base)));
 
                // If two formats share the same extension we may get identical names
-               if (outfile == infile && conv.result_file.empty()) {
-                       string const new_base = FileName::tempName(tmp).toFilesystemEncoding();
-                       outfile = addExtension(new_base, conv.To->extension());
+               if (outfile == infile && conv.result_file().empty()) {
+                       TempFile tempfile(addExtension("gconvertXXXXXX", conv.To()->extension()));
+                       tempfile.setAutoRemove(false);
+                       outfile = tempfile.name().toFilesystemEncoding();
                }
 
                // Store these names in the python script
@@ -373,12 +383,11 @@ static void build_script(string const & from_file,
 
                // See comment about extra " quotes above (although that
                // applies only for the first loop run here).
-               string command = conv.command;
+               string command = conv.command();
                command = subst(command, token_from,  "' + '\"' + infile + '\"' + '");
                command = subst(command, token_base,  "' + '\"' + infile_base + '\"' + '");
                command = subst(command, token_to,    "' + '\"' + outfile + '\"' + '");
                command = subst(command, token_todir, "' + '\"' + outdir + '\"' + '");
-               command = libScriptSearch(command, quote_python);
 
                build_conversion_command(command, script);
        }