def parse(value)
case value
in ['rgb', args]
return unless args.length == 3
rgb =
args.map do |arg|
number = to_float(arg, 2.55) or break
format('%02x', number.round.clamp(0, 255))
end
rgb && RGB.new(rgb.join)
in ['device-cmyk', args]
return unless args.length == 4
cymk =
args.map do |arg|
number = to_float(arg, 0.01) or break
(number * 100).clamp(0, 100)
end
cymk && CMYK.new(cymk)
in /\A#([0-9a-f])([0-9a-f])([0-9a-f])\z/i
RGB.new("#{$1 * 2}#{$2 * 2}#{$3 * 2}")
in /\A#[0-9a-f]{6}\z/i
RGB.new(value[1..])
in String => color
if (hex = HTML_COLORS[color.downcase])
RGB.new(hex)
end
else
nil
end
end