]> git.lyx.org Git - features.git/commitdiff
Generate python code in GraphicsConverter.C, replace convertDefault.sh by convertDefa...
authorBo Peng <bpeng@lyx.org>
Mon, 26 Jun 2006 14:17:12 +0000 (14:17 +0000)
committerBo Peng <bpeng@lyx.org>
Mon, 26 Jun 2006 14:17:12 +0000 (14:17 +0000)
* src/graphics/GraphicsConverter.C: generate python instead of shell scripts
* src/converter.C: use convertDefault.py
* lib/scripts/convertDefault.sh: translated to convertDefault.py

git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@14223 a592a061-630c-0410-9148-cb99ea01b6c8

lib/scripts/convertDefault.py [new file with mode: 0644]
lib/scripts/convertDefault.sh [deleted file]
src/converter.C
src/frontends/controllers/tex_helpers.C
src/graphics/GraphicsConverter.C
src/support/filetools.h

diff --git a/lib/scripts/convertDefault.py b/lib/scripts/convertDefault.py
new file mode 100644 (file)
index 0000000..c3b7fec
--- /dev/null
@@ -0,0 +1,24 @@
+#!/usr/bin/env python
+
+# file convertDefault.py
+# This file is part of LyX, the document processor.
+# Licence details can be found in the file COPYING.
+
+# \author Herbert Voß
+# \author Bo Peng
+
+# Full author contact details are available in file CREDITS.
+
+# The default converter if no other has been defined by the user from the
+# Conversion->Converter tab of the Preferences dialog.
+
+# The user can also redefine this default converter, placing their
+# replacement in ~/.lyx/scripts
+
+# converts an image from $1 to $2 format
+import os, sys
+if os.system(r'convert -depth 8 "%s" "%s"' % (sys.argv[1], sys.argv[2])) != 0:
+  print >> sys.stderr, sys.argv[0], 'ERROR'
+  print >> sys.stderr, 'Execution of "convert" failed.'
+  sys.exit(1)
+
diff --git a/lib/scripts/convertDefault.sh b/lib/scripts/convertDefault.sh
deleted file mode 100644 (file)
index 9c381f8..0000000
+++ /dev/null
@@ -1,22 +0,0 @@
-#! /bin/sh
-
-# file convertDefault.sh
-# This file is part of LyX, the document processor.
-# Licence details can be found in the file COPYING.
-
-# author Herbert Voß
-
-# Full author contact details are available in file CREDITS.
-
-# The default converter if no other has been defined by the user from the
-# Conversion->Converter tab of the Preferences dialog.
-
-# The user can also redefine this default converter, placing their
-# replacement in ~/.lyx/scripts
-
-# converts an image from $1 to $2 format
-convert -depth 8 "$1" "$2" || {
-       echo "$0 ERROR" >&2
-       echo "Execution of \"convert\" failed." >&2
-       exit 1
-}
index 750a03936bc4ad74e10c85560b3a8f2616948591..b0669b24083aa04f1144c81d552ebbea0ebaf8fc 100644 (file)
@@ -298,8 +298,8 @@ bool Converters::convert(Buffer const * buffer,
                                getExtension(from_file) :
                                formats.extension(from_format);
                        string const command =
-                               "sh " +
-                               quoteName(libFileSearch("scripts", "convertDefault.sh")) +
+                               "python " +
+                               quoteName(libFileSearch("scripts", "convertDefault.py")) +
                                ' ' +
                                quoteName(from_ext + ':' + from_file) +
                                ' ' +
index 4e19b7d3ee90f2a26d922c19cde04ff608f44a8f..d910415f6453722844b2eb78b320c40dbc59dd51 100644 (file)
@@ -54,6 +54,9 @@ void rescanTexStyles()
        one.startscript(Systemcall::Wait,
                        "sh " +
                        quoteName(libFileSearch("scripts", "TeXFiles.sh")));
+       // To be changed to
+       //              "python " +
+       //              quoteName(libFileSearch("scripts", "TeXFiles.py")));
 }
 
 
