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

Class Method Details

.from_hsv(h, s, v) ⇒ Color

Create a Color from HSV values.

Parameters:

  • h (Numeric)

    hue (0-360)

  • s (Numeric)

    saturation (0-100)

  • v (Numeric)

    value/brightness (0-100)

Returns:



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_colorsHash{String => String}

Return all CSS named colors as a hash of name => hex.

Returns:

  • (Hash{String => String})


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”

Parameters:

  • str (String)

    the color string to parse

Returns:

  • (Color)

    the parsed color

Raises:



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