6a44a4c
Index: lib/alexandria/ui/sidepane.rb
6a44a4c
===================================================================
6a44a4c
--- lib/alexandria/ui/sidepane.rb	(revision 1012)
6a44a4c
+++ lib/alexandria/ui/sidepane.rb	(revision 1021)
6a44a4c
@@ -19,18 +19,42 @@
6a44a4c
         x and x.name != @parent.selected_library.name
6a44a4c
       end
6a44a4c
 
6a44a4c
-      def contains_illegal_character new_text
6a44a4c
-        /([^\w\s'"()&?!:;.\-])/.match(new_text)
6a44a4c
+      # if new_text is invalid utf-8, returns true
6a44a4c
+      # if new_text contains disallowed char (/ or initial .), returns a MatchData object
6a44a4c
+      # otherwise returns nil
6a44a4c
+      def contains_illegal_character(new_text)
6a44a4c
+        begin
6a44a4c
+          new_text.unpack("U*") # attempt to unpack as UTF-8 characters
6a44a4c
+          match = /(^\.|\/)/.match(new_text)
6a44a4c
+          # forbid / character (since Library names become dir names)
6a44a4c
+          # also no initial . since that hides the Library (hidden file)
6a44a4c
+          #      forbidding an initial dot also disallows "." and ".."
6a44a4c
+          #      which are of course pre-existing directories.
6a44a4c
+          return match
6a44a4c
+        rescue Exception => ex
6a44a4c
+          log.warn { "New library name not valid UTF-8: #{ex.message}" }
6a44a4c
+          return true
6a44a4c
+        end
6a44a4c
+        # /([^\w\s'"()&?!:;.\-])/.match(new_text) # anglocentric!
6a44a4c
       end
6a44a4c
 
6a44a4c
       def on_edited_library cell, path_string, new_text
6a44a4c
-        log.debug { "edited" }
6a44a4c
+        log.debug { "edited library name #{new_text}" }
6a44a4c
+        ## new_text = new_text.reverse # for testing; 
6a44a4c
+                                       # a great way to generate broken UTF-8
6a44a4c
         if cell.text != new_text
6a44a4c
           if match = contains_illegal_character(new_text)
6a44a4c
-            log.debug { "Illegal character" }
6a44a4c
-            ErrorDialog.new(@main_app, _("Invalid library name '%s'") % new_text,
6a44a4c
-              _("The name provided contains the " + "illegal character '%s'.") %
6a44a4c
-            match[1].gsub(/&/, "&"))
6a44a4c
+            if match.instance_of? MatchData
6a44a4c
+              chars = match[1].gsub(/&/, "&")
6a44a4c
+              ErrorDialog.new(@main_app, _("Invalid library name '%s'") % new_text,
6a44a4c
+                              _("The name provided contains the " +
6a44a4c
+                                "disallowed character %s ") % chars)
6a44a4c
+            else
6a44a4c
+              ErrorDialog.new(@main_app, _("Invalid library name"),
6a44a4c
+                              _("The name provided contains " + 
6a44a4c
+                                "invalid characters."))
6a44a4c
+            end
6a44a4c
+
6a44a4c
           elsif new_text.strip.empty?
6a44a4c
             log.debug { "Empty text" }
6a44a4c
             ErrorDialog.new(@main_app, _("The library name " +