fancy_gets 0.1.1 → 0.1.2
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.
- checksums.yaml +4 -4
- data/lib/fancy_gets/version.rb +1 -1
- data/lib/fancy_gets.rb +67 -12
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a874e5d77d0776b33016f748e58ea654146a3008
|
4
|
+
data.tar.gz: a18267ee4b5ec4e0292b17545ccfebc880561466
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4c1a9f82173ba9f6d3470b2ca59912b394a232a56b7c203164a0acbae3674bf2d6325cc477d1120fd64d020cf02654d0a15a03b267330775dbc763025ded5829
|
7
|
+
data.tar.gz: 8d075d38ec64b686532ac8ce1402762bc23b1c0058d58c1494035824bbadccb6309cd44d235d9acde81b40dce5bd7d55d43314a5ed5cb1da8e27dfea10547d29
|
data/lib/fancy_gets/version.rb
CHANGED
data/lib/fancy_gets.rb
CHANGED
@@ -22,22 +22,29 @@ module FancyGets
|
|
22
22
|
is_multiple = false
|
23
23
|
end
|
24
24
|
is_multiple = true if chosen.is_a?(Array) && chosen.length > 1
|
25
|
-
|
25
|
+
height = words.length
|
26
|
+
winheight = IO.console.winsize.first - 3
|
27
|
+
height = winheight if height > winheight
|
28
|
+
FancyGets.gets_internal_core(true, is_multiple, words, chosen, prefix, postfix, info, height)
|
26
29
|
end
|
27
30
|
|
28
31
|
# The internal routine that makes all the magic happen
|
29
|
-
def self.gets_internal_core(is_list, is_password, words = nil, chosen = [], prefix = "> ", postfix = " <", info = nil)
|
32
|
+
def self.gets_internal_core(is_list, is_password, words = nil, chosen = [], prefix = "> ", postfix = " <", info = nil, height = nil)
|
30
33
|
# OK -- second parameter, is_password, means is_multiple when is_list is true
|
31
34
|
is_multiple = is_list & is_password
|
32
35
|
words.sort! unless words.nil? || is_list
|
33
36
|
string = chosen if chosen.is_a?(String)
|
34
37
|
position = 0
|
38
|
+
height ||= words.length
|
39
|
+
offset = (height < words.length) ? 0 : nil
|
35
40
|
sugg = ""
|
36
41
|
prev_sugg = ""
|
37
42
|
|
38
43
|
# gsub causes any color changes to not offset spacing
|
39
44
|
uncolor = lambda { |word| word.gsub(/\033\[[0-9;]+m/, "") }
|
40
45
|
|
46
|
+
max_word_length = words.map{|word| uncolor.call(word).length}.max
|
47
|
+
|
41
48
|
write_sugg = lambda do
|
42
49
|
# Find first word that case-insensitive matches what they've typed
|
43
50
|
if string.empty?
|
@@ -67,6 +74,8 @@ module FancyGets
|
|
67
74
|
else
|
68
75
|
print "#{" " * uncolor.call(prefix).length}#{word}#{" " * uncolor.call(postfix).length}"
|
69
76
|
end
|
77
|
+
print " " * (max_word_length - uncolor.call(words[position]).length)
|
78
|
+
print "\b" * (max_word_length - uncolor.call(words[position]).length)
|
70
79
|
print "\b" * (uncolor.call(word).length + pre_post_length) if is_end_at_front
|
71
80
|
end
|
72
81
|
|
@@ -85,9 +94,29 @@ module FancyGets
|
|
85
94
|
chosen ||= []
|
86
95
|
chosen = [words[0]] if chosen == [] && !is_multiple
|
87
96
|
position = words.index(chosen.first) if chosen.length > 0
|
88
|
-
|
97
|
+
# If there's more options than we can fit at once
|
98
|
+
unless offset.nil?
|
99
|
+
# ... put the chosen one a third of the way down the screen
|
100
|
+
offset = position - (height / 3)
|
101
|
+
offset = 0 if offset < 0
|
102
|
+
end
|
103
|
+
# Scrolled any amount downwards?
|
104
|
+
# was: if (offset || 0) > 0
|
105
|
+
puts "#{" " * uncolor.call(prefix).length}#{"↑" * max_word_length}" if height < words.length
|
106
|
+
# was: ((offset || 0) > 1 ? 2 : 1)
|
107
|
+
top_bottom_reserved = offset.nil? ? 0 : 2
|
108
|
+
last_word = (offset || 0) + height - top_bottom_reserved
|
109
|
+
# Maybe we can fit it all
|
110
|
+
last_word = words.length if last_word > words.length
|
111
|
+
# Write all the visible words
|
112
|
+
words[(offset || 0)...last_word].each { |word| puts chosen.include?(word) ? "#{prefix}#{word}#{postfix}" : "#{" " * uncolor.call(prefix).length}#{word}" }
|
113
|
+
# Can't fit it all?
|
114
|
+
# was: if last_word < (words.length - top_bottom_reserved)
|
115
|
+
puts "#{" " * uncolor.call(prefix).length}#{"↓" * max_word_length}" if height < words.length
|
116
|
+
|
89
117
|
info ||= "Use arrow keys#{is_multiple ? ", spacebar to toggle, and ENTER to save" : " and ENTER to make a choice"}"
|
90
|
-
|
118
|
+
# %%% used to be (words.length - position)
|
119
|
+
print info + (27.chr + 91.chr + 65.chr) * (height - (position - (offset || 0)) - (last_word <= words.length ? 1 : 0))
|
91
120
|
# To end of text on starting line
|
92
121
|
info_length = uncolor.call(info).length
|
93
122
|
word_length = uncolor.call(words[position]).length + pre_post_length
|
@@ -149,28 +178,54 @@ module FancyGets
|
|
149
178
|
end
|
150
179
|
when 66 # - down
|
151
180
|
if is_list && position < words.length - 1
|
152
|
-
|
181
|
+
is_shift = false
|
182
|
+
# Now moving down past the bottom of the shown window?
|
183
|
+
if !offset.nil? && position >= offset + (height - 3)
|
184
|
+
print "\b" * (uncolor.call(words[position]).length + pre_post_length)
|
185
|
+
print (27.chr + 91.chr + 65.chr) * (height - (offset > 0 ? 3 : 3))
|
186
|
+
offset += 1
|
187
|
+
# Add 1 if offset + height == (words.length - 1)
|
188
|
+
words[offset...(offset + height - 4)].each do |word|
|
189
|
+
end_fill = max_word_length - uncolor.call(word).length
|
190
|
+
puts (is_multiple && chosen.include?(word)) ? "#{prefix}#{word}#{postfix}#{" " * end_fill}" : "#{" " * uncolor.call(prefix).length}#{word}#{" " * (end_fill + uncolor.call(postfix).length)}"
|
191
|
+
end
|
192
|
+
is_shift = true
|
193
|
+
end
|
194
|
+
make_select.call(chosen.include?(words[position]) && is_shift && is_multiple, true, true) if is_shift || !is_multiple
|
153
195
|
w1 = uncolor.call(words[position]).length
|
154
196
|
position += 1
|
155
197
|
print 27.chr + 91.chr + 66.chr
|
156
|
-
if is_multiple
|
198
|
+
if is_shift || !is_multiple
|
199
|
+
make_select.call((chosen.include?(words[position]) && is_shift) || !is_multiple)
|
200
|
+
else
|
157
201
|
w2 = uncolor.call(words[position]).length
|
158
202
|
print (w1 > w2 ? "\b" : (27.chr + 91.chr + 67.chr)) * (w1 - w2).abs
|
159
|
-
else
|
160
|
-
make_select.call(true)
|
161
203
|
end
|
162
204
|
end
|
163
205
|
when 65 # - up
|
164
206
|
if is_list && position > 0
|
165
|
-
|
207
|
+
is_shift = false
|
208
|
+
# Now moving up past the top of the shown window?
|
209
|
+
if position <= (offset || 0)
|
210
|
+
print "\b" * (uncolor.call(words[position]).length + pre_post_length)
|
211
|
+
offset -= 1
|
212
|
+
# print (27.chr + 91.chr + 65.chr) if offset == 0
|
213
|
+
words[offset...(offset + height - 2)].each do |word|
|
214
|
+
end_fill = max_word_length - uncolor.call(word).length
|
215
|
+
puts (is_multiple && chosen.include?(word)) ? "#{prefix}#{word}#{postfix}#{" " * end_fill}" : "#{" " * uncolor.call(prefix).length}#{word}#{" " * (end_fill + uncolor.call(postfix).length)}"
|
216
|
+
end
|
217
|
+
print (27.chr + 91.chr + 65.chr) * (height - (offset > 0 ? 3 : 3))
|
218
|
+
is_shift = true
|
219
|
+
end
|
220
|
+
make_select.call(chosen.include?(words[position]) && is_shift && is_multiple, true, true) if is_shift || !is_multiple
|
166
221
|
w1 = uncolor.call(words[position]).length
|
167
222
|
position -= 1
|
168
223
|
print 27.chr + 91.chr + 65.chr
|
169
|
-
if is_multiple
|
224
|
+
if is_shift || !is_multiple
|
225
|
+
make_select.call((chosen.include?(words[position]) && is_shift) || !is_multiple)
|
226
|
+
else
|
170
227
|
w2 = uncolor.call(words[position]).length
|
171
228
|
print (w1 > w2 ? "\b" : (27.chr + 91.chr + 67.chr)) * (w1 - w2).abs
|
172
|
-
else
|
173
|
-
make_select.call(true)
|
174
229
|
end
|
175
230
|
end
|
176
231
|
when 51 # - Delete forwards?
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: fancy_gets
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Lorin Thwaits
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-09-
|
11
|
+
date: 2016-09-09 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|