Mercurial > hg > config
comparison 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 |
comparison
equal
deleted
inserted
replaced
| -1:000000000000 | 0:f3ab51c79813 |
|---|---|
| 1 #!/usr/bin/python | |
| 2 | |
| 3 import sys, os | |
| 4 | |
| 5 KEY_RETURN=""" | |
| 6 """ | |
| 7 | |
| 8 class ClearSilver(object): | |
| 9 """ | |
| 10 a blatant rip-off of quicksilver/katapult | |
| 11 """ | |
| 12 def __init__(self, startswith=''): | |
| 13 self.matches = {} | |
| 14 self.sortable = True | |
| 15 if startswith: | |
| 16 self.build_matches(startswith) | |
| 17 | |
| 18 def returnmatch(self): | |
| 19 keys = self.matches.keys() | |
| 20 if len(keys) == 1: | |
| 21 return keys[0], self.matches[keys[0]] | |
| 22 if self.sortable: | |
| 23 keys.sort() | |
| 24 return keys | |
| 25 | |
| 26 def find_matches(self, startswith): | |
| 27 nixlist = [] | |
| 28 for i in self.matches: | |
| 29 if not i.startswith(startswith): | |
| 30 nixlist.append(i) | |
| 31 | |
| 32 for i in nixlist: | |
| 33 self.matches.pop(i) | |
| 34 | |
| 35 return self.returnmatch() | |
| 36 | |
| 37 | |
| 38 class PATHsilver(ClearSilver): | |
| 39 | |
| 40 def build_matches(self, startswith=''): | |
| 41 path = os.environ['PATH'].split(':') | |
| 42 path.reverse() | |
| 43 for directory in path: | |
| 44 try: | |
| 45 for binary in os.listdir(directory): | |
| 46 if binary.startswith(startswith): | |
| 47 self.matches[binary] = '/'.join((directory,binary)) | |
| 48 except OSError: # directory not found | |
| 49 continue | |
| 50 return self.returnmatch() | |
| 51 | |
| 52 | |
| 53 def exec_match(self, key): | |
| 54 item = self.matches[key] | |
| 55 os.execl(item, item) | |
| 56 | |
| 57 | |
| 58 class Wordsilver(ClearSilver): | |
| 59 dictfile = '/usr/share/dict/cracklib-small' | |
| 60 | |
| 61 def build_matches(self, startswith=''): | |
| 62 f = file(self.dictfile, 'r') | |
| 63 for i in f.readlines(): | |
| 64 if i.startswith(startswith): | |
| 65 i = i.rstrip('\r\n') | |
| 66 self.matches[i] = i | |
| 67 return self.returnmatch() | |
| 68 | |
| 69 def exec_match(self, key): | |
| 70 item = self.matches[key] | |
| 71 print key | |
| 72 | |
| 73 class BookmarkSilver(ClearSilver): | |
| 74 def __init__(self, startswith=''): | |
| 75 ClearSilver.__init__(self) | |
| 76 self.sortable = False | |
| 77 if startswith: | |
| 78 self.build_matches(startswith) | |
| 79 | |
| 80 def add_url(self, i, startswith): | |
| 81 delimiter = '//' | |
| 82 j = i[i.index(delimiter) + len(delimiter):] | |
| 83 j = j.rstrip('/') | |
| 84 if j.startswith(startswith): | |
| 85 self.matches[j] = i | |
| 86 j = j.strip('w.') | |
| 87 if j.startswith(startswith): | |
| 88 self.matches[j] = i | |
| 89 | |
| 90 def build_matches(self, startswith=''): | |
| 91 # find the firefox files | |
| 92 firefoxdir = '/'.join((os.environ['HOME'], '.mozilla', 'firefox')) | |
| 93 profile = file('/'.join((firefoxdir, 'profiles.ini')), 'r').readlines() | |
| 94 profile = [i.rstrip('\n\r \t') for i in profile] | |
| 95 index = profile.index('Name=default') | |
| 96 delimiter = 'Path=' | |
| 97 while 1: | |
| 98 index += 1 | |
| 99 if profile[index].startswith(delimiter): | |
| 100 profile = '/'.join((firefoxdir, profile[index][len(delimiter):])) | |
| 101 break | |
| 102 bookmarks = '/'.join((profile, 'bookmarks.html')) | |
| 103 history = '/'.join((profile, 'history.dat')) | |
| 104 import re | |
| 105 history = file(history, 'r').read() | |
| 106 history = re.findall('http.*//.*\)', history) | |
| 107 history.reverse() | |
| 108 for i in history: | |
| 109 i = i[:i.index(')')] | |
| 110 self.add_url(i, startswith) | |
| 111 | |
| 112 bookmarks = file(bookmarks, 'r').read() | |
| 113 bookmarks = re.findall('"http.*//.*"', bookmarks) | |
| 114 | |
| 115 for i in bookmarks: | |
| 116 i = i.strip('"') | |
| 117 i = i[:i.index('"')] | |
| 118 self.add_url(i, startswith) | |
| 119 | |
| 120 return self.returnmatch() | |
| 121 | |
| 122 def exec_match(self, key): | |
| 123 item = self.matches[key] | |
| 124 | |
| 125 os.system("firefox " + item) | |
| 126 | |
| 127 if __name__ == '__main__': | |
| 128 | |
| 129 matcher_type = 'PATHsilver' | |
| 130 | |
| 131 # parse options | |
| 132 options = { 'D' : 'Wordsilver', 'H' : 'BookmarkSilver' } | |
| 133 for i in sys.argv[1:]: | |
| 134 i = i.strip('-') | |
| 135 if options.has_key(i): | |
| 136 matcher_type = options[i] | |
| 137 | |
| 138 # init the 'GUI' | |
| 139 import curses | |
| 140 stdscr = curses.initscr() | |
| 141 curses.noecho() | |
| 142 curses.cbreak() | |
| 143 stdscr.keypad(1) | |
| 144 | |
| 145 try: | |
| 146 # XXX should include colors at some point -- not right now, though | |
| 147 # curses.init_pair(1, curses.COLOR_RED, curses.COLOR_WHITE) | |
| 148 | |
| 149 c = '' | |
| 150 matcher = None | |
| 151 matches = None | |
| 152 entered='' | |
| 153 | |
| 154 while 1: | |
| 155 y, x = stdscr.getmaxyx() | |
| 156 stdscr.refresh() | |
| 157 c = stdscr.getch() | |
| 158 stdscr.erase() | |
| 159 | |
| 160 # handle backspaces | |
| 161 if c == curses.KEY_BACKSPACE or c == 127: | |
| 162 entered = entered[:-1] | |
| 163 matcher = None | |
| 164 matches = None | |
| 165 else: | |
| 166 | |
| 167 try: | |
| 168 c = chr(c) | |
| 169 except ValueError: | |
| 170 continue | |
| 171 | |
| 172 if c == KEY_RETURN: | |
| 173 break | |
| 174 | |
| 175 entered += c | |
| 176 | |
| 177 if not matcher: | |
| 178 matcher = eval(matcher_type + "()") | |
| 179 matches = matcher.build_matches(entered) | |
| 180 else: | |
| 181 | |
| 182 if c.isdigit() and int(c) < min(10, len(matches)): | |
| 183 for i in matches: | |
| 184 if i.startswith(entered): | |
| 185 break | |
| 186 else: | |
| 187 matches = matches[int(c):int(c)+1] | |
| 188 break | |
| 189 | |
| 190 matches = matcher.find_matches(entered) | |
| 191 | |
| 192 | |
| 193 if isinstance(matches, list): | |
| 194 i=1 | |
| 195 for match in matches: | |
| 196 if i >= y: continue | |
| 197 if i <= 10: | |
| 198 numstr = " :" + str(i-1) | |
| 199 else: | |
| 200 numstr = "" | |
| 201 stdscr.addstr(i,0, match + numstr) | |
| 202 i += 1 | |
| 203 stdscr.addstr(0,0, entered) | |
| 204 | |
| 205 if matches: stdscr.addstr(1,0, matches[0] + " :0") | |
| 206 else: | |
| 207 stdscr.addstr(0,0,entered + " -> " + matches[1]) | |
| 208 | |
| 209 finally: | |
| 210 # 'GUI' cleanup | |
| 211 curses.nocbreak() | |
| 212 stdscr.keypad(0) | |
| 213 curses.echo() | |
| 214 curses.endwin() | |
| 215 | |
| 216 # execute the program (if found) | |
| 217 if not matches: | |
| 218 sys.exit(1) | |
| 219 matcher.exec_match(matches[0]) | |
| 220 | |
| 221 |
