blob: 777cf950a4885e91769ae8a174cf1ea34e10dcee (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
|
module Xsay
class Render
attr_reader :colour, :distance, :speed
def initialize(
colour: options[:colour].to_sym,
distance: options[:distance],
speed: options[:speed]
)
@colour = colour.to_sym
@distance = distance
@speed = speed
end
def render(message, template)
message = message.join(' ') if message.respond_to?(:join)
line_break = "-" * message.length
each_frame do |frame|
draw(message, template, line_break, frame)
end
nil
end
def each_frame
return yield 0 unless move?
frames = distance.downto(0).to_a + 0.upto(distance).to_a
frames.each { |x| yield x }
end
private
def draw(message, template, line_break, frame)
system 'clear' if move?
spaces = " " * frame
result = <<-MESSAGE
#{line_break}
< #{frame.even? ? message : ' ' * message.length} >
#{line_break}
#{template.gsub(/^/, "#{spaces}")}
MESSAGE
if colour == :rainbow
result.each_char.each_with_index do |x, i|
print x.colorize(String.colors[i % String.colors.size])
end
else
puts result.colorize(colour)
end
sleep speed if move?
end
def move?
distance > 0
end
end
end
|