sass 3.3.0 → 3.4.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/MIT-LICENSE +1 -1
- data/README.md +58 -50
- data/Rakefile +1 -4
- 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/lib/sass/cache_stores/filesystem.rb +6 -2
- data/lib/sass/css.rb +1 -3
- data/lib/sass/engine.rb +37 -46
- data/lib/sass/environment.rb +13 -17
- data/lib/sass/error.rb +6 -9
- data/lib/sass/exec/base.rb +187 -0
- data/lib/sass/exec/sass_convert.rb +264 -0
- data/lib/sass/exec/sass_scss.rb +424 -0
- data/lib/sass/exec.rb +5 -771
- data/lib/sass/features.rb +7 -0
- data/lib/sass/importers/base.rb +7 -2
- data/lib/sass/importers/filesystem.rb +9 -25
- data/lib/sass/importers.rb +0 -1
- data/lib/sass/media.rb +1 -4
- data/lib/sass/plugin/compiler.rb +200 -83
- data/lib/sass/plugin/staleness_checker.rb +1 -1
- data/lib/sass/plugin.rb +3 -3
- data/lib/sass/script/css_lexer.rb +1 -1
- data/lib/sass/script/functions.rb +622 -268
- data/lib/sass/script/lexer.rb +99 -34
- data/lib/sass/script/parser.rb +24 -23
- data/lib/sass/script/tree/funcall.rb +1 -1
- data/lib/sass/script/tree/interpolation.rb +20 -2
- data/lib/sass/script/tree/selector.rb +26 -0
- data/lib/sass/script/tree/string_interpolation.rb +1 -1
- data/lib/sass/script/tree.rb +1 -0
- data/lib/sass/script/value/base.rb +7 -5
- data/lib/sass/script/value/bool.rb +0 -5
- data/lib/sass/script/value/color.rb +39 -21
- data/lib/sass/script/value/helpers.rb +107 -0
- data/lib/sass/script/value/list.rb +0 -15
- data/lib/sass/script/value/null.rb +0 -5
- data/lib/sass/script/value/number.rb +62 -14
- data/lib/sass/script/value/string.rb +59 -11
- data/lib/sass/script/value.rb +0 -1
- data/lib/sass/scss/css_parser.rb +8 -2
- data/lib/sass/scss/parser.rb +190 -328
- data/lib/sass/scss/rx.rb +15 -6
- data/lib/sass/scss/static_parser.rb +298 -1
- data/lib/sass/selector/abstract_sequence.rb +28 -13
- data/lib/sass/selector/comma_sequence.rb +92 -13
- data/lib/sass/selector/pseudo.rb +256 -0
- data/lib/sass/selector/sequence.rb +94 -24
- data/lib/sass/selector/simple.rb +14 -25
- data/lib/sass/selector/simple_sequence.rb +97 -33
- data/lib/sass/selector.rb +57 -194
- data/lib/sass/shared.rb +1 -1
- data/lib/sass/source/map.rb +26 -12
- data/lib/sass/stack.rb +0 -6
- data/lib/sass/supports.rb +2 -3
- data/lib/sass/tree/at_root_node.rb +1 -0
- data/lib/sass/tree/charset_node.rb +1 -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 +4 -0
- data/lib/sass/tree/keyframe_rule_node.rb +15 -0
- data/lib/sass/tree/prop_node.rb +1 -1
- data/lib/sass/tree/rule_node.rb +12 -7
- data/lib/sass/tree/visitors/check_nesting.rb +38 -10
- data/lib/sass/tree/visitors/convert.rb +16 -18
- data/lib/sass/tree/visitors/cssize.rb +29 -29
- data/lib/sass/tree/visitors/deep_copy.rb +5 -0
- data/lib/sass/tree/visitors/perform.rb +45 -33
- data/lib/sass/tree/visitors/set_options.rb +14 -0
- data/lib/sass/tree/visitors/to_css.rb +15 -14
- data/lib/sass/util/subset_map.rb +1 -1
- data/lib/sass/util.rb +222 -99
- data/lib/sass/version.rb +5 -5
- data/lib/sass.rb +0 -5
- data/test/sass/cache_test.rb +62 -20
- data/test/sass/callbacks_test.rb +1 -1
- data/test/sass/compiler_test.rb +19 -10
- data/test/sass/conversion_test.rb +58 -1
- data/test/sass/css2sass_test.rb +23 -4
- data/test/sass/encoding_test.rb +219 -0
- data/test/sass/engine_test.rb +136 -199
- data/test/sass/exec_test.rb +2 -2
- data/test/sass/extend_test.rb +236 -19
- data/test/sass/functions_test.rb +295 -253
- data/test/sass/importer_test.rb +31 -21
- data/test/sass/logger_test.rb +1 -1
- data/test/sass/more_results/more_import.css +1 -1
- data/test/sass/plugin_test.rb +14 -13
- 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 +3 -3
- data/test/sass/results/scss_import.css +1 -1
- data/test/sass/script_conversion_test.rb +10 -7
- data/test/sass/script_test.rb +288 -74
- data/test/sass/scss/css_test.rb +141 -24
- data/test/sass/scss/rx_test.rb +4 -4
- data/test/sass/scss/scss_test.rb +457 -18
- data/test/sass/source_map_test.rb +115 -25
- data/test/sass/superselector_test.rb +191 -0
- data/test/sass/templates/scss_import.scss +2 -1
- data/test/sass/test_helper.rb +1 -1
- data/test/sass/util/multibyte_string_scanner_test.rb +1 -1
- 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 +31 -1
- data/test/sass/value_helpers_test.rb +5 -7
- data/test/test_helper.rb +2 -2
- 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 +25 -22
- data/ext/mkrf_conf.rb +0 -27
- data/lib/sass/importers/deprecated_path.rb +0 -51
- data/lib/sass/script/value/deprecated_false.rb +0 -55
- 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
@@ -1,6 +1,9 @@
|
|
1
1
|
require 'sass/script/value/helpers'
|
2
2
|
|
3
3
|
module Sass::Script
|
4
|
+
# @comment
|
5
|
+
# YARD can't handle some multiline tags, and we need really long tags for function declarations.
|
6
|
+
# rubocop:disable LineLength
|
4
7
|
# Methods in this module are accessible from the SassScript context.
|
5
8
|
# For example, you can write
|
6
9
|
#
|
@@ -93,16 +96,13 @@ module Sass::Script
|
|
93
96
|
#
|
94
97
|
# ## Other Color Functions
|
95
98
|
#
|
96
|
-
# \{#adjust_color adjust-color($color, \[$red\], \[$green\], \[$blue\],
|
97
|
-
# \[$hue\], \[$saturation\], \[$lightness\], \[$alpha\])}
|
99
|
+
# \{#adjust_color adjust-color($color, \[$red\], \[$green\], \[$blue\], \[$hue\], \[$saturation\], \[$lightness\], \[$alpha\])}
|
98
100
|
# : Increases or decreases one or more components of a color.
|
99
101
|
#
|
100
|
-
# \{#scale_color scale-color($color, \[$red\], \[$green\], \[$blue\],
|
101
|
-
# \[$saturation\], \[$lightness\], \[$alpha\])}
|
102
|
+
# \{#scale_color scale-color($color, \[$red\], \[$green\], \[$blue\], \[$saturation\], \[$lightness\], \[$alpha\])}
|
102
103
|
# : Fluidly scales one or more properties of a color.
|
103
104
|
#
|
104
|
-
# \{#change_color change-color($color, \[$red\], \[$green\], \[$blue\],
|
105
|
-
# \[$hue\], \[$saturation\], \[$lightness\], \[$alpha\])}
|
105
|
+
# \{#change_color change-color($color, \[$red\], \[$green\], \[$blue\], \[$hue\], \[$saturation\], \[$lightness\], \[$alpha\])}
|
106
106
|
# : Changes one or more properties of a color.
|
107
107
|
#
|
108
108
|
# \{#ie_hex_str ie-hex-str($color)}
|
@@ -193,8 +193,8 @@ module Sass::Script
|
|
193
193
|
# \{#map_merge map-merge($map1, $map2)}
|
194
194
|
# : Merges two maps together into a new map.
|
195
195
|
#
|
196
|
-
# \{#map_remove map-remove($map, $
|
197
|
-
# : Returns a new map with
|
196
|
+
# \{#map_remove map-remove($map, $keys...)}
|
197
|
+
# : Returns a new map with keys removed.
|
198
198
|
#
|
199
199
|
# \{#map_keys map-keys($map)}
|
200
200
|
# : Returns a list of all keys in a map.
|
@@ -202,12 +202,54 @@ module Sass::Script
|
|
202
202
|
# \{#map_values map-values($map)}
|
203
203
|
# : Returns a list of all values in a map.
|
204
204
|
#
|
205
|
-
# \{#map_has_key map-has-key($key)}
|
205
|
+
# \{#map_has_key map-has-key($map, $key)}
|
206
206
|
# : Returns whether a map has a value associated with a given key.
|
207
207
|
#
|
208
208
|
# \{#keywords keywords($args)}
|
209
209
|
# : Returns the keywords passed to a function that takes variable arguments.
|
210
210
|
#
|
211
|
+
# ## Selector Functions
|
212
|
+
#
|
213
|
+
# Selector functions are very liberal in the formats they support
|
214
|
+
# for selector arguments. They can take a plain string, a list of
|
215
|
+
# lists as returned by `&` or anything in between:
|
216
|
+
#
|
217
|
+
# * A plain sring, such as `".foo .bar, .baz .bang"`.
|
218
|
+
# * A space-separated list of strings such as `(".foo" ".bar")`.
|
219
|
+
# * A comma-separated list of strings such as `(".foo .bar", ".baz .bang")`.
|
220
|
+
# * A comma-separated list of space-separated lists of strings such
|
221
|
+
# as `((".foo" ".bar"), (".baz" ".bang"))`.
|
222
|
+
#
|
223
|
+
# In general, selector functions allow placeholder selectors
|
224
|
+
# (`%foo`) but disallow parent-reference selectors (`&`).
|
225
|
+
#
|
226
|
+
# \{#selector_nest selector-nest($selectors...)}
|
227
|
+
# : Nests selector beneath one another like they would be nested in the
|
228
|
+
# stylesheet.
|
229
|
+
#
|
230
|
+
# \{#selector_append selector-append($selectors...)}
|
231
|
+
# : Appends selectors to one another without spaces in between.
|
232
|
+
#
|
233
|
+
# \{#selector_extend selector-extend($selector, $extendee, $extender)}
|
234
|
+
# : Extends `$extendee` with `$extender` within `$selector`.
|
235
|
+
#
|
236
|
+
# \{#selector_replace selector-replace($selector, $original, $replacement)}
|
237
|
+
# : Replaces `$original` with `$replacement` within `$selector`.
|
238
|
+
#
|
239
|
+
# \{#selector_unify selector-unify($selector1, $selector2)}
|
240
|
+
# : Unifies two selectors to produce a selector that matches
|
241
|
+
# elements matched by both.
|
242
|
+
#
|
243
|
+
# \{#is_superselector is-superselector($super, $sub)}
|
244
|
+
# : Returns whether `$super` matches all the elements `$sub` does, and
|
245
|
+
# possibly more.
|
246
|
+
#
|
247
|
+
# \{#simple_selectors simple-selectors($selector)}
|
248
|
+
# : Returns the simple selectors that comprise a compound selector.
|
249
|
+
#
|
250
|
+
# \{#selector_parse selector-parse($selector)}
|
251
|
+
# : Parses a selector into the format returned by `&`.
|
252
|
+
#
|
211
253
|
# ## Introspection Functions
|
212
254
|
#
|
213
255
|
# \{#feature_exists feature-exists($feature)}
|
@@ -302,6 +344,9 @@ module Sass::Script
|
|
302
344
|
# safe to call {Value::Base#to_s #to_s} (or other methods that use the string
|
303
345
|
# representation) on those objects without first setting {Tree::Node#options=
|
304
346
|
# the #options attribute}.
|
347
|
+
#
|
348
|
+
# @comment
|
349
|
+
# rubocop:enable LineLength
|
305
350
|
module Functions
|
306
351
|
@signatures = {}
|
307
352
|
|
@@ -474,7 +519,7 @@ module Sass::Script
|
|
474
519
|
def assert_type(value, type, name = nil)
|
475
520
|
klass = Sass::Script::Value.const_get(type)
|
476
521
|
return if value.is_a?(klass)
|
477
|
-
return if value.is_a?(Sass::Script::Value::List) && type == :Map && value.
|
522
|
+
return if value.is_a?(Sass::Script::Value::List) && type == :Map && value.value.empty?
|
478
523
|
err = "#{value.inspect} is not a #{TYPE_NAMES[type] || type.to_s.downcase}"
|
479
524
|
err = "$#{name.to_s.gsub('_', '-')}: " + err if name
|
480
525
|
raise ArgumentError.new(err)
|
@@ -565,15 +610,15 @@ module Sass::Script
|
|
565
610
|
#
|
566
611
|
# @see #rgba
|
567
612
|
# @overload rgb($red, $green, $blue)
|
568
|
-
#
|
569
|
-
#
|
570
|
-
#
|
571
|
-
#
|
572
|
-
#
|
573
|
-
#
|
574
|
-
#
|
575
|
-
#
|
576
|
-
#
|
613
|
+
# @param $red [Sass::Script::Value::Number] The amount of red in the color.
|
614
|
+
# Must be between 0 and 255 inclusive, or between `0%` and `100%`
|
615
|
+
# inclusive
|
616
|
+
# @param $green [Sass::Script::Value::Number] The amount of green in the
|
617
|
+
# color. Must be between 0 and 255 inclusive, or between `0%` and `100%`
|
618
|
+
# inclusive
|
619
|
+
# @param $blue [Sass::Script::Value::Number] The amount of blue in the
|
620
|
+
# color. Must be between 0 and 255 inclusive, or between `0%` and `100%`
|
621
|
+
# inclusive
|
577
622
|
# @return [Sass::Script::Value::Color]
|
578
623
|
# @raise [ArgumentError] if any parameter is the wrong type or out of bounds
|
579
624
|
def rgb(red, green, blue)
|
@@ -583,14 +628,17 @@ module Sass::Script
|
|
583
628
|
|
584
629
|
color_attrs = [[red, :red], [green, :green], [blue, :blue]].map do |(c, name)|
|
585
630
|
if c.is_unit?("%")
|
586
|
-
|
587
|
-
v * 255 / 100.0
|
631
|
+
c.value * 255 / 100.0
|
588
632
|
elsif c.unitless?
|
589
|
-
|
633
|
+
c.value
|
590
634
|
else
|
591
635
|
raise ArgumentError.new("Expected #{c} to be unitless or have a unit of % but got #{c}")
|
592
636
|
end
|
593
637
|
end
|
638
|
+
|
639
|
+
# Don't store the string representation for function-created colors, both
|
640
|
+
# because it's not very useful and because some functions aren't supported
|
641
|
+
# on older browsers.
|
594
642
|
Sass::Script::Value::Color.new(color_attrs)
|
595
643
|
end
|
596
644
|
declare :rgb, [:red, :green, :blue]
|
@@ -634,7 +682,6 @@ module Sass::Script
|
|
634
682
|
assert_type color, :Color, :color
|
635
683
|
assert_type alpha, :Number, :alpha
|
636
684
|
|
637
|
-
Sass::Util.check_range('Alpha channel', 0..1, alpha)
|
638
685
|
color.with(:alpha => alpha.value)
|
639
686
|
when 4
|
640
687
|
red, green, blue, alpha = args
|
@@ -653,12 +700,12 @@ module Sass::Script
|
|
653
700
|
#
|
654
701
|
# @see #hsla
|
655
702
|
# @overload hsl($hue, $saturation, $lightness)
|
656
|
-
#
|
657
|
-
#
|
658
|
-
#
|
659
|
-
#
|
660
|
-
#
|
661
|
-
#
|
703
|
+
# @param $hue [Sass::Script::Value::Number] The hue of the color. Should be
|
704
|
+
# between 0 and 360 degrees, inclusive
|
705
|
+
# @param $saturation [Sass::Script::Value::Number] The saturation of the
|
706
|
+
# color. Must be between `0%` and `100%`, inclusive
|
707
|
+
# @param $lightness [Sass::Script::Value::Number] The lightness of the
|
708
|
+
# color. Must be between `0%` and `100%`, inclusive
|
662
709
|
# @return [Sass::Script::Value::Color]
|
663
710
|
# @raise [ArgumentError] if `$saturation` or `$lightness` are out of bounds
|
664
711
|
# or any parameter is the wrong type
|
@@ -675,14 +722,14 @@ module Sass::Script
|
|
675
722
|
#
|
676
723
|
# @see #hsl
|
677
724
|
# @overload hsla($hue, $saturation, $lightness, $alpha)
|
678
|
-
#
|
679
|
-
#
|
680
|
-
#
|
681
|
-
#
|
682
|
-
#
|
683
|
-
#
|
684
|
-
#
|
685
|
-
#
|
725
|
+
# @param $hue [Sass::Script::Value::Number] The hue of the color. Should be
|
726
|
+
# between 0 and 360 degrees, inclusive
|
727
|
+
# @param $saturation [Sass::Script::Value::Number] The saturation of the
|
728
|
+
# color. Must be between `0%` and `100%`, inclusive
|
729
|
+
# @param $lightness [Sass::Script::Value::Number] The lightness of the
|
730
|
+
# color. Must be between `0%` and `100%`, inclusive
|
731
|
+
# @param $alpha [Sass::Script::Value::Number] The opacity of the color. Must
|
732
|
+
# be between 0 and 1, inclusive
|
686
733
|
# @return [Sass::Script::Value::Color]
|
687
734
|
# @raise [ArgumentError] if `$saturation`, `$lightness`, or `$alpha` are out
|
688
735
|
# of bounds or any parameter is the wrong type
|
@@ -692,12 +739,13 @@ module Sass::Script
|
|
692
739
|
assert_type lightness, :Number, :lightness
|
693
740
|
assert_type alpha, :Number, :alpha
|
694
741
|
|
695
|
-
Sass::Util.check_range('Alpha channel', 0..1, alpha)
|
696
|
-
|
697
742
|
h = hue.value
|
698
|
-
s =
|
699
|
-
l =
|
743
|
+
s = saturation.value
|
744
|
+
l = lightness.value
|
700
745
|
|
746
|
+
# Don't store the string representation for function-created colors, both
|
747
|
+
# because it's not very useful and because some functions aren't supported
|
748
|
+
# on older browsers.
|
701
749
|
Sass::Script::Value::Color.new(
|
702
750
|
:hue => h, :saturation => s, :lightness => l, :alpha => alpha.value)
|
703
751
|
end
|
@@ -709,7 +757,7 @@ module Sass::Script
|
|
709
757
|
# [hsl-to-rgb]: http://www.w3.org/TR/css3-color/#hsl-color
|
710
758
|
#
|
711
759
|
# @overload red($color)
|
712
|
-
#
|
760
|
+
# @param $color [Sass::Script::Value::Color]
|
713
761
|
# @return [Sass::Script::Value::Number] The red component, between 0 and 255
|
714
762
|
# inclusive
|
715
763
|
# @raise [ArgumentError] if `$color` isn't a color
|
@@ -725,7 +773,7 @@ module Sass::Script
|
|
725
773
|
# [hsl-to-rgb]: http://www.w3.org/TR/css3-color/#hsl-color
|
726
774
|
#
|
727
775
|
# @overload green($color)
|
728
|
-
#
|
776
|
+
# @param $color [Sass::Script::Value::Color]
|
729
777
|
# @return [Sass::Script::Value::Number] The green component, between 0 and
|
730
778
|
# 255 inclusive
|
731
779
|
# @raise [ArgumentError] if `$color` isn't a color
|
@@ -741,7 +789,7 @@ module Sass::Script
|
|
741
789
|
# [hsl-to-rgb]: http://www.w3.org/TR/css3-color/#hsl-color
|
742
790
|
#
|
743
791
|
# @overload blue($color)
|
744
|
-
#
|
792
|
+
# @param $color [Sass::Script::Value::Color]
|
745
793
|
# @return [Sass::Script::Value::Number] The blue component, between 0 and
|
746
794
|
# 255 inclusive
|
747
795
|
# @raise [ArgumentError] if `$color` isn't a color
|
@@ -759,7 +807,7 @@ module Sass::Script
|
|
759
807
|
# [rgb-to-hsl]: http://en.wikipedia.org/wiki/HSL_and_HSV#Conversion_from_RGB_to_HSL_or_HSV
|
760
808
|
#
|
761
809
|
# @overload hue($color)
|
762
|
-
#
|
810
|
+
# @param $color [Sass::Script::Value::Color]
|
763
811
|
# @return [Sass::Script::Value::Number] The hue component, between 0deg and
|
764
812
|
# 360deg
|
765
813
|
# @raise [ArgumentError] if `$color` isn't a color
|
@@ -777,7 +825,7 @@ module Sass::Script
|
|
777
825
|
# [rgb-to-hsl]: http://en.wikipedia.org/wiki/HSL_and_HSV#Conversion_from_RGB_to_HSL_or_HSV
|
778
826
|
#
|
779
827
|
# @overload saturation($color)
|
780
|
-
#
|
828
|
+
# @param $color [Sass::Script::Value::Color]
|
781
829
|
# @return [Sass::Script::Value::Number] The saturation component, between 0%
|
782
830
|
# and 100%
|
783
831
|
# @raise [ArgumentError] if `$color` isn't a color
|
@@ -795,7 +843,7 @@ module Sass::Script
|
|
795
843
|
# [rgb-to-hsl]: http://en.wikipedia.org/wiki/HSL_and_HSV#Conversion_from_RGB_to_HSL_or_HSV
|
796
844
|
#
|
797
845
|
# @overload lightness($color)
|
798
|
-
#
|
846
|
+
# @param $color [Sass::Script::Value::Color]
|
799
847
|
# @return [Sass::Script::Value::Number] The lightness component, between 0%
|
800
848
|
# and 100%
|
801
849
|
# @raise [ArgumentError] if `$color` isn't a color
|
@@ -812,7 +860,7 @@ module Sass::Script
|
|
812
860
|
# syntax as a special case.
|
813
861
|
#
|
814
862
|
# @overload alpha($color)
|
815
|
-
#
|
863
|
+
# @param $color [Sass::Script::Value::Color]
|
816
864
|
# @return [Sass::Script::Value::Number] The alpha component, between 0 and 1
|
817
865
|
# @raise [ArgumentError] if `$color` isn't a color
|
818
866
|
def alpha(*args)
|
@@ -835,7 +883,7 @@ module Sass::Script
|
|
835
883
|
# otherwise specified.
|
836
884
|
#
|
837
885
|
# @overload opacity($color)
|
838
|
-
#
|
886
|
+
# @param $color [Sass::Script::Value::Color]
|
839
887
|
# @return [Sass::Script::Value::Number] The alpha component, between 0 and 1
|
840
888
|
# @raise [ArgumentError] if `$color` isn't a color
|
841
889
|
def opacity(color)
|
@@ -855,9 +903,9 @@ module Sass::Script
|
|
855
903
|
# opacify(rgba(0, 0, 0, 0.5), 0.1) => rgba(0, 0, 0, 0.6)
|
856
904
|
# opacify(rgba(0, 0, 17, 0.8), 0.2) => #001
|
857
905
|
# @overload opacify($color, $amount)
|
858
|
-
#
|
859
|
-
#
|
860
|
-
#
|
906
|
+
# @param $color [Sass::Script::Value::Color]
|
907
|
+
# @param $amount [Sass::Script::Value::Number] The amount to increase the
|
908
|
+
# opacity by, between 0 and 1
|
861
909
|
# @return [Sass::Script::Value::Color]
|
862
910
|
# @raise [ArgumentError] if `$amount` is out of bounds, or either parameter
|
863
911
|
# is the wrong type
|
@@ -877,9 +925,9 @@ module Sass::Script
|
|
877
925
|
# transparentize(rgba(0, 0, 0, 0.5), 0.1) => rgba(0, 0, 0, 0.4)
|
878
926
|
# transparentize(rgba(0, 0, 0, 0.8), 0.2) => rgba(0, 0, 0, 0.6)
|
879
927
|
# @overload transparentize($color, $amount)
|
880
|
-
#
|
881
|
-
#
|
882
|
-
#
|
928
|
+
# @param $color [Sass::Script::Value::Color]
|
929
|
+
# @param $amount [Sass::Script::Value::Number] The amount to decrease the
|
930
|
+
# opacity by, between 0 and 1
|
883
931
|
# @return [Sass::Script::Value::Color]
|
884
932
|
# @raise [ArgumentError] if `$amount` is out of bounds, or either parameter
|
885
933
|
# is the wrong type
|
@@ -899,9 +947,9 @@ module Sass::Script
|
|
899
947
|
# lighten(hsl(0, 0%, 0%), 30%) => hsl(0, 0, 30)
|
900
948
|
# lighten(#800, 20%) => #e00
|
901
949
|
# @overload lighten($color, $amount)
|
902
|
-
#
|
903
|
-
#
|
904
|
-
#
|
950
|
+
# @param $color [Sass::Script::Value::Color]
|
951
|
+
# @param $amount [Sass::Script::Value::Number] The amount to increase the
|
952
|
+
# lightness by, between `0%` and `100%`
|
905
953
|
# @return [Sass::Script::Value::Color]
|
906
954
|
# @raise [ArgumentError] if `$amount` is out of bounds, or either parameter
|
907
955
|
# is the wrong type
|
@@ -918,9 +966,9 @@ module Sass::Script
|
|
918
966
|
# darken(hsl(25, 100%, 80%), 30%) => hsl(25, 100%, 50%)
|
919
967
|
# darken(#800, 20%) => #200
|
920
968
|
# @overload darken($color, $amount)
|
921
|
-
#
|
922
|
-
#
|
923
|
-
#
|
969
|
+
# @param $color [Sass::Script::Value::Color]
|
970
|
+
# @param $amount [Sass::Script::Value::Number] The amount to decrease the
|
971
|
+
# lightness by, between `0%` and `100%`
|
924
972
|
# @return [Sass::Script::Value::Color]
|
925
973
|
# @raise [ArgumentError] if `$amount` is out of bounds, or either parameter
|
926
974
|
# is the wrong type
|
@@ -937,9 +985,9 @@ module Sass::Script
|
|
937
985
|
# saturate(hsl(120, 30%, 90%), 20%) => hsl(120, 50%, 90%)
|
938
986
|
# saturate(#855, 20%) => #9e3f3f
|
939
987
|
# @overload saturate($color, $amount)
|
940
|
-
#
|
941
|
-
#
|
942
|
-
#
|
988
|
+
# @param $color [Sass::Script::Value::Color]
|
989
|
+
# @param $amount [Sass::Script::Value::Number] The amount to increase the
|
990
|
+
# saturation by, between `0%` and `100%`
|
943
991
|
# @return [Sass::Script::Value::Color]
|
944
992
|
# @raise [ArgumentError] if `$amount` is out of bounds, or either parameter
|
945
993
|
# is the wrong type
|
@@ -960,9 +1008,9 @@ module Sass::Script
|
|
960
1008
|
# desaturate(hsl(120, 30%, 90%), 20%) => hsl(120, 10%, 90%)
|
961
1009
|
# desaturate(#855, 20%) => #726b6b
|
962
1010
|
# @overload desaturate($color, $amount)
|
963
|
-
#
|
964
|
-
#
|
965
|
-
#
|
1011
|
+
# @param $color [Sass::Script::Value::Color]
|
1012
|
+
# @param $amount [Sass::Script::Value::Number] The amount to decrease the
|
1013
|
+
# saturation by, between `0%` and `100%`
|
966
1014
|
# @return [Sass::Script::Value::Color]
|
967
1015
|
# @raise [ArgumentError] if `$amount` is out of bounds, or either parameter
|
968
1016
|
# is the wrong type
|
@@ -977,12 +1025,12 @@ module Sass::Script
|
|
977
1025
|
#
|
978
1026
|
# @example
|
979
1027
|
# adjust-hue(hsl(120, 30%, 90%), 60deg) => hsl(180, 30%, 90%)
|
980
|
-
# adjust-hue(hsl(120, 30%, 90%),
|
1028
|
+
# adjust-hue(hsl(120, 30%, 90%), -60deg) => hsl(60, 30%, 90%)
|
981
1029
|
# adjust-hue(#811, 45deg) => #886a11
|
982
1030
|
# @overload adjust_hue($color, $degrees)
|
983
|
-
#
|
984
|
-
#
|
985
|
-
#
|
1031
|
+
# @param $color [Sass::Script::Value::Color]
|
1032
|
+
# @param $degrees [Sass::Script::Value::Number] The number of degrees to
|
1033
|
+
# rotate the hue
|
986
1034
|
# @return [Sass::Script::Value::Color]
|
987
1035
|
# @raise [ArgumentError] if either parameter is the wrong type
|
988
1036
|
def adjust_hue(color, degrees)
|
@@ -999,7 +1047,7 @@ module Sass::Script
|
|
999
1047
|
# ie-hex-str(#3322BB) => #FF3322BB
|
1000
1048
|
# ie-hex-str(rgba(0, 255, 0, 0.5)) => #8000FF00
|
1001
1049
|
# @overload ie_hex_str($color)
|
1002
|
-
#
|
1050
|
+
# @param $color [Sass::Script::Value::Color]
|
1003
1051
|
# @return [Sass::Script::Value::String] The IE-formatted string
|
1004
1052
|
# representation of the color
|
1005
1053
|
# @raise [ArgumentError] if `$color` isn't a color
|
@@ -1023,23 +1071,26 @@ module Sass::Script
|
|
1023
1071
|
# adjust-color(#102030, $blue: 5) => #102035
|
1024
1072
|
# adjust-color(#102030, $red: -5, $blue: 5) => #0b2035
|
1025
1073
|
# adjust-color(hsl(25, 100%, 80%), $lightness: -30%, $alpha: -0.4) => hsla(25, 100%, 50%, 0.6)
|
1026
|
-
# @
|
1027
|
-
#
|
1028
|
-
# @
|
1029
|
-
#
|
1030
|
-
#
|
1031
|
-
#
|
1032
|
-
#
|
1033
|
-
#
|
1034
|
-
#
|
1035
|
-
#
|
1036
|
-
#
|
1037
|
-
#
|
1038
|
-
#
|
1039
|
-
#
|
1040
|
-
#
|
1041
|
-
#
|
1042
|
-
#
|
1074
|
+
# @comment
|
1075
|
+
# rubocop:disable LineLength
|
1076
|
+
# @overload adjust_color($color, [$red], [$green], [$blue], [$hue], [$saturation], [$lightness], [$alpha])
|
1077
|
+
# @comment
|
1078
|
+
# rubocop:disable LineLength
|
1079
|
+
# @param $color [Sass::Script::Value::Color]
|
1080
|
+
# @param $red [Sass::Script::Value::Number] The adjustment to make on the
|
1081
|
+
# red component, between -255 and 255 inclusive
|
1082
|
+
# @param $green [Sass::Script::Value::Number] The adjustment to make on the
|
1083
|
+
# green component, between -255 and 255 inclusive
|
1084
|
+
# @param $blue [Sass::Script::Value::Number] The adjustment to make on the
|
1085
|
+
# blue component, between -255 and 255 inclusive
|
1086
|
+
# @param $hue [Sass::Script::Value::Number] The adjustment to make on the
|
1087
|
+
# hue component, in degrees
|
1088
|
+
# @param $saturation [Sass::Script::Value::Number] The adjustment to make on
|
1089
|
+
# the saturation component, between `-100%` and `100%` inclusive
|
1090
|
+
# @param $lightness [Sass::Script::Value::Number] The adjustment to make on
|
1091
|
+
# the lightness component, between `-100%` and `100%` inclusive
|
1092
|
+
# @param $alpha [Sass::Script::Value::Number] The adjustment to make on the
|
1093
|
+
# alpha component, between -1 and 1 inclusive
|
1043
1094
|
# @return [Sass::Script::Value::Color]
|
1044
1095
|
# @raise [ArgumentError] if any parameter is the wrong type or out-of
|
1045
1096
|
# bounds, or if RGB properties and HSL properties are adjusted at the
|
@@ -1101,15 +1152,18 @@ module Sass::Script
|
|
1101
1152
|
# scale-color(hsl(120, 70%, 80%), $lightness: 50%) => hsl(120, 70%, 90%)
|
1102
1153
|
# scale-color(rgb(200, 150%, 170%), $green: -40%, $blue: 70%) => rgb(200, 90, 229)
|
1103
1154
|
# scale-color(hsl(200, 70%, 80%), $saturation: -90%, $alpha: -30%) => hsla(200, 7%, 80%, 0.7)
|
1104
|
-
# @
|
1105
|
-
#
|
1106
|
-
# @
|
1107
|
-
#
|
1108
|
-
#
|
1109
|
-
#
|
1110
|
-
#
|
1111
|
-
#
|
1112
|
-
#
|
1155
|
+
# @comment
|
1156
|
+
# rubocop:disable LineLength
|
1157
|
+
# @overload scale_color($color, [$red], [$green], [$blue], [$saturation], [$lightness], [$alpha])
|
1158
|
+
# @comment
|
1159
|
+
# rubocop:disable LineLength
|
1160
|
+
# @param $color [Sass::Script::Value::Color]
|
1161
|
+
# @param $red [Sass::Script::Value::Number]
|
1162
|
+
# @param $green [Sass::Script::Value::Number]
|
1163
|
+
# @param $blue [Sass::Script::Value::Number]
|
1164
|
+
# @param $saturation [Sass::Script::Value::Number]
|
1165
|
+
# @param $lightness [Sass::Script::Value::Number]
|
1166
|
+
# @param $alpha [Sass::Script::Value::Number]
|
1113
1167
|
# @return [Sass::Script::Value::Color]
|
1114
1168
|
# @raise [ArgumentError] if any parameter is the wrong type or out-of
|
1115
1169
|
# bounds, or if RGB properties and HSL properties are adjusted at the
|
@@ -1159,35 +1213,53 @@ module Sass::Script
|
|
1159
1213
|
# change-color(#102030, $blue: 5) => #102005
|
1160
1214
|
# change-color(#102030, $red: 120, $blue: 5) => #782005
|
1161
1215
|
# change-color(hsl(25, 100%, 80%), $lightness: 40%, $alpha: 0.8) => hsla(25, 100%, 40%, 0.8)
|
1162
|
-
# @
|
1163
|
-
#
|
1164
|
-
# @
|
1165
|
-
#
|
1166
|
-
#
|
1167
|
-
#
|
1168
|
-
#
|
1169
|
-
#
|
1170
|
-
#
|
1171
|
-
#
|
1172
|
-
#
|
1173
|
-
#
|
1174
|
-
#
|
1175
|
-
#
|
1176
|
-
#
|
1177
|
-
#
|
1178
|
-
#
|
1216
|
+
# @comment
|
1217
|
+
# rubocop:disable LineLength
|
1218
|
+
# @overload change_color($color, [$red], [$green], [$blue], [$hue], [$saturation], [$lightness], [$alpha])
|
1219
|
+
# @comment
|
1220
|
+
# rubocop:disable LineLength
|
1221
|
+
# @param $color [Sass::Script::Value::Color]
|
1222
|
+
# @param $red [Sass::Script::Value::Number] The new red component for the
|
1223
|
+
# color, within 0 and 255 inclusive
|
1224
|
+
# @param $green [Sass::Script::Value::Number] The new green component for
|
1225
|
+
# the color, within 0 and 255 inclusive
|
1226
|
+
# @param $blue [Sass::Script::Value::Number] The new blue component for the
|
1227
|
+
# color, within 0 and 255 inclusive
|
1228
|
+
# @param $hue [Sass::Script::Value::Number] The new hue component for the
|
1229
|
+
# color, in degrees
|
1230
|
+
# @param $saturation [Sass::Script::Value::Number] The new saturation
|
1231
|
+
# component for the color, between `0%` and `100%` inclusive
|
1232
|
+
# @param $lightness [Sass::Script::Value::Number] The new lightness
|
1233
|
+
# component for the color, within `0%` and `100%` inclusive
|
1234
|
+
# @param $alpha [Sass::Script::Value::Number] The new alpha component for
|
1235
|
+
# the color, within 0 and 1 inclusive
|
1179
1236
|
# @return [Sass::Script::Value::Color]
|
1180
1237
|
# @raise [ArgumentError] if any parameter is the wrong type or out-of
|
1181
1238
|
# bounds, or if RGB properties and HSL properties are adjusted at the
|
1182
1239
|
# same time
|
1183
1240
|
def change_color(color, kwargs)
|
1184
1241
|
assert_type color, :Color, :color
|
1185
|
-
with = Sass::Util.
|
1242
|
+
with = Sass::Util.map_hash(
|
1243
|
+
'red' => ['Red value', 0..255],
|
1244
|
+
'green' => ['Green value', 0..255],
|
1245
|
+
'blue' => ['Blue value', 0..255],
|
1246
|
+
'hue' => [],
|
1247
|
+
'saturation' => ['Saturation', 0..100, '%'],
|
1248
|
+
'lightness' => ['Lightness', 0..100, '%'],
|
1249
|
+
'alpha' => ['Alpha channel', 0..1]
|
1250
|
+
) do |name, (desc, range, unit)|
|
1186
1251
|
val = kwargs.delete(name)
|
1187
1252
|
next unless val
|
1188
1253
|
assert_type val, :Number, name
|
1189
|
-
|
1190
|
-
|
1254
|
+
|
1255
|
+
if range
|
1256
|
+
val = Sass::Util.check_range(desc, range, val, unit)
|
1257
|
+
else
|
1258
|
+
val = val.value
|
1259
|
+
end
|
1260
|
+
|
1261
|
+
[name.to_sym, val]
|
1262
|
+
end
|
1191
1263
|
|
1192
1264
|
unless kwargs.empty?
|
1193
1265
|
name, val = kwargs.to_a.first
|
@@ -1212,11 +1284,11 @@ module Sass::Script
|
|
1212
1284
|
# mix(#f00, #00f, 25%) => #3f00bf
|
1213
1285
|
# mix(rgba(255, 0, 0, 0.5), #00f) => rgba(63, 0, 191, 0.75)
|
1214
1286
|
# @overload mix($color1, $color2, $weight: 50%)
|
1215
|
-
#
|
1216
|
-
#
|
1217
|
-
#
|
1218
|
-
#
|
1219
|
-
#
|
1287
|
+
# @param $color1 [Sass::Script::Value::Color]
|
1288
|
+
# @param $color2 [Sass::Script::Value::Color]
|
1289
|
+
# @param $weight [Sass::Script::Value::Number] The relative weight of each
|
1290
|
+
# color. Closer to `0%` gives more weight to `$color`, closer to `100%`
|
1291
|
+
# gives more weight to `$color2`
|
1220
1292
|
# @return [Sass::Script::Value::Color]
|
1221
1293
|
# @raise [ArgumentError] if `$weight` is out of bounds or any parameter is
|
1222
1294
|
# the wrong type
|
@@ -1257,15 +1329,15 @@ module Sass::Script
|
|
1257
1329
|
rgba << color1.alpha * p + color2.alpha * (1 - p)
|
1258
1330
|
rgb_color(*rgba)
|
1259
1331
|
end
|
1260
|
-
declare :mix, [:color1, :color2]
|
1261
|
-
declare :mix, [:color1, :color2, :weight]
|
1332
|
+
declare :mix, [:color1, :color2]
|
1333
|
+
declare :mix, [:color1, :color2, :weight]
|
1262
1334
|
|
1263
1335
|
# Converts a color to grayscale. This is identical to `desaturate(color,
|
1264
1336
|
# 100%)`.
|
1265
1337
|
#
|
1266
1338
|
# @see #desaturate
|
1267
1339
|
# @overload grayscale($color)
|
1268
|
-
#
|
1340
|
+
# @param $color [Sass::Script::Value::Color]
|
1269
1341
|
# @return [Sass::Script::Value::Color]
|
1270
1342
|
# @raise [ArgumentError] if `$color` isn't a color
|
1271
1343
|
def grayscale(color)
|
@@ -1281,7 +1353,7 @@ module Sass::Script
|
|
1281
1353
|
#
|
1282
1354
|
# @see #adjust_hue #adjust-hue
|
1283
1355
|
# @overload complement($color)
|
1284
|
-
#
|
1356
|
+
# @param $color [Sass::Script::Value::Color]
|
1285
1357
|
# @return [Sass::Script::Value::Color]
|
1286
1358
|
# @raise [ArgumentError] if `$color` isn't a color
|
1287
1359
|
def complement(color)
|
@@ -1293,7 +1365,7 @@ module Sass::Script
|
|
1293
1365
|
# are inverted, while the opacity is left alone.
|
1294
1366
|
#
|
1295
1367
|
# @overload invert($color)
|
1296
|
-
#
|
1368
|
+
# @param $color [Sass::Script::Value::Color]
|
1297
1369
|
# @return [Sass::Script::Value::Color]
|
1298
1370
|
# @raise [ArgumentError] if `$color` isn't a color
|
1299
1371
|
def invert(color)
|
@@ -1317,7 +1389,7 @@ module Sass::Script
|
|
1317
1389
|
# unquote("foo") => foo
|
1318
1390
|
# unquote(foo) => foo
|
1319
1391
|
# @overload unquote($string)
|
1320
|
-
#
|
1392
|
+
# @param $string [Sass::Script::Value::String]
|
1321
1393
|
# @return [Sass::Script::Value::String]
|
1322
1394
|
# @raise [ArgumentError] if `$string` isn't a string
|
1323
1395
|
def unquote(string)
|
@@ -1337,7 +1409,7 @@ module Sass::Script
|
|
1337
1409
|
# quote("foo") => "foo"
|
1338
1410
|
# quote(foo) => "foo"
|
1339
1411
|
# @overload quote($string)
|
1340
|
-
#
|
1412
|
+
# @param $string [Sass::Script::Value::String]
|
1341
1413
|
# @return [Sass::Script::Value::String]
|
1342
1414
|
# @raise [ArgumentError] if `$string` isn't a string
|
1343
1415
|
def quote(string)
|
@@ -1355,7 +1427,7 @@ module Sass::Script
|
|
1355
1427
|
# @example
|
1356
1428
|
# str-length("foo") => 3
|
1357
1429
|
# @overload str_length($string)
|
1358
|
-
#
|
1430
|
+
# @param $string [Sass::Script::Value::String]
|
1359
1431
|
# @return [Sass::Script::Value::Number]
|
1360
1432
|
# @raise [ArgumentError] if `$string` isn't a string
|
1361
1433
|
def str_length(string)
|
@@ -1375,12 +1447,12 @@ module Sass::Script
|
|
1375
1447
|
# str-insert("abcd", "X", 5) => "abcdX"
|
1376
1448
|
#
|
1377
1449
|
# @overload str_insert($string, $insert, $index)
|
1378
|
-
#
|
1379
|
-
#
|
1380
|
-
#
|
1381
|
-
#
|
1382
|
-
#
|
1383
|
-
#
|
1450
|
+
# @param $string [Sass::Script::Value::String]
|
1451
|
+
# @param $insert [Sass::Script::Value::String]
|
1452
|
+
# @param $index [Sass::Script::Value::Number] The position at which
|
1453
|
+
# `$insert` will be inserted. Negative indices count from the end of
|
1454
|
+
# `$string`. An index that's outside the bounds of the string will insert
|
1455
|
+
# `$insert` at the front or back of the string
|
1384
1456
|
# @return [Sass::Script::Value::String] The result string. This will be
|
1385
1457
|
# quoted if and only if `$string` was quoted
|
1386
1458
|
# @raise [ArgumentError] if any parameter is the wrong type
|
@@ -1399,8 +1471,8 @@ module Sass::Script
|
|
1399
1471
|
end
|
1400
1472
|
declare :str_insert, [:string, :insert, :index]
|
1401
1473
|
|
1402
|
-
# Returns the index of the first
|
1403
|
-
# there is no such
|
1474
|
+
# Returns the index of the first occurrence of `$substring` in `$string`. If
|
1475
|
+
# there is no such occurrence, returns `null`.
|
1404
1476
|
#
|
1405
1477
|
# Note that unlike some languages, the first character in a Sass string is
|
1406
1478
|
# number 1, the second number 2, and so forth.
|
@@ -1412,8 +1484,8 @@ module Sass::Script
|
|
1412
1484
|
# str-index(abcd, c) => 3
|
1413
1485
|
#
|
1414
1486
|
# @overload str_index($string, $substring)
|
1415
|
-
#
|
1416
|
-
#
|
1487
|
+
# @param $string [Sass::Script::Value::String]
|
1488
|
+
# @param $substring [Sass::Script::Value::String]
|
1417
1489
|
# @return [Sass::Script::Value::Number, Sass::Script::Value::Null]
|
1418
1490
|
# @raise [ArgumentError] if any parameter is the wrong type
|
1419
1491
|
def str_index(string, substring)
|
@@ -1437,14 +1509,14 @@ module Sass::Script
|
|
1437
1509
|
# str-slice("abcd", 2, -2) => "bc"
|
1438
1510
|
#
|
1439
1511
|
# @overload str_slice($string, $start-at, $end-at: -1)
|
1440
|
-
#
|
1441
|
-
#
|
1442
|
-
#
|
1443
|
-
#
|
1444
|
-
#
|
1445
|
-
#
|
1446
|
-
#
|
1447
|
-
#
|
1512
|
+
# @param $start-at [Sass::Script::Value::Number] The index of the first
|
1513
|
+
# character of the substring. If this is negative, it counts from the end
|
1514
|
+
# of `$string`
|
1515
|
+
# @param $end-before [Sass::Script::Value::Number] The index of the last
|
1516
|
+
# character of the substring. If this is negative, it counts from the end
|
1517
|
+
# of `$string`. Defaults to -1
|
1518
|
+
# @return [Sass::Script::Value::String] The substring. This will be quoted
|
1519
|
+
# if and only if `$string` was quoted
|
1448
1520
|
# @raise [ArgumentError] if any parameter is the wrong type
|
1449
1521
|
def str_slice(string, start_at, end_at = nil)
|
1450
1522
|
assert_type string, :String, :string
|
@@ -1453,6 +1525,7 @@ module Sass::Script
|
|
1453
1525
|
end_at = number(-1) if end_at.nil?
|
1454
1526
|
assert_unit end_at, nil, "end-at"
|
1455
1527
|
|
1528
|
+
return Sass::Script::Value::String.new("", string.type) if end_at.value == 0
|
1456
1529
|
s = start_at.value > 0 ? start_at.value - 1 : start_at.value
|
1457
1530
|
e = end_at.value > 0 ? end_at.value - 1 : end_at.value
|
1458
1531
|
s = string.value.length + s if s < 0
|
@@ -1471,7 +1544,7 @@ module Sass::Script
|
|
1471
1544
|
# to-upper-case(abcd) => ABCD
|
1472
1545
|
#
|
1473
1546
|
# @overload to_upper_case($string)
|
1474
|
-
#
|
1547
|
+
# @param $string [Sass::Script::Value::String]
|
1475
1548
|
# @return [Sass::Script::Value::String]
|
1476
1549
|
# @raise [ArgumentError] if `$string` isn't a string
|
1477
1550
|
def to_upper_case(string)
|
@@ -1486,7 +1559,7 @@ module Sass::Script
|
|
1486
1559
|
# to-lower-case(ABCD) => abcd
|
1487
1560
|
#
|
1488
1561
|
# @overload to_lower_case($string)
|
1489
|
-
#
|
1562
|
+
# @param $string [Sass::Script::Value::String]
|
1490
1563
|
# @return [Sass::Script::Value::String]
|
1491
1564
|
# @raise [ArgumentError] if `$string` isn't a string
|
1492
1565
|
def to_lower_case(string)
|
@@ -1505,7 +1578,7 @@ module Sass::Script
|
|
1505
1578
|
# type-of(#fff) => color
|
1506
1579
|
# type-of(blue) => color
|
1507
1580
|
# @overload type_of($value)
|
1508
|
-
#
|
1581
|
+
# @param $value [Sass::Script::Value::Base] The value to inspect
|
1509
1582
|
# @return [Sass::Script::Value::String] The unquoted string name of the
|
1510
1583
|
# value's type
|
1511
1584
|
def type_of(value)
|
@@ -1515,12 +1588,27 @@ module Sass::Script
|
|
1515
1588
|
|
1516
1589
|
# Returns whether a feature exists in the current Sass runtime.
|
1517
1590
|
#
|
1591
|
+
# The following features are supported:
|
1592
|
+
#
|
1593
|
+
# * `global-variable-shadowing` indicates that a local variable will shadow
|
1594
|
+
# a global variable unless `!global` is used.
|
1595
|
+
#
|
1596
|
+
# * `extend-selector-pseudoclass` indicates that `@extend` will reach into
|
1597
|
+
# selector pseudoclasses like `:not`.
|
1598
|
+
#
|
1599
|
+
# * `units-level-3` indicates full support for unit arithmetic using units
|
1600
|
+
# defined in the [Values and Units Level 3][] spec.
|
1601
|
+
#
|
1602
|
+
# [Values and Units Level 3]: http://www.w3.org/TR/css3-values/
|
1603
|
+
#
|
1604
|
+
# * `at-error` indicates that the Sass `@error` directive is supported.
|
1605
|
+
#
|
1518
1606
|
# @example
|
1519
1607
|
# feature-exists(some-feature-that-exists) => true
|
1520
1608
|
# feature-exists(what-is-this-i-dont-know) => false
|
1521
1609
|
#
|
1522
1610
|
# @overload feature_exists($feature)
|
1523
|
-
#
|
1611
|
+
# @param $feature [Sass::Script::Value::String] The name of the feature
|
1524
1612
|
# @return [Sass::Script::Value::Bool] Whether the feature is supported in this version of Sass
|
1525
1613
|
# @raise [ArgumentError] if `$feature` isn't a string
|
1526
1614
|
def feature_exists(feature)
|
@@ -1539,7 +1627,7 @@ module Sass::Script
|
|
1539
1627
|
# unit(10px * 5em) => "em*px"
|
1540
1628
|
# unit(10px * 5em / 30cm / 1rem) => "em*px/cm*rem"
|
1541
1629
|
# @overload unit($number)
|
1542
|
-
#
|
1630
|
+
# @param $number [Sass::Script::Value::Number]
|
1543
1631
|
# @return [Sass::Script::Value::String] The unit(s) of the number, as a
|
1544
1632
|
# quoted string
|
1545
1633
|
# @raise [ArgumentError] if `$number` isn't a number
|
@@ -1555,7 +1643,7 @@ module Sass::Script
|
|
1555
1643
|
# unitless(100) => true
|
1556
1644
|
# unitless(100px) => false
|
1557
1645
|
# @overload unitless($number)
|
1558
|
-
#
|
1646
|
+
# @param $number [Sass::Script::Value::Number]
|
1559
1647
|
# @return [Sass::Script::Value::Bool]
|
1560
1648
|
# @raise [ArgumentError] if `$number` isn't a number
|
1561
1649
|
def unitless(number)
|
@@ -1571,8 +1659,8 @@ module Sass::Script
|
|
1571
1659
|
# comparable(100px, 3em) => false
|
1572
1660
|
# comparable(10cm, 3mm) => true
|
1573
1661
|
# @overload comparable($number1, $number2)
|
1574
|
-
#
|
1575
|
-
#
|
1662
|
+
# @param $number1 [Sass::Script::Value::Number]
|
1663
|
+
# @param $number2 [Sass::Script::Value::Number]
|
1576
1664
|
# @return [Sass::Script::Value::Bool]
|
1577
1665
|
# @raise [ArgumentError] if either parameter is the wrong type
|
1578
1666
|
def comparable(number1, number2)
|
@@ -1580,7 +1668,7 @@ module Sass::Script
|
|
1580
1668
|
assert_type number2, :Number, :number2
|
1581
1669
|
bool(number1.comparable_to?(number2))
|
1582
1670
|
end
|
1583
|
-
declare :comparable, [:number1, :number2]
|
1671
|
+
declare :comparable, [:number1, :number2]
|
1584
1672
|
|
1585
1673
|
# Converts a unitless number to a percentage.
|
1586
1674
|
#
|
@@ -1588,7 +1676,7 @@ module Sass::Script
|
|
1588
1676
|
# percentage(0.2) => 20%
|
1589
1677
|
# percentage(100px / 50px) => 200%
|
1590
1678
|
# @overload percentage($number)
|
1591
|
-
#
|
1679
|
+
# @param $number [Sass::Script::Value::Number]
|
1592
1680
|
# @return [Sass::Script::Value::Number]
|
1593
1681
|
# @raise [ArgumentError] if `$number` isn't a unitless number
|
1594
1682
|
def percentage(number)
|
@@ -1597,7 +1685,7 @@ module Sass::Script
|
|
1597
1685
|
end
|
1598
1686
|
number(number.value * 100, '%')
|
1599
1687
|
end
|
1600
|
-
declare :percentage, [:number]
|
1688
|
+
declare :percentage, [:number]
|
1601
1689
|
|
1602
1690
|
# Rounds a number to the nearest whole number.
|
1603
1691
|
#
|
@@ -1605,13 +1693,13 @@ module Sass::Script
|
|
1605
1693
|
# round(10.4px) => 10px
|
1606
1694
|
# round(10.6px) => 11px
|
1607
1695
|
# @overload round($number)
|
1608
|
-
#
|
1696
|
+
# @param $number [Sass::Script::Value::Number]
|
1609
1697
|
# @return [Sass::Script::Value::Number]
|
1610
1698
|
# @raise [ArgumentError] if `$number` isn't a number
|
1611
1699
|
def round(number)
|
1612
1700
|
numeric_transformation(number) {|n| n.round}
|
1613
1701
|
end
|
1614
|
-
declare :round, [:number]
|
1702
|
+
declare :round, [:number]
|
1615
1703
|
|
1616
1704
|
# Rounds a number up to the next whole number.
|
1617
1705
|
#
|
@@ -1619,13 +1707,13 @@ module Sass::Script
|
|
1619
1707
|
# ceil(10.4px) => 11px
|
1620
1708
|
# ceil(10.6px) => 11px
|
1621
1709
|
# @overload ceil($number)
|
1622
|
-
#
|
1710
|
+
# @param $number [Sass::Script::Value::Number]
|
1623
1711
|
# @return [Sass::Script::Value::Number]
|
1624
1712
|
# @raise [ArgumentError] if `$number` isn't a number
|
1625
1713
|
def ceil(number)
|
1626
1714
|
numeric_transformation(number) {|n| n.ceil}
|
1627
1715
|
end
|
1628
|
-
declare :ceil, [:number]
|
1716
|
+
declare :ceil, [:number]
|
1629
1717
|
|
1630
1718
|
# Rounds a number down to the previous whole number.
|
1631
1719
|
#
|
@@ -1633,13 +1721,13 @@ module Sass::Script
|
|
1633
1721
|
# floor(10.4px) => 10px
|
1634
1722
|
# floor(10.6px) => 10px
|
1635
1723
|
# @overload floor($number)
|
1636
|
-
#
|
1724
|
+
# @param $number [Sass::Script::Value::Number]
|
1637
1725
|
# @return [Sass::Script::Value::Number]
|
1638
1726
|
# @raise [ArgumentError] if `$number` isn't a number
|
1639
1727
|
def floor(number)
|
1640
1728
|
numeric_transformation(number) {|n| n.floor}
|
1641
1729
|
end
|
1642
|
-
declare :floor, [:number]
|
1730
|
+
declare :floor, [:number]
|
1643
1731
|
|
1644
1732
|
# Returns the absolute value of a number.
|
1645
1733
|
#
|
@@ -1647,13 +1735,13 @@ module Sass::Script
|
|
1647
1735
|
# abs(10px) => 10px
|
1648
1736
|
# abs(-10px) => 10px
|
1649
1737
|
# @overload abs($number)
|
1650
|
-
#
|
1738
|
+
# @param $number [Sass::Script::Value::Number]
|
1651
1739
|
# @return [Sass::Script::Value::Number]
|
1652
1740
|
# @raise [ArgumentError] if `$number` isn't a number
|
1653
1741
|
def abs(number)
|
1654
1742
|
numeric_transformation(number) {|n| n.abs}
|
1655
1743
|
end
|
1656
|
-
declare :abs, [:number]
|
1744
|
+
declare :abs, [:number]
|
1657
1745
|
|
1658
1746
|
# Finds the minimum of several numbers. This function takes any number of
|
1659
1747
|
# arguments.
|
@@ -1662,7 +1750,7 @@ module Sass::Script
|
|
1662
1750
|
# min(1px, 4px) => 1px
|
1663
1751
|
# min(5em, 3em, 4em) => 3em
|
1664
1752
|
# @overload min($numbers...)
|
1665
|
-
#
|
1753
|
+
# @param $numbers [[Sass::Script::Value::Number]]
|
1666
1754
|
# @return [Sass::Script::Value::Number]
|
1667
1755
|
# @raise [ArgumentError] if any argument isn't a number, or if not all of
|
1668
1756
|
# the arguments have comparable units
|
@@ -1679,7 +1767,7 @@ module Sass::Script
|
|
1679
1767
|
# max(1px, 4px) => 4px
|
1680
1768
|
# max(5em, 3em, 4em) => 5em
|
1681
1769
|
# @overload max($numbers...)
|
1682
|
-
#
|
1770
|
+
# @param $numbers [[Sass::Script::Value::Number]]
|
1683
1771
|
# @return [Sass::Script::Value::Number]
|
1684
1772
|
# @raise [ArgumentError] if any argument isn't a number, or if not all of
|
1685
1773
|
# the arguments have comparable units
|
@@ -1698,7 +1786,7 @@ module Sass::Script
|
|
1698
1786
|
# length(10px 20px 30px) => 3
|
1699
1787
|
# length((width: 10px, height: 20px)) => 2
|
1700
1788
|
# @overload length($list)
|
1701
|
-
#
|
1789
|
+
# @param $list [Sass::Script::Value::Base]
|
1702
1790
|
# @return [Sass::Script::Value::Number]
|
1703
1791
|
def length(list)
|
1704
1792
|
number(list.to_a.size)
|
@@ -1717,11 +1805,11 @@ module Sass::Script
|
|
1717
1805
|
# @example
|
1718
1806
|
# set-nth($list: 10px 20px 30px, $n: 2, $value: -20px) => 10px -20px 30px
|
1719
1807
|
# @overload set-nth($list, $n, $value)
|
1720
|
-
#
|
1721
|
-
#
|
1722
|
-
#
|
1723
|
-
#
|
1724
|
-
#
|
1808
|
+
# @param $list [Sass::Script::Value::Base] The list that will be copied, having the element
|
1809
|
+
# at index `$n` changed.
|
1810
|
+
# @param $n [Sass::Script::Value::Number] The index of the item to set.
|
1811
|
+
# Negative indices count from the end of the list.
|
1812
|
+
# @param $value [Sass::Script::Value::Base] The new value at index `$n`.
|
1725
1813
|
# @return [Sass::Script::Value::List]
|
1726
1814
|
# @raise [ArgumentError] if `$n` isn't an integer between 1 and the length
|
1727
1815
|
# of `$list`
|
@@ -1750,9 +1838,9 @@ module Sass::Script
|
|
1750
1838
|
# nth((Helvetica, Arial, sans-serif), 3) => sans-serif
|
1751
1839
|
# nth((width: 10px, length: 20px), 2) => length, 20px
|
1752
1840
|
# @overload nth($list, $n)
|
1753
|
-
#
|
1754
|
-
#
|
1755
|
-
#
|
1841
|
+
# @param $list [Sass::Script::Value::Base]
|
1842
|
+
# @param $n [Sass::Script::Value::Number] The index of the item to get.
|
1843
|
+
# Negative indices count from the end of the list.
|
1756
1844
|
# @return [Sass::Script::Value::Base]
|
1757
1845
|
# @raise [ArgumentError] if `$n` isn't an integer between 1 and the length
|
1758
1846
|
# of `$list`
|
@@ -1779,11 +1867,11 @@ module Sass::Script
|
|
1779
1867
|
# join(10px, 20px, comma) => 10px, 20px
|
1780
1868
|
# join((blue, red), (#abc, #def), space) => blue red #abc #def
|
1781
1869
|
# @overload join($list1, $list2, $separator: auto)
|
1782
|
-
#
|
1783
|
-
#
|
1784
|
-
#
|
1785
|
-
#
|
1786
|
-
#
|
1870
|
+
# @param $list1 [Sass::Script::Value::Base]
|
1871
|
+
# @param $list2 [Sass::Script::Value::Base]
|
1872
|
+
# @param $separator [Sass::Script::Value::String] The list separator to use.
|
1873
|
+
# If this is `comma` or `space`, that separator will be used. If this is
|
1874
|
+
# `auto` (the default), the separator is determined as explained above.
|
1787
1875
|
# @return [Sass::Script::Value::List]
|
1788
1876
|
def join(list1, list2, separator = identifier("auto"))
|
1789
1877
|
assert_type separator, :String, :separator
|
@@ -1812,11 +1900,11 @@ module Sass::Script
|
|
1812
1900
|
# append(10px, 20px, comma) => 10px, 20px
|
1813
1901
|
# append((blue, red), green, space) => blue red green
|
1814
1902
|
# @overload append($list, $val, $separator: auto)
|
1815
|
-
#
|
1816
|
-
#
|
1817
|
-
#
|
1818
|
-
#
|
1819
|
-
#
|
1903
|
+
# @param $list [Sass::Script::Value::Base]
|
1904
|
+
# @param $val [Sass::Script::Value::Base]
|
1905
|
+
# @param $separator [Sass::Script::Value::String] The list separator to use.
|
1906
|
+
# If this is `comma` or `space`, that separator will be used. If this is
|
1907
|
+
# `auto` (the default), the separator is determined as explained above.
|
1820
1908
|
# @return [Sass::Script::Value::List]
|
1821
1909
|
def append(list, val, separator = identifier("auto"))
|
1822
1910
|
assert_type separator, :String, :separator
|
@@ -1844,7 +1932,7 @@ module Sass::Script
|
|
1844
1932
|
# zip(1px 1px 3px, solid dashed solid, red green blue)
|
1845
1933
|
# => 1px solid red, 1px dashed green, 3px solid blue
|
1846
1934
|
# @overload zip($lists...)
|
1847
|
-
#
|
1935
|
+
# @param $lists [[Sass::Script::Value::Base]]
|
1848
1936
|
# @return [Sass::Script::Value::List]
|
1849
1937
|
def zip(*lists)
|
1850
1938
|
length = nil
|
@@ -1873,16 +1961,15 @@ module Sass::Script
|
|
1873
1961
|
# @example
|
1874
1962
|
# index(1px solid red, solid) => 2
|
1875
1963
|
# index(1px solid red, dashed) => null
|
1876
|
-
# index((width: 10px, height: 20px), (height
|
1964
|
+
# index((width: 10px, height: 20px), (height 20px)) => 2
|
1877
1965
|
# @overload index($list, $value)
|
1878
|
-
#
|
1879
|
-
#
|
1966
|
+
# @param $list [Sass::Script::Value::Base]
|
1967
|
+
# @param $value [Sass::Script::Value::Base]
|
1880
1968
|
# @return [Sass::Script::Value::Number, Sass::Script::Value::Null] The
|
1881
1969
|
# 1-based index of `$value` in `$list`, or `null`
|
1882
1970
|
def index(list, value)
|
1883
1971
|
index = list.to_a.index {|e| e.eq(value).to_bool}
|
1884
|
-
|
1885
|
-
Sass::Script::Value::DeprecatedFalse.new(environment)
|
1972
|
+
index ? number(index + 1) : null
|
1886
1973
|
end
|
1887
1974
|
declare :index, [:list, :value]
|
1888
1975
|
|
@@ -1894,7 +1981,7 @@ module Sass::Script
|
|
1894
1981
|
# list-separator(1px, 2px, 3px) => comma
|
1895
1982
|
# list-separator('foo') => space
|
1896
1983
|
# @overload list_separator($list)
|
1897
|
-
#
|
1984
|
+
# @param $list [Sass::Script::Value::Base]
|
1898
1985
|
# @return [Sass::Script::Value::String] `comma` or `space`
|
1899
1986
|
def list_separator(list)
|
1900
1987
|
identifier((list.separator || :space).to_s)
|
@@ -1909,14 +1996,14 @@ module Sass::Script
|
|
1909
1996
|
# map-get(("foo": 1, "bar": 2), "bar") => 2
|
1910
1997
|
# map-get(("foo": 1, "bar": 2), "baz") => null
|
1911
1998
|
# @overload map_get($map, $key)
|
1912
|
-
#
|
1913
|
-
#
|
1999
|
+
# @param $map [Sass::Script::Value::Map]
|
2000
|
+
# @param $key [Sass::Script::Value::Base]
|
1914
2001
|
# @return [Sass::Script::Value::Base] The value indexed by `$key`, or `null`
|
1915
2002
|
# if the map doesn't contain the given key
|
1916
2003
|
# @raise [ArgumentError] if `$map` is not a map
|
1917
2004
|
def map_get(map, key)
|
1918
2005
|
assert_type map, :Map, :map
|
1919
|
-
to_h
|
2006
|
+
map.to_h[key] || null
|
1920
2007
|
end
|
1921
2008
|
declare :map_get, [:map, :key]
|
1922
2009
|
|
@@ -1933,46 +2020,47 @@ module Sass::Script
|
|
1933
2020
|
# map-merge(("foo": 1), ("bar": 2)) => ("foo": 1, "bar": 2)
|
1934
2021
|
# map-merge(("foo": 1, "bar": 2), ("bar": 3)) => ("foo": 1, "bar": 3)
|
1935
2022
|
# @overload map_merge($map1, $map2)
|
1936
|
-
#
|
1937
|
-
#
|
2023
|
+
# @param $map1 [Sass::Script::Value::Map]
|
2024
|
+
# @param $map2 [Sass::Script::Value::Map]
|
1938
2025
|
# @return [Sass::Script::Value::Map]
|
1939
2026
|
# @raise [ArgumentError] if either parameter is not a map
|
1940
2027
|
def map_merge(map1, map2)
|
1941
2028
|
assert_type map1, :Map, :map1
|
1942
2029
|
assert_type map2, :Map, :map2
|
1943
|
-
map(
|
2030
|
+
map(map1.to_h.merge(map2.to_h))
|
1944
2031
|
end
|
1945
2032
|
declare :map_merge, [:map1, :map2]
|
1946
2033
|
|
1947
|
-
# Returns a new map with
|
2034
|
+
# Returns a new map with keys removed.
|
1948
2035
|
#
|
1949
2036
|
# @example
|
1950
2037
|
# map-remove(("foo": 1, "bar": 2), "bar") => ("foo": 1)
|
2038
|
+
# map-remove(("foo": 1, "bar": 2, "baz": 3), "bar", "baz") => ("foo": 1)
|
1951
2039
|
# map-remove(("foo": 1, "bar": 2), "baz") => ("foo": 1, "bar": 2)
|
1952
|
-
# @overload map_remove($map, $
|
1953
|
-
#
|
1954
|
-
#
|
2040
|
+
# @overload map_remove($map, $keys...)
|
2041
|
+
# @param $map [Sass::Script::Value::Map]
|
2042
|
+
# @param $keys [[Sass::Script::Value::Base]]
|
1955
2043
|
# @return [Sass::Script::Value::Map]
|
1956
2044
|
# @raise [ArgumentError] if `$map` is not a map
|
1957
|
-
def map_remove(map,
|
2045
|
+
def map_remove(map, *keys)
|
1958
2046
|
assert_type map, :Map, :map
|
1959
|
-
hash =
|
1960
|
-
hash.
|
2047
|
+
hash = map.to_h.dup
|
2048
|
+
hash.delete_if {|key, _| keys.include?(key)}
|
1961
2049
|
map(hash)
|
1962
2050
|
end
|
1963
|
-
declare :map_remove, [:map, :key]
|
2051
|
+
declare :map_remove, [:map, :key], :var_args => true
|
1964
2052
|
|
1965
2053
|
# Returns a list of all keys in a map.
|
1966
2054
|
#
|
1967
2055
|
# @example
|
1968
2056
|
# map-keys(("foo": 1, "bar": 2)) => "foo", "bar"
|
1969
2057
|
# @overload map_keys($map)
|
1970
|
-
#
|
2058
|
+
# @param $map [Map]
|
1971
2059
|
# @return [List] the list of keys, comma-separated
|
1972
2060
|
# @raise [ArgumentError] if `$map` is not a map
|
1973
2061
|
def map_keys(map)
|
1974
2062
|
assert_type map, :Map, :map
|
1975
|
-
list(
|
2063
|
+
list(map.to_h.keys, :comma)
|
1976
2064
|
end
|
1977
2065
|
declare :map_keys, [:map]
|
1978
2066
|
|
@@ -1983,12 +2071,12 @@ module Sass::Script
|
|
1983
2071
|
# map-values(("foo": 1, "bar": 2)) => 1, 2
|
1984
2072
|
# map-values(("foo": 1, "bar": 2, "baz": 1)) => 1, 2, 1
|
1985
2073
|
# @overload map_values($map)
|
1986
|
-
#
|
2074
|
+
# @param $map [Map]
|
1987
2075
|
# @return [List] the list of values, comma-separated
|
1988
2076
|
# @raise [ArgumentError] if `$map` is not a map
|
1989
2077
|
def map_values(map)
|
1990
2078
|
assert_type map, :Map, :map
|
1991
|
-
list(
|
2079
|
+
list(map.to_h.values, :comma)
|
1992
2080
|
end
|
1993
2081
|
declare :map_values, [:map]
|
1994
2082
|
|
@@ -1998,13 +2086,13 @@ module Sass::Script
|
|
1998
2086
|
# map-has-key(("foo": 1, "bar": 2), "foo") => true
|
1999
2087
|
# map-has-key(("foo": 1, "bar": 2), "baz") => false
|
2000
2088
|
# @overload map_has_key($map, $key)
|
2001
|
-
#
|
2002
|
-
#
|
2089
|
+
# @param $map [Sass::Script::Value::Map]
|
2090
|
+
# @param $key [Sass::Script::Value::Base]
|
2003
2091
|
# @return [Sass::Script::Value::Bool]
|
2004
2092
|
# @raise [ArgumentError] if `$map` is not a map
|
2005
2093
|
def map_has_key(map, key)
|
2006
2094
|
assert_type map, :Map, :map
|
2007
|
-
bool(
|
2095
|
+
bool(map.to_h.has_key?(key))
|
2008
2096
|
end
|
2009
2097
|
declare :map_has_key, [:map, :key]
|
2010
2098
|
|
@@ -2019,12 +2107,12 @@ module Sass::Script
|
|
2019
2107
|
#
|
2020
2108
|
# @include foo($arg1: val, $arg2: val);
|
2021
2109
|
# @overload keywords($args)
|
2022
|
-
#
|
2110
|
+
# @param $args [Sass::Script::Value::ArgList]
|
2023
2111
|
# @return [Sass::Script::Value::Map]
|
2024
2112
|
# @raise [ArgumentError] if `$args` isn't a variable argument list
|
2025
2113
|
def keywords(args)
|
2026
2114
|
assert_type args, :ArgList, :args
|
2027
|
-
map(Sass::Util.map_keys(args.keywords.as_stored) {|k| Sass::Script::String.new(k)})
|
2115
|
+
map(Sass::Util.map_keys(args.keywords.as_stored) {|k| Sass::Script::Value::String.new(k)})
|
2028
2116
|
end
|
2029
2117
|
declare :keywords, [:args]
|
2030
2118
|
|
@@ -2036,10 +2124,10 @@ module Sass::Script
|
|
2036
2124
|
# if(true, 1px, 2px) => 1px
|
2037
2125
|
# if(false, 1px, 2px) => 2px
|
2038
2126
|
# @overload if($condition, $if-true, $if-false)
|
2039
|
-
#
|
2040
|
-
#
|
2041
|
-
#
|
2042
|
-
#
|
2127
|
+
# @param $condition [Sass::Script::Value::Base] Whether the `$if-true` or
|
2128
|
+
# `$if-false` will be returned
|
2129
|
+
# @param $if-true [Sass::Script::Tree::Node]
|
2130
|
+
# @param $if-false [Sass::Script::Tree::Node]
|
2043
2131
|
# @return [Sass::Script::Value::Base] `$if-true` or `$if-false`
|
2044
2132
|
def if(condition, if_true, if_false)
|
2045
2133
|
if condition.to_bool
|
@@ -2076,10 +2164,10 @@ module Sass::Script
|
|
2076
2164
|
# call(scale-color, #0a64ff, $lightness: -10%) => #0058ef
|
2077
2165
|
#
|
2078
2166
|
# $fn: nth;
|
2079
|
-
# call($fn,
|
2167
|
+
# call($fn, (a b c), 2) => b
|
2080
2168
|
#
|
2081
2169
|
# @overload call($name, $args...)
|
2082
|
-
#
|
2170
|
+
# @param $name [String] The name of the function to call.
|
2083
2171
|
def call(name, *args)
|
2084
2172
|
assert_type name, :String, :name
|
2085
2173
|
kwargs = args.last.is_a?(Hash) ? args.pop : {}
|
@@ -2094,31 +2182,29 @@ module Sass::Script
|
|
2094
2182
|
end
|
2095
2183
|
declare :call, [:name], :var_args => true, :var_kwargs => true
|
2096
2184
|
|
2097
|
-
# This function only exists as a workaround for IE7's [`content:
|
2098
|
-
# bug]
|
2185
|
+
# This function only exists as a workaround for IE7's [`content:
|
2186
|
+
# counter` bug](http://jes.st/2013/ie7s-css-breaking-content-counter-bug/).
|
2187
|
+
# It works identically to any other plain-CSS function, except it
|
2099
2188
|
# avoids adding spaces between the argument commas.
|
2100
2189
|
#
|
2101
|
-
# [bug]: http://jes.st/2013/ie7s-css-breaking-content-counter-bug/
|
2102
|
-
#
|
2103
2190
|
# @example
|
2104
2191
|
# counter(item, ".") => counter(item,".")
|
2105
2192
|
# @overload counter($args...)
|
2106
|
-
# @return [String]
|
2193
|
+
# @return [Sass::Script::Value::String]
|
2107
2194
|
def counter(*args)
|
2108
2195
|
identifier("counter(#{args.map {|a| a.to_s(options)}.join(',')})")
|
2109
2196
|
end
|
2110
2197
|
declare :counter, [], :var_args => true
|
2111
2198
|
|
2112
|
-
# This function only exists as a workaround for IE7's [`content:
|
2113
|
-
# bug]
|
2199
|
+
# This function only exists as a workaround for IE7's [`content:
|
2200
|
+
# counter` bug](http://jes.st/2013/ie7s-css-breaking-content-counter-bug/).
|
2201
|
+
# It works identically to any other plain-CSS function, except it
|
2114
2202
|
# avoids adding spaces between the argument commas.
|
2115
2203
|
#
|
2116
|
-
# [bug]: http://jes.st/2013/ie7s-css-breaking-content-counter-bug/
|
2117
|
-
#
|
2118
2204
|
# @example
|
2119
2205
|
# counters(item, ".") => counters(item,".")
|
2120
2206
|
# @overload counters($args...)
|
2121
|
-
# @return [String]
|
2207
|
+
# @return [Sass::Script::Value::String]
|
2122
2208
|
def counters(*args)
|
2123
2209
|
identifier("counters(#{args.map {|a| a.to_s(options)}.join(',')})")
|
2124
2210
|
end
|
@@ -2132,9 +2218,11 @@ module Sass::Script
|
|
2132
2218
|
# variable-exists(a-false-value) => true
|
2133
2219
|
#
|
2134
2220
|
# variable-exists(nonexistent) => false
|
2135
|
-
#
|
2136
|
-
#
|
2137
|
-
#
|
2221
|
+
#
|
2222
|
+
# @overload variable_exists($name)
|
2223
|
+
# @param $name [Sass::Script::Value::String] The name of the variable to
|
2224
|
+
# check. The name should not include the `$`.
|
2225
|
+
# @return [Sass::Script::Value::Bool] Whether the variable is defined in
|
2138
2226
|
# the current scope.
|
2139
2227
|
def variable_exists(name)
|
2140
2228
|
assert_type name, :String, :name
|
@@ -2153,9 +2241,11 @@ module Sass::Script
|
|
2153
2241
|
# $some-var: false;
|
2154
2242
|
# @if global-variable-exists(some-var) { /* false, doesn't run */ }
|
2155
2243
|
# }
|
2156
|
-
#
|
2157
|
-
#
|
2158
|
-
#
|
2244
|
+
#
|
2245
|
+
# @overload global_variable_exists($name)
|
2246
|
+
# @param $name [Sass::Script::Value::String] The name of the variable to
|
2247
|
+
# check. The name should not include the `$`.
|
2248
|
+
# @return [Sass::Script::Value::Bool] Whether the variable is defined in
|
2159
2249
|
# the global scope.
|
2160
2250
|
def global_variable_exists(name)
|
2161
2251
|
assert_type name, :String, :name
|
@@ -2170,9 +2260,11 @@ module Sass::Script
|
|
2170
2260
|
#
|
2171
2261
|
# @function myfunc { @return "something"; }
|
2172
2262
|
# function-exists(myfunc) => true
|
2173
|
-
#
|
2174
|
-
#
|
2175
|
-
#
|
2263
|
+
#
|
2264
|
+
# @overload function_exists($name)
|
2265
|
+
# @param name [Sass::Script::Value::String] The name of the function to
|
2266
|
+
# check.
|
2267
|
+
# @return [Sass::Script::Value::Bool] Whether the function is defined.
|
2176
2268
|
def function_exists(name)
|
2177
2269
|
assert_type name, :String, :name
|
2178
2270
|
exists = Sass::Script::Functions.callable?(name.value.tr("-", "_"))
|
@@ -2188,9 +2280,11 @@ module Sass::Script
|
|
2188
2280
|
#
|
2189
2281
|
# @mixin red-text { color: red; }
|
2190
2282
|
# mixin-exists(red-text) => true
|
2191
|
-
#
|
2192
|
-
#
|
2193
|
-
#
|
2283
|
+
#
|
2284
|
+
# @overload mixin_exists($name)
|
2285
|
+
# @param name [Sass::Script::Value::String] The name of the mixin to
|
2286
|
+
# check.
|
2287
|
+
# @return [Sass::Script::Value::Bool] Whether the mixin is defined.
|
2194
2288
|
def mixin_exists(name)
|
2195
2289
|
assert_type name, :String, :name
|
2196
2290
|
bool(environment.mixin(name.value))
|
@@ -2199,8 +2293,9 @@ module Sass::Script
|
|
2199
2293
|
|
2200
2294
|
# Return a string containing the value as its Sass representation.
|
2201
2295
|
#
|
2202
|
-
# @
|
2203
|
-
#
|
2296
|
+
# @overload inspect($value)
|
2297
|
+
# @param $value [Sass::Script::Value::Base] The value to inspect.
|
2298
|
+
# @return [Sass::Script::Value::String] A representation of the value as
|
2204
2299
|
# it would be written in Sass.
|
2205
2300
|
def inspect(value)
|
2206
2301
|
unquoted_string(value.to_sass)
|
@@ -2209,12 +2304,12 @@ module Sass::Script
|
|
2209
2304
|
|
2210
2305
|
# @overload random()
|
2211
2306
|
# Return a decimal between 0 and 1, inclusive of 0 but not 1.
|
2212
|
-
# @return [Sass::Script::Number] A decimal value.
|
2307
|
+
# @return [Sass::Script::Value::Number] A decimal value.
|
2213
2308
|
# @overload random($limit)
|
2214
2309
|
# Return an integer between 1 and `$limit`, inclusive of 1 but not `$limit`.
|
2215
2310
|
# @param $limit [Sass::Script::Value::Number] The maximum of the random integer to be
|
2216
2311
|
# returned, a positive integer.
|
2217
|
-
# @return [Sass::Script::Number] An integer.
|
2312
|
+
# @return [Sass::Script::Value::Number] An integer.
|
2218
2313
|
# @raise [ArgumentError] if the `$limit` is not 1 or greater
|
2219
2314
|
def random(limit = nil)
|
2220
2315
|
generator = Sass::Script::Functions.random_number_generator
|
@@ -2231,6 +2326,281 @@ module Sass::Script
|
|
2231
2326
|
declare :random, []
|
2232
2327
|
declare :random, [:limit]
|
2233
2328
|
|
2329
|
+
# Parses a user-provided selector into a list of lists of strings
|
2330
|
+
# as returned by `&`.
|
2331
|
+
#
|
2332
|
+
# @example
|
2333
|
+
# selector-parse(".foo .bar, .baz .bang") => ('.foo' '.bar', '.baz' '.bang')
|
2334
|
+
#
|
2335
|
+
# @overload selector_parse($selector)
|
2336
|
+
# @param $selector [Sass::Script::Value::String, Sass::Script::Value::List]
|
2337
|
+
# The selector to parse. This can be either a string, a list of
|
2338
|
+
# strings, or a list of lists of strings as returned by `&`.
|
2339
|
+
# @return [Sass::Script::Value::List]
|
2340
|
+
# A list of lists of strings representing `$selector`. This is
|
2341
|
+
# in the same format as a selector returned by `&`.
|
2342
|
+
def selector_parse(selector)
|
2343
|
+
parse_selector(selector, :selector).to_sass_script
|
2344
|
+
end
|
2345
|
+
declare :selector_parse, [:selector]
|
2346
|
+
|
2347
|
+
# Return a new selector with all selectors in `$selectors` nested beneath
|
2348
|
+
# one another as though they had been nested in the stylesheet as
|
2349
|
+
# `$selector1 { $selector2 { ... } }`.
|
2350
|
+
#
|
2351
|
+
# Unlike most selector functions, `selector-nest` allows the
|
2352
|
+
# parent selector `&` to be used in any selector but the first.
|
2353
|
+
#
|
2354
|
+
# @example
|
2355
|
+
# selector-nest(".foo", ".bar", ".baz") => .foo .bar .baz
|
2356
|
+
# selector-nest(".a .foo", ".b .bar") => .a .foo .b .bar
|
2357
|
+
# selector-nest(".foo", "&.bar") => .foo.bar
|
2358
|
+
#
|
2359
|
+
# @overload selector_nest($selectors...)
|
2360
|
+
# @param $selectors [[Sass::Script::Value::String, Sass::Script::Value::List]]
|
2361
|
+
# The selectors to nest. At least one selector must be passed. Each of
|
2362
|
+
# these can be either a string, a list of strings, or a list of lists of
|
2363
|
+
# strings as returned by `&`.
|
2364
|
+
# @return [Sass::Script::Value::List]
|
2365
|
+
# A list of lists of strings representing the result of nesting
|
2366
|
+
# `$selectors`. This is in the same format as a selector returned by
|
2367
|
+
# `&`.
|
2368
|
+
def selector_nest(*selectors)
|
2369
|
+
if selectors.empty?
|
2370
|
+
raise ArgumentError.new("$selectors: At least one selector must be passed")
|
2371
|
+
end
|
2372
|
+
|
2373
|
+
parsed = [parse_selector(selectors.first, :selectors)]
|
2374
|
+
parsed += selectors[1..-1].map {|sel| parse_selector(sel, :selectors, !!:parse_parent_ref)}
|
2375
|
+
parsed.inject {|result, child| child.resolve_parent_refs(result)}.to_sass_script
|
2376
|
+
end
|
2377
|
+
declare :selector_nest, [], :var_args => true
|
2378
|
+
|
2379
|
+
# Return a new selector with all selectors in `$selectors` appended one
|
2380
|
+
# another as though they had been nested in the stylesheet as `$selector1 {
|
2381
|
+
# &$selector2 { ... } }`.
|
2382
|
+
#
|
2383
|
+
# @example
|
2384
|
+
# selector-append(".foo", ".bar", ".baz") => .foo.bar.baz
|
2385
|
+
# selector-append(".a .foo", ".b .bar") => "a .foo.b .bar"
|
2386
|
+
# selector-append(".foo", "-suffix") => ".foo-suffix"
|
2387
|
+
#
|
2388
|
+
# @overload selector_append($selectors...)
|
2389
|
+
# @param $selectors [[Sass::Script::Value::String, Sass::Script::Value::List]]
|
2390
|
+
# The selectors to append. At least one selector must be passed. Each of
|
2391
|
+
# these can be either a string, a list of strings, or a list of lists of
|
2392
|
+
# strings as returned by `&`.
|
2393
|
+
# @return [Sass::Script::Value::List]
|
2394
|
+
# A list of lists of strings representing the result of appending
|
2395
|
+
# `$selectors`. This is in the same format as a selector returned by
|
2396
|
+
# `&`.
|
2397
|
+
# @raise [ArgumentError] if a selector could not be appended.
|
2398
|
+
def selector_append(*selectors)
|
2399
|
+
if selectors.empty?
|
2400
|
+
raise ArgumentError.new("$selectors: At least one selector must be passed")
|
2401
|
+
end
|
2402
|
+
|
2403
|
+
selectors.map {|sel| parse_selector(sel, :selectors)}.inject do |parent, child|
|
2404
|
+
child.members.each do |seq|
|
2405
|
+
sseq = seq.members.first
|
2406
|
+
unless sseq.is_a?(Sass::Selector::SimpleSequence)
|
2407
|
+
raise ArgumentError.new("Can't append \"#{seq}\" to \"#{parent}\"")
|
2408
|
+
end
|
2409
|
+
|
2410
|
+
base = sseq.base
|
2411
|
+
case base
|
2412
|
+
when Sass::Selector::Universal
|
2413
|
+
raise ArgumentError.new("Can't append \"#{seq}\" to \"#{parent}\"")
|
2414
|
+
when Sass::Selector::Element
|
2415
|
+
unless base.namespace.nil?
|
2416
|
+
raise ArgumentError.new("Can't append \"#{seq}\" to \"#{parent}\"")
|
2417
|
+
end
|
2418
|
+
sseq.members[0] = Sass::Selector::Parent.new(base.name)
|
2419
|
+
else
|
2420
|
+
sseq.members.unshift Sass::Selector::Parent.new
|
2421
|
+
end
|
2422
|
+
end
|
2423
|
+
child.resolve_parent_refs(parent)
|
2424
|
+
end.to_sass_script
|
2425
|
+
end
|
2426
|
+
declare :selector_append, [], :var_args => true
|
2427
|
+
|
2428
|
+
# Returns a new version of `$selector` with `$extendee` extended
|
2429
|
+
# with `$extender`. This works just like the result of
|
2430
|
+
#
|
2431
|
+
# $selector { ... }
|
2432
|
+
# $extender { @extend $extendee }
|
2433
|
+
#
|
2434
|
+
# @example
|
2435
|
+
# selector-extend(".a .b", ".b", ".foo .bar") => .a .b, .a .foo .bar, .foo .a .bar
|
2436
|
+
#
|
2437
|
+
# @overload selector_extend($selector, $extendee, $extender)
|
2438
|
+
# @param $selector [Sass::Script::Value::String, Sass::Script::Value::List]
|
2439
|
+
# The selector within which `$extendee` is extended with
|
2440
|
+
# `$extender`. This can be either a string, a list of strings,
|
2441
|
+
# or a list of lists of strings as returned by `&`.
|
2442
|
+
# @param $extendee [Sass::Script::Value::String, Sass::Script::Value::List]
|
2443
|
+
# The selector being extended. This can be either a string, a
|
2444
|
+
# list of strings, or a list of lists of strings as returned
|
2445
|
+
# by `&`.
|
2446
|
+
# @param $extender [Sass::Script::Value::String, Sass::Script::Value::List]
|
2447
|
+
# The selector being injected into `$selector`. This can be
|
2448
|
+
# either a string, a list of strings, or a list of lists of
|
2449
|
+
# strings as returned by `&`.
|
2450
|
+
# @return [Sass::Script::Value::List]
|
2451
|
+
# A list of lists of strings representing the result of the
|
2452
|
+
# extension. This is in the same format as a selector returned
|
2453
|
+
# by `&`.
|
2454
|
+
# @raise [ArgumentError] if the extension fails
|
2455
|
+
def selector_extend(selector, extendee, extender)
|
2456
|
+
selector = parse_selector(selector, :selector)
|
2457
|
+
extendee = parse_selector(extendee, :extendee)
|
2458
|
+
extender = parse_selector(extender, :extender)
|
2459
|
+
|
2460
|
+
extends = Sass::Util::SubsetMap.new
|
2461
|
+
begin
|
2462
|
+
extender.populate_extends(extends, extendee)
|
2463
|
+
selector.do_extend(extends).to_sass_script
|
2464
|
+
rescue Sass::SyntaxError => e
|
2465
|
+
raise ArgumentError.new(e.to_s)
|
2466
|
+
end
|
2467
|
+
end
|
2468
|
+
declare :selector_extend, [:selector, :extendee, :extender]
|
2469
|
+
|
2470
|
+
# Replaces all instances of `$original` with `$replacement` in `$selector`
|
2471
|
+
#
|
2472
|
+
# This works by using `@extend` and throwing away the original
|
2473
|
+
# selector. This means that it can be used to do very advanced
|
2474
|
+
# replacements; see the examples below.
|
2475
|
+
#
|
2476
|
+
# @example
|
2477
|
+
# selector-replace(".foo .bar", ".bar", ".baz") => ".foo .baz"
|
2478
|
+
# selector-replace(".foo.bar.baz", ".foo.baz", ".qux") => ".bar.qux"
|
2479
|
+
#
|
2480
|
+
# @overload selector_replace($selector, $original, $replacement)
|
2481
|
+
# @param $selector [Sass::Script::Value::String, Sass::Script::Value::List]
|
2482
|
+
# The selector within which `$original` is replaced with
|
2483
|
+
# `$replacement`. This can be either a string, a list of
|
2484
|
+
# strings, or a list of lists of strings as returned by `&`.
|
2485
|
+
# @param $original [Sass::Script::Value::String, Sass::Script::Value::List]
|
2486
|
+
# The selector being replaced. This can be either a string, a
|
2487
|
+
# list of strings, or a list of lists of strings as returned
|
2488
|
+
# by `&`.
|
2489
|
+
# @param $replacement [Sass::Script::Value::String, Sass::Script::Value::List]
|
2490
|
+
# The selector that `$original` is being replaced with. This
|
2491
|
+
# can be either a string, a list of strings, or a list of
|
2492
|
+
# lists of strings as returned by `&`.
|
2493
|
+
# @return [Sass::Script::Value::List]
|
2494
|
+
# A list of lists of strings representing the result of the
|
2495
|
+
# extension. This is in the same format as a selector returned
|
2496
|
+
# by `&`.
|
2497
|
+
# @raise [ArgumentError] if the replacement fails
|
2498
|
+
def selector_replace(selector, original, replacement)
|
2499
|
+
selector = parse_selector(selector, :selector)
|
2500
|
+
original = parse_selector(original, :original)
|
2501
|
+
replacement = parse_selector(replacement, :replacement)
|
2502
|
+
|
2503
|
+
extends = Sass::Util::SubsetMap.new
|
2504
|
+
begin
|
2505
|
+
replacement.populate_extends(extends, original)
|
2506
|
+
selector.do_extend(extends, [], !!:replace).to_sass_script
|
2507
|
+
rescue Sass::SyntaxError => e
|
2508
|
+
raise ArgumentError.new(e.to_s)
|
2509
|
+
end
|
2510
|
+
end
|
2511
|
+
declare :selector_replace, [:selector, :original, :replacement]
|
2512
|
+
|
2513
|
+
# Unifies two selectors into a single selector that matches only
|
2514
|
+
# elements matched by both input selectors. Returns `null` if
|
2515
|
+
# there is no such selector.
|
2516
|
+
#
|
2517
|
+
# Like the selector unification done for `@extend`, this doesn't
|
2518
|
+
# guarantee that the output selector will match *all* elements
|
2519
|
+
# matched by both input selectors. For example, if `.a .b` is
|
2520
|
+
# unified with `.x .y`, `.a .x .b.y, .x .a .b.y` will be returned,
|
2521
|
+
# but `.a.x .b.y` will not. This avoids exponential output size
|
2522
|
+
# while matching all elements that are likely to exist in
|
2523
|
+
# practice.
|
2524
|
+
#
|
2525
|
+
# @example
|
2526
|
+
# selector-unify(".a", ".b") => .a.b
|
2527
|
+
# selector-unify(".a .b", ".x .y") => .a .x .b.y, .x .a .b.y
|
2528
|
+
# selector-unify(".a.b", ".b.c") => .a.b.c
|
2529
|
+
# selector-unify("#a", "#b") => null
|
2530
|
+
#
|
2531
|
+
# @overload selector_unify($selector1, $selector2)
|
2532
|
+
# @param $selector1 [Sass::Script::Value::String, Sass::Script::Value::List]
|
2533
|
+
# The first selector to be unified. This can be either a
|
2534
|
+
# string, a list of strings, or a list of lists of strings as
|
2535
|
+
# returned by `&`.
|
2536
|
+
# @param $selector2 [Sass::Script::Value::String, Sass::Script::Value::List]
|
2537
|
+
# The second selector to be unified. This can be either a
|
2538
|
+
# string, a list of strings, or a list of lists of strings as
|
2539
|
+
# returned by `&`.
|
2540
|
+
# @return [Sass::Script::Value::List, Sass::Script::Value::Null]
|
2541
|
+
# A list of lists of strings representing the result of the
|
2542
|
+
# unification, or null if no unification exists. This is in
|
2543
|
+
# the same format as a selector returned by `&`.
|
2544
|
+
def selector_unify(selector1, selector2)
|
2545
|
+
selector1 = parse_selector(selector1, :selector1)
|
2546
|
+
selector2 = parse_selector(selector2, :selector2)
|
2547
|
+
return null unless (unified = selector1.unify(selector2))
|
2548
|
+
unified.to_sass_script
|
2549
|
+
end
|
2550
|
+
declare :selector_unify, [:selector1, :selector2]
|
2551
|
+
|
2552
|
+
# Returns the [simple
|
2553
|
+
# selectors](http://dev.w3.org/csswg/selectors4/#simple) that
|
2554
|
+
# comprise the compound selector `$selector`.
|
2555
|
+
#
|
2556
|
+
# Note that `$selector` **must be** a [compound
|
2557
|
+
# selector](http://dev.w3.org/csswg/selectors4/#compound). That
|
2558
|
+
# means it cannot contain commas or spaces. It also means that
|
2559
|
+
# unlike other selector functions, this takes only strings, not
|
2560
|
+
# lists.
|
2561
|
+
#
|
2562
|
+
# @example
|
2563
|
+
# simple-selectors(".foo.bar") => ".foo", ".bar"
|
2564
|
+
# simple-selectors(".foo.bar.baz") => ".foo", ".bar", ".baz"
|
2565
|
+
#
|
2566
|
+
# @overload simple_selectors($selector)
|
2567
|
+
# @param $selector [Sass::Script::Value::String]
|
2568
|
+
# The compound selector whose simple selectors will be extracted.
|
2569
|
+
# @return [Sass::Script::Value::List]
|
2570
|
+
# A list of simple selectors in the compound selector.
|
2571
|
+
def simple_selectors(selector)
|
2572
|
+
selector = parse_compound_selector(selector, :selector)
|
2573
|
+
list(selector.members.map {|simple| unquoted_string(simple.to_s)}, :comma)
|
2574
|
+
end
|
2575
|
+
declare :simple_selectors, [:selector]
|
2576
|
+
|
2577
|
+
# Returns whether `$super` is a superselector of `$sub`. This means that
|
2578
|
+
# `$super` matches all the elements that `$sub` matches, as well as possibly
|
2579
|
+
# additional elements. In general, simpler selectors tend to be
|
2580
|
+
# superselectors of more complex oned.
|
2581
|
+
#
|
2582
|
+
# @example
|
2583
|
+
# is-superselector(".foo", ".foo.bar") => true
|
2584
|
+
# is-superselector(".foo.bar", ".foo") => false
|
2585
|
+
# is-superselector(".bar", ".foo .bar") => true
|
2586
|
+
# is-superselector(".foo .bar", ".bar") => false
|
2587
|
+
#
|
2588
|
+
# @overload is_superselector($super, $sub)
|
2589
|
+
# @param $super [Sass::Script::Value::String, Sass::Script::Value::List]
|
2590
|
+
# The potential superselector. This can be either a string, a list of
|
2591
|
+
# strings, or a list of lists of strings as returned by `&`.
|
2592
|
+
# @param $sub [Sass::Script::Value::String, Sass::Script::Value::List]
|
2593
|
+
# The potential subselector. This can be either a string, a list of
|
2594
|
+
# strings, or a list of lists of strings as returned by `&`.
|
2595
|
+
# @return [Sass::Script::Value::Bool]
|
2596
|
+
# Whether `$selector1` is a superselector of `$selector2`.
|
2597
|
+
def is_superselector(sup, sub)
|
2598
|
+
sup = parse_selector(sup, :super)
|
2599
|
+
sub = parse_selector(sub, :sub)
|
2600
|
+
bool(sup.superselector?(sub))
|
2601
|
+
end
|
2602
|
+
declare :is_superselector, [:super, :sub]
|
2603
|
+
|
2234
2604
|
private
|
2235
2605
|
|
2236
2606
|
# This method implements the pattern of transforming a numeric value into
|
@@ -2250,23 +2620,7 @@ module Sass::Script
|
|
2250
2620
|
assert_type amount, :Number, :amount
|
2251
2621
|
Sass::Util.check_range('Amount', range, amount, units)
|
2252
2622
|
|
2253
|
-
|
2254
|
-
# or should we do so in the Color constructor itself,
|
2255
|
-
# and allow clipping in rgb() et al?
|
2256
|
-
color.with(attr => Sass::Util.restrict(
|
2257
|
-
color.send(attr).send(op, amount.value), range))
|
2258
|
-
end
|
2259
|
-
|
2260
|
-
def to_h(obj)
|
2261
|
-
return obj.to_h unless obj.is_a?(Sass::Script::Value::List) && obj.needs_map_warning?
|
2262
|
-
|
2263
|
-
fn_name = Sass::Util.caller_info.last.gsub('_', '-')
|
2264
|
-
Sass::Util.sass_warn <<WARNING + environment.stack.to_s.gsub(/^/, ' ')
|
2265
|
-
DEPRECATION WARNING: Passing lists of pairs to #{fn_name} is deprecated and will
|
2266
|
-
be removed in future versions of Sass. Use Sass maps instead. For details, see
|
2267
|
-
http://sass-lang.com/docs/yardoc/file.SASS_REFERENCE.html#maps.
|
2268
|
-
WARNING
|
2269
|
-
obj.to_h
|
2623
|
+
color.with(attr => color.send(attr).send(op, amount.value))
|
2270
2624
|
end
|
2271
2625
|
end
|
2272
2626
|
end
|