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