sass 3.5.2 → 3.7.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (163) hide show
  1. checksums.yaml +4 -4
  2. data/CODE_OF_CONDUCT.md +1 -1
  3. data/CONTRIBUTING.md +3 -3
  4. data/README.md +17 -9
  5. data/VERSION +1 -1
  6. data/VERSION_DATE +1 -1
  7. data/extra/sass-spec-ref.sh +9 -1
  8. data/lib/sass/engine.rb +1 -9
  9. data/lib/sass/exec/base.rb +0 -2
  10. data/lib/sass/exec/sass_scss.rb +1 -5
  11. data/lib/sass/importers/filesystem.rb +4 -2
  12. data/lib/sass/logger/base.rb +11 -0
  13. data/lib/sass/script/css_parser.rb +4 -1
  14. data/lib/sass/script/functions.rb +76 -41
  15. data/lib/sass/script/lexer.rb +62 -19
  16. data/lib/sass/script/parser.rb +260 -93
  17. data/lib/sass/script/tree/funcall.rb +0 -4
  18. data/lib/sass/script/tree/interpolation.rb +0 -3
  19. data/lib/sass/script/tree/operation.rb +1 -1
  20. data/lib/sass/script/value/color.rb +3 -2
  21. data/lib/sass/script/value/helpers.rb +8 -2
  22. data/lib/sass/script/value/number.rb +2 -1
  23. data/lib/sass/scss/css_parser.rb +6 -1
  24. data/lib/sass/scss/parser.rb +48 -18
  25. data/lib/sass/scss/rx.rb +1 -1
  26. data/lib/sass/scss/static_parser.rb +15 -18
  27. data/lib/sass/selector/comma_sequence.rb +2 -1
  28. data/lib/sass/selector/pseudo.rb +1 -1
  29. data/lib/sass/selector/sequence.rb +0 -4
  30. data/lib/sass/source/map.rb +0 -4
  31. data/lib/sass/tree/rule_node.rb +3 -6
  32. data/lib/sass/tree/visitors/perform.rb +2 -6
  33. data/lib/sass/tree/visitors/to_css.rb +4 -11
  34. data/lib/sass/util.rb +60 -20
  35. data/lib/sass/version.rb +0 -2
  36. metadata +38 -162
  37. data/Rakefile +0 -338
  38. data/lib/test.css +0 -4
  39. data/lib/test.css.map +0 -7
  40. data/test/sass-spec.yml +0 -3
  41. data/test/sass/cache_test.rb +0 -130
  42. data/test/sass/callbacks_test.rb +0 -60
  43. data/test/sass/compiler_test.rb +0 -225
  44. data/test/sass/conversion_test.rb +0 -2138
  45. data/test/sass/css2sass_test.rb +0 -523
  46. data/test/sass/css_variable_test.rb +0 -237
  47. data/test/sass/data/hsl-rgb.txt +0 -319
  48. data/test/sass/encoding_test.rb +0 -188
  49. data/test/sass/engine_test.rb +0 -3499
  50. data/test/sass/exec_test.rb +0 -95
  51. data/test/sass/extend_test.rb +0 -1678
  52. data/test/sass/fixtures/test_staleness_check_across_importers.css +0 -1
  53. data/test/sass/fixtures/test_staleness_check_across_importers.scss +0 -1
  54. data/test/sass/functions_test.rb +0 -2021
  55. data/test/sass/importer_test.rb +0 -420
  56. data/test/sass/logger_test.rb +0 -57
  57. data/test/sass/mock_importer.rb +0 -49
  58. data/test/sass/more_results/more1.css +0 -9
  59. data/test/sass/more_results/more1_with_line_comments.css +0 -26
  60. data/test/sass/more_results/more_import.css +0 -29
  61. data/test/sass/more_templates/_more_partial.sass +0 -2
  62. data/test/sass/more_templates/more1.sass +0 -23
  63. data/test/sass/more_templates/more_import.sass +0 -11
  64. data/test/sass/plugin_test.rb +0 -552
  65. data/test/sass/results/alt.css +0 -4
  66. data/test/sass/results/basic.css +0 -9
  67. data/test/sass/results/cached_import_option.css +0 -3
  68. data/test/sass/results/compact.css +0 -5
  69. data/test/sass/results/complex.css +0 -86
  70. data/test/sass/results/compressed.css +0 -1
  71. data/test/sass/results/expanded.css +0 -19
  72. data/test/sass/results/filename_fn.css +0 -3
  73. data/test/sass/results/if.css +0 -3
  74. data/test/sass/results/import.css +0 -31
  75. data/test/sass/results/import_charset.css +0 -5
  76. data/test/sass/results/import_charset_ibm866.css +0 -5
  77. data/test/sass/results/import_content.css +0 -1
  78. data/test/sass/results/line_numbers.css +0 -49
  79. data/test/sass/results/mixins.css +0 -95
  80. data/test/sass/results/multiline.css +0 -24
  81. data/test/sass/results/nested.css +0 -22
  82. data/test/sass/results/options.css +0 -1
  83. data/test/sass/results/parent_ref.css +0 -13
  84. data/test/sass/results/script.css +0 -16
  85. data/test/sass/results/scss_import.css +0 -31
  86. data/test/sass/results/scss_importee.css +0 -2
  87. data/test/sass/results/subdir/nested_subdir/nested_subdir.css +0 -1
  88. data/test/sass/results/subdir/subdir.css +0 -3
  89. data/test/sass/results/units.css +0 -11
  90. data/test/sass/results/warn.css +0 -0
  91. data/test/sass/results/warn_imported.css +0 -0
  92. data/test/sass/script_conversion_test.rb +0 -365
  93. data/test/sass/script_test.rb +0 -1429
  94. data/test/sass/scss/css_test.rb +0 -1266
  95. data/test/sass/scss/rx_test.rb +0 -159
  96. data/test/sass/scss/scss_test.rb +0 -4238
  97. data/test/sass/scss/test_helper.rb +0 -37
  98. data/test/sass/source_map_test.rb +0 -1052
  99. data/test/sass/superselector_test.rb +0 -209
  100. data/test/sass/templates/_cached_import_option_partial.scss +0 -1
  101. data/test/sass/templates/_double_import_loop2.sass +0 -1
  102. data/test/sass/templates/_filename_fn_import.scss +0 -11
  103. data/test/sass/templates/_imported_charset_ibm866.sass +0 -4
  104. data/test/sass/templates/_imported_charset_utf8.sass +0 -4
  105. data/test/sass/templates/_imported_content.sass +0 -3
  106. data/test/sass/templates/_partial.sass +0 -2
  107. data/test/sass/templates/_same_name_different_partiality.scss +0 -1
  108. data/test/sass/templates/alt.sass +0 -16
  109. data/test/sass/templates/basic.sass +0 -23
  110. data/test/sass/templates/bork1.sass +0 -2
  111. data/test/sass/templates/bork2.sass +0 -2
  112. data/test/sass/templates/bork3.sass +0 -2
  113. data/test/sass/templates/bork4.sass +0 -2
  114. data/test/sass/templates/bork5.sass +0 -3
  115. data/test/sass/templates/cached_import_option.scss +0 -3
  116. data/test/sass/templates/compact.sass +0 -17
  117. data/test/sass/templates/complex.sass +0 -305
  118. data/test/sass/templates/compressed.sass +0 -15
  119. data/test/sass/templates/double_import_loop1.sass +0 -1
  120. data/test/sass/templates/expanded.sass +0 -17
  121. data/test/sass/templates/filename_fn.scss +0 -18
  122. data/test/sass/templates/if.sass +0 -11
  123. data/test/sass/templates/import.sass +0 -12
  124. data/test/sass/templates/import_charset.sass +0 -9
  125. data/test/sass/templates/import_charset_ibm866.sass +0 -11
  126. data/test/sass/templates/import_content.sass +0 -4
  127. data/test/sass/templates/importee.less +0 -2
  128. data/test/sass/templates/importee.sass +0 -19
  129. data/test/sass/templates/line_numbers.sass +0 -13
  130. data/test/sass/templates/mixin_bork.sass +0 -5
  131. data/test/sass/templates/mixins.sass +0 -76
  132. data/test/sass/templates/multiline.sass +0 -20
  133. data/test/sass/templates/nested.sass +0 -25
  134. data/test/sass/templates/nested_bork1.sass +0 -2
  135. data/test/sass/templates/nested_bork2.sass +0 -2
  136. data/test/sass/templates/nested_bork3.sass +0 -2
  137. data/test/sass/templates/nested_bork4.sass +0 -2
  138. data/test/sass/templates/nested_import.sass +0 -2
  139. data/test/sass/templates/nested_mixin_bork.sass +0 -6
  140. data/test/sass/templates/options.sass +0 -2
  141. data/test/sass/templates/parent_ref.sass +0 -25
  142. data/test/sass/templates/same_name_different_ext.sass +0 -2
  143. data/test/sass/templates/same_name_different_ext.scss +0 -1
  144. data/test/sass/templates/same_name_different_partiality.scss +0 -1
  145. data/test/sass/templates/script.sass +0 -101
  146. data/test/sass/templates/scss_import.scss +0 -12
  147. data/test/sass/templates/scss_importee.scss +0 -1
  148. data/test/sass/templates/single_import_loop.sass +0 -1
  149. data/test/sass/templates/subdir/import_up1.scss +0 -1
  150. data/test/sass/templates/subdir/import_up2.scss +0 -1
  151. data/test/sass/templates/subdir/nested_subdir/_nested_partial.sass +0 -2
  152. data/test/sass/templates/subdir/nested_subdir/nested_subdir.sass +0 -3
  153. data/test/sass/templates/subdir/subdir.sass +0 -6
  154. data/test/sass/templates/units.sass +0 -11
  155. data/test/sass/templates/warn.sass +0 -3
  156. data/test/sass/templates/warn_imported.sass +0 -4
  157. data/test/sass/test_helper.rb +0 -8
  158. data/test/sass/util/multibyte_string_scanner_test.rb +0 -152
  159. data/test/sass/util/normalized_map_test.rb +0 -50
  160. data/test/sass/util/subset_map_test.rb +0 -90
  161. data/test/sass/util_test.rb +0 -403
  162. data/test/sass/value_helpers_test.rb +0 -178
  163. data/test/test_helper.rb +0 -149
