sass 3.7.4 → 4.0.0.alpha.1

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 (257) hide show
  1. checksums.yaml +13 -5
  2. data/.yardopts +1 -1
  3. data/CODE_OF_CONDUCT.md +1 -1
  4. data/CONTRIBUTING.md +1 -146
  5. data/MIT-LICENSE +1 -1
  6. data/README.md +25 -39
  7. data/Rakefile +274 -0
  8. data/VERSION +1 -1
  9. data/VERSION_DATE +1 -1
  10. data/lib/sass.rb +3 -3
  11. data/lib/sass/cache_stores/filesystem.rb +2 -2
  12. data/lib/sass/cache_stores/memory.rb +5 -4
  13. data/lib/sass/callbacks.rb +2 -2
  14. data/lib/sass/css.rb +12 -12
  15. data/lib/sass/engine.rb +44 -62
  16. data/lib/sass/environment.rb +7 -35
  17. data/lib/sass/error.rb +14 -14
  18. data/lib/sass/exec/base.rb +14 -3
  19. data/lib/sass/exec/sass_convert.rb +6 -20
  20. data/lib/sass/exec/sass_scss.rb +29 -5
  21. data/lib/sass/features.rb +2 -3
  22. data/lib/sass/importers/filesystem.rb +6 -11
  23. data/lib/sass/logger.rb +3 -8
  24. data/lib/sass/logger/base.rb +2 -19
  25. data/lib/sass/plugin.rb +2 -3
  26. data/lib/sass/plugin/compiler.rb +67 -48
  27. data/lib/sass/plugin/configuration.rb +3 -3
  28. data/lib/sass/plugin/merb.rb +1 -1
  29. data/lib/sass/plugin/rack.rb +3 -3
  30. data/lib/sass/plugin/staleness_checker.rb +3 -3
  31. data/lib/sass/railtie.rb +1 -1
  32. data/lib/sass/script.rb +3 -3
  33. data/lib/sass/script/css_parser.rb +15 -5
  34. data/lib/sass/script/functions.rb +121 -337
  35. data/lib/sass/script/lexer.rb +36 -102
  36. data/lib/sass/script/parser.rb +153 -529
  37. data/lib/sass/script/tree/funcall.rb +34 -42
  38. data/lib/sass/script/tree/interpolation.rb +26 -171
  39. data/lib/sass/script/tree/list_literal.rb +8 -23
  40. data/lib/sass/script/tree/map_literal.rb +2 -2
  41. data/lib/sass/script/tree/node.rb +3 -3
  42. data/lib/sass/script/tree/operation.rb +16 -43
  43. data/lib/sass/script/tree/string_interpolation.rb +43 -64
  44. data/lib/sass/script/tree/variable.rb +1 -1
  45. data/lib/sass/script/value.rb +0 -2
  46. data/lib/sass/script/value/arg_list.rb +1 -1
  47. data/lib/sass/script/value/base.rb +9 -27
  48. data/lib/sass/script/value/color.rb +18 -26
  49. data/lib/sass/script/value/helpers.rb +18 -44
  50. data/lib/sass/script/value/list.rb +14 -35
  51. data/lib/sass/script/value/map.rb +2 -2
  52. data/lib/sass/script/value/number.rb +16 -26
  53. data/lib/sass/script/value/string.rb +1 -30
  54. data/lib/sass/scss.rb +2 -0
  55. data/lib/sass/scss/css_parser.rb +3 -7
  56. data/lib/sass/scss/parser.rb +78 -196
  57. data/lib/sass/scss/rx.rb +14 -7
  58. data/lib/sass/scss/script_lexer.rb +15 -0
  59. data/lib/sass/scss/script_parser.rb +25 -0
  60. data/lib/sass/scss/static_parser.rb +55 -38
  61. data/lib/sass/selector.rb +10 -7
  62. data/lib/sass/selector/abstract_sequence.rb +12 -15
  63. data/lib/sass/selector/comma_sequence.rb +6 -24
  64. data/lib/sass/selector/pseudo.rb +6 -19
  65. data/lib/sass/selector/sequence.rb +16 -14
  66. data/lib/sass/selector/simple.rb +7 -9
  67. data/lib/sass/selector/simple_sequence.rb +12 -16
  68. data/lib/sass/shared.rb +1 -1
  69. data/lib/sass/source/map.rb +9 -7
  70. data/lib/sass/source/position.rb +4 -4
  71. data/lib/sass/stack.rb +3 -23
  72. data/lib/sass/tree/charset_node.rb +1 -1
  73. data/lib/sass/tree/comment_node.rb +1 -1
  74. data/lib/sass/tree/function_node.rb +3 -2
  75. data/lib/sass/tree/node.rb +3 -5
  76. data/lib/sass/tree/prop_node.rb +58 -49
  77. data/lib/sass/tree/rule_node.rb +8 -15
  78. data/lib/sass/tree/visitors/check_nesting.rb +23 -19
  79. data/lib/sass/tree/visitors/convert.rb +13 -15
  80. data/lib/sass/tree/visitors/cssize.rb +15 -4
  81. data/lib/sass/tree/visitors/deep_copy.rb +2 -2
  82. data/lib/sass/tree/visitors/extend.rb +14 -10
  83. data/lib/sass/tree/visitors/perform.rb +18 -29
  84. data/lib/sass/tree/visitors/set_options.rb +2 -2
  85. data/lib/sass/tree/visitors/to_css.rb +47 -77
  86. data/lib/sass/util.rb +311 -98
  87. data/lib/sass/util/cross_platform_random.rb +19 -0
  88. data/lib/sass/util/multibyte_string_scanner.rb +133 -127
  89. data/lib/sass/util/normalized_map.rb +8 -1
  90. data/lib/sass/util/ordered_hash.rb +192 -0
  91. data/lib/sass/version.rb +6 -2
  92. data/test/sass/cache_test.rb +131 -0
  93. data/test/sass/callbacks_test.rb +61 -0
  94. data/test/sass/compiler_test.rb +236 -0
  95. data/test/sass/conversion_test.rb +2171 -0
  96. data/test/sass/css2sass_test.rb +526 -0
  97. data/test/sass/data/hsl-rgb.txt +319 -0
  98. data/test/sass/encoding_test.rb +219 -0
  99. data/test/sass/engine_test.rb +3400 -0
  100. data/test/sass/exec_test.rb +86 -0
  101. data/test/sass/extend_test.rb +1719 -0
  102. data/test/sass/fixtures/test_staleness_check_across_importers.css +1 -0
  103. data/test/sass/fixtures/test_staleness_check_across_importers.scss +1 -0
  104. data/test/sass/functions_test.rb +1984 -0
  105. data/test/sass/importer_test.rb +421 -0
  106. data/test/sass/logger_test.rb +58 -0
  107. data/test/sass/mock_importer.rb +49 -0
  108. data/test/sass/more_results/more1.css +9 -0
  109. data/test/sass/more_results/more1_with_line_comments.css +26 -0
  110. data/test/sass/more_results/more_import.css +29 -0
  111. data/test/sass/more_templates/_more_partial.sass +2 -0
  112. data/test/sass/more_templates/more1.sass +23 -0
  113. data/test/sass/more_templates/more_import.sass +11 -0
  114. data/test/sass/plugin_test.rb +556 -0
  115. data/test/sass/results/alt.css +4 -0
  116. data/test/sass/results/basic.css +9 -0
  117. data/test/sass/results/cached_import_option.css +3 -0
  118. data/test/sass/results/compact.css +5 -0
  119. data/test/sass/results/complex.css +86 -0
  120. data/test/sass/results/compressed.css +1 -0
  121. data/test/sass/results/expanded.css +19 -0
  122. data/test/sass/results/filename_fn.css +3 -0
  123. data/test/sass/results/if.css +3 -0
  124. data/test/sass/results/import.css +31 -0
  125. data/test/sass/results/import_charset.css +5 -0
  126. data/test/sass/results/import_charset_1_8.css +5 -0
  127. data/test/sass/results/import_charset_ibm866.css +5 -0
  128. data/test/sass/results/import_content.css +1 -0
  129. data/test/sass/results/line_numbers.css +49 -0
  130. data/test/sass/results/mixins.css +95 -0
  131. data/test/sass/results/multiline.css +24 -0
  132. data/test/sass/results/nested.css +22 -0
  133. data/test/sass/results/options.css +1 -0
  134. data/test/sass/results/parent_ref.css +13 -0
  135. data/test/sass/results/script.css +16 -0
  136. data/test/sass/results/scss_import.css +31 -0
  137. data/test/sass/results/scss_importee.css +2 -0
  138. data/test/sass/results/subdir/nested_subdir/nested_subdir.css +1 -0
  139. data/test/sass/results/subdir/subdir.css +3 -0
  140. data/test/sass/results/units.css +11 -0
  141. data/test/sass/results/warn.css +0 -0
  142. data/test/sass/results/warn_imported.css +0 -0
  143. data/test/sass/script_conversion_test.rb +306 -0
  144. data/test/sass/script_test.rb +1206 -0
  145. data/test/sass/scss/css_test.rb +1281 -0
  146. data/test/sass/scss/rx_test.rb +160 -0
  147. data/test/sass/scss/scss_test.rb +4147 -0
  148. data/test/sass/scss/test_helper.rb +37 -0
  149. data/test/sass/source_map_test.rb +1055 -0
  150. data/test/sass/superselector_test.rb +210 -0
  151. data/test/sass/templates/_cached_import_option_partial.scss +1 -0
  152. data/test/sass/templates/_double_import_loop2.sass +1 -0
  153. data/test/sass/templates/_filename_fn_import.scss +11 -0
  154. data/test/sass/templates/_imported_charset_ibm866.sass +4 -0
  155. data/test/sass/templates/_imported_charset_utf8.sass +4 -0
  156. data/test/sass/templates/_imported_content.sass +3 -0
  157. data/test/sass/templates/_partial.sass +2 -0
  158. data/test/sass/templates/_same_name_different_partiality.scss +1 -0
  159. data/test/sass/templates/alt.sass +16 -0
  160. data/test/sass/templates/basic.sass +23 -0
  161. data/test/sass/templates/bork1.sass +2 -0
  162. data/test/sass/templates/bork2.sass +2 -0
  163. data/test/sass/templates/bork3.sass +2 -0
  164. data/test/sass/templates/bork4.sass +2 -0
  165. data/test/sass/templates/bork5.sass +3 -0
  166. data/test/sass/templates/cached_import_option.scss +3 -0
  167. data/test/sass/templates/compact.sass +17 -0
  168. data/test/sass/templates/complex.sass +305 -0
  169. data/test/sass/templates/compressed.sass +15 -0
  170. data/test/sass/templates/double_import_loop1.sass +1 -0
  171. data/test/sass/templates/expanded.sass +17 -0
  172. data/test/sass/templates/filename_fn.scss +18 -0
  173. data/test/sass/templates/if.sass +11 -0
  174. data/test/sass/templates/import.sass +12 -0
  175. data/test/sass/templates/import_charset.sass +9 -0
  176. data/test/sass/templates/import_charset_1_8.sass +6 -0
  177. data/test/sass/templates/import_charset_ibm866.sass +11 -0
  178. data/test/sass/templates/import_content.sass +4 -0
  179. data/test/sass/templates/importee.less +2 -0
  180. data/test/sass/templates/importee.sass +19 -0
  181. data/test/sass/templates/line_numbers.sass +13 -0
  182. data/test/sass/templates/mixin_bork.sass +5 -0
  183. data/test/sass/templates/mixins.sass +76 -0
  184. data/test/sass/templates/multiline.sass +20 -0
  185. data/test/sass/templates/nested.sass +25 -0
  186. data/test/sass/templates/nested_bork1.sass +2 -0
  187. data/test/sass/templates/nested_bork2.sass +2 -0
  188. data/test/sass/templates/nested_bork3.sass +2 -0
  189. data/test/sass/templates/nested_bork4.sass +2 -0
  190. data/test/sass/templates/nested_import.sass +2 -0
  191. data/test/sass/templates/nested_mixin_bork.sass +6 -0
  192. data/test/sass/templates/options.sass +2 -0
  193. data/test/sass/templates/parent_ref.sass +25 -0
  194. data/test/sass/templates/same_name_different_ext.sass +2 -0
  195. data/test/sass/templates/same_name_different_ext.scss +1 -0
  196. data/test/sass/templates/same_name_different_partiality.scss +1 -0
  197. data/test/sass/templates/script.sass +101 -0
  198. data/test/sass/templates/scss_import.scss +12 -0
  199. data/test/sass/templates/scss_importee.scss +1 -0
  200. data/test/sass/templates/single_import_loop.sass +1 -0
  201. data/test/sass/templates/subdir/import_up1.scss +1 -0
  202. data/test/sass/templates/subdir/import_up2.scss +1 -0
  203. data/test/sass/templates/subdir/nested_subdir/_nested_partial.sass +2 -0
  204. data/test/sass/templates/subdir/nested_subdir/nested_subdir.sass +3 -0
  205. data/test/sass/templates/subdir/subdir.sass +6 -0
  206. data/test/sass/templates/units.sass +11 -0
  207. data/test/sass/templates/warn.sass +3 -0
  208. data/test/sass/templates/warn_imported.sass +4 -0
  209. data/test/sass/test_helper.rb +8 -0
  210. data/test/sass/util/multibyte_string_scanner_test.rb +147 -0
  211. data/test/sass/util/normalized_map_test.rb +51 -0
  212. data/test/sass/util/subset_map_test.rb +91 -0
  213. data/test/sass/util_test.rb +438 -0
  214. data/test/sass/value_helpers_test.rb +179 -0
  215. data/test/test_helper.rb +110 -0
  216. data/vendor/listen/CHANGELOG.md +1 -0
  217. data/vendor/listen/CONTRIBUTING.md +38 -0
  218. data/vendor/listen/Gemfile +20 -0
  219. data/vendor/listen/Guardfile +8 -0
  220. data/vendor/listen/LICENSE +20 -0
  221. data/vendor/listen/README.md +349 -0
  222. data/vendor/listen/Rakefile +5 -0
  223. data/vendor/listen/Vagrantfile +96 -0
  224. data/vendor/listen/lib/listen.rb +54 -0
  225. data/vendor/listen/lib/listen/adapter.rb +327 -0
  226. data/vendor/listen/lib/listen/adapters/bsd.rb +75 -0
  227. data/vendor/listen/lib/listen/adapters/darwin.rb +48 -0
  228. data/vendor/listen/lib/listen/adapters/linux.rb +81 -0
  229. data/vendor/listen/lib/listen/adapters/polling.rb +58 -0
  230. data/vendor/listen/lib/listen/adapters/windows.rb +91 -0
  231. data/vendor/listen/lib/listen/directory_record.rb +406 -0
  232. data/vendor/listen/lib/listen/listener.rb +323 -0
  233. data/vendor/listen/lib/listen/turnstile.rb +32 -0
  234. data/vendor/listen/lib/listen/version.rb +3 -0
  235. data/vendor/listen/listen.gemspec +28 -0
  236. data/vendor/listen/spec/listen/adapter_spec.rb +149 -0
  237. data/vendor/listen/spec/listen/adapters/bsd_spec.rb +36 -0
  238. data/vendor/listen/spec/listen/adapters/darwin_spec.rb +37 -0
  239. data/vendor/listen/spec/listen/adapters/linux_spec.rb +47 -0
  240. data/vendor/listen/spec/listen/adapters/polling_spec.rb +68 -0
  241. data/vendor/listen/spec/listen/adapters/windows_spec.rb +30 -0
  242. data/vendor/listen/spec/listen/directory_record_spec.rb +1250 -0
  243. data/vendor/listen/spec/listen/listener_spec.rb +258 -0
  244. data/vendor/listen/spec/listen/turnstile_spec.rb +56 -0
  245. data/vendor/listen/spec/listen_spec.rb +67 -0
  246. data/vendor/listen/spec/spec_helper.rb +25 -0
  247. data/vendor/listen/spec/support/adapter_helper.rb +666 -0
  248. data/vendor/listen/spec/support/directory_record_helper.rb +57 -0
  249. data/vendor/listen/spec/support/fixtures_helper.rb +29 -0
  250. data/vendor/listen/spec/support/listeners_helper.rb +179 -0
  251. data/vendor/listen/spec/support/platform_helper.rb +15 -0
  252. metadata +217 -76
  253. data/extra/sass-spec-ref.sh +0 -40
  254. data/lib/sass/deprecation.rb +0 -55
  255. data/lib/sass/logger/delayed.rb +0 -50
  256. data/lib/sass/script/value/callable.rb +0 -25
  257. data/lib/sass/script/value/function.rb +0 -19