index 179e74a826c68122eea1a52c9480f0347d62286b..2293d504a606ca1727580d642435d23154913b5f 100644 (file)
@@ -161,14 +161,22 @@ Converter::Impl::Impl(string const & from_file,   string const & to_file_base,
 
        // The conversion commands are stored in a stringstream
        ostringstream script;
-       script << "#!/bin/sh\n";
+       script << "#!/usr/bin/env python\n"
+                  << "import os, sys\n\n"
+                  << "def unlinkNoThrow(file):\n"
+                  << "  ''' remove a file, do not throw if an error occurs '''\n"
+                  << "  try:\n"
+                  << "    os.unlink(file)\n"
+                  << "  except:\n"
+                  << "    pass\n\n";
+
        bool const success = build_script(from_file, to_file_base,
                                          from_format, to_format, script);
 
        if (!success) {
                script_command_ =
-                       "sh " +
-                       quoteName(libFileSearch("scripts", "convertDefault.sh")) +
+                       "python " +
+                       quoteName(libFileSearch("scripts", "convertDefault.py")) +
                        ' ' +
                        quoteName((from_format.empty() ? "" : from_format + ':') + from_file) +
                        ' ' +
@@ -188,7 +196,7 @@ Converter::Impl::Impl(string const & from_file,   string const & to_file_base,
                // Output the script to file.
                static int counter = 0;
                script_file_ = onlyPath(to_file_base) + "lyxconvert" +
-                       convert<string>(counter++) + ".sh";
+                       convert<string>(counter++) + ".py";
 
                std::ofstream fs(script_file_.c_str());
                if (!fs.good()) {
@@ -206,7 +214,7 @@ Converter::Impl::Impl(string const & from_file,   string const & to_file_base,
                // We create a dummy command for ease of understanding of the
                // list of forked processes.
                // Note: 'sh ' is absolutely essential, or execvp will fail.
-               script_command_ = "sh " + quoteName(script_file_) + ' ' +
+               script_command_ = "python " + quoteName(script_file_) + ' ' +
                        quoteName(onlyFilename(from_file)) + ' ' +
                        quoteName(to_format);
        }
@@ -259,21 +267,66 @@ string const move_file(string const & from_file, string const & to_file)
                return string();
 
        ostringstream command;
-       command << "fromfile=" << from_file << "\n"
-               << "tofile="   << to_file << "\n\n"
-               << "'mv' -f \"${fromfile}\" \"${tofile}\" ||\n"
-               << "{\n"
-               << "\t'cp' -f \"${fromfile}\" \"${tofile}\" ||\n"
-               << "\t{\n"
-               << "\t\texit 1\n"
-               << "\t}\n"
-               << "\t'rm' -f \"${fromfile}\"\n"
-               << "}\n";
+       command << "fromfile = " << from_file << "\n"
+               << "tofile = "   << to_file << "\n\n"
+               << "try:\n"
+               << "  os.rename(fromfile, tofile)\n"
+               << "except:\n"
+               << "  import shutil\n"
+               << "  try:\n"
+               << "    shutil.copy(fromfile, tofile)\n"
+               << "  except:\n"
+               << "    sys.exit(1)\n"
+               << "  unlinkNoThrow(fromfile)\n";
 
        return command.str();
 }
 
 
+/*
+A typical script looks like:
+
+#!/usr/bin/env python
+import os, sys
+
+def unlinkNoThrow(file):
+  ''' remove a file, do not throw if error occurs '''
+  try:
+    os.unlink(file)
+  except:
+    pass
+
+infile = '/home/username/Figure3a.eps'
+infile_base = '/home/username/Figure3a'
+outfile = '/tmp/lyx_tmpdir12992hUwBqt/gconvert0129929eUBPm.pdf'
+
+if os.system(r'epstopdf ' + '"' + infile + '"' + ' --output ' + '"' + outfile + '"' + '') != 0:
+  unlinkNoThrow(outfile)
+  sys.exit(1)
+
+if not os.path.isfile(outfile):
+  if os.path.isfile(outfile + '.0'):
+    os.rename(outfile + '.0', outfile)
+    import glob
+    for file in glob.glob(outfile + '.?'):
+      unlinkNoThrow(file)
+  else:
+    sys.exit(1)
+
+fromfile = outfile
+tofile = '/tmp/lyx_tmpdir12992hUwBqt/Figure3a129927ByaCl.ppm'
+
+try:
+  os.rename(fromfile, tofile)
+except:
+  import shutil
+  try:
+    shutil.copy(fromfile, tofile)
+  except:
+    sys.exit(1)
+  unlinkNoThrow(fromfile)
+
+*/
 bool build_script(string const & from_file,
                  string const & to_file_base,
                  string const & from_format,
@@ -331,48 +384,46 @@ bool build_script(string const & from_file,
                outfile = changeExtension(to_base, conv.To->extension());
 
                // Store these names in the shell script
-               script << "infile="      << quoteName(infile) << '\n'
-                      << "infile_base=" << quoteName(infile_base) << '\n'
-                      << "outfile="     << quoteName(outfile) << '\n';
+               script << "infile = "      << quoteName(infile) << '\n'
+                      << "infile_base = " << quoteName(infile_base) << '\n'
+                      << "outfile = "     << quoteName(outfile) << '\n';
 
                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_from, "' + '\"' + infile + '\"' + '");
+               command = subst(command, token_base, "' + '\"' + infile_base + '\"' + '");
+               command = subst(command, token_to,   "' + '\"' + outfile + '\"' + '");
                command = libScriptSearch(command);
 
                // Store in the shell script
-               script << "\n" << command << " ||\n";
+               script << "\nif os.system(r'" << command << "') != 0:\n";
 
                // Test that this was successful. If not, remove
                // ${outfile} and exit the shell script
-               script << "{\n"
-                      << "\t'rm' -f \"${outfile}\"\n"
-                      << "\texit 1\n"
-                      << "}\n\n";
+               script << "  unlinkNoThrow(outfile)\n"
+                      << "  sys.exit(1)\n\n";
 
                // Test that the outfile exists.
                // ImageMagick's convert will often create ${outfile}.0,
                // ${outfile}.1.
                // If this occurs, move ${outfile}.0 to ${outfile}
-               // and delete ${outfile}.?
-               script << "if [ ! -f \"${outfile}\" ]; then\n"
-                      << "\tif [ -f \"${outfile}\".0 ]; then\n"
-                      << "\t\t'mv' -f \"${outfile}\".0 \"${outfile}\"\n"
-                      << "\t\t'rm' -f \"${outfile}\".?\n"
-                      << "\telse\n"
-                      << "\t\texit 1\n"
-                      << "\tfi\n"
-                      << "fi\n\n";
+               // and delete ${outfile}.? (ignore errors)
+               script << "if not os.path.isfile(outfile):\n"
+                      << "  if os.path.isfile(outfile + '.0'):\n"
+                      << "    os.rename(outfile + '.0', outfile)\n"
+                          << "    import glob\n"
+                      << "    for file in glob.glob(outfile + '.?'):\n"
+                          << "      unlinkNoThrow(file)\n"
+                      << "  else:\n"
+                      << "    sys.exit(1)\n\n";
 
                // Delete the infile, if it isn't the original, from_file.
                if (infile != from_file) {
-                       script << "'rm' -f \"${infile}\"\n\n";
+                       script << "unlinkNoThrow(infile)\n\n";
                }
        }
 
        // Move the final outfile to to_file
-       script << move_file("\"${outfile}\"", quoteName(to_file));
+       script << move_file("outfile", quoteName(to_file));
        lyxerr[Debug::GRAPHICS] << "ready!" << endl;
 
        return true;
index 7820a01dbe9e1b5a5e241cbd255e785be6887c0a..5cda2f75ddceb44a0b8c565c60fdb9032331262a 100644 (file)
@@ -98,7 +98,7 @@ i18nLibFileSearch(std::string const & dir,
                  std::string const & name,
                  std::string const & ext = std::string());
 
-/** Takes a command such as "sh $$s/scripts/convertDefault.sh file.in file.out"
+/** Takes a command such as "python $$s/scripts/convertDefault.py file.in file.out"
  *  and replaces "$$s/" with the path to the LyX support directory containing
  *  this script. If the script is not found, "$$s/" is removed. Executing the
  *  command will still fail, but the error message will make some sort of