sass 3.1.21 → 3.2.0.alpha.3
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.
- data/README.md +5 -4
- data/REVISION +1 -1
- data/Rakefile +6 -15
- data/VERSION +1 -1
- data/VERSION_NAME +1 -1
- data/lib/sass.rb +0 -1
- data/lib/sass/cache_stores/base.rb +1 -3
- data/lib/sass/cache_stores/filesystem.rb +0 -3
- data/lib/sass/css.rb +49 -145
- data/lib/sass/engine.rb +23 -47
- data/lib/sass/environment.rb +5 -30
- data/lib/sass/exec.rb +7 -30
- data/lib/sass/importers/base.rb +1 -2
- data/lib/sass/importers/filesystem.rb +13 -18
- data/lib/sass/less.rb +1 -1
- data/lib/sass/plugin.rb +8 -4
- data/lib/sass/plugin/compiler.rb +67 -93
- data/lib/sass/plugin/configuration.rb +2 -0
- data/lib/sass/plugin/staleness_checker.rb +4 -14
- data/lib/sass/repl.rb +3 -2
- data/lib/sass/script.rb +1 -0
- data/lib/sass/script/color.rb +9 -4
- data/lib/sass/script/funcall.rb +3 -16
- data/lib/sass/script/functions.rb +55 -98
- data/lib/sass/script/interpolation.rb +0 -9
- data/lib/sass/script/lexer.rb +4 -2
- data/lib/sass/script/list.rb +0 -8
- data/lib/sass/script/literal.rb +20 -5
- data/lib/sass/script/node.rb +0 -8
- data/lib/sass/script/number.rb +11 -35
- data/lib/sass/script/operation.rb +0 -16
- data/lib/sass/script/parser.rb +5 -12
- data/lib/sass/script/string_interpolation.rb +0 -9
- data/lib/sass/script/unary_operation.rb +0 -7
- data/lib/sass/script/variable.rb +1 -5
- data/lib/sass/scss/parser.rb +54 -191
- data/lib/sass/scss/rx.rb +3 -15
- data/lib/sass/scss/static_parser.rb +3 -3
- data/lib/sass/selector.rb +3 -15
- data/lib/sass/selector/abstract_sequence.rb +2 -11
- data/lib/sass/selector/comma_sequence.rb +3 -8
- data/lib/sass/selector/sequence.rb +11 -74
- data/lib/sass/selector/simple.rb +1 -7
- data/lib/sass/selector/simple_sequence.rb +8 -28
- data/lib/sass/shared.rb +5 -3
- data/lib/sass/tree/comment_node.rb +12 -25
- data/lib/sass/tree/debug_node.rb +1 -1
- data/lib/sass/tree/directive_node.rb +0 -5
- data/lib/sass/tree/each_node.rb +1 -1
- data/lib/sass/tree/extend_node.rb +1 -1
- data/lib/sass/tree/for_node.rb +2 -2
- data/lib/sass/tree/function_node.rb +1 -1
- data/lib/sass/tree/if_node.rb +14 -1
- data/lib/sass/tree/media_node.rb +4 -4
- data/lib/sass/tree/mixin_def_node.rb +1 -1
- data/lib/sass/tree/mixin_node.rb +2 -2
- data/lib/sass/tree/node.rb +26 -10
- data/lib/sass/tree/return_node.rb +1 -1
- data/lib/sass/tree/root_node.rb +1 -1
- data/lib/sass/tree/rule_node.rb +11 -9
- data/lib/sass/tree/variable_node.rb +1 -1
- data/lib/sass/tree/visitors/base.rb +1 -1
- data/lib/sass/tree/visitors/check_nesting.rb +36 -29
- data/lib/sass/tree/visitors/convert.rb +9 -16
- data/lib/sass/tree/visitors/cssize.rb +9 -40
- data/lib/sass/tree/visitors/perform.rb +23 -79
- data/lib/sass/tree/visitors/to_css.rb +21 -23
- data/lib/sass/tree/warn_node.rb +1 -1
- data/lib/sass/tree/while_node.rb +1 -1
- data/lib/sass/util.rb +9 -147
- data/lib/sass/version.rb +0 -14
- data/test/sass/cache_test.rb +0 -15
- data/test/sass/conversion_test.rb +8 -50
- data/test/sass/css2sass_test.rb +0 -33
- data/test/sass/engine_test.rb +32 -283
- data/test/sass/extend_test.rb +0 -315
- data/test/sass/functions_test.rb +23 -60
- data/test/sass/importer_test.rb +0 -110
- data/test/sass/more_results/more_import.css +2 -2
- data/test/sass/plugin_test.rb +13 -40
- data/test/sass/results/import.css +2 -2
- data/test/sass/results/import_charset.css +0 -1
- data/test/sass/results/import_charset_1_8.css +0 -1
- data/test/sass/results/import_charset_ibm866.css +0 -1
- data/test/sass/results/scss_import.css +2 -2
- data/test/sass/results/units.css +1 -1
- data/test/sass/script_conversion_test.rb +0 -2
- data/test/sass/script_test.rb +4 -28
- data/test/sass/scss/css_test.rb +1 -79
- data/test/sass/scss/scss_test.rb +16 -96
- data/test/sass/templates/import_charset.sass +0 -2
- data/test/sass/templates/import_charset_1_8.sass +0 -2
- data/test/sass/templates/import_charset_ibm866.sass +0 -2
- data/test/sass/test_helper.rb +1 -1
- data/test/sass/util_test.rb +0 -28
- data/test/test_helper.rb +0 -2
- data/vendor/{listen → fssm}/LICENSE +1 -1
- data/vendor/fssm/README.markdown +55 -0
- data/vendor/fssm/Rakefile +59 -0
- data/vendor/fssm/VERSION.yml +5 -0
- data/vendor/fssm/example.rb +9 -0
- data/vendor/fssm/fssm.gemspec +77 -0
- data/vendor/fssm/lib/fssm.rb +33 -0
- data/vendor/fssm/lib/fssm/backends/fsevents.rb +36 -0
- data/vendor/fssm/lib/fssm/backends/inotify.rb +26 -0
- data/vendor/fssm/lib/fssm/backends/polling.rb +25 -0
- data/vendor/fssm/lib/fssm/backends/rubycocoa/fsevents.rb +131 -0
- data/vendor/fssm/lib/fssm/monitor.rb +26 -0
- data/vendor/fssm/lib/fssm/path.rb +91 -0
- data/vendor/fssm/lib/fssm/pathname.rb +502 -0
- data/vendor/fssm/lib/fssm/state/directory.rb +57 -0
- data/vendor/fssm/lib/fssm/state/file.rb +24 -0
- data/vendor/fssm/lib/fssm/support.rb +63 -0
- data/vendor/fssm/lib/fssm/tree.rb +176 -0
- data/vendor/fssm/profile/prof-cache.rb +40 -0
- data/vendor/fssm/profile/prof-fssm-pathname.html +1231 -0
- data/vendor/fssm/profile/prof-pathname.rb +68 -0
- data/vendor/fssm/profile/prof-plain-pathname.html +988 -0
- data/vendor/fssm/profile/prof.html +2379 -0
- data/vendor/fssm/spec/path_spec.rb +75 -0
- data/vendor/fssm/spec/root/duck/quack.txt +0 -0
- data/vendor/fssm/spec/root/file.css +0 -0
- data/vendor/fssm/spec/root/file.rb +0 -0
- data/vendor/fssm/spec/root/file.yml +0 -0
- data/vendor/fssm/spec/root/moo/cow.txt +0 -0
- data/vendor/fssm/spec/spec_helper.rb +14 -0
- metadata +246 -281
- data/VERSION_DATE +0 -1
- data/lib/sass/logger.rb +0 -15
- data/lib/sass/logger/base.rb +0 -32
- data/lib/sass/logger/log_level.rb +0 -49
- data/lib/sass/tree/visitors/deep_copy.rb +0 -87
- data/lib/sass/tree/visitors/extend.rb +0 -42
- data/lib/sass/tree/visitors/set_options.rb +0 -97
- data/lib/sass/util/multibyte_string_scanner.rb +0 -134
- data/test/Gemfile +0 -4
- data/test/Gemfile.lock +0 -19
- 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/logger_test.rb +0 -58
- data/test/sass/templates/_double_import_loop2.sass +0 -1
- data/test/sass/templates/bork5.sass +0 -3
- data/test/sass/templates/double_import_loop1.sass +0 -1
- data/test/sass/templates/nested_bork5.sass +0 -2
- data/test/sass/templates/single_import_loop.sass +0 -1
- data/test/sass/util/multibyte_string_scanner_test.rb +0 -147
- data/vendor/listen/CHANGELOG.md +0 -147
- data/vendor/listen/Gemfile +0 -23
- data/vendor/listen/Guardfile +0 -8
- data/vendor/listen/README.md +0 -312
- data/vendor/listen/Rakefile +0 -47
- data/vendor/listen/Vagrantfile +0 -96
- data/vendor/listen/lib/listen.rb +0 -38
- data/vendor/listen/lib/listen/adapter.rb +0 -167
- data/vendor/listen/lib/listen/adapters/darwin.rb +0 -84
- data/vendor/listen/lib/listen/adapters/linux.rb +0 -110
- data/vendor/listen/lib/listen/adapters/polling.rb +0 -66
- data/vendor/listen/lib/listen/adapters/windows.rb +0 -81
- data/vendor/listen/lib/listen/directory_record.rb +0 -318
- data/vendor/listen/lib/listen/listener.rb +0 -203
- data/vendor/listen/lib/listen/multi_listener.rb +0 -121
- data/vendor/listen/lib/listen/turnstile.rb +0 -28
- data/vendor/listen/lib/listen/version.rb +0 -3
- data/vendor/listen/listen.gemspec +0 -26
- data/vendor/listen/spec/listen/adapter_spec.rb +0 -142
- data/vendor/listen/spec/listen/adapters/darwin_spec.rb +0 -31
- data/vendor/listen/spec/listen/adapters/linux_spec.rb +0 -41
- data/vendor/listen/spec/listen/adapters/polling_spec.rb +0 -68
- data/vendor/listen/spec/listen/adapters/windows_spec.rb +0 -24
- data/vendor/listen/spec/listen/directory_record_spec.rb +0 -1138
- data/vendor/listen/spec/listen/listener_spec.rb +0 -155
- data/vendor/listen/spec/listen/multi_listener_spec.rb +0 -156
- data/vendor/listen/spec/listen/turnstile_spec.rb +0 -56
- data/vendor/listen/spec/listen_spec.rb +0 -73
- data/vendor/listen/spec/spec_helper.rb +0 -18
- data/vendor/listen/spec/support/adapter_helper.rb +0 -716
- data/vendor/listen/spec/support/directory_record_helper.rb +0 -55
- data/vendor/listen/spec/support/fixtures_helper.rb +0 -29
- data/vendor/listen/spec/support/listeners_helper.rb +0 -144
- data/vendor/listen/spec/support/platform_helper.rb +0 -11
data/lib/sass/script/list.rb
CHANGED
@@ -24,13 +24,6 @@ module Sass::Script
|
|
24
24
|
@separator = separator
|
25
25
|
end
|
26
26
|
|
27
|
-
# @see Node#deep_copy
|
28
|
-
def deep_copy
|
29
|
-
node = dup
|
30
|
-
node.instance_variable_set('@value', value.map {|c| c.deep_copy})
|
31
|
-
node
|
32
|
-
end
|
33
|
-
|
34
27
|
# @see Node#eq
|
35
28
|
def eq(other)
|
36
29
|
Sass::Script::Bool.new(
|
@@ -46,7 +39,6 @@ module Sass::Script
|
|
46
39
|
|
47
40
|
# @see Node#to_sass
|
48
41
|
def to_sass(opts = {})
|
49
|
-
return "()" if value.empty?
|
50
42
|
precedence = Sass::Script::Parser.precedence_of(separator)
|
51
43
|
value.map do |v|
|
52
44
|
if v.is_a?(List) && Sass::Script::Parser.precedence_of(v.separator) <= precedence
|
data/lib/sass/script/literal.rb
CHANGED
@@ -33,11 +33,6 @@ module Sass::Script
|
|
33
33
|
[]
|
34
34
|
end
|
35
35
|
|
36
|
-
# @see Node#deep_copy
|
37
|
-
def deep_copy
|
38
|
-
dup
|
39
|
-
end
|
40
|
-
|
41
36
|
# Returns the options hash for this node.
|
42
37
|
#
|
43
38
|
# @return [{Symbol => Object}]
|
@@ -55,6 +50,26 @@ The #options attribute is not set on this #{self.class}.
|
|
55
50
|
MSG
|
56
51
|
end
|
57
52
|
|
53
|
+
# The SassScript `and` operation.
|
54
|
+
#
|
55
|
+
# @param other [Literal] The right-hand side of the operator
|
56
|
+
# @return [Literal] The result of a logical and:
|
57
|
+
# `other` if this literal isn't a false {Bool},
|
58
|
+
# and this literal otherwise
|
59
|
+
def and(other)
|
60
|
+
to_bool ? other : self
|
61
|
+
end
|
62
|
+
|
63
|
+
# The SassScript `or` operation.
|
64
|
+
#
|
65
|
+
# @param other [Literal] The right-hand side of the operator
|
66
|
+
# @return [Literal] The result of the logical or:
|
67
|
+
# this literal if it isn't a false {Bool},
|
68
|
+
# and `other` otherwise
|
69
|
+
def or(other)
|
70
|
+
to_bool ? self : other
|
71
|
+
end
|
72
|
+
|
58
73
|
# The SassScript `==` operation.
|
59
74
|
# **Note that this returns a {Sass::Script::Bool} object,
|
60
75
|
# not a Ruby boolean**.
|
data/lib/sass/script/node.rb
CHANGED
@@ -57,14 +57,6 @@ module Sass::Script
|
|
57
57
|
Sass::Util.abstract(self)
|
58
58
|
end
|
59
59
|
|
60
|
-
# Returns a deep clone of this node.
|
61
|
-
# The child nodes are cloned, but options are not.
|
62
|
-
#
|
63
|
-
# @return [Node]
|
64
|
-
def deep_copy
|
65
|
-
Sass::Util.abstract(self)
|
66
|
-
end
|
67
|
-
|
68
60
|
protected
|
69
61
|
|
70
62
|
# Converts underscores to dashes if the :dasherize option is set.
|
data/lib/sass/script/number.rb
CHANGED
@@ -35,34 +35,11 @@ module Sass::Script
|
|
35
35
|
# @return [Boolean, nil]
|
36
36
|
attr_accessor :original
|
37
37
|
|
38
|
-
|
39
|
-
|
40
|
-
end
|
41
|
-
|
42
|
-
# Sets the number of digits of precision
|
43
|
-
# For example, if this is `3`,
|
38
|
+
# The precision with which numbers will be printed to CSS files.
|
39
|
+
# For example, if this is `1000.0`,
|
44
40
|
# `3.1415926` will be printed as `3.142`.
|
45
|
-
|
46
|
-
|
47
|
-
@precision_factor = 10.0**@precision
|
48
|
-
end
|
49
|
-
|
50
|
-
# the precision factor used in numeric output
|
51
|
-
# it is derived from the `precision` method.
|
52
|
-
def self.precision_factor
|
53
|
-
@precision_factor ||= 10.0**precision
|
54
|
-
end
|
55
|
-
|
56
|
-
# Handles the deprecation warning for the PRECISION constant
|
57
|
-
# This can be removed in 3.2.
|
58
|
-
def self.const_missing(const)
|
59
|
-
if const == :PRECISION
|
60
|
-
Sass::Util.sass_warn("Sass::Script::Number::PRECISION is deprecated and will be removed in a future release. Use Sass::Script::Number.precision_factor instead.")
|
61
|
-
const_set(:PRECISION, self.precision_factor)
|
62
|
-
else
|
63
|
-
super
|
64
|
-
end
|
65
|
-
end
|
41
|
+
# @api public
|
42
|
+
PRECISION = 1000.0
|
66
43
|
|
67
44
|
# Used so we don't allocate two new arrays for each new number.
|
68
45
|
NO_UNITS = []
|
@@ -360,7 +337,7 @@ module Sass::Script
|
|
360
337
|
elsif num % 1 == 0.0
|
361
338
|
num.to_i
|
362
339
|
else
|
363
|
-
(
|
340
|
+
(num * PRECISION).round / PRECISION
|
364
341
|
end
|
365
342
|
end
|
366
343
|
|
@@ -422,13 +399,12 @@ module Sass::Script
|
|
422
399
|
end
|
423
400
|
|
424
401
|
# A hash of unit names to their index in the conversion table
|
425
|
-
CONVERTABLE_UNITS = {"in" => 0, "cm" => 1, "pc" => 2, "mm" => 3, "pt" => 4
|
426
|
-
CONVERSION_TABLE = [[ 1, 2.54, 6, 25.4, 72
|
427
|
-
[ nil, 1, 2.36220473, 10, 28.3464567
|
428
|
-
[ nil, nil, 1, 4.23333333, 12
|
429
|
-
[ nil, nil, nil, 1, 2.83464567
|
430
|
-
[ nil, nil, nil, nil, 1
|
431
|
-
[ nil, nil, nil, nil, nil , 1 ]] # px
|
402
|
+
CONVERTABLE_UNITS = {"in" => 0, "cm" => 1, "pc" => 2, "mm" => 3, "pt" => 4}
|
403
|
+
CONVERSION_TABLE = [[ 1, 2.54, 6, 25.4, 72 ], # in
|
404
|
+
[ nil, 1, 2.36220473, 10, 28.3464567], # cm
|
405
|
+
[ nil, nil, 1, 4.23333333, 12 ], # pc
|
406
|
+
[ nil, nil, nil, 1, 2.83464567], # mm
|
407
|
+
[ nil, nil, nil, nil, 1 ]] # pt
|
432
408
|
|
433
409
|
def conversion_factor(from_unit, to_unit)
|
434
410
|
res = CONVERSION_TABLE[CONVERTABLE_UNITS[from_unit]][CONVERTABLE_UNITS[to_unit]]
|
@@ -55,14 +55,6 @@ module Sass::Script
|
|
55
55
|
[@operand1, @operand2]
|
56
56
|
end
|
57
57
|
|
58
|
-
# @see Node#deep_copy
|
59
|
-
def deep_copy
|
60
|
-
node = dup
|
61
|
-
node.instance_variable_set('@operand1', @operand1.deep_copy)
|
62
|
-
node.instance_variable_set('@operand2', @operand2.deep_copy)
|
63
|
-
node
|
64
|
-
end
|
65
|
-
|
66
58
|
protected
|
67
59
|
|
68
60
|
# Evaluates the operation.
|
@@ -72,14 +64,6 @@ module Sass::Script
|
|
72
64
|
# @raise [Sass::SyntaxError] if the operation is undefined for the operands
|
73
65
|
def _perform(environment)
|
74
66
|
literal1 = @operand1.perform(environment)
|
75
|
-
|
76
|
-
# Special-case :and and :or to support short-circuiting.
|
77
|
-
if @operator == :and
|
78
|
-
return literal1.to_bool ? @operand2.perform(environment) : literal1
|
79
|
-
elsif @operator == :or
|
80
|
-
return literal1.to_bool ? literal1 : @operand2.perform(environment)
|
81
|
-
end
|
82
|
-
|
83
67
|
literal2 = @operand2.perform(environment)
|
84
68
|
|
85
69
|
begin
|
data/lib/sass/script/parser.rb
CHANGED
@@ -182,11 +182,7 @@ module Sass
|
|
182
182
|
interp = try_ops_after_interp(#{ops.inspect}, #{name.inspect}) and return interp
|
183
183
|
return unless e = #{sub}
|
184
184
|
while tok = try_tok(#{ops.map {|o| o.inspect}.join(', ')})
|
185
|
-
|
186
|
-
return interp unless other_interp = try_ops_after_interp(#{ops.inspect}, #{name.inspect}, interp)
|
187
|
-
return other_interp
|
188
|
-
end
|
189
|
-
|
185
|
+
interp = try_op_before_interp(tok, e) and return interp
|
190
186
|
line = @lexer.line
|
191
187
|
e = Operation.new(e, assert_expr(#{sub.inspect}), tok.type)
|
192
188
|
e.line = line
|
@@ -221,10 +217,7 @@ RUBY
|
|
221
217
|
return unless e = interpolation
|
222
218
|
arr = [e]
|
223
219
|
while tok = try_tok(:comma)
|
224
|
-
|
225
|
-
return interp unless other_interp = try_ops_after_interp([:comma], :expr, interp)
|
226
|
-
return other_interp
|
227
|
-
end
|
220
|
+
interp = try_op_before_interp(tok, e) and return interp
|
228
221
|
arr << assert_expr(:interpolation)
|
229
222
|
end
|
230
223
|
arr.size == 1 ? arr.first : node(List.new(arr, :comma), line)
|
@@ -242,15 +235,15 @@ RUBY
|
|
242
235
|
interpolation(interp)
|
243
236
|
end
|
244
237
|
|
245
|
-
def try_ops_after_interp(ops, name
|
238
|
+
def try_ops_after_interp(ops, name)
|
246
239
|
return unless @lexer.after_interpolation?
|
247
240
|
return unless op = try_tok(*ops)
|
248
|
-
interp = try_op_before_interp(op
|
241
|
+
interp = try_op_before_interp(op) and return interp
|
249
242
|
|
250
243
|
wa = @lexer.whitespace?
|
251
244
|
str = Script::String.new(Lexer::OPERATORS_REVERSE[op.type])
|
252
245
|
str.line = @lexer.line
|
253
|
-
interp = Script::Interpolation.new(
|
246
|
+
interp = Script::Interpolation.new(nil, str, assert_expr(name), !:wb, wa, :originally_text)
|
254
247
|
interp.line = @lexer.line
|
255
248
|
return interp
|
256
249
|
end
|
@@ -60,15 +60,6 @@ module Sass::Script
|
|
60
60
|
[@before, @mid, @after].compact
|
61
61
|
end
|
62
62
|
|
63
|
-
# @see Node#deep_copy
|
64
|
-
def deep_copy
|
65
|
-
node = dup
|
66
|
-
node.instance_variable_set('@before', @before.deep_copy) if @before
|
67
|
-
node.instance_variable_set('@mid', @mid.deep_copy)
|
68
|
-
node.instance_variable_set('@after', @after.deep_copy) if @after
|
69
|
-
node
|
70
|
-
end
|
71
|
-
|
72
63
|
protected
|
73
64
|
|
74
65
|
# Evaluates the interpolation.
|
data/lib/sass/script/variable.rb
CHANGED
@@ -21,6 +21,7 @@ module Sass
|
|
21
21
|
|
22
22
|
# @return [String] A string representation of the variable
|
23
23
|
def inspect(opts = {})
|
24
|
+
return "!important" if name == "important"
|
24
25
|
"$#{dasherize(name, opts)}"
|
25
26
|
end
|
26
27
|
alias_method :to_sass, :inspect
|
@@ -33,11 +34,6 @@ module Sass
|
|
33
34
|
[]
|
34
35
|
end
|
35
36
|
|
36
|
-
# @see Node#deep_copy
|
37
|
-
def deep_copy
|
38
|
-
dup
|
39
|
-
end
|
40
|
-
|
41
37
|
protected
|
42
38
|
|
43
39
|
# Evaluates the variable.
|
data/lib/sass/scss/parser.rb
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
require 'strscan'
|
1
2
|
require 'set'
|
2
3
|
|
3
4
|
module Sass
|
@@ -8,12 +9,10 @@ module Sass
|
|
8
9
|
# @param str [String, StringScanner] The source document to parse.
|
9
10
|
# Note that `Parser` *won't* raise a nice error message if this isn't properly parsed;
|
10
11
|
# for that, you should use the higher-level {Sass::Engine} or {Sass::CSS}.
|
11
|
-
# @param filename [String] The name of the file being parsed. Used for warnings.
|
12
12
|
# @param line [Fixnum] The line on which the source string appeared,
|
13
|
-
# if it's part of another document
|
14
|
-
def initialize(str,
|
13
|
+
# if it's part of another document
|
14
|
+
def initialize(str, line = 1)
|
15
15
|
@template = str
|
16
|
-
@filename = filename
|
17
16
|
@line = line
|
18
17
|
@strs = []
|
19
18
|
end
|
@@ -49,7 +48,7 @@ module Sass
|
|
49
48
|
if @template.is_a?(StringScanner)
|
50
49
|
@template
|
51
50
|
else
|
52
|
-
|
51
|
+
StringScanner.new(@template.gsub("\r", ""))
|
53
52
|
end
|
54
53
|
end
|
55
54
|
|
@@ -88,35 +87,19 @@ module Sass
|
|
88
87
|
end
|
89
88
|
|
90
89
|
def process_comment(text, node)
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
if silent
|
101
|
-
value = Sass::Util.with_extracted_values(value) do |str|
|
102
|
-
str.sub(/^\s*\/\//, '/*').gsub(/^\s*\/\//, ' *') + ' */'
|
103
|
-
end
|
104
|
-
else
|
105
|
-
value.unshift(@scanner.
|
106
|
-
string[0...@scanner.pos].
|
107
|
-
reverse[/.*?\*\/(.*?)($|\Z)/, 1].
|
108
|
-
reverse.gsub(/[^\s]/, ' '))
|
109
|
-
end
|
110
|
-
|
111
|
-
comment = Sass::Tree::CommentNode.new(value, silent, loud)
|
112
|
-
comment.line = line
|
90
|
+
single_line = text =~ /^\/\//
|
91
|
+
pre_str = single_line ? "" : @scanner.
|
92
|
+
string[0...@scanner.pos].
|
93
|
+
reverse[/.*?\*\/(.*?)($|\Z)/, 1].
|
94
|
+
reverse.gsub(/[^\s]/, ' ')
|
95
|
+
text = text.sub(/^\s*\/\//, '/*').gsub(/^\s*\/\//, ' *') + ' */' if single_line
|
96
|
+
comment = Sass::Tree::CommentNode.new(pre_str + text, single_line)
|
97
|
+
comment.line = @line - text.count("\n")
|
113
98
|
node << comment
|
114
99
|
end
|
115
100
|
|
116
101
|
DIRECTIVES = Set[:mixin, :include, :function, :return, :debug, :warn, :for,
|
117
|
-
:each, :while, :if, :else, :extend, :import, :media, :charset
|
118
|
-
|
119
|
-
PREFIXED_DIRECTIVES = Set[:supports]
|
102
|
+
:each, :while, :if, :else, :extend, :import, :media, :charset]
|
120
103
|
|
121
104
|
def directive
|
122
105
|
return unless tok(/@/)
|
@@ -125,19 +108,13 @@ module Sass
|
|
125
108
|
|
126
109
|
if dir = special_directive(name)
|
127
110
|
return dir
|
128
|
-
elsif dir = prefixed_directive(name)
|
129
|
-
return dir
|
130
111
|
end
|
131
112
|
|
132
113
|
# Most at-rules take expressions (e.g. @import),
|
133
114
|
# but some (e.g. @page) take selector-like arguments
|
134
115
|
val = str {break unless expr}
|
135
116
|
val ||= CssParser.new(@scanner, @line).parse_selector_string
|
136
|
-
|
137
|
-
end
|
138
|
-
|
139
|
-
def directive_body(value)
|
140
|
-
node = node(Sass::Tree::DirectiveNode.new(value.strip))
|
117
|
+
node = node(Sass::Tree::DirectiveNode.new("@#{name} #{val}".strip))
|
141
118
|
|
142
119
|
if tok(/\{/)
|
143
120
|
node.has_children = true
|
@@ -153,11 +130,6 @@ module Sass
|
|
153
130
|
DIRECTIVES.include?(sym) && send("#{sym}_directive")
|
154
131
|
end
|
155
132
|
|
156
|
-
def prefixed_directive(name)
|
157
|
-
sym = name.gsub(/^-[a-z0-9]+-/i, '').gsub('-', '_').to_sym
|
158
|
-
PREFIXED_DIRECTIVES.include?(sym) && send("#{sym}_directive", name)
|
159
|
-
end
|
160
|
-
|
161
133
|
def mixin_directive
|
162
134
|
name = tok! IDENT
|
163
135
|
args = sass_script(:parse_mixin_definition_arglist)
|
@@ -268,7 +240,7 @@ module Sass
|
|
268
240
|
end
|
269
241
|
|
270
242
|
def extend_directive
|
271
|
-
node(Sass::Tree::ExtendNode.new(expr!(:
|
243
|
+
node(Sass::Tree::ExtendNode.new(expr!(:selector)))
|
272
244
|
end
|
273
245
|
|
274
246
|
def import_directive
|
@@ -299,23 +271,20 @@ module Sass
|
|
299
271
|
def use_css_import?; false; end
|
300
272
|
|
301
273
|
def media_directive
|
302
|
-
|
274
|
+
val = str {media_query_list}.strip
|
275
|
+
block(node(Sass::Tree::MediaNode.new(val)), :directive)
|
303
276
|
end
|
304
277
|
|
305
278
|
# http://www.w3.org/TR/css3-mediaqueries/#syntax
|
306
279
|
def media_query_list
|
307
|
-
|
308
|
-
q = str {has_q = media_query}
|
309
|
-
|
310
|
-
return unless has_q
|
311
|
-
queries = [q.strip]
|
280
|
+
return unless media_query
|
312
281
|
|
313
282
|
ss
|
314
283
|
while tok(/,/)
|
315
|
-
ss;
|
284
|
+
ss; expr!(:media_query); ss
|
316
285
|
end
|
317
286
|
|
318
|
-
|
287
|
+
true
|
319
288
|
end
|
320
289
|
|
321
290
|
def media_query
|
@@ -359,76 +328,6 @@ module Sass
|
|
359
328
|
node(Sass::Tree::CharsetNode.new(name))
|
360
329
|
end
|
361
330
|
|
362
|
-
# The document directive is specified in
|
363
|
-
# http://www.w3.org/TR/css3-conditional/, but Gecko allows the
|
364
|
-
# `url-prefix` and `domain` functions to omit quotation marks, contrary to
|
365
|
-
# the standard.
|
366
|
-
#
|
367
|
-
# We could parse all document directives according to Mozilla's syntax,
|
368
|
-
# but if someone's using e.g. @-webkit-document we don't want them to
|
369
|
-
# think WebKit works sans quotes.
|
370
|
-
def _moz_document_directive
|
371
|
-
value = str do
|
372
|
-
begin
|
373
|
-
ss
|
374
|
-
expr!(:moz_document_function)
|
375
|
-
end while tok(/,/)
|
376
|
-
end
|
377
|
-
directive_body("@-moz-document #{value}")
|
378
|
-
end
|
379
|
-
|
380
|
-
def moz_document_function
|
381
|
-
return unless tok(URI) || tok(URL_PREFIX) || tok(DOMAIN) || function
|
382
|
-
ss
|
383
|
-
end
|
384
|
-
|
385
|
-
# http://www.w3.org/TR/css3-conditional/
|
386
|
-
def supports_directive(name)
|
387
|
-
value = str {expr!(:supports_condition)}
|
388
|
-
directive_body("@#{name} #{value}")
|
389
|
-
end
|
390
|
-
|
391
|
-
def supports_condition
|
392
|
-
supports_negation || supports_operator || supports_declaration_condition
|
393
|
-
end
|
394
|
-
|
395
|
-
def supports_negation
|
396
|
-
return unless tok(/not/i)
|
397
|
-
ss
|
398
|
-
expr!(:supports_condition_in_parens)
|
399
|
-
end
|
400
|
-
|
401
|
-
def supports_operator
|
402
|
-
return unless supports_condition_in_parens
|
403
|
-
tok!(/and|or/i)
|
404
|
-
begin
|
405
|
-
ss
|
406
|
-
expr!(:supports_condition_in_parens)
|
407
|
-
end while tok(/and|or/i)
|
408
|
-
true
|
409
|
-
end
|
410
|
-
|
411
|
-
def supports_condition_in_parens
|
412
|
-
return unless tok(/\(/); ss
|
413
|
-
if supports_condition
|
414
|
-
tok!(/\)/); ss
|
415
|
-
else
|
416
|
-
supports_declaration_body
|
417
|
-
end
|
418
|
-
end
|
419
|
-
|
420
|
-
def supports_declaration_condition
|
421
|
-
return unless tok(/\(/); ss
|
422
|
-
supports_declaration_body
|
423
|
-
end
|
424
|
-
|
425
|
-
def supports_declaration_body
|
426
|
-
tok!(IDENT); ss
|
427
|
-
tok!(/:/); ss
|
428
|
-
expr!(:expr); ss
|
429
|
-
tok!(/\)/); ss
|
430
|
-
end
|
431
|
-
|
432
331
|
def variable
|
433
332
|
return unless tok(/\$/)
|
434
333
|
name = tok!(IDENT)
|
@@ -522,7 +421,7 @@ module Sass
|
|
522
421
|
end
|
523
422
|
|
524
423
|
def selector_sequence
|
525
|
-
if sel = tok(STATIC_SELECTOR
|
424
|
+
if sel = tok(STATIC_SELECTOR)
|
526
425
|
return [sel]
|
527
426
|
end
|
528
427
|
|
@@ -588,30 +487,21 @@ module Sass
|
|
588
487
|
res = [e]
|
589
488
|
|
590
489
|
# The tok(/\*/) allows the "E*" hack
|
591
|
-
while v =
|
592
|
-
|
490
|
+
while v = element_name || id_selector || class_selector ||
|
491
|
+
attrib || negation || pseudo || interpolation_selector ||
|
492
|
+
(tok(/\*/) && Selector::Universal.new(nil))
|
593
493
|
res << v
|
594
494
|
end
|
595
495
|
|
596
|
-
|
597
|
-
|
598
|
-
|
599
|
-
|
600
|
-
|
601
|
-
|
602
|
-
|
603
|
-
begin
|
604
|
-
throw_error {expected('"{"')}
|
605
|
-
rescue Sass::SyntaxError => e
|
606
|
-
e.message << "\n\n\"#{sel}\" may only be used at the beginning of a selector."
|
607
|
-
raise e
|
608
|
-
end
|
609
|
-
else
|
610
|
-
Sass::Util.sass_warn(<<MESSAGE)
|
611
|
-
DEPRECATION WARNING:
|
612
|
-
On line #{@line}#{" of \"#{@filename}\"" if @filename}, after "#{self.class.prior_snippet(@scanner)}"
|
613
|
-
Starting in Sass 3.2, "#{sel}" may only be used at the beginning of a selector.
|
496
|
+
if tok?(/&/)
|
497
|
+
begin
|
498
|
+
expected('"{"')
|
499
|
+
rescue Sass::SyntaxError => e
|
500
|
+
e.message << "\n\n" << <<MESSAGE
|
501
|
+
In Sass 3, the parent selector & can only be used where element names are valid,
|
502
|
+
since it could potentially be replaced by an element name.
|
614
503
|
MESSAGE
|
504
|
+
raise e
|
615
505
|
end
|
616
506
|
end
|
617
507
|
|
@@ -669,10 +559,14 @@ MESSAGE
|
|
669
559
|
tok(SUBSTRINGMATCH)
|
670
560
|
@expected = "identifier or string"
|
671
561
|
ss
|
672
|
-
val =
|
562
|
+
if val = tok(IDENT)
|
563
|
+
val = [val]
|
564
|
+
else
|
565
|
+
val = expr!(:interp_string)
|
566
|
+
end
|
673
567
|
ss
|
674
568
|
end
|
675
|
-
tok
|
569
|
+
tok(/\]/)
|
676
570
|
|
677
571
|
Selector::Attribute.new(merge(name), merge(ns), op, merge(val))
|
678
572
|
end
|
@@ -762,7 +656,7 @@ MESSAGE
|
|
762
656
|
# we don't parse it at all, and instead return a plain old string
|
763
657
|
# containing the value.
|
764
658
|
# This results in a dramatic speed increase.
|
765
|
-
if val = tok(STATIC_VALUE
|
659
|
+
if val = tok(STATIC_VALUE)
|
766
660
|
return space, Sass::Script::String.new(val.strip)
|
767
661
|
end
|
768
662
|
return space, sass_script(:parse)
|
@@ -851,7 +745,7 @@ MESSAGE
|
|
851
745
|
end
|
852
746
|
|
853
747
|
def interp_ident(start = IDENT)
|
854
|
-
return unless val = tok(start) || interpolation
|
748
|
+
return unless val = tok(start) || interpolation
|
855
749
|
res = [val]
|
856
750
|
while val = tok(NAME) || interpolation
|
857
751
|
res << val
|
@@ -872,14 +766,8 @@ MESSAGE
|
|
872
766
|
end
|
873
767
|
|
874
768
|
def str?
|
875
|
-
pos = @scanner.pos
|
876
|
-
line = @line
|
877
769
|
@strs.push ""
|
878
|
-
|
879
|
-
rescue Sass::SyntaxError => e
|
880
|
-
@scanner.pos = pos
|
881
|
-
@line = line
|
882
|
-
nil
|
770
|
+
yield && @strs.last
|
883
771
|
ensure
|
884
772
|
@strs.pop
|
885
773
|
end
|
@@ -920,9 +808,6 @@ MESSAGE
|
|
920
808
|
:selector_comma_sequence => "selector",
|
921
809
|
:simple_selector_sequence => "selector",
|
922
810
|
:import_arg => "file to import (string or url())",
|
923
|
-
:moz_document_function => "matching function (e.g. url-prefix(), domain())",
|
924
|
-
:supports_condition => "@supports condition (e.g. (display: flexbox))",
|
925
|
-
:supports_condition_in_parens => "@supports condition (e.g. (display: flexbox))",
|
926
811
|
}
|
927
812
|
|
928
813
|
TOK_NAMES = Sass::Util.to_hash(
|
@@ -961,13 +846,6 @@ MESSAGE
|
|
961
846
|
raise Sass::SyntaxError.new(msg, :line => @line)
|
962
847
|
end
|
963
848
|
|
964
|
-
def throw_error
|
965
|
-
old_throw_error, @throw_error = @throw_error, false
|
966
|
-
yield
|
967
|
-
ensure
|
968
|
-
@throw_error = old_throw_error
|
969
|
-
end
|
970
|
-
|
971
849
|
def catch_error(&block)
|
972
850
|
old_throw_error, @throw_error = @throw_error, true
|
973
851
|
pos = @scanner.pos
|
@@ -987,7 +865,7 @@ MESSAGE
|
|
987
865
|
if @throw_err
|
988
866
|
throw :_sass_parser_error, err
|
989
867
|
else
|
990
|
-
@scanner =
|
868
|
+
@scanner = StringScanner.new(@scanner.string)
|
991
869
|
@scanner.pos = err[:pos]
|
992
870
|
@line = err[:line]
|
993
871
|
@expected = err[:expected]
|
@@ -997,6 +875,16 @@ MESSAGE
|
|
997
875
|
|
998
876
|
# @private
|
999
877
|
def self.expected(scanner, expected, line)
|
878
|
+
pos = scanner.pos
|
879
|
+
|
880
|
+
after = scanner.string[0...pos]
|
881
|
+
# Get rid of whitespace between pos and the last token,
|
882
|
+
# but only if there's a newline in there
|
883
|
+
after.gsub!(/\s*\n\s*$/, '')
|
884
|
+
# Also get rid of stuff before the last newline
|
885
|
+
after.gsub!(/.*\n/, '')
|
886
|
+
after = "..." + after[-15..-1] if after.size > 18
|
887
|
+
|
1000
888
|
was = scanner.rest.dup
|
1001
889
|
# Get rid of whitespace between pos and the next token,
|
1002
890
|
# but only if there's a newline in there
|
@@ -1006,42 +894,17 @@ MESSAGE
|
|
1006
894
|
was = was[0...15] + "..." if was.size > 18
|
1007
895
|
|
1008
896
|
raise Sass::SyntaxError.new(
|
1009
|
-
"Invalid CSS after \"#{
|
897
|
+
"Invalid CSS after \"#{after}\": expected #{expected}, was \"#{was}\"",
|
1010
898
|
:line => line)
|
1011
899
|
end
|
1012
900
|
|
1013
|
-
# @private
|
1014
|
-
def self.prior_snippet(scanner)
|
1015
|
-
pos = scanner.pos
|
1016
|
-
|
1017
|
-
after = scanner.string[0...pos]
|
1018
|
-
# Get rid of whitespace between pos and the last token,
|
1019
|
-
# but only if there's a newline in there
|
1020
|
-
after.gsub!(/\s*\n\s*$/, '')
|
1021
|
-
# Also get rid of stuff before the last newline
|
1022
|
-
after.gsub!(/.*\n/, '')
|
1023
|
-
after = "..." + after[-15..-1] if after.size > 18
|
1024
|
-
after
|
1025
|
-
end
|
1026
|
-
|
1027
901
|
# Avoid allocating lots of new strings for `#tok`.
|
1028
902
|
# This is important because `#tok` is called all the time.
|
1029
903
|
NEWLINE = "\n"
|
1030
904
|
|
1031
|
-
def tok(rx
|
905
|
+
def tok(rx)
|
1032
906
|
res = @scanner.scan(rx)
|
1033
907
|
if res
|
1034
|
-
# This fixes https://github.com/nex3/sass/issues/104, which affects
|
1035
|
-
# Ruby 1.8.7 and REE. This fix is to replace the ?= zero-width
|
1036
|
-
# positive lookahead operator in the Regexp (which matches without
|
1037
|
-
# consuming the matched group), with a match that does consume the
|
1038
|
-
# group, but then rewinds the scanner and removes the group from the
|
1039
|
-
# end of the matched string. This fix makes the assumption that the
|
1040
|
-
# matched group will always occur at the end of the match.
|
1041
|
-
if last_group_lookahead && @scanner[-1]
|
1042
|
-
@scanner.pos -= @scanner[-1].length
|
1043
|
-
res.slice!(-@scanner[-1].length..-1)
|
1044
|
-
end
|
1045
908
|
@line += res.count(NEWLINE)
|
1046
909
|
@expected = nil
|
1047
910
|
if !@strs.empty? && rx != COMMENT && rx != SINGLE_LINE_COMMENT
|