@@ -68,13 +68,11 @@ module Sass::Script::Tree
68
68
  def inspect
69
69
  args = @args.map {|a| a.inspect}.join(', ')
70
70
  keywords = @keywords.as_stored.to_a.map {|k, v| "$#{k}: #{v.inspect}"}.join(', ')
71
- # rubocop:disable RedundantSelf
72
71
  if self.splat
73
72
  splat = args.empty? && keywords.empty? ? "" : ", "
74
73
  splat = "#{splat}#{self.splat.inspect}..."
75
74
  splat = "#{splat}, #{kwarg_splat.inspect}..." if kwarg_splat
76
75
  end
77
- # rubocop:enable RedundantSelf
78
76
  "#{name}(#{args}#{', ' unless args.empty? || keywords.empty?}#{keywords}#{splat})"
79
77
  end
80
78
 
@@ -89,12 +87,10 @@ module Sass::Script::Tree
89
87
  args = @args.map(&arg_to_sass)
90
88
  keywords = @keywords.as_stored.to_a.map {|k, v| "$#{dasherize(k, opts)}: #{arg_to_sass[v]}"}
91
89
 
92
- # rubocop:disable RedundantSelf
93
90
  if self.splat
94
91
  splat = "#{arg_to_sass[self.splat]}..."
