: name_(abs_filename)
{
BOOST_ASSERT(empty() || absolutePath(name_));
+#if defined(_WIN32)
BOOST_ASSERT(!contains(name_, '\\'));
+#endif
}
{
name_ = name;
BOOST_ASSERT(absolutePath(name_));
+#if defined(_WIN32)
BOOST_ASSERT(!contains(name_, '\\'));
+#endif
}
}
+FileName const FileName::fromFilesystemEncoding(string const & name)
+{
+ QByteArray const encoded(name.c_str(), name.length());
+ return FileName(fromqstr(QFile::decodeName(encoded)));
+}
+
+
bool operator==(FileName const & lhs, FileName const & rhs)
{
return lhs.absFilename() == rhs.absFilename();
{}
+DocFileName::DocFileName(FileName const & abs_filename, bool save_abs)
+ : FileName(abs_filename), save_abs_path_(save_abs), zipped_valid_(false)
+{}
+
+
void DocFileName::set(string const & name, string const & buffer_path)
{
save_abs_path_ = absolutePath(name);
- name_ = save_abs_path_ ? name : makeAbsPath(name, buffer_path);
+ name_ = save_abs_path_ ? name : makeAbsPath(name, buffer_path).absFilename();
zipped_valid_ = false;
}
string const DocFileName::relFilename(string const & path) const
{
- return makeRelPath(name_, path);
+ // FIXME UNICODE
+ return to_utf8(makeRelPath(from_utf8(name_), from_utf8(path)));
}
string const DocFileName::outputFilename(string const & path) const
{
- return save_abs_path_ ? name_ : makeRelPath(name_, path);
+ // FIXME UNICODE
+ return save_abs_path_ ? name_ : to_utf8(makeRelPath(from_utf8(name_), from_utf8(path)));
}
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_));