mirror of
https://git.lyx.org/repos/lyx.git
synced 2024-12-13 17:20:55 +00:00
no-Shell patch one: convertDefault.sh -> convertDefault.py
git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/branches/BRANCH_1_4_X@14462 a592a061-630c-0410-9148-cb99ea01b6c8
This commit is contained in:
parent
29eeae433c
commit
26d0812c95
@ -1,10 +1,12 @@
|
||||
#! /bin/sh
|
||||
#!/usr/bin/env python -tt
|
||||
# -*- coding: iso-8859-15 -*-
|
||||
|
||||
# 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 +17,8 @@
|
||||
# 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)
|
@ -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) +
|
||||
' ' +
|
||||
|
@ -161,14 +161,13 @@ 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";
|
||||
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 +187,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 +205,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 +258,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,
|
||||
@ -286,6 +330,15 @@ bool build_script(string const & from_file,
|
||||
if (from_format.empty())
|
||||
return false;
|
||||
|
||||
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";
|
||||
|
||||
// we do not use ChangeExtension because this is a basename
|
||||
// which may nevertheless contain a '.'
|
||||
string const to_file = to_file_base + '.'
|
||||
@ -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;
|
||||
|
@ -94,7 +94,7 @@ std::string const
|
||||
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
|
||||
|
Loading…
Reference in New Issue
Block a user