mirror of
https://git.lyx.org/repos/lyx.git
synced 2024-12-14 09:32:20 +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.
|
# This file is part of LyX, the document processor.
|
||||||
# Licence details can be found in the file COPYING.
|
# 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.
|
# Full author contact details are available in file CREDITS.
|
||||||
|
|
||||||
@ -15,8 +17,8 @@
|
|||||||
# replacement in ~/.lyx/scripts
|
# replacement in ~/.lyx/scripts
|
||||||
|
|
||||||
# converts an image from $1 to $2 format
|
# converts an image from $1 to $2 format
|
||||||
convert -depth 8 "$1" "$2" || {
|
import os, sys
|
||||||
echo "$0 ERROR" >&2
|
if os.system(r'convert -depth 8 "%s" "%s"' % (sys.argv[1], sys.argv[2])) != 0:
|
||||||
echo "Execution of \"convert\" failed." >&2
|
print >> sys.stderr, sys.argv[0], 'ERROR'
|
||||||
exit 1
|
print >> sys.stderr, 'Execution of "convert" failed.'
|
||||||
}
|
sys.exit(1)
|
@ -298,8 +298,8 @@ bool Converters::convert(Buffer const * buffer,
|
|||||||
GetExtension(from_file) :
|
GetExtension(from_file) :
|
||||||
formats.extension(from_format);
|
formats.extension(from_format);
|
||||||
string const command =
|
string const command =
|
||||||
"sh " +
|
"python " +
|
||||||
QuoteName(LibFileSearch("scripts", "convertDefault.sh")) +
|
QuoteName(LibFileSearch("scripts", "convertDefault.py")) +
|
||||||
' ' +
|
' ' +
|
||||||
QuoteName(from_ext + ':' + from_file) +
|
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
|
// The conversion commands are stored in a stringstream
|
||||||
ostringstream script;
|
ostringstream script;
|
||||||
script << "#!/bin/sh\n";
|
|
||||||
bool const success = build_script(from_file, to_file_base,
|
bool const success = build_script(from_file, to_file_base,
|
||||||
from_format, to_format, script);
|
from_format, to_format, script);
|
||||||
|
|
||||||
if (!success) {
|
if (!success) {
|
||||||
script_command_ =
|
script_command_ =
|
||||||
"sh " +
|
"python " +
|
||||||
QuoteName(LibFileSearch("scripts", "convertDefault.sh")) +
|
QuoteName(LibFileSearch("scripts", "convertDefault.py")) +
|
||||||
' ' +
|
' ' +
|
||||||
QuoteName((from_format.empty() ? "" : from_format + ':') + from_file) +
|
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.
|
// Output the script to file.
|
||||||
static int counter = 0;
|
static int counter = 0;
|
||||||
script_file_ = OnlyPath(to_file_base) + "lyxconvert" +
|
script_file_ = OnlyPath(to_file_base) + "lyxconvert" +
|
||||||
convert<string>(counter++) + ".sh";
|
convert<string>(counter++) + ".py";
|
||||||
|
|
||||||
std::ofstream fs(script_file_.c_str());
|
std::ofstream fs(script_file_.c_str());
|
||||||
if (!fs.good()) {
|
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
|
// We create a dummy command for ease of understanding of the
|
||||||
// list of forked processes.
|
// list of forked processes.
|
||||||
// Note: 'sh ' is absolutely essential, or execvp will fail.
|
// 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(OnlyFilename(from_file)) + ' ' +
|
||||||
QuoteName(to_format);
|
QuoteName(to_format);
|
||||||
}
|
}
|
||||||
@ -259,21 +258,66 @@ string const move_file(string const & from_file, string const & to_file)
|
|||||||
return string();
|
return string();
|
||||||
|
|
||||||
ostringstream command;
|
ostringstream command;
|
||||||
command << "fromfile=" << from_file << "\n"
|
command << "fromfile = " << from_file << "\n"
|
||||||
<< "tofile=" << to_file << "\n\n"
|
<< "tofile = " << to_file << "\n\n"
|
||||||
<< "'mv' -f \"${fromfile}\" \"${tofile}\" ||\n"
|
<< "try:\n"
|
||||||
<< "{\n"
|
<< " os.rename(fromfile, tofile)\n"
|
||||||
<< "\t'cp' -f \"${fromfile}\" \"${tofile}\" ||\n"
|
<< "except:\n"
|
||||||
<< "\t{\n"
|
<< " import shutil\n"
|
||||||
<< "\t\texit 1\n"
|
<< " try:\n"
|
||||||
<< "\t}\n"
|
<< " shutil.copy(fromfile, tofile)\n"
|
||||||
<< "\t'rm' -f \"${fromfile}\"\n"
|
<< " except:\n"
|
||||||
<< "}\n";
|
<< " sys.exit(1)\n"
|
||||||
|
<< " unlinkNoThrow(fromfile)\n";
|
||||||
|
|
||||||
return command.str();
|
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,
|
bool build_script(string const & from_file,
|
||||||
string const & to_file_base,
|
string const & to_file_base,
|
||||||
string const & from_format,
|
string const & from_format,
|
||||||
@ -286,6 +330,15 @@ bool build_script(string const & from_file,
|
|||||||
if (from_format.empty())
|
if (from_format.empty())
|
||||||
return false;
|
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
|
// we do not use ChangeExtension because this is a basename
|
||||||
// which may nevertheless contain a '.'
|
// which may nevertheless contain a '.'
|
||||||
string const to_file = to_file_base + '.'
|
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());
|
outfile = ChangeExtension(to_base, conv.To->extension());
|
||||||
|
|
||||||
// Store these names in the shell script
|
// Store these names in the shell script
|
||||||
script << "infile=" << QuoteName(infile) << '\n'
|
script << "infile = " << QuoteName(infile) << '\n'
|
||||||
<< "infile_base=" << QuoteName(infile_base) << '\n'
|
<< "infile_base = " << QuoteName(infile_base) << '\n'
|
||||||
<< "outfile=" << QuoteName(outfile) << '\n';
|
<< "outfile = " << QuoteName(outfile) << '\n';
|
||||||
|
|
||||||
string command = conv.command;
|
string command = conv.command;
|
||||||
command = subst(command, token_from, "\"${infile}\"");
|
command = subst(command, token_from, "' + '\"' + infile + '\"' + '");
|
||||||
command = subst(command, token_base, "\"${infile_base}\"");
|
command = subst(command, token_base, "' + '\"' + infile_base + '\"' + '");
|
||||||
command = subst(command, token_to, "\"${outfile}\"");
|
command = subst(command, token_to, "' + '\"' + outfile + '\"' + '");
|
||||||
command = LibScriptSearch(command);
|
command = LibScriptSearch(command);
|
||||||
|
|
||||||
// Store in the shell script
|
// 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
|
// Test that this was successful. If not, remove
|
||||||
// ${outfile} and exit the shell script
|
// ${outfile} and exit the shell script
|
||||||
script << "{\n"
|
script << " unlinkNoThrow(outfile)\n"
|
||||||
<< "\t'rm' -f \"${outfile}\"\n"
|
<< " sys.exit(1)\n\n";
|
||||||
<< "\texit 1\n"
|
|
||||||
<< "}\n\n";
|
|
||||||
|
|
||||||
// Test that the outfile exists.
|
// Test that the outfile exists.
|
||||||
// ImageMagick's convert will often create ${outfile}.0,
|
// ImageMagick's convert will often create ${outfile}.0,
|
||||||
// ${outfile}.1.
|
// ${outfile}.1.
|
||||||
// If this occurs, move ${outfile}.0 to ${outfile}
|
// If this occurs, move ${outfile}.0 to ${outfile}
|
||||||
// and delete ${outfile}.?
|
// and delete ${outfile}.? (ignore errors)
|
||||||
script << "if [ ! -f \"${outfile}\" ]; then\n"
|
script << "if not os.path.isfile(outfile):\n"
|
||||||
<< "\tif [ -f \"${outfile}\".0 ]; then\n"
|
<< " if os.path.isfile(outfile + '.0'):\n"
|
||||||
<< "\t\t'mv' -f \"${outfile}\".0 \"${outfile}\"\n"
|
<< " os.rename(outfile + '.0', outfile)\n"
|
||||||
<< "\t\t'rm' -f \"${outfile}\".?\n"
|
<< " import glob\n"
|
||||||
<< "\telse\n"
|
<< " for file in glob.glob(outfile + '.?'):\n"
|
||||||
<< "\t\texit 1\n"
|
<< " unlinkNoThrow(file)\n"
|
||||||
<< "\tfi\n"
|
<< " else:\n"
|
||||||
<< "fi\n\n";
|
<< " sys.exit(1)\n\n";
|
||||||
|
|
||||||
// Delete the infile, if it isn't the original, from_file.
|
// Delete the infile, if it isn't the original, from_file.
|
||||||
if (infile != from_file) {
|
if (infile != from_file) {
|
||||||
script << "'rm' -f \"${infile}\"\n\n";
|
script << "unlinkNoThrow(infile)\n\n";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Move the final outfile to to_file
|
// 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;
|
lyxerr[Debug::GRAPHICS] << "ready!" << endl;
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
@ -94,7 +94,7 @@ std::string const
|
|||||||
i18nLibFileSearch(std::string const & dir, std::string const & name,
|
i18nLibFileSearch(std::string const & dir, std::string const & name,
|
||||||
std::string const & ext = std::string());
|
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
|
* 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
|
* 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
|
* command will still fail, but the error message will make some sort of
|
||||||
|
Loading…
Reference in New Issue
Block a user