@@ -32,7 +32,7 @@ module Sass
32
32
  # @return [String] The escaped character
33
33
  # @private
34
34
  def self.escape_char(c)
35
- return "\\%06x" % c.ord unless c =~ %r{[ -/:-~]}
35
+ return "\\%06x" % Sass::Util.ord(c) unless c =~ /[ -\/:-~]/
36
36
  "\\#{c}"
37
37
  end
38
38
 
@@ -40,7 +40,7 @@ module Sass
40
40
  # escaping all significant characters.
41
41
  #
42
42
  # @param str [String] The text of the regexp
43
- # @param flags [Integer] Flags for the created regular expression
43
+ # @param flags [Fixnum] Flags for the created regular expression
44
44
  # @return [Regexp]
45
45
  # @private
46
46
  def self.quote(str, flags = 0)
@@ -50,9 +50,15 @@ module Sass
50
50
  H = /[0-9a-fA-F]/
51
51
  NL = /\n|\r\n|\r|\f/
52
52
  UNICODE = /\\#{H}{1,6}[ \t\r\n\f]?/
53
- s = '\u{80}-\u{D7FF}\u{E000}-\u{FFFD}\u{10000}-\u{10FFFF}'
53
+ s = if Sass::Util.ruby1_8?
54
+ '\200-\377'
55
+ elsif Sass::Util.macruby?
56
+ '\u0080-\uD7FF\uE000-\uFFFD\U00010000-\U0010FFFF'
57
+ else
58
+ '\u{80}-\u{D7FF}\u{E000}-\u{FFFD}\u{10000}-\u{10FFFF}'
59
+ end
54
60
  NONASCII = /[#{s}]/
55
- ESCAPE = /#{UNICODE}|\\[^0-9a-fA-F\r\n\f]/
61
+ ESCAPE = /#{UNICODE}|\\[ -~#{s}]/
56
62
  NMSTART = /[_a-zA-Z]|#{NONASCII}|#{ESCAPE}/
57
63
  NMCHAR = /[a-zA-Z0-9_-]|#{NONASCII}|#{ESCAPE}/
58
64
  STRING1 = /\"((?:[^\n\r\f\\"]|\\#{NL}|#{ESCAPE})*)\"/
