diff options
author | louiz@4325f9fc-e183-4c21-96ce-0ab188b42d13 <louiz@4325f9fc-e183-4c21-96ce-0ab188b42d13> | 2010-11-11 05:24:43 +0000 |
---|---|---|
committer | louiz@4325f9fc-e183-4c21-96ce-0ab188b42d13 <louiz@4325f9fc-e183-4c21-96ce-0ab188b42d13> | 2010-11-11 05:24:43 +0000 |
commit | 8bdab491458d0aef2d7552ef826332db4096ab61 (patch) | |
tree | 3dbf783694c159bd2ca9ad61e431b94629f82eed | |
parent | d502f4a525bd2eabb6f6ef2c19128318f6423953 (diff) | |
download | poezio-8bdab491458d0aef2d7552ef826332db4096ab61.tar.gz poezio-8bdab491458d0aef2d7552ef826332db4096ab61.tar.bz2 poezio-8bdab491458d0aef2d7552ef826332db4096ab61.tar.xz poezio-8bdab491458d0aef2d7552ef826332db4096ab61.zip |
roster search now uses difflib
-rw-r--r-- | src/tab.py | 26 |
1 files changed, 23 insertions, 3 deletions
@@ -31,6 +31,9 @@ log = logging.getLogger(__name__) import window import theme import curses +import difflib + +from sleekxmpp.xmlstream.stanzabase import JID from config import config from roster import RosterGroup, roster from contact import Contact, Resource @@ -481,7 +484,6 @@ class RosterInfoTab(Tab): self._color_state = theme.COLOR_TAB_NORMAL def on_gain_focus(self): - log.debug('on_gain_focus\n') self._color_state = theme.COLOR_TAB_CURRENT curses.curs_set(0) @@ -617,12 +619,30 @@ class ConversationTab(Tab): def on_close(self): return +def diffmatch(search, string): + """ + Use difflib and a loop to check if search_pattern can + be 'almost' found INSIDE a string. + 'almost' being defined by difflib + """ + l = len(search) + ratio = 0.7 + for i in range(len(string) - l + 1): + if difflib.SequenceMatcher(None, search, string[i:i+l]).ratio() >= ratio: + return True + return False + def jid_and_name_match(contact, txt): """ A function used to know if a contact in the roster should be shown in the roster """ - # TODO: search in nickname, and use libdiff - if txt in contact.get_bare_jid(): + ratio = 0.7 + if not txt: + return True # Everything matches when search is empty + user = JID(contact.get_bare_jid()).user + if diffmatch(txt, user): + return True + if contact.get_name() and diffmatch(txt, contact.get_name()): return True return False |