haml 3.1.8 → 3.2.0.alpha.2
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of haml might be problematic. Click here for more details.
- data/CONTRIBUTING +1 -1
- data/README.md +2 -2
- data/REVISION +1 -1
- data/Rakefile +16 -41
- data/VERSION +1 -1
- data/VERSION_NAME +1 -1
- data/lib/haml/buffer.rb +1 -5
- data/lib/haml/compiler.rb +7 -8
- data/lib/haml/exec.rb +1 -1
- data/lib/haml/helpers.rb +3 -5
- data/lib/haml/helpers/action_view_mods.rb +5 -21
- data/lib/haml/parser.rb +1 -1
- data/lib/haml/template.rb +1 -3
- data/lib/haml/util.rb +1 -1
- data/test/haml/engine_test.rb +12 -51
- data/test/haml/helper_test.rb +8 -25
- data/test/haml/html2haml_test.rb +1 -1
- data/test/haml/results/whitespace_handling.xhtml +50 -46
- data/test/haml/template_test.rb +2 -28
- data/test/haml/templates/partial_layout.haml +1 -4
- data/test/linked_rails.rb +4 -4
- data/vendor/sass/VERSION +1 -1
- data/vendor/sass/doc-src/SASS_CHANGELOG.md +2 -115
- data/vendor/sass/doc-src/SASS_REFERENCE.md +4 -12
- data/vendor/sass/lib/sass.rb +0 -1
- data/vendor/sass/lib/sass/cache_stores/base.rb +1 -3
- data/vendor/sass/lib/sass/cache_stores/filesystem.rb +0 -2
- data/vendor/sass/lib/sass/css.rb +1 -2
- data/vendor/sass/lib/sass/engine.rb +23 -39
- data/vendor/sass/lib/sass/environment.rb +0 -11
- data/vendor/sass/lib/sass/exec.rb +1 -14
- data/vendor/sass/lib/sass/importers/base.rb +1 -2
- data/vendor/sass/lib/sass/importers/filesystem.rb +13 -18
- data/vendor/sass/lib/sass/less.rb +2 -2
- data/vendor/sass/lib/sass/plugin.rb +8 -4
- data/vendor/sass/lib/sass/plugin/compiler.rb +17 -42
- data/vendor/sass/lib/sass/plugin/configuration.rb +2 -0
- data/vendor/sass/lib/sass/railtie.rb +1 -1
- data/vendor/sass/lib/sass/script/funcall.rb +1 -14
- data/vendor/sass/lib/sass/script/functions.rb +1 -44
- data/vendor/sass/lib/sass/script/interpolation.rb +0 -9
- data/vendor/sass/lib/sass/script/lexer.rb +1 -6
- data/vendor/sass/lib/sass/script/list.rb +0 -7
- data/vendor/sass/lib/sass/script/literal.rb +0 -5
- data/vendor/sass/lib/sass/script/node.rb +0 -8
- data/vendor/sass/lib/sass/script/number.rb +5 -28
- data/vendor/sass/lib/sass/script/operation.rb +0 -8
- data/vendor/sass/lib/sass/script/parser.rb +5 -12
- data/vendor/sass/lib/sass/script/string_interpolation.rb +0 -9
- data/vendor/sass/lib/sass/script/unary_operation.rb +0 -7
- data/vendor/sass/lib/sass/script/variable.rb +0 -5
- data/vendor/sass/lib/sass/scss/parser.rb +38 -78
- data/vendor/sass/lib/sass/scss/rx.rb +1 -2
- data/vendor/sass/lib/sass/scss/static_parser.rb +2 -2
- data/vendor/sass/lib/sass/shared.rb +1 -1
- data/vendor/sass/lib/sass/tree/comment_node.rb +11 -24
- data/vendor/sass/lib/sass/tree/debug_node.rb +1 -1
- data/vendor/sass/lib/sass/tree/each_node.rb +1 -1
- data/vendor/sass/lib/sass/tree/extend_node.rb +1 -1
- data/vendor/sass/lib/sass/tree/for_node.rb +2 -2
- data/vendor/sass/lib/sass/tree/function_node.rb +1 -1
- data/vendor/sass/lib/sass/tree/if_node.rb +14 -1
- data/vendor/sass/lib/sass/tree/mixin_def_node.rb +1 -1
- data/vendor/sass/lib/sass/tree/mixin_node.rb +2 -2
- data/vendor/sass/lib/sass/tree/node.rb +5 -2
- data/vendor/sass/lib/sass/tree/prop_node.rb +9 -2
- data/vendor/sass/lib/sass/tree/return_node.rb +1 -1
- data/vendor/sass/lib/sass/tree/rule_node.rb +2 -9
- data/vendor/sass/lib/sass/tree/variable_node.rb +1 -1
- data/vendor/sass/lib/sass/tree/visitors/check_nesting.rb +18 -17
- data/vendor/sass/lib/sass/tree/visitors/convert.rb +5 -10
- data/vendor/sass/lib/sass/tree/visitors/perform.rb +19 -50
- data/vendor/sass/lib/sass/tree/visitors/to_css.rb +15 -9
- data/vendor/sass/lib/sass/tree/warn_node.rb +1 -1
- data/vendor/sass/lib/sass/tree/while_node.rb +1 -1
- data/vendor/sass/lib/sass/util.rb +6 -58
- data/vendor/sass/sass.gemspec +1 -2
- data/vendor/sass/test/sass/cache_test.rb +0 -15
- data/vendor/sass/test/sass/conversion_test.rb +6 -2
- data/vendor/sass/test/sass/css2sass_test.rb +0 -9
- data/vendor/sass/test/sass/engine_test.rb +26 -124
- data/vendor/sass/test/sass/functions_test.rb +0 -13
- data/vendor/sass/test/sass/importer_test.rb +0 -110
- data/vendor/sass/test/sass/plugin_test.rb +13 -16
- data/vendor/sass/test/sass/script_conversion_test.rb +0 -2
- data/vendor/sass/test/sass/script_test.rb +0 -18
- data/vendor/sass/test/sass/scss/css_test.rb +1 -7
- data/vendor/sass/test/sass/scss/scss_test.rb +13 -37
- data/vendor/sass/test/sass/test_helper.rb +1 -1
- data/vendor/sass/test/sass/util_test.rb +0 -12
- data/vendor/sass/vendor/fssm/LICENSE +1 -1
- data/vendor/sass/vendor/fssm/README.markdown +27 -55
- data/vendor/sass/vendor/fssm/Rakefile +54 -6
- data/vendor/sass/vendor/fssm/VERSION.yml +5 -0
- data/vendor/sass/vendor/fssm/example.rb +3 -6
- data/vendor/sass/vendor/fssm/fssm.gemspec +70 -17
- data/vendor/sass/vendor/fssm/lib/fssm.rb +3 -7
- data/vendor/sass/vendor/fssm/lib/fssm/backends/fsevents.rb +1 -1
- data/vendor/sass/vendor/fssm/lib/fssm/backends/inotify.rb +2 -2
- data/vendor/sass/vendor/fssm/lib/fssm/backends/polling.rb +2 -2
- data/vendor/sass/vendor/fssm/lib/fssm/backends/rubycocoa/fsevents.rb +10 -10
- data/vendor/sass/vendor/fssm/lib/fssm/monitor.rb +9 -19
- data/vendor/sass/vendor/fssm/lib/fssm/path.rb +21 -24
- data/vendor/sass/vendor/fssm/lib/fssm/pathname.rb +479 -13
- data/vendor/sass/vendor/fssm/lib/fssm/state/directory.rb +11 -29
- data/vendor/sass/vendor/fssm/lib/fssm/state/file.rb +1 -1
- data/vendor/sass/vendor/fssm/lib/fssm/support.rb +12 -41
- data/vendor/sass/vendor/fssm/lib/fssm/tree.rb +6 -6
- data/vendor/sass/vendor/fssm/profile/prof-cache.rb +3 -3
- data/vendor/sass/vendor/fssm/profile/prof-pathname.rb +7 -7
- data/vendor/sass/vendor/fssm/spec/path_spec.rb +15 -36
- data/vendor/sass/vendor/fssm/spec/spec_helper.rb +6 -6
- metadata +78 -125
- data/lib/haml/helpers/rails_323_textarea_fix.rb +0 -41
- data/test/gemfiles/Gemfile.rails-2.0.x +0 -8
- data/test/gemfiles/Gemfile.rails-2.0.x.lock +0 -38
- data/test/gemfiles/Gemfile.rails-2.1.x +0 -8
- data/test/gemfiles/Gemfile.rails-2.1.x.lock +0 -38
- data/test/gemfiles/Gemfile.rails-2.2.x +0 -8
- data/test/gemfiles/Gemfile.rails-2.2.x.lock +0 -38
- data/test/gemfiles/Gemfile.rails-2.3.x +0 -8
- data/test/gemfiles/Gemfile.rails-2.3.x.lock +0 -40
- data/test/gemfiles/Gemfile.rails-3.0.x +0 -8
- data/test/gemfiles/Gemfile.rails-3.0.x.lock +0 -85
- data/test/gemfiles/Gemfile.rails-3.1.x +0 -8
- data/test/gemfiles/Gemfile.rails-3.1.x.lock +0 -97
- data/test/gemfiles/Gemfile.rails-3.2.x +0 -8
- data/test/gemfiles/Gemfile.rails-3.2.x.lock +0 -95
- data/test/gemfiles/Gemfile.rails-xss-2.3.x +0 -9
- data/test/gemfiles/Gemfile.rails-xss-2.3.x.lock +0 -42
- data/vendor/sass/lib/sass/logger.rb +0 -15
- data/vendor/sass/lib/sass/logger/base.rb +0 -32
- data/vendor/sass/lib/sass/logger/log_level.rb +0 -49
- data/vendor/sass/lib/sass/tree/visitors/deep_copy.rb +0 -87
- data/vendor/sass/lib/sass/tree/visitors/set_options.rb +0 -97
- data/vendor/sass/test/Gemfile +0 -4
- data/vendor/sass/test/Gemfile.lock +0 -19
- data/vendor/sass/test/sass/fixtures/test_staleness_check_across_importers.css +0 -1
- data/vendor/sass/test/sass/fixtures/test_staleness_check_across_importers.scss +0 -1
- data/vendor/sass/test/sass/logger_test.rb +0 -58
- data/vendor/sass/test/sass/templates/bork5.sass +0 -3
- data/vendor/sass/test/sass/templates/nested_bork5.sass +0 -2
- data/vendor/sass/vendor/fssm/Gemfile +0 -3
- data/vendor/sass/vendor/fssm/lib/fssm/backends/rbfsevent.rb +0 -42
- data/vendor/sass/vendor/fssm/lib/fssm/version.rb +0 -3
- data/vendor/sass/vendor/fssm/profile/prof-pathname-rubinius.rb +0 -35
- data/vendor/sass/vendor/fssm/spec/count_down_latch.rb +0 -151
- data/vendor/sass/vendor/fssm/spec/monitor_spec.rb +0 -202
@@ -2,7 +2,7 @@
|
|
2
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
|
-
ActiveSupport.on_load(:
|
5
|
+
ActiveSupport.on_load(:before_initialize) do
|
6
6
|
require 'sass'
|
7
7
|
require 'sass/plugin'
|
8
8
|
end
|
@@ -57,14 +57,6 @@ module Sass
|
|
57
57
|
@args + @keywords.values
|
58
58
|
end
|
59
59
|
|
60
|
-
# @see Node#deep_copy
|
61
|
-
def deep_copy
|
62
|
-
node = dup
|
63
|
-
node.instance_variable_set('@args', args.map {|a| a.deep_copy})
|
64
|
-
node.instance_variable_set('@keywords', Hash[keywords.map {|k, v| [k, v.deep_copy]}])
|
65
|
-
node
|
66
|
-
end
|
67
|
-
|
68
60
|
protected
|
69
61
|
|
70
62
|
# Evaluates the function call.
|
@@ -88,12 +80,7 @@ module Sass
|
|
88
80
|
opts(Functions::EvaluationContext.new(environment.options).send(ruby_name, *args))
|
89
81
|
end
|
90
82
|
rescue ArgumentError => e
|
91
|
-
|
92
|
-
# Otherwise, it's an error in the user's stylesheet, so wrap it.
|
93
|
-
if e.message =~ /^wrong number of arguments \(\d+ for \d+\)/ &&
|
94
|
-
e.backtrace[0] !~ /:in `(block in )?#{ruby_name}'$/
|
95
|
-
raise e
|
96
|
-
end
|
83
|
+
raise e unless e.backtrace.any? {|t| t =~ /:in `(block in )?(#{name}|perform)'$/}
|
97
84
|
raise Sass::SyntaxError.new("#{e.message} for `#{name}'")
|
98
85
|
end
|
99
86
|
|
@@ -93,7 +93,7 @@ module Sass::Script
|
|
93
93
|
# \{#adjust_color adjust-color($color, \[$red\], \[$green\], \[$blue\], \[$hue\], \[$saturation\], \[$lightness\], \[$alpha\]}
|
94
94
|
# : Increase or decrease any of the components of a color.
|
95
95
|
#
|
96
|
-
# \{#scale_color scale-color($color, \[$red\], \[$green\], \[$blue\], \[$saturation\], \[$lightness\], \[$alpha\]}
|
96
|
+
# \{#scale_color scale-color($color, \[$red\], \[$green\], \[$blue\], \[$hue\], \[$saturation\], \[$lightness\], \[$alpha\]}
|
97
97
|
# : Fluidly scale one or more components of a color.
|
98
98
|
#
|
99
99
|
# \{#change_color change-color($color, \[$red\], \[$green\], \[$blue\], \[$hue\], \[$saturation\], \[$lightness\], \[$alpha\]}
|
@@ -1299,49 +1299,6 @@ module Sass::Script
|
|
1299
1299
|
declare :append, [:list, :val]
|
1300
1300
|
declare :append, [:list, :val, :separator]
|
1301
1301
|
|
1302
|
-
# Combines several lists into a single comma separated list
|
1303
|
-
# space separated lists.
|
1304
|
-
#
|
1305
|
-
# The length of the resulting list is the length of the
|
1306
|
-
# shortest list.
|
1307
|
-
#
|
1308
|
-
# @example
|
1309
|
-
# zip(1px 1px 3px, solid dashed solid, red green blue)
|
1310
|
-
# => 1px solid red, 1px dashed green, 3px solid blue
|
1311
|
-
def zip(*lists)
|
1312
|
-
length = nil
|
1313
|
-
values = []
|
1314
|
-
lists.each do |list|
|
1315
|
-
assert_type list, :List
|
1316
|
-
values << list.value.dup
|
1317
|
-
length = length.nil? ? list.value.length : [length, list.value.length].min
|
1318
|
-
end
|
1319
|
-
values.each do |value|
|
1320
|
-
value.slice!(length)
|
1321
|
-
end
|
1322
|
-
new_list_value = values.first.zip(*values[1..-1])
|
1323
|
-
List.new(new_list_value.map{|list| List.new(list, :space)}, :comma)
|
1324
|
-
end
|
1325
|
-
declare :zip, [], :var_args => true
|
1326
|
-
|
1327
|
-
|
1328
|
-
# Returns the position of the given value within the given
|
1329
|
-
# list. If not found, returns false.
|
1330
|
-
#
|
1331
|
-
# @example
|
1332
|
-
# index(1px solid red, solid) => 2
|
1333
|
-
# index(1px solid red, dashed) => false
|
1334
|
-
def index(list, value)
|
1335
|
-
assert_type list, :List
|
1336
|
-
index = list.value.index {|e| e.eq(value).to_bool }
|
1337
|
-
if index
|
1338
|
-
Number.new(index + 1)
|
1339
|
-
else
|
1340
|
-
Bool.new(false)
|
1341
|
-
end
|
1342
|
-
end
|
1343
|
-
declare :index, [:list, :value]
|
1344
|
-
|
1345
1302
|
# Returns one of two values based on the truth value of the first argument.
|
1346
1303
|
#
|
1347
1304
|
# @example
|
@@ -50,15 +50,6 @@ module Sass::Script
|
|
50
50
|
[@before, @mid, @after].compact
|
51
51
|
end
|
52
52
|
|
53
|
-
# @see Node#deep_copy
|
54
|
-
def deep_copy
|
55
|
-
node = dup
|
56
|
-
node.instance_variable_set('@before', @before.deep_copy) if @before
|
57
|
-
node.instance_variable_set('@mid', @mid.deep_copy)
|
58
|
-
node.instance_variable_set('@after', @after.deep_copy) if @after
|
59
|
-
node
|
60
|
-
end
|
61
|
-
|
62
53
|
protected
|
63
54
|
|
64
55
|
# Evaluates the interpolation.
|
@@ -231,7 +231,7 @@ module Sass
|
|
231
231
|
|
232
232
|
variable || string(:double, false) || string(:single, false) || number ||
|
233
233
|
color || bool || string(:uri, false) || raw(UNICODERANGE) ||
|
234
|
-
special_fun ||
|
234
|
+
special_fun || ident_op || ident || op
|
235
235
|
end
|
236
236
|
|
237
237
|
def variable
|
@@ -302,11 +302,6 @@ MESSAGE
|
|
302
302
|
str1.size + str2.size]
|
303
303
|
end
|
304
304
|
|
305
|
-
def special_val
|
306
|
-
return unless scan(/!important/i)
|
307
|
-
[:string, Script::String.new("!important")]
|
308
|
-
end
|
309
|
-
|
310
305
|
def ident_op
|
311
306
|
return unless op = scan(REGULAR_EXPRESSIONS[:ident_op])
|
312
307
|
[OPERATORS[op]]
|
@@ -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(
|
@@ -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.
|
@@ -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
|
-
(num *
|
340
|
+
(num * PRECISION).round / PRECISION
|
364
341
|
end
|
365
342
|
end
|
366
343
|
|
@@ -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.
|
@@ -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.
|
@@ -9,12 +9,10 @@ module Sass
|
|
9
9
|
# @param str [String, StringScanner] The source document to parse.
|
10
10
|
# Note that `Parser` *won't* raise a nice error message if this isn't properly parsed;
|
11
11
|
# for that, you should use the higher-level {Sass::Engine} or {Sass::CSS}.
|
12
|
-
# @param filename [String] The name of the file being parsed. Used for warnings.
|
13
12
|
# @param line [Fixnum] The line on which the source string appeared,
|
14
|
-
# if it's part of another document
|
15
|
-
def initialize(str,
|
13
|
+
# if it's part of another document
|
14
|
+
def initialize(str, line = 1)
|
16
15
|
@template = str
|
17
|
-
@filename = filename
|
18
16
|
@line = line
|
19
17
|
@strs = []
|
20
18
|
end
|
@@ -89,28 +87,14 @@ module Sass
|
|
89
87
|
end
|
90
88
|
|
91
89
|
def process_comment(text, node)
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
if silent
|
102
|
-
value = Sass::Util.with_extracted_values(value) do |str|
|
103
|
-
str.sub(/^\s*\/\//, '/*').gsub(/^\s*\/\//, ' *') + ' */'
|
104
|
-
end
|
105
|
-
else
|
106
|
-
value.unshift(@scanner.
|
107
|
-
string[0...@scanner.pos].
|
108
|
-
reverse[/.*?\*\/(.*?)($|\Z)/, 1].
|
109
|
-
reverse.gsub(/[^\s]/, ' '))
|
110
|
-
end
|
111
|
-
|
112
|
-
comment = Sass::Tree::CommentNode.new(value, silent, loud)
|
113
|
-
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")
|
114
98
|
node << comment
|
115
99
|
end
|
116
100
|
|
@@ -503,30 +487,21 @@ module Sass
|
|
503
487
|
res = [e]
|
504
488
|
|
505
489
|
# The tok(/\*/) allows the "E*" hack
|
506
|
-
while v =
|
507
|
-
|
490
|
+
while v = element_name || id_selector || class_selector ||
|
491
|
+
attrib || negation || pseudo || interpolation_selector ||
|
492
|
+
(tok(/\*/) && Selector::Universal.new(nil))
|
508
493
|
res << v
|
509
494
|
end
|
510
495
|
|
511
|
-
|
512
|
-
|
513
|
-
|
514
|
-
|
515
|
-
|
516
|
-
|
517
|
-
|
518
|
-
begin
|
519
|
-
throw_error {expected('"{"')}
|
520
|
-
rescue Sass::SyntaxError => e
|
521
|
-
e.message << "\n\n\"#{sel}\" may only be used at the beginning of a selector."
|
522
|
-
raise e
|
523
|
-
end
|
524
|
-
else
|
525
|
-
Sass::Util.sass_warn(<<MESSAGE)
|
526
|
-
DEPRECATION WARNING:
|
527
|
-
On line #{@line}#{" of \"#{@filename}\"" if @filename}, after "#{self.class.prior_snippet(@scanner)}"
|
528
|
-
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.
|
529
503
|
MESSAGE
|
504
|
+
raise e
|
530
505
|
end
|
531
506
|
end
|
532
507
|
|
@@ -663,9 +638,11 @@ MESSAGE
|
|
663
638
|
tok!(/:/)
|
664
639
|
space, value = value!
|
665
640
|
ss
|
641
|
+
important = tok(IMPORTANT)
|
642
|
+
ss
|
666
643
|
require_block = tok?(/\{/)
|
667
644
|
|
668
|
-
node = node(Sass::Tree::PropNode.new(name.flatten.compact, value, :new))
|
645
|
+
node = node(Sass::Tree::PropNode.new(name.flatten.compact, value, !!important, :new))
|
669
646
|
|
670
647
|
return node unless require_block
|
671
648
|
nested_properties! node, space
|
@@ -770,7 +747,7 @@ MESSAGE
|
|
770
747
|
end
|
771
748
|
|
772
749
|
def interp_ident(start = IDENT)
|
773
|
-
return unless val = tok(start) || interpolation
|
750
|
+
return unless val = tok(start) || interpolation
|
774
751
|
res = [val]
|
775
752
|
while val = tok(NAME) || interpolation
|
776
753
|
res << val
|
@@ -790,15 +767,9 @@ MESSAGE
|
|
790
767
|
@strs.pop
|
791
768
|
end
|
792
769
|
|
793
|
-
def str?
|
794
|
-
pos = @scanner.pos
|
795
|
-
line = @line
|
770
|
+
def str?
|
796
771
|
@strs.push ""
|
797
|
-
|
798
|
-
rescue Sass::SyntaxError => e
|
799
|
-
@scanner.pos = pos
|
800
|
-
@line = line
|
801
|
-
nil
|
772
|
+
yield && @strs.last
|
802
773
|
ensure
|
803
774
|
@strs.pop
|
804
775
|
end
|
@@ -877,13 +848,6 @@ MESSAGE
|
|
877
848
|
raise Sass::SyntaxError.new(msg, :line => @line)
|
878
849
|
end
|
879
850
|
|
880
|
-
def throw_error
|
881
|
-
old_throw_error, @throw_error = @throw_error, false
|
882
|
-
yield
|
883
|
-
ensure
|
884
|
-
@throw_error = old_throw_error
|
885
|
-
end
|
886
|
-
|
887
851
|
def catch_error(&block)
|
888
852
|
old_throw_error, @throw_error = @throw_error, true
|
889
853
|
pos = @scanner.pos
|
@@ -913,6 +877,16 @@ MESSAGE
|
|
913
877
|
|
914
878
|
# @private
|
915
879
|
def self.expected(scanner, expected, line)
|
880
|
+
pos = scanner.pos
|
881
|
+
|
882
|
+
after = scanner.string[0...pos]
|
883
|
+
# Get rid of whitespace between pos and the last token,
|
884
|
+
# but only if there's a newline in there
|
885
|
+
after.gsub!(/\s*\n\s*$/, '')
|
886
|
+
# Also get rid of stuff before the last newline
|
887
|
+
after.gsub!(/.*\n/, '')
|
888
|
+
after = "..." + after[-15..-1] if after.size > 18
|
889
|
+
|
916
890
|
was = scanner.rest.dup
|
917
891
|
# Get rid of whitespace between pos and the next token,
|
918
892
|
# but only if there's a newline in there
|
@@ -922,24 +896,10 @@ MESSAGE
|
|
922
896
|
was = was[0...15] + "..." if was.size > 18
|
923
897
|
|
924
898
|
raise Sass::SyntaxError.new(
|
925
|
-
"Invalid CSS after \"#{
|
899
|
+
"Invalid CSS after \"#{after}\": expected #{expected}, was \"#{was}\"",
|
926
900
|
:line => line)
|
927
901
|
end
|
928
902
|
|
929
|
-
# @private
|
930
|
-
def self.prior_snippet(scanner)
|
931
|
-
pos = scanner.pos
|
932
|
-
|
933
|
-
after = scanner.string[0...pos]
|
934
|
-
# Get rid of whitespace between pos and the last token,
|
935
|
-
# but only if there's a newline in there
|
936
|
-
after.gsub!(/\s*\n\s*$/, '')
|
937
|
-
# Also get rid of stuff before the last newline
|
938
|
-
after.gsub!(/.*\n/, '')
|
939
|
-
after = "..." + after[-15..-1] if after.size > 18
|
940
|
-
after
|
941
|
-
end
|
942
|
-
|
943
903
|
# Avoid allocating lots of new strings for `#tok`.
|
944
904
|
# This is important because `#tok` is called all the time.
|
945
905
|
NEWLINE = "\n"
|