Dear all,

Here is the promised patch. It is tested by

1. graphics seems to be converted correctly by convertDefault.py
2. by adding a converter from eps to ppm, a python script is generated
when I scroll userguide.lyx (use -dbg graphic to see it). The figure
is converted correctly.

Please test.
Bo
Index: src/graphics/GraphicsConverter.C
===================================================================
--- src/graphics/GraphicsConverter.C	(revision 14212)
+++ src/graphics/GraphicsConverter.C	(working copy)
@@ -161,14 +161,22 @@
 
 	// The conversion commands are stored in a stringstream
 	ostringstream script;
-	script << "#!/bin/sh\n";
+	script << "#!/use/bin/env python\n"
+		   << "import os, sys\n\n"
+		   << "def unlinkNoThrow(file):\n"
+		   << "  ''' remove a file, do not throw if an error happens '''\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 @@
 		// 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 @@
 		// 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 @@
 		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:
+
+#!/use/bin/env python
+import os, sys
+
+def unlinkNoThrow(file):
+  ''' remove a file, do not throw if error happens '''
+  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 @@
 		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: src/converter.C
===================================================================
--- src/converter.C	(revision 14212)
+++ src/converter.C	(working copy)
@@ -298,8 +298,8 @@
 				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: src/frontends/controllers/tex_helpers.C
===================================================================
--- src/frontends/controllers/tex_helpers.C	(revision 14212)
+++ src/frontends/controllers/tex_helpers.C	(working copy)
@@ -54,6 +54,9 @@
 	one.startscript(Systemcall::Wait,
 			"sh " +
 			quoteName(libFileSearch("scripts", "TeXFiles.sh")));
+	// To be changed to
+	//		"python " +
+	//		quoteName(libFileSearch("scripts", "TeXFiles.py")));
 }
 
 
Index: src/support/filetools.h
===================================================================
--- src/support/filetools.h	(revision 14212)
+++ src/support/filetools.h	(working copy)
@@ -98,7 +98,7 @@
 		  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
Index: lib/scripts/convertDefault.py
===================================================================
--- lib/scripts/convertDefault.py	(revision 14210)
+++ lib/scripts/convertDefault.py	(working copy)
@@ -1,10 +1,11 @@
-#! /bin/sh
+#!/usr/bin/env python
 
-# file convertDefault.sh
+# 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 Herbert Voß
+# \author Bo Peng
 
 # Full author contact details are available in file CREDITS.
 
@@ -15,8 +16,9 @@
 # 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
-}
+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)
+
Index: lib/scripts/convertDefault.sh
===================================================================
--- lib/scripts/convertDefault.sh	(revision 14212)
+++ lib/scripts/convertDefault.sh	(working copy)
@@ -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
-}

Reply via email to