delicious-cli 0.2.1 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/lib/delicious-cli/db.rb +4 -0
- data/lib/delicious-cli/display.rb +94 -10
- data/lib/delicious-cli.rb +15 -0
- metadata +2 -2
data/lib/delicious-cli/db.rb
CHANGED
@@ -1,12 +1,18 @@
|
|
1
1
|
require 'date'
|
2
|
+
require 'open3'
|
2
3
|
|
3
4
|
#################################################################
|
4
5
|
## Load the colorize gem, and define the "hilite" function
|
5
6
|
begin
|
7
|
+
|
6
8
|
require 'delicious-cli/colorize'
|
9
|
+
|
7
10
|
# Colourized hilite...
|
8
11
|
class String
|
12
|
+
|
9
13
|
def hilite(words, color=:white)
|
14
|
+
return self.send(color) if words.nil?
|
15
|
+
|
10
16
|
escaped_words = words.map { |word| Regexp.escape(word) }
|
11
17
|
matcher = /(#{escaped_words.join('|')})/io
|
12
18
|
|
@@ -19,15 +25,68 @@ begin
|
|
19
25
|
end
|
20
26
|
end.join('')
|
21
27
|
end
|
28
|
+
|
22
29
|
end
|
30
|
+
|
23
31
|
rescue LoadError
|
32
|
+
|
24
33
|
STDERR.puts "Note: You should install the 'colorize' gem for extra prettiness.\n"
|
25
34
|
# Monochrome hilite does nothing...
|
26
35
|
class String
|
27
36
|
def hilite(words); self; end
|
28
37
|
end
|
38
|
+
|
39
|
+
end
|
40
|
+
|
41
|
+
|
42
|
+
#################################################################
|
43
|
+
|
44
|
+
def term_width
|
45
|
+
if `stty size` =~ /(\d+) (\d+)/
|
46
|
+
return $2.to_i
|
47
|
+
else
|
48
|
+
return 80
|
49
|
+
end
|
29
50
|
end
|
30
51
|
|
52
|
+
SCREEN_WIDTH = term_width
|
53
|
+
|
54
|
+
#################################################################
|
55
|
+
|
56
|
+
class String
|
57
|
+
|
58
|
+
def wrap(width=80, chop=true)
|
59
|
+
|
60
|
+
if (lines = self.split("\n")).size > 1
|
61
|
+
return lines.map { |line| line.wrap(width, chop) }.flatten
|
62
|
+
end
|
63
|
+
|
64
|
+
lines = []
|
65
|
+
left = 0
|
66
|
+
|
67
|
+
loop do
|
68
|
+
edge = left + width
|
69
|
+
right = self.rindex(/\s+|$/, edge)
|
70
|
+
|
71
|
+
if right.nil? or right < left
|
72
|
+
if chop
|
73
|
+
right = edge
|
74
|
+
else
|
75
|
+
right = self.index(/\s+|$/, edge)
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
line = self[left...right]
|
80
|
+
lines << line.strip
|
81
|
+
left = self.index(/[^\s]|$/, right)
|
82
|
+
break if right >= (self.size-1)
|
83
|
+
end
|
84
|
+
|
85
|
+
lines
|
86
|
+
end
|
87
|
+
|
88
|
+
end
|
89
|
+
|
31
90
|
#################################################################
|
32
91
|
|
33
92
|
def formatdate(dt, width=11)
|
@@ -40,18 +99,43 @@ def formatdate(dt, width=11)
|
|
40
99
|
end
|
41
100
|
|
42
101
|
|
43
|
-
def display(post, query, indent_size=11)
|
44
|
-
indent
|
102
|
+
def display(post, query=nil, indent_size=11)
|
103
|
+
indent = " " * indent_size
|
104
|
+
wrap_size = SCREEN_WIDTH - indent_size
|
45
105
|
|
46
|
-
date
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
tags = post["tag"].hilite(query, :light_cyan)
|
106
|
+
date = formatdate(post["time"], indent_size)
|
107
|
+
desc_lines = post["description"].wrap(wrap_size).map { |line| line.hilite(query, :light_white) }
|
108
|
+
url = post["href"].hilite(query, :light_blue)
|
109
|
+
tag_lines = post["tag"].wrap(wrap_size-2).map { |line| line.hilite(query, :light_cyan) }
|
51
110
|
|
52
|
-
|
53
|
-
|
111
|
+
if post["extended"].any?
|
112
|
+
ext_lines = post["extended"].wrap(wrap_size).map { |line| line.hilite(query, :white) }
|
113
|
+
else
|
114
|
+
ext_lines = []
|
115
|
+
end
|
116
|
+
|
117
|
+
# date / description
|
118
|
+
puts date + desc_lines.first
|
119
|
+
if desc_lines.size > 1
|
120
|
+
desc_lines[1..-1].each { |line| puts indent + line }
|
121
|
+
end
|
122
|
+
|
123
|
+
# extended description
|
124
|
+
ext_lines.each do |line|
|
125
|
+
puts indent + line
|
126
|
+
end
|
127
|
+
|
128
|
+
# url
|
54
129
|
puts indent + url
|
55
|
-
|
130
|
+
|
131
|
+
# tags
|
132
|
+
print indent + "(".cyan + tag_lines.first
|
133
|
+
if tag_lines.size > 1
|
134
|
+
tag_lines[1..-1].each do |line|
|
135
|
+
print "\n" + indent + " " + line
|
136
|
+
end
|
137
|
+
end
|
138
|
+
puts ")".cyan
|
139
|
+
|
56
140
|
puts
|
57
141
|
end
|
data/lib/delicious-cli.rb
CHANGED
@@ -29,6 +29,11 @@ def search(words)
|
|
29
29
|
matches.each { |match| display(match, words) }
|
30
30
|
end
|
31
31
|
|
32
|
+
def last(n)
|
33
|
+
posts = Database.last(n)
|
34
|
+
posts.each { |post| display(post) }
|
35
|
+
end
|
36
|
+
|
32
37
|
def sync
|
33
38
|
puts "* Synchronizing database..."
|
34
39
|
Database.sync
|
@@ -112,6 +117,14 @@ def main
|
|
112
117
|
options.redownload = true
|
113
118
|
end
|
114
119
|
|
120
|
+
opts.on("-l", "--list [num]", "List the last [num] links (default 5, 0 for all)") do |opt|
|
121
|
+
if opt
|
122
|
+
options.list = opt.to_i
|
123
|
+
else
|
124
|
+
options.list = 5
|
125
|
+
end
|
126
|
+
end
|
127
|
+
|
115
128
|
opts.on("-c", "--config", "Configure login info (set delicious username/password)") do |opt|
|
116
129
|
options.config = true
|
117
130
|
end
|
@@ -158,6 +171,8 @@ def main
|
|
158
171
|
redownload
|
159
172
|
elsif options.sync
|
160
173
|
sync
|
174
|
+
elsif options.list
|
175
|
+
last(options.list)
|
161
176
|
else
|
162
177
|
exit 1 unless ARGV.size > 0
|
163
178
|
search(ARGV)
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: delicious-cli
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- epitron
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2009-09-
|
12
|
+
date: 2009-09-22 00:00:00 -04:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|