@@ -60,6 +66,7 @@ module Sass
60
66
 
61
67
  IDENT = /-*#{NMSTART}#{NMCHAR}*/
62
68
  NAME = /#{NMCHAR}+/
69
+ NUM = //
63
70
  STRING = /#{STRING1}|#{STRING2}/
64
71
  URLCHAR = /[#%&*-~]|#{NONASCII}|#{ESCAPE}/
65
72
  URL = /(#{URLCHAR}*)/
@@ -92,7 +99,7 @@ module Sass
92
99
  # A unit is like an IDENT, but disallows a hyphen followed by a digit.
93
100
  # This allows "1px-2px" to be interpreted as subtraction rather than "1"
94
101
  # with the unit "px-2px". It also allows "%".
95
- UNIT = /-?#{NMSTART}(?:[a-zA-Z0-9_]|#{NONASCII}|#{ESCAPE}|-(?!\.?\d))*|%/
102
+ UNIT = /-?#{NMSTART}(?:[a-zA-Z0-9_]|#{NONASCII}|#{ESCAPE}|-(?!\d))*|%/
96
103
 
97
104
  UNITLESS_NUMBER = /(?:[0-9]+|[0-9]*\.[0-9]+)(?:[eE][+-]?\d+)?/
98
105
  NUMBER = /#{UNITLESS_NUMBER}(?:#{UNIT})?/
@@ -121,13 +128,13 @@ module Sass
121
128
  OPTIONAL = /!#{W}optional/i
122
129
  IDENT_START = /-|#{NMSTART}/
123
130
 
124
- IDENT_HYPHEN_INTERP = /-+(?=#\{)/
131
+ IDENT_HYPHEN_INTERP = /-(#\{)/
125
132
  STRING1_NOINTERP = /\"((?:[^\n\r\f\\"#]|#(?!\{)|#{ESCAPE})*)\"/
126
133
  STRING2_NOINTERP = /\'((?:[^\n\r\f\\'#]|#(?!\{)|#{ESCAPE})*)\'/
127
134
  STRING_NOINTERP = /#{STRING1_NOINTERP}|#{STRING2_NOINTERP}/
128
135
 
129
136
  STATIC_COMPONENT = /#{IDENT}|#{STRING_NOINTERP}|#{HEXCOLOR}|[+-]?#{NUMBER}|\!important/i
130
- STATIC_VALUE = %r(#{STATIC_COMPONENT}(\s*[\s,\/]\s*#{STATIC_COMPONENT})*(?=[;}]))i
137
+ STATIC_VALUE = /#{STATIC_COMPONENT}(\s*[\s,\/]\s*#{STATIC_COMPONENT})*([;}])/i
131
138
  STATIC_SELECTOR = /(#{NMCHAR}|[ \t]|[,>+*]|[:#.]#{NMSTART}){1,50}([{])/i
132
139
  end
133
140
  end
@@ -0,0 +1,15 @@
1
+ module Sass
2
+ module SCSS
3
+ # A mixin for subclasses of {Sass::Script::Lexer}
4
+ # that makes them usable by {SCSS::Parser} to parse SassScript.
5
+ # In particular, the lexer doesn't support `!` for a variable prefix.
6
+ module ScriptLexer
7
+ private
8
+
9
+ def variable
10
+ return [:raw, "!important"] if scan(Sass::SCSS::RX::IMPORTANT)
11
+ _variable(Sass::SCSS::RX::VARIABLE)
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,25 @@
1
+ module Sass
2
+ module SCSS
3
+ # A mixin for subclasses of {Sass::Script::Parser}
4
+ # that makes them usable by {SCSS::Parser} to parse SassScript.
5
+ # In particular, the parser won't raise an error
6
+ # when there's more content in the lexer once lexing is done.
7
+ # In addition, the parser doesn't support `!` for a variable prefix.
8
+ module ScriptParser
9
+ private
10
+
11
+ # @private
12
+ def lexer_class
13
+ klass = Class.new(super)
14
+ klass.send(:include, ScriptLexer)
15
+ klass
16
+ end
17
+
18
+ # Instead of raising an error when the parser is done,
19
+ # rewind the StringScanner so that it hasn't consumed the final token.
20
+ def assert_done
21
+ @lexer.unpeek!
22
+ end
23
+ end
24
+ end
25
+ end
@@ -51,7 +51,10 @@ 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
54
56
  def initialize(str, filename, importer, line = 1, offset = 1, allow_parent_ref = true)
57
+ # rubocop:enable ParameterLists
55
58
  super(str, filename, importer, line, offset)
56
59
  @allow_parent_ref = allow_parent_ref
57
60
  end
@@ -59,7 +62,7 @@ module Sass
59
62
  private
60
63
 
61
64
  def moz_document_function
62
- val = tok(URI) || tok(URL_PREFIX) || tok(DOMAIN) || function(false)
65
+ val = tok(URI) || tok(URL_PREFIX) || tok(DOMAIN) || function(!:allow_var)
63
66
  return unless val
64
67
  ss
65
68
  [val]
@@ -71,11 +74,11 @@ module Sass
71
74
  def var_expr; nil; end
72
75
  def interp_string; (s = tok(STRING)) && [s]; end
73
76
  def interp_uri; (s = tok(URI)) && [s]; end
74
- def interp_ident; (s = ident) && [s]; end
77
+ def interp_ident(ident = IDENT); (s = tok(ident)) && [s]; end
75
78
  def use_css_import?; true; end
76
79
 
77
80
  def special_directive(name, start_pos)
78
- return unless %w(media import charset -moz-document).include?(name)
81
+ return unless %w[media import charset -moz-document].include?(name)
79
82
  super
80
83
  end
81
84
 
@@ -86,12 +89,13 @@ module Sass
86
89
  ws = ''
87
90
  while tok(/,/)
88
91
  ws << str {ss}
89
- next unless (sel = selector)
90
- selectors << sel
91
- if ws.include?("\n")
92
- selectors[-1] = Selector::Sequence.new(["\n"] + selectors.last.members)
92
+ if (sel = selector)
93
+ selectors << sel
94
+ if ws.include?("\n")
95
+ selectors[-1] = Selector::Sequence.new(["\n"] + selectors.last.members)
96
+ end
97
+ ws = ''
93
98
  end
94
- ws = ''
95
99
  end
96
100
  Selector::CommaSequence.new(selectors)
97
101
  end
@@ -136,18 +140,11 @@ MESSAGE
136
140
  end
137
141
 
138
142
  def reference_combinator
139
- return unless tok(%r{/})
143
+ return unless tok(/\//)
140
144
  res = '/'
141
145
  ns, name = expr!(:qualified_name)
142
146
  res << ns << '|' if ns
143
- res << name << tok!(%r{/})
144
-
145
- location = " of #{@filename}" if @filename
146
- Sass::Util.sass_warn <<MESSAGE
147
- DEPRECATION WARNING on line #{@line}, column #{@offset}#{location}:
148
- The reference combinator #{res} is deprecated and will be removed in a future release.
149
- MESSAGE
150
-
147
+ res << name << tok!(/\//)
151
148
  res
152
149
  end
153
150
 
@@ -185,25 +182,25 @@ MESSAGE
185
182
 
186
183
  def parent_selector
187
184
  return unless @allow_parent_ref && tok(/&/)
188
- Selector::Parent.new(name)
185
+ Selector::Parent.new(tok(NAME))
189
186
  end
190
187
 
191
188
  def class_selector
192
189
  return unless tok(/\./)
193
190
  @expected = "class name"
194
- Selector::Class.new(ident!)
191
+ Selector::Class.new(tok!(IDENT))
195
192
  end
196
193
 
197
194
  def id_selector
198
195
  return unless tok(/#(?!\{)/)
199
196
  @expected = "id name"
200
- Selector::Id.new(name!)
197
+ Selector::Id.new(tok!(NAME))
201
198
  end
202
199
 
203
200
  def placeholder_selector
204
201
  return unless tok(/%/)
205
202
  @expected = "placeholder name"
206
- Selector::Placeholder.new(ident!)
203
+ Selector::Placeholder.new(tok!(IDENT))
207
204
  end
208
205
 
209
206
  def element_name
@@ -218,13 +215,13 @@ MESSAGE
218
215
  end
219
216
 
220
217
  def qualified_name(allow_star_name = false)
221
- name = ident || tok(/\*/) || (tok?(/\|/) && "")
218
+ name = tok(IDENT) || tok(/\*/) || (tok?(/\|/) && "")
222
219
  return unless name
223
220
  return nil, name unless tok(/\|/)
224
221
 
225
- return name, ident! unless allow_star_name
222
+ return name, tok!(IDENT) unless allow_star_name
226
223
  @expected = "identifier or *"
227
- return name, ident || tok!(/\*/)
224
+ return name, tok(IDENT) || tok!(/\*/)
228
225
  end
229
226
 
230
227
  def attrib
@@ -242,21 +239,21 @@ MESSAGE
242
239
  if op
243
240
  @expected = "identifier or string"
244
241
  ss
245
- val = ident || tok!(STRING)
242
+ val = tok(IDENT) || tok!(STRING)
246
243
  ss
247
244
  end
248
- flags = ident || tok(STRING)
245
+ flags = tok(IDENT) || tok(STRING)
249
246
  tok!(/\]/)
250
247
 
251
248
  Selector::Attribute.new(name, ns, op, val, flags)
252
249
  end
253
250
 
254
251
  def attrib_name!
255
- if (name_or_ns = ident)
252
+ if (name_or_ns = tok(IDENT))
256
253
  # E, E|E
257
254
  if tok(/\|(?!=)/)
258
255
  ns = name_or_ns
259
- name = ident
256
+ name = tok(IDENT)
260
257
  else
261
258
  name = name_or_ns
262
259
  end
@@ -264,22 +261,20 @@ MESSAGE
264
261
  # *|E or |E
265
262
  ns = tok(/\*/) || ""
266
263
  tok!(/\|/)
267
- name = ident!
264
+ name = tok!(IDENT)
268
265
  end
269
266
  return ns, name
270
267
  end
271
268
 
272
- SELECTOR_PSEUDO_CLASSES = %w(not matches current any has host host-context).to_set
273
-
274
- PREFIXED_SELECTOR_PSEUDO_CLASSES = %w(nth-child nth-last-child).to_set
269
+ SELECTOR_PSEUDO_CLASSES = %w[not matches current any has host host-context].to_set
275
270
 
276
- SELECTOR_PSEUDO_ELEMENTS = %w(slotted).to_set
271
+ PREFIXED_SELECTOR_PSEUDO_CLASSES = %w[nth-child nth-last-child].to_set
277
272
 
278
273
  def pseudo
279
274
  s = tok(/::?/)
280
275
  return unless s
281
276
  @expected = "pseudoclass or pseudoelement"
282
- name = ident!
277
+ name = tok!(IDENT)
283
278
  if tok(/\(/)
284
279
  ss
285
280
  deprefixed = deprefix(name)
@@ -287,10 +282,8 @@ MESSAGE
287
282
  sel = selector_comma_sequence
288
283
  elsif s == ':' && PREFIXED_SELECTOR_PSEUDO_CLASSES.include?(deprefixed)
289
284
  arg, sel = prefixed_selector_pseudo
290
- elsif s == '::' && SELECTOR_PSEUDO_ELEMENTS.include?(deprefixed)
291
- sel = selector_comma_sequence
292
285
  else
293
- arg = expr!(:declaration_value).join
286
+ arg = expr!(:pseudo_args)
294
287
  end
295
288
 
296
289
  tok!(/\)/)
@@ -298,6 +291,29 @@ MESSAGE
298
291
  Selector::Pseudo.new(s == ':' ? :class : :element, name, arg, sel)
299
292
  end
300
293
 
294
+ def pseudo_args
295
+ arg = expr!(:pseudo_expr)
296
+ while tok(/,/)
297
+ arg << ',' << str {ss}
298
+ arg.concat expr!(:pseudo_expr)
299
+ end
300
+ arg
301
+ end
302
+
303
+ def pseudo_expr
304
+ res = pseudo_expr_token
305
+ return unless res
306
+ res << str {ss}
307
+ while (e = pseudo_expr_token)
308
+ res << e << str {ss}
309
+ end
310
+ res
311
+ end
312
+
313
+ def pseudo_expr_token
314
+ tok(PLUS) || tok(/[-*]/) || tok(NUMBER) || tok(STRING) || tok(IDENT)
315
+ end
316
+
301
317
  def prefixed_selector_pseudo
302
318
  prefix = str do
303
319
  expr = str {expr!(:a_n_plus_b)}
@@ -342,10 +358,11 @@ MESSAGE
342
358
  end
343
359
 
344
360
  def keyframes_selector_component
345
- ident || tok(PERCENTAGE)
361
+ tok(IDENT) || tok(PERCENTAGE)
346
362
  end
347
363
 
348
364
  @sass_script_parser = Class.new(Sass::Script::CssParser)
365
+ @sass_script_parser.send(:include, ScriptParser)
349
366
  end
350
367
  end
351
368
  end
@@ -39,7 +39,7 @@ module Sass
39
39
  end
40
40
 
41
41
  # @see Selector#to_s
42
- def to_s(opts = {})
42
+ def to_s
43
43
  "&" + (@suffix || '')
44
44
  end
45
45
 
@@ -65,7 +65,7 @@ module Sass
65
65
  end
66
66
 
67
67
  # @see Selector#to_s
68
- def to_s(opts = {})
68
+ def to_s
69
69
  "." + @name
70
70
  end
71
71
 
@@ -92,7 +92,7 @@ module Sass
92
92
  end
93
93
 
94
94
  # @see Selector#to_s
95
- def to_s(opts = {})
95
+ def to_s
96
96
  "#" + @name
97
97
  end
98
98
 
@@ -127,7 +127,7 @@ module Sass
127
127
  end
128
128
 
129
129
  # @see Selector#to_s
130
- def to_s(opts = {})
130
+ def to_s
131
131
  "%" + @name
132
132
  end
133
133
 
@@ -151,7 +151,7 @@ module Sass
151
151
  end
152
152
 
153
153
  # @see Selector#to_s
154
- def to_s(opts = {})
154
+ def to_s
155
155
  @namespace ? "#{@namespace}|*" : "*"
156
156
  end
157
157
 
@@ -223,7 +223,7 @@ module Sass
223
223
  end
224
224
 
225
225
  # @see Selector#to_s
226
- def to_s(opts = {})
226
+ def to_s
227
227
  @namespace ? "#{@namespace}|#{@name}" : @name
228
228
  end
229
229
 
@@ -300,7 +300,10 @@ module Sass
300
300
  # @param operator [String] The matching operator, e.g. `"="` or `"^="`
301
301
  # @param value [String] See \{#value}
302
302
  # @param flags [String] See \{#flags}
303
+ # @comment
304
+ # rubocop:disable ParameterLists
303
305
  def initialize(name, namespace, operator, value, flags)
306
+ # rubocop:enable ParameterLists
304
307
  @name = name
305
308
  @namespace = namespace
306
309
  @operator = operator
@@ -309,7 +312,7 @@ module Sass
309
312
  end
310
313
 
311
314
  # @see Selector#to_s
312
- def to_s(opts = {})
315
+ def to_s
313
316
  res = "["
314
317
  res << @namespace << "|" if @namespace
315
318
  res << @name
@@ -8,7 +8,7 @@ module Sass
8
8
  class AbstractSequence
9
9
  # The line of the Sass template on which this selector was declared.
10
10
  #
11
- # @return [Integer]
11
+ # @return [Fixnum]
12
12
  attr_reader :line
13
13
 
14
14
  # The name of the file in which this selector was declared.
@@ -19,8 +19,8 @@ module Sass
19
19
  # Sets the line of the Sass template on which this selector was declared.
20
20
  # This also sets the line for all child selectors.
21
21
  #
22
- # @param line [Integer]
23
- # @return [Integer]
22
+ # @param line [Fixnum]
23
+ # @return [Fixnum]
24
24
  def line=(line)
25
25
  members.each {|m| m.line = line}
26
26
  @line = line
@@ -42,7 +42,7 @@ module Sass
42
42
  # Subclasses should define `#_hash` rather than overriding this method,
43
43
  # which automatically handles memoizing the result.
44
44
  #
45
- # @return [Integer]
45
+ # @return [Fixnum]
46
46
  def hash
47
47
  @_hash ||= _hash
48
48
  end
@@ -59,23 +59,20 @@ module Sass
59
59
  end
60
60
  alias_method :==, :eql?
61
61
 
62
- # Whether or not this selector should be hidden due to containing a
63
- # placeholder.
64
- def invisible?
65
- @invisible ||= members.any? do |m|
66
- next m.invisible? if m.is_a?(AbstractSequence) || m.is_a?(Pseudo)
62
+ # Whether or not this selector sequence contains a placeholder selector.
63
+ # Checks recursively.
64
+ def has_placeholder?
65
+ @has_placeholder ||= members.any? do |m|
66
+ next m.has_placeholder? if m.is_a?(AbstractSequence)
67
+ next m.selector && m.selector.has_placeholder? if m.is_a?(Pseudo)
67
68
  m.is_a?(Placeholder)
68
69
  end
69
70
  end
70
71
 
71
72
  # Returns the selector string.
72
73
  #
73
- # @param opts [Hash] rendering options.
74
- # @option opts [Symbol] :style The css rendering style.
75
- # @option placeholders [Boolean] :placeholders
76
- # Whether to include placeholder selectors. Defaults to `true`.
77
74
  # @return [String]
78
- def to_s(opts = {})
75
+ def to_s
79
76
  Sass::Util.abstract(self)
80
77
  end
81
78
 
@@ -84,7 +81,7 @@ module Sass
84
81
  # The base is given by {Sass::Selector::SPECIFICITY_BASE}. This can be a
85
82
  # number or a range representing possible specificities.
86
83
  #
87
- # @return [Integer, Range]
84
+ # @return [Fixnum, Range]
88
85
  def specificity
89
86
  _specificity(members)
90
87
  end