haml-edge 2.3.82 → 2.3.83

Sign up to get free protection for your applications and to get access to all the features.
data/EDGE_GEM_VERSION CHANGED
@@ -1 +1 @@
1
- 2.3.82
1
+ 2.3.83
data/VERSION CHANGED
@@ -1 +1 @@
1
- 2.3.82
1
+ 2.3.83
@@ -27,6 +27,30 @@ module Sass::Script
27
27
  # A hash from [red, green, blue] value arrays to color names.
28
28
  HTML4_COLORS_REVERSE = map_hash(HTML4_COLORS) {|k, v| [v, k]}
29
29
 
30
+ # Constructs an RGB or RGBA color object.
31
+ # The RGB values must be between 0 and 255,
32
+ # and the alpha value is generally expected to be between 0 and 1.
33
+ # However, the alpha value can be greater than 1
34
+ # in order to allow it to be used for color multiplication.
35
+ #
36
+ # @param rgba [Array<Numeric>] A three-element array of the red, green, blue,
37
+ # and optionally alpha values (respectively) of the color
38
+ # @raise [Sass::SyntaxError] if any color value isn't between 0 and 255,
39
+ # or the alpha value is negative
40
+ def initialize(rgba)
41
+ @red, @green, @blue = rgba[0...3].map {|c| c.to_i}
42
+ @alpha = rgba[3] ? rgba[3].to_f : 1
43
+ super(nil)
44
+
45
+ unless rgb.all? {|c| (0..255).include?(c)}
46
+ raise Sass::SyntaxError.new("Color values must be between 0 and 255")
47
+ end
48
+
49
+ unless (0..1).include?(alpha)
50
+ raise Sass::SyntaxError.new("Color opacity value must between 0 and 1")
51
+ end
52
+ end
53
+
30
54
  # The red component of the color.
31
55
  #
32
56
  # @return [Fixnum]
@@ -42,16 +66,18 @@ module Sass::Script
42
66
  # @return [Fixnum]
43
67
  attr_reader :blue
44
68
 
45
- # @param rgb [Array<Fixnum>] A three-element array of the red, green, and blue values (respectively)
46
- # of the color
47
- # @raise [Sass::SyntaxError] if any color value isn't between 0 and 255
48
- def initialize(rgb)
49
- rgb = rgb.map {|c| c.to_i}
50
- raise Sass::SyntaxError.new("Color values must be between 0 and 255") if rgb.any? {|c| c < 0 || c > 255}
51
- @red = rgb[0]
52
- @green = rgb[1]
53
- @blue = rgb[2]
54
- super(nil)
69
+ # The alpha channel (opacity) of the color.
70
+ # This is 1 unless otherwise defined.
71
+ #
72
+ # @return [Fixnum]
73
+ attr_accessor :alpha
74
+
75
+ # Returns whether this color object is translucent;
76
+ # that is, whether the alpha channel is non-1.
77
+ #
78
+ # @return [Boolean]
79
+ def alpha?
80
+ alpha < 1
55
81
  end
56
82
 
57
83
  # @deprecated This will be removed in version 2.6.
@@ -81,7 +107,8 @@ END
81
107
  # @return [Bool] True if this literal is the same as the other,
82
108
  # false otherwise
83
109
  def eq(other)
84
- Sass::Script::Bool.new(other.is_a?(Color) && rgb == other.rgb)
110
+ Sass::Script::Bool.new(
111
+ other.is_a?(Color) && rgb == other.rgb && alpha == other.alpha)
85
112
  end
86
113
 
87
114
  # The SassScript `+` operation.
@@ -205,6 +232,7 @@ END
205
232
  #
206
233
  # @return [String] The string representation
207
234
  def to_s
235
+ return "rgba(#{rgb.join(', ')}, #{alpha % 1 == 0.0 ? alpha.to_i : alpha})" if alpha?
208
236
  return HTML4_COLORS_REVERSE[rgb] if HTML4_COLORS_REVERSE[rgb]
