sass 3.3.0 → 3.4.25
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.yardopts +3 -1
- data/CODE_OF_CONDUCT.md +10 -0
- data/CONTRIBUTING.md +148 -0
- data/MIT-LICENSE +1 -1
- data/README.md +76 -62
- data/Rakefile +104 -24
- data/VERSION +1 -1
- data/VERSION_DATE +1 -1
- data/VERSION_NAME +1 -1
- data/bin/sass +1 -1
- data/bin/scss +1 -1
- data/extra/sass-spec-ref.sh +32 -0
- data/extra/update_watch.rb +1 -1
- data/lib/sass/cache_stores/filesystem.rb +9 -5
- data/lib/sass/cache_stores/memory.rb +4 -5
- data/lib/sass/callbacks.rb +2 -2
- data/lib/sass/css.rb +12 -13
- data/lib/sass/deprecation.rb +55 -0
- data/lib/sass/engine.rb +106 -70
- data/lib/sass/environment.rb +39 -19
- data/lib/sass/error.rb +17 -20
- data/lib/sass/exec/base.rb +199 -0
- data/lib/sass/exec/sass_convert.rb +283 -0
- data/lib/sass/exec/sass_scss.rb +440 -0
- data/lib/sass/exec.rb +5 -771
- data/lib/sass/features.rb +9 -2
- data/lib/sass/importers/base.rb +8 -3
- data/lib/sass/importers/filesystem.rb +30 -38
- data/lib/sass/logger/base.rb +8 -2
- data/lib/sass/logger/delayed.rb +50 -0
- data/lib/sass/logger.rb +8 -3
- data/lib/sass/media.rb +1 -4
- data/lib/sass/plugin/compiler.rb +224 -90
- data/lib/sass/plugin/configuration.rb +38 -22
- data/lib/sass/plugin/merb.rb +2 -2
- data/lib/sass/plugin/rack.rb +3 -3
- data/lib/sass/plugin/rails.rb +1 -1
- data/lib/sass/plugin/staleness_checker.rb +4 -4
- data/lib/sass/plugin.rb +6 -5
- data/lib/sass/script/css_lexer.rb +1 -1
- data/lib/sass/script/css_parser.rb +2 -3
- data/lib/sass/script/css_variable_warning.rb +52 -0
- data/lib/sass/script/functions.rb +739 -318
- data/lib/sass/script/lexer.rb +134 -54
- data/lib/sass/script/parser.rb +252 -56
- data/lib/sass/script/tree/funcall.rb +13 -6
- data/lib/sass/script/tree/interpolation.rb +127 -4
- data/lib/sass/script/tree/list_literal.rb +31 -4
- data/lib/sass/script/tree/literal.rb +4 -0
- data/lib/sass/script/tree/node.rb +21 -3
- data/lib/sass/script/tree/operation.rb +54 -1
- data/lib/sass/script/tree/selector.rb +26 -0
- data/lib/sass/script/tree/string_interpolation.rb +59 -38
- data/lib/sass/script/tree/variable.rb +1 -1
- data/lib/sass/script/tree.rb +1 -0
- data/lib/sass/script/value/base.rb +17 -14
- data/lib/sass/script/value/bool.rb +0 -5
- data/lib/sass/script/value/color.rb +78 -42
- data/lib/sass/script/value/helpers.rb +119 -2
- data/lib/sass/script/value/list.rb +0 -15
- data/lib/sass/script/value/map.rb +1 -1
- data/lib/sass/script/value/null.rb +0 -5
- data/lib/sass/script/value/number.rb +112 -31
- data/lib/sass/script/value/string.rb +102 -13
- data/lib/sass/script/value.rb +0 -1
- data/lib/sass/script.rb +3 -3
- data/lib/sass/scss/css_parser.rb +24 -4
- data/lib/sass/scss/parser.rb +290 -383
- data/lib/sass/scss/rx.rb +17 -9
- data/lib/sass/scss/static_parser.rb +306 -4
- data/lib/sass/scss.rb +0 -2
- data/lib/sass/selector/abstract_sequence.rb +35 -18
- data/lib/sass/selector/comma_sequence.rb +114 -19
- data/lib/sass/selector/pseudo.rb +266 -0
- data/lib/sass/selector/sequence.rb +146 -40
- data/lib/sass/selector/simple.rb +22 -33
- data/lib/sass/selector/simple_sequence.rb +122 -39
- data/lib/sass/selector.rb +57 -197
- data/lib/sass/shared.rb +2 -2
- data/lib/sass/source/map.rb +31 -14
- data/lib/sass/source/position.rb +4 -4
- data/lib/sass/stack.rb +2 -8
- data/lib/sass/supports.rb +10 -13
- data/lib/sass/tree/at_root_node.rb +1 -0
- data/lib/sass/tree/charset_node.rb +1 -1
- data/lib/sass/tree/comment_node.rb +1 -1
- data/lib/sass/tree/css_import_node.rb +9 -1
- data/lib/sass/tree/directive_node.rb +8 -2
- data/lib/sass/tree/error_node.rb +18 -0
- data/lib/sass/tree/extend_node.rb +1 -1
- data/lib/sass/tree/function_node.rb +9 -0
- data/lib/sass/tree/import_node.rb +6 -5
- data/lib/sass/tree/keyframe_rule_node.rb +15 -0
- data/lib/sass/tree/node.rb +5 -3
- data/lib/sass/tree/prop_node.rb +6 -7
- data/lib/sass/tree/rule_node.rb +26 -11
- data/lib/sass/tree/visitors/check_nesting.rb +56 -32
- data/lib/sass/tree/visitors/convert.rb +59 -44
- data/lib/sass/tree/visitors/cssize.rb +34 -30
- data/lib/sass/tree/visitors/deep_copy.rb +6 -1
- data/lib/sass/tree/visitors/extend.rb +15 -13
- data/lib/sass/tree/visitors/perform.rb +87 -50
- data/lib/sass/tree/visitors/set_options.rb +15 -1
- data/lib/sass/tree/visitors/to_css.rb +72 -43
- data/lib/sass/util/multibyte_string_scanner.rb +0 -2
- data/lib/sass/util/normalized_map.rb +0 -1
- data/lib/sass/util/subset_map.rb +2 -3
- data/lib/sass/util.rb +334 -154
- data/lib/sass/version.rb +7 -7
- data/lib/sass.rb +10 -8
- data/test/sass/cache_test.rb +62 -20
- data/test/sass/callbacks_test.rb +1 -1
- data/test/sass/compiler_test.rb +24 -11
- data/test/sass/conversion_test.rb +241 -50
- data/test/sass/css2sass_test.rb +73 -5
- data/test/sass/css_variable_test.rb +132 -0
- data/test/sass/encoding_test.rb +219 -0
- data/test/sass/engine_test.rb +343 -260
- data/test/sass/exec_test.rb +12 -2
- data/test/sass/extend_test.rb +333 -44
- data/test/sass/functions_test.rb +353 -260
- data/test/sass/importer_test.rb +40 -21
- data/test/sass/logger_test.rb +1 -1
- data/test/sass/more_results/more_import.css +1 -1
- data/test/sass/more_templates/more1.sass +10 -10
- data/test/sass/more_templates/more_import.sass +2 -2
- data/test/sass/plugin_test.rb +24 -21
- data/test/sass/results/compact.css +1 -1
- data/test/sass/results/complex.css +4 -4
- data/test/sass/results/expanded.css +1 -1
- data/test/sass/results/import.css +1 -1
- data/test/sass/results/import_charset_ibm866.css +2 -2
- data/test/sass/results/mixins.css +17 -17
- data/test/sass/results/nested.css +1 -1
- data/test/sass/results/parent_ref.css +2 -2
- data/test/sass/results/script.css +5 -5
- data/test/sass/results/scss_import.css +1 -1
- data/test/sass/script_conversion_test.rb +71 -39
- data/test/sass/script_test.rb +714 -123
- data/test/sass/scss/css_test.rb +213 -30
- data/test/sass/scss/rx_test.rb +8 -4
- data/test/sass/scss/scss_test.rb +766 -22
- data/test/sass/source_map_test.rb +263 -95
- data/test/sass/superselector_test.rb +210 -0
- data/test/sass/templates/_partial.sass +1 -1
- data/test/sass/templates/basic.sass +10 -10
- data/test/sass/templates/bork1.sass +1 -1
- data/test/sass/templates/bork5.sass +1 -1
- data/test/sass/templates/compact.sass +10 -10
- data/test/sass/templates/complex.sass +187 -187
- data/test/sass/templates/compressed.sass +10 -10
- data/test/sass/templates/expanded.sass +10 -10
- data/test/sass/templates/import.sass +2 -2
- data/test/sass/templates/importee.sass +3 -3
- data/test/sass/templates/mixins.sass +22 -22
- data/test/sass/templates/multiline.sass +4 -4
- data/test/sass/templates/nested.sass +13 -13
- data/test/sass/templates/parent_ref.sass +12 -12
- data/test/sass/templates/script.sass +70 -70
- data/test/sass/templates/scss_import.scss +2 -1
- data/test/sass/templates/subdir/nested_subdir/_nested_partial.sass +1 -1
- data/test/sass/templates/subdir/nested_subdir/nested_subdir.sass +2 -2
- data/test/sass/templates/subdir/subdir.sass +3 -3
- data/test/sass/templates/units.sass +10 -10
- data/test/sass/test_helper.rb +1 -1
- data/test/sass/util/multibyte_string_scanner_test.rb +11 -3
- data/test/sass/util/normalized_map_test.rb +1 -1
- data/test/sass/util/subset_map_test.rb +2 -2
- data/test/sass/util_test.rb +46 -45
- data/test/sass/value_helpers_test.rb +5 -7
- data/test/sass-spec.yml +3 -0
- data/test/test_helper.rb +7 -6
- data/vendor/listen/CHANGELOG.md +1 -228
- data/vendor/listen/Gemfile +5 -15
- data/vendor/listen/README.md +111 -77
- data/vendor/listen/Rakefile +0 -42
- data/vendor/listen/lib/listen/adapter.rb +195 -82
- data/vendor/listen/lib/listen/adapters/bsd.rb +27 -64
- data/vendor/listen/lib/listen/adapters/darwin.rb +21 -58
- data/vendor/listen/lib/listen/adapters/linux.rb +23 -55
- data/vendor/listen/lib/listen/adapters/polling.rb +25 -34
- data/vendor/listen/lib/listen/adapters/windows.rb +50 -46
- data/vendor/listen/lib/listen/directory_record.rb +96 -61
- data/vendor/listen/lib/listen/listener.rb +135 -37
- data/vendor/listen/lib/listen/turnstile.rb +9 -5
- data/vendor/listen/lib/listen/version.rb +1 -1
- data/vendor/listen/lib/listen.rb +33 -19
- data/vendor/listen/listen.gemspec +6 -0
- data/vendor/listen/spec/listen/adapter_spec.rb +43 -77
- data/vendor/listen/spec/listen/adapters/polling_spec.rb +8 -8
- data/vendor/listen/spec/listen/directory_record_spec.rb +81 -56
- data/vendor/listen/spec/listen/listener_spec.rb +128 -39
- data/vendor/listen/spec/listen_spec.rb +15 -21
- data/vendor/listen/spec/spec_helper.rb +4 -0
- data/vendor/listen/spec/support/adapter_helper.rb +52 -15
- data/vendor/listen/spec/support/directory_record_helper.rb +7 -5
- data/vendor/listen/spec/support/listeners_helper.rb +30 -7
- metadata +310 -300
- data/CONTRIBUTING +0 -3
- data/ext/mkrf_conf.rb +0 -27
- data/lib/sass/script/value/deprecated_false.rb +0 -55
- data/lib/sass/scss/script_lexer.rb +0 -15
- data/lib/sass/scss/script_parser.rb +0 -25
- data/vendor/listen/lib/listen/dependency_manager.rb +0 -126
- data/vendor/listen/lib/listen/multi_listener.rb +0 -143
- data/vendor/listen/spec/listen/dependency_manager_spec.rb +0 -107
- data/vendor/listen/spec/listen/multi_listener_spec.rb +0 -174
@@ -17,15 +17,16 @@ module Sass::Script::Value
|
|
17
17
|
# @private
|
18
18
|
#
|
19
19
|
# Convert a ruby integer to a rgba components
|
20
|
-
# @param color [
|
21
|
-
# @return [Array<
|
20
|
+
# @param color [Integer]
|
21
|
+
# @return [Array<Integer>] Array of 4 numbers representing r,g,b and alpha
|
22
22
|
def self.int_to_rgba(color)
|
23
23
|
rgba = (0..3).map {|n| color >> (n << 3) & 0xff}.reverse
|
24
24
|
rgba[-1] = rgba[-1] / 255.0
|
25
25
|
rgba
|
26
26
|
end
|
27
27
|
|
28
|
-
ALTERNATE_COLOR_NAMES = Sass::Util.map_vals(
|
28
|
+
ALTERNATE_COLOR_NAMES = Sass::Util.map_vals(
|
29
|
+
{
|
29
30
|
'aqua' => 0x00FFFFFF,
|
30
31
|
'darkgrey' => 0xA9A9A9FF,
|
31
32
|
'darkslategrey' => 0x2F4F4FFF,
|
@@ -35,10 +36,11 @@ module Sass::Script::Value
|
|
35
36
|
'lightgrey' => 0xD3D3D3FF,
|
36
37
|
'lightslategrey' => 0x778899FF,
|
37
38
|
'slategrey' => 0x708090FF,
|
38
|
-
|
39
|
+
}, &method(:int_to_rgba))
|
39
40
|
|
40
41
|
# A hash from color names to `[red, green, blue]` value arrays.
|
41
|
-
COLOR_NAMES = Sass::Util.map_vals(
|
42
|
+
COLOR_NAMES = Sass::Util.map_vals(
|
43
|
+
{
|
42
44
|
'aliceblue' => 0xF0F8FFFF,
|
43
45
|
'antiquewhite' => 0xFAEBD7FF,
|
44
46
|
'aquamarine' => 0x7FFFD4FF,
|
@@ -151,6 +153,7 @@ module Sass::Script::Value
|
|
151
153
|
'powderblue' => 0xB0E0E6FF,
|
152
154
|
'purple' => 0x800080FF,
|
153
155
|
'red' => 0xFF0000FF,
|
156
|
+
'rebeccapurple' => 0x663399FF,
|
154
157
|
'rosybrown' => 0xBC8F8FFF,
|
155
158
|
'royalblue' => 0x4169E1FF,
|
156
159
|
'saddlebrown' => 0x8B4513FF,
|
@@ -178,7 +181,7 @@ module Sass::Script::Value
|
|
178
181
|
'whitesmoke' => 0xF5F5F5FF,
|
179
182
|
'yellow' => 0xFFFF00FF,
|
180
183
|
'yellowgreen' => 0x9ACD32FF
|
181
|
-
|
184
|
+
}, &method(:int_to_rgba))
|
182
185
|
|
183
186
|
# A hash from `[red, green, blue, alpha]` value arrays to color names.
|
184
187
|
COLOR_NAMES_REVERSE = COLOR_NAMES.invert.freeze
|
@@ -187,35 +190,43 @@ module Sass::Script::Value
|
|
187
190
|
# different ruby implementations and versions vary on the ordering of the result of invert.
|
188
191
|
COLOR_NAMES.update(ALTERNATE_COLOR_NAMES).freeze
|
189
192
|
|
193
|
+
# The user's original representation of the color.
|
194
|
+
#
|
195
|
+
# @return [String]
|
196
|
+
attr_reader :representation
|
197
|
+
|
190
198
|
# Constructs an RGB or HSL color object,
|
191
199
|
# optionally with an alpha channel.
|
192
200
|
#
|
193
|
-
#
|
194
|
-
#
|
195
|
-
# The alpha value
|
201
|
+
# RGB values are clipped within 0 and 255.
|
202
|
+
# Saturation and lightness values are clipped within 0 and 100.
|
203
|
+
# The alpha value is clipped within 0 and 1.
|
196
204
|
#
|
197
205
|
# @raise [Sass::SyntaxError] if any color value isn't in the specified range
|
198
206
|
#
|
199
207
|
# @overload initialize(attrs)
|
200
|
-
# The attributes are specified as a hash.
|
201
|
-
#
|
202
|
-
#
|
203
|
-
#
|
204
|
-
#
|
208
|
+
# The attributes are specified as a hash. This hash must contain either
|
209
|
+
# `:hue`, `:saturation`, and `:lightness` keys, or `:red`, `:green`, and
|
210
|
+
# `:blue` keys. It cannot contain both HSL and RGB keys. It may also
|
211
|
+
# optionally contain an `:alpha` key, and a `:representation` key
|
212
|
+
# indicating the original representation of the color that the user wrote
|
213
|
+
# in their stylesheet.
|
205
214
|
#
|
206
215
|
# @param attrs [{Symbol => Numeric}] A hash of color attributes to values
|
207
216
|
# @raise [ArgumentError] if not enough attributes are specified,
|
208
217
|
# or both RGB and HSL attributes are specified
|
209
218
|
#
|
210
|
-
# @overload initialize(rgba)
|
219
|
+
# @overload initialize(rgba, [representation])
|
211
220
|
# The attributes are specified as an array.
|
212
221
|
# This overload only supports RGB or RGBA colors.
|
213
222
|
#
|
214
223
|
# @param rgba [Array<Numeric>] A three- or four-element array
|
215
224
|
# of the red, green, blue, and optionally alpha values (respectively)
|
216
225
|
# of the color
|
226
|
+
# @param representation [String] The original representation of the color
|
227
|
+
# that the user wrote in their stylesheet.
|
217
228
|
# @raise [ArgumentError] if not enough attributes are specified
|
218
|
-
def initialize(attrs, allow_both_rgb_and_hsl = false)
|
229
|
+
def initialize(attrs, representation = nil, allow_both_rgb_and_hsl = false)
|
219
230
|
super(nil)
|
220
231
|
|
221
232
|
if attrs.is_a?(Array)
|
@@ -223,11 +234,12 @@ module Sass::Script::Value
|
|
223
234
|
raise ArgumentError.new("Color.new(array) expects a three- or four-element array")
|
224
235
|
end
|
225
236
|
|
226
|
-
red, green, blue = attrs[0...3].map {|c| c
|
237
|
+
red, green, blue = attrs[0...3].map {|c| Sass::Util.round(c)}
|
227
238
|
@attrs = {:red => red, :green => green, :blue => blue}
|
228
239
|
@attrs[:alpha] = attrs[3] ? attrs[3].to_f : 1
|
240
|
+
@representation = representation
|
229
241
|
else
|
230
|
-
attrs = attrs.reject {|
|
242
|
+
attrs = attrs.reject {|_k, v| v.nil?}
|
231
243
|
hsl = [:hue, :saturation, :lightness] & attrs.keys
|
232
244
|
rgb = [:red, :green, :blue] & attrs.keys
|
233
245
|
if !allow_both_rgb_and_hsl && !hsl.empty? && !rgb.empty?
|
@@ -243,21 +255,20 @@ module Sass::Script::Value
|
|
243
255
|
@attrs = attrs
|
244
256
|
@attrs[:hue] %= 360 if @attrs[:hue]
|
245
257
|
@attrs[:alpha] ||= 1
|
258
|
+
@representation = @attrs.delete(:representation)
|
246
259
|
end
|
247
260
|
|
248
261
|
[:red, :green, :blue].each do |k|
|
249
262
|
next if @attrs[k].nil?
|
250
|
-
@attrs[k] = @attrs[k]
|
251
|
-
Sass::Util.check_range("#{k.to_s.capitalize} value", 0..255, @attrs[k])
|
263
|
+
@attrs[k] = Sass::Util.restrict(Sass::Util.round(@attrs[k]), 0..255)
|
252
264
|
end
|
253
265
|
|
254
266
|
[:saturation, :lightness].each do |k|
|
255
267
|
next if @attrs[k].nil?
|
256
|
-
|
257
|
-
@attrs[k] = Sass::Util.check_range("#{k.to_s.capitalize}", 0..100, value, '%')
|
268
|
+
@attrs[k] = Sass::Util.restrict(@attrs[k], 0..100)
|
258
269
|
end
|
259
270
|
|
260
|
-
@attrs[:alpha] = Sass::Util.
|
271
|
+
@attrs[:alpha] = Sass::Util.restrict(@attrs[:alpha], 0..1)
|
261
272
|
end
|
262
273
|
|
263
274
|
# Create a new color from a valid CSS hex string.
|
@@ -273,14 +284,16 @@ module Sass::Script::Value
|
|
273
284
|
red = $1.ljust(2, $1).to_i(16)
|
274
285
|
green = $2.ljust(2, $2).to_i(16)
|
275
286
|
blue = $3.ljust(2, $3).to_i(16)
|
276
|
-
|
287
|
+
|
288
|
+
hex_string = "##{hex_string}" unless hex_string[0] == ?#
|
289
|
+
attrs = {:red => red, :green => green, :blue => blue, :representation => hex_string}
|
277
290
|
attrs[:alpha] = alpha if alpha
|
278
291
|
new(attrs)
|
279
292
|
end
|
280
293
|
|
281
294
|
# The red component of the color.
|
282
295
|
#
|
283
|
-
# @return [
|
296
|
+
# @return [Integer]
|
284
297
|
def red
|
285
298
|
hsl_to_rgb!
|
286
299
|
@attrs[:red]
|
@@ -288,7 +301,7 @@ module Sass::Script::Value
|
|
288
301
|
|
289
302
|
# The green component of the color.
|
290
303
|
#
|
291
|
-
# @return [
|
304
|
+
# @return [Integer]
|
292
305
|
def green
|
293
306
|
hsl_to_rgb!
|
294
307
|
@attrs[:green]
|
@@ -296,7 +309,7 @@ module Sass::Script::Value
|
|
296
309
|
|
297
310
|
# The blue component of the color.
|
298
311
|
#
|
299
|
-
# @return [
|
312
|
+
# @return [Integer]
|
300
313
|
def blue
|
301
314
|
hsl_to_rgb!
|
302
315
|
@attrs[:blue]
|
@@ -329,7 +342,7 @@ module Sass::Script::Value
|
|
329
342
|
# The alpha channel (opacity) of the color.
|
330
343
|
# This is 1 unless otherwise defined.
|
331
344
|
#
|
332
|
-
# @return [
|
345
|
+
# @return [Integer]
|
333
346
|
def alpha
|
334
347
|
@attrs[:alpha].to_f
|
335
348
|
end
|
@@ -344,7 +357,7 @@ module Sass::Script::Value
|
|
344
357
|
|
345
358
|
# Returns the red, green, and blue components of the color.
|
346
359
|
#
|
347
|
-
# @return [Array<
|
360
|
+
# @return [Array<Integer>] A frozen three-element array of the red, green, and blue
|
348
361
|
# values (respectively) of the color
|
349
362
|
def rgb
|
350
363
|
[red, green, blue].freeze
|
@@ -352,7 +365,7 @@ module Sass::Script::Value
|
|
352
365
|
|
353
366
|
# Returns the red, green, blue, and alpha components of the color.
|
354
367
|
#
|
355
|
-
# @return [Array<
|
368
|
+
# @return [Array<Integer>] A frozen four-element array of the red, green,
|
356
369
|
# blue, and alpha values (respectively) of the color
|
357
370
|
def rgba
|
358
371
|
[red, green, blue, alpha].freeze
|
@@ -360,7 +373,7 @@ module Sass::Script::Value
|
|
360
373
|
|
361
374
|
# Returns the hue, saturation, and lightness components of the color.
|
362
375
|
#
|
363
|
-
# @return [Array<
|
376
|
+
# @return [Array<Integer>] A frozen three-element array of the
|
364
377
|
# hue, saturation, and lightness values (respectively) of the color
|
365
378
|
def hsl
|
366
379
|
[hue, saturation, lightness].freeze
|
@@ -368,10 +381,10 @@ module Sass::Script::Value
|
|
368
381
|
|
369
382
|
# Returns the hue, saturation, lightness, and alpha components of the color.
|
370
383
|
#
|
371
|
-
# @return [Array<
|
384
|
+
# @return [Array<Integer>] A frozen four-element array of the hue,
|
372
385
|
# saturation, lightness, and alpha values (respectively) of the color
|
373
386
|
def hsla
|
374
|
-
[hue, saturation, lightness].freeze
|
387
|
+
[hue, saturation, lightness, alpha].freeze
|
375
388
|
end
|
376
389
|
|
377
390
|
# The SassScript `==` operation.
|
@@ -410,7 +423,7 @@ module Sass::Script::Value
|
|
410
423
|
# @return [Color] The new Color object
|
411
424
|
# @raise [ArgumentError] if both RGB and HSL keys are specified
|
412
425
|
def with(attrs)
|
413
|
-
attrs = attrs.reject {|
|
426
|
+
attrs = attrs.reject {|_k, v| v.nil?}
|
414
427
|
hsl = !([:hue, :saturation, :lightness] & attrs.keys).empty?
|
415
428
|
rgb = !([:red, :green, :blue] & attrs.keys).empty?
|
416
429
|
if hsl && rgb
|
@@ -428,7 +441,7 @@ module Sass::Script::Value
|
|
428
441
|
end
|
429
442
|
attrs[:alpha] ||= alpha
|
430
443
|
|
431
|
-
Color.new(attrs, :allow_both_rgb_and_hsl)
|
444
|
+
Color.new(attrs, nil, :allow_both_rgb_and_hsl)
|
432
445
|
end
|
433
446
|
|
434
447
|
# The SassScript `+` operation.
|
@@ -549,7 +562,8 @@ module Sass::Script::Value
|
|
549
562
|
# @return [String] The string representation
|
550
563
|
def to_s(opts = {})
|
551
564
|
return smallest if options[:style] == :compressed
|
552
|
-
return
|
565
|
+
return representation if representation
|
566
|
+
return name if name
|
553
567
|
alpha? ? rgba_str : hex_str
|
554
568
|
end
|
555
569
|
alias_method :to_sass, :to_s
|
@@ -561,13 +575,19 @@ module Sass::Script::Value
|
|
561
575
|
alpha? ? rgba_str : hex_str
|
562
576
|
end
|
563
577
|
|
578
|
+
# Returns the color's name, if it has one.
|
579
|
+
#
|
580
|
+
# @return [String, nil]
|
581
|
+
def name
|
582
|
+
COLOR_NAMES_REVERSE[rgba]
|
583
|
+
end
|
584
|
+
|
564
585
|
private
|
565
586
|
|
566
587
|
def smallest
|
567
588
|
small_explicit_str = alpha? ? rgba_str : hex_str.gsub(/^#(.)\1(.)\2(.)\3$/, '#\1\2\3')
|
568
|
-
|
569
|
-
|
570
|
-
color
|
589
|
+
[representation, COLOR_NAMES_REVERSE[rgba], small_explicit_str].
|
590
|
+
compact.min_by {|str| str.size}
|
571
591
|
end
|
572
592
|
|
573
593
|
def rgba_str
|
@@ -580,16 +600,32 @@ module Sass::Script::Value
|
|
580
600
|
"##{red}#{green}#{blue}"
|
581
601
|
end
|
582
602
|
|
603
|
+
def operation_name(operation)
|
604
|
+
case operation
|
605
|
+
when :+
|
606
|
+
"add"
|
607
|
+
when :-
|
608
|
+
"subtract"
|
609
|
+
when :*
|
610
|
+
"multiply"
|
611
|
+
when :/
|
612
|
+
"divide"
|
613
|
+
when :%
|
614
|
+
"modulo"
|
615
|
+
end
|
616
|
+
end
|
617
|
+
|
583
618
|
def piecewise(other, operation)
|
584
619
|
other_num = other.is_a? Number
|
585
620
|
if other_num && !other.unitless?
|
586
621
|
raise Sass::SyntaxError.new(
|
587
|
-
"Cannot
|
622
|
+
"Cannot #{operation_name(operation)} a number with units (#{other}) to a color (#{self})."
|
623
|
+
)
|
588
624
|
end
|
589
625
|
|
590
626
|
result = []
|
591
627
|
(0...3).each do |i|
|
592
|
-
res = rgb[i].send(operation, other_num ? other.value : other.rgb[i])
|
628
|
+
res = rgb[i].to_f.send(operation, other_num ? other.value : other.rgb[i])
|
593
629
|
result[i] = [[res, 255].min, 0].max
|
594
630
|
end
|
595
631
|
|
@@ -614,7 +650,7 @@ module Sass::Script::Value
|
|
614
650
|
hue_to_rgb(m1, m2, h + 1.0 / 3),
|
615
651
|
hue_to_rgb(m1, m2, h),
|
616
652
|
hue_to_rgb(m1, m2, h - 1.0 / 3)
|
617
|
-
].map {|c| (c * 0xff)
|
653
|
+
].map {|c| Sass::Util.round(c * 0xff)}
|
618
654
|
end
|
619
655
|
|
620
656
|
def hue_to_rgb(m1, m2, h)
|
@@ -1,6 +1,8 @@
|
|
1
1
|
module Sass::Script::Value
|
2
2
|
# Provides helper functions for creating sass values from within ruby methods.
|
3
3
|
# @since `3.3.0`
|
4
|
+
# @comment
|
5
|
+
# rubocop:disable ModuleLength
|
4
6
|
module Helpers
|
5
7
|
# Construct a Sass Boolean.
|
6
8
|
#
|
@@ -121,8 +123,123 @@ module Sass::Script::Value
|
|
121
123
|
end
|
122
124
|
alias_method :identifier, :unquoted_string
|
123
125
|
|
126
|
+
# Parses a user-provided selector.
|
127
|
+
#
|
128
|
+
# @param value [Sass::Script::Value::String, Sass::Script::Value::List]
|
129
|
+
# The selector to parse. This can be either a string, a list of
|
130
|
+
# strings, or a list of lists of strings as returned by `&`.
|
131
|
+
# @param name [Symbol, nil]
|
132
|
+
# If provided, the name of the selector argument. This is used
|
133
|
+
# for error reporting.
|
134
|
+
# @param allow_parent_ref [Boolean]
|
135
|
+
# Whether the parsed selector should allow parent references.
|
136
|
+
# @return [Sass::Selector::CommaSequence] The parsed selector.
|
137
|
+
# @throw [ArgumentError] if the parse failed for any reason.
|
138
|
+
def parse_selector(value, name = nil, allow_parent_ref = false)
|
139
|
+
str = normalize_selector(value, name)
|
140
|
+
begin
|
141
|
+
Sass::SCSS::StaticParser.new(str, nil, nil, 1, 1, allow_parent_ref).parse_selector
|
142
|
+
rescue Sass::SyntaxError => e
|
143
|
+
err = "#{value.inspect} is not a valid selector: #{e}"
|
144
|
+
err = "$#{name.to_s.tr('_', '-')}: #{err}" if name
|
145
|
+
raise ArgumentError.new(err)
|
146
|
+
end
|
147
|
+
end
|
148
|
+
|
149
|
+
# Parses a user-provided complex selector.
|
150
|
+
#
|
151
|
+
# A complex selector can contain combinators but cannot contain commas.
|
152
|
+
#
|
153
|
+
# @param value [Sass::Script::Value::String, Sass::Script::Value::List]
|
154
|
+
# The selector to parse. This can be either a string or a list of
|
155
|
+
# strings.
|
156
|
+
# @param name [Symbol, nil]
|
157
|
+
# If provided, the name of the selector argument. This is used
|
158
|
+
# for error reporting.
|
159
|
+
# @param allow_parent_ref [Boolean]
|
160
|
+
# Whether the parsed selector should allow parent references.
|
161
|
+
# @return [Sass::Selector::Sequence] The parsed selector.
|
162
|
+
# @throw [ArgumentError] if the parse failed for any reason.
|
163
|
+
def parse_complex_selector(value, name = nil, allow_parent_ref = false)
|
164
|
+
selector = parse_selector(value, name, allow_parent_ref)
|
165
|
+
return seq if selector.members.length == 1
|
166
|
+
|
167
|
+
err = "#{value.inspect} is not a complex selector"
|
168
|
+
err = "$#{name.to_s.tr('_', '-')}: #{err}" if name
|
169
|
+
raise ArgumentError.new(err)
|
170
|
+
end
|
171
|
+
|
172
|
+
# Parses a user-provided compound selector.
|
173
|
+
#
|
174
|
+
# A compound selector cannot contain combinators or commas.
|
175
|
+
#
|
176
|
+
# @param value [Sass::Script::Value::String] The selector to parse.
|
177
|
+
# @param name [Symbol, nil]
|
178
|
+
# If provided, the name of the selector argument. This is used
|
179
|
+
# for error reporting.
|
180
|
+
# @param allow_parent_ref [Boolean]
|
181
|
+
# Whether the parsed selector should allow parent references.
|
182
|
+
# @return [Sass::Selector::SimpleSequence] The parsed selector.
|
183
|
+
# @throw [ArgumentError] if the parse failed for any reason.
|
184
|
+
def parse_compound_selector(value, name = nil, allow_parent_ref = false)
|
185
|
+
assert_type value, :String, name
|
186
|
+
selector = parse_selector(value, name, allow_parent_ref)
|
187
|
+
seq = selector.members.first
|
188
|
+
sseq = seq.members.first
|
189
|
+
if selector.members.length == 1 && seq.members.length == 1 &&
|
190
|
+
sseq.is_a?(Sass::Selector::SimpleSequence)
|
191
|
+
return sseq
|
192
|
+
end
|
193
|
+
|
194
|
+
err = "#{value.inspect} is not a compound selector"
|
195
|
+
err = "$#{name.to_s.tr('_', '-')}: #{err}" if name
|
196
|
+
raise ArgumentError.new(err)
|
197
|
+
end
|
198
|
+
|
199
|
+
# Returns true when the literal is a string containing a calc()
|
200
|
+
#
|
201
|
+
# @param literal [Sass::Script::Value::Base] The value to check
|
202
|
+
# @return boolean
|
203
|
+
def calc?(literal)
|
204
|
+
literal.is_a?(Sass::Script::Value::String) && literal.value =~ /calc\(/
|
205
|
+
end
|
206
|
+
|
124
207
|
private
|
125
208
|
|
209
|
+
# Converts a user-provided selector into string form or throws an
|
210
|
+
# ArgumentError if it's in an invalid format.
|
211
|
+
def normalize_selector(value, name)
|
212
|
+
if (str = selector_to_str(value))
|
213
|
+
return str
|
214
|
+
end
|
215
|
+
|
216
|
+
err = "#{value.inspect} is not a valid selector: it must be a string,\n" +
|
217
|
+
"a list of strings, or a list of lists of strings"
|
218
|
+
err = "$#{name.to_s.tr('_', '-')}: #{err}" if name
|
219
|
+
raise ArgumentError.new(err)
|
220
|
+
end
|
221
|
+
|
222
|
+
# Converts a user-provided selector into string form or returns
|
223
|
+
# `nil` if it's in an invalid format.
|
224
|
+
def selector_to_str(value)
|
225
|
+
return value.value if value.is_a?(Sass::Script::String)
|
226
|
+
return unless value.is_a?(Sass::Script::List)
|
227
|
+
|
228
|
+
if value.separator == :comma
|
229
|
+
return value.to_a.map do |complex|
|
230
|
+
next complex.value if complex.is_a?(Sass::Script::String)
|
231
|
+
return unless complex.is_a?(Sass::Script::List) && complex.separator == :space
|
232
|
+
return unless (str = selector_to_str(complex))
|
233
|
+
str
|
234
|
+
end.join(', ')
|
235
|
+
end
|
236
|
+
|
237
|
+
value.to_a.map do |compound|
|
238
|
+
return unless compound.is_a?(Sass::Script::String)
|
239
|
+
compound.value
|
240
|
+
end.join(' ')
|
241
|
+
end
|
242
|
+
|
126
243
|
# @private
|
127
244
|
VALID_UNIT = /#{Sass::SCSS::RX::NMSTART}#{Sass::SCSS::RX::NMCHAR}|%*/
|
128
245
|
|
@@ -135,14 +252,14 @@ module Sass::Script::Value
|
|
135
252
|
def parse_unit_string(unit_string)
|
136
253
|
denominator_units = numerator_units = Sass::Script::Value::Number::NO_UNITS
|
137
254
|
return numerator_units, denominator_units unless unit_string && unit_string.length > 0
|
138
|
-
num_over_denominator = unit_string.split(
|
255
|
+
num_over_denominator = unit_string.split(%r{ */ *})
|
139
256
|
unless (1..2).include?(num_over_denominator.size)
|
140
257
|
raise ArgumentError.new("Malformed unit string: #{unit_string}")
|
141
258
|
end
|
142
259
|
numerator_units = num_over_denominator[0].split(/ *\* */)
|
143
260
|
denominator_units = (num_over_denominator[1] || "").split(/ *\* */)
|
144
261
|
[[numerator_units, "numerator"], [denominator_units, "denominator"]].each do |units, name|
|
145
|
-
if unit_string =~
|
262
|
+
if unit_string =~ %r{/} && units.size == 0
|
146
263
|
raise ArgumentError.new("Malformed unit string: #{unit_string}")
|
147
264
|
end
|
148
265
|
if units.any? {|unit| unit !~ VALID_UNIT}
|
@@ -65,24 +65,9 @@ module Sass::Script::Value
|
|
65
65
|
# @see Value#to_h
|
66
66
|
def to_h
|
67
67
|
return Sass::Util.ordered_hash if value.empty?
|
68
|
-
return @map ||= Sass::Util.to_hash(value.map {|e| e.to_a}) if is_pseudo_map?
|
69
68
|
super
|
70
69
|
end
|
71
70
|
|
72
|
-
# Returns whether a warning still needs to be printed for this list being used as a map.
|
73
|
-
#
|
74
|
-
# @return [Boolean]
|
75
|
-
def needs_map_warning?
|
76
|
-
!@value.empty? && !@map
|
77
|
-
end
|
78
|
-
|
79
|
-
# Returns whether this is a list of pairs that can be used as a map.
|
80
|
-
#
|
81
|
-
# @return [Boolean]
|
82
|
-
def is_pseudo_map?
|
83
|
-
@is_pseudo_map ||= value.all? {|e| e.is_a?(Sass::Script::Value::List) && e.to_a.length == 2}
|
84
|
-
end
|
85
|
-
|
86
71
|
# @see Value#inspect
|
87
72
|
def inspect
|
88
73
|
"(#{value.map {|e| e.inspect}.join(sep_str(nil))})"
|
@@ -56,7 +56,7 @@ module Sass::Script::Value
|
|
56
56
|
return "()" if value.empty?
|
57
57
|
|
58
58
|
to_sass = lambda do |value|
|
59
|
-
if value.is_a?(
|
59
|
+
if value.is_a?(List) && value.separator == :comma
|
60
60
|
"(#{value.to_sass(opts)})"
|
61
61
|
else
|
62
62
|
value.to_sass(opts)
|