mirror of
https://git.lyx.org/repos/lyx.git
synced 2025-01-11 19:14:51 +00:00
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/trunk@14978 a592a061-630c-0410-9148-cb99ea01b6c8
This commit is contained in:
parent
e45d0fb4e4
commit
d17a57a6f3
@ -39,6 +39,7 @@ using support::libScriptSearch;
|
|||||||
using support::onlyPath;
|
using support::onlyPath;
|
||||||
using support::onlyFilename;
|
using support::onlyFilename;
|
||||||
using support::quoteName;
|
using support::quoteName;
|
||||||
|
using support::quote_python;
|
||||||
using support::subst;
|
using support::subst;
|
||||||
using support::tempName;
|
using support::tempName;
|
||||||
using support::unlink;
|
using support::unlink;
|
||||||
@ -327,9 +328,8 @@ void build_script(string const & from_file,
|
|||||||
// in python, but the converters might be shell scripts and have more
|
// in python, but the converters might be shell scripts and have more
|
||||||
// troubles with it.
|
// troubles with it.
|
||||||
string outfile = changeExtension(to_base, getExtension(from_file));
|
string outfile = changeExtension(to_base, getExtension(from_file));
|
||||||
script << "infile = '"
|
script << "infile = " << quoteName(from_file, quote_python) << "\n"
|
||||||
<< subst(subst(from_file, "\\", "\\\\"), "'", "\\'") << "'\n"
|
"outfile = " << quoteName(outfile, quote_python) << "\n"
|
||||||
"outfile = " << quoteName(outfile) << "\n"
|
|
||||||
"shutil.copy(infile, outfile)\n";
|
"shutil.copy(infile, outfile)\n";
|
||||||
|
|
||||||
if (edgepath.empty()) {
|
if (edgepath.empty()) {
|
||||||
@ -337,13 +337,18 @@ void build_script(string const & from_file,
|
|||||||
// converter path from from_format to to_format, so we use
|
// converter path from from_format to to_format, so we use
|
||||||
// the default converter.
|
// the default converter.
|
||||||
script << "infile = outfile\n"
|
script << "infile = outfile\n"
|
||||||
<< "outfile = " << quoteName(to_file) << '\n';
|
<< "outfile = " << quoteName(to_file, quote_python)
|
||||||
|
<< '\n';
|
||||||
|
|
||||||
ostringstream os;
|
ostringstream os;
|
||||||
os << support::os::python() << " \""
|
os << support::os::python() << ' '
|
||||||
<< libFileSearch("scripts", "convertDefault.py") << "\" ";
|
<< libScriptSearch("$$s/scripts/convertDefault.py",
|
||||||
|
quote_python) << ' ';
|
||||||
if (!from_format.empty())
|
if (!from_format.empty())
|
||||||
os << from_format << ':';
|
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 + '\"' + ' "
|
os << "' + '\"' + infile + '\"' + ' "
|
||||||
<< to_format << ":' + '\"' + outfile + '\"' + '";
|
<< to_format << ":' + '\"' + outfile + '\"' + '";
|
||||||
string const command = os.str();
|
string const command = os.str();
|
||||||
@ -373,21 +378,23 @@ void 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 python script
|
// Store these names in the python script
|
||||||
script << "infile = " << quoteName(infile) << '\n'
|
script << "infile = " << quoteName(infile, quote_python) << "\n"
|
||||||
<< "infile_base = " << quoteName(infile_base) << '\n'
|
"infile_base = " << quoteName(infile_base, quote_python) << "\n"
|
||||||
<< "outfile = " << quoteName(outfile) << '\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;
|
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, quote_python);
|
||||||
|
|
||||||
build_conversion_command(command, script);
|
build_conversion_command(command, script);
|
||||||
}
|
}
|
||||||
|
|
||||||
// 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, quote_python));
|
||||||
lyxerr[Debug::GRAPHICS] << "ready!" << endl;
|
lyxerr[Debug::GRAPHICS] << "ready!" << endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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) ?
|
switch(style) {
|
||||||
'\'' + name + '\'':
|
case quote_shell:
|
||||||
'"' + name + '"';
|
// 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();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -313,7 +328,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/";
|
static string const token_scriptpath = "$$s/";
|
||||||
|
|
||||||
@ -339,7 +354,7 @@ string const libScriptSearch(string const & command_in)
|
|||||||
} else {
|
} else {
|
||||||
// Replace "$$s/foo/some_script" with "<path to>/some_script".
|
// Replace "$$s/foo/some_script" with "<path to>/some_script".
|
||||||
string::size_type const size_replace = size_script + 4;
|
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;
|
return command;
|
||||||
|
@ -100,13 +100,28 @@ i18nLibFileSearch(std::string const & dir,
|
|||||||
std::string const & name,
|
std::string const & name,
|
||||||
std::string const & ext = std::string());
|
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"
|
/** 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
|
||||||
* sense ;-)
|
* 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 {
|
enum latex_path_extension {
|
||||||
PROTECT_EXTENSION,
|
PROTECT_EXTENSION,
|
||||||
@ -144,8 +159,9 @@ std::string const latex_path(std::string const & path,
|
|||||||
/// Substitutes active latex characters with underscores in filename
|
/// Substitutes active latex characters with underscores in filename
|
||||||
std::string const makeLatexName(std::string const & file);
|
std::string const makeLatexName(std::string const & file);
|
||||||
|
|
||||||
/// Put the name in quotes suitable for the current shell
|
/** Put the name in quotes suitable for the current shell or python,
|
||||||
std::string const quoteName(std::string const & file);
|
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.
|
/// 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);
|
std::string const addName(std::string const & path, std::string const & fname);
|
||||||
|
Loading…
Reference in New Issue
Block a user