209
237
  red, green, blue = rgb.map { |num| num.to_s(16).rjust(2, '0') }
210
238
  "##{red}#{green}#{blue}"
@@ -224,6 +252,12 @@ END
224
252
  res = rgb[i].send(operation, other_num ? other.value : other.rgb[i])
225
253
  result[i] = [ [res, 255].min, 0 ].max
226
254
  end
255
+
256
+ if !other_num && other.alpha != alpha
257
+ raise Sass::SyntaxError.new("Alpha channels must be equal: #{self} #{operation} #{other}")
258
+ end
259
+ result[3] = alpha
260
+
227
261
  Color.new(result)
228
262
  end
229
263
  end
@@ -36,11 +36,12 @@ module Sass
36
36
  # @raise [Sass::SyntaxError] if the function call raises an ArgumentError
37
37
  def perform(environment)
38
38
  args = self.args.map {|a| a.perform(environment)}
39
- unless Haml::Util.has?(:public_instance_method, Functions, name) && name !~ /^__/
39
+ ruby_name = name.gsub('-', '_')
40
+ unless Haml::Util.has?(:public_instance_method, Functions, ruby_name) && ruby_name !~ /^__/
40
41
  return Script::String.new("#{name}(#{args.map {|a| a.perform(environment)}.join(', ')})")
41
42
  end
42
43
 
43
- return Functions::EvaluationContext.new(environment.options).send(name, *args)
44
+ return Functions::EvaluationContext.new(environment.options).send(ruby_name, *args)
44
45
  rescue ArgumentError => e
