Fix bug 2937 (from Jean-Baptiste LAMY)

* src/support/filename.C
	(DocFileName::mangledFilenam): Use a whitelist of allowed characters
	instead of an incomplete blacklist of disallowed ones


git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@17378 a592a061-630c-0410-9148-cb99ea01b6c8
This commit is contained in:
Georg Baum 2007-02-27 19:01:10 +00:00
parent e2d91ecfc2
commit 471b4ea315

View File

@ -167,14 +167,19 @@ string const DocFileName::mangledFilename(std::string const & dir) const
string mname = os::internal_path(name_);
// Remove the extension.
mname = changeExtension(name_, string());
// Replace '/' in the file name with '_'
mname = subst(mname, "/", "_");
// Replace '.' in the file name with '_'
mname = subst(mname, ".", "_");
// Replace ' ' in the file name with '_'
mname = subst(mname, " ", "_");
// Replace ':' in the file name with '_'
mname = subst(mname, ":", "_");
// The mangled name must be a valid LaTeX name.
// The list of characters to keep is probably over-restrictive,
// but it is not really a problem.
// Apart from non-ASCII characters, at least the following characters
// are forbidden: '/', '.', ' ', and ':'.
// On windows it is not possible to create files with '<', '>' or '?'
// in the name.
static string const keep = "abcdefghijklmnopqrstuvwxyz"
"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
"+,-0123456789;=";
string::size_type pos = 0;
while ((pos = mname.find_first_not_of(keep, pos)) != string::npos)
mname[pos++] = '_';
// Add the extension back on
mname = changeExtension(mname, getExtension(name_));