[gnome-contacts] Remove accents etc when searching



commit 39b2359803eceed96151cbe9f930f921880618a0
Author: Alexander Larsson <alexl redhat com>
Date:   Tue Sep 13 17:13:36 2011 +0200

    Remove accents etc when searching
    
    Fixes bug #658050

 src/contacts-contact.vala     |    6 +++---
 src/contacts-link-dialog.vala |    2 +-
 src/contacts-list-pane.vala   |    2 +-
 src/contacts-utils.vala       |   30 ++++++++++++++++++++++++++++++
 vapi/custom.vapi              |    6 ++++++
 5 files changed, 41 insertions(+), 5 deletions(-)
---
diff --git a/src/contacts-contact.vala b/src/contacts-contact.vala
index aa3b357..24f8712 100644
--- a/src/contacts-contact.vala
+++ b/src/contacts-contact.vala
@@ -766,15 +766,15 @@ public class Contacts.Contact : GLib.Object  {
   private void update_filter_data () {
     var builder = new StringBuilder ();
     if (individual.alias != null) {
-      builder.append (individual.alias.casefold ());
+      builder.append (Utils.canonicalize_for_search (individual.alias));
       builder.append_unichar (' ');
     }
     if (individual.full_name != null) {
-      builder.append (individual.full_name.casefold ());
+      builder.append (Utils.canonicalize_for_search (individual.full_name));
       builder.append_unichar (' ');
     }
     if (individual.nickname != null) {
-      builder.append (individual.nickname.casefold ());
+      builder.append (Utils.canonicalize_for_search (individual.nickname));
       builder.append_unichar (' ');
     }
     var im_addresses = individual.im_addresses;
diff --git a/src/contacts-link-dialog.vala b/src/contacts-link-dialog.vala
index 2d81e5e..cc46623 100644
--- a/src/contacts-link-dialog.vala
+++ b/src/contacts-link-dialog.vala
@@ -206,7 +206,7 @@ public class Contacts.LinkDialog : Dialog {
     if (str.length == 0)
       values = null;
     else {
-      str = str.casefold();
+      str = Utils.canonicalize_for_search (str);
       values = str.split(" ");
     }
 
diff --git a/src/contacts-list-pane.vala b/src/contacts-list-pane.vala
index 5b253b3..0da3ce7 100644
--- a/src/contacts-list-pane.vala
+++ b/src/contacts-list-pane.vala
@@ -39,7 +39,7 @@ public class Contacts.ListPane : Frame {
     if (str.length == 0)
       values = null;
     else {
-      str = str.casefold();
+      str = Utils.canonicalize_for_search (str);
       values = str.split(" ");
     }
 
diff --git a/src/contacts-utils.vala b/src/contacts-utils.vala
index dc5dd3d..6f407f6 100644
--- a/src/contacts-utils.vala
+++ b/src/contacts-utils.vala
@@ -158,4 +158,34 @@ public class Contacts.Utils : Object {
 		    radius,
 		    Math.PI / 2, Math.PI);
   }
+
+  private static unichar strip_char (unichar ch) {
+    switch (ch.type ()) {
+    case UnicodeType.CONTROL:
+    case UnicodeType.FORMAT:
+    case UnicodeType.UNASSIGNED:
+    case UnicodeType.NON_SPACING_MARK:
+    case UnicodeType.COMBINING_MARK:
+    case UnicodeType.ENCLOSING_MARK:
+      /* Ignore those */
+      return 0;
+    default:
+      return ch.tolower ();
+    }
+  }
+
+  public static string canonicalize_for_search (string str) {
+    unowned string s;
+    var buf = new unichar[18];
+    var res = new StringBuilder ();
+    for (s = str; s[0] != 0; s = s.next_char ()) {
+      var c = strip_char (s.get_char ());
+      if (c != 0) {
+	var size = LocalGLib.fully_decompose (c, true, buf);
+	if (size > 0)
+	  res.append_unichar (buf[0]);
+      }
+    }
+    return res.str;
+  }
 }
diff --git a/vapi/custom.vapi b/vapi/custom.vapi
index 73f0a5f..da3b2d6 100644
--- a/vapi/custom.vapi
+++ b/vapi/custom.vapi
@@ -16,3 +16,9 @@ namespace Gnome {
 		LARGE
 	}
 }
+
+[CCode (cprefix = "G", lower_case_cprefix = "g_", cheader_filename = "glib.h", gir_namespace = "GLib", gir_version = "2.0")]
+namespace LocalGLib {
+	[CCode (cname = "g_unichar_fully_decompose", cheader_filename = "glib.h")]
+	public static unowned size_t fully_decompose (unichar ch, bool compat, unichar[] result);
+}



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]