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.

Files changed (148) hide show
  1. data/CONTRIBUTING +1 -1
  2. data/README.md +2 -2
  3. data/REVISION +1 -1
  4. data/Rakefile +16 -41
  5. data/VERSION +1 -1
  6. data/VERSION_NAME +1 -1
  7. data/lib/haml/buffer.rb +1 -5
  8. data/lib/haml/compiler.rb +7 -8
  9. data/lib/haml/exec.rb +1 -1
  10. data/lib/haml/helpers.rb +3 -5
  11. data/lib/haml/helpers/action_view_mods.rb +5 -21
  12. data/lib/haml/parser.rb +1 -1
  13. data/lib/haml/template.rb +1 -3
  14. data/lib/haml/util.rb +1 -1
  15. data/test/haml/engine_test.rb +12 -51
  16. data/test/haml/helper_test.rb +8 -25
  17. data/test/haml/html2haml_test.rb +1 -1
  18. data/test/haml/results/whitespace_handling.xhtml +50 -46
  19. data/test/haml/template_test.rb +2 -28
  20. data/test/haml/templates/partial_layout.haml +1 -4
  21. data/test/linked_rails.rb +4 -4
  22. data/vendor/sass/VERSION +1 -1
  23. data/vendor/sass/doc-src/SASS_CHANGELOG.md +2 -115
  24. data/vendor/sass/doc-src/SASS_REFERENCE.md +4 -12
  25. data/vendor/sass/lib/sass.rb +0 -1
  26. data/vendor/sass/lib/sass/cache_stores/base.rb +1 -3
  27. data/vendor/sass/lib/sass/cache_stores/filesystem.rb +0 -2
  28. data/vendor/sass/lib/sass/css.rb +1 -2
  29. data/vendor/sass/lib/sass/engine.rb +23 -39
  30. data/vendor/sass/lib/sass/environment.rb +0 -11
  31. data/vendor/sass/lib/sass/exec.rb +1 -14
  32. data/vendor/sass/lib/sass/importers/base.rb +1 -2
  33. data/vendor/sass/lib/sass/importers/filesystem.rb +13 -18
  34. data/vendor/sass/lib/sass/less.rb +2 -2
  35. data/vendor/sass/lib/sass/plugin.rb +8 -4
  36. data/vendor/sass/lib/sass/plugin/compiler.rb +17 -42
  37. data/vendor/sass/lib/sass/plugin/configuration.rb +2 -0
  38. data/vendor/sass/lib/sass/railtie.rb +1 -1
  39. data/vendor/sass/lib/sass/script/funcall.rb +1 -14
  40. data/vendor/sass/lib/sass/script/functions.rb +1 -44
  41. data/vendor/sass/lib/sass/script/interpolation.rb +0 -9
  42. data/vendor/sass/lib/sass/script/lexer.rb +1 -6
  43. data/vendor/sass/lib/sass/script/list.rb +0 -7
  44. data/vendor/sass/lib/sass/script/literal.rb +0 -5
  45. data/vendor/sass/lib/sass/script/node.rb +0 -8
  46. data/vendor/sass/lib/sass/script/number.rb +5 -28
  47. data/vendor/sass/lib/sass/script/operation.rb +0 -8
  48. data/vendor/sass/lib/sass/script/parser.rb +5 -12
  49. data/vendor/sass/lib/sass/script/string_interpolation.rb +0 -9
  50. data/vendor/sass/lib/sass/script/unary_operation.rb +0 -7
  51. data/vendor/sass/lib/sass/script/variable.rb +0 -5
  52. data/vendor/sass/lib/sass/scss/parser.rb +38 -78
  53. data/vendor/sass/lib/sass/scss/rx.rb +1 -2
  54. data/vendor/sass/lib/sass/scss/static_parser.rb +2 -2
  55. data/vendor/sass/lib/sass/shared.rb +1 -1
  56. data/vendor/sass/lib/sass/tree/comment_node.rb +11 -24
  57. data/vendor/sass/lib/sass/tree/debug_node.rb +1 -1
  58. data/vendor/sass/lib/sass/tree/each_node.rb +1 -1
  59. data/vendor/sass/lib/sass/tree/extend_node.rb +1 -1
  60. data/vendor/sass/lib/sass/tree/for_node.rb +2 -2
  61. data/vendor/sass/lib/sass/tree/function_node.rb +1 -1
  62. data/vendor/sass/lib/sass/tree/if_node.rb +14 -1
  63. data/vendor/sass/lib/sass/tree/mixin_def_node.rb +1 -1
  64. data/vendor/sass/lib/sass/tree/mixin_node.rb +2 -2
  65. data/vendor/sass/lib/sass/tree/node.rb +5 -2
  66. data/vendor/sass/lib/sass/tree/prop_node.rb +9 -2
  67. data/vendor/sass/lib/sass/tree/return_node.rb +1 -1
  68. data/vendor/sass/lib/sass/tree/rule_node.rb +2 -9
  69. data/vendor/sass/lib/sass/tree/variable_node.rb +1 -1
  70. data/vendor/sass/lib/sass/tree/visitors/check_nesting.rb +18 -17
  71. data/vendor/sass/lib/sass/tree/visitors/convert.rb +5 -10
  72. data/vendor/sass/lib/sass/tree/visitors/perform.rb +19 -50
  73. data/vendor/sass/lib/sass/tree/visitors/to_css.rb +15 -9
  74. data/vendor/sass/lib/sass/tree/warn_node.rb +1 -1
  75. data/vendor/sass/lib/sass/tree/while_node.rb +1 -1
  76. data/vendor/sass/lib/sass/util.rb +6 -58
  77. data/vendor/sass/sass.gemspec +1 -2
  78. data/vendor/sass/test/sass/cache_test.rb +0 -15
  79. data/vendor/sass/test/sass/conversion_test.rb +6 -2
  80. data/vendor/sass/test/sass/css2sass_test.rb +0 -9
  81. data/vendor/sass/test/sass/engine_test.rb +26 -124
  82. data/vendor/sass/test/sass/functions_test.rb +0 -13
  83. data/vendor/sass/test/sass/importer_test.rb +0 -110
  84. data/vendor/sass/test/sass/plugin_test.rb +13 -16
  85. data/vendor/sass/test/sass/script_conversion_test.rb +0 -2
  86. data/vendor/sass/test/sass/script_test.rb +0 -18
  87. data/vendor/sass/test/sass/scss/css_test.rb +1 -7
  88. data/vendor/sass/test/sass/scss/scss_test.rb +13 -37
  89. data/vendor/sass/test/sass/test_helper.rb +1 -1
  90. data/vendor/sass/test/sass/util_test.rb +0 -12
  91. data/vendor/sass/vendor/fssm/LICENSE +1 -1
  92. data/vendor/sass/vendor/fssm/README.markdown +27 -55
  93. data/vendor/sass/vendor/fssm/Rakefile +54 -6
  94. data/vendor/sass/vendor/fssm/VERSION.yml +5 -0
  95. data/vendor/sass/vendor/fssm/example.rb +3 -6
  96. data/vendor/sass/vendor/fssm/fssm.gemspec +70 -17
  97. data/vendor/sass/vendor/fssm/lib/fssm.rb +3 -7
  98. data/vendor/sass/vendor/fssm/lib/fssm/backends/fsevents.rb +1 -1
  99. data/vendor/sass/vendor/fssm/lib/fssm/backends/inotify.rb +2 -2
  100. data/vendor/sass/vendor/fssm/lib/fssm/backends/polling.rb +2 -2
  101. data/vendor/sass/vendor/fssm/lib/fssm/backends/rubycocoa/fsevents.rb +10 -10
  102. data/vendor/sass/vendor/fssm/lib/fssm/monitor.rb +9 -19
  103. data/vendor/sass/vendor/fssm/lib/fssm/path.rb +21 -24
  104. data/vendor/sass/vendor/fssm/lib/fssm/pathname.rb +479 -13
  105. data/vendor/sass/vendor/fssm/lib/fssm/state/directory.rb +11 -29
  106. data/vendor/sass/vendor/fssm/lib/fssm/state/file.rb +1 -1
  107. data/vendor/sass/vendor/fssm/lib/fssm/support.rb +12 -41
  108. data/vendor/sass/vendor/fssm/lib/fssm/tree.rb +6 -6
  109. data/vendor/sass/vendor/fssm/profile/prof-cache.rb +3 -3
  110. data/vendor/sass/vendor/fssm/profile/prof-pathname.rb +7 -7
  111. data/vendor/sass/vendor/fssm/spec/path_spec.rb +15 -36
  112. data/vendor/sass/vendor/fssm/spec/spec_helper.rb +6 -6
  113. metadata +78 -125
  114. data/lib/haml/helpers/rails_323_textarea_fix.rb +0 -41
  115. data/test/gemfiles/Gemfile.rails-2.0.x +0 -8
  116. data/test/gemfiles/Gemfile.rails-2.0.x.lock +0 -38
  117. data/test/gemfiles/Gemfile.rails-2.1.x +0 -8
  118. data/test/gemfiles/Gemfile.rails-2.1.x.lock +0 -38
  119. data/test/gemfiles/Gemfile.rails-2.2.x +0 -8
  120. data/test/gemfiles/Gemfile.rails-2.2.x.lock +0 -38
  121. data/test/gemfiles/Gemfile.rails-2.3.x +0 -8
  122. data/test/gemfiles/Gemfile.rails-2.3.x.lock +0 -40
  123. data/test/gemfiles/Gemfile.rails-3.0.x +0 -8
  124. data/test/gemfiles/Gemfile.rails-3.0.x.lock +0 -85
  125. data/test/gemfiles/Gemfile.rails-3.1.x +0 -8
  126. data/test/gemfiles/Gemfile.rails-3.1.x.lock +0 -97
  127. data/test/gemfiles/Gemfile.rails-3.2.x +0 -8
  128. data/test/gemfiles/Gemfile.rails-3.2.x.lock +0 -95
  129. data/test/gemfiles/Gemfile.rails-xss-2.3.x +0 -9
  130. data/test/gemfiles/Gemfile.rails-xss-2.3.x.lock +0 -42
  131. data/vendor/sass/lib/sass/logger.rb +0 -15
  132. data/vendor/sass/lib/sass/logger/base.rb +0 -32
  133. data/vendor/sass/lib/sass/logger/log_level.rb +0 -49
  134. data/vendor/sass/lib/sass/tree/visitors/deep_copy.rb +0 -87
  135. data/vendor/sass/lib/sass/tree/visitors/set_options.rb +0 -97
  136. data/vendor/sass/test/Gemfile +0 -4
  137. data/vendor/sass/test/Gemfile.lock +0 -19
  138. data/vendor/sass/test/sass/fixtures/test_staleness_check_across_importers.css +0 -1
  139. data/vendor/sass/test/sass/fixtures/test_staleness_check_across_importers.scss +0 -1
  140. data/vendor/sass/test/sass/logger_test.rb +0 -58
  141. data/vendor/sass/test/sass/templates/bork5.sass +0 -3
  142. data/vendor/sass/test/sass/templates/nested_bork5.sass +0 -2
  143. data/vendor/sass/vendor/fssm/Gemfile +0 -3
  144. data/vendor/sass/vendor/fssm/lib/fssm/backends/rbfsevent.rb +0 -42
  145. data/vendor/sass/vendor/fssm/lib/fssm/version.rb +0 -3
  146. data/vendor/sass/vendor/fssm/profile/prof-pathname-rubinius.rb +0 -35
  147. data/vendor/sass/vendor/fssm/spec/count_down_latch.rb +0 -151
  148. data/vendor/sass/vendor/fssm/spec/monitor_spec.rb +0 -202