45
46
  raise e unless e.backtrace.any? {|t| t =~ /:in `(block in )?(#{name}|perform)'$/}
46
47
  raise Sass::SyntaxError.new("#{e.message} for `#{name}'")
@@ -11,6 +11,33 @@ module Sass::Script
11
11
  # \{#hsl}
12
12
  # : Converts an `hsl(hue, saturation, lightness)` triplet into a color.
13
13
  #
14
+ # \{#hsla}
15
+ # : Converts an `hsla(hue, saturation, lightness, alpha)` quadruplet into a color.
16
+ #
17
+ # \{#rgb}
18
+ # : Converts an `rgb(red, green, blue)` triplet into a color.
19
+ #
20
+ # \{#rgba}
21
+ # : Converts an `rgb(red, green, blue, alpha)` triplet into a color.
22
+ #
23
+ # \{#red}
24
+ # : Gets the red component of a color.
25
+ #
26
+ # \{#green}
27
+ # : Gets the green component of a color.
28
+ #
29
+ # \{#blue}
30
+ # : Gets the blue component of a color.
31
+ #
32
+ # \{#alpha} / \{#opacity}
33
+ # : Gets the alpha component (opacity) of a color.
34
+ #
35
+ # \{#opacify} / \{#fade_in #fade-in}
36
+ # : Makes a color more opaque.
37
+ #
38
+ # \{#transparentize} / \{#fade_out #fade-out}
39
+ # : Makes a color more transparent.
40
+ #
14
41
  # \{#percentage}
15
42
  # : Converts a unitless number to a percentage.
16
43
  #
@@ -105,19 +132,40 @@ module Sass::Script
105
132
  # @param blue
106
133
  # A number between 0 and 255 inclusive
107
134
  def rgb(red, green, blue)
135
+ rgba(red, green, blue, Number.new(1))
136
+ end
137
+
138
+ # Creates a {Color} object from red, green, and blue values,
139
+ # as well as an alpha channel indicating opacity.
140
+ #
141
+ # @param red
142
+ # A number between 0 and 255 inclusive
143
+ # @param green
144
+ # A number between 0 and 255 inclusive
145
+ # @param blue
146
+ # A number between 0 and 255 inclusive
147
+ # @param alpha
148
+ # A number between 0 and 1
149
+ def rgba(red, green, blue, alpha)
108
150
  assert_type red, :Number
109
151
  assert_type green, :Number
110
152
  assert_type blue, :Number
153
+ assert_type alpha, :Number
111
154
 
112
155
  [red.value, green.value, blue.value].each do |v|
113
- next unless v < 0 || v > 255
156
+ next if (0..255).include?(v)
114
157
  raise ArgumentError.new("Color value #{v} must be between 0 and 255 inclusive")
115
158
  end
116
- Color.new([red.value, green.value, blue.value])
159
+
160
+ unless (0..1).include?(alpha.value)
161
+ raise ArgumentError.new("Alpha channel #{alpha.value} must be between 0 and 1 inclusive")
162
+ end
163
+
164
+ Color.new([red.value, green.value, blue.value, alpha.value])
117
165
  end
118
166
 
119
- # Creates a {Color} object from hue, saturation, and lightness
120
- # as per the [CSS3 spec](http://www.w3.org/TR/css3-color/#hsl-color).
167
+ # Creates a {Color} object from hue, saturation, and lightness.
168
+ # Uses the algorithm from the [CSS3 spec](http://www.w3.org/TR/css3-color/#hsl-color).
121
169
  #
122
170
  # @param hue [Number] The hue of the color.
123
171
  # Should be between 0 and 360 degrees, inclusive
@@ -128,16 +176,39 @@ module Sass::Script
128
176
  # @return [Color] The resulting color
129
177
  # @raise [ArgumentError] if `saturation` or `lightness` are out of bounds
130
178
  def hsl(hue, saturation, lightness)
179
+ hsla(hue, saturation, lightness, Number.new(1))
180
+ end
181
+
182
+ # Creates a {Color} object from hue, saturation, and lightness,
183
+ # as well as an alpha channel indicating opacity.
184
+ # Uses the algorithm from the [CSS3 spec](http://www.w3.org/TR/css3-color/#hsl-color).
185
+ #
186
+ # @param hue [Number] The hue of the color.
187
+ # Should be between 0 and 360 degrees, inclusive
188
+ # @param saturation [Number] The saturation of the color.
189
+ # Must be between `0%` and `100%`, inclusive
190
+ # @param lightness [Number] The lightness of the color.
191
+ # Must be between `0%` and `100%`, inclusive
192
+ # @param alpha [Number] The opacity of the color.
193
+ # Must be between 0 and 1, inclusive
194
+ # @return [Color] The resulting color
195
+ # @raise [ArgumentError] if `saturation`, `lightness`, or `alpha` are out of bounds
196
+ def hsla(hue, saturation, lightness, alpha)
131
197
  assert_type hue, :Number
132
198
  assert_type saturation, :Number
133
199
  assert_type lightness, :Number
200
+ assert_type alpha, :Number
201
+
202
+ unless (0..1).include?(alpha.value)
203
+ raise ArgumentError.new("Alpha channel #{alpha.value} must be between 0 and 1")
204
+ end
134
205
 
135
206
  original_s = saturation
136
207
  original_l = lightness
137
208
  # This algorithm is from http://www.w3.org/TR/css3-color#hsl-color
138
209
  h, s, l = [hue, saturation, lightness].map { |a| a.value }
139
- raise ArgumentError.new("Saturation #{s} must be between 0% and 100%") if s < 0 || s > 100
140
- raise ArgumentError.new("Lightness #{l} must be between 0% and 100%") if l < 0 || l > 100
210
+ raise ArgumentError.new("Saturation #{s} must be between 0% and 100%") unless (0..100).include?(s)
211
+ raise ArgumentError.new("Lightness #{l} must be between 0% and 100%") unless (0..100).include?(l)
141
212
 
142
213
  h = (h % 360) / 360.0
143
214
  s /= 100.0
@@ -145,9 +216,11 @@ module Sass::Script
145
216
 
146
217
  m2 = l <= 0.5 ? l * (s + 1) : l + s - l * s
147
218
  m1 = l * 2 - m2
148
- Color.new([hue_to_rgb(m1, m2, h + 1.0/3),
149
- hue_to_rgb(m1, m2, h),
150
- hue_to_rgb(m1, m2, h - 1.0/3)].map { |c| (c * 0xff).round })
219
+ Color.new(
220
+ [hue_to_rgb(m1, m2, h + 1.0/3),
221
+ hue_to_rgb(m1, m2, h),
222
+ hue_to_rgb(m1, m2, h - 1.0/3)].map { |c| (c * 0xff).round } +
223
+ [alpha.value])
151
224
  end
152
225
 
153
226
  # Returns the red component of a color.
@@ -180,6 +253,68 @@ module Sass::Script
180
253
  Sass::Script::Number.new(color.blue)
181
254
  end
182
255
 
256
+ # Returns the alpha component (opacity) of a color.
257
+ # This is 1 unless otherwise specified.
258
+ #
259
+ # @param color [Color]
260
+ # @return [Number]
261
+ # @raise [ArgumentError] If `color` isn't a color
262
+ def alpha(color)
263
+ assert_type color, :Color
264
+ Sass::Script::Number.new(color.alpha)
265
+ end
266
+ alias_method :opacity, :alpha
267
+
268
+ # Makes a color more opaque.
269
+ # Takes a color and an amount between `0%` and `100%`
270
+ # and returns a color that's that much closer to opaque.
271
+ #
272
+ # For example, `50%` will make the color twice as opaque:
273
+ #
274
+ # opacify(rgba(0, 0, 0, 0.5), 50%) => rgba(0, 0, 0, 0.75)
275
+ # opacify(rgba(0, 0, 0, 0.8), 50%) => rgba(0, 0, 0, 0.9)
276
+ # opacify(rgba(0, 0, 0, 0.2), 50%) => rgba(0, 0, 0, 0.8)
277
+ #
278
+ # Specifically, `opacify(color, n%)` will make the color
279
+ # `n%` closer to fully opaque.
280
+ def opacify(color, amount)
281
+ assert_type color, :Color
282
+ assert_type amount, :Number
283
+ unless (0..100).include?(amount.value)
284
+ raise ArgumentError.new("Amount #{amount} must be between 0% and 100%")
285
+ end
286
+
287
+ color = color.dup
288
+ color.alpha += (1 - color.alpha) * (amount.value / 100.0)
289
+ color
290
+ end
291
+ alias_method :fade_in, :opacify
292
+
293
+ # Makes a color more transparent.
294
+ # Takes a color and an amount between `0%` and `100%`
295
+ # and returns a color that's that much closer to transparent.
296
+ #
297
+ # For example, `50%` will make the color twice as transparent:
298
+ #
299
+ # opacify(rgba(0, 0, 0, 0.5), 50%) => rgba(0, 0, 0, 0.25)
300
+ # opacify(rgba(0, 0, 0, 0.8), 50%) => rgba(0, 0, 0, 0.4)
301
+ # opacify(rgba(0, 0, 0, 0.2), 50%) => rgba(0, 0, 0, 0.1)
302
+ #
303
+ # Specifically, `transparentize(color, n%)` will make the color
304
+ # `n%` closer to fully transparent.
305
+ def transparentize(color, amount)
306
+ assert_type color, :Color
307
+ assert_type amount, :Number
308
+ unless (0..100).include?(amount.value)
309
+ raise ArgumentError.new("Amount #{amount} must be between 0% and 100%")
310
+ end
311
+
312
+ color = color.dup
313
+ color.alpha *= 1 - (amount.value / 100.0)
314
+ color
315
+ end
316
+ alias_method :fade_out, :transparentize
317
+
183
318
  # Converts a decimal number to a percentage.
184
319
  # For example:
185
320
  #
@@ -27,6 +27,26 @@ class SassFunctionTest < Test::Unit::TestCase
27
27
  assert_error_message("\"foo\" is not a number for `hsl'", "hsl(10, 10, \"foo\")");
28
28
  end
29
29
 
30
+ def test_hsla
31
+ assert_equal "rgba(51, 204, 204, 0.4)", evaluate("hsla(180, 60%, 50%, 0.4)")
32
+ assert_equal "#33cccc", evaluate("hsla(180, 60%, 50%, 1)")
33
+ assert_equal "rgba(51, 204, 204, 0)", evaluate("hsla(180, 60%, 50%, 0)")
34
+ end
35
+
36
+ def test_hsla_checks_bounds
37
+ assert_error_message("Saturation -114 must be between 0% and 100% for `hsla'", "hsla(10, -114, 12, 1)");
38
+ assert_error_message("Lightness 256 must be between 0% and 100% for `hsla'", "hsla(10, 10, 256%, 0)");
39
+ assert_error_message("Alpha channel -0.1 must be between 0 and 1 for `hsla'", "hsla(10, 10, 10, -0.1)");
40
+ assert_error_message("Alpha channel 1.1 must be between 0 and 1 for `hsla'", "hsla(10, 10, 10, 1.1)");
41
+ end
42
+
43
+ def test_hsla_checks_types
44
+ assert_error_message("\"foo\" is not a number for `hsla'", "hsla(\"foo\", 10, 12, 0.3)");
45
+ assert_error_message("\"foo\" is not a number for `hsla'", "hsla(10, \"foo\", 12, 0)");
46
+ assert_error_message("\"foo\" is not a number for `hsla'", "hsla(10, 10, \"foo\", 1)");
47
+ assert_error_message("\"foo\" is not a number for `hsla'", "hsla(10, 10, 10, \"foo\")");
48
+ end
49
+
30
50
  def test_percentage
31
51
  assert_equal("50%", evaluate("percentage(.5)"))
32
52
  assert_equal("100%", evaluate("percentage(1)"))
@@ -95,6 +115,36 @@ class SassFunctionTest < Test::Unit::TestCase
95
115
  assert_error_message("\"foo\" is not a number for `rgb'", "rgb(10, 10, \"foo\")");
96
116
  end
97
117
 
118
+ def test_rgba
119
+ assert_equal("rgba(18, 52, 86, 0.5)", evaluate("rgba(18, 52, 86, 0.5)"))
120
+ assert_equal("#beaded", evaluate("rgba(190, 173, 237, 1)"))
121
+ assert_equal("rgba(0, 255, 127, 0)", evaluate("rgba(0, 255, 127, 0)"))
122
+ end
123
+
124
+ def test_rgb_tests_bounds
125
+ assert_error_message("Color value 256 must be between 0 and 255 inclusive for `rgba'",
126
+ "rgba(256, 1, 1, 0.3)")
127
+ assert_error_message("Color value 256 must be between 0 and 255 inclusive for `rgba'",
128
+ "rgba(1, 256, 1, 0.3)")
129
+ assert_error_message("Color value 256 must be between 0 and 255 inclusive for `rgba'",
130
+ "rgba(1, 1, 256, 0.3)")
131
+ assert_error_message("Color value 256 must be between 0 and 255 inclusive for `rgba'",
132
+ "rgba(1, 256, 257, 0.3)")
133
+ assert_error_message("Color value -1 must be between 0 and 255 inclusive for `rgba'",
134
+ "rgba(-1, 1, 1, 0.3)")
135
+ assert_error_message("Alpha channel -0.2 must be between 0 and 1 inclusive for `rgba'",
136
+ "rgba(1, 1, 1, -0.2)")
137
+ assert_error_message("Alpha channel 1.2 must be between 0 and 1 inclusive for `rgba'",
138
+ "rgba(1, 1, 1, 1.2)")
139
+ end
140
+
141
+ def test_rgba_tests_types
142
+ assert_error_message("\"foo\" is not a number for `rgba'", "rgba(\"foo\", 10, 12, 0.2)");
143
+ assert_error_message("\"foo\" is not a number for `rgba'", "rgba(10, \"foo\", 12, 0.1)");
144
+ assert_error_message("\"foo\" is not a number for `rgba'", "rgba(10, 10, \"foo\", 0)");
145
+ assert_error_message("\"foo\" is not a number for `rgba'", "rgba(10, 10, 10, \"foo\")");
146
+ end
147
+
98
148
  def test_red
99
149
  assert_equal("18", evaluate("red(#123456)"))
100
150
  end
@@ -119,6 +169,56 @@ class SassFunctionTest < Test::Unit::TestCase
119
169
  assert_error_message("12 is not a color for `blue'", "blue(12)")
120
170
  end
121
171
 
172
+ def test_alpha
173
+ assert_equal("1", evaluate("alpha(#123456)"))
174
+ assert_equal("0.34", evaluate("alpha(rgba(0, 1, 2, 0.34))"))
175
+ assert_equal("0", evaluate("alpha(hsla(0, 1, 2, 0))"))
176
+ end
177
+
178
+ def test_alpha_exception
179
+ assert_error_message("12 is not a color for `alpha'", "alpha(12)")
180
+ end
181
+
182
+ def test_opacify
183
+ assert_equal("rgba(0, 0, 0, 0.75)", evaluate("opacify(rgba(0, 0, 0, 0.5), 50%)"))
184
+ assert_equal("rgba(0, 0, 0, 0.8)", evaluate("opacify(rgba(0, 0, 0, 0.2), 75)"))
185
+ assert_equal("rgba(0, 0, 0, 0.28)", evaluate("fade-in(rgba(0, 0, 0, 0.2), 10px)"))
186
+ assert_equal("black", evaluate("fade_in(rgba(0, 0, 0, 0.2), 100%)"))
187
+ assert_equal("rgba(0, 0, 0, 0.2)", evaluate("opacify(rgba(0, 0, 0, 0.2), 0%)"))
188
+ end
189
+
190
+ def test_opacify_tests_bounds
191
+ assert_error_message("Amount -3012% must be between 0% and 100% for `opacify'",
192
+ "opacify(rgba(0, 0, 0, 0.2), -3012%)")
193
+ assert_error_message("Amount 101 must be between 0% and 100% for `opacify'",
194
+ "opacify(rgba(0, 0, 0, 0.2), 101)")
195
+ end
196
+
197
+ def test_opacify_tests_types
198
+ assert_error_message("\"foo\" is not a color for `opacify'", "opacify(\"foo\", 10%)")
199
+ assert_error_message("\"foo\" is not a number for `opacify'", "opacify(#fff, \"foo\")")
200
+ end
201
+
202
+ def test_transparentize
203
+ assert_equal("rgba(0, 0, 0, 0.25)", evaluate("transparentize(rgba(0, 0, 0, 0.5), 50%)"))
204
+ assert_equal("rgba(0, 0, 0, 0.05)", evaluate("transparentize(rgba(0, 0, 0, 0.2), 75)"))
205
+ assert_equal("rgba(0, 0, 0, 0.18)", evaluate("fade-out(rgba(0, 0, 0, 0.2), 10px)"))
206
+ assert_equal("rgba(0, 0, 0, 0)", evaluate("fade_out(rgba(0, 0, 0, 0.2), 100%)"))
207
+ assert_equal("rgba(0, 0, 0, 0.2)", evaluate("transparentize(rgba(0, 0, 0, 0.2), 0%)"))
208
+ end
209
+
210
+ def test_transparentize_tests_bounds
211
+ assert_error_message("Amount -3012% must be between 0% and 100% for `transparentize'",
212
+ "transparentize(rgba(0, 0, 0, 0.2), -3012%)")
213
+ assert_error_message("Amount 101 must be between 0% and 100% for `transparentize'",
214
+ "transparentize(rgba(0, 0, 0, 0.2), 101)")
215
+ end
216
+
217
+ def test_transparentize_tests_types
218
+ assert_error_message("\"foo\" is not a color for `transparentize'", "transparentize(\"foo\", 10%)")
219
+ assert_error_message("\"foo\" is not a number for `transparentize'", "transparentize(#fff, \"foo\")")
220
+ end
221
+
122
222
  private
123
223
 
124
224
  def evaluate(value)
@@ -10,6 +10,11 @@ class SassScriptTest < Test::Unit::TestCase
10
10
  assert_raise(Sass::SyntaxError, "Color values must be between 0 and 255") {Color.new([256, 2, 3])}
11
11
  end
12
12
 
13
+ def test_color_checks_rgba_input
14
+ assert_raise(Sass::SyntaxError, "Alpha channel must be between 0 and 1") {Color.new([1, 2, 3, 1.1])}
15
+ assert_raise(Sass::SyntaxError, "Alpha channel must be between 0 and 1") {Color.new([1, 2, 3, -0.1])}
16
+ end
17
+
13
18
  def test_string_escapes
14
19
  assert_equal '"', resolve("\"\\\"\"")
15
20
  assert_equal "\\", resolve("\"\\\\\"")
@@ -22,6 +27,39 @@ class SassScriptTest < Test::Unit::TestCase
22
27
  assert_equal "#fffffe", resolve("white - #000001")
23
28
  end
24
29
 
30
+ def test_rgba_color_literals
31
+ assert_equal Sass::Script::Color.new([1, 2, 3, 0.75]), eval("rgba(1, 2, 3, 0.75)")
32
+ assert_equal "rgba(1, 2, 3, 0.75)", resolve("rgba(1, 2, 3, 0.75)")
33
+
34
+ assert_equal Sass::Script::Color.new([1, 2, 3, 0]), eval("rgba(1, 2, 3, 0)")
35
+ assert_equal "rgba(1, 2, 3, 0)", resolve("rgba(1, 2, 3, 0)")
36
+
37
+ assert_equal Sass::Script::Color.new([1, 2, 3]), eval("rgba(1, 2, 3, 1)")
38
+ assert_equal Sass::Script::Color.new([1, 2, 3, 1]), eval("rgba(1, 2, 3, 1)")
39
+ assert_equal "#010203", resolve("rgba(1, 2, 3, 1)")
40
+ assert_equal "white", resolve("rgba(255, 255, 255, 1)")
41
+ end
42
+
43
+ def test_rgba_color_math
44
+ assert_equal "rgba(50, 50, 100, 0.35)", resolve("rgba(1, 1, 2, 0.35) * rgba(50, 50, 50, 0.35)")
45
+ assert_equal "rgba(52, 52, 52, 0.25)", resolve("rgba(2, 2, 2, 0.25) + rgba(50, 50, 50, 0.25)")
46
+
47
+ assert_raise(Sass::SyntaxError, "Alpha channels must be equal: rgba(1, 2, 3, 0.15) + rgba(50, 50, 50, 0.75)") do
48
+ resolve("rgba(1, 2, 3, 0.15) + rgba(50, 50, 50, 0.75)")
49
+ end
50
+ assert_raise(Sass::SyntaxError, "Alpha channels must be equal: #123456 * rgba(50, 50, 50, 0.75)") do
51
+ resolve("#123456 * rgba(50, 50, 50, 0.75)")
52
+ end
53
+ assert_raise(Sass::SyntaxError, "Alpha channels must be equal: #123456 / #123456") do
54
+ resolve("rgba(50, 50, 50, 0.75) / #123456")
55
+ end
56
+ end
57
+
58
+ def test_rgba_number_math
59
+ assert_equal "rgba(49, 49, 49, 0.75)", resolve("rgba(50, 50, 50, 0.75) - 1")
60
+ assert_equal "rgba(100, 100, 100, 0.75)", resolve("rgba(50, 50, 50, 0.75) * 2")
61
+ end
62
+
25
63
  def test_implicit_strings
26
64
  silence_warnings do
27
65
  assert_equal Sass::Script::String.new("foo"), eval("foo")
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: haml-edge
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.3.82
4
+ version: 2.3.83
5
5
  platform: ruby
6
6
  authors:
7
7
  - Nathan Weizenbaum
@@ -10,7 +10,7 @@ autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
12
 
13
- date: 2009-11-11 00:00:00 -05:00
13
+ date: 2009-11-12 00:00:00 -05:00
14
14
  default_executable:
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency