Module: Philiprehberger::ColorConvert
- Defined in:
- lib/philiprehberger/color_convert.rb,
lib/philiprehberger/color_convert/color.rb,
lib/philiprehberger/color_convert/version.rb,
lib/philiprehberger/color_convert/named_colors.rb
Defined Under Namespace
Classes: Color, Error, ParseError
Constant Summary collapse
- VERSION =
'0.3.0'- NAMED_COLORS =
All 148 CSS named colors mapped to their hex values.
{ 'aliceblue' => '#f0f8ff', 'antiquewhite' => '#faebd7', 'aqua' => '#00ffff', 'aquamarine' => '#7fffd4', 'azure' => '#f0ffff', 'beige' => '#f5f5dc', 'bisque' => '#ffe4c4', 'black' => '#000000', 'blanchedalmond' => '#ffebcd', 'blue' => '#0000ff', 'blueviolet' => '#8a2be2', 'brown' => '#a52a2a', 'burlywood' => '#deb887', 'cadetblue' => '#5f9ea0', 'chartreuse' => '#7fff00', 'chocolate' => '#d2691e', 'coral' => '#ff7f50', 'cornflowerblue' => '#6495ed', 'cornsilk' => '#fff8dc', 'crimson' => '#dc143c', 'cyan' => '#00ffff', 'darkblue' => '#00008b', 'darkcyan' => '#008b8b', 'darkgoldenrod' => '#b8860b', 'darkgray' => '#a9a9a9', 'darkgreen' => '#006400', 'darkgrey' => '#a9a9a9', 'darkkhaki' => '#bdb76b', 'darkmagenta' => '#8b008b', 'darkolivegreen' => '#556b2f', 'darkorange' => '#ff8c00', 'darkorchid' => '#9932cc', 'darkred' => '#8b0000', 'darksalmon' => '#e9967a', 'darkseagreen' => '#8fbc8f', 'darkslateblue' => '#483d8b', 'darkslategray' => '#2f4f4f', 'darkslategrey' => '#2f4f4f', 'darkturquoise' => '#00ced1', 'darkviolet' => '#9400d3', 'deeppink' => '#ff1493', 'deepskyblue' => '#00bfff', 'dimgray' => '#696969', 'dimgrey' => '#696969', 'dodgerblue' => '#1e90ff', 'firebrick' => '#b22222', 'floralwhite' => '#fffaf0', 'forestgreen' => '#228b22', 'fuchsia' => '#ff00ff', 'gainsboro' => '#dcdcdc', 'ghostwhite' => '#f8f8ff', 'gold' => '#ffd700', 'goldenrod' => '#daa520', 'gray' => '#808080', 'green' => '#008000', 'greenyellow' => '#adff2f', 'grey' => '#808080', 'honeydew' => '#f0fff0', 'hotpink' => '#ff69b4', 'indianred' => '#cd5c5c', 'indigo' => '#4b0082', 'ivory' => '#fffff0', 'khaki' => '#f0e68c', 'lavender' => '#e6e6fa', 'lavenderblush' => '#fff0f5', 'lawngreen' => '#7cfc00', 'lemonchiffon' => '#fffacd', 'lightblue' => '#add8e6', 'lightcoral' => '#f08080', 'lightcyan' => '#e0ffff', 'lightgoldenrodyellow' => '#fafad2', 'lightgray' => '#d3d3d3', 'lightgreen' => '#90ee90', 'lightgrey' => '#d3d3d3', 'lightpink' => '#ffb6c1', 'lightsalmon' => '#ffa07a', 'lightseagreen' => '#20b2aa', 'lightskyblue' => '#87cefa', 'lightslategray' => '#778899', 'lightslategrey' => '#778899', 'lightsteelblue' => '#b0c4de', 'lightyellow' => '#ffffe0', 'lime' => '#00ff00', 'limegreen' => '#32cd32', 'linen' => '#faf0e6', 'magenta' => '#ff00ff', 'maroon' => '#800000', 'mediumaquamarine' => '#66cdaa', 'mediumblue' => '#0000cd', 'mediumorchid' => '#ba55d3', 'mediumpurple' => '#9370db', 'mediumseagreen' => '#3cb371', 'mediumslateblue' => '#7b68ee', 'mediumspringgreen' => '#00fa9a', 'mediumturquoise' => '#48d1cc', 'mediumvioletred' => '#c71585', 'midnightblue' => '#191970', 'mintcream' => '#f5fffa', 'mistyrose' => '#ffe4e1', 'moccasin' => '#ffe4b5', 'navajowhite' => '#ffdead', 'navy' => '#000080', 'oldlace' => '#fdf5e6', 'olive' => '#808000', 'olivedrab' => '#6b8e23', 'orange' => '#ffa500', 'orangered' => '#ff4500', 'orchid' => '#da70d6', 'palegoldenrod' => '#eee8aa', 'palegreen' => '#98fb98', 'paleturquoise' => '#afeeee', 'palevioletred' => '#db7093', 'papayawhip' => '#ffefd5', 'peachpuff' => '#ffdab9', 'peru' => '#cd853f', 'pink' => '#ffc0cb', 'plum' => '#dda0dd', 'powderblue' => '#b0e0e6', 'purple' => '#800080', 'rebeccapurple' => '#663399', 'red' => '#ff0000', 'rosybrown' => '#bc8f8f', 'royalblue' => '#4169e1', 'saddlebrown' => '#8b4513', 'salmon' => '#fa8072', 'sandybrown' => '#f4a460', 'seagreen' => '#2e8b57', 'seashell' => '#fff5ee', 'sienna' => '#a0522d', 'silver' => '#c0c0c0', 'skyblue' => '#87ceeb', 'slateblue' => '#6a5acd', 'slategray' => '#708090', 'slategrey' => '#708090', 'snow' => '#fffafa', 'springgreen' => '#00ff7f', 'steelblue' => '#4682b4', 'tan' => '#d2b48c', 'teal' => '#008080', 'thistle' => '#d8bfd8', 'tomato' => '#ff6347', 'turquoise' => '#40e0d0', 'violet' => '#ee82ee', 'wheat' => '#f5deb3', 'white' => '#ffffff', 'whitesmoke' => '#f5f5f5', 'yellow' => '#ffff00', 'yellowgreen' => '#9acd32' }.freeze
Class Method Summary collapse
-
.from_hsv(h, s, v) ⇒ Color
Create a Color from HSV values.
-
.named_colors ⇒ Hash{String => String}
Return all CSS named colors as a hash of name => hex.
-
.parse(str) ⇒ Color
Parse a color string into a Color object.
Class Method Details
.from_hsv(h, s, v) ⇒ Color
Create a Color from HSV values.
68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 |
# File 'lib/philiprehberger/color_convert.rb', line 68 def self.from_hsv(h, s, v) s /= 100.0 v /= 100.0 c = v * s x = c * (1 - (((h / 60.0) % 2) - 1).abs) m = v - c r, g, b = case (h / 60.0).floor % 6 when 0 then [c, x, 0] when 1 then [x, c, 0] when 2 then [0, c, x] when 3 then [0, x, c] when 4 then [x, 0, c] else [c, 0, x] end Color.new(((r + m) * 255).round, ((g + m) * 255).round, ((b + m) * 255).round) end |
.named_colors ⇒ Hash{String => String}
Return all CSS named colors as a hash of name => hex.
58 59 60 |
# File 'lib/philiprehberger/color_convert.rb', line 58 def self.named_colors NAMED_COLORS end |
.parse(str) ⇒ Color
Parse a color string into a Color object.
Supported formats:
-
Hex: “#ff0000”, “#f00”, “ff0000”, “f00”
-
RGB: “rgb(255, 0, 0)”
-
HSL: “hsl(0, 100%, 50%)”
-
HSV: “hsv(0, 100%, 100%)”
-
CMYK: “cmyk(0, 100%, 100%, 0)”
-
CSS named colors: “red”, “blue”, “cornflowerblue”
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 |
# File 'lib/philiprehberger/color_convert.rb', line 23 def self.parse(str) input = str.to_s.strip.downcase # Try named colors first return parse_hex(NAMED_COLORS[input]) if NAMED_COLORS.key?(input) # Hex format return parse_hex(input) if input.match?(/\A#?[0-9a-f]{3,8}\z/) # RGB format if (match = input.match(/\Argb\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)\z/)) return Color.new(match[1].to_i, match[2].to_i, match[3].to_i) end # HSL format if (match = input.match(/\Ahsl\(\s*([\d.]+)\s*,\s*([\d.]+)%?\s*,\s*([\d.]+)%?\s*\)\z/)) return Color.from_hsl(match[1].to_f, match[2].to_f, match[3].to_f) end # HSV format if (match = input.match(/\Ahsv\(\s*([\d.]+)\s*,\s*([\d.]+)%?\s*,\s*([\d.]+)%?\s*\)\z/)) return from_hsv(match[1].to_f, match[2].to_f, match[3].to_f) end # CMYK format if (match = input.match(/\Acmyk\(\s*([\d.]+)%?\s*,\s*([\d.]+)%?\s*,\s*([\d.]+)%?\s*,\s*([\d.]+)%?\s*\)\z/)) return Color.from_cmyk(match[1].to_f, match[2].to_f, match[3].to_f, match[4].to_f) end raise ParseError, "Cannot parse color: #{str}" end |