Better tidy_for_filename that doesn't screw up with UTF-8.
authorCarl Hetherington <cth@carlh.net>
Fri, 30 Sep 2016 08:35:17 +0000 (09:35 +0100)
committerCarl Hetherington <cth@carlh.net>
Fri, 30 Sep 2016 08:35:17 +0000 (09:35 +0100)
src/lib/util.cc
test/util_test.cc

index 0b300147d9473134a0a1ca7b12c5acbe5d9ac57a..00f36f2178b495b85e480b7d1188f8a03d1d1281 100644 (file)
@@ -53,6 +53,7 @@ extern "C" {
 #include <glib.h>
 #include <pangomm/init.h>
 #include <boost/algorithm/string.hpp>
+#include <boost/range/algorithm/replace_if.hpp>
 #include <boost/thread.hpp>
 #include <boost/filesystem.hpp>
 #ifdef DCPOMATIC_WINDOWS
@@ -567,16 +568,8 @@ valid_j2k_file (boost::filesystem::path f)
 string
 tidy_for_filename (string f)
 {
-       string t;
-       for (size_t i = 0; i < f.length(); ++i) {
-               if (isalnum (f[i]) || f[i] == '_' || f[i] == '-') {
-                       t += f[i];
-               } else {
-                       t += '_';
-               }
-       }
-
-       return t;
+       boost::replace_if (f, boost::is_any_of ("\\/:"), '_');
+       return f;
 }
 
 dcp::Size
index d1f6c77d54994010931daaced282108e93673c7d..6abc9b5e727273ca9a250939efc287e26d1e584f 100644 (file)
@@ -86,3 +86,11 @@ BOOST_AUTO_TEST_CASE (seconds_to_approximate_hms_test)
        BOOST_CHECK_EQUAL (seconds_to_approximate_hms (3600 + 40 * 60), "1h 40m");
        BOOST_CHECK_EQUAL (seconds_to_approximate_hms (13 * 3600 + 40 * 60), "14h");
 }
+
+BOOST_AUTO_TEST_CASE (tidy_for_filename_test)
+{
+       BOOST_CHECK_EQUAL (tidy_for_filename ("fish\\chips"), "fish_chips");
+       BOOST_CHECK_EQUAL (tidy_for_filename ("fish:chips\\"), "fish_chips_");
+       BOOST_CHECK_EQUAL (tidy_for_filename ("fish/chips\\"), "fish_chips_");
+       BOOST_CHECK_EQUAL (tidy_for_filename ("abcdefghï"), "abcdefghï");
+}