@@ -31,6 +31,8 @@ module Sass
31
31
  # @return [{Symbol => Object}]
32
32
  def options
33
33
  @options ||= default_options.dup
34
+ @options[:cache_store] ||= Sass::CacheStores::Filesystem.new(@options[:cache_location])
35
+ @options
34
36
  end
35
37
 
36
38
  # Sets the options hash.
@@ -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(:before_configuration) do
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
- # If this is a legitimate Ruby-raised argument error, re-raise it.
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 || special_val || ident_op || ident || op
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(
@@ -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}]
@@ -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
- def self.precision
39
- @precision ||= 3
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
- def self.precision=(digits)
46
- @precision = digits.round
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 * self.precision_factor).round / self.precision_factor
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
- if interp = try_op_before_interp(tok, e)
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
- if interp = try_op_before_interp(tok, e)
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, prev = nil)
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, prev) and return interp
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(prev, str, assert_expr(name), !:wb, wa, :originally_text)
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.
@@ -38,13 +38,6 @@ module Sass::Script
38
38
  [@operand]
39
39
  end
40
40
 
41
- # @see Node#deep_copy
42
- def deep_copy
43
- node = dup
44
- node.instance_variable_set('@operand', @operand.deep_copy)
45
- node
46
- end
47
-
48
41
  protected
