sass 3.5.2 → 3.7.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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