sass 3.4.25 → 3.7.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CODE_OF_CONDUCT.md +1 -1
- data/CONTRIBUTING.md +3 -3
- data/README.md +17 -9
- data/VERSION +1 -1
- data/VERSION_DATE +1 -1
- data/VERSION_NAME +1 -1
- data/extra/sass-spec-ref.sh +9 -1
- data/lib/sass.rb +0 -7
- data/lib/sass/cache_stores/filesystem.rb +1 -1
- data/lib/sass/css.rb +1 -2
- data/lib/sass/engine.rb +39 -29
- data/lib/sass/environment.rb +26 -5
- data/lib/sass/error.rb +2 -2
- data/lib/sass/exec/base.rb +2 -13
- data/lib/sass/exec/sass_scss.rb +1 -5
- data/lib/sass/features.rb +1 -0
- data/lib/sass/importers/filesystem.rb +6 -4
- data/lib/sass/logger/base.rb +11 -0
- data/lib/sass/plugin/compiler.rb +20 -50
- data/lib/sass/plugin/configuration.rb +2 -2
- data/lib/sass/railtie.rb +1 -1
- data/lib/sass/script/css_parser.rb +4 -1
- data/lib/sass/script/functions.rb +308 -81
- data/lib/sass/script/lexer.rb +63 -9
- data/lib/sass/script/parser.rb +287 -118
- data/lib/sass/script/tree/funcall.rb +35 -34
- data/lib/sass/script/tree/interpolation.rb +0 -3
- data/lib/sass/script/tree/list_literal.rb +23 -8
- data/lib/sass/script/tree/map_literal.rb +2 -2
- data/lib/sass/script/tree/node.rb +0 -8
- data/lib/sass/script/tree/operation.rb +1 -8
- data/lib/sass/script/value.rb +2 -0
- data/lib/sass/script/value/arg_list.rb +1 -1
- data/lib/sass/script/value/base.rb +17 -0
- data/lib/sass/script/value/callable.rb +25 -0
- data/lib/sass/script/value/color.rb +8 -2
- data/lib/sass/script/value/function.rb +19 -0
- data/lib/sass/script/value/helpers.rb +37 -11
- data/lib/sass/script/value/list.rb +35 -14
- data/lib/sass/script/value/map.rb +2 -2
- data/lib/sass/script/value/number.rb +3 -2
- data/lib/sass/scss/css_parser.rb +6 -1
- data/lib/sass/scss/parser.rb +145 -56
- data/lib/sass/scss/rx.rb +5 -11
- data/lib/sass/scss/static_parser.rb +20 -42
- data/lib/sass/selector.rb +4 -0
- data/lib/sass/selector/abstract_sequence.rb +7 -6
- data/lib/sass/selector/comma_sequence.rb +9 -5
- data/lib/sass/selector/pseudo.rb +20 -3
- data/lib/sass/selector/sequence.rb +35 -10
- data/lib/sass/selector/simple.rb +9 -2
- data/lib/sass/selector/simple_sequence.rb +8 -4
- data/lib/sass/source/map.rb +2 -6
- data/lib/sass/stack.rb +21 -1
- data/lib/sass/tree/charset_node.rb +1 -1
- data/lib/sass/tree/prop_node.rb +45 -53
- data/lib/sass/tree/rule_node.rb +6 -8
- data/lib/sass/tree/visitors/check_nesting.rb +1 -1
- data/lib/sass/tree/visitors/convert.rb +2 -3
- data/lib/sass/tree/visitors/cssize.rb +4 -15
- data/lib/sass/tree/visitors/deep_copy.rb +1 -1
- data/lib/sass/tree/visitors/extend.rb +2 -8
- data/lib/sass/tree/visitors/perform.rb +23 -15
- data/lib/sass/tree/visitors/set_options.rb +1 -1
- data/lib/sass/tree/visitors/to_css.rb +49 -22
- data/lib/sass/util.rb +72 -310
- data/lib/sass/util/multibyte_string_scanner.rb +127 -131
- data/lib/sass/util/normalized_map.rb +1 -8
- data/lib/sass/version.rb +0 -4
- metadata +55 -202
- data/Rakefile +0 -453
- data/lib/sass/script/css_variable_warning.rb +0 -52
- data/lib/sass/util/cross_platform_random.rb +0 -19
- data/lib/sass/util/ordered_hash.rb +0 -192
- data/test/sass-spec.yml +0 -3
- data/test/sass/cache_test.rb +0 -131
- data/test/sass/callbacks_test.rb +0 -61
- data/test/sass/compiler_test.rb +0 -236
- data/test/sass/conversion_test.rb +0 -2188
- data/test/sass/css2sass_test.rb +0 -526
- data/test/sass/css_variable_test.rb +0 -132
- data/test/sass/data/hsl-rgb.txt +0 -319
- data/test/sass/encoding_test.rb +0 -219
- data/test/sass/engine_test.rb +0 -3447
- data/test/sass/exec_test.rb +0 -96
- data/test/sass/extend_test.rb +0 -1733
- data/test/sass/fixtures/test_staleness_check_across_importers.css +0 -1
- data/test/sass/fixtures/test_staleness_check_across_importers.scss +0 -1
- data/test/sass/functions_test.rb +0 -1977
- data/test/sass/importer_test.rb +0 -421
- data/test/sass/logger_test.rb +0 -58
- data/test/sass/mock_importer.rb +0 -49
- data/test/sass/more_results/more1.css +0 -9
- data/test/sass/more_results/more1_with_line_comments.css +0 -26
- data/test/sass/more_results/more_import.css +0 -29
- data/test/sass/more_templates/_more_partial.sass +0 -2
- data/test/sass/more_templates/more1.sass +0 -23
- data/test/sass/more_templates/more_import.sass +0 -11
- data/test/sass/plugin_test.rb +0 -556
- data/test/sass/results/alt.css +0 -4
- data/test/sass/results/basic.css +0 -9
- data/test/sass/results/cached_import_option.css +0 -3
- data/test/sass/results/compact.css +0 -5
- data/test/sass/results/complex.css +0 -86
- data/test/sass/results/compressed.css +0 -1
- data/test/sass/results/expanded.css +0 -19
- data/test/sass/results/filename_fn.css +0 -3
- data/test/sass/results/if.css +0 -3
- data/test/sass/results/import.css +0 -31
- data/test/sass/results/import_charset.css +0 -5
- data/test/sass/results/import_charset_1_8.css +0 -5
- data/test/sass/results/import_charset_ibm866.css +0 -5
- data/test/sass/results/import_content.css +0 -1
- data/test/sass/results/line_numbers.css +0 -49
- data/test/sass/results/mixins.css +0 -95
- data/test/sass/results/multiline.css +0 -24
- data/test/sass/results/nested.css +0 -22
- data/test/sass/results/options.css +0 -1
- data/test/sass/results/parent_ref.css +0 -13
- data/test/sass/results/script.css +0 -16
- data/test/sass/results/scss_import.css +0 -31
- data/test/sass/results/scss_importee.css +0 -2
- data/test/sass/results/subdir/nested_subdir/nested_subdir.css +0 -1
- data/test/sass/results/subdir/subdir.css +0 -3
- data/test/sass/results/units.css +0 -11
- data/test/sass/results/warn.css +0 -0
- data/test/sass/results/warn_imported.css +0 -0
- data/test/sass/script_conversion_test.rb +0 -357
- data/test/sass/script_test.rb +0 -1431
- data/test/sass/scss/css_test.rb +0 -1281
- data/test/sass/scss/rx_test.rb +0 -160
- data/test/sass/scss/scss_test.rb +0 -4205
- data/test/sass/scss/test_helper.rb +0 -37
- data/test/sass/source_map_test.rb +0 -1055
- data/test/sass/superselector_test.rb +0 -210
- data/test/sass/templates/_cached_import_option_partial.scss +0 -1
- data/test/sass/templates/_double_import_loop2.sass +0 -1
- data/test/sass/templates/_filename_fn_import.scss +0 -11
- data/test/sass/templates/_imported_charset_ibm866.sass +0 -4
- data/test/sass/templates/_imported_charset_utf8.sass +0 -4
- data/test/sass/templates/_imported_content.sass +0 -3
- data/test/sass/templates/_partial.sass +0 -2
- data/test/sass/templates/_same_name_different_partiality.scss +0 -1
- data/test/sass/templates/alt.sass +0 -16
- data/test/sass/templates/basic.sass +0 -23
- data/test/sass/templates/bork1.sass +0 -2
- data/test/sass/templates/bork2.sass +0 -2
- data/test/sass/templates/bork3.sass +0 -2
- data/test/sass/templates/bork4.sass +0 -2
- data/test/sass/templates/bork5.sass +0 -3
- data/test/sass/templates/cached_import_option.scss +0 -3
- data/test/sass/templates/compact.sass +0 -17
- data/test/sass/templates/complex.sass +0 -305
- data/test/sass/templates/compressed.sass +0 -15
- data/test/sass/templates/double_import_loop1.sass +0 -1
- data/test/sass/templates/expanded.sass +0 -17
- data/test/sass/templates/filename_fn.scss +0 -18
- data/test/sass/templates/if.sass +0 -11
- data/test/sass/templates/import.sass +0 -12
- data/test/sass/templates/import_charset.sass +0 -9
- data/test/sass/templates/import_charset_1_8.sass +0 -6
- data/test/sass/templates/import_charset_ibm866.sass +0 -11
- data/test/sass/templates/import_content.sass +0 -4
- data/test/sass/templates/importee.less +0 -2
- data/test/sass/templates/importee.sass +0 -19
- data/test/sass/templates/line_numbers.sass +0 -13
- data/test/sass/templates/mixin_bork.sass +0 -5
- data/test/sass/templates/mixins.sass +0 -76
- data/test/sass/templates/multiline.sass +0 -20
- data/test/sass/templates/nested.sass +0 -25
- data/test/sass/templates/nested_bork1.sass +0 -2
- data/test/sass/templates/nested_bork2.sass +0 -2
- data/test/sass/templates/nested_bork3.sass +0 -2
- data/test/sass/templates/nested_bork4.sass +0 -2
- data/test/sass/templates/nested_import.sass +0 -2
- data/test/sass/templates/nested_mixin_bork.sass +0 -6
- data/test/sass/templates/options.sass +0 -2
- data/test/sass/templates/parent_ref.sass +0 -25
- data/test/sass/templates/same_name_different_ext.sass +0 -2
- data/test/sass/templates/same_name_different_ext.scss +0 -1
- data/test/sass/templates/same_name_different_partiality.scss +0 -1
- data/test/sass/templates/script.sass +0 -101
- data/test/sass/templates/scss_import.scss +0 -12
- data/test/sass/templates/scss_importee.scss +0 -1
- data/test/sass/templates/single_import_loop.sass +0 -1
- data/test/sass/templates/subdir/import_up1.scss +0 -1
- data/test/sass/templates/subdir/import_up2.scss +0 -1
- data/test/sass/templates/subdir/nested_subdir/_nested_partial.sass +0 -2
- data/test/sass/templates/subdir/nested_subdir/nested_subdir.sass +0 -3
- data/test/sass/templates/subdir/subdir.sass +0 -6
- data/test/sass/templates/units.sass +0 -11
- data/test/sass/templates/warn.sass +0 -3
- data/test/sass/templates/warn_imported.sass +0 -4
- data/test/sass/test_helper.rb +0 -8
- data/test/sass/util/multibyte_string_scanner_test.rb +0 -155
- data/test/sass/util/normalized_map_test.rb +0 -51
- data/test/sass/util/subset_map_test.rb +0 -91
- data/test/sass/util_test.rb +0 -438
- data/test/sass/value_helpers_test.rb +0 -179
- data/test/test_helper.rb +0 -110
- data/vendor/listen/CHANGELOG.md +0 -1
- data/vendor/listen/CONTRIBUTING.md +0 -38
- data/vendor/listen/Gemfile +0 -20
- data/vendor/listen/Guardfile +0 -8
- data/vendor/listen/LICENSE +0 -20
- data/vendor/listen/README.md +0 -349
- data/vendor/listen/Rakefile +0 -5
- data/vendor/listen/Vagrantfile +0 -96
- data/vendor/listen/lib/listen.rb +0 -54
- data/vendor/listen/lib/listen/adapter.rb +0 -327
- data/vendor/listen/lib/listen/adapters/bsd.rb +0 -75
- data/vendor/listen/lib/listen/adapters/darwin.rb +0 -48
- data/vendor/listen/lib/listen/adapters/linux.rb +0 -81
- data/vendor/listen/lib/listen/adapters/polling.rb +0 -58
- data/vendor/listen/lib/listen/adapters/windows.rb +0 -91
- data/vendor/listen/lib/listen/directory_record.rb +0 -406
- data/vendor/listen/lib/listen/listener.rb +0 -323
- data/vendor/listen/lib/listen/turnstile.rb +0 -32
- data/vendor/listen/lib/listen/version.rb +0 -3
- data/vendor/listen/listen.gemspec +0 -28
- data/vendor/listen/spec/listen/adapter_spec.rb +0 -149
- data/vendor/listen/spec/listen/adapters/bsd_spec.rb +0 -36
- data/vendor/listen/spec/listen/adapters/darwin_spec.rb +0 -37
- data/vendor/listen/spec/listen/adapters/linux_spec.rb +0 -47
- data/vendor/listen/spec/listen/adapters/polling_spec.rb +0 -68
- data/vendor/listen/spec/listen/adapters/windows_spec.rb +0 -30
- data/vendor/listen/spec/listen/directory_record_spec.rb +0 -1250
- data/vendor/listen/spec/listen/listener_spec.rb +0 -258
- data/vendor/listen/spec/listen/turnstile_spec.rb +0 -56
- data/vendor/listen/spec/listen_spec.rb +0 -67
- data/vendor/listen/spec/spec_helper.rb +0 -25
- data/vendor/listen/spec/support/adapter_helper.rb +0 -666
- data/vendor/listen/spec/support/directory_record_helper.rb +0 -57
- data/vendor/listen/spec/support/fixtures_helper.rb +0 -29
- data/vendor/listen/spec/support/listeners_helper.rb +0 -179
- data/vendor/listen/spec/support/platform_helper.rb +0 -15
|
@@ -13,6 +13,11 @@ module Sass::Script::Tree
|
|
|
13
13
|
# @return [String]
|
|
14
14
|
attr_reader :name
|
|
15
15
|
|
|
16
|
+
# The callable to be invoked
|
|
17
|
+
#
|
|
18
|
+
# @return [Sass::Callable] or nil if no callable is provided.
|
|
19
|
+
attr_reader :callable
|
|
20
|
+
|
|
16
21
|
# The arguments to the function.
|
|
17
22
|
#
|
|
18
23
|
# @return [Array<Node>]
|
|
@@ -39,13 +44,19 @@ module Sass::Script::Tree
|
|
|
39
44
|
# @return [Node?]
|
|
40
45
|
attr_accessor :kwarg_splat
|
|
41
46
|
|
|
42
|
-
# @param
|
|
47
|
+
# @param name_or_callable [String, Sass::Callable] See \{#name}
|
|
43
48
|
# @param args [Array<Node>] See \{#args}
|
|
44
49
|
# @param keywords [Sass::Util::NormalizedMap<Node>] See \{#keywords}
|
|
45
50
|
# @param splat [Node] See \{#splat}
|
|
46
51
|
# @param kwarg_splat [Node] See \{#kwarg_splat}
|
|
47
|
-
def initialize(
|
|
48
|
-
|
|
52
|
+
def initialize(name_or_callable, args, keywords, splat, kwarg_splat)
|
|
53
|
+
if name_or_callable.is_a?(Sass::Callable)
|
|
54
|
+
@callable = name_or_callable
|
|
55
|
+
@name = name_or_callable.name
|
|
56
|
+
else
|
|
57
|
+
@callable = nil
|
|
58
|
+
@name = name_or_callable
|
|
59
|
+
end
|
|
49
60
|
@args = args
|
|
50
61
|
@keywords = keywords
|
|
51
62
|
@splat = splat
|
|
@@ -56,15 +67,12 @@ module Sass::Script::Tree
|
|
|
56
67
|
# @return [String] A string representation of the function call
|
|
57
68
|
def inspect
|
|
58
69
|
args = @args.map {|a| a.inspect}.join(', ')
|
|
59
|
-
keywords =
|
|
60
|
-
map {|k, v| "$#{k}: #{v.inspect}"}.join(', ')
|
|
61
|
-
# rubocop:disable RedundantSelf
|
|
70
|
+
keywords = @keywords.as_stored.to_a.map {|k, v| "$#{k}: #{v.inspect}"}.join(', ')
|
|
62
71
|
if self.splat
|
|
63
72
|
splat = args.empty? && keywords.empty? ? "" : ", "
|
|
64
73
|
splat = "#{splat}#{self.splat.inspect}..."
|
|
65
74
|
splat = "#{splat}, #{kwarg_splat.inspect}..." if kwarg_splat
|
|
66
75
|
end
|
|
67
|
-
# rubocop:enable RedundantSelf
|
|
68
76
|
"#{name}(#{args}#{', ' unless args.empty? || keywords.empty?}#{keywords}#{splat})"
|
|
69
77
|
end
|
|
70
78
|
|
|
@@ -77,15 +85,12 @@ module Sass::Script::Tree
|
|
|
77
85
|
end
|
|
78
86
|
|
|
79
87
|
args = @args.map(&arg_to_sass)
|
|
80
|
-
keywords =
|
|
81
|
-
map {|k, v| "$#{dasherize(k, opts)}: #{arg_to_sass[v]}"}
|
|
88
|
+
keywords = @keywords.as_stored.to_a.map {|k, v| "$#{dasherize(k, opts)}: #{arg_to_sass[v]}"}
|
|
82
89
|
|
|
83
|
-
# rubocop:disable RedundantSelf
|
|
84
90
|
if self.splat
|
|
85
91
|
splat = "#{arg_to_sass[self.splat]}..."
|
|
86
92
|
kwarg_splat = "#{arg_to_sass[self.kwarg_splat]}..." if self.kwarg_splat
|
|
87
93
|
end
|
|
88
|
-
# rubocop:enable RedundantSelf
|
|
89
94
|
|
|
90
95
|
arglist = [args, splat, keywords, kwarg_splat].flatten.compact.join(', ')
|
|
91
96
|
"#{dasherize(name, opts)}(#{arglist})"
|
|
@@ -120,27 +125,31 @@ module Sass::Script::Tree
|
|
|
120
125
|
# @return [Sass::Script::Value] The SassScript object that is the value of the function call
|
|
121
126
|
# @raise [Sass::SyntaxError] if the function call raises an ArgumentError
|
|
122
127
|
def _perform(environment)
|
|
123
|
-
args =
|
|
128
|
+
args = @args.each_with_index.
|
|
124
129
|
map {|a, i| perform_arg(a, environment, signature && signature.args[i])}
|
|
125
130
|
keywords = Sass::Util.map_hash(@keywords) do |k, v|
|
|
126
131
|
[k, perform_arg(v, environment, k.tr('-', '_'))]
|
|
127
132
|
end
|
|
128
133
|
splat = Sass::Tree::Visitors::Perform.perform_splat(
|
|
129
134
|
@splat, keywords, @kwarg_splat, environment)
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
135
|
+
|
|
136
|
+
fn = @callable || environment.function(@name)
|
|
137
|
+
|
|
138
|
+
if fn && fn.origin == :stylesheet
|
|
139
|
+
environment.stack.with_function(filename, line, name) do
|
|
140
|
+
return without_original(perform_sass_fn(fn, args, splat, environment))
|
|
141
|
+
end
|
|
133
142
|
end
|
|
134
143
|
|
|
135
144
|
args = construct_ruby_args(ruby_name, args, splat, environment)
|
|
136
145
|
|
|
137
|
-
if Sass::Script::Functions.callable?(ruby_name)
|
|
138
|
-
css_variable_warning.warn! if css_variable_warning
|
|
139
|
-
|
|
146
|
+
if Sass::Script::Functions.callable?(ruby_name) && (!fn || fn.origin == :builtin)
|
|
140
147
|
local_environment = Sass::Environment.new(environment.global_env, environment.options)
|
|
141
148
|
local_environment.caller = Sass::ReadOnlyEnvironment.new(environment, environment.options)
|
|
142
|
-
result =
|
|
143
|
-
|
|
149
|
+
result = local_environment.stack.with_function(filename, line, name) do
|
|
150
|
+
opts(Sass::Script::Functions::EvaluationContext.new(
|
|
151
|
+
local_environment).send(ruby_name, *args))
|
|
152
|
+
end
|
|
144
153
|
without_original(result)
|
|
145
154
|
else
|
|
146
155
|
opts(to_literal(args))
|
|
@@ -206,6 +215,7 @@ module Sass::Script::Tree
|
|
|
206
215
|
raise Sass::SyntaxError.new(
|
|
207
216
|
"#{args[signature.args.size].inspect} is not a keyword argument for `#{name}'")
|
|
208
217
|
elsif keywords.empty?
|
|
218
|
+
args << {} if signature.var_kwargs
|
|
209
219
|
return args
|
|
210
220
|
end
|
|
211
221
|
|
|
@@ -271,30 +281,21 @@ module Sass::Script::Tree
|
|
|
271
281
|
message = "wrong number of arguments (#{given} for #{expected})"
|
|
272
282
|
end
|
|
273
283
|
elsif Sass::Util.jruby?
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
# is manually-thrown ArgumentErrors, which are indistinguishable from
|
|
278
|
-
# legitimate ArgumentErrors. We treat both of these as
|
|
279
|
-
# Sass::SyntaxErrors even though it can hide Ruby errors.
|
|
280
|
-
e.backtrace[0] !~ /:in `(block in )?#{ruby_name}'$/
|
|
281
|
-
else
|
|
282
|
-
should_maybe_raise =
|
|
283
|
-
e.message =~ /^wrong number of arguments calling `[^`]+` \((\d+) for (\d+)\)/
|
|
284
|
-
given, expected = $1, $2
|
|
285
|
-
end
|
|
284
|
+
should_maybe_raise =
|
|
285
|
+
e.message =~ /^wrong number of arguments calling `[^`]+` \((\d+) for (\d+)\)/
|
|
286
|
+
given, expected = $1, $2
|
|
286
287
|
|
|
287
288
|
if should_maybe_raise
|
|
288
289
|
# JRuby 1.7 includes __send__ before send and _perform.
|
|
289
290
|
trace = e.backtrace.dup
|
|
290
|
-
raise e if
|
|
291
|
+
raise e if trace.shift !~ /:in `__send__'$/
|
|
291
292
|
|
|
292
293
|
# JRuby (as of 1.7.2) doesn't put the actual method
|
|
293
294
|
# for which the argument error was thrown in the backtrace, so we
|
|
294
295
|
# detect whether our send threw an argument error.
|
|
295
296
|
if !(trace[0] =~ /:in `send'$/ && trace[1] =~ /:in `_perform'$/)
|
|
296
297
|
raise e
|
|
297
|
-
|
|
298
|
+
else
|
|
298
299
|
# JRuby 1.7 doesn't use standard formatting for its ArgumentErrors.
|
|
299
300
|
message = "wrong number of arguments (#{given} for #{expected})"
|
|
300
301
|
end
|
|
@@ -47,10 +47,7 @@ module Sass::Script::Tree
|
|
|
47
47
|
# @param wa [Boolean] See {Interpolation#whitespace_after}
|
|
48
48
|
# @param originally_text [Boolean] See {Interpolation#originally_text}
|
|
49
49
|
# @param warn_for_color [Boolean] See {Interpolation#warn_for_color}
|
|
50
|
-
# @comment
|
|
51
|
-
# rubocop:disable ParameterLists
|
|
52
50
|
def initialize(before, mid, after, wb, wa, opts = {})
|
|
53
|
-
# rubocop:enable ParameterLists
|
|
54
51
|
@before = before
|
|
55
52
|
@mid = mid
|
|
56
53
|
@after = after
|
|
@@ -13,13 +13,20 @@ module Sass::Script::Tree
|
|
|
13
13
|
# @return [Symbol]
|
|
14
14
|
attr_reader :separator
|
|
15
15
|
|
|
16
|
+
# Whether the list is surrounded by square brackets.
|
|
17
|
+
#
|
|
18
|
+
# @return [Boolean]
|
|
19
|
+
attr_reader :bracketed
|
|
20
|
+
|
|
16
21
|
# Creates a new list literal.
|
|
17
22
|
#
|
|
18
23
|
# @param elements [Array<Node>] See \{#elements}
|
|
19
24
|
# @param separator [Symbol] See \{#separator}
|
|
20
|
-
|
|
25
|
+
# @param bracketed [Boolean] See \{#bracketed}
|
|
26
|
+
def initialize(elements, separator: nil, bracketed: false)
|
|
21
27
|
@elements = elements
|
|
22
28
|
@separator = separator
|
|
29
|
+
@bracketed = bracketed
|
|
23
30
|
end
|
|
24
31
|
|
|
25
32
|
# @see Node#children
|
|
@@ -27,7 +34,7 @@ module Sass::Script::Tree
|
|
|
27
34
|
|
|
28
35
|
# @see Value#to_sass
|
|
29
36
|
def to_sass(opts = {})
|
|
30
|
-
return "()" if elements.empty?
|
|
37
|
+
return bracketed ? "[]" : "()" if elements.empty?
|
|
31
38
|
members = elements.map do |v|
|
|
32
39
|
if element_needs_parens?(v)
|
|
33
40
|
"(#{v.to_sass(opts)})"
|
|
@@ -36,9 +43,12 @@ module Sass::Script::Tree
|
|
|
36
43
|
end
|
|
37
44
|
end
|
|
38
45
|
|
|
39
|
-
|
|
46
|
+
if separator == :comma && members.length == 1
|
|
47
|
+
return "#{bracketed ? '[' : '('}#{members.first},#{bracketed ? ']' : ')'}"
|
|
48
|
+
end
|
|
40
49
|
|
|
41
|
-
members.join(sep_str(nil))
|
|
50
|
+
contents = members.join(sep_str(nil))
|
|
51
|
+
bracketed ? "[#{contents}]" : contents
|
|
42
52
|
end
|
|
43
53
|
|
|
44
54
|
# @see Node#deep_copy
|
|
@@ -49,7 +59,9 @@ module Sass::Script::Tree
|
|
|
49
59
|
end
|
|
50
60
|
|
|
51
61
|
def inspect
|
|
52
|
-
|
|
62
|
+
(bracketed ? '[' : '(') +
|
|
63
|
+
elements.map {|e| e.inspect}.join(separator == :space ? ' ' : ', ') +
|
|
64
|
+
(bracketed ? ']' : ')')
|
|
53
65
|
end
|
|
54
66
|
|
|
55
67
|
def force_division!
|
|
@@ -61,7 +73,8 @@ module Sass::Script::Tree
|
|
|
61
73
|
def _perform(environment)
|
|
62
74
|
list = Sass::Script::Value::List.new(
|
|
63
75
|
elements.map {|e| e.perform(environment)},
|
|
64
|
-
separator
|
|
76
|
+
separator: separator,
|
|
77
|
+
bracketed: bracketed)
|
|
65
78
|
list.source_range = source_range
|
|
66
79
|
list.options = options
|
|
67
80
|
list
|
|
@@ -73,8 +86,10 @@ module Sass::Script::Tree
|
|
|
73
86
|
# when serialized to Sass.
|
|
74
87
|
def element_needs_parens?(element)
|
|
75
88
|
if element.is_a?(ListLiteral)
|
|
76
|
-
return
|
|
77
|
-
|
|
89
|
+
return false if element.elements.length < 2
|
|
90
|
+
return false if element.bracketed
|
|
91
|
+
return Sass::Script::Parser.precedence_of(element.separator || :space) <=
|
|
92
|
+
Sass::Script::Parser.precedence_of(separator || :space)
|
|
78
93
|
end
|
|
79
94
|
|
|
80
95
|
return false unless separator == :space
|
|
@@ -49,14 +49,14 @@ module Sass::Script::Tree
|
|
|
49
49
|
# @see Node#_perform
|
|
50
50
|
def _perform(environment)
|
|
51
51
|
keys = Set.new
|
|
52
|
-
map = Sass::Script::Value::Map.new(
|
|
52
|
+
map = Sass::Script::Value::Map.new(Hash[pairs.map do |(k, v)|
|
|
53
53
|
k, v = k.perform(environment), v.perform(environment)
|
|
54
54
|
if keys.include?(k)
|
|
55
55
|
raise Sass::SyntaxError.new("Duplicate key #{k.inspect} in map #{to_sass}.")
|
|
56
56
|
end
|
|
57
57
|
keys << k
|
|
58
58
|
[k, v]
|
|
59
|
-
end)
|
|
59
|
+
end])
|
|
60
60
|
map.options = options
|
|
61
61
|
map
|
|
62
62
|
end
|
|
@@ -23,14 +23,6 @@ module Sass::Script::Tree
|
|
|
23
23
|
# @return [String]
|
|
24
24
|
attr_accessor :filename
|
|
25
25
|
|
|
26
|
-
# The warning that this node should emit if it executes in a way that's not
|
|
27
|
-
# safe for a CSS variable value.
|
|
28
|
-
#
|
|
29
|
-
# This is `nil` if this is not in a CSS variable value.
|
|
30
|
-
#
|
|
31
|
-
# @return [Sass::Script::CssVariableWarning]
|
|
32
|
-
attr_accessor :css_variable_warning
|
|
33
|
-
|
|
34
26
|
# Sets the options hash for this node,
|
|
35
27
|
# as well as for all child nodes.
|
|
36
28
|
# See {file:SASS_REFERENCE.md#Options the Sass options documentation}.
|
|
@@ -81,13 +81,6 @@ module Sass::Script::Tree
|
|
|
81
81
|
"Invalid null operation: \"#{value1.inspect} #{@operator} #{value2.inspect}\".")
|
|
82
82
|
end
|
|
83
83
|
|
|
84
|
-
if css_variable_warning && @operator == :div &&
|
|
85
|
-
!(value1.is_a?(Sass::Script::Value::Number) && value1.original &&
|
|
86
|
-
value2.is_a?(Sass::Script::Value::Number) && value2.original) &&
|
|
87
|
-
!(value1.is_a?(Sass::Script::Value::String) && value2.is_a?(Sass::Script::Value::String))
|
|
88
|
-
css_variable_warning.warn!
|
|
89
|
-
end
|
|
90
|
-
|
|
91
84
|
begin
|
|
92
85
|
result = opts(value1.send(@operator, value2))
|
|
93
86
|
rescue NoMethodError => e
|
|
@@ -118,7 +111,7 @@ module Sass::Script::Tree
|
|
|
118
111
|
@@color_arithmetic_deprecation.warn(filename, line, <<WARNING)
|
|
119
112
|
The operation `#{value1} #{@operator} #{value2}` is deprecated and will be an error in future versions.
|
|
120
113
|
Consider using Sass's color functions instead.
|
|
121
|
-
|
|
114
|
+
https://sass-lang.com/documentation/Sass/Script/Functions.html#other_color_functions
|
|
122
115
|
WARNING
|
|
123
116
|
end
|
|
124
117
|
|
data/lib/sass/script/value.rb
CHANGED
|
@@ -17,7 +17,7 @@ module Sass::Script::Value
|
|
|
17
17
|
# @param keywords [Hash<String, Value>, NormalizedMap<Value>] See \{#keywords}
|
|
18
18
|
# @param separator [String] See \{List#separator}.
|
|
19
19
|
def initialize(value, keywords, separator)
|
|
20
|
-
super(value, separator)
|
|
20
|
+
super(value, separator: separator)
|
|
21
21
|
if keywords.is_a?(Sass::Util::NormalizedMap)
|
|
22
22
|
@keywords = keywords
|
|
23
23
|
else
|
|
@@ -192,6 +192,12 @@ MSG
|
|
|
192
192
|
# @return [Symbol]
|
|
193
193
|
def separator; nil; end
|
|
194
194
|
|
|
195
|
+
# Whether the value is surrounded by square brackets. For non-list values,
|
|
196
|
+
# this will be `false`.
|
|
197
|
+
#
|
|
198
|
+
# @return [Boolean]
|
|
199
|
+
def bracketed; false; end
|
|
200
|
+
|
|
195
201
|
# Returns the value of this value as a list.
|
|
196
202
|
# Single values are considered the same as single-element lists.
|
|
197
203
|
#
|
|
@@ -228,6 +234,17 @@ MSG
|
|
|
228
234
|
false
|
|
229
235
|
end
|
|
230
236
|
|
|
237
|
+
# Creates a new list containing `contents` but with the same brackets and
|
|
238
|
+
# separators as this object, when interpreted as a list.
|
|
239
|
+
#
|
|
240
|
+
# @param contents [Array<Value>] The contents of the new list.
|
|
241
|
+
# @param separator [Symbol] The separator of the new list. Defaults to \{#separator}.
|
|
242
|
+
# @param bracketed [Boolean] Whether the new list is bracketed. Defaults to \{#bracketed}.
|
|
243
|
+
# @return [Sass::Script::Value::List]
|
|
244
|
+
def with_contents(contents, separator: self.separator, bracketed: self.bracketed)
|
|
245
|
+
Sass::Script::Value::List.new(contents, separator: separator, bracketed: bracketed)
|
|
246
|
+
end
|
|
247
|
+
|
|
231
248
|
protected
|
|
232
249
|
|
|
233
250
|
# Evaluates the value.
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
module Sass::Script::Value
|
|
2
|
+
# A SassScript object representing a null value.
|
|
3
|
+
class Callable < Base
|
|
4
|
+
# Constructs a Callable value for use in SassScript.
|
|
5
|
+
#
|
|
6
|
+
# @param callable [Sass::Callable] The callable to be used when the
|
|
7
|
+
# callable is called.
|
|
8
|
+
def initialize(callable)
|
|
9
|
+
super(callable)
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def to_s(opts = {})
|
|
13
|
+
raise Sass::SyntaxError.new("#{to_sass} isn't a valid CSS value.")
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def inspect
|
|
17
|
+
to_sass
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
# @abstract
|
|
21
|
+
def to_sass
|
|
22
|
+
Sass::Util.abstract(self)
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
@@ -277,13 +277,14 @@ module Sass::Script::Value
|
|
|
277
277
|
#
|
|
278
278
|
# @return [Color]
|
|
279
279
|
def self.from_hex(hex_string, alpha = nil)
|
|
280
|
-
unless hex_string =~ /^#?([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})
|
|
281
|
-
hex_string =~ /^#?([0-9a-f])([0-9a-f])([0-9a-f])
|
|
280
|
+
unless hex_string =~ /^#?([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})?$/i ||
|
|
281
|
+
hex_string =~ /^#?([0-9a-f])([0-9a-f])([0-9a-f])([0-9a-f])?$/i
|
|
282
282
|
raise ArgumentError.new("#{hex_string.inspect} is not a valid hex color.")
|
|
283
283
|
end
|
|
284
284
|
red = $1.ljust(2, $1).to_i(16)
|
|
285
285
|
green = $2.ljust(2, $2).to_i(16)
|
|
286
286
|
blue = $3.ljust(2, $3).to_i(16)
|
|
287
|
+
alpha = $4.ljust(2, $4).to_i(16).to_f / 0xff if $4
|
|
287
288
|
|
|
288
289
|
hex_string = "##{hex_string}" unless hex_string[0] == ?#
|
|
289
290
|
attrs = {:red => red, :green => green, :blue => blue, :representation => hex_string}
|
|
@@ -563,6 +564,11 @@ module Sass::Script::Value
|
|
|
563
564
|
def to_s(opts = {})
|
|
564
565
|
return smallest if options[:style] == :compressed
|
|
565
566
|
return representation if representation
|
|
567
|
+
|
|
568
|
+
# IE10 doesn't properly support the color name "transparent", so we emit
|
|
569
|
+
# generated transparent colors as rgba(0, 0, 0, 0) in favor of that. See
|
|
570
|
+
# #1782.
|
|
571
|
+
return rgba_str if Number.basically_equal?(alpha, 0)
|
|
566
572
|
return name if name
|
|
567
573
|
alpha? ? rgba_str : hex_str
|
|
568
574
|
end
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
module Sass::Script::Value
|
|
2
|
+
# A SassScript object representing a function.
|
|
3
|
+
class Function < Callable
|
|
4
|
+
# Constructs a Function value for use in SassScript.
|
|
5
|
+
#
|
|
6
|
+
# @param function [Sass::Callable] The callable to be used when the
|
|
7
|
+
# function is invoked.
|
|
8
|
+
def initialize(function)
|
|
9
|
+
unless function.type == "function"
|
|
10
|
+
raise ArgumentError.new("A callable of type function was expected.")
|
|
11
|
+
end
|
|
12
|
+
super
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def to_sass
|
|
16
|
+
%{get-function("#{value.name}")}
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
@@ -1,8 +1,6 @@
|
|
|
1
1
|
module Sass::Script::Value
|
|
2
2
|
# Provides helper functions for creating sass values from within ruby methods.
|
|
3
3
|
# @since `3.3.0`
|
|
4
|
-
# @comment
|
|
5
|
-
# rubocop:disable ModuleLength
|
|
6
4
|
module Helpers
|
|
7
5
|
# Construct a Sass Boolean.
|
|
8
6
|
#
|
|
@@ -68,26 +66,35 @@ module Sass::Script::Value
|
|
|
68
66
|
Number.new(number, *parse_unit_string(unit_string))
|
|
69
67
|
end
|
|
70
68
|
|
|
71
|
-
# @overload list(*elements, separator)
|
|
69
|
+
# @overload list(*elements, separator:, bracketed: false)
|
|
72
70
|
# Create a space-separated list from the arguments given.
|
|
73
71
|
# @param elements [Array<Sass::Script::Value::Base>] Each argument will be a list element.
|
|
74
72
|
# @param separator [Symbol] Either :space or :comma.
|
|
73
|
+
# @param bracketed [Boolean] Whether the list uses square brackets.
|
|
75
74
|
# @return [Sass::Script::Value::List] The space separated list.
|
|
76
75
|
#
|
|
77
|
-
# @overload list(array, separator)
|
|
76
|
+
# @overload list(array, separator:, bracketed: false)
|
|
78
77
|
# Create a space-separated list from the array given.
|
|
79
78
|
# @param array [Array<Sass::Script::Value::Base>] A ruby array of Sass values
|
|
80
79
|
# to make into a list.
|
|
80
|
+
# @param separator [Symbol] Either :space or :comma.
|
|
81
|
+
# @param bracketed [Boolean] Whether the list uses square brackets.
|
|
81
82
|
# @return [Sass::Script::Value::List] The space separated list.
|
|
82
|
-
def list(*elements)
|
|
83
|
-
|
|
84
|
-
|
|
83
|
+
def list(*elements, separator: nil, bracketed: false)
|
|
84
|
+
# Support passing separator as the last value in elements for
|
|
85
|
+
# backwards-compatibility.
|
|
86
|
+
if separator.nil?
|
|
87
|
+
if elements.last.is_a?(Symbol)
|
|
88
|
+
separator = elements.pop
|
|
89
|
+
else
|
|
90
|
+
raise ArgumentError.new("A separator of :space or :comma must be specified.")
|
|
91
|
+
end
|
|
85
92
|
end
|
|
86
|
-
|
|
93
|
+
|
|
87
94
|
if elements.size == 1 && elements.first.is_a?(Array)
|
|
88
95
|
elements = elements.first
|
|
89
96
|
end
|
|
90
|
-
Sass::Script::Value::List.new(elements, separator)
|
|
97
|
+
Sass::Script::Value::List.new(elements, separator: separator, bracketed: bracketed)
|
|
91
98
|
end
|
|
92
99
|
|
|
93
100
|
# Construct a Sass map.
|
|
@@ -196,14 +203,33 @@ module Sass::Script::Value
|
|
|
196
203
|
raise ArgumentError.new(err)
|
|
197
204
|
end
|
|
198
205
|
|
|
199
|
-
# Returns true when the literal is a string containing a calc()
|
|
206
|
+
# Returns true when the literal is a string containing a calc().
|
|
207
|
+
#
|
|
208
|
+
# Use \{#special_number?} in preference to this.
|
|
200
209
|
#
|
|
201
210
|
# @param literal [Sass::Script::Value::Base] The value to check
|
|
202
|
-
# @return
|
|
211
|
+
# @return Boolean
|
|
203
212
|
def calc?(literal)
|
|
204
213
|
literal.is_a?(Sass::Script::Value::String) && literal.value =~ /calc\(/
|
|
205
214
|
end
|
|
206
215
|
|
|
216
|
+
# Returns true when the literal is a string containing a var().
|
|
217
|
+
#
|
|
218
|
+
# @param literal [Sass::Script::Value::Base] The value to check
|
|
219
|
+
# @return Boolean
|
|
220
|
+
def var?(literal)
|
|
221
|
+
literal.is_a?(Sass::Script::Value::String) && literal.value =~ /var\(/
|
|
222
|
+
end
|
|
223
|
+
|
|
224
|
+
# Returns whether the literal is a special CSS value that may evaluate to a
|
|
225
|
+
# number, such as `calc()` or `var()`.
|
|
226
|
+
#
|
|
227
|
+
# @param literal [Sass::Script::Value::Base] The value to check
|
|
228
|
+
# @return Boolean
|
|
229
|
+
def special_number?(literal)
|
|
230
|
+
literal.is_a?(Sass::Script::Value::String) && literal.value =~ /(calc|var)\(/
|
|
231
|
+
end
|
|
232
|
+
|
|
207
233
|
private
|
|
208
234
|
|
|
209
235
|
# Converts a user-provided selector into string form or throws an
|