sass 3.4.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 +26 -20
- data/Rakefile +103 -20
- data/VERSION +1 -1
- data/VERSION_DATE +1 -1
- data/extra/sass-spec-ref.sh +32 -0
- data/extra/update_watch.rb +1 -1
- data/lib/sass/cache_stores/filesystem.rb +7 -7
- data/lib/sass/cache_stores/memory.rb +4 -5
- data/lib/sass/callbacks.rb +2 -2
- data/lib/sass/css.rb +11 -10
- data/lib/sass/deprecation.rb +55 -0
- data/lib/sass/engine.rb +83 -38
- data/lib/sass/environment.rb +26 -2
- data/lib/sass/error.rb +12 -12
- data/lib/sass/exec/base.rb +15 -3
- data/lib/sass/exec/sass_convert.rb +34 -15
- data/lib/sass/exec/sass_scss.rb +23 -7
- data/lib/sass/features.rb +2 -2
- data/lib/sass/importers/base.rb +1 -1
- data/lib/sass/importers/deprecated_path.rb +51 -0
- data/lib/sass/importers/filesystem.rb +24 -16
- data/lib/sass/importers.rb +1 -0
- 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/plugin/compiler.rb +42 -25
- 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 +3 -3
- data/lib/sass/plugin.rb +3 -2
- 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 +140 -73
- data/lib/sass/script/lexer.rb +37 -22
- data/lib/sass/script/parser.rb +235 -40
- data/lib/sass/script/tree/funcall.rb +12 -5
- data/lib/sass/script/tree/interpolation.rb +109 -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/string_interpolation.rb +58 -37
- data/lib/sass/script/tree/variable.rb +1 -1
- data/lib/sass/script/value/base.rb +10 -9
- data/lib/sass/script/value/color.rb +42 -24
- data/lib/sass/script/value/helpers.rb +16 -6
- data/lib/sass/script/value/map.rb +1 -1
- data/lib/sass/script/value/number.rb +52 -19
- data/lib/sass/script/value/string.rb +46 -5
- data/lib/sass/script.rb +3 -3
- data/lib/sass/scss/css_parser.rb +16 -2
- data/lib/sass/scss/parser.rb +120 -75
- data/lib/sass/scss/rx.rb +9 -10
- data/lib/sass/scss/static_parser.rb +19 -14
- data/lib/sass/scss.rb +0 -2
- data/lib/sass/selector/abstract_sequence.rb +8 -6
- data/lib/sass/selector/comma_sequence.rb +25 -9
- data/lib/sass/selector/pseudo.rb +45 -35
- data/lib/sass/selector/sequence.rb +54 -18
- data/lib/sass/selector/simple.rb +11 -11
- data/lib/sass/selector/simple_sequence.rb +34 -15
- data/lib/sass/selector.rb +7 -10
- data/lib/sass/shared.rb +1 -1
- data/lib/sass/source/map.rb +7 -4
- data/lib/sass/source/position.rb +4 -4
- data/lib/sass/stack.rb +2 -2
- data/lib/sass/supports.rb +8 -10
- data/lib/sass/tree/comment_node.rb +1 -1
- data/lib/sass/tree/css_import_node.rb +9 -1
- data/lib/sass/tree/function_node.rb +8 -3
- data/lib/sass/tree/import_node.rb +6 -5
- data/lib/sass/tree/node.rb +5 -3
- data/lib/sass/tree/prop_node.rb +5 -6
- data/lib/sass/tree/rule_node.rb +14 -4
- data/lib/sass/tree/visitors/check_nesting.rb +18 -22
- data/lib/sass/tree/visitors/convert.rb +43 -26
- data/lib/sass/tree/visitors/cssize.rb +5 -1
- data/lib/sass/tree/visitors/deep_copy.rb +1 -1
- data/lib/sass/tree/visitors/extend.rb +15 -13
- data/lib/sass/tree/visitors/perform.rb +42 -17
- data/lib/sass/tree/visitors/set_options.rb +1 -1
- data/lib/sass/tree/visitors/to_css.rb +58 -30
- 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 +1 -2
- data/lib/sass/util.rb +125 -68
- data/lib/sass/version.rb +2 -2
- data/lib/sass.rb +10 -3
- data/test/sass/compiler_test.rb +6 -2
- data/test/sass/conversion_test.rb +187 -53
- data/test/sass/css2sass_test.rb +50 -1
- data/test/sass/css_variable_test.rb +132 -0
- data/test/sass/engine_test.rb +207 -61
- data/test/sass/exec_test.rb +10 -0
- data/test/sass/extend_test.rb +101 -29
- data/test/sass/functions_test.rb +60 -9
- data/test/sass/importer_test.rb +9 -0
- 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 +10 -8
- data/test/sass/results/script.css +3 -3
- data/test/sass/script_conversion_test.rb +58 -29
- data/test/sass/script_test.rb +430 -53
- data/test/sass/scss/css_test.rb +73 -7
- data/test/sass/scss/rx_test.rb +4 -0
- data/test/sass/scss/scss_test.rb +309 -4
- data/test/sass/source_map_test.rb +152 -74
- data/test/sass/superselector_test.rb +19 -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/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/util/multibyte_string_scanner_test.rb +10 -2
- data/test/sass/util_test.rb +15 -44
- data/test/sass-spec.yml +3 -0
- data/test/test_helper.rb +5 -4
- metadata +302 -295
- data/CONTRIBUTING +0 -3
- data/lib/sass/scss/script_lexer.rb +0 -15
- data/lib/sass/scss/script_parser.rb +0 -25
@@ -123,7 +123,7 @@ module Sass::Script
|
|
123
123
|
# : Inserts `$insert` into `$string` at `$index`.
|
124
124
|
#
|
125
125
|
# \{#str_index str-index($string, $substring)}
|
126
|
-
# : Returns the index of the first
|
126
|
+
# : Returns the index of the first occurrence of `$substring` in `$string`.
|
127
127
|
#
|
128
128
|
# \{#str_slice str-slice($string, $start-at, [$end-at])}
|
129
129
|
# : Extracts a substring from `$string`.
|
@@ -162,6 +162,9 @@ module Sass::Script
|
|
162
162
|
#
|
163
163
|
# ## List Functions {#list-functions}
|
164
164
|
#
|
165
|
+
# Lists in Sass are immutable; all list functions return a new list rather
|
166
|
+
# than updating the existing list in-place.
|
167
|
+
#
|
165
168
|
# All list functions work for maps as well, treating them as lists of pairs.
|
166
169
|
#
|
167
170
|
# \{#length length($list)}
|
@@ -170,6 +173,9 @@ module Sass::Script
|
|
170
173
|
# \{#nth nth($list, $n)}
|
171
174
|
# : Returns a specific item in a list.
|
172
175
|
#
|
176
|
+
# \{#set-nth set-nth($list, $n, $value)}
|
177
|
+
# : Replaces the nth item in a list.
|
178
|
+
#
|
173
179
|
# \{#join join($list1, $list2, \[$separator\])}
|
174
180
|
# : Joins together two lists into one.
|
175
181
|
#
|
@@ -182,11 +188,14 @@ module Sass::Script
|
|
182
188
|
# \{#index index($list, $value)}
|
183
189
|
# : Returns the position of a value within a list.
|
184
190
|
#
|
185
|
-
# \{#list_separator list-separator(
|
191
|
+
# \{#list_separator list-separator($list)}
|
186
192
|
# : Returns the separator of a list.
|
187
193
|
#
|
188
194
|
# ## Map Functions {#map-functions}
|
189
195
|
#
|
196
|
+
# Maps in Sass are immutable; all map functions return a new map rather than
|
197
|
+
# updating the existing map in-place.
|
198
|
+
#
|
190
199
|
# \{#map_get map-get($map, $key)}
|
191
200
|
# : Returns the value in a map associated with a given key.
|
192
201
|
#
|
@@ -214,7 +223,7 @@ module Sass::Script
|
|
214
223
|
# for selector arguments. They can take a plain string, a list of
|
215
224
|
# lists as returned by `&` or anything in between:
|
216
225
|
#
|
217
|
-
# * A plain
|
226
|
+
# * A plain string, such as `".foo .bar, .baz .bang"`.
|
218
227
|
# * A space-separated list of strings such as `(".foo" ".bar")`.
|
219
228
|
# * A comma-separated list of strings such as `(".foo .bar", ".baz .bang")`.
|
220
229
|
# * A comma-separated list of space-separated lists of strings such
|
@@ -347,6 +356,7 @@ module Sass::Script
|
|
347
356
|
#
|
348
357
|
# @comment
|
349
358
|
# rubocop:enable LineLength
|
359
|
+
# rubocop:disable ModuleLength
|
350
360
|
module Functions
|
351
361
|
@signatures = {}
|
352
362
|
|
@@ -421,8 +431,8 @@ module Sass::Script
|
|
421
431
|
# If no signatures match, the first signature is returned for error messaging.
|
422
432
|
#
|
423
433
|
# @param method_name [Symbol] The name of the Ruby function to be called.
|
424
|
-
# @param arg_arity [
|
425
|
-
# @param kwarg_arity [
|
434
|
+
# @param arg_arity [Integer] The number of unnamed arguments the function was passed.
|
435
|
+
# @param kwarg_arity [Integer] The number of keyword arguments the function was passed.
|
426
436
|
#
|
427
437
|
# @return [{Symbol => Object}, nil]
|
428
438
|
# The signature options for the matching signature,
|
@@ -445,8 +455,8 @@ module Sass::Script
|
|
445
455
|
t_arg_arity = sig_arity
|
446
456
|
end
|
447
457
|
|
448
|
-
if
|
449
|
-
(t_kwarg_arity == 0
|
458
|
+
if (t_arg_arity == sig_arity || t_arg_arity > sig_arity && signature.var_args) &&
|
459
|
+
(t_kwarg_arity == 0 || t_kwarg_arity > 0 && signature.var_kwargs)
|
450
460
|
return signature
|
451
461
|
end
|
452
462
|
end
|
@@ -479,8 +489,7 @@ module Sass::Script
|
|
479
489
|
include Value::Helpers
|
480
490
|
|
481
491
|
# The human-readable names for [Sass::Script::Value::Base]. The default is
|
482
|
-
# just the downcased name of the type.
|
483
|
-
# name.
|
492
|
+
# just the downcased name of the type.
|
484
493
|
TYPE_NAMES = {:ArgList => 'variable argument list'}
|
485
494
|
|
486
495
|
# The environment for this function. This environment's
|
@@ -518,10 +527,14 @@ module Sass::Script
|
|
518
527
|
# @raise [ArgumentError] if value is not of the correct type.
|
519
528
|
def assert_type(value, type, name = nil)
|
520
529
|
klass = Sass::Script::Value.const_get(type)
|
521
|
-
|
530
|
+
if value.is_a?(klass)
|
531
|
+
value.check_deprecated_interp if type == :String
|
532
|
+
return
|
533
|
+
end
|
534
|
+
|
522
535
|
return if value.is_a?(Sass::Script::Value::List) && type == :Map && value.value.empty?
|
523
536
|
err = "#{value.inspect} is not a #{TYPE_NAMES[type] || type.to_s.downcase}"
|
524
|
-
err = "$#{name.to_s.
|
537
|
+
err = "$#{name.to_s.tr('_', '-')}: " + err if name
|
525
538
|
raise ArgumentError.new(err)
|
526
539
|
end
|
527
540
|
|
@@ -622,11 +635,14 @@ module Sass::Script
|
|
622
635
|
# @return [Sass::Script::Value::Color]
|
623
636
|
# @raise [ArgumentError] if any parameter is the wrong type or out of bounds
|
624
637
|
def rgb(red, green, blue)
|
638
|
+
if calc?(red) || calc?(green) || calc?(blue)
|
639
|
+
return unquoted_string("rgb(#{red}, #{green}, #{blue})")
|
640
|
+
end
|
625
641
|
assert_type red, :Number, :red
|
626
642
|
assert_type green, :Number, :green
|
627
643
|
assert_type blue, :Number, :blue
|
628
644
|
|
629
|
-
color_attrs = [
|
645
|
+
color_attrs = [red, green, blue].map do |c|
|
630
646
|
if c.is_unit?("%")
|
631
647
|
c.value * 255 / 100.0
|
632
648
|
elsif c.unitless?
|
@@ -649,11 +665,11 @@ module Sass::Script
|
|
649
665
|
#
|
650
666
|
# @overload rgba($red, $green, $blue, $alpha)
|
651
667
|
# @param $red [Sass::Script::Value::Number] The amount of red in the
|
652
|
-
# color. Must be between 0 and 255 inclusive
|
668
|
+
# color. Must be between 0 and 255 inclusive or 0% and 100% inclusive
|
653
669
|
# @param $green [Sass::Script::Value::Number] The amount of green in the
|
654
|
-
# color. Must be between 0 and 255 inclusive
|
670
|
+
# color. Must be between 0 and 255 inclusive or 0% and 100% inclusive
|
655
671
|
# @param $blue [Sass::Script::Value::Number] The amount of blue in the
|
656
|
-
# color. Must be between 0 and 255 inclusive
|
672
|
+
# color. Must be between 0 and 255 inclusive or 0% and 100% inclusive
|
657
673
|
# @param $alpha [Sass::Script::Value::Number] The opacity of the color.
|
658
674
|
# Must be between 0 and 1 inclusive
|
659
675
|
# @return [Sass::Script::Value::Color]
|
@@ -680,12 +696,20 @@ module Sass::Script
|
|
680
696
|
color, alpha = args
|
681
697
|
|
682
698
|
assert_type color, :Color, :color
|
683
|
-
|
684
|
-
|
685
|
-
|
699
|
+
if calc?(alpha)
|
700
|
+
unquoted_string("rgba(#{color.red}, #{color.green}, #{color.blue}, #{alpha})")
|
701
|
+
else
|
702
|
+
assert_type alpha, :Number, :alpha
|
703
|
+
check_alpha_unit alpha, 'rgba'
|
704
|
+
color.with(:alpha => alpha.value)
|
705
|
+
end
|
686
706
|
when 4
|
687
707
|
red, green, blue, alpha = args
|
688
|
-
|
708
|
+
if calc?(red) || calc?(green) || calc?(blue) || calc?(alpha)
|
709
|
+
unquoted_string("rgba(#{red}, #{green}, #{blue}, #{alpha})")
|
710
|
+
else
|
711
|
+
rgba(rgb(red, green, blue), alpha)
|
712
|
+
end
|
689
713
|
else
|
690
714
|
raise ArgumentError.new("wrong number of arguments (#{args.size} for 4)")
|
691
715
|
end
|
@@ -710,7 +734,11 @@ module Sass::Script
|
|
710
734
|
# @raise [ArgumentError] if `$saturation` or `$lightness` are out of bounds
|
711
735
|
# or any parameter is the wrong type
|
712
736
|
def hsl(hue, saturation, lightness)
|
713
|
-
|
737
|
+
if calc?(hue) || calc?(saturation) || calc?(lightness)
|
738
|
+
unquoted_string("hsl(#{hue}, #{saturation}, #{lightness})")
|
739
|
+
else
|
740
|
+
hsla(hue, saturation, lightness, number(1))
|
741
|
+
end
|
714
742
|
end
|
715
743
|
declare :hsl, [:hue, :saturation, :lightness]
|
716
744
|
|
@@ -734,10 +762,14 @@ module Sass::Script
|
|
734
762
|
# @raise [ArgumentError] if `$saturation`, `$lightness`, or `$alpha` are out
|
735
763
|
# of bounds or any parameter is the wrong type
|
736
764
|
def hsla(hue, saturation, lightness, alpha)
|
765
|
+
if calc?(hue) || calc?(saturation) || calc?(lightness) || calc?(alpha)
|
766
|
+
return unquoted_string("hsla(#{hue}, #{saturation}, #{lightness}, #{alpha})")
|
767
|
+
end
|
737
768
|
assert_type hue, :Number, :hue
|
738
769
|
assert_type saturation, :Number, :saturation
|
739
770
|
assert_type lightness, :Number, :lightness
|
740
771
|
assert_type alpha, :Number, :alpha
|
772
|
+
check_alpha_unit alpha, 'hsla'
|
741
773
|
|
742
774
|
h = hue.value
|
743
775
|
s = saturation.value
|
@@ -869,7 +901,7 @@ module Sass::Script
|
|
869
901
|
a.value =~ /^[a-zA-Z]+\s*=/
|
870
902
|
end
|
871
903
|
# Support the proprietary MS alpha() function
|
872
|
-
return identifier("alpha(#{args.map {|a| a.to_s}.join(
|
904
|
+
return identifier("alpha(#{args.map {|a| a.to_s}.join(', ')})")
|
873
905
|
end
|
874
906
|
|
875
907
|
raise ArgumentError.new("wrong number of arguments (#{args.size} for 1)") if args.size != 1
|
@@ -1053,7 +1085,7 @@ module Sass::Script
|
|
1053
1085
|
# @raise [ArgumentError] if `$color` isn't a color
|
1054
1086
|
def ie_hex_str(color)
|
1055
1087
|
assert_type color, :Color, :color
|
1056
|
-
alpha = (color.alpha * 255).
|
1088
|
+
alpha = Sass::Util.round(color.alpha * 255).to_s(16).rjust(2, '0')
|
1057
1089
|
identifier("##{alpha}#{color.send(:hex_str)[1..-1]}".upcase)
|
1058
1090
|
end
|
1059
1091
|
declare :ie_hex_str, [:color]
|
@@ -1071,11 +1103,7 @@ module Sass::Script
|
|
1071
1103
|
# adjust-color(#102030, $blue: 5) => #102035
|
1072
1104
|
# adjust-color(#102030, $red: -5, $blue: 5) => #0b2035
|
1073
1105
|
# adjust-color(hsl(25, 100%, 80%), $lightness: -30%, $alpha: -0.4) => hsla(25, 100%, 50%, 0.6)
|
1074
|
-
# @comment
|
1075
|
-
# rubocop:disable LineLength
|
1076
1106
|
# @overload adjust_color($color, [$red], [$green], [$blue], [$hue], [$saturation], [$lightness], [$alpha])
|
1077
|
-
# @comment
|
1078
|
-
# rubocop:disable LineLength
|
1079
1107
|
# @param $color [Sass::Script::Value::Color]
|
1080
1108
|
# @param $red [Sass::Script::Value::Number] The adjustment to make on the
|
1081
1109
|
# red component, between -255 and 255 inclusive
|
@@ -1098,15 +1126,14 @@ module Sass::Script
|
|
1098
1126
|
def adjust_color(color, kwargs)
|
1099
1127
|
assert_type color, :Color, :color
|
1100
1128
|
with = Sass::Util.map_hash(
|
1101
|
-
|
1102
|
-
|
1103
|
-
|
1104
|
-
|
1105
|
-
|
1106
|
-
|
1107
|
-
|
1108
|
-
|
1109
|
-
|
1129
|
+
"red" => [-255..255, ""],
|
1130
|
+
"green" => [-255..255, ""],
|
1131
|
+
"blue" => [-255..255, ""],
|
1132
|
+
"hue" => nil,
|
1133
|
+
"saturation" => [-100..100, "%"],
|
1134
|
+
"lightness" => [-100..100, "%"],
|
1135
|
+
"alpha" => [-1..1, ""]
|
1136
|
+
) do |name, (range, units)|
|
1110
1137
|
val = kwargs.delete(name)
|
1111
1138
|
next unless val
|
1112
1139
|
assert_type val, :Number, name
|
@@ -1152,11 +1179,7 @@ module Sass::Script
|
|
1152
1179
|
# scale-color(hsl(120, 70%, 80%), $lightness: 50%) => hsl(120, 70%, 90%)
|
1153
1180
|
# scale-color(rgb(200, 150%, 170%), $green: -40%, $blue: 70%) => rgb(200, 90, 229)
|
1154
1181
|
# scale-color(hsl(200, 70%, 80%), $saturation: -90%, $alpha: -30%) => hsla(200, 7%, 80%, 0.7)
|
1155
|
-
# @comment
|
1156
|
-
# rubocop:disable LineLength
|
1157
1182
|
# @overload scale_color($color, [$red], [$green], [$blue], [$saturation], [$lightness], [$alpha])
|
1158
|
-
# @comment
|
1159
|
-
# rubocop:disable LineLength
|
1160
1183
|
# @param $color [Sass::Script::Value::Color]
|
1161
1184
|
# @param $red [Sass::Script::Value::Number]
|
1162
1185
|
# @param $green [Sass::Script::Value::Number]
|
@@ -1171,14 +1194,13 @@ module Sass::Script
|
|
1171
1194
|
def scale_color(color, kwargs)
|
1172
1195
|
assert_type color, :Color, :color
|
1173
1196
|
with = Sass::Util.map_hash(
|
1174
|
-
|
1175
|
-
|
1176
|
-
|
1177
|
-
|
1178
|
-
|
1179
|
-
|
1180
|
-
|
1181
|
-
|
1197
|
+
"red" => 255,
|
1198
|
+
"green" => 255,
|
1199
|
+
"blue" => 255,
|
1200
|
+
"saturation" => 100,
|
1201
|
+
"lightness" => 100,
|
1202
|
+
"alpha" => 1
|
1203
|
+
) do |name, max|
|
1182
1204
|
val = kwargs.delete(name)
|
1183
1205
|
next unless val
|
1184
1206
|
assert_type val, :Number, name
|
@@ -1213,11 +1235,7 @@ module Sass::Script
|
|
1213
1235
|
# change-color(#102030, $blue: 5) => #102005
|
1214
1236
|
# change-color(#102030, $red: 120, $blue: 5) => #782005
|
1215
1237
|
# change-color(hsl(25, 100%, 80%), $lightness: 40%, $alpha: 0.8) => hsla(25, 100%, 40%, 0.8)
|
1216
|
-
# @comment
|
1217
|
-
# rubocop:disable LineLength
|
1218
1238
|
# @overload change_color($color, [$red], [$green], [$blue], [$hue], [$saturation], [$lightness], [$alpha])
|
1219
|
-
# @comment
|
1220
|
-
# rubocop:disable LineLength
|
1221
1239
|
# @param $color [Sass::Script::Value::Color]
|
1222
1240
|
# @param $red [Sass::Script::Value::Number] The new red component for the
|
1223
1241
|
# color, within 0 and 255 inclusive
|
@@ -1287,7 +1305,7 @@ module Sass::Script
|
|
1287
1305
|
# @param $color1 [Sass::Script::Value::Color]
|
1288
1306
|
# @param $color2 [Sass::Script::Value::Color]
|
1289
1307
|
# @param $weight [Sass::Script::Value::Number] The relative weight of each
|
1290
|
-
# color. Closer to `
|
1308
|
+
# color. Closer to `100%` gives more weight to `$color1`, closer to `0%`
|
1291
1309
|
# gives more weight to `$color2`
|
1292
1310
|
# @return [Sass::Script::Value::Color]
|
1293
1311
|
# @raise [ArgumentError] if `$weight` is out of bounds or any parameter is
|
@@ -1393,11 +1411,27 @@ module Sass::Script
|
|
1393
1411
|
# @return [Sass::Script::Value::String]
|
1394
1412
|
# @raise [ArgumentError] if `$string` isn't a string
|
1395
1413
|
def unquote(string)
|
1396
|
-
|
1397
|
-
|
1398
|
-
|
1399
|
-
|
1414
|
+
unless string.is_a?(Sass::Script::Value::String)
|
1415
|
+
# Don't warn multiple times for the same source line.
|
1416
|
+
# rubocop:disable GlobalVars
|
1417
|
+
$_sass_warned_for_unquote ||= Set.new
|
1418
|
+
frame = environment.stack.frames.last
|
1419
|
+
key = [frame.filename, frame.line] if frame
|
1420
|
+
return string if frame && $_sass_warned_for_unquote.include?(key)
|
1421
|
+
$_sass_warned_for_unquote << key if frame
|
1422
|
+
# rubocop:enable GlobalVars
|
1423
|
+
|
1424
|
+
Sass::Util.sass_warn(<<MESSAGE.strip)
|
1425
|
+
DEPRECATION WARNING: Passing #{string.to_sass}, a non-string value, to unquote()
|
1426
|
+
will be an error in future versions of Sass.
|
1427
|
+
#{environment.stack.to_s.gsub(/^/, ' ' * 8)}
|
1428
|
+
MESSAGE
|
1429
|
+
return string
|
1400
1430
|
end
|
1431
|
+
|
1432
|
+
string.check_deprecated_interp
|
1433
|
+
return string if string.type == :identifier
|
1434
|
+
identifier(string.value)
|
1401
1435
|
end
|
1402
1436
|
declare :unquote, [:string]
|
1403
1437
|
|
@@ -1461,10 +1495,10 @@ module Sass::Script
|
|
1461
1495
|
assert_type insert, :String, :insert
|
1462
1496
|
assert_integer index, :index
|
1463
1497
|
assert_unit index, nil, :index
|
1464
|
-
insertion_point = if index.
|
1465
|
-
[index.
|
1498
|
+
insertion_point = if index.to_i > 0
|
1499
|
+
[index.to_i - 1, original.value.size].min
|
1466
1500
|
else
|
1467
|
-
[index.
|
1501
|
+
[index.to_i, -original.value.size - 1].max
|
1468
1502
|
end
|
1469
1503
|
result = original.value.dup.insert(insertion_point, insert.value)
|
1470
1504
|
Sass::Script::Value::String.new(result, original.type)
|
@@ -1512,7 +1546,7 @@ module Sass::Script
|
|
1512
1546
|
# @param $start-at [Sass::Script::Value::Number] The index of the first
|
1513
1547
|
# character of the substring. If this is negative, it counts from the end
|
1514
1548
|
# of `$string`
|
1515
|
-
# @param $end-
|
1549
|
+
# @param $end-at [Sass::Script::Value::Number] The index of the last
|
1516
1550
|
# character of the substring. If this is negative, it counts from the end
|
1517
1551
|
# of `$string`. Defaults to -1
|
1518
1552
|
# @return [Sass::Script::Value::String] The substring. This will be quoted
|
@@ -1531,7 +1565,7 @@ module Sass::Script
|
|
1531
1565
|
s = string.value.length + s if s < 0
|
1532
1566
|
s = 0 if s < 0
|
1533
1567
|
e = string.value.length + e if e < 0
|
1534
|
-
|
1568
|
+
return Sass::Script::Value::String.new("", string.type) if e < 0
|
1535
1569
|
extracted = string.value.slice(s..e)
|
1536
1570
|
Sass::Script::Value::String.new(extracted || "", string.type)
|
1537
1571
|
end
|
@@ -1549,7 +1583,7 @@ module Sass::Script
|
|
1549
1583
|
# @raise [ArgumentError] if `$string` isn't a string
|
1550
1584
|
def to_upper_case(string)
|
1551
1585
|
assert_type string, :String, :string
|
1552
|
-
Sass::Script::Value::String.new(string.value
|
1586
|
+
Sass::Script::Value::String.new(Sass::Util.upcase(string.value), string.type)
|
1553
1587
|
end
|
1554
1588
|
declare :to_upper_case, [:string]
|
1555
1589
|
|
@@ -1564,7 +1598,7 @@ module Sass::Script
|
|
1564
1598
|
# @raise [ArgumentError] if `$string` isn't a string
|
1565
1599
|
def to_lower_case(string)
|
1566
1600
|
assert_type string, :String, :string
|
1567
|
-
Sass::Script::Value::String.new(string.value
|
1601
|
+
Sass::Script::Value::String.new(Sass::Util.downcase(string.value), string.type)
|
1568
1602
|
end
|
1569
1603
|
declare :to_lower_case, [:string]
|
1570
1604
|
|
@@ -1577,11 +1611,13 @@ module Sass::Script
|
|
1577
1611
|
# type-of(true) => bool
|
1578
1612
|
# type-of(#fff) => color
|
1579
1613
|
# type-of(blue) => color
|
1614
|
+
# type-of(null) => null
|
1580
1615
|
# @overload type_of($value)
|
1581
1616
|
# @param $value [Sass::Script::Value::Base] The value to inspect
|
1582
1617
|
# @return [Sass::Script::Value::String] The unquoted string name of the
|
1583
1618
|
# value's type
|
1584
1619
|
def type_of(value)
|
1620
|
+
value.check_deprecated_interp if value.is_a?(Sass::Script::Value::String)
|
1585
1621
|
identifier(value.class.name.gsub(/Sass::Script::Value::/, '').downcase)
|
1586
1622
|
end
|
1587
1623
|
declare :type_of, [:value]
|
@@ -1697,7 +1733,7 @@ module Sass::Script
|
|
1697
1733
|
# @return [Sass::Script::Value::Number]
|
1698
1734
|
# @raise [ArgumentError] if `$number` isn't a number
|
1699
1735
|
def round(number)
|
1700
|
-
numeric_transformation(number) {|n|
|
1736
|
+
numeric_transformation(number) {|n| Sass::Util.round(n)}
|
1701
1737
|
end
|
1702
1738
|
declare :round, [:number]
|
1703
1739
|
|
@@ -1860,6 +1896,9 @@ module Sass::Script
|
|
1860
1896
|
# list. If both lists have fewer than two items, spaces are used for the
|
1861
1897
|
# resulting list.
|
1862
1898
|
#
|
1899
|
+
# Like all list functions, `join()` returns a new list rather than modifying
|
1900
|
+
# its arguments in place.
|
1901
|
+
#
|
1863
1902
|
# @example
|
1864
1903
|
# join(10px 20px, 30px 40px) => 10px 20px 30px 40px
|
1865
1904
|
# join((blue, red), (#abc, #def)) => blue, red, #abc, #def
|
@@ -1875,7 +1914,7 @@ module Sass::Script
|
|
1875
1914
|
# @return [Sass::Script::Value::List]
|
1876
1915
|
def join(list1, list2, separator = identifier("auto"))
|
1877
1916
|
assert_type separator, :String, :separator
|
1878
|
-
unless %w
|
1917
|
+
unless %w(auto space comma).include?(separator.value)
|
1879
1918
|
raise ArgumentError.new("Separator name must be space, comma, or auto")
|
1880
1919
|
end
|
1881
1920
|
sep = if separator.value == 'auto'
|
@@ -1893,6 +1932,9 @@ module Sass::Script
|
|
1893
1932
|
# Unless the `$separator` argument is passed, if the list had only one item,
|
1894
1933
|
# the resulting list will be space-separated.
|
1895
1934
|
#
|
1935
|
+
# Like all list functions, `append()` returns a new list rather than
|
1936
|
+
# modifying its argument in place.
|
1937
|
+
#
|
1896
1938
|
# @example
|
1897
1939
|
# append(10px 20px, 30px) => 10px 20px 30px
|
1898
1940
|
# append((blue, red), green) => blue, red, green
|
@@ -1908,7 +1950,7 @@ module Sass::Script
|
|
1908
1950
|
# @return [Sass::Script::Value::List]
|
1909
1951
|
def append(list, val, separator = identifier("auto"))
|
1910
1952
|
assert_type separator, :String, :separator
|
1911
|
-
unless %w
|
1953
|
+
unless %w(auto space comma).include?(separator.value)
|
1912
1954
|
raise ArgumentError.new("Separator name must be space, comma, or auto")
|
1913
1955
|
end
|
1914
1956
|
sep = if separator.value == 'auto'
|
@@ -2016,6 +2058,9 @@ module Sass::Script
|
|
2016
2058
|
# same order as in `$map1`. New keys from `$map2` will be placed at the end
|
2017
2059
|
# of the map.
|
2018
2060
|
#
|
2061
|
+
# Like all map functions, `map-merge()` returns a new map rather than
|
2062
|
+
# modifying its arguments in place.
|
2063
|
+
#
|
2019
2064
|
# @example
|
2020
2065
|
# map-merge(("foo": 1), ("bar": 2)) => ("foo": 1, "bar": 2)
|
2021
2066
|
# map-merge(("foo": 1, "bar": 2), ("bar": 3)) => ("foo": 1, "bar": 3)
|
@@ -2033,6 +2078,9 @@ module Sass::Script
|
|
2033
2078
|
|
2034
2079
|
# Returns a new map with keys removed.
|
2035
2080
|
#
|
2081
|
+
# Like all map functions, `map-merge()` returns a new map rather than
|
2082
|
+
# modifying its arguments in place.
|
2083
|
+
#
|
2036
2084
|
# @example
|
2037
2085
|
# map-remove(("foo": 1, "bar": 2), "bar") => ("foo": 1)
|
2038
2086
|
# map-remove(("foo": 1, "bar": 2, "baz": 3), "bar", "baz") => ("foo": 1)
|
@@ -2216,6 +2264,7 @@ module Sass::Script
|
|
2216
2264
|
# @example
|
2217
2265
|
# $a-false-value: false;
|
2218
2266
|
# variable-exists(a-false-value) => true
|
2267
|
+
# variable-exists(a-null-value) => true
|
2219
2268
|
#
|
2220
2269
|
# variable-exists(nonexistent) => false
|
2221
2270
|
#
|
@@ -2236,6 +2285,7 @@ module Sass::Script
|
|
2236
2285
|
# @example
|
2237
2286
|
# $a-false-value: false;
|
2238
2287
|
# global-variable-exists(a-false-value) => true
|
2288
|
+
# global-variable-exists(a-null-value) => true
|
2239
2289
|
#
|
2240
2290
|
# .foo {
|
2241
2291
|
# $some-var: false;
|
@@ -2298,6 +2348,7 @@ module Sass::Script
|
|
2298
2348
|
# @return [Sass::Script::Value::String] A representation of the value as
|
2299
2349
|
# it would be written in Sass.
|
2300
2350
|
def inspect(value)
|
2351
|
+
value.check_deprecated_interp if value.is_a?(Sass::Script::Value::String)
|
2301
2352
|
unquoted_string(value.to_sass)
|
2302
2353
|
end
|
2303
2354
|
declare :inspect, [:value]
|
@@ -2306,7 +2357,7 @@ module Sass::Script
|
|
2306
2357
|
# Return a decimal between 0 and 1, inclusive of 0 but not 1.
|
2307
2358
|
# @return [Sass::Script::Value::Number] A decimal value.
|
2308
2359
|
# @overload random($limit)
|
2309
|
-
# Return an integer between 1 and `$limit`, inclusive of 1
|
2360
|
+
# Return an integer between 1 and `$limit`, inclusive of both 1 and `$limit`.
|
2310
2361
|
# @param $limit [Sass::Script::Value::Number] The maximum of the random integer to be
|
2311
2362
|
# returned, a positive integer.
|
2312
2363
|
# @return [Sass::Script::Value::Number] An integer.
|
@@ -2315,10 +2366,10 @@ module Sass::Script
|
|
2315
2366
|
generator = Sass::Script::Functions.random_number_generator
|
2316
2367
|
if limit
|
2317
2368
|
assert_integer limit, "limit"
|
2318
|
-
if limit.
|
2369
|
+
if limit.to_i < 1
|
2319
2370
|
raise ArgumentError.new("$limit #{limit} must be greater than or equal to 1")
|
2320
2371
|
end
|
2321
|
-
number(1 + generator.rand(limit.
|
2372
|
+
number(1 + generator.rand(limit.to_i))
|
2322
2373
|
else
|
2323
2374
|
number(generator.rand)
|
2324
2375
|
end
|
@@ -2371,7 +2422,7 @@ module Sass::Script
|
|
2371
2422
|
end
|
2372
2423
|
|
2373
2424
|
parsed = [parse_selector(selectors.first, :selectors)]
|
2374
|
-
parsed += selectors[1..-1].map {|sel| parse_selector(sel, :selectors,
|
2425
|
+
parsed += selectors[1..-1].map {|sel| parse_selector(sel, :selectors, true)}
|
2375
2426
|
parsed.inject {|result, child| child.resolve_parent_refs(result)}.to_sass_script
|
2376
2427
|
end
|
2377
2428
|
declare :selector_nest, [], :var_args => true
|
@@ -2459,7 +2510,7 @@ module Sass::Script
|
|
2459
2510
|
|
2460
2511
|
extends = Sass::Util::SubsetMap.new
|
2461
2512
|
begin
|
2462
|
-
extender.populate_extends(extends, extendee)
|
2513
|
+
extender.populate_extends(extends, extendee, nil, [], true)
|
2463
2514
|
selector.do_extend(extends).to_sass_script
|
2464
2515
|
rescue Sass::SyntaxError => e
|
2465
2516
|
raise ArgumentError.new(e.to_s)
|
@@ -2502,8 +2553,8 @@ module Sass::Script
|
|
2502
2553
|
|
2503
2554
|
extends = Sass::Util::SubsetMap.new
|
2504
2555
|
begin
|
2505
|
-
replacement.populate_extends(extends, original)
|
2506
|
-
selector.do_extend(extends, [],
|
2556
|
+
replacement.populate_extends(extends, original, nil, [], true)
|
2557
|
+
selector.do_extend(extends, [], true).to_sass_script
|
2507
2558
|
rescue Sass::SyntaxError => e
|
2508
2559
|
raise ArgumentError.new(e.to_s)
|
2509
2560
|
end
|
@@ -2622,5 +2673,21 @@ module Sass::Script
|
|
2622
2673
|
|
2623
2674
|
color.with(attr => color.send(attr).send(op, amount.value))
|
2624
2675
|
end
|
2676
|
+
|
2677
|
+
def check_alpha_unit(alpha, function)
|
2678
|
+
return if alpha.unitless?
|
2679
|
+
|
2680
|
+
if alpha.is_unit?("%")
|
2681
|
+
Sass::Util.sass_warn(<<WARNING)
|
2682
|
+
DEPRECATION WARNING: Passing a percentage as the alpha value to #{function}() will be
|
2683
|
+
interpreted differently in future versions of Sass. For now, use #{alpha.value} instead.
|
2684
|
+
WARNING
|
2685
|
+
else
|
2686
|
+
Sass::Util.sass_warn(<<WARNING)
|
2687
|
+
DEPRECATION WARNING: Passing a number with units as the alpha value to #{function}() is
|
2688
|
+
deprecated and will be an error in future versions of Sass. Use #{alpha.value} instead.
|
2689
|
+
WARNING
|
2690
|
+
end
|
2691
|
+
end
|
2625
2692
|
end
|
2626
2693
|
end
|