10
10
# Version: 0.3-dev
11
11
12
12
13
- from __future__ import print_function
13
+ from __future__ import print_function , division
14
14
import binascii
15
15
import json
16
16
import re
17
+ import sys
17
18
import textwrap
18
19
import vim
19
20
import webbrowser
20
- import sys
21
+ from datetime import datetime
21
22
if sys .version_info >= (3 , 0 ):
22
23
from html .parser import HTMLParser
24
+ from urllib .parse import quote_plus , urlparse
23
25
from urllib .request import urlopen
24
26
from urllib .error import HTTPError
25
27
unicode = bytes
26
28
unichr = chr
27
29
else :
28
30
from HTMLParser import HTMLParser
31
+ from urllib import quote_plus
29
32
from urllib2 import urlopen , HTTPError
33
+ from urlparse import urlparse
30
34
31
35
32
36
API_URL = "http://node-hnapi.herokuapp.com"
33
37
MARKDOWN_URL = "http://fuckyeahmarkdown.com/go/?read=1&u="
38
+ SEARCH = ("https://hn.algolia.com/api/v1/search" +
39
+ "?tags=story&hitsPerPage=60&query=" )
34
40
35
41
html = HTMLParser ()
36
42
@@ -66,6 +72,35 @@ def hex(s):
66
72
return binascii .hexlify (s )
67
73
68
74
75
+ def time_ago (timestamp ):
76
+ d = datetime .now () - datetime .fromtimestamp (timestamp )
77
+ years = d .days // 365
78
+ if years > 1 :
79
+ return "%d years ago" % (years )
80
+ elif years == 1 :
81
+ return "%d year ago" % (years )
82
+ months = d .days // 30
83
+ if months > 1 :
84
+ return "%d months ago" % (months )
85
+ elif months == 1 :
86
+ return "%d month ago" % (months )
87
+ if d .days > 1 :
88
+ return "%d days ago" % (d .days )
89
+ elif d .days == 1 :
90
+ return "%d day ago" % (d .days )
91
+ hours = d .seconds // 60 // 60
92
+ if hours > 1 :
93
+ return "%d hours ago" % (hours )
94
+ elif hours == 1 :
95
+ return "%d hour ago" % (hours )
96
+ minutes = d .seconds // 60
97
+ if minutes > 1 :
98
+ return "%d minutes ago" % (minutes )
99
+ elif minutes == 1 :
100
+ return "%d minute ago" % (minutes )
101
+ return "%d seconds ago" % (d .seconds )
102
+
103
+
69
104
def main ():
70
105
vim .command ("edit .hackernews" )
71
106
vim .command ("setlocal noswapfile" )
@@ -91,12 +126,15 @@ def main():
91
126
elif arg [:4 ] == 'http' :
92
127
link (url = arg )
93
128
return
94
- else :
129
+ elif not arg :
95
130
news1 = json .loads (urlopen (API_URL + "/news" , timeout = 5 )
96
131
.read ().decode ('utf-8' ))
97
132
news2 = json .loads (urlopen (API_URL + "/news2" , timeout = 5 )
98
133
.read ().decode ('utf-8' ))
99
134
items = news1 + news2
135
+ else :
136
+ items = json .loads (urlopen (SEARCH + quote_plus (arg ), timeout = 5 )
137
+ .read ().decode ('utf-8' ))['hits' ]
100
138
except HTTPError :
101
139
print ("HackerNews.vim Error: %s" % str (sys .exc_info ()[1 ].reason ))
102
140
return
@@ -105,6 +143,18 @@ def main():
105
143
return
106
144
107
145
for i , item in enumerate (items ):
146
+ # Test if item is a result from search API
147
+ if 'objectID' in item :
148
+ # Convert search API results into dict similar to regular API
149
+ # results so we can use same code to output results
150
+ item ['id' ] = int (item ['objectID' ])
151
+ item ['user' ] = item ['author' ]
152
+ item ['type' ] = "link"
153
+ item ['time_ago' ] = time_ago (item ['created_at_i' ])
154
+ item ['comments_count' ] = int (item ['num_comments' ])
155
+ if item .get ('url' , False ):
156
+ item ['domain' ] = urlparse (item ['url' ]).netloc
157
+
108
158
if 'title' not in item :
109
159
continue
110
160
if 'domain' in item :
0 commit comments