File: color.rb

package info (click to toggle)
ruby-sassc 2.4.0%2Bds-1
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 368 kB
  • sloc: ruby: 2,277; makefile: 3
file content (95 lines) | stat: -rw-r--r-- 2,950 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
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
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
# frozen_string_literal: true

# A SassScript object representing a CSS color.
# This class provides a very bare-bones system for storing a RGB(A) or HSL(A)
# color and converting it to a CSS color function.
#
# If your Sass method accepts a  color you will need to perform any
# needed color mathematics or transformations yourself.

class SassC::Script::Value::Color < SassC::Script::Value

  attr_reader :red
  attr_reader :green
  attr_reader :blue
  attr_reader :hue
  attr_reader :saturation
  attr_reader :lightness
  attr_reader :alpha

  # Creates a new color with (`red`, `green`, `blue`) or (`hue`, `saturation`, `lightness`
  # values, plus an optional `alpha` transparency value.
  def initialize(red:nil, green:nil, blue:nil, hue:nil, saturation:nil, lightness:nil, alpha:1.0)
    if red && green && blue && alpha
      @mode = :rgba
      @red = SassC::Util.clamp(red.to_i, 0, 255)
      @green = SassC::Util.clamp(green.to_i, 0, 255)
      @blue = SassC::Util.clamp(blue.to_i, 0, 255)
      @alpha = SassC::Util.clamp(alpha.to_f, 0.0, 1.0)
    elsif hue && saturation && lightness && alpha
      @mode = :hsla
      @hue = SassC::Util.clamp(hue.to_i, 0, 360)
      @saturation = SassC::Util.clamp(saturation.to_i, 0, 100)
      @lightness = SassC::Util.clamp(lightness.to_i, 0, 100)
      @alpha = SassC::Util.clamp(alpha.to_f, 0.0, 1.0)
    else
      raise SassC::UnsupportedValue, "Unable to determine color configuration for "
    end
  end

  # Returns a CSS color declaration in the form
  # `rgb(…)`, `rgba(…)`, `hsl(…)`, or `hsla(…)`.
  def to_s
    if rgba? && @alpha == 1.0
      return "rgb(#{@red}, #{@green}, #{@blue})"
    elsif rgba?
      return "rgba(#{@red}, #{@green}, #{@blue}, #{alpha_string})"
    elsif hsla? && @alpha == 1.0
      return "hsl(#{@hue}, #{@saturation}%, #{@lightness}%)"
    else # hsla?
      return "hsla(#{@hue}, #{@saturation}%, #{@lightness}%, #{alpha_string})"
    end
  end

  # True if this color has RGBA values
  def rgba?
    @mode == :rgba
  end

  # True if this color has HSLA values
  def hlsa?
    @mode == :hlsa
  end

  # Returns the alpha value of this color as a string
  # and rounded to 8 decimal places.
  def alpha_string
    alpha.round(8).to_s
  end

  # Returns the values of this color in an array.
  # Provided for compatibility between different SassC::Script::Value classes
  def value
    return [
      red, green, blue,
      hue, saturation, lightness,
      alpha,
    ].compact
  end

  # True if this Color is equal to `other_color`
  def eql?(other_color)
    unless other_color.is_a?(self.class)
      raise ArgumentError, "No implicit conversion of #{other_color.class} to #{self.class}"
    end
    self.value == other_color.value
  end
  alias_method :==, :eql?

  # Returns a numeric value for comparing two Color objects
  # This method is used internally by the Hash class and is not the same as `.to_h`
  def hash
    value.hash
  end

end