Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorManuel Quiñones <manuq@laptop.org>2012-10-09 18:36:23 (GMT)
committer Manuel Quiñones <manuq@laptop.org>2012-10-09 20:47:08 (GMT)
commit6d72b348e091a8fb0775297da4cf0d86cc4c8ddd (patch)
treeed69eb5084e674a5608a542a3f1a5e40709e7a1e
parent536204c2a3f742a3d62c0c94e975c3a47ce6c12f (diff)
Improve search in views normalizing the strings - SL #3588
Add a normalize.py file to the jarabe/util directory with a normalize_string method inside. Before calling it, we have to decode the strings returned by Gtk to Unicode in UTF8, because we use Python2. When we switch to Python3 this decodification will not be needed [1] [2] . [1] http://python-gtk-3-tutorial.readthedocs.org/en/latest/unicode.html [2] https://mail.gnome.org/archives/python-hackers-list/2012-June/msg00012.html Signed-off-by: Manuel Quiñones <manuq@laptop.org> Acked-by: Simon Schampijer <simon@laptop.org>
-rw-r--r--src/jarabe/desktop/Makefile.am3
-rw-r--r--src/jarabe/desktop/activitieslist.py6
-rw-r--r--src/jarabe/desktop/favoritesview.py6
-rw-r--r--src/jarabe/desktop/groupbox.py3
-rw-r--r--src/jarabe/desktop/homebox.py3
-rw-r--r--src/jarabe/desktop/meshbox.py5
-rw-r--r--src/jarabe/desktop/networkviews.py4
-rw-r--r--src/jarabe/util/normalize.py30
-rw-r--r--src/jarabe/view/buddyicon.py5
9 files changed, 54 insertions, 11 deletions
diff --git a/src/jarabe/desktop/Makefile.am b/src/jarabe/desktop/Makefile.am
index e27bc9c..8150db8 100644
--- a/src/jarabe/desktop/Makefile.am
+++ b/src/jarabe/desktop/Makefile.am
@@ -16,4 +16,5 @@ sugar_PYTHON = \
snowflakelayout.py \
transitionbox.py \
viewcontainer.py \
- viewtoolbar.py
+ viewtoolbar.py \
+ tools.py
diff --git a/src/jarabe/desktop/activitieslist.py b/src/jarabe/desktop/activitieslist.py
index 3b07e87..4d2eb1a 100644
--- a/src/jarabe/desktop/activitieslist.py
+++ b/src/jarabe/desktop/activitieslist.py
@@ -36,6 +36,7 @@ from sugar3.graphics.alert import Alert
from jarabe.model import bundleregistry
from jarabe.view.palettes import ActivityPalette
from jarabe.journal import misc
+from jarabe.util.normalize import normalize_string
class ActivitiesTreeView(Gtk.TreeView):
@@ -153,14 +154,15 @@ class ActivitiesTreeView(Gtk.TreeView):
of matching activities.
"""
- self._query = query.lower()
+ self._query = normalize_string(query.decode('utf-8'))
self.get_model().refilter()
matches = self.get_model().iter_n_children(None)
return matches
def __model_visible_cb(self, model, tree_iter, data):
title = model[tree_iter][ListModel.COLUMN_TITLE]
- return title is not None and title.lower().find(self._query) > -1
+ title = normalize_string(title.decode('utf-8'))
+ return title is not None and title.find(self._query) > -1
class ListModel(Gtk.TreeModelSort):
diff --git a/src/jarabe/desktop/favoritesview.py b/src/jarabe/desktop/favoritesview.py
index aae745a..7f5b160 100644
--- a/src/jarabe/desktop/favoritesview.py
+++ b/src/jarabe/desktop/favoritesview.py
@@ -50,6 +50,7 @@ from jarabe.desktop import schoolserver
from jarabe.desktop.schoolserver import RegisterError
from jarabe.desktop import favoriteslayout
from jarabe.desktop.viewcontainer import ViewContainer
+from jarabe.util.normalize import normalize_string
_logger = logging.getLogger('FavoritesView')
@@ -312,8 +313,9 @@ class FavoritesView(ViewContainer):
query = query.strip()
for icon in self.get_children():
if icon not in [self._owner_icon, self._activity_icon]:
- activity_name = icon.get_activity_name().lower()
- if activity_name.find(query) > -1:
+ activity_name = icon.get_activity_name().decode('utf-8')
+ normalized_name = normalize_string(activity_name)
+ if normalized_name.find(query) > -1:
icon.alpha = 1.0
else:
icon.alpha = 0.33
diff --git a/src/jarabe/desktop/groupbox.py b/src/jarabe/desktop/groupbox.py
index f916f62..91c9cb5 100644
--- a/src/jarabe/desktop/groupbox.py
+++ b/src/jarabe/desktop/groupbox.py
@@ -24,6 +24,7 @@ from jarabe.model import friends
from jarabe.desktop.friendview import FriendView
from jarabe.desktop.viewcontainer import ViewContainer
from jarabe.desktop.favoriteslayout import SpreadLayout
+from jarabe.util.normalize import normalize_string
class GroupBox(ViewContainer):
@@ -69,7 +70,7 @@ class GroupBox(ViewContainer):
icon.destroy()
def _toolbar_query_changed_cb(self, toolbar, query):
- self._query = query.lower()
+ self._query = normalize_string(query.decode('utf-8'))
for icon in self.get_children():
if hasattr(icon, 'set_filter'):
icon.set_filter(self._query)
diff --git a/src/jarabe/desktop/homebox.py b/src/jarabe/desktop/homebox.py
index ed5144b..b87c345 100644
--- a/src/jarabe/desktop/homebox.py
+++ b/src/jarabe/desktop/homebox.py
@@ -27,6 +27,7 @@ from sugar3.graphics.icon import Icon
from jarabe.desktop import favoritesview
from jarabe.desktop.activitieslist import ActivitiesList
+from jarabe.util.normalize import normalize_string
_FAVORITES_VIEW = 0
_LIST_VIEW = 1
@@ -100,7 +101,7 @@ class HomeBox(Gtk.VBox):
panel.set_section_view_auto_close()
def __toolbar_query_changed_cb(self, toolbar, query):
- self._query = query.lower()
+ self._query = normalize_string(query.decode('utf-8'))
self._list_view.set_filter(self._query)
self._favorites_box.set_filter(self._query)
diff --git a/src/jarabe/desktop/meshbox.py b/src/jarabe/desktop/meshbox.py
index e1c8381..24d445c 100644
--- a/src/jarabe/desktop/meshbox.py
+++ b/src/jarabe/desktop/meshbox.py
@@ -32,15 +32,16 @@ from sugar3.graphics import style
from sugar3.graphics import palette
from sugar3.graphics.menuitem import MenuItem
-from jarabe.desktop.snowflakelayout import SnowflakeLayout
from jarabe.model import neighborhood
from jarabe.model.buddy import get_owner_instance
from jarabe.view.buddyicon import BuddyIcon
+from jarabe.desktop.snowflakelayout import SnowflakeLayout
from jarabe.desktop.networkviews import WirelessNetworkView
from jarabe.desktop.networkviews import OlpcMeshView
from jarabe.desktop.networkviews import SugarAdhocView
from jarabe.desktop.viewcontainer import ViewContainer
from jarabe.desktop.favoriteslayout import SpreadLayout
+from jarabe.util.normalize import normalize_string
from jarabe.model import network
from jarabe.model.network import AccessPoint
from jarabe.model.olpcmesh import OlpcMeshManager
@@ -588,7 +589,7 @@ class MeshBox(ViewContainer):
net.props.paused = False
def _toolbar_query_changed_cb(self, toolbar, query):
- self._query = query.lower()
+ self._query = normalize_string(query.decode('utf-8'))
for icon in self.get_children():
if hasattr(icon, 'set_filter'):
icon.set_filter(self._query)
diff --git a/src/jarabe/desktop/networkviews.py b/src/jarabe/desktop/networkviews.py
index c949b7e..65d478e 100644
--- a/src/jarabe/desktop/networkviews.py
+++ b/src/jarabe/desktop/networkviews.py
@@ -35,6 +35,7 @@ from sugar3 import profile
from jarabe.view.pulsingicon import EventPulsingIcon
from jarabe.desktop import keydialog
+from jarabe.util.normalize import normalize_string
from jarabe.model import network
from jarabe.model.network import Settings
from jarabe.model.network import IP4Config
@@ -369,7 +370,8 @@ class WirelessNetworkView(EventPulsingIcon):
self.get_first_ap().model)
def set_filter(self, query):
- self._filtered = self._display_name.lower().find(query) == -1
+ normalized_name = normalize_string(self._display_name.decode('utf-8'))
+ self._filtered = normalized_name.find(query) == -1
self._update_icon()
self._update_color()
diff --git a/src/jarabe/util/normalize.py b/src/jarabe/util/normalize.py
new file mode 100644
index 0000000..f87d356
--- /dev/null
+++ b/src/jarabe/util/normalize.py
@@ -0,0 +1,30 @@
+# -*- coding: utf-8 -*-
+# Copyright (C) 2012 One Laptop Per Child
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+from unicodedata import normalize
+
+def normalize_string(unicode_string):
+ u"""Return unicode_string normalized for searching.
+
+ >>> normalize_string(u'Mónica Viñao')
+ 'monica vinao'
+
+ >>> normalize_string(u'Ábaco')
+ 'abaco'
+
+ """
+ return normalize('NFKD', unicode_string).encode('ASCII', 'ignore').lower()
diff --git a/src/jarabe/view/buddyicon.py b/src/jarabe/view/buddyicon.py
index 59c3690..e28fc14 100644
--- a/src/jarabe/view/buddyicon.py
+++ b/src/jarabe/view/buddyicon.py
@@ -19,6 +19,7 @@ from sugar3.graphics.palette import Palette
from sugar3.graphics.icon import EventIcon
from jarabe.view.buddymenu import BuddyMenu
+from jarabe.util.normalize import normalize_string
_FILTERED_ALPHA = 0.33
@@ -68,6 +69,8 @@ class BuddyIcon(EventIcon):
palette.props.icon.props.xo_color = self._buddy.get_color()
def set_filter(self, query):
- self._filtered = (self._buddy.get_nick().lower().find(query) == -1) \
+ normalized_name = normalize_string(
+ self._buddy.get_nick().decode('utf-8'))
+ self._filtered = (normalized_name.find(query) == -1) \
and not self._buddy.is_owner()
self._update_color()