diff python/clearsilver.py @ 0:f3ab51c79813

adding configuration from https://svn.openplans.org/svn/config_jhammel/
author k0s <k0scist@gmail.com>
date Thu, 15 Oct 2009 11:41:26 -0400
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/python/clearsilver.py	Thu Oct 15 11:41:26 2009 -0400
@@ -0,0 +1,221 @@
+#!/usr/bin/python
+
+import sys, os
+
+KEY_RETURN="""
+"""
+
+class ClearSilver(object):
+    """
+    a blatant rip-off of quicksilver/katapult
+    """
+    def __init__(self, startswith=''):
+        self.matches = {}
+        self.sortable = True
+        if startswith:
+            self.build_matches(startswith)
+
+    def returnmatch(self):
+        keys = self.matches.keys()
+        if len(keys) == 1:
+            return keys[0], self.matches[keys[0]]
+        if self.sortable:
+            keys.sort()
+        return keys
+
+    def find_matches(self, startswith):
+        nixlist = []
+        for i in self.matches:
+            if not i.startswith(startswith):
+                nixlist.append(i)
+
+        for i in nixlist:
+            self.matches.pop(i)
+            
+        return self.returnmatch()
+        
+
+class PATHsilver(ClearSilver):    
+
+    def build_matches(self, startswith=''):
+        path = os.environ['PATH'].split(':')
+        path.reverse()
+        for directory in path:
+            try:
+                for binary in os.listdir(directory):
+                    if binary.startswith(startswith):
+                        self.matches[binary] = '/'.join((directory,binary))
+            except OSError:  # directory not found
+                continue
+        return self.returnmatch()
+
+
+    def exec_match(self, key):
+        item = self.matches[key]
+        os.execl(item, item)
+      
+
+class Wordsilver(ClearSilver):
+    dictfile = '/usr/share/dict/cracklib-small'
+    
+    def build_matches(self, startswith=''):
+        f = file(self.dictfile, 'r')
+        for i in f.readlines():
+            if i.startswith(startswith):
+                i = i.rstrip('\r\n')
+                self.matches[i] = i
+        return self.returnmatch()
+
+    def exec_match(self, key):        
+        item = self.matches[key]
+        print key
+
+class BookmarkSilver(ClearSilver):
+    def __init__(self, startswith=''):
+        ClearSilver.__init__(self)
+        self.sortable = False
+        if startswith:
+            self.build_matches(startswith)
+            
+    def add_url(self, i, startswith):
+        delimiter = '//'
+        j = i[i.index(delimiter) + len(delimiter):]
+        j = j.rstrip('/')
+        if j.startswith(startswith):
+            self.matches[j] = i
+            j = j.strip('w.')
+        if j.startswith(startswith):
+            self.matches[j] = i
+            
+    def build_matches(self, startswith=''):
+        # find the firefox files
+        firefoxdir = '/'.join((os.environ['HOME'], '.mozilla', 'firefox'))
+        profile = file('/'.join((firefoxdir, 'profiles.ini')), 'r').readlines()
+        profile = [i.rstrip('\n\r \t')  for i in profile]
+        index = profile.index('Name=default')
+        delimiter = 'Path='
+        while 1:
+            index += 1
+            if profile[index].startswith(delimiter):
+                profile = '/'.join((firefoxdir, profile[index][len(delimiter):]))
+                break
+        bookmarks = '/'.join((profile, 'bookmarks.html'))
+        history = '/'.join((profile, 'history.dat'))
+        import re
+        history = file(history, 'r').read()
+        history = re.findall('http.*//.*\)', history)
+        history.reverse()
+        for i in history:
+            i = i[:i.index(')')]
+            self.add_url(i, startswith)
+
+        bookmarks = file(bookmarks, 'r').read()
+        bookmarks = re.findall('"http.*//.*"', bookmarks)
+
+        for i in bookmarks:
+            i = i.strip('"')
+            i = i[:i.index('"')]
+            self.add_url(i, startswith)
+
+        return self.returnmatch()
+
+    def exec_match(self, key):
+        item = self.matches[key]
+        
+        os.system("firefox " + item)
+
+if __name__ == '__main__':
+
+    matcher_type = 'PATHsilver'
+
+    # parse options
+    options = { 'D' : 'Wordsilver', 'H' : 'BookmarkSilver' }
+    for i in sys.argv[1:]:
+        i = i.strip('-')
+        if options.has_key(i):
+            matcher_type = options[i]
+
+    # init the 'GUI'
+    import curses
+    stdscr = curses.initscr()
+    curses.noecho()
+    curses.cbreak()
+    stdscr.keypad(1)
+
+    try:
+# XXX should include colors at some point -- not right now, though
+#        curses.init_pair(1, curses.COLOR_RED, curses.COLOR_WHITE)
+
+        c = ''
+        matcher = None
+        matches = None
+        entered=''
+        
+        while 1:
+            y, x = stdscr.getmaxyx()
+            stdscr.refresh()
+            c = stdscr.getch()
+            stdscr.erase()
+
+            # handle backspaces 
+            if c == curses.KEY_BACKSPACE or c == 127:
+                entered = entered[:-1]
+                matcher = None
+                matches = None
+            else:
+                
+                try:
+                    c = chr(c)
+                except ValueError:
+                    continue
+                
+                if c == KEY_RETURN:
+                    break
+            
+                entered += c
+                
+            if not matcher:
+                matcher = eval(matcher_type + "()")
+                matches = matcher.build_matches(entered)
+            else:
+                
+                if c.isdigit() and int(c) < min(10, len(matches)):        
+                    for i in matches:
+                        if i.startswith(entered):
+                            break
+                    else:
+                        matches = matches[int(c):int(c)+1]
+                        break
+
+                matches = matcher.find_matches(entered)
+
+                
+            if isinstance(matches, list):
+                i=1
+                for match in matches:
+                    if i >= y: continue
+                    if i <= 10:
+                        numstr = " :" + str(i-1)
+                    else:
+                        numstr = ""
+                    stdscr.addstr(i,0, match + numstr)
+                    i += 1
+                stdscr.addstr(0,0, entered)
+
+                if matches: stdscr.addstr(1,0, matches[0] + " :0")
+            else:
+                stdscr.addstr(0,0,entered + " -> " + matches[1])
+
+    finally:
+        # 'GUI' cleanup
+        curses.nocbreak()
+        stdscr.keypad(0)
+        curses.echo()
+        curses.endwin()
+        
+        # execute the program (if found)
+        if not matches:
+            sys.exit(1)
+        matcher.exec_match(matches[0])
+                    
+