Class: String

Inherits:
Object
  • Object
show all
Defined in:
lib/termclock/string.rb

Constant Summary collapse

NEWLINE =
?\n.freeze
SPACE =
?\s.freeze
TAB =
?\t.freeze

Instance Method Summary collapse

Instance Method Details

#gradient(*all_rgbs, bg: false, exclude_spaces: false, bold: false) ⇒ Object



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
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
# File 'lib/termclock/string.rb', line 6

def gradient(*all_rgbs, bg: false, exclude_spaces: false, bold: false)
	temp = ''

	r, g, b = all_rgbs[0]
	r2, g2, b2 = all_rgbs[1]
	rotate = all_rgbs.length > 2

	init = bg ? 48 : 38

	each_line do |c|
		_r, _g, _b = r, g, b
		chomped = !!c.chomp!(''.freeze)

		len = c.length
		n_variable = exclude_spaces ? c.delete("\t\s".freeze).length : len
		n_variable -= 1
		n_variable = 1 if n_variable < 1

		# colour operator, colour value
		r_op = r_val  = nil
		g_op = g_val = nil
		b_op = b_val = nil

		if r2 > r
			r_op, r_val = :+, r2.-(r).fdiv(n_variable)
		elsif r2 < r
			r_op, r_val = :-, r.-(r2).fdiv(n_variable)
		end

		if g2 > g
			g_op, g_val = :+, g2.-(g).fdiv(n_variable)
		elsif g2 < g
			g_op, g_val = :-, g.-(g2).fdiv(n_variable)
		end

		if b2 > b
			b_op, b_val = :+, b2.-(b).fdiv(n_variable)
		elsif b2 < b
			b_op, b_val = :-, b.-(b2).fdiv(n_variable)
		end

		# To avoid the value getting adding | subtracted from the initial character
		_r = _r.send(r_op, r_val * -1) if r_op
		_g = _g.send(g_op, g_val * -1) if g_op
		_b = _b.send(b_op, b_val * -1) if b_op

		temp << "\e[1m" if bold

		i = -1
		while (i += 1) < len
			_c = c[i]

			if !exclude_spaces || (exclude_spaces && !(_c == SPACE || _c == TAB))
				_r = _r.send(r_op, r_val) if r_op
				_g = _g.send(g_op, g_val) if g_op
				_b = _b.send(b_op, b_val) if b_op
			end

			r_to_i = _r.to_i
			g_to_i = _g.to_i
			b_to_i = _b.to_i

			f_r = r_to_i < 0 ? 0 : r_to_i > 255 ? 255 : r_to_i
			f_g = g_to_i < 0 ? 0 : g_to_i > 255 ? 255 : g_to_i
			f_b = b_to_i < 0 ? 0 : b_to_i > 255 ? 255 : b_to_i

			ret = "\e[#{init};2;#{f_r};#{f_g};#{f_b}m#{_c}"
			temp << ret
		end

		ret = if !c.empty?
			chomped ? "\e[0m\n".freeze : "\e[0m".freeze
		elsif chomped
			NEWLINE
		end

		temp << ret

		if rotate
			all_rgbs.rotate!
			r, g, b = all_rgbs[0]
			r2, g2, b2 = all_rgbs[1]
		end
	end

	temp
end