Class: SilkLayout::CSS::Color

Inherits:
Object
  • Object
show all
Defined in:
lib/silk_layout/css/color.rb

Constant Summary collapse

NAMED_COLOR_HEX =
{
  "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
NAMED_COLORS =
NAMED_COLOR_HEX.transform_values do |hex|
  hex.scan(/../).map { |component| component.to_i(16) }
end.freeze
FUNCTION_PATTERN =
/\A([a-z]+)\((.*)\)\z/
NUMBER_PATTERN =
/\A[-+]?(?:\d+\.?\d*|\.\d+)\z/

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(red, green, blue, normalized:, alpha: 1.0) ⇒ Color

Returns a new instance of Color.



207
208
209
210
211
212
213
# File 'lib/silk_layout/css/color.rb', line 207

def initialize(red, green, blue, normalized:, alpha: 1.0)
  @red = clamp_byte(red)
  @green = clamp_byte(green)
  @blue = clamp_byte(blue)
  @alpha = clamp_unit(alpha)
  @normalized = normalized
end

Instance Attribute Details

#alphaObject (readonly)

Returns the value of attribute alpha.



6
7
8
# File 'lib/silk_layout/css/color.rb', line 6

def alpha
  @alpha
end

#blueObject (readonly)

Returns the value of attribute blue.



6
7
8
# File 'lib/silk_layout/css/color.rb', line 6

def blue
  @blue
end

#greenObject (readonly)

Returns the value of attribute green.



6
7
8
# File 'lib/silk_layout/css/color.rb', line 6

def green
  @green
end

#normalizedObject (readonly)

Returns the value of attribute normalized.



6
7
8
# File 'lib/silk_layout/css/color.rb', line 6

def normalized
  @normalized
end

#redObject (readonly)

Returns the value of attribute red.



6
7
8
# File 'lib/silk_layout/css/color.rb', line 6

def red
  @red
end

Class Method Details

.parse(value) ⇒ Object



170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
# File 'lib/silk_layout/css/color.rb', line 170

def self.parse(value)
  return value if value.is_a?(self)

  raw = value.to_s.strip
  return nil if raw.empty?

  normalized = raw.downcase
  return new(0, 0, 0, alpha: 0, normalized: "transparent") if normalized == "transparent"

  if (rgb = NAMED_COLORS[normalized])
    return new(*rgb, normalized: normalized)
  end

  return parse_hex(normalized) if normalized.start_with?("#")

  match = normalized.match(FUNCTION_PATTERN)
  return nil unless match

  case match[1]
  when "rgb", "rgba"
    parse_rgb_function(match[1], match[2], normalized)
  when "hsl", "hsla"
    parse_hsl_function(match[1], match[2], normalized)
  end
end

.rgb(value) ⇒ Object

The renderer currently paints RGB only. Alpha is kept on parsed colors; conversion treats fully transparent colors as not paintable and ignores partial alpha as a best-effort fallback.



199
200
201
202
203
204
205
# File 'lib/silk_layout/css/color.rb', line 199

def self.rgb(value)
  color = parse(value)
  return nil unless color
  return nil if color.transparent?

  color.rgb
end

Instance Method Details

#clamp_byte(value) ⇒ Object



406
407
408
# File 'lib/silk_layout/css/color.rb', line 406

def clamp_byte(value)
  value.to_f.round.clamp(0, 255)
end

#clamp_unit(value) ⇒ Object



410
411
412
# File 'lib/silk_layout/css/color.rb', line 410

def clamp_unit(value)
  value.to_f.clamp(0, 1)
end

#rgbObject



215
216
217
# File 'lib/silk_layout/css/color.rb', line 215

def rgb
  [red, green, blue]
end

#to_sObject



227
228
229
# File 'lib/silk_layout/css/color.rb', line 227

def to_s
  normalized
end

#to_symObject



223
224
225
# File 'lib/silk_layout/css/color.rb', line 223

def to_sym
  normalized.to_sym
end

#transparent?Boolean

Returns:

  • (Boolean)


219
220
221
# File 'lib/silk_layout/css/color.rb', line 219

def transparent?
  alpha <= 0
end