summaryrefslogtreecommitdiff
path: root/lib/xsay/render.rb
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