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.
- checksums.yaml +13 -5
- data/.yardopts +1 -1
- data/CODE_OF_CONDUCT.md +1 -1
- data/CONTRIBUTING.md +1 -146
- data/MIT-LICENSE +1 -1
- data/README.md +25 -39
- data/Rakefile +274 -0
- data/VERSION +1 -1
- data/VERSION_DATE +1 -1
- data/lib/sass.rb +3 -3
- data/lib/sass/cache_stores/filesystem.rb +2 -2
- data/lib/sass/cache_stores/memory.rb +5 -4
- data/lib/sass/callbacks.rb +2 -2
- data/lib/sass/css.rb +12 -12
- data/lib/sass/engine.rb +44 -62
- data/lib/sass/environment.rb +7 -35
- data/lib/sass/error.rb +14 -14
- data/lib/sass/exec/base.rb +14 -3
- data/lib/sass/exec/sass_convert.rb +6 -20
- data/lib/sass/exec/sass_scss.rb +29 -5
- data/lib/sass/features.rb +2 -3
- data/lib/sass/importers/filesystem.rb +6 -11
- data/lib/sass/logger.rb +3 -8
- data/lib/sass/logger/base.rb +2 -19
- data/lib/sass/plugin.rb +2 -3
- data/lib/sass/plugin/compiler.rb +67 -48
- data/lib/sass/plugin/configuration.rb +3 -3
- data/lib/sass/plugin/merb.rb +1 -1
- data/lib/sass/plugin/rack.rb +3 -3
- data/lib/sass/plugin/staleness_checker.rb +3 -3
- data/lib/sass/railtie.rb +1 -1
- data/lib/sass/script.rb +3 -3
- data/lib/sass/script/css_parser.rb +15 -5
- data/lib/sass/script/functions.rb +121 -337
- data/lib/sass/script/lexer.rb +36 -102
- data/lib/sass/script/parser.rb +153 -529
- data/lib/sass/script/tree/funcall.rb +34 -42
- data/lib/sass/script/tree/interpolation.rb +26 -171
- data/lib/sass/script/tree/list_literal.rb +8 -23
- data/lib/sass/script/tree/map_literal.rb +2 -2
- data/lib/sass/script/tree/node.rb +3 -3
- data/lib/sass/script/tree/operation.rb +16 -43
- data/lib/sass/script/tree/string_interpolation.rb +43 -64
- data/lib/sass/script/tree/variable.rb +1 -1
- data/lib/sass/script/value.rb +0 -2
- data/lib/sass/script/value/arg_list.rb +1 -1
- data/lib/sass/script/value/base.rb +9 -27
- data/lib/sass/script/value/color.rb +18 -26
- data/lib/sass/script/value/helpers.rb +18 -44
- data/lib/sass/script/value/list.rb +14 -35
- data/lib/sass/script/value/map.rb +2 -2
- data/lib/sass/script/value/number.rb +16 -26
- data/lib/sass/script/value/string.rb +1 -30
- data/lib/sass/scss.rb +2 -0
- data/lib/sass/scss/css_parser.rb +3 -7
- data/lib/sass/scss/parser.rb +78 -196
- data/lib/sass/scss/rx.rb +14 -7
- data/lib/sass/scss/script_lexer.rb +15 -0
- data/lib/sass/scss/script_parser.rb +25 -0
- data/lib/sass/scss/static_parser.rb +55 -38
- data/lib/sass/selector.rb +10 -7
- data/lib/sass/selector/abstract_sequence.rb +12 -15
- data/lib/sass/selector/comma_sequence.rb +6 -24
- data/lib/sass/selector/pseudo.rb +6 -19
- data/lib/sass/selector/sequence.rb +16 -14
- data/lib/sass/selector/simple.rb +7 -9
- data/lib/sass/selector/simple_sequence.rb +12 -16
- data/lib/sass/shared.rb +1 -1
- data/lib/sass/source/map.rb +9 -7
- data/lib/sass/source/position.rb +4 -4
- data/lib/sass/stack.rb +3 -23
- data/lib/sass/tree/charset_node.rb +1 -1
- data/lib/sass/tree/comment_node.rb +1 -1
- data/lib/sass/tree/function_node.rb +3 -2
- data/lib/sass/tree/node.rb +3 -5
- data/lib/sass/tree/prop_node.rb +58 -49
- data/lib/sass/tree/rule_node.rb +8 -15
- data/lib/sass/tree/visitors/check_nesting.rb +23 -19
- data/lib/sass/tree/visitors/convert.rb +13 -15
- data/lib/sass/tree/visitors/cssize.rb +15 -4
- data/lib/sass/tree/visitors/deep_copy.rb +2 -2
- data/lib/sass/tree/visitors/extend.rb +14 -10
- data/lib/sass/tree/visitors/perform.rb +18 -29
- data/lib/sass/tree/visitors/set_options.rb +2 -2
- data/lib/sass/tree/visitors/to_css.rb +47 -77
- data/lib/sass/util.rb +311 -98
- data/lib/sass/util/cross_platform_random.rb +19 -0
- data/lib/sass/util/multibyte_string_scanner.rb +133 -127
- data/lib/sass/util/normalized_map.rb +8 -1
- data/lib/sass/util/ordered_hash.rb +192 -0
- data/lib/sass/version.rb +6 -2
- data/test/sass/cache_test.rb +131 -0
- data/test/sass/callbacks_test.rb +61 -0
- data/test/sass/compiler_test.rb +236 -0
- data/test/sass/conversion_test.rb +2171 -0
- data/test/sass/css2sass_test.rb +526 -0
- data/test/sass/data/hsl-rgb.txt +319 -0
- data/test/sass/encoding_test.rb +219 -0
- data/test/sass/engine_test.rb +3400 -0
- data/test/sass/exec_test.rb +86 -0
- data/test/sass/extend_test.rb +1719 -0
- data/test/sass/fixtures/test_staleness_check_across_importers.css +1 -0
- data/test/sass/fixtures/test_staleness_check_across_importers.scss +1 -0
- data/test/sass/functions_test.rb +1984 -0
- data/test/sass/importer_test.rb +421 -0
- data/test/sass/logger_test.rb +58 -0
- data/test/sass/mock_importer.rb +49 -0
- data/test/sass/more_results/more1.css +9 -0
- data/test/sass/more_results/more1_with_line_comments.css +26 -0
- data/test/sass/more_results/more_import.css +29 -0
- data/test/sass/more_templates/_more_partial.sass +2 -0
- data/test/sass/more_templates/more1.sass +23 -0
- data/test/sass/more_templates/more_import.sass +11 -0
- data/test/sass/plugin_test.rb +556 -0
- data/test/sass/results/alt.css +4 -0
- data/test/sass/results/basic.css +9 -0
- data/test/sass/results/cached_import_option.css +3 -0
- data/test/sass/results/compact.css +5 -0
- data/test/sass/results/complex.css +86 -0
- data/test/sass/results/compressed.css +1 -0
- data/test/sass/results/expanded.css +19 -0
- data/test/sass/results/filename_fn.css +3 -0
- data/test/sass/results/if.css +3 -0
- data/test/sass/results/import.css +31 -0
- data/test/sass/results/import_charset.css +5 -0
- data/test/sass/results/import_charset_1_8.css +5 -0
- data/test/sass/results/import_charset_ibm866.css +5 -0
- data/test/sass/results/import_content.css +1 -0
- data/test/sass/results/line_numbers.css +49 -0
- data/test/sass/results/mixins.css +95 -0
- data/test/sass/results/multiline.css +24 -0
- data/test/sass/results/nested.css +22 -0
- data/test/sass/results/options.css +1 -0
- data/test/sass/results/parent_ref.css +13 -0
- data/test/sass/results/script.css +16 -0
- data/test/sass/results/scss_import.css +31 -0
- data/test/sass/results/scss_importee.css +2 -0
- data/test/sass/results/subdir/nested_subdir/nested_subdir.css +1 -0
- data/test/sass/results/subdir/subdir.css +3 -0
- data/test/sass/results/units.css +11 -0
- data/test/sass/results/warn.css +0 -0
- data/test/sass/results/warn_imported.css +0 -0
- data/test/sass/script_conversion_test.rb +306 -0
- data/test/sass/script_test.rb +1206 -0
- data/test/sass/scss/css_test.rb +1281 -0
- data/test/sass/scss/rx_test.rb +160 -0
- data/test/sass/scss/scss_test.rb +4147 -0
- data/test/sass/scss/test_helper.rb +37 -0
- data/test/sass/source_map_test.rb +1055 -0
- data/test/sass/superselector_test.rb +210 -0
- data/test/sass/templates/_cached_import_option_partial.scss +1 -0
- data/test/sass/templates/_double_import_loop2.sass +1 -0
- data/test/sass/templates/_filename_fn_import.scss +11 -0
- data/test/sass/templates/_imported_charset_ibm866.sass +4 -0
- data/test/sass/templates/_imported_charset_utf8.sass +4 -0
- data/test/sass/templates/_imported_content.sass +3 -0
- data/test/sass/templates/_partial.sass +2 -0
- data/test/sass/templates/_same_name_different_partiality.scss +1 -0
- data/test/sass/templates/alt.sass +16 -0
- data/test/sass/templates/basic.sass +23 -0
- data/test/sass/templates/bork1.sass +2 -0
- data/test/sass/templates/bork2.sass +2 -0
- data/test/sass/templates/bork3.sass +2 -0
- data/test/sass/templates/bork4.sass +2 -0
- data/test/sass/templates/bork5.sass +3 -0
- data/test/sass/templates/cached_import_option.scss +3 -0
- data/test/sass/templates/compact.sass +17 -0
- data/test/sass/templates/complex.sass +305 -0
- data/test/sass/templates/compressed.sass +15 -0
- data/test/sass/templates/double_import_loop1.sass +1 -0
- data/test/sass/templates/expanded.sass +17 -0
- data/test/sass/templates/filename_fn.scss +18 -0
- data/test/sass/templates/if.sass +11 -0
- data/test/sass/templates/import.sass +12 -0
- data/test/sass/templates/import_charset.sass +9 -0
- data/test/sass/templates/import_charset_1_8.sass +6 -0
- data/test/sass/templates/import_charset_ibm866.sass +11 -0
- data/test/sass/templates/import_content.sass +4 -0
- data/test/sass/templates/importee.less +2 -0
- data/test/sass/templates/importee.sass +19 -0
- data/test/sass/templates/line_numbers.sass +13 -0
- data/test/sass/templates/mixin_bork.sass +5 -0
- data/test/sass/templates/mixins.sass +76 -0
- data/test/sass/templates/multiline.sass +20 -0
- data/test/sass/templates/nested.sass +25 -0
- data/test/sass/templates/nested_bork1.sass +2 -0
- data/test/sass/templates/nested_bork2.sass +2 -0
- data/test/sass/templates/nested_bork3.sass +2 -0
- data/test/sass/templates/nested_bork4.sass +2 -0
- data/test/sass/templates/nested_import.sass +2 -0
- data/test/sass/templates/nested_mixin_bork.sass +6 -0
- data/test/sass/templates/options.sass +2 -0
- data/test/sass/templates/parent_ref.sass +25 -0
- data/test/sass/templates/same_name_different_ext.sass +2 -0
- data/test/sass/templates/same_name_different_ext.scss +1 -0
- data/test/sass/templates/same_name_different_partiality.scss +1 -0
- data/test/sass/templates/script.sass +101 -0
- data/test/sass/templates/scss_import.scss +12 -0
- data/test/sass/templates/scss_importee.scss +1 -0
- data/test/sass/templates/single_import_loop.sass +1 -0
- data/test/sass/templates/subdir/import_up1.scss +1 -0
- data/test/sass/templates/subdir/import_up2.scss +1 -0
- data/test/sass/templates/subdir/nested_subdir/_nested_partial.sass +2 -0
- data/test/sass/templates/subdir/nested_subdir/nested_subdir.sass +3 -0
- data/test/sass/templates/subdir/subdir.sass +6 -0
- data/test/sass/templates/units.sass +11 -0
- data/test/sass/templates/warn.sass +3 -0
- data/test/sass/templates/warn_imported.sass +4 -0
- data/test/sass/test_helper.rb +8 -0
- data/test/sass/util/multibyte_string_scanner_test.rb +147 -0
- data/test/sass/util/normalized_map_test.rb +51 -0
- data/test/sass/util/subset_map_test.rb +91 -0
- data/test/sass/util_test.rb +438 -0
- data/test/sass/value_helpers_test.rb +179 -0
- data/test/test_helper.rb +110 -0
- data/vendor/listen/CHANGELOG.md +1 -0
- data/vendor/listen/CONTRIBUTING.md +38 -0
- data/vendor/listen/Gemfile +20 -0
- data/vendor/listen/Guardfile +8 -0
- data/vendor/listen/LICENSE +20 -0
- data/vendor/listen/README.md +349 -0
- data/vendor/listen/Rakefile +5 -0
- data/vendor/listen/Vagrantfile +96 -0
- data/vendor/listen/lib/listen.rb +54 -0
- data/vendor/listen/lib/listen/adapter.rb +327 -0
- data/vendor/listen/lib/listen/adapters/bsd.rb +75 -0
- data/vendor/listen/lib/listen/adapters/darwin.rb +48 -0
- data/vendor/listen/lib/listen/adapters/linux.rb +81 -0
- data/vendor/listen/lib/listen/adapters/polling.rb +58 -0
- data/vendor/listen/lib/listen/adapters/windows.rb +91 -0
- data/vendor/listen/lib/listen/directory_record.rb +406 -0
- data/vendor/listen/lib/listen/listener.rb +323 -0
- data/vendor/listen/lib/listen/turnstile.rb +32 -0
- data/vendor/listen/lib/listen/version.rb +3 -0
- data/vendor/listen/listen.gemspec +28 -0
- data/vendor/listen/spec/listen/adapter_spec.rb +149 -0
- data/vendor/listen/spec/listen/adapters/bsd_spec.rb +36 -0
- data/vendor/listen/spec/listen/adapters/darwin_spec.rb +37 -0
- data/vendor/listen/spec/listen/adapters/linux_spec.rb +47 -0
- data/vendor/listen/spec/listen/adapters/polling_spec.rb +68 -0
- data/vendor/listen/spec/listen/adapters/windows_spec.rb +30 -0
- data/vendor/listen/spec/listen/directory_record_spec.rb +1250 -0
- data/vendor/listen/spec/listen/listener_spec.rb +258 -0
- data/vendor/listen/spec/listen/turnstile_spec.rb +56 -0
- data/vendor/listen/spec/listen_spec.rb +67 -0
- data/vendor/listen/spec/spec_helper.rb +25 -0
- data/vendor/listen/spec/support/adapter_helper.rb +666 -0
- data/vendor/listen/spec/support/directory_record_helper.rb +57 -0
- data/vendor/listen/spec/support/fixtures_helper.rb +29 -0
- data/vendor/listen/spec/support/listeners_helper.rb +179 -0
- data/vendor/listen/spec/support/platform_helper.rb +15 -0
- metadata +217 -76
- data/extra/sass-spec-ref.sh +0 -40
- data/lib/sass/deprecation.rb +0 -55
- data/lib/sass/logger/delayed.rb +0 -50
- data/lib/sass/script/value/callable.rb +0 -25
- data/lib/sass/script/value/function.rb +0 -19
data/lib/sass/scss/rx.rb
CHANGED
@@ -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" %
|
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 [
|
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 =
|
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}|\\[
|
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}|-(
|
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 =
|
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(
|
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
|
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
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
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(
|
143
|
+
return unless tok(/\//)
|
140
144
|
res = '/'
|
141
145
|
ns, name = expr!(:qualified_name)
|
142
146
|
res << ns << '|' if ns
|
143
|
-
res << name << tok!(
|
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(
|
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(
|
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(
|
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(
|
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 =
|
218
|
+
name = tok(IDENT) || tok(/\*/) || (tok?(/\|/) && "")
|
222
219
|
return unless name
|
223
220
|
return nil, name unless tok(/\|/)
|
224
221
|
|
225
|
-
return name,
|
222
|
+
return name, tok!(IDENT) unless allow_star_name
|
226
223
|
@expected = "identifier or *"
|
227
|
-
return name,
|
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 =
|
242
|
+
val = tok(IDENT) || tok!(STRING)
|
246
243
|
ss
|
247
244
|
end
|
248
|
-
flags =
|
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 =
|
252
|
+
if (name_or_ns = tok(IDENT))
|
256
253
|
# E, E|E
|
257
254
|
if tok(/\|(?!=)/)
|
258
255
|
ns = name_or_ns
|
259
|
-
name =
|
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 =
|
264
|
+
name = tok!(IDENT)
|
268
265
|
end
|
269
266
|
return ns, name
|
270
267
|
end
|
271
268
|
|
272
|
-
SELECTOR_PSEUDO_CLASSES = %w
|
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
|
-
|
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 =
|
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!(:
|
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
|
-
|
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
|
data/lib/sass/selector.rb
CHANGED
@@ -39,7 +39,7 @@ module Sass
|
|
39
39
|
end
|
40
40
|
|
41
41
|
# @see Selector#to_s
|
42
|
-
def to_s
|
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
|
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
|
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
|
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
|
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
|
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
|
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 [
|
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 [
|
23
|
-
# @return [
|
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 [
|
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
|
63
|
-
#
|
64
|
-
def
|
65
|
-
@
|
66
|
-
next m.
|
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
|
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 [
|
84
|
+
# @return [Fixnum, Range]
|
88
85
|
def specificity
|
89
86
|
_specificity(members)
|
90
87
|
end
|