sass 3.7.4 → 4.0.0.alpha.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +13 -5
- data/.yardopts +1 -1
- data/CODE_OF_CONDUCT.md +1 -1
- data/CONTRIBUTING.md +1 -146
- data/MIT-LICENSE +1 -1
- data/README.md +25 -39
- data/Rakefile +274 -0
- data/VERSION +1 -1
- data/VERSION_DATE +1 -1
- data/lib/sass.rb +3 -3
- data/lib/sass/cache_stores/filesystem.rb +2 -2
- data/lib/sass/cache_stores/memory.rb +5 -4
- data/lib/sass/callbacks.rb +2 -2
- data/lib/sass/css.rb +12 -12
- data/lib/sass/engine.rb +44 -62
- data/lib/sass/environment.rb +7 -35
- data/lib/sass/error.rb +14 -14
- data/lib/sass/exec/base.rb +14 -3
- data/lib/sass/exec/sass_convert.rb +6 -20
- data/lib/sass/exec/sass_scss.rb +29 -5
- data/lib/sass/features.rb +2 -3
- data/lib/sass/importers/filesystem.rb +6 -11
- data/lib/sass/logger.rb +3 -8
- data/lib/sass/logger/base.rb +2 -19
- data/lib/sass/plugin.rb +2 -3
- data/lib/sass/plugin/compiler.rb +67 -48
- data/lib/sass/plugin/configuration.rb +3 -3
- data/lib/sass/plugin/merb.rb +1 -1
- data/lib/sass/plugin/rack.rb +3 -3
- data/lib/sass/plugin/staleness_checker.rb +3 -3
- data/lib/sass/railtie.rb +1 -1
- data/lib/sass/script.rb +3 -3
- data/lib/sass/script/css_parser.rb +15 -5
- data/lib/sass/script/functions.rb +121 -337
- data/lib/sass/script/lexer.rb +36 -102
- data/lib/sass/script/parser.rb +153 -529
- data/lib/sass/script/tree/funcall.rb +34 -42
- data/lib/sass/script/tree/interpolation.rb +26 -171
- data/lib/sass/script/tree/list_literal.rb +8 -23
- data/lib/sass/script/tree/map_literal.rb +2 -2
- data/lib/sass/script/tree/node.rb +3 -3
- data/lib/sass/script/tree/operation.rb +16 -43
- data/lib/sass/script/tree/string_interpolation.rb +43 -64
- data/lib/sass/script/tree/variable.rb +1 -1
- data/lib/sass/script/value.rb +0 -2
- data/lib/sass/script/value/arg_list.rb +1 -1
- data/lib/sass/script/value/base.rb +9 -27
- data/lib/sass/script/value/color.rb +18 -26
- data/lib/sass/script/value/helpers.rb +18 -44
- data/lib/sass/script/value/list.rb +14 -35
- data/lib/sass/script/value/map.rb +2 -2
- data/lib/sass/script/value/number.rb +16 -26
- data/lib/sass/script/value/string.rb +1 -30
- data/lib/sass/scss.rb +2 -0
- data/lib/sass/scss/css_parser.rb +3 -7
- data/lib/sass/scss/parser.rb +78 -196
- data/lib/sass/scss/rx.rb +14 -7
- data/lib/sass/scss/script_lexer.rb +15 -0
- data/lib/sass/scss/script_parser.rb +25 -0
- data/lib/sass/scss/static_parser.rb +55 -38
- data/lib/sass/selector.rb +10 -7
- data/lib/sass/selector/abstract_sequence.rb +12 -15
- data/lib/sass/selector/comma_sequence.rb +6 -24
- data/lib/sass/selector/pseudo.rb +6 -19
- data/lib/sass/selector/sequence.rb +16 -14
- data/lib/sass/selector/simple.rb +7 -9
- data/lib/sass/selector/simple_sequence.rb +12 -16
- data/lib/sass/shared.rb +1 -1
- data/lib/sass/source/map.rb +9 -7
- data/lib/sass/source/position.rb +4 -4
- data/lib/sass/stack.rb +3 -23
- data/lib/sass/tree/charset_node.rb +1 -1
- data/lib/sass/tree/comment_node.rb +1 -1
- data/lib/sass/tree/function_node.rb +3 -2
- data/lib/sass/tree/node.rb +3 -5
- data/lib/sass/tree/prop_node.rb +58 -49
- data/lib/sass/tree/rule_node.rb +8 -15
- data/lib/sass/tree/visitors/check_nesting.rb +23 -19
- data/lib/sass/tree/visitors/convert.rb +13 -15
- data/lib/sass/tree/visitors/cssize.rb +15 -4
- data/lib/sass/tree/visitors/deep_copy.rb +2 -2
- data/lib/sass/tree/visitors/extend.rb +14 -10
- data/lib/sass/tree/visitors/perform.rb +18 -29
- data/lib/sass/tree/visitors/set_options.rb +2 -2
- data/lib/sass/tree/visitors/to_css.rb +47 -77
- data/lib/sass/util.rb +311 -98
- data/lib/sass/util/cross_platform_random.rb +19 -0
- data/lib/sass/util/multibyte_string_scanner.rb +133 -127
- data/lib/sass/util/normalized_map.rb +8 -1
- data/lib/sass/util/ordered_hash.rb +192 -0
- data/lib/sass/version.rb +6 -2
- data/test/sass/cache_test.rb +131 -0
- data/test/sass/callbacks_test.rb +61 -0
- data/test/sass/compiler_test.rb +236 -0
- data/test/sass/conversion_test.rb +2171 -0
- data/test/sass/css2sass_test.rb +526 -0
- data/test/sass/data/hsl-rgb.txt +319 -0
- data/test/sass/encoding_test.rb +219 -0
- data/test/sass/engine_test.rb +3400 -0
- data/test/sass/exec_test.rb +86 -0
- data/test/sass/extend_test.rb +1719 -0
- data/test/sass/fixtures/test_staleness_check_across_importers.css +1 -0
- data/test/sass/fixtures/test_staleness_check_across_importers.scss +1 -0
- data/test/sass/functions_test.rb +1984 -0
- data/test/sass/importer_test.rb +421 -0
- data/test/sass/logger_test.rb +58 -0
- data/test/sass/mock_importer.rb +49 -0
- data/test/sass/more_results/more1.css +9 -0
- data/test/sass/more_results/more1_with_line_comments.css +26 -0
- data/test/sass/more_results/more_import.css +29 -0
- data/test/sass/more_templates/_more_partial.sass +2 -0
- data/test/sass/more_templates/more1.sass +23 -0
- data/test/sass/more_templates/more_import.sass +11 -0
- data/test/sass/plugin_test.rb +556 -0
- data/test/sass/results/alt.css +4 -0
- data/test/sass/results/basic.css +9 -0
- data/test/sass/results/cached_import_option.css +3 -0
- data/test/sass/results/compact.css +5 -0
- data/test/sass/results/complex.css +86 -0
- data/test/sass/results/compressed.css +1 -0
- data/test/sass/results/expanded.css +19 -0
- data/test/sass/results/filename_fn.css +3 -0
- data/test/sass/results/if.css +3 -0
- data/test/sass/results/import.css +31 -0
- data/test/sass/results/import_charset.css +5 -0
- data/test/sass/results/import_charset_1_8.css +5 -0
- data/test/sass/results/import_charset_ibm866.css +5 -0
- data/test/sass/results/import_content.css +1 -0
- data/test/sass/results/line_numbers.css +49 -0
- data/test/sass/results/mixins.css +95 -0
- data/test/sass/results/multiline.css +24 -0
- data/test/sass/results/nested.css +22 -0
- data/test/sass/results/options.css +1 -0
- data/test/sass/results/parent_ref.css +13 -0
- data/test/sass/results/script.css +16 -0
- data/test/sass/results/scss_import.css +31 -0
- data/test/sass/results/scss_importee.css +2 -0
- data/test/sass/results/subdir/nested_subdir/nested_subdir.css +1 -0
- data/test/sass/results/subdir/subdir.css +3 -0
- data/test/sass/results/units.css +11 -0
- data/test/sass/results/warn.css +0 -0
- data/test/sass/results/warn_imported.css +0 -0
- data/test/sass/script_conversion_test.rb +306 -0
- data/test/sass/script_test.rb +1206 -0
- data/test/sass/scss/css_test.rb +1281 -0
- data/test/sass/scss/rx_test.rb +160 -0
- data/test/sass/scss/scss_test.rb +4147 -0
- data/test/sass/scss/test_helper.rb +37 -0
- data/test/sass/source_map_test.rb +1055 -0
- data/test/sass/superselector_test.rb +210 -0
- data/test/sass/templates/_cached_import_option_partial.scss +1 -0
- data/test/sass/templates/_double_import_loop2.sass +1 -0
- data/test/sass/templates/_filename_fn_import.scss +11 -0
- data/test/sass/templates/_imported_charset_ibm866.sass +4 -0
- data/test/sass/templates/_imported_charset_utf8.sass +4 -0
- data/test/sass/templates/_imported_content.sass +3 -0
- data/test/sass/templates/_partial.sass +2 -0
- data/test/sass/templates/_same_name_different_partiality.scss +1 -0
- data/test/sass/templates/alt.sass +16 -0
- data/test/sass/templates/basic.sass +23 -0
- data/test/sass/templates/bork1.sass +2 -0
- data/test/sass/templates/bork2.sass +2 -0
- data/test/sass/templates/bork3.sass +2 -0
- data/test/sass/templates/bork4.sass +2 -0
- data/test/sass/templates/bork5.sass +3 -0
- data/test/sass/templates/cached_import_option.scss +3 -0
- data/test/sass/templates/compact.sass +17 -0
- data/test/sass/templates/complex.sass +305 -0
- data/test/sass/templates/compressed.sass +15 -0
- data/test/sass/templates/double_import_loop1.sass +1 -0
- data/test/sass/templates/expanded.sass +17 -0
- data/test/sass/templates/filename_fn.scss +18 -0
- data/test/sass/templates/if.sass +11 -0
- data/test/sass/templates/import.sass +12 -0
- data/test/sass/templates/import_charset.sass +9 -0
- data/test/sass/templates/import_charset_1_8.sass +6 -0
- data/test/sass/templates/import_charset_ibm866.sass +11 -0
- data/test/sass/templates/import_content.sass +4 -0
- data/test/sass/templates/importee.less +2 -0
- data/test/sass/templates/importee.sass +19 -0
- data/test/sass/templates/line_numbers.sass +13 -0
- data/test/sass/templates/mixin_bork.sass +5 -0
- data/test/sass/templates/mixins.sass +76 -0
- data/test/sass/templates/multiline.sass +20 -0
- data/test/sass/templates/nested.sass +25 -0
- data/test/sass/templates/nested_bork1.sass +2 -0
- data/test/sass/templates/nested_bork2.sass +2 -0
- data/test/sass/templates/nested_bork3.sass +2 -0
- data/test/sass/templates/nested_bork4.sass +2 -0
- data/test/sass/templates/nested_import.sass +2 -0
- data/test/sass/templates/nested_mixin_bork.sass +6 -0
- data/test/sass/templates/options.sass +2 -0
- data/test/sass/templates/parent_ref.sass +25 -0
- data/test/sass/templates/same_name_different_ext.sass +2 -0
- data/test/sass/templates/same_name_different_ext.scss +1 -0
- data/test/sass/templates/same_name_different_partiality.scss +1 -0
- data/test/sass/templates/script.sass +101 -0
- data/test/sass/templates/scss_import.scss +12 -0
- data/test/sass/templates/scss_importee.scss +1 -0
- data/test/sass/templates/single_import_loop.sass +1 -0
- data/test/sass/templates/subdir/import_up1.scss +1 -0
- data/test/sass/templates/subdir/import_up2.scss +1 -0
- data/test/sass/templates/subdir/nested_subdir/_nested_partial.sass +2 -0
- data/test/sass/templates/subdir/nested_subdir/nested_subdir.sass +3 -0
- data/test/sass/templates/subdir/subdir.sass +6 -0
- data/test/sass/templates/units.sass +11 -0
- data/test/sass/templates/warn.sass +3 -0
- data/test/sass/templates/warn_imported.sass +4 -0
- data/test/sass/test_helper.rb +8 -0
- data/test/sass/util/multibyte_string_scanner_test.rb +147 -0
- data/test/sass/util/normalized_map_test.rb +51 -0
- data/test/sass/util/subset_map_test.rb +91 -0
- data/test/sass/util_test.rb +438 -0
- data/test/sass/value_helpers_test.rb +179 -0
- data/test/test_helper.rb +110 -0
- data/vendor/listen/CHANGELOG.md +1 -0
- data/vendor/listen/CONTRIBUTING.md +38 -0
- data/vendor/listen/Gemfile +20 -0
- data/vendor/listen/Guardfile +8 -0
- data/vendor/listen/LICENSE +20 -0
- data/vendor/listen/README.md +349 -0
- data/vendor/listen/Rakefile +5 -0
- data/vendor/listen/Vagrantfile +96 -0
- data/vendor/listen/lib/listen.rb +54 -0
- data/vendor/listen/lib/listen/adapter.rb +327 -0
- data/vendor/listen/lib/listen/adapters/bsd.rb +75 -0
- data/vendor/listen/lib/listen/adapters/darwin.rb +48 -0
- data/vendor/listen/lib/listen/adapters/linux.rb +81 -0
- data/vendor/listen/lib/listen/adapters/polling.rb +58 -0
- data/vendor/listen/lib/listen/adapters/windows.rb +91 -0
- data/vendor/listen/lib/listen/directory_record.rb +406 -0
- data/vendor/listen/lib/listen/listener.rb +323 -0
- data/vendor/listen/lib/listen/turnstile.rb +32 -0
- data/vendor/listen/lib/listen/version.rb +3 -0
- data/vendor/listen/listen.gemspec +28 -0
- data/vendor/listen/spec/listen/adapter_spec.rb +149 -0
- data/vendor/listen/spec/listen/adapters/bsd_spec.rb +36 -0
- data/vendor/listen/spec/listen/adapters/darwin_spec.rb +37 -0
- data/vendor/listen/spec/listen/adapters/linux_spec.rb +47 -0
- data/vendor/listen/spec/listen/adapters/polling_spec.rb +68 -0
- data/vendor/listen/spec/listen/adapters/windows_spec.rb +30 -0
- data/vendor/listen/spec/listen/directory_record_spec.rb +1250 -0
- data/vendor/listen/spec/listen/listener_spec.rb +258 -0
- data/vendor/listen/spec/listen/turnstile_spec.rb +56 -0
- data/vendor/listen/spec/listen_spec.rb +67 -0
- data/vendor/listen/spec/spec_helper.rb +25 -0
- data/vendor/listen/spec/support/adapter_helper.rb +666 -0
- data/vendor/listen/spec/support/directory_record_helper.rb +57 -0
- data/vendor/listen/spec/support/fixtures_helper.rb +29 -0
- data/vendor/listen/spec/support/listeners_helper.rb +179 -0
- data/vendor/listen/spec/support/platform_helper.rb +15 -0
- metadata +217 -76
- data/extra/sass-spec-ref.sh +0 -40
- data/lib/sass/deprecation.rb +0 -55
- data/lib/sass/logger/delayed.rb +0 -50
- data/lib/sass/script/value/callable.rb +0 -25
- data/lib/sass/script/value/function.rb +0 -19
@@ -26,8 +26,8 @@ module Sass
|
|
26
26
|
clear_callbacks!
|
27
27
|
end
|
28
28
|
|
29
|
-
# An options hash.
|
30
|
-
# documentation}.
|
29
|
+
# An options hash.
|
30
|
+
# See {file:SASS_REFERENCE.md#options the Sass options documentation}.
|
31
31
|
#
|
32
32
|
# @return [{Symbol => Object}]
|
33
33
|
def options
|
@@ -127,7 +127,7 @@ module Sass
|
|
127
127
|
|
128
128
|
def normalize_template_location!
|
129
129
|
options[:template_location] = convert_template_location(
|
130
|
-
|
130
|
+
options[:template_location], options[:css_location])
|
131
131
|
end
|
132
132
|
end
|
133
133
|
end
|
data/lib/sass/plugin/merb.rb
CHANGED
@@ -15,7 +15,7 @@ unless defined?(Sass::MERB_LOADED)
|
|
15
15
|
end
|
16
16
|
|
17
17
|
{
|
18
|
-
:always_update
|
18
|
+
:always_update => false,
|
19
19
|
:template_location => root + '/public/stylesheets/sass',
|
20
20
|
:css_location => root + '/public/stylesheets',
|
21
21
|
:cache_location => root + '/tmp/sass-cache',
|
data/lib/sass/plugin/rack.rb
CHANGED
@@ -9,19 +9,19 @@ module Sass
|
|
9
9
|
#
|
10
10
|
# ## Customize
|
11
11
|
#
|
12
|
-
# Sass::Plugin.options.merge
|
12
|
+
# Sass::Plugin.options.merge(
|
13
13
|
# :cache_location => './tmp/sass-cache',
|
14
14
|
# :never_update => environment != :production,
|
15
15
|
# :full_exception => environment != :production)
|
16
16
|
#
|
17
|
-
# {file:SASS_REFERENCE.md#
|
17
|
+
# {file:SASS_REFERENCE.md#options See the Reference for more options}.
|
18
18
|
#
|
19
19
|
# ## Use
|
20
20
|
#
|
21
21
|
# Put your Sass files in `public/stylesheets/sass`.
|
22
22
|
# Your CSS will be generated in `public/stylesheets`,
|
23
23
|
# and regenerated every request if necessary.
|
24
|
-
# The locations and frequency {file:SASS_REFERENCE.md#
|
24
|
+
# The locations and frequency {file:SASS_REFERENCE.md#options can be customized}.
|
25
25
|
# That's all there is to it!
|
26
26
|
class Rack
|
27
27
|
# The delay, in seconds, between update checks.
|
@@ -39,7 +39,7 @@ module Sass
|
|
39
39
|
# for checking the staleness of several stylesheets at once.
|
40
40
|
#
|
41
41
|
# @param options [{Symbol => Object}]
|
42
|
-
# See {file:SASS_REFERENCE.md#
|
42
|
+
# See {file:SASS_REFERENCE.md#options the Sass options documentation}.
|
43
43
|
def initialize(options)
|
44
44
|
# URIs that are being actively checked for staleness. Protects against
|
45
45
|
# import loops.
|
@@ -72,7 +72,7 @@ module Sass
|
|
72
72
|
# Returns whether a Sass or SCSS stylesheet has been modified since a given time.
|
73
73
|
#
|
74
74
|
# @param template_file [String] The location of the Sass or SCSS template.
|
75
|
-
# @param mtime [
|
75
|
+
# @param mtime [Fixnum] The modification time to check against.
|
76
76
|
# @param importer [Sass::Importers::Base] The importer used to locate the stylesheet.
|
77
77
|
# Defaults to the filesystem importer.
|
78
78
|
# @return [Boolean] Whether the stylesheet has been modified.
|
@@ -103,7 +103,7 @@ module Sass
|
|
103
103
|
# so it's better to use when checking multiple stylesheets at once.
|
104
104
|
#
|
105
105
|
# @param template_file [String] The location of the Sass or SCSS template.
|
106
|
-
# @param mtime [
|
106
|
+
# @param mtime [Fixnum] The modification time to check against.
|
107
107
|
# @param importer [Sass::Importers::Base] The importer used to locate the stylesheet.
|
108
108
|
# Defaults to the filesystem importer.
|
109
109
|
# @return [Boolean] Whether the stylesheet has been modified.
|
data/lib/sass/railtie.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
# Rails 3.0.0.beta.2+, < 3.1
|
2
|
-
if defined?(ActiveSupport) &&
|
2
|
+
if defined?(ActiveSupport) && Sass::Util.has?(:public_method, ActiveSupport, :on_load) &&
|
3
3
|
!Sass::Util.ap_geq?('3.1.0.beta')
|
4
4
|
require 'sass/plugin/configuration'
|
5
5
|
ActiveSupport.on_load(:before_configuration) do
|
data/lib/sass/script.rb
CHANGED
@@ -16,12 +16,12 @@ module Sass
|
|
16
16
|
# Parses a string of SassScript
|
17
17
|
#
|
18
18
|
# @param value [String] The SassScript
|
19
|
-
# @param line [
|
19
|
+
# @param line [Fixnum] The number of the line on which the SassScript appeared.
|
20
20
|
# Used for error reporting
|
21
|
-
# @param offset [
|
21
|
+
# @param offset [Fixnum] The number of characters in on `line` that the SassScript started.
|
22
22
|
# Used for error reporting
|
23
23
|
# @param options [{Symbol => Object}] An options hash;
|
24
|
-
# see {file:SASS_REFERENCE.md#
|
24
|
+
# see {file:SASS_REFERENCE.md#options the Sass options documentation}
|
25
25
|
# @return [Script::Tree::Node] The root node of the parse tree
|
26
26
|
def self.parse(value, line, offset, options = {})
|
27
27
|
Parser.parse(value, line, offset, options)
|
@@ -19,15 +19,25 @@ module Sass
|
|
19
19
|
def string
|
20
20
|
tok = try_tok(:string)
|
21
21
|
return number unless tok
|
22
|
-
|
23
|
-
|
22
|
+
unless @lexer.peek && @lexer.peek.type == :begin_interpolation
|
23
|
+
return literal_node(tok.value, tok.source_range)
|
24
|
+
end
|
24
25
|
end
|
25
26
|
|
26
|
-
|
27
|
-
|
28
|
-
|
27
|
+
def ident
|
28
|
+
return funcall unless @lexer.peek && @lexer.peek.type == :ident
|
29
|
+
return if @stop_at && @stop_at.include?(@lexer.peek.value)
|
30
|
+
|
31
|
+
name = @lexer.next
|
32
|
+
if (color = Sass::Script::Value::Color::COLOR_NAMES[name.value.downcase])
|
33
|
+
literal_node(Sass::Script::Value::Color.new(color, name.value), name.source_range)
|
34
|
+
else
|
35
|
+
literal_node(Sass::Script::Value::String.new(name.value, :identifier), name.source_range)
|
36
|
+
end
|
29
37
|
end
|
30
38
|
|
39
|
+
# Short-circuit all the SassScript-only productions
|
40
|
+
alias_method :interpolation, :space
|
31
41
|
alias_method :or_expr, :div
|
32
42
|
alias_method :unary_div, :ident
|
33
43
|
alias_method :paren, :string
|
@@ -1,7 +1,9 @@
|
|
1
1
|
require 'sass/script/value/helpers'
|
2
2
|
|
3
3
|
module Sass::Script
|
4
|
+
# @comment
|
4
5
|
# YARD can't handle some multiline tags, and we need really long tags for function declarations.
|
6
|
+
# rubocop:disable LineLength
|
5
7
|
# Methods in this module are accessible from the SassScript context.
|
6
8
|
# For example, you can write
|
7
9
|
#
|
@@ -174,7 +176,7 @@ module Sass::Script
|
|
174
176
|
# \{#set-nth set-nth($list, $n, $value)}
|
175
177
|
# : Replaces the nth item in a list.
|
176
178
|
#
|
177
|
-
# \{#join join($list1, $list2, \[$separator
|
179
|
+
# \{#join join($list1, $list2, \[$separator\])}
|
178
180
|
# : Joins together two lists into one.
|
179
181
|
#
|
180
182
|
# \{#append append($list1, $val, \[$separator\])}
|
@@ -189,9 +191,6 @@ module Sass::Script
|
|
189
191
|
# \{#list_separator list-separator($list)}
|
190
192
|
# : Returns the separator of a list.
|
191
193
|
#
|
192
|
-
# \{#is_bracketed is-bracketed($list)}
|
193
|
-
# : Returns whether a list has square brackets.
|
194
|
-
#
|
195
194
|
# ## Map Functions {#map-functions}
|
196
195
|
#
|
197
196
|
# Maps in Sass are immutable; all map functions return a new map rather than
|
@@ -277,9 +276,6 @@ module Sass::Script
|
|
277
276
|
# \{#mixin_exists mixin-exists($name)}
|
278
277
|
# : Returns whether a mixin with the given name exists.
|
279
278
|
#
|
280
|
-
# \{#content_exists content-exists()}
|
281
|
-
# : Returns whether the current mixin was passed a content block.
|
282
|
-
#
|
283
279
|
# \{#inspect inspect($value)}
|
284
280
|
# : Returns the string representation of a value as it would be represented in Sass.
|
285
281
|
#
|
@@ -295,12 +291,8 @@ module Sass::Script
|
|
295
291
|
# \{#comparable comparable($number1, $number2)}
|
296
292
|
# : Returns whether two numbers can be added, subtracted, or compared.
|
297
293
|
#
|
298
|
-
# \{#call call($
|
299
|
-
# : Dynamically calls a Sass function
|
300
|
-
#
|
301
|
-
# \{#get_function get-function($name, $css: false)}
|
302
|
-
# : Looks up a function with the given name in the current lexical scope
|
303
|
-
# and returns a reference to it.
|
294
|
+
# \{#call call($name, $args...)}
|
295
|
+
# : Dynamically calls a Sass function.
|
304
296
|
#
|
305
297
|
# ## Miscellaneous Functions
|
306
298
|
#
|
@@ -362,6 +354,8 @@ module Sass::Script
|
|
362
354
|
# representation) on those objects without first setting {Tree::Node#options=
|
363
355
|
# the #options attribute}.
|
364
356
|
#
|
357
|
+
# @comment
|
358
|
+
# rubocop:enable LineLength
|
365
359
|
module Functions
|
366
360
|
@signatures = {}
|
367
361
|
|
@@ -436,8 +430,8 @@ module Sass::Script
|
|
436
430
|
# If no signatures match, the first signature is returned for error messaging.
|
437
431
|
#
|
438
432
|
# @param method_name [Symbol] The name of the Ruby function to be called.
|
439
|
-
# @param arg_arity [
|
440
|
-
# @param kwarg_arity [
|
433
|
+
# @param arg_arity [Fixnum] The number of unnamed arguments the function was passed.
|
434
|
+
# @param kwarg_arity [Fixnum] The number of keyword arguments the function was passed.
|
441
435
|
#
|
442
436
|
# @return [{Symbol => Object}, nil]
|
443
437
|
# The signature options for the matching signature,
|
@@ -460,8 +454,8 @@ module Sass::Script
|
|
460
454
|
t_arg_arity = sig_arity
|
461
455
|
end
|
462
456
|
|
463
|
-
if
|
464
|
-
(t_kwarg_arity == 0
|
457
|
+
if (t_arg_arity == sig_arity || t_arg_arity > sig_arity && signature.var_args) &&
|
458
|
+
(t_kwarg_arity == 0 || t_kwarg_arity > 0 && signature.var_kwargs)
|
465
459
|
return signature
|
466
460
|
end
|
467
461
|
end
|
@@ -476,14 +470,14 @@ module Sass::Script
|
|
476
470
|
# @param seed [Integer]
|
477
471
|
# @return [Integer] The same seed.
|
478
472
|
def self.random_seed=(seed)
|
479
|
-
@random_number_generator =
|
473
|
+
@random_number_generator = Sass::Util::CrossPlatformRandom.new(seed)
|
480
474
|
end
|
481
475
|
|
482
476
|
# Get Sass's internal random number generator.
|
483
477
|
#
|
484
478
|
# @return [Random]
|
485
479
|
def self.random_number_generator
|
486
|
-
@random_number_generator ||=
|
480
|
+
@random_number_generator ||= Sass::Util::CrossPlatformRandom.new
|
487
481
|
end
|
488
482
|
|
489
483
|
# The context in which methods in {Script::Functions} are evaluated.
|
@@ -527,28 +521,15 @@ module Sass::Script
|
|
527
521
|
# assert_type value, :String
|
528
522
|
# assert_type value, :Number
|
529
523
|
# @param value [Sass::Script::Value::Base] A SassScript value
|
530
|
-
# @param type [Symbol
|
524
|
+
# @param type [Symbol] The name of the type the value is expected to be
|
531
525
|
# @param name [String, Symbol, nil] The name of the argument.
|
532
526
|
# @raise [ArgumentError] if value is not of the correct type.
|
533
527
|
def assert_type(value, type, name = nil)
|
534
|
-
|
535
|
-
|
536
|
-
|
537
|
-
|
538
|
-
|
539
|
-
|
540
|
-
if found_type
|
541
|
-
value.check_deprecated_interp if found_type == :String
|
542
|
-
return
|
543
|
-
end
|
544
|
-
|
545
|
-
err = if valid_types.size == 1
|
546
|
-
"#{value.inspect} is not a #{TYPE_NAMES[type] || type.to_s.downcase}"
|
547
|
-
else
|
548
|
-
type_names = valid_types.map {|t| TYPE_NAMES[t] || t.to_s.downcase}
|
549
|
-
"#{value.inspect} is not any of #{type_names.join(', ')}"
|
550
|
-
end
|
551
|
-
err = "$#{name.to_s.tr('_', '-')}: " + err if name
|
528
|
+
klass = Sass::Script::Value.const_get(type)
|
529
|
+
return if value.is_a?(klass)
|
530
|
+
return if value.is_a?(Sass::Script::Value::List) && type == :Map && value.value.empty?
|
531
|
+
err = "#{value.inspect} is not a #{TYPE_NAMES[type] || type.to_s.downcase}"
|
532
|
+
err = "$#{name.to_s.gsub('_', '-')}: " + err if name
|
552
533
|
raise ArgumentError.new(err)
|
553
534
|
end
|
554
535
|
|
@@ -648,27 +629,23 @@ module Sass::Script
|
|
648
629
|
# inclusive
|
649
630
|
# @return [Sass::Script::Value::Color]
|
650
631
|
# @raise [ArgumentError] if any parameter is the wrong type or out of bounds
|
651
|
-
def rgb(red, green
|
652
|
-
if green
|
653
|
-
return unquoted_string("rgb(#{red})") if var?(red)
|
654
|
-
raise ArgumentError.new("wrong number of arguments (1 for 3)")
|
655
|
-
elsif blue.nil?
|
656
|
-
return unquoted_string("rgb(#{red}, #{green})") if var?(red) || var?(green)
|
657
|
-
raise ArgumentError.new("wrong number of arguments (2 for 3)")
|
658
|
-
end
|
659
|
-
|
660
|
-
if special_number?(red) || special_number?(green) || special_number?(blue)
|
632
|
+
def rgb(red, green, blue)
|
633
|
+
if calc?(red) || calc?(green) || calc?(blue)
|
661
634
|
return unquoted_string("rgb(#{red}, #{green}, #{blue})")
|
662
635
|
end
|
663
636
|
assert_type red, :Number, :red
|
664
637
|
assert_type green, :Number, :green
|
665
638
|
assert_type blue, :Number, :blue
|
666
639
|
|
667
|
-
color_attrs = [
|
668
|
-
|
669
|
-
|
670
|
-
|
671
|
-
|
640
|
+
color_attrs = [[red, :red], [green, :green], [blue, :blue]].map do |(c, name)|
|
641
|
+
if c.is_unit?("%")
|
642
|
+
c.value * 255 / 100.0
|
643
|
+
elsif c.unitless?
|
644
|
+
c.value
|
645
|
+
else
|
646
|
+
raise ArgumentError.new("Expected #{c} to be unitless or have a unit of % but got #{c}")
|
647
|
+
end
|
648
|
+
end
|
672
649
|
|
673
650
|
# Don't store the string representation for function-created colors, both
|
674
651
|
# because it's not very useful and because some functions aren't supported
|
@@ -676,8 +653,6 @@ module Sass::Script
|
|
676
653
|
Sass::Script::Value::Color.new(color_attrs)
|
677
654
|
end
|
678
655
|
declare :rgb, [:red, :green, :blue]
|
679
|
-
declare :rgb, [:red, :green]
|
680
|
-
declare :rgb, [:red]
|
681
656
|
|
682
657
|
# Creates a {Sass::Script::Value::Color Color} from red, green, blue, and
|
683
658
|
# alpha values.
|
@@ -712,39 +687,20 @@ module Sass::Script
|
|
712
687
|
# is the wrong type
|
713
688
|
def rgba(*args)
|
714
689
|
case args.size
|
715
|
-
when 1
|
716
|
-
return unquoted_string("rgba(#{args.first})") if var?(args.first)
|
717
|
-
raise ArgumentError.new("wrong number of arguments (1 for 4)")
|
718
690
|
when 2
|
719
691
|
color, alpha = args
|
720
692
|
|
721
|
-
if var?(color)
|
722
|
-
return unquoted_string("rgba(#{color}, #{alpha})")
|
723
|
-
elsif var?(alpha)
|
724
|
-
if color.is_a?(Sass::Script::Value::Color)
|
725
|
-
return unquoted_string("rgba(#{color.red}, #{color.green}, #{color.blue}, #{alpha})")
|
726
|
-
else
|
727
|
-
return unquoted_string("rgba(#{color}, #{alpha})")
|
728
|
-
end
|
729
|
-
end
|
730
|
-
|
731
693
|
assert_type color, :Color, :color
|
732
|
-
if
|
694
|
+
if calc?(alpha)
|
733
695
|
unquoted_string("rgba(#{color.red}, #{color.green}, #{color.blue}, #{alpha})")
|
734
696
|
else
|
735
697
|
assert_type alpha, :Number, :alpha
|
736
|
-
|
737
|
-
|
738
|
-
when 3
|
739
|
-
if var?(args[0]) || var?(args[1]) || var?(args[2])
|
740
|
-
unquoted_string("rgba(#{args.join(', ')})")
|
741
|
-
else
|
742
|
-
raise ArgumentError.new("wrong number of arguments (3 for 4)")
|
698
|
+
check_alpha_unit alpha, 'rgba'
|
699
|
+
color.with(:alpha => alpha.value)
|
743
700
|
end
|
744
701
|
when 4
|
745
702
|
red, green, blue, alpha = args
|
746
|
-
if
|
747
|
-
special_number?(blue) || special_number?(alpha)
|
703
|
+
if calc?(red) || calc?(green) || calc?(blue) || calc?(alpha)
|
748
704
|
unquoted_string("rgba(#{red}, #{green}, #{blue}, #{alpha})")
|
749
705
|
else
|
750
706
|
rgba(rgb(red, green, blue), alpha)
|
@@ -754,9 +710,7 @@ module Sass::Script
|
|
754
710
|
end
|
755
711
|
end
|
756
712
|
declare :rgba, [:red, :green, :blue, :alpha]
|
757
|
-
declare :rgba, [:red, :green, :blue]
|
758
713
|
declare :rgba, [:color, :alpha]
|
759
|
-
declare :rgba, [:red]
|
760
714
|
|
761
715
|
# Creates a {Sass::Script::Value::Color Color} from hue, saturation, and
|
762
716
|
# lightness values. Uses the algorithm from the [CSS3 spec][].
|
@@ -774,24 +728,14 @@ module Sass::Script
|
|
774
728
|
# @return [Sass::Script::Value::Color]
|
775
729
|
# @raise [ArgumentError] if `$saturation` or `$lightness` are out of bounds
|
776
730
|
# or any parameter is the wrong type
|
777
|
-
def hsl(hue, saturation
|
778
|
-
if saturation
|
779
|
-
return unquoted_string("hsl(#{hue})") if var?(hue)
|
780
|
-
raise ArgumentError.new("wrong number of arguments (1 for 3)")
|
781
|
-
elsif lightness.nil?
|
782
|
-
return unquoted_string("hsl(#{hue}, #{saturation})") if var?(hue) || var?(saturation)
|
783
|
-
raise ArgumentError.new("wrong number of arguments (2 for 3)")
|
784
|
-
end
|
785
|
-
|
786
|
-
if special_number?(hue) || special_number?(saturation) || special_number?(lightness)
|
731
|
+
def hsl(hue, saturation, lightness)
|
732
|
+
if calc?(hue) || calc?(saturation) || calc?(lightness)
|
787
733
|
unquoted_string("hsl(#{hue}, #{saturation}, #{lightness})")
|
788
734
|
else
|
789
735
|
hsla(hue, saturation, lightness, number(1))
|
790
736
|
end
|
791
737
|
end
|
792
738
|
declare :hsl, [:hue, :saturation, :lightness]
|
793
|
-
declare :hsl, [:hue, :saturation]
|
794
|
-
declare :hsl, [:hue]
|
795
739
|
|
796
740
|
# Creates a {Sass::Script::Value::Color Color} from hue,
|
797
741
|
# saturation, lightness, and alpha values. Uses the algorithm from
|
@@ -812,29 +756,15 @@ module Sass::Script
|
|
812
756
|
# @return [Sass::Script::Value::Color]
|
813
757
|
# @raise [ArgumentError] if `$saturation`, `$lightness`, or `$alpha` are out
|
814
758
|
# of bounds or any parameter is the wrong type
|
815
|
-
def hsla(hue, saturation
|
816
|
-
if saturation
|
817
|
-
return unquoted_string("hsla(#{hue})") if var?(hue)
|
818
|
-
raise ArgumentError.new("wrong number of arguments (1 for 4)")
|
819
|
-
elsif lightness.nil?
|
820
|
-
return unquoted_string("hsla(#{hue}, #{saturation})") if var?(hue) || var?(saturation)
|
821
|
-
raise ArgumentError.new("wrong number of arguments (2 for 4)")
|
822
|
-
elsif alpha.nil?
|
823
|
-
if var?(hue) || var?(saturation) || var?(lightness)
|
824
|
-
return unquoted_string("hsla(#{hue}, #{saturation}, #{lightness})")
|
825
|
-
else
|
826
|
-
raise ArgumentError.new("wrong number of arguments (2 for 4)")
|
827
|
-
end
|
828
|
-
end
|
829
|
-
|
830
|
-
if special_number?(hue) || special_number?(saturation) ||
|
831
|
-
special_number?(lightness) || special_number?(alpha)
|
759
|
+
def hsla(hue, saturation, lightness, alpha)
|
760
|
+
if calc?(hue) || calc?(saturation) || calc?(lightness) || calc?(alpha)
|
832
761
|
return unquoted_string("hsla(#{hue}, #{saturation}, #{lightness}, #{alpha})")
|
833
762
|
end
|
834
763
|
assert_type hue, :Number, :hue
|
835
764
|
assert_type saturation, :Number, :saturation
|
836
765
|
assert_type lightness, :Number, :lightness
|
837
766
|
assert_type alpha, :Number, :alpha
|
767
|
+
check_alpha_unit alpha, 'hsla'
|
838
768
|
|
839
769
|
h = hue.value
|
840
770
|
s = saturation.value
|
@@ -844,13 +774,9 @@ module Sass::Script
|
|
844
774
|
# because it's not very useful and because some functions aren't supported
|
845
775
|
# on older browsers.
|
846
776
|
Sass::Script::Value::Color.new(
|
847
|
-
:hue => h, :saturation => s, :lightness => l,
|
848
|
-
:alpha => percentage_or_unitless(alpha, 1, "alpha"))
|
777
|
+
:hue => h, :saturation => s, :lightness => l, :alpha => alpha.value)
|
849
778
|
end
|
850
779
|
declare :hsla, [:hue, :saturation, :lightness, :alpha]
|
851
|
-
declare :hsla, [:hue, :saturation, :lightness]
|
852
|
-
declare :hsla, [:hue, :saturation]
|
853
|
-
declare :hsla, [:hue]
|
854
780
|
|
855
781
|
# Gets the red component of a color. Calculated from HSL where necessary via
|
856
782
|
# [this algorithm][hsl-to-rgb].
|
@@ -970,7 +896,7 @@ module Sass::Script
|
|
970
896
|
a.value =~ /^[a-zA-Z]+\s*=/
|
971
897
|
end
|
972
898
|
# Support the proprietary MS alpha() function
|
973
|
-
return identifier("alpha(#{args.map {|a| a.to_s}.join(
|
899
|
+
return identifier("alpha(#{args.map {|a| a.to_s}.join(", ")})")
|
974
900
|
end
|
975
901
|
|
976
902
|
raise ArgumentError.new("wrong number of arguments (#{args.size} for 1)") if args.size != 1
|
@@ -1172,7 +1098,11 @@ module Sass::Script
|
|
1172
1098
|
# adjust-color(#102030, $blue: 5) => #102035
|
1173
1099
|
# adjust-color(#102030, $red: -5, $blue: 5) => #0b2035
|
1174
1100
|
# adjust-color(hsl(25, 100%, 80%), $lightness: -30%, $alpha: -0.4) => hsla(25, 100%, 50%, 0.6)
|
1101
|
+
# @comment
|
1102
|
+
# rubocop:disable LineLength
|
1175
1103
|
# @overload adjust_color($color, [$red], [$green], [$blue], [$hue], [$saturation], [$lightness], [$alpha])
|
1104
|
+
# @comment
|
1105
|
+
# rubocop:disable LineLength
|
1176
1106
|
# @param $color [Sass::Script::Value::Color]
|
1177
1107
|
# @param $red [Sass::Script::Value::Number] The adjustment to make on the
|
1178
1108
|
# red component, between -255 and 255 inclusive
|
@@ -1195,14 +1125,15 @@ module Sass::Script
|
|
1195
1125
|
def adjust_color(color, kwargs)
|
1196
1126
|
assert_type color, :Color, :color
|
1197
1127
|
with = Sass::Util.map_hash(
|
1198
|
-
|
1199
|
-
|
1200
|
-
|
1201
|
-
|
1202
|
-
|
1203
|
-
|
1204
|
-
|
1205
|
-
|
1128
|
+
"red" => [-255..255, ""],
|
1129
|
+
"green" => [-255..255, ""],
|
1130
|
+
"blue" => [-255..255, ""],
|
1131
|
+
"hue" => nil,
|
1132
|
+
"saturation" => [-100..100, "%"],
|
1133
|
+
"lightness" => [-100..100, "%"],
|
1134
|
+
"alpha" => [-1..1, ""]
|
1135
|
+
) do |name, (range, units)|
|
1136
|
+
|
1206
1137
|
val = kwargs.delete(name)
|
1207
1138
|
next unless val
|
1208
1139
|
assert_type val, :Number, name
|
@@ -1248,7 +1179,11 @@ module Sass::Script
|
|
1248
1179
|
# scale-color(hsl(120, 70%, 80%), $lightness: 50%) => hsl(120, 70%, 90%)
|
1249
1180
|
# scale-color(rgb(200, 150%, 170%), $green: -40%, $blue: 70%) => rgb(200, 90, 229)
|
1250
1181
|
# scale-color(hsl(200, 70%, 80%), $saturation: -90%, $alpha: -30%) => hsla(200, 7%, 80%, 0.7)
|
1182
|
+
# @comment
|
1183
|
+
# rubocop:disable LineLength
|
1251
1184
|
# @overload scale_color($color, [$red], [$green], [$blue], [$saturation], [$lightness], [$alpha])
|
1185
|
+
# @comment
|
1186
|
+
# rubocop:disable LineLength
|
1252
1187
|
# @param $color [Sass::Script::Value::Color]
|
1253
1188
|
# @param $red [Sass::Script::Value::Number]
|
1254
1189
|
# @param $green [Sass::Script::Value::Number]
|
@@ -1263,13 +1198,14 @@ module Sass::Script
|
|
1263
1198
|
def scale_color(color, kwargs)
|
1264
1199
|
assert_type color, :Color, :color
|
1265
1200
|
with = Sass::Util.map_hash(
|
1266
|
-
|
1267
|
-
|
1268
|
-
|
1269
|
-
|
1270
|
-
|
1271
|
-
|
1272
|
-
|
1201
|
+
"red" => 255,
|
1202
|
+
"green" => 255,
|
1203
|
+
"blue" => 255,
|
1204
|
+
"saturation" => 100,
|
1205
|
+
"lightness" => 100,
|
1206
|
+
"alpha" => 1
|
1207
|
+
) do |name, max|
|
1208
|
+
|
1273
1209
|
val = kwargs.delete(name)
|
1274
1210
|
next unless val
|
1275
1211
|
assert_type val, :Number, name
|
@@ -1304,7 +1240,11 @@ module Sass::Script
|
|
1304
1240
|
# change-color(#102030, $blue: 5) => #102005
|
1305
1241
|
# change-color(#102030, $red: 120, $blue: 5) => #782005
|
1306
1242
|
# change-color(hsl(25, 100%, 80%), $lightness: 40%, $alpha: 0.8) => hsla(25, 100%, 40%, 0.8)
|
1243
|
+
# @comment
|
1244
|
+
# rubocop:disable LineLength
|
1307
1245
|
# @overload change_color($color, [$red], [$green], [$blue], [$hue], [$saturation], [$lightness], [$alpha])
|
1246
|
+
# @comment
|
1247
|
+
# rubocop:disable LineLength
|
1308
1248
|
# @param $color [Sass::Script::Value::Color]
|
1309
1249
|
# @param $red [Sass::Script::Value::Number] The new red component for the
|
1310
1250
|
# color, within 0 and 255 inclusive
|
@@ -1374,7 +1314,7 @@ module Sass::Script
|
|
1374
1314
|
# @param $color1 [Sass::Script::Value::Color]
|
1375
1315
|
# @param $color2 [Sass::Script::Value::Color]
|
1376
1316
|
# @param $weight [Sass::Script::Value::Number] The relative weight of each
|
1377
|
-
# color. Closer to `
|
1317
|
+
# color. Closer to `0%` gives more weight to `$color1`, closer to `100%`
|
1378
1318
|
# gives more weight to `$color2`
|
1379
1319
|
# @return [Sass::Script::Value::Color]
|
1380
1320
|
# @raise [ArgumentError] if `$weight` is out of bounds or any parameter is
|
@@ -1490,11 +1430,13 @@ module Sass::Script
|
|
1490
1430
|
def unquote(string)
|
1491
1431
|
unless string.is_a?(Sass::Script::Value::String)
|
1492
1432
|
# Don't warn multiple times for the same source line.
|
1433
|
+
# rubocop:disable GlobalVars
|
1493
1434
|
$_sass_warned_for_unquote ||= Set.new
|
1494
1435
|
frame = environment.stack.frames.last
|
1495
1436
|
key = [frame.filename, frame.line] if frame
|
1496
1437
|
return string if frame && $_sass_warned_for_unquote.include?(key)
|
1497
1438
|
$_sass_warned_for_unquote << key if frame
|
1439
|
+
# rubocop:enable GlobalVars
|
1498
1440
|
|
1499
1441
|
Sass::Util.sass_warn(<<MESSAGE.strip)
|
1500
1442
|
DEPRECATION WARNING: Passing #{string.to_sass}, a non-string value, to unquote()
|
@@ -1504,7 +1446,6 @@ MESSAGE
|
|
1504
1446
|
return string
|
1505
1447
|
end
|
1506
1448
|
|
1507
|
-
string.check_deprecated_interp
|
1508
1449
|
return string if string.type == :identifier
|
1509
1450
|
identifier(string.value)
|
1510
1451
|
end
|
@@ -1621,7 +1562,7 @@ MESSAGE
|
|
1621
1562
|
# @param $start-at [Sass::Script::Value::Number] The index of the first
|
1622
1563
|
# character of the substring. If this is negative, it counts from the end
|
1623
1564
|
# of `$string`
|
1624
|
-
# @param $end-
|
1565
|
+
# @param $end-before [Sass::Script::Value::Number] The index of the last
|
1625
1566
|
# character of the substring. If this is negative, it counts from the end
|
1626
1567
|
# of `$string`. Defaults to -1
|
1627
1568
|
# @return [Sass::Script::Value::String] The substring. This will be quoted
|
@@ -1640,7 +1581,7 @@ MESSAGE
|
|
1640
1581
|
s = string.value.length + s if s < 0
|
1641
1582
|
s = 0 if s < 0
|
1642
1583
|
e = string.value.length + e if e < 0
|
1643
|
-
|
1584
|
+
e = 0 if s < 0
|
1644
1585
|
extracted = string.value.slice(s..e)
|
1645
1586
|
Sass::Script::Value::String.new(extracted || "", string.type)
|
1646
1587
|
end
|
@@ -1658,7 +1599,7 @@ MESSAGE
|
|
1658
1599
|
# @raise [ArgumentError] if `$string` isn't a string
|
1659
1600
|
def to_upper_case(string)
|
1660
1601
|
assert_type string, :String, :string
|
1661
|
-
Sass::Script::Value::String.new(
|
1602
|
+
Sass::Script::Value::String.new(string.value.upcase, string.type)
|
1662
1603
|
end
|
1663
1604
|
declare :to_upper_case, [:string]
|
1664
1605
|
|
@@ -1673,7 +1614,7 @@ MESSAGE
|
|
1673
1614
|
# @raise [ArgumentError] if `$string` isn't a string
|
1674
1615
|
def to_lower_case(string)
|
1675
1616
|
assert_type string, :String, :string
|
1676
|
-
Sass::Script::Value::String.new(
|
1617
|
+
Sass::Script::Value::String.new(string.value.downcase, string.type)
|
1677
1618
|
end
|
1678
1619
|
declare :to_lower_case, [:string]
|
1679
1620
|
|
@@ -1686,17 +1627,11 @@ MESSAGE
|
|
1686
1627
|
# type-of(true) => bool
|
1687
1628
|
# type-of(#fff) => color
|
1688
1629
|
# type-of(blue) => color
|
1689
|
-
# type-of(null) => null
|
1690
|
-
# type-of(a b c) => list
|
1691
|
-
# type-of((a: 1, b: 2)) => map
|
1692
|
-
# type-of(get-function("foo")) => function
|
1693
|
-
#
|
1694
1630
|
# @overload type_of($value)
|
1695
1631
|
# @param $value [Sass::Script::Value::Base] The value to inspect
|
1696
1632
|
# @return [Sass::Script::Value::String] The unquoted string name of the
|
1697
1633
|
# value's type
|
1698
1634
|
def type_of(value)
|
1699
|
-
value.check_deprecated_interp if value.is_a?(Sass::Script::Value::String)
|
1700
1635
|
identifier(value.class.name.gsub(/Sass::Script::Value::/, '').downcase)
|
1701
1636
|
end
|
1702
1637
|
declare :type_of, [:value]
|
@@ -1718,12 +1653,6 @@ MESSAGE
|
|
1718
1653
|
#
|
1719
1654
|
# * `at-error` indicates that the Sass `@error` directive is supported.
|
1720
1655
|
#
|
1721
|
-
# * `custom-property` indicates that the [Custom Properties Level 1][] spec
|
1722
|
-
# is supported. This means that custom properties are parsed statically,
|
1723
|
-
# with only interpolation treated as SassScript.
|
1724
|
-
#
|
1725
|
-
# [Custom Properties Level 1]: https://www.w3.org/TR/css-variables-1/
|
1726
|
-
#
|
1727
1656
|
# @example
|
1728
1657
|
# feature-exists(some-feature-that-exists) => true
|
1729
1658
|
# feature-exists(what-is-this-i-dont-know) => false
|
@@ -1738,55 +1667,6 @@ MESSAGE
|
|
1738
1667
|
end
|
1739
1668
|
declare :feature_exists, [:feature]
|
1740
1669
|
|
1741
|
-
# Returns a reference to a function for later invocation with the `call()` function.
|
1742
|
-
#
|
1743
|
-
# If `$css` is `false`, the function reference may refer to a function
|
1744
|
-
# defined in your stylesheet or built-in to the host environment. If it's
|
1745
|
-
# `true` it will refer to a plain-CSS function.
|
1746
|
-
#
|
1747
|
-
# @example
|
1748
|
-
# get-function("rgb")
|
1749
|
-
#
|
1750
|
-
# @function myfunc { @return "something"; }
|
1751
|
-
# get-function("myfunc")
|
1752
|
-
#
|
1753
|
-
# @overload get_function($name, $css: false)
|
1754
|
-
# @param name [Sass::Script::Value::String] The name of the function being referenced.
|
1755
|
-
# @param css [Sass::Script::Value::Bool] Whether to get a plain CSS function.
|
1756
|
-
#
|
1757
|
-
# @return [Sass::Script::Value::Function] A function reference.
|
1758
|
-
def get_function(name, kwargs = {})
|
1759
|
-
assert_type name, :String, :name
|
1760
|
-
|
1761
|
-
css = if kwargs.has_key?("css")
|
1762
|
-
v = kwargs.delete("css")
|
1763
|
-
assert_type v, :Bool, :css
|
1764
|
-
v.value
|
1765
|
-
else
|
1766
|
-
false
|
1767
|
-
end
|
1768
|
-
|
1769
|
-
if kwargs.any?
|
1770
|
-
raise ArgumentError.new("Illegal keyword argument '#{kwargs.keys.first}'")
|
1771
|
-
end
|
1772
|
-
|
1773
|
-
if css
|
1774
|
-
return Sass::Script::Value::Function.new(
|
1775
|
-
Sass::Callable.new(name.value, nil, nil, nil, nil, nil, "function", :css))
|
1776
|
-
end
|
1777
|
-
|
1778
|
-
callable = environment.caller.function(name.value) ||
|
1779
|
-
(Sass::Script::Functions.callable?(name.value.tr("-", "_")) &&
|
1780
|
-
Sass::Callable.new(name.value, nil, nil, nil, nil, nil, "function", :builtin))
|
1781
|
-
|
1782
|
-
if callable
|
1783
|
-
Sass::Script::Value::Function.new(callable)
|
1784
|
-
else
|
1785
|
-
raise Sass::SyntaxError.new("Function not found: #{name}")
|
1786
|
-
end
|
1787
|
-
end
|
1788
|
-
declare :get_function, [:name], :var_kwargs => true
|
1789
|
-
|
1790
1670
|
# Returns the unit(s) associated with a number. Complex units are sorted in
|
1791
1671
|
# alphabetical order by numerator and denominator.
|
1792
1672
|
#
|
@@ -1989,7 +1869,7 @@ MESSAGE
|
|
1989
1869
|
index = n.to_i > 0 ? n.to_i - 1 : n.to_i
|
1990
1870
|
new_list = list.to_a.dup
|
1991
1871
|
new_list[index] = value
|
1992
|
-
|
1872
|
+
Sass::Script::Value::List.new(new_list, list.separator)
|
1993
1873
|
end
|
1994
1874
|
declare :set_nth, [:list, :n, :value]
|
1995
1875
|
|
@@ -2030,9 +1910,6 @@ MESSAGE
|
|
2030
1910
|
# list. If both lists have fewer than two items, spaces are used for the
|
2031
1911
|
# resulting list.
|
2032
1912
|
#
|
2033
|
-
# Unless `$bracketed` is passed, the resulting list is bracketed if the
|
2034
|
-
# first parameter is.
|
2035
|
-
#
|
2036
1913
|
# Like all list functions, `join()` returns a new list rather than modifying
|
2037
1914
|
# its arguments in place.
|
2038
1915
|
#
|
@@ -2042,70 +1919,27 @@ MESSAGE
|
|
2042
1919
|
# join(10px, 20px) => 10px 20px
|
2043
1920
|
# join(10px, 20px, comma) => 10px, 20px
|
2044
1921
|
# join((blue, red), (#abc, #def), space) => blue red #abc #def
|
2045
|
-
#
|
2046
|
-
# @overload join($list1, $list2, $separator: auto, $bracketed: auto)
|
1922
|
+
# @overload join($list1, $list2, $separator: auto)
|
2047
1923
|
# @param $list1 [Sass::Script::Value::Base]
|
2048
1924
|
# @param $list2 [Sass::Script::Value::Base]
|
2049
1925
|
# @param $separator [Sass::Script::Value::String] The list separator to use.
|
2050
1926
|
# If this is `comma` or `space`, that separator will be used. If this is
|
2051
1927
|
# `auto` (the default), the separator is determined as explained above.
|
2052
|
-
# @param $bracketed [Sass::Script::Value::Base] Whether the resulting list
|
2053
|
-
# will be bracketed. If this is `auto` (the default), the separator is
|
2054
|
-
# determined as explained above.
|
2055
1928
|
# @return [Sass::Script::Value::List]
|
2056
|
-
def join(list1, list2,
|
2057
|
-
separator = identifier("auto"), bracketed = identifier("auto"),
|
2058
|
-
kwargs = nil, *rest)
|
2059
|
-
if separator.is_a?(Hash)
|
2060
|
-
kwargs = separator
|
2061
|
-
separator = identifier("auto")
|
2062
|
-
elsif bracketed.is_a?(Hash)
|
2063
|
-
kwargs = bracketed
|
2064
|
-
bracketed = identifier("auto")
|
2065
|
-
elsif rest.last.is_a?(Hash)
|
2066
|
-
rest.unshift kwargs
|
2067
|
-
kwargs = rest.pop
|
2068
|
-
end
|
2069
|
-
|
2070
|
-
unless rest.empty?
|
2071
|
-
# Add 4 to rest.length because we don't want to count the kwargs hash,
|
2072
|
-
# which is always passed.
|
2073
|
-
raise ArgumentError.new("wrong number of arguments (#{rest.length + 4} for 2..4)")
|
2074
|
-
end
|
2075
|
-
|
2076
|
-
if kwargs
|
2077
|
-
separator = kwargs.delete("separator") || separator
|
2078
|
-
bracketed = kwargs.delete("bracketed") || bracketed
|
2079
|
-
|
2080
|
-
unless kwargs.empty?
|
2081
|
-
name, val = kwargs.to_a.first
|
2082
|
-
raise ArgumentError.new("Unknown argument $#{name} (#{val})")
|
2083
|
-
end
|
2084
|
-
end
|
2085
|
-
|
1929
|
+
def join(list1, list2, separator = identifier("auto"))
|
2086
1930
|
assert_type separator, :String, :separator
|
2087
|
-
unless %w
|
1931
|
+
unless %w[auto space comma].include?(separator.value)
|
2088
1932
|
raise ArgumentError.new("Separator name must be space, comma, or auto")
|
2089
1933
|
end
|
2090
|
-
|
2091
|
-
|
2092
|
-
|
2093
|
-
|
2094
|
-
|
2095
|
-
|
2096
|
-
separator.value.to_sym
|
2097
|
-
end,
|
2098
|
-
bracketed:
|
2099
|
-
if bracketed.is_a?(Sass::Script::Value::String) && bracketed.value == 'auto'
|
2100
|
-
list1.bracketed
|
2101
|
-
else
|
2102
|
-
bracketed.to_bool
|
2103
|
-
end)
|
1934
|
+
sep = if separator.value == 'auto'
|
1935
|
+
list1.separator || list2.separator || :space
|
1936
|
+
else
|
1937
|
+
separator.value.to_sym
|
1938
|
+
end
|
1939
|
+
list(list1.to_a + list2.to_a, sep)
|
2104
1940
|
end
|
2105
|
-
|
2106
|
-
|
2107
|
-
# without complaining about the other missing.
|
2108
|
-
declare :join, [:list1, :list2], :var_args => true, :var_kwargs => true
|
1941
|
+
declare :join, [:list1, :list2]
|
1942
|
+
declare :join, [:list1, :list2, :separator]
|
2109
1943
|
|
2110
1944
|
# Appends a single value onto the end of a list.
|
2111
1945
|
#
|
@@ -2130,16 +1964,15 @@ MESSAGE
|
|
2130
1964
|
# @return [Sass::Script::Value::List]
|
2131
1965
|
def append(list, val, separator = identifier("auto"))
|
2132
1966
|
assert_type separator, :String, :separator
|
2133
|
-
unless %w
|
1967
|
+
unless %w[auto space comma].include?(separator.value)
|
2134
1968
|
raise ArgumentError.new("Separator name must be space, comma, or auto")
|
2135
1969
|
end
|
2136
|
-
|
2137
|
-
|
2138
|
-
|
2139
|
-
|
2140
|
-
|
2141
|
-
|
2142
|
-
end)
|
1970
|
+
sep = if separator.value == 'auto'
|
1971
|
+
list.separator || :space
|
1972
|
+
else
|
1973
|
+
separator.value.to_sym
|
1974
|
+
end
|
1975
|
+
list(list.to_a + [val], sep)
|
2143
1976
|
end
|
2144
1977
|
declare :append, [:list, :val]
|
2145
1978
|
declare :append, [:list, :val, :separator]
|
@@ -2209,20 +2042,7 @@ MESSAGE
|
|
2209
2042
|
def list_separator(list)
|
2210
2043
|
identifier((list.separator || :space).to_s)
|
2211
2044
|
end
|
2212
|
-
declare :
|
2213
|
-
|
2214
|
-
# Returns whether a list uses square brackets.
|
2215
|
-
#
|
2216
|
-
# @example
|
2217
|
-
# is-bracketed(1px 2px 3px) => false
|
2218
|
-
# is-bracketed([1px, 2px, 3px]) => true
|
2219
|
-
# @overload is_bracketed($list)
|
2220
|
-
# @param $list [Sass::Script::Value::Base]
|
2221
|
-
# @return [Sass::Script::Value::Bool]
|
2222
|
-
def is_bracketed(list)
|
2223
|
-
bool(list.bracketed)
|
2224
|
-
end
|
2225
|
-
declare :is_bracketed, [:list]
|
2045
|
+
declare :separator, [:list]
|
2226
2046
|
|
2227
2047
|
# Returns the value in a map associated with the given key. If the map
|
2228
2048
|
# doesn't have such a key, returns `null`.
|
@@ -2408,24 +2228,10 @@ MESSAGE
|
|
2408
2228
|
# $fn: nth;
|
2409
2229
|
# call($fn, (a b c), 2) => b
|
2410
2230
|
#
|
2411
|
-
# @overload call($
|
2412
|
-
# @param $
|
2231
|
+
# @overload call($name, $args...)
|
2232
|
+
# @param $name [String] The name of the function to call.
|
2413
2233
|
def call(name, *args)
|
2414
|
-
|
2415
|
-
name.is_a?(Sass::Script::Value::Function)
|
2416
|
-
assert_type name, :Function, :function
|
2417
|
-
end
|
2418
|
-
if name.is_a?(Sass::Script::Value::String)
|
2419
|
-
name = if function_exists(name).to_bool
|
2420
|
-
get_function(name)
|
2421
|
-
else
|
2422
|
-
get_function(name, "css" => bool(true))
|
2423
|
-
end
|
2424
|
-
Sass::Util.sass_warn(<<WARNING)
|
2425
|
-
DEPRECATION WARNING: Passing a string to call() is deprecated and will be illegal
|
2426
|
-
in Sass 4.0. Use call(#{name.to_sass}) instead.
|
2427
|
-
WARNING
|
2428
|
-
end
|
2234
|
+
assert_type name, :String, :name
|
2429
2235
|
kwargs = args.last.is_a?(Hash) ? args.pop : {}
|
2430
2236
|
funcall = Sass::Script::Tree::Funcall.new(
|
2431
2237
|
name.value,
|
@@ -2433,8 +2239,6 @@ WARNING
|
|
2433
2239
|
Sass::Util.map_vals(kwargs) {|v| Sass::Script::Tree::Literal.new(v)},
|
2434
2240
|
nil,
|
2435
2241
|
nil)
|
2436
|
-
funcall.line = environment.stack.frames.last.line
|
2437
|
-
funcall.filename = environment.stack.frames.last.filename
|
2438
2242
|
funcall.options = options
|
2439
2243
|
perform(funcall)
|
2440
2244
|
end
|
@@ -2474,7 +2278,6 @@ WARNING
|
|
2474
2278
|
# @example
|
2475
2279
|
# $a-false-value: false;
|
2476
2280
|
# variable-exists(a-false-value) => true
|
2477
|
-
# variable-exists(a-null-value) => true
|
2478
2281
|
#
|
2479
2282
|
# variable-exists(nonexistent) => false
|
2480
2283
|
#
|
@@ -2495,7 +2298,6 @@ WARNING
|
|
2495
2298
|
# @example
|
2496
2299
|
# $a-false-value: false;
|
2497
2300
|
# global-variable-exists(a-false-value) => true
|
2498
|
-
# global-variable-exists(a-null-value) => true
|
2499
2301
|
#
|
2500
2302
|
# .foo {
|
2501
2303
|
# $some-var: false;
|
@@ -2523,12 +2325,12 @@ WARNING
|
|
2523
2325
|
#
|
2524
2326
|
# @overload function_exists($name)
|
2525
2327
|
# @param name [Sass::Script::Value::String] The name of the function to
|
2526
|
-
# check
|
2328
|
+
# check.
|
2527
2329
|
# @return [Sass::Script::Value::Bool] Whether the function is defined.
|
2528
2330
|
def function_exists(name)
|
2529
2331
|
assert_type name, :String, :name
|
2530
2332
|
exists = Sass::Script::Functions.callable?(name.value.tr("-", "_"))
|
2531
|
-
exists ||= environment.
|
2333
|
+
exists ||= environment.function(name.value)
|
2532
2334
|
bool(exists)
|
2533
2335
|
end
|
2534
2336
|
declare :function_exists, [:name]
|
@@ -2551,31 +2353,6 @@ WARNING
|
|
2551
2353
|
end
|
2552
2354
|
declare :mixin_exists, [:name]
|
2553
2355
|
|
2554
|
-
# Check whether a mixin was passed a content block.
|
2555
|
-
#
|
2556
|
-
# Unless `content-exists()` is called directly from a mixin, an error will be raised.
|
2557
|
-
#
|
2558
|
-
# @example
|
2559
|
-
# @mixin needs-content {
|
2560
|
-
# @if not content-exists() {
|
2561
|
-
# @error "You must pass a content block!"
|
2562
|
-
# }
|
2563
|
-
# @content;
|
2564
|
-
# }
|
2565
|
-
#
|
2566
|
-
# @overload content_exists()
|
2567
|
-
# @return [Sass::Script::Value::Bool] Whether a content block was passed to the mixin.
|
2568
|
-
def content_exists
|
2569
|
-
# frames.last is the stack frame for this function,
|
2570
|
-
# so we use frames[-2] to get the frame before that.
|
2571
|
-
mixin_frame = environment.stack.frames[-2]
|
2572
|
-
unless mixin_frame && mixin_frame.type == :mixin
|
2573
|
-
raise Sass::SyntaxError.new("Cannot call content-exists() except within a mixin.")
|
2574
|
-
end
|
2575
|
-
bool(!environment.caller.content.nil?)
|
2576
|
-
end
|
2577
|
-
declare :content_exists, []
|
2578
|
-
|
2579
2356
|
# Return a string containing the value as its Sass representation.
|
2580
2357
|
#
|
2581
2358
|
# @overload inspect($value)
|
@@ -2583,7 +2360,6 @@ WARNING
|
|
2583
2360
|
# @return [Sass::Script::Value::String] A representation of the value as
|
2584
2361
|
# it would be written in Sass.
|
2585
2362
|
def inspect(value)
|
2586
|
-
value.check_deprecated_interp if value.is_a?(Sass::Script::Value::String)
|
2587
2363
|
unquoted_string(value.to_sass)
|
2588
2364
|
end
|
2589
2365
|
declare :inspect, [:value]
|
@@ -2657,7 +2433,7 @@ WARNING
|
|
2657
2433
|
end
|
2658
2434
|
|
2659
2435
|
parsed = [parse_selector(selectors.first, :selectors)]
|
2660
|
-
parsed += selectors[1..-1].map {|sel| parse_selector(sel, :selectors,
|
2436
|
+
parsed += selectors[1..-1].map {|sel| parse_selector(sel, :selectors, !!:parse_parent_ref)}
|
2661
2437
|
parsed.inject {|result, child| child.resolve_parent_refs(result)}.to_sass_script
|
2662
2438
|
end
|
2663
2439
|
declare :selector_nest, [], :var_args => true
|
@@ -2745,7 +2521,7 @@ WARNING
|
|
2745
2521
|
|
2746
2522
|
extends = Sass::Util::SubsetMap.new
|
2747
2523
|
begin
|
2748
|
-
extender.populate_extends(extends, extendee
|
2524
|
+
extender.populate_extends(extends, extendee)
|
2749
2525
|
selector.do_extend(extends).to_sass_script
|
2750
2526
|
rescue Sass::SyntaxError => e
|
2751
2527
|
raise ArgumentError.new(e.to_s)
|
@@ -2788,8 +2564,8 @@ WARNING
|
|
2788
2564
|
|
2789
2565
|
extends = Sass::Util::SubsetMap.new
|
2790
2566
|
begin
|
2791
|
-
replacement.populate_extends(extends, original
|
2792
|
-
selector.do_extend(extends, [],
|
2567
|
+
replacement.populate_extends(extends, original)
|
2568
|
+
selector.do_extend(extends, [], !!:replace).to_sass_script
|
2793
2569
|
rescue Sass::SyntaxError => e
|
2794
2570
|
raise ArgumentError.new(e.to_s)
|
2795
2571
|
end
|
@@ -2898,7 +2674,10 @@ WARNING
|
|
2898
2674
|
yield(value.value), value.numerator_units, value.denominator_units)
|
2899
2675
|
end
|
2900
2676
|
|
2677
|
+
# @comment
|
2678
|
+
# rubocop:disable ParameterLists
|
2901
2679
|
def _adjust(color, amount, attr, range, op, units = "")
|
2680
|
+
# rubocop:enable ParameterLists
|
2902
2681
|
assert_type color, :Color, :color
|
2903
2682
|
assert_type amount, :Number, :amount
|
2904
2683
|
Sass::Util.check_range('Amount', range, amount, units)
|
@@ -2906,14 +2685,19 @@ WARNING
|
|
2906
2685
|
color.with(attr => color.send(attr).send(op, amount.value))
|
2907
2686
|
end
|
2908
2687
|
|
2909
|
-
def
|
2910
|
-
if
|
2911
|
-
|
2912
|
-
|
2913
|
-
|
2688
|
+
def check_alpha_unit(alpha, function)
|
2689
|
+
return if alpha.unitless?
|
2690
|
+
|
2691
|
+
if alpha.is_unit?("%")
|
2692
|
+
Sass::Util.sass_warn(<<WARNING)
|
2693
|
+
DEPRECATION WARNING: Passing a percentage as the alpha value to #{function}() will be
|
2694
|
+
interpreted differently in future versions of Sass. For now, use #{alpha.value} instead.
|
2695
|
+
WARNING
|
2914
2696
|
else
|
2915
|
-
|
2916
|
-
|
2697
|
+
Sass::Util.sass_warn(<<WARNING)
|
2698
|
+
DEPRECATION WARNING: Passing a number with units as the alpha value to #{function}() is
|
2699
|
+
deprecated and will be an error in future versions of Sass. Use #{alpha.value} instead.
|
2700
|
+
WARNING
|
2917
2701
|
end
|
2918
2702
|
end
|
2919
2703
|
end
|