Fix converters in our scripts directory

* src/graphics/GraphicsConverter.C
        (build_script): quote filenames in the python script properly
        (build_script):
        (build_script):

        * src/support/filetools.[Ch]
        (quoteName): Add quote_style argument and quoting of python filenames
        (libScriptSearch): Add quote_style argument

        * src/support/filetools.C
        (quote_style): New enum to specify the quoting style


git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/branches/BRANCH_1_4_X@14979 a592a061-630c-0410-9148-cb99ea01b6c8
This commit is contained in:
Georg Baum 2006-09-11 17:14:07 +00:00
parent e983b7c499
commit bf437d7051
3 changed files with 58 additions and 20 deletions

View File

@ -38,6 +38,7 @@ using support::LibScriptSearch;
using support::OnlyPath;
using support::OnlyFilename;
using support::QuoteName;
using support::quote_python;
using support::subst;
using support::tempName;
using support::unlink;
@ -325,9 +326,8 @@ void build_script(string const & from_file,
// in python, but the converters might be shell scripts and have more
// troubles with it.
string outfile = ChangeExtension(to_base, GetExtension(from_file));
script << "infile = '"
<< subst(subst(from_file, "\\", "\\\\"), "'", "\\'") << "'\n"
"outfile = " << QuoteName(outfile) << "\n"
script << "infile = " << QuoteName(from_file, quote_python) << "\n"
"outfile = " << QuoteName(outfile, quote_python) << "\n"
"shutil.copy(infile, outfile)\n";
if (edgepath.empty()) {
@ -335,13 +335,18 @@ void build_script(string const & from_file,
// converter path from from_format to to_format, so we use
// the default converter.
script << "infile = outfile\n"
<< "outfile = " << QuoteName(to_file) << '\n';
<< "outfile = " << QuoteName(to_file, quote_python)
<< '\n';
ostringstream os;
os << "python \""
<< LibFileSearch("scripts", "convertDefault.py") << "\" ";
os << "python "
<< LibScriptSearch("$$s/scripts/convertDefault.py",
quote_python) << ' ';
if (!from_format.empty())
os << 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 + '\"' + '";
string const command = os.str();
@ -371,21 +376,23 @@ void build_script(string const & from_file,
outfile = ChangeExtension(to_base, conv.To->extension());
// Store these names in the python script
script << "infile = " << QuoteName(infile) << '\n'
<< "infile_base = " << QuoteName(infile_base) << '\n'
<< "outfile = " << QuoteName(outfile) << '\n';
script << "infile = " << QuoteName(infile, quote_python) << "\n"
"infile_base = " << QuoteName(infile_base, quote_python) << "\n"
"outfile = " << QuoteName(outfile, quote_python) << '\n';
// See comment about extra " quotes above (although that
// applies only for the first loop run here).
string command = conv.command;
command = subst(command, token_from, "' + '\"' + infile + '\"' + '");
command = subst(command, token_base, "' + '\"' + infile_base + '\"' + '");
command = subst(command, token_to, "' + '\"' + outfile + '\"' + '");
command = LibScriptSearch(command);
command = LibScriptSearch(command, quote_python);
build_conversion_command(command, script);
}
// Move the final outfile to to_file
script << move_file("outfile", QuoteName(to_file));
script << move_file("outfile", QuoteName(to_file, quote_python));
lyxerr[Debug::GRAPHICS] << "ready!" << endl;
}

View File

@ -133,11 +133,26 @@ string const MakeLatexName(string const & file)
}
string const QuoteName(string const & name)
string const QuoteName(string const & name, quote_style style)
{
return (os::shell() == os::UNIX) ?
'\'' + name + '\'':
'"' + name + '"';
switch(style) {
case quote_shell:
// This does not work for filenames containing " (windows)
// or ' (all other OSes). This can't be changed easily, since
// we would need to adapt the command line parser in
// Forkedcall::generateChild. Therefore we don't pass user
// filenames to child processes if possible. We store them in
// a python script instead, where we don't have these
// limitations.
return (os::shell() == os::UNIX) ?
'\'' + name + '\'':
'"' + name + '"';
case quote_python:
return "\"" + subst(subst(name, "\\", "\\\\"), "\"", "\\\"")
+ "\"";
}
// shut up stupid compiler
return string();
}
@ -319,7 +334,7 @@ string const i18nLibFileSearch(string const & dir, string const & name,
}
string const LibScriptSearch(string const & command_in)
string const LibScriptSearch(string const & command_in, quote_style style)
{
static string const token_scriptpath = "$$s/";
@ -345,7 +360,7 @@ string const LibScriptSearch(string const & command_in)
} else {
// Replace "$$s/foo/some_script" with "<path to>/some_script".
string::size_type const size_replace = size_script + 4;
command.replace(pos1, size_replace, QuoteName(script));
command.replace(pos1, size_replace, QuoteName(script, style));
}
return command;

View File

@ -94,13 +94,28 @@ std::string const
i18nLibFileSearch(std::string const & dir, std::string const & name,
std::string const & ext = std::string());
/// How to quote a filename
enum quote_style {
/** Quote for the (OS dependant) shell. This is needed for command
line arguments of subprocesses. */
quote_shell,
/** Quote for python. Use this if you want to store a filename in a
python script. Example: \code
os << "infile = " << QuoteName(filename) << '\\n';
\endcode This uses double quotes, so that you can also use this
to quote filenames as part of a string if the string is quoted
with single quotes. */
quote_python
};
/** 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
* sense ;-)
*/
std::string const LibScriptSearch(std::string const & command);
std::string const LibScriptSearch(std::string const & command,
quote_style style = quote_shell);
enum latex_path_extension {
PROTECT_EXTENSION,
@ -138,8 +153,9 @@ std::string const latex_path(std::string const & path,
/// Substitutes active latex characters with underscores in filename
std::string const MakeLatexName(std::string const & file);
/// Put the name in quotes suitable for the current shell
std::string const QuoteName(std::string const & file);
/** Put the name in quotes suitable for the current shell or python,
depending on \p style. */
std::string const QuoteName(std::string const & file, quote_style style = quote_shell);
/// Add a filename to a path. Any path from filename is stripped first.
std::string const AddName(std::string const & path, std::string const & fname);