95
92
  kwarg_splat = "#{arg_to_sass[self.kwarg_splat]}..." if self.kwarg_splat
96
93
  end
97
- # rubocop:enable RedundantSelf
98
94
 
99
95
  arglist = [args, splat, keywords, kwarg_splat].flatten.compact.join(', ')
100
96
  "#{dasherize(name, opts)}(#{arglist})"
@@ -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
@@ -111,7 +111,7 @@ module Sass::Script::Tree
111
111
  @@color_arithmetic_deprecation.warn(filename, line, <<WARNING)
112
112
  The operation `#{value1} #{@operator} #{value2}` is deprecated and will be an error in future versions.
113
113
  Consider using Sass's color functions instead.
114
- http://sass-lang.com/documentation/Sass/Script/Functions.html#other_color_functions
114
+ https://sass-lang.com/documentation/Sass/Script/Functions.html#other_color_functions
115
115
  WARNING
116
116
  end
117
117
 
@@ -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})$/i ||
281
- hex_string =~ /^#?([0-9a-f])([0-9a-f])([0-9a-f])$/i
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}
@@ -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
  #
@@ -215,6 +213,14 @@ module Sass::Script::Value
215
213
  literal.is_a?(Sass::Script::Value::String) && literal.value =~ /calc\(/
216
214
  end
217
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
+
218
224
  # Returns whether the literal is a special CSS value that may evaluate to a
219
225
  # number, such as `calc()` or `var()`.
220
226
  #
@@ -189,6 +189,7 @@ module Sass::Script::Value
189
189
  # @raise [Sass::UnitConversionError] if `other` has incompatible units
190
190
  def mod(other)
191
191
  if other.is_a?(Number)
192
+ return Number.new(Float::NAN) if other.value == 0
192
193
  operate(other, :%)
193
194
  else
194
195
  raise NoMethodError.new(nil, :mod)
@@ -472,7 +473,7 @@ module Sass::Script::Value
472
473
  sans_common_units(@numerator_units, @denominator_units)
473
474
 
474
475
  @denominator_units.each_with_index do |d, i|
475
- next unless convertable?(d) && (u = @numerator_units.find(&method(:convertable?)))
476
+ next unless convertable?(d) && (u = @numerator_units.find {|n| convertable?([n, d])})
476
477
  @value /= conversion_factor(d, u)
477
478
  @denominator_units.delete_at(i)
478
479
  @numerator_units.delete_at(@numerator_units.index(u))
@@ -47,7 +47,12 @@ module Sass
47
47
  def keyframes_ruleset
48
48
  start_pos = source_position
49
49
  return unless (selector = keyframes_selector)
50
- block(node(Sass::Tree::KeyframeRuleNode.new(selector.strip), start_pos), :ruleset)
50
+ block(
51
+ node(
52
+ Sass::Tree::KeyframeRuleNode.new(
53
+ Sass::Util.strip_except_escapes(selector)),
54
+ start_pos),
55
+ :ruleset)
51
56
  end
52
57
 
53
58
  @sass_script_parser = Sass::Script::CssParser
@@ -203,7 +203,7 @@ module Sass
203
203
  def directive
204
204
  start_pos = source_position
205
205
  return unless tok(/@/)
206
- name = tok!(IDENT)
206
+ name = ident!
207
207
  ss
208
208
 
209
209
  if (dir = special_directive(name, start_pos))
@@ -240,14 +240,14 @@ module Sass
240
240
  end
241
241
 
242
242
  def mixin_directive(start_pos)
243
- name = tok! IDENT
243
+ name = ident!
244
244
  args, splat = sass_script(:parse_mixin_definition_arglist)
245
245
  ss
246
246
  block(node(Sass::Tree::MixinDefNode.new(name, args, splat), start_pos), :directive)
247
247
  end
248
248
 
249
249
  def include_directive(start_pos)
250
- name = tok! IDENT
250
+ name = ident!
251
251
  args, keywords, splat, kwarg_splat = sass_script(:parse_mixin_include_arglist)
252
252
  ss
253
253
  include_node = node(
@@ -266,7 +266,7 @@ module Sass
266
266
  end
267
267
 
268
268
  def function_directive(start_pos)
269
- name = tok! IDENT
269
+ name = ident!
270
270
  args, splat = sass_script(:parse_function_definition_arglist)
271
271
  ss
272
272
  block(node(Sass::Tree::FunctionNode.new(name, args, splat), start_pos), :function)
@@ -286,7 +286,7 @@ module Sass
286
286
 
287
287
  def for_directive(start_pos)
288
288
  tok!(/\$/)
289
- var = tok! IDENT
289
+ var = ident!
290
290
  ss
291
291
 
292
292
  tok!(/from/)
@@ -303,12 +303,12 @@ module Sass
303
303
 
304
304
  def each_directive(start_pos)
305
305
  tok!(/\$/)
306
- vars = [tok!(IDENT)]
306
+ vars = [ident!]
307
307
  ss
308
308
  while tok(/,/)
309
309
  ss
310
310
  tok!(/\$/)
311
- vars << tok!(IDENT)
311
+ vars << ident!
312
312
  ss
313
313
  end
314
314
 
@@ -477,12 +477,23 @@ module Sass
477
477
  return unless tok(/\(/)
478
478
  res = ['(']
479
479
  ss
480
- res << sass_script(:parse)
480
+ stop_at = Set[:single_eq, :lt, :lte, :gt, :gte]
481
+ res << sass_script(:parse_until, stop_at)
481
482
 
482
483
  if tok(/:/)
483
484
  res << ': '
484
485
  ss
485
486
  res << sass_script(:parse)
487
+ elsif comparison1 = tok(/=|[<>]=?/)
488
+ res << ' ' << comparison1 << ' '
489
+ ss
490
+ res << sass_script(:parse_until, stop_at)
491
+ if ((comparison1 == ">" || comparison1 == ">=") && comparison2 = tok(/>=?/)) ||
492
+ ((comparison1 == "<" || comparison1 == "<=") && comparison2 = tok(/<=?/))
493
+ res << ' ' << comparison2 << ' '
494
+ ss
495
+ res << sass_script(:parse_until, stop_at)
496
+ end
486
497
  end
487
498
  res << tok!(/\)/)
488
499
  ss
@@ -542,10 +553,10 @@ module Sass
542
553
  end
543
554
 
544
555
  def at_root_directive_list
545
- return unless (first = tok(IDENT))
556
+ return unless (first = ident)
546
557
  arr = [first]
547
558
  ss
548
- while (e = tok(IDENT))
559
+ while (e = ident)
549
560
  arr << e
550
561
  ss
551
562
  end
@@ -636,12 +647,12 @@ module Sass
636
647
  def variable
637
648
  return unless tok(/\$/)
638
649
  start_pos = source_position
639
- name = tok!(IDENT)
650
+ name = ident!
640
651
  ss; tok!(/:/); ss
641
652
 
642
653
  expr = sass_script(:parse)
643
654
  while tok(/!/)
644
- flag_name = tok!(IDENT)
655
+ flag_name = ident!
645
656
  if flag_name == 'default'
646
657
  guarded ||= true
647
658
  elsif flag_name == 'global'
@@ -898,7 +909,7 @@ module Sass
898
909
  (?!
899
910
  url\(
900
911
  )
901
- [^()\[\]{}"'#/ \t\r\n\f#{top_level ? ";!" : ""}]
912
+ [^()\[\]{}"'#/ \t\r\n\f#{top_level ? ";" : ""}]
902
913
  |
903
914
  \#(?!\{)
904
915
  |
@@ -980,7 +991,10 @@ module Sass
980
991
  # containing the value.
981
992
  # This results in a dramatic speed increase.
982
993
  if (val = tok(STATIC_VALUE))
983
- str = Sass::Script::Tree::Literal.new(Sass::Script::Value::String.new(val.strip))
994
+ # If val ends with escaped whitespace, leave it be.
995
+ str = Sass::Script::Tree::Literal.new(
996
+ Sass::Script::Value::String.new(
997
+ Sass::Util.strip_except_escapes(val)))
984
998
  str.line = start_pos.line
985
999
  str.source_range = range(start_pos)
986
1000
  return str
@@ -1037,7 +1051,7 @@ module Sass
1037
1051
  def var_expr
1038
1052
  return unless tok(/\$/)
1039
1053
  line = @line
1040
- var = Sass::Script::Tree::Variable.new(tok!(IDENT))
1054
+ var = Sass::Script::Tree::Variable.new(ident!)
1041
1055
  var.line = line
1042
1056
  var
1043
1057
  end
@@ -1075,11 +1089,27 @@ module Sass
1075
1089
  res
1076
1090
  end
1077
1091
 
1078
- def interp_ident(start = IDENT)
1079
- val = tok(start) || interpolation(:warn_for_color) || tok(IDENT_HYPHEN_INTERP)
1092
+ def ident
1093
+ (ident = tok(IDENT)) && Sass::Util.normalize_ident_escapes(ident)
1094
+ end
1095
+
1096
+ def ident!
1097
+ Sass::Util.normalize_ident_escapes(tok!(IDENT))
1098
+ end
1099
+
1100
+ def name
1101
+ (name = tok(NAME)) && Sass::Util.normalize_ident_escapes(name)
1102
+ end
1103
+
1104
+ def name!
1105
+ Sass::Util.normalize_ident_escapes(tok!(NAME))
1106
+ end
1107
+
1108
+ def interp_ident
1109
+ val = ident || interpolation(:warn_for_color) || tok(IDENT_HYPHEN_INTERP)
1080
1110
  return unless val
1081
1111
  res = [val]
1082
- while (val = tok(NAME) || interpolation(:warn_for_color))
1112
+ while (val = name || interpolation(:warn_for_color))
1083
1113
  res << val
1084
1114
  end
1085
1115
  res
@@ -52,7 +52,7 @@ module Sass
52
52
  UNICODE = /\\#{H}{1,6}[ \t\r\n\f]?/
53
53
  s = '\u{80}-\u{D7FF}\u{E000}-\u{FFFD}\u{10000}-\u{10FFFF}'
54
54
  NONASCII = /[#{s}]/
55
- ESCAPE = /#{UNICODE}|\\[ -~#{s}]/
55
+ ESCAPE = /#{UNICODE}|\\[^0-9a-fA-F\r\n\f]/
56
56
  NMSTART = /[_a-zA-Z]|#{NONASCII}|#{ESCAPE}/
57
57
  NMCHAR = /[a-zA-Z0-9_-]|#{NONASCII}|#{ESCAPE}/
58
58
  STRING1 = /\"((?:[^\n\r\f\\"]|\\#{NL}|#{ESCAPE})*)\"/
@@ -51,10 +51,7 @@ module Sass
51
51
  # @see Parser#initialize
52
52
  # @param allow_parent_ref [Boolean] Whether to allow the
53
53
  # parent-reference selector, `&`, when parsing the document.
54
- # @comment
55
- # rubocop:disable ParameterLists
56
54
  def initialize(str, filename, importer, line = 1, offset = 1, allow_parent_ref = true)
57
- # rubocop:enable ParameterLists
58
55
  super(str, filename, importer, line, offset)
59
56
  @allow_parent_ref = allow_parent_ref
60
57
  end
@@ -74,7 +71,7 @@ module Sass
74
71
  def var_expr; nil; end
75
72
  def interp_string; (s = tok(STRING)) && [s]; end
76
73
  def interp_uri; (s = tok(URI)) && [s]; end
77
- def interp_ident(ident = IDENT); (s = tok(ident)) && [s]; end
74
+ def interp_ident; (s = ident) && [s]; end
78
75
  def use_css_import?; true; end
79
76
 
80
77
  def special_directive(name, start_pos)
@@ -188,25 +185,25 @@ MESSAGE
188
185
 
189
186
  def parent_selector
190
187
  return unless @allow_parent_ref && tok(/&/)
191
- Selector::Parent.new(tok(NAME))
188
+ Selector::Parent.new(name)
192
189
  end
193
190
 
194
191
  def class_selector
195
192
  return unless tok(/\./)
196
193
  @expected = "class name"
197
- Selector::Class.new(tok!(IDENT))
194
+ Selector::Class.new(ident!)
198
195
  end
199
196
 
200
197
  def id_selector
201
198
  return unless tok(/#(?!\{)/)
202
199
  @expected = "id name"
203
- Selector::Id.new(tok!(NAME))
200
+ Selector::Id.new(name!)
204
201
  end
205
202
 
206
203
  def placeholder_selector
207
204
  return unless tok(/%/)
208
205
  @expected = "placeholder name"
209
- Selector::Placeholder.new(tok!(IDENT))
206
+ Selector::Placeholder.new(ident!)
210
207
  end
211
208
 
212
209
  def element_name
@@ -221,13 +218,13 @@ MESSAGE
221
218
  end
222
219
 
223
220
  def qualified_name(allow_star_name = false)
224
- name = tok(IDENT) || tok(/\*/) || (tok?(/\|/) && "")
221
+ name = ident || tok(/\*/) || (tok?(/\|/) && "")
225
222
  return unless name
226
223
  return nil, name unless tok(/\|/)
227
224
 
228
- return name, tok!(IDENT) unless allow_star_name
225
+ return name, ident! unless allow_star_name
229
226
  @expected = "identifier or *"
230
- return name, tok(IDENT) || tok!(/\*/)
227
+ return name, ident || tok!(/\*/)
231
228
  end
232
229
 
233
230
  def attrib
@@ -245,21 +242,21 @@ MESSAGE
245
242
  if op
246
243
  @expected = "identifier or string"
247
244
  ss
248
- val = tok(IDENT) || tok!(STRING)
245
+ val = ident || tok!(STRING)
249
246
  ss
250
247
  end
251
- flags = tok(IDENT) || tok(STRING)
248
+ flags = ident || tok(STRING)
252
249
  tok!(/\]/)
253
250
 
254
251
  Selector::Attribute.new(name, ns, op, val, flags)
255
252
  end
256
253
 
257
254
  def attrib_name!
258
- if (name_or_ns = tok(IDENT))
255
+ if (name_or_ns = ident)
259
256
  # E, E|E
260
257
  if tok(/\|(?!=)/)
261
258
  ns = name_or_ns
262
- name = tok(IDENT)
259
+ name = ident
263
260
  else
264
261
  name = name_or_ns
265
262
  end
@@ -267,7 +264,7 @@ MESSAGE
267
264
  # *|E or |E
268
265
  ns = tok(/\*/) || ""
269
266
  tok!(/\|/)
270
- name = tok!(IDENT)
267
+ name = ident!
271
268
  end
272
269
  return ns, name
273
270
  end
@@ -282,7 +279,7 @@ MESSAGE
282
279
  s = tok(/::?/)
283
280
  return unless s
284
281
  @expected = "pseudoclass or pseudoelement"
285
- name = tok!(IDENT)
282
+ name = ident!
286
283
  if tok(/\(/)
287
284
  ss
288
285
  deprefixed = deprefix(name)
@@ -345,7 +342,7 @@ MESSAGE
345
342
  end
346
343
 
347
344
  def keyframes_selector_component
348
- tok(IDENT) || tok(PERCENTAGE)
345
+ ident || tok(PERCENTAGE)
349
346
  end
350
347
 
351
348
  @sass_script_parser = Class.new(Sass::Script::CssParser)
@@ -119,7 +119,8 @@ module Sass
119
119
  if !allow_compound_target && sel.length > 1
120
120
  @@compound_extend_deprecation.warn(sseq.filename, sseq.line, <<WARNING)
121
121
  Extending a compound selector, #{sseq}, is deprecated and will not be supported in a future release.
122
- See https://github.com/sass/sass/issues/1599 for details.
122
+ Consider "@extend #{sseq.members.join(', ')}" instead.
123
+ See http://bit.ly/ExtendCompound for details.
123
124
  WARNING
124
125
  end
125
126
 
@@ -134,7 +134,7 @@ module Sass
134
134
  res = (syntactic_type == :class ? ":" : "::") + @name
135
135
  if @arg || @selector
136
136
  res << "("
137
- res << @arg.strip if @arg
137
+ res << Sass::Util.strip_except_escapes(@arg) if @arg
138
138
  res << " " if @arg && @selector
139
139
  res << @selector.to_s(opts) if @selector
140
140
  res << ")"
@@ -344,8 +344,6 @@ module Sass
344
344
  # be nil. Otherwise, this will contained the merged selector. Array
345
345
  # elements are [Sass::Util#paths]-style options; conceptually, an "or"
346
346
  # of multiple selectors.
347
- # @comment
348
- # rubocop:disable MethodLength
349
347
  def merge_final_ops(seq1, seq2, res = [])
350
348
  ops1, ops2 = [], []
351
349
  ops1 << seq1.pop while seq1.last.is_a?(String)
@@ -427,8 +425,6 @@ module Sass
427
425
  return merge_final_ops(seq1, seq2, res)
428
426
  end
429
427
  end
430
- # @comment
431
- # rubocop:enable MethodLength
432
428
 
433
429
  # Takes initial subsequences of `seq1` and `seq2` and returns all
434
430
  # orderings of those subsequences. The initial subsequences are determined