Mercurial > hg > smartopen
annotate smartopen/handlers.py @ 11:ba9058605c5a
add a wiktionary handler
author | Jeff Hammel <jhammel@mozilla.com> |
---|---|
date | Wed, 22 Dec 2010 17:22:04 -0800 |
parents | a963acb1713d |
children | bb995bdf82e2 |
rev | line source |
---|---|
0 | 1 import address |
10
a963acb1713d
add a new handler: MercurialRevision
Jeff Hammel <jhammel@mozilla.com>
parents:
8
diff
changeset
|
2 import string |
0 | 3 import urllib |
4 import urllib2 | |
5 | |
11 | 6 class Location(object): |
0 | 7 """ |
8 generic class for locations | |
9 """ | |
10 | |
11 def __init__(self, baseurl=""): | |
12 self.baseurl = baseurl | |
13 | |
14 def url(self, query): | |
15 return self.baseurl + self.process(query) | |
16 | |
17 def process(self, query): | |
18 return query | |
19 | |
20 def test(self, query): | |
21 return True | |
22 | |
11 | 23 def exists(self, URL): |
24 """does a URL exist?""" | |
25 try: | |
26 urllib.urlopen(URL) | |
27 return True | |
28 except IOError: | |
29 return False | |
0 | 30 |
31 class URL(Location): | |
32 """a straight URL""" | |
33 | |
34 def process(self, query): | |
35 if '://' in query: | |
36 return query | |
37 return 'http://' + query | |
38 | |
39 def test(self, query): | |
40 """try to open the url""" | |
41 if ' ' in query or '\n' in query: | |
42 return False | |
11 | 43 return self.exists(self.process(query)) |
0 | 44 |
1 | 45 class GoogleMaps(Location): |
0 | 46 """try to google-maps the address""" |
47 | |
48 def __init__(self): | |
49 gmapsurl='http://maps.google.com/maps?f=q&hl=en&q=' | |
50 Location.__init__(self, gmapsurl) | |
51 | |
52 def process(self, query): | |
53 theaddress = address.normalizeaddress(query) | |
54 if not theaddress: | |
55 return theaddress | |
56 return urllib.quote_plus(theaddress) | |
57 | |
58 def test(self, query): | |
59 return bool(self.process(query)) | |
60 | |
1 | 61 class Trac(Location): |
2 | 62 def __init__(self, baseurl): |
63 baseurl = baseurl.strip('/') + '/' | |
64 Location.__init__(self, baseurl) | |
0 | 65 |
2 | 66 def process(self, query): |
67 if query[0] == 'r': | |
68 if query[1:].isdigit(): | |
69 return 'changeset/' + str(query[1:]) | |
70 if query[0] == '#': | |
71 if query[1:].isdigit(): | |
72 return 'ticket/' + str(query[1:]) | |
0 | 73 |
2 | 74 def test(self, query): |
75 return bool(self.process(query)) | |
76 | |
0 | 77 |
78 class Wikipedia(Location): | |
79 """try to open the query in wikipedia""" | |
80 def __init__(self): | |
81 wikiurl = 'http://en.wikipedia.org/wiki/' | |
82 Location.__init__(self, wikiurl) | |
83 | |
84 def process(self, query): | |
85 return urllib.quote_plus('_'.join(query.split())) | |
86 | |
87 def test(self, query): | |
88 'test to see if the article exists' | |
89 | |
90 # need a phony user agent so wikipedia won't know we're a bot | |
91 headers = {} | |
92 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' | |
93 | |
94 request = urllib2.Request(self.url(query), None, headers) | |
95 try: | |
96 f = urllib2.urlopen(request).read() | |
97 except urllib2.HTTPError, e: | |
98 return False | |
99 | |
100 if 'Wikipedia does not have an article with this exact name' in f: | |
101 return False | |
102 return True | |
103 | |
11 | 104 class Wiktionary(Location): |
105 def __init__(self): | |
106 baseurl = 'http://en.wiktionary.org/wiki/' | |
107 Location.__init__(self, baseurl) | |
108 def test(self, query): | |
109 for c in (' ', '\n', '/'): | |
110 if c in query: | |
111 return False | |
112 if self.exists(self.url(query)): | |
113 return True | |
114 | |
7 | 115 class Bugzilla(Location): |
116 def __init__(self): | |
117 baseurl = 'https://bugzilla.mozilla.org/show_bug.cgi?id=' | |
118 Location.__init__(self, baseurl) | |
119 | |
120 def test(self, query): | |
121 try: | |
122 int(query) | |
123 return True | |
124 except: | |
125 return False | |
126 | |
0 | 127 class Google(Location): |
128 def __init__(self): | |
129 googleurl = 'http://www.google.com/search?hl=en&q=' | |
130 Location.__init__(self, googleurl) | |
131 | |
132 def process(self, query): | |
133 return urllib.quote_plus(query) | |
7 | 134 |
8
44950f376e98
add FedEx tracking number handler
Jeff Hammel <jhammel@mozilla.com>
parents:
7
diff
changeset
|
135 class FedEx(Location): |
44950f376e98
add FedEx tracking number handler
Jeff Hammel <jhammel@mozilla.com>
parents:
7
diff
changeset
|
136 def __init__(self): |
44950f376e98
add FedEx tracking number handler
Jeff Hammel <jhammel@mozilla.com>
parents:
7
diff
changeset
|
137 baseurl = 'http://www.fedex.com/Tracking?cntry_code=us&language=english&tracknumber_list=' |
44950f376e98
add FedEx tracking number handler
Jeff Hammel <jhammel@mozilla.com>
parents:
7
diff
changeset
|
138 Location.__init__(self, baseurl) |
44950f376e98
add FedEx tracking number handler
Jeff Hammel <jhammel@mozilla.com>
parents:
7
diff
changeset
|
139 |
44950f376e98
add FedEx tracking number handler
Jeff Hammel <jhammel@mozilla.com>
parents:
7
diff
changeset
|
140 def process(self, query): |
44950f376e98
add FedEx tracking number handler
Jeff Hammel <jhammel@mozilla.com>
parents:
7
diff
changeset
|
141 if query.count(' ') == 2: |
44950f376e98
add FedEx tracking number handler
Jeff Hammel <jhammel@mozilla.com>
parents:
7
diff
changeset
|
142 query = ''.join(query.split(' ')) |
44950f376e98
add FedEx tracking number handler
Jeff Hammel <jhammel@mozilla.com>
parents:
7
diff
changeset
|
143 return query |
44950f376e98
add FedEx tracking number handler
Jeff Hammel <jhammel@mozilla.com>
parents:
7
diff
changeset
|
144 |
44950f376e98
add FedEx tracking number handler
Jeff Hammel <jhammel@mozilla.com>
parents:
7
diff
changeset
|
145 def test(self, query): |
44950f376e98
add FedEx tracking number handler
Jeff Hammel <jhammel@mozilla.com>
parents:
7
diff
changeset
|
146 query = self.process(query) |
44950f376e98
add FedEx tracking number handler
Jeff Hammel <jhammel@mozilla.com>
parents:
7
diff
changeset
|
147 if len(query) != 12: |
44950f376e98
add FedEx tracking number handler
Jeff Hammel <jhammel@mozilla.com>
parents:
7
diff
changeset
|
148 return False |
44950f376e98
add FedEx tracking number handler
Jeff Hammel <jhammel@mozilla.com>
parents:
7
diff
changeset
|
149 try: |
44950f376e98
add FedEx tracking number handler
Jeff Hammel <jhammel@mozilla.com>
parents:
7
diff
changeset
|
150 int(query) |
44950f376e98
add FedEx tracking number handler
Jeff Hammel <jhammel@mozilla.com>
parents:
7
diff
changeset
|
151 except ValueError: |
44950f376e98
add FedEx tracking number handler
Jeff Hammel <jhammel@mozilla.com>
parents:
7
diff
changeset
|
152 return False |
44950f376e98
add FedEx tracking number handler
Jeff Hammel <jhammel@mozilla.com>
parents:
7
diff
changeset
|
153 return True |
10
a963acb1713d
add a new handler: MercurialRevision
Jeff Hammel <jhammel@mozilla.com>
parents:
8
diff
changeset
|
154 |
a963acb1713d
add a new handler: MercurialRevision
Jeff Hammel <jhammel@mozilla.com>
parents:
8
diff
changeset
|
155 class MercurialRevision(Location): |
a963acb1713d
add a new handler: MercurialRevision
Jeff Hammel <jhammel@mozilla.com>
parents:
8
diff
changeset
|
156 def __init__(self): |
a963acb1713d
add a new handler: MercurialRevision
Jeff Hammel <jhammel@mozilla.com>
parents:
8
diff
changeset
|
157 baseurl = 'http://hg.mozilla.org/mozilla-central/rev/' |
a963acb1713d
add a new handler: MercurialRevision
Jeff Hammel <jhammel@mozilla.com>
parents:
8
diff
changeset
|
158 Location.__init__(self, baseurl) |
a963acb1713d
add a new handler: MercurialRevision
Jeff Hammel <jhammel@mozilla.com>
parents:
8
diff
changeset
|
159 |
a963acb1713d
add a new handler: MercurialRevision
Jeff Hammel <jhammel@mozilla.com>
parents:
8
diff
changeset
|
160 def test(self, query): |
a963acb1713d
add a new handler: MercurialRevision
Jeff Hammel <jhammel@mozilla.com>
parents:
8
diff
changeset
|
161 query = set(query) |
a963acb1713d
add a new handler: MercurialRevision
Jeff Hammel <jhammel@mozilla.com>
parents:
8
diff
changeset
|
162 if query.issubset(string.digits + 'abcdef'): |
a963acb1713d
add a new handler: MercurialRevision
Jeff Hammel <jhammel@mozilla.com>
parents:
8
diff
changeset
|
163 return True |
a963acb1713d
add a new handler: MercurialRevision
Jeff Hammel <jhammel@mozilla.com>
parents:
8
diff
changeset
|
164 return False |