Mercurial > hg > config
comparison python/smartopen.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 """ smart open the data passed in """ | |
4 | |
5 import urllib | |
6 import urllib2 | |
7 import sys | |
8 import os | |
9 import address | |
10 | |
11 class Location: | |
12 """ | |
13 generic class for locations | |
14 """ | |
15 | |
16 def __init__(self, baseurl=""): | |
17 self.baseurl = baseurl | |
18 | |
19 def url(self, query): | |
20 return self.baseurl + self.process(query) | |
21 | |
22 def process(self, query): | |
23 return query | |
24 | |
25 def test(self, query): | |
26 return True | |
27 | |
28 def open(self, query): | |
29 if not self.test(query): | |
30 return False | |
31 url = self.url(query) | |
32 os.system("firefox '%s'" % url) | |
33 return True | |
34 | |
35 class URL(Location): | |
36 """a straight URL""" | |
37 | |
38 def process(self, query): | |
39 if '://' in query: | |
40 return query | |
41 return 'http://' + query | |
42 | |
43 def test(self, query): | |
44 """try to open the url""" | |
45 | |
46 if ' ' in query or '\n' in query: | |
47 return False | |
48 | |
49 try: | |
50 site = urllib.urlopen(self.process(query)) | |
51 except IOError: | |
52 return False | |
53 return True | |
54 | |
55 class GoogleMap(Location): | |
56 """try to google-maps the address""" | |
57 | |
58 def __init__(self): | |
59 gmapsurl='http://maps.google.com/maps?f=q&hl=en&q=' | |
60 Location.__init__(self, gmapsurl) | |
61 | |
62 def process(self, query): | |
63 theaddress = address.normalizeaddress(query) | |
64 if not theaddress: | |
65 return theaddress | |
66 return urllib.quote_plus(theaddress) | |
67 | |
68 def test(self, query): | |
69 return bool(self.process(query)) | |
70 | |
71 class Revision(Location): | |
72 def __init__(self): | |
73 revision_url = 'http://trac.openplans.org/openplans/changeset/' | |
74 Location.__init__(self, revision_url) | |
75 | |
76 def process(self, query): | |
77 return query[1:] | |
78 | |
79 def test(self, query): | |
80 if query[0] != 'r': | |
81 return False | |
82 return query[1:].isdigit() | |
83 | |
84 | |
85 | |
86 class TracTicket(Location): | |
87 def __init__(self): | |
88 # url for # data | |
89 number_url = 'http://trac.openplans.org/openplans/ticket/' | |
90 Location.__init__(self, number_url) | |
91 | |
92 def process(self, query): | |
93 if query.startswith('#'): | |
94 return query[1:] | |
95 return query | |
96 | |
97 def test(self, query): | |
98 query = self.process(query) | |
99 if len(query.split()) != 1: | |
100 return False | |
101 return query.isdigit() | |
102 | |
103 class Wikipedia(Location): | |
104 """try to open the query in wikipedia""" | |
105 def __init__(self): | |
106 wikiurl = 'http://en.wikipedia.org/wiki/' | |
107 Location.__init__(self, wikiurl) | |
108 | |
109 def process(self, query): | |
110 return urllib.quote_plus('_'.join(query.split())) | |
111 | |
112 def test(self, query): | |
113 'test to see if the article exists' | |
114 | |
115 # need a phony user agent so wikipedia won't know we're a bot | |
116 headers = {} | |
117 headers['User-Agent'] = 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-GB; rv:1.8.0.4) Gecko/20060508 Firefox/1.5.0.4' | |
118 | |
119 request = urllib2.Request(self.url(query), None, headers) | |
120 f = urllib2.urlopen(request).read() | |
121 | |
122 if 'Wikipedia does not have an article with this exact name' in f: | |
123 return False | |
124 return True | |
125 | |
126 class Google(Location): | |
127 def __init__(self): | |
128 googleurl = 'http://www.google.com/search?hl=en&q=' | |
129 Location.__init__(self, googleurl) | |
130 | |
131 def process(self, query): | |
132 return urllib.quote_plus(query) | |
133 | |
134 # get data to be operated on | |
135 data = ' '.join(sys.argv[1:]) | |
136 if not data: | |
137 data = sys.stdin.read() | |
138 | |
139 locations = [ URL, | |
140 GoogleMap, | |
141 Revision, | |
142 TracTicket, | |
143 Wikipedia, | |
144 Google | |
145 ] | |
146 | |
147 for loc in locations: | |
148 loc = loc() | |
149 if loc.open(data): | |
150 sys.exit(0) |