49
42
 
50
43
  # Evaluates the operation.
@@ -34,11 +34,6 @@ module Sass
34
34
  []
35
35
  end
36
36
 
37
- # @see Node#deep_copy
38
- def deep_copy
39
- dup
40
- end
41
-
42
37
  protected
43
38
 
44
39
  # Evaluates the variable.
@@ -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, filename, line = 1)
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
- silent = text =~ /^\/\//
93
- line = @line - text.count("\n")
94
- if loud = text =~ %r{^/[/*]!}
95
- value = Sass::Engine.parse_interp(text, line, @scanner.pos - text.size, :filename => @filename)
96
- value[0].slice!(2) # get rid of the "!"
97
- else
98
- value = [text]
99
- end
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 = id_selector || class_selector || attrib || negation || pseudo ||
507
- interpolation_selector || (tok(/\*/) && Selector::Universal.new(nil))
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
- pos = @scanner.pos
512
- line = @line
513
- if sel = str? {simple_selector_sequence}
514
- @scanner.pos = pos
515
- @line = line
516
-
517
- if sel =~ /^&/
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 || tok(IDENT_HYPHEN_INTERP)
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?(&block)
794
- pos = @scanner.pos
795
- line = @line
770
+ def str?
796
771
  @strs.push ""
797
- throw_error(&block) && @strs.last
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 \"#{prior_snippet(scanner)}\": expected #{expected}, was \"#{was}\"",
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"