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
|
# File 'lib/simplecolor/rgb.rb', line 28
def parse(col, color_names: proc {|c| find_color(c)})
case col
when self
return col
when Proc
scol=col.call(self)
return parse(scol, color_names: color_names)
when Symbol
if ANSI_COLORS_16.key?(col)
return self.new(col, mode: 16)
end
when Array
return self.new(col, mode: true)
when String
if (m=col.match(/\A(?:rgb)?256[+:-]?(?<grey>gr[ae]y)?(?<red>\d+)(?:[+:-](?<green>\d+)[+:-](?<blue>\d+))?\z/))
grey=m[:grey]; red=m[:red]&.to_i; green=m[:green]&.to_i; blue=m[:blue]&.to_i
if grey
return self.new(GREY256+red, mode: 256)
elsif green and blue
return self.new([red, green, blue], mode: 256)
else
raise WrongRGBColor.new(col) if green
return self.new(red, mode: 256)
end
elsif (m=col.match(/\A(?:rgb[+:-]?)?(?<red>\d+)[+:-](?<green>\d+)[+:-](?<blue>\d+)\z/))
red=m[:red]&.to_i; green=m[:green]&.to_i; blue=m[:blue]&.to_i
return self.new([red, green, blue], mode: :truecolor)
elsif (m=col.match(/\A#?(?<hex_color>[[:xdigit:]]{3}{1,2})\z/))
return self.new(rgb_hex(m[:hex_color]), mode: :truecolor)
end
end
if color_names && (c=color_names[col])
return self.parse(c, color_names: nil)
else
raise WrongRGBColor.new(col)
end
end
|