sass 3.7.4 → 4.0.0.alpha.1
Sign up to get free protection for your applications and to get access to all the features.
- 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
@@ -2,8 +2,6 @@ module Sass
|
|
2
2
|
module Selector
|
3
3
|
# A comma-separated sequence of selectors.
|
4
4
|
class CommaSequence < AbstractSequence
|
5
|
-
@@compound_extend_deprecation = Sass::Deprecation.new
|
6
|
-
|
7
5
|
# The comma-separated selector sequences
|
8
6
|
# represented by this class.
|
9
7
|
#
|
@@ -98,11 +96,8 @@ module Sass
|
|
98
96
|
# The node that caused this extension.
|
99
97
|
# @param parent_directives [Array<Sass::Tree::DirectiveNode>]
|
100
98
|
# The parent directives containing `extend_node`.
|
101
|
-
# @param allow_compound_target [Boolean]
|
102
|
-
# Whether `extendee` is allowed to contain compound selectors.
|
103
99
|
# @raise [Sass::SyntaxError] if this extension is invalid.
|
104
|
-
def populate_extends(extends, extendee, extend_node = nil, parent_directives = []
|
105
|
-
allow_compound_target = false)
|
100
|
+
def populate_extends(extends, extendee, extend_node = nil, parent_directives = [])
|
106
101
|
extendee.members.each do |seq|
|
107
102
|
if seq.members.size > 1
|
108
103
|
raise Sass::SyntaxError.new("Can't extend #{seq}: can't extend nested selectors")
|
@@ -116,21 +111,13 @@ module Sass
|
|
116
111
|
end
|
117
112
|
|
118
113
|
sel = sseq.members
|
119
|
-
if !allow_compound_target && sel.length > 1
|
120
|
-
@@compound_extend_deprecation.warn(sseq.filename, sseq.line, <<WARNING)
|
121
|
-
Extending a compound selector, #{sseq}, is deprecated and will not be supported in a future release.
|
122
|
-
Consider "@extend #{sseq.members.join(', ')}" instead.
|
123
|
-
See http://bit.ly/ExtendCompound for details.
|
124
|
-
WARNING
|
125
|
-
end
|
126
|
-
|
127
114
|
members.each do |member|
|
128
115
|
unless member.members.last.is_a?(Sass::Selector::SimpleSequence)
|
129
116
|
raise Sass::SyntaxError.new("#{member} can't extend: invalid selector")
|
130
117
|
end
|
131
118
|
|
132
119
|
extends[sel] = Sass::Tree::Visitors::Cssize::Extend.new(
|
133
|
-
member, sel, extend_node, parent_directives,
|
120
|
+
member, sel, extend_node, parent_directives, :not_found)
|
134
121
|
end
|
135
122
|
end
|
136
123
|
end
|
@@ -159,8 +146,8 @@ WARNING
|
|
159
146
|
Sass::Script::Value::List.new(seq.members.map do |component|
|
160
147
|
next if component == "\n"
|
161
148
|
Sass::Script::Value::String.new(component.to_s)
|
162
|
-
end.compact,
|
163
|
-
end,
|
149
|
+
end.compact, :space)
|
150
|
+
end, :comma)
|
164
151
|
end
|
165
152
|
|
166
153
|
# Returns a string representation of the sequence.
|
@@ -172,13 +159,8 @@ WARNING
|
|
172
159
|
end
|
173
160
|
|
174
161
|
# @see AbstractSequence#to_s
|
175
|
-
def to_s
|
176
|
-
@members.
|
177
|
-
next if opts[:placeholder] == false && m.invisible?
|
178
|
-
m.to_s(opts)
|
179
|
-
end.compact.
|
180
|
-
join(opts[:style] == :compressed ? "," : ", ").
|
181
|
-
gsub(", \n", ",\n")
|
162
|
+
def to_s
|
163
|
+
@members.join(", ").gsub(", \n", ",\n")
|
182
164
|
end
|
183
165
|
|
184
166
|
private
|
data/lib/sass/selector/pseudo.rb
CHANGED
@@ -1,4 +1,3 @@
|
|
1
|
-
# coding: utf-8
|
2
1
|
module Sass
|
3
2
|
module Selector
|
4
3
|
# A pseudoclass (e.g. `:visited`) or pseudoelement (e.g. `::first-line`)
|
@@ -10,7 +9,7 @@ module Sass
|
|
10
9
|
# selectors.
|
11
10
|
#
|
12
11
|
# @return [Set<String>]
|
13
|
-
ACTUALLY_ELEMENTS = %w
|
12
|
+
ACTUALLY_ELEMENTS = %w[after before first-line first-letter].to_set
|
14
13
|
|
15
14
|
# Like \{#type}, but returns the type of selector this looks like, rather
|
16
15
|
# than the type it is semantically. This only differs from type for
|
@@ -53,14 +52,6 @@ module Sass
|
|
53
52
|
type == :class && normalized_name == 'root'
|
54
53
|
end
|
55
54
|
|
56
|
-
# Whether or not this selector should be hidden due to containing a
|
57
|
-
# placeholder.
|
58
|
-
def invisible?
|
59
|
-
# :not() is a special case—if you eliminate all the placeholders from
|
60
|
-
# it, it should match anything.
|
61
|
-
name != 'not' && @selector && @selector.members.all? {|s| s.invisible?}
|
62
|
-
end
|
63
|
-
|
64
55
|
# Returns a copy of this with \{#selector} set to \{#new\_selector}.
|
65
56
|
#
|
66
57
|
# @param new_selector [CommaSequence]
|
@@ -90,7 +81,7 @@ module Sass
|
|
90
81
|
# more complex cases that likely aren't worth the pain.
|
91
82
|
next [] unless sel.name == name && sel.arg == arg
|
92
83
|
sel.selector.members
|
93
|
-
when 'has', 'host', 'host-context'
|
84
|
+
when 'has', 'host', 'host-context'
|
94
85
|
# We can't expand nested selectors here, because each layer adds an
|
95
86
|
# additional layer of semantics. For example, `:has(:has(img))`
|
96
87
|
# doesn't match `<div><img></div>` but `:has(img)` does.
|
@@ -126,17 +117,13 @@ module Sass
|
|
126
117
|
end
|
127
118
|
|
128
119
|
# @see Selector#to_s
|
129
|
-
def to_s
|
130
|
-
# :not() is a special case, because :not(<nothing>) should match
|
131
|
-
# everything.
|
132
|
-
return '' if name == 'not' && @selector && @selector.members.all? {|m| m.invisible?}
|
133
|
-
|
120
|
+
def to_s
|
134
121
|
res = (syntactic_type == :class ? ":" : "::") + @name
|
135
122
|
if @arg || @selector
|
136
123
|
res << "("
|
137
|
-
res <<
|
124
|
+
res << @arg.strip if @arg
|
138
125
|
res << " " if @arg && @selector
|
139
|
-
res << @selector.to_s
|
126
|
+
res << @selector.to_s if @selector
|
140
127
|
res << ")"
|
141
128
|
end
|
142
129
|
res
|
@@ -178,7 +165,7 @@ module Sass
|
|
178
165
|
their_seq = Sequence.new(parents + [their_sseq])
|
179
166
|
our_seq.superselector?(their_seq)
|
180
167
|
end
|
181
|
-
when 'has', 'host', 'host-context'
|
168
|
+
when 'has', 'host', 'host-context'
|
182
169
|
# Like :matches, :has (et al) can be a superselector of another
|
183
170
|
# selector if its constituent selectors are a superset of those of
|
184
171
|
# another :has in the other selector. However, the :matches other case
|
@@ -6,8 +6,8 @@ module Sass
|
|
6
6
|
# Sets the line of the Sass template on which this selector was declared.
|
7
7
|
# This also sets the line for all child selectors.
|
8
8
|
#
|
9
|
-
# @param line [
|
10
|
-
# @return [
|
9
|
+
# @param line [Fixnum]
|
10
|
+
# @return [Fixnum]
|
11
11
|
def line=(line)
|
12
12
|
members.each {|m| m.line = line if m.is_a?(SimpleSequence)}
|
13
13
|
@line = line
|
@@ -66,14 +66,10 @@ module Sass
|
|
66
66
|
next [sseq_or_op] unless sseq_or_op.is_a?(SimpleSequence)
|
67
67
|
sseq_or_op.resolve_parent_refs(super_cseq).members
|
68
68
|
end).map do |path|
|
69
|
-
|
69
|
+
Sequence.new(path.map do |seq_or_op|
|
70
70
|
next seq_or_op unless seq_or_op.is_a?(Sequence)
|
71
71
|
seq_or_op.members
|
72
|
-
end
|
73
|
-
if path_members.length == 2 && path_members[1][0] == "\n"
|
74
|
-
path_members[0].unshift path_members[1].shift
|
75
|
-
end
|
76
|
-
Sequence.new(path_members.flatten)
|
72
|
+
end.flatten)
|
77
73
|
end)
|
78
74
|
end
|
79
75
|
|
@@ -119,7 +115,7 @@ module Sass
|
|
119
115
|
# specificity greater than or equal to that of the original selector.
|
120
116
|
# In order to ensure that, we record the original selector's
|
121
117
|
# (`extended.first`) original specificity.
|
122
|
-
extended.first.add_sources!([self]) if original && !
|
118
|
+
extended.first.add_sources!([self]) if original && !has_placeholder?
|
123
119
|
|
124
120
|
extended.map {|seq| seq.members}
|
125
121
|
end
|
@@ -161,8 +157,8 @@ module Sass
|
|
161
157
|
end
|
162
158
|
|
163
159
|
# @see AbstractSequence#to_s
|
164
|
-
def to_s
|
165
|
-
@members.
|
160
|
+
def to_s
|
161
|
+
@members.join(" ").gsub(/ ?\n ?/, "\n")
|
166
162
|
end
|
167
163
|
|
168
164
|
# Returns a string representation of the sequence.
|
@@ -344,6 +340,8 @@ module Sass
|
|
344
340
|
# be nil. Otherwise, this will contained the merged selector. Array
|
345
341
|
# elements are [Sass::Util#paths]-style options; conceptually, an "or"
|
346
342
|
# of multiple selectors.
|
343
|
+
# @comment
|
344
|
+
# rubocop:disable MethodLength
|
347
345
|
def merge_final_ops(seq1, seq2, res = [])
|
348
346
|
ops1, ops2 = [], []
|
349
347
|
ops1 << seq1.pop while seq1.last.is_a?(String)
|
@@ -400,10 +398,10 @@ module Sass
|
|
400
398
|
([merged, '+'] if merged)
|
401
399
|
].compact
|
402
400
|
end
|
403
|
-
elsif op1 == '>' && %w
|
401
|
+
elsif op1 == '>' && %w[~ +].include?(op2)
|
404
402
|
res.unshift sel2, op2
|
405
403
|
seq1.push sel1, op1
|
406
|
-
elsif op2 == '>' && %w
|
404
|
+
elsif op2 == '>' && %w[~ +].include?(op1)
|
407
405
|
res.unshift sel1, op1
|
408
406
|
seq2.push sel2, op2
|
409
407
|
elsif op1 == op2
|
@@ -425,6 +423,8 @@ module Sass
|
|
425
423
|
return merge_final_ops(seq1, seq2, res)
|
426
424
|
end
|
427
425
|
end
|
426
|
+
# @comment
|
427
|
+
# rubocop:enable MethodLength
|
428
428
|
|
429
429
|
# Takes initial subsequences of `seq1` and `seq2` and returns all
|
430
430
|
# orderings of those subsequences. The initial subsequences are determined
|
@@ -497,7 +497,7 @@ module Sass
|
|
497
497
|
return if seq1.size > seq2.size
|
498
498
|
return seq1.first.superselector?(seq2.last, seq2[0...-1]) if seq1.size == 1
|
499
499
|
|
500
|
-
_, si = seq2.
|
500
|
+
_, si = Sass::Util.enum_with_index(seq2).find do |e, i|
|
501
501
|
return if i == seq2.size - 1
|
502
502
|
next if e.is_a?(String)
|
503
503
|
seq1.first.superselector?(e, seq2[0...i])
|
@@ -624,6 +624,8 @@ module Sass
|
|
624
624
|
other.members.reject {|m| m == "\n"}.eql?(members.reject {|m| m == "\n"})
|
625
625
|
end
|
626
626
|
|
627
|
+
private
|
628
|
+
|
627
629
|
def path_has_two_subjects?(path)
|
628
630
|
subject = false
|
629
631
|
path.each do |sseq_or_op|
|
data/lib/sass/selector/simple.rb
CHANGED
@@ -5,7 +5,7 @@ module Sass
|
|
5
5
|
class Simple
|
6
6
|
# The line of the Sass template on which this selector was declared.
|
7
7
|
#
|
8
|
-
# @return [
|
8
|
+
# @return [Fixnum]
|
9
9
|
attr_accessor :line
|
10
10
|
|
11
11
|
# The name of the file in which this selector was declared,
|
@@ -31,10 +31,8 @@ module Sass
|
|
31
31
|
|
32
32
|
# Returns the selector string.
|
33
33
|
#
|
34
|
-
# @param opts [Hash] rendering options.
|
35
|
-
# @option opts [Symbol] :style The css rendering style.
|
36
34
|
# @return [String]
|
37
|
-
def to_s
|
35
|
+
def to_s
|
38
36
|
Sass::Util.abstract(self)
|
39
37
|
end
|
40
38
|
|
@@ -44,7 +42,7 @@ module Sass
|
|
44
42
|
# so if that contains information irrelevant to the identity of the selector,
|
45
43
|
# this should be overridden.
|
46
44
|
#
|
47
|
-
# @return [
|
45
|
+
# @return [Fixnum]
|
48
46
|
def hash
|
49
47
|
@_hash ||= equality_key.hash
|
50
48
|
end
|
@@ -80,10 +78,10 @@ module Sass
|
|
80
78
|
# by the time extension and unification happen,
|
81
79
|
# this exception will only ever be raised as a result of programmer error
|
82
80
|
def unify(sels)
|
83
|
-
return sels.first.unify([self]) if sels.length == 1 && sels.first.is_a?(Universal)
|
84
81
|
return sels if sels.any? {|sel2| eql?(sel2)}
|
82
|
+
sels_with_ix = Sass::Util.enum_with_index(sels)
|
85
83
|
if !is_a?(Pseudo) || (sels.last.is_a?(Pseudo) && sels.last.type == :element)
|
86
|
-
_, i =
|
84
|
+
_, i = sels_with_ix.find {|sel, _| sel.is_a?(Pseudo)}
|
87
85
|
end
|
88
86
|
return sels + [self] unless i
|
89
87
|
sels[0...i] + [self] + sels[i..-1]
|
@@ -114,10 +112,10 @@ module Sass
|
|
114
112
|
# could be found at all.
|
115
113
|
# If the second value is `false`, the first should be ignored.
|
116
114
|
def unify_namespaces(ns1, ns2)
|
115
|
+
return nil, false unless ns1 == ns2 || ns1.nil? || ns1 == '*' || ns2.nil? || ns2 == '*'
|
117
116
|
return ns2, true if ns1 == '*'
|
118
117
|
return ns1, true if ns2 == '*'
|
119
|
-
|
120
|
-
[ns1, true]
|
118
|
+
[ns1 || ns2, true]
|
121
119
|
end
|
122
120
|
end
|
123
121
|
end
|
@@ -88,7 +88,7 @@ module Sass
|
|
88
88
|
def resolve_parent_refs(super_cseq)
|
89
89
|
resolved_members = @members.map do |sel|
|
90
90
|
next sel unless sel.is_a?(Pseudo) && sel.selector
|
91
|
-
sel.with_selector(sel.selector.resolve_parent_refs(super_cseq,
|
91
|
+
sel.with_selector(sel.selector.resolve_parent_refs(super_cseq, !:implicit_parent))
|
92
92
|
end.flatten
|
93
93
|
|
94
94
|
# Parent selector only appears as the first selector in the sequence
|
@@ -158,12 +158,12 @@ module Sass
|
|
158
158
|
seen_with_pseudo_selectors = seen.dup
|
159
159
|
|
160
160
|
modified_original = false
|
161
|
-
members = self.members.map do |sel|
|
161
|
+
members = Sass::Util.enum_with_index(self.members).map do |sel, i|
|
162
162
|
next sel unless sel.is_a?(Pseudo) && sel.selector
|
163
163
|
next sel if seen.include?([sel])
|
164
|
-
extended = sel.selector.do_extend(extends, parent_directives, replace, seen,
|
164
|
+
extended = sel.selector.do_extend(extends, parent_directives, replace, seen, !:original)
|
165
165
|
next sel if extended == sel.selector
|
166
|
-
extended.members.reject! {|seq| seq.
|
166
|
+
extended.members.reject! {|seq| seq.has_placeholder?}
|
167
167
|
|
168
168
|
# For `:not()`, we usually want to get rid of any complex
|
169
169
|
# selectors because that will cause the selector to fail to
|
@@ -184,16 +184,17 @@ module Sass
|
|
184
184
|
result
|
185
185
|
end.flatten
|
186
186
|
|
187
|
-
groups = extends[members.to_set]
|
187
|
+
groups = Sass::Util.group_by_to_a(extends[members.to_set]) {|ex| ex.extender}
|
188
188
|
groups.map! do |seq, group|
|
189
189
|
sels = group.map {|e| e.target}.flatten
|
190
190
|
# If A {@extend B} and C {...},
|
191
191
|
# seq is A, sels is B, and self is C
|
192
192
|
|
193
193
|
self_without_sel = Sass::Util.array_minus(members, sels)
|
194
|
-
group.each {|e| e.
|
194
|
+
group.each {|e| e.result = :failed_to_unify unless e.result == :succeeded}
|
195
195
|
unified = seq.members.last.unify(SimpleSequence.new(self_without_sel, subject?))
|
196
196
|
next unless unified
|
197
|
+
group.each {|e| e.result = :succeeded}
|
197
198
|
group.each {|e| check_directives_match!(e, parent_directives)}
|
198
199
|
new_seq = Sequence.new(seq.members[0...-1] + [unified])
|
199
200
|
new_seq.add_sources!(sources + [seq])
|
@@ -203,7 +204,7 @@ module Sass
|
|
203
204
|
groups.map! do |sels, seq|
|
204
205
|
next [] if seen.include?(sels)
|
205
206
|
seq.do_extend(
|
206
|
-
extends, parent_directives,
|
207
|
+
extends, parent_directives, !:replace, seen_with_pseudo_selectors + [sels], !:original)
|
207
208
|
end
|
208
209
|
groups.flatten!
|
209
210
|
|
@@ -259,7 +260,7 @@ module Sass
|
|
259
260
|
|
260
261
|
# Some psuedo-selectors can be subselectors of non-pseudo selectors.
|
261
262
|
# Pull those out here so we can efficiently check against them below.
|
262
|
-
their_subselector_pseudos = %w
|
263
|
+
their_subselector_pseudos = %w[matches any nth-child nth-last-child].
|
263
264
|
map {|name| their_spcs[name] || []}.flatten
|
264
265
|
|
265
266
|
# If `self`'s non-pseudo simple selectors aren't a subset of `their_sseq`'s,
|
@@ -278,19 +279,14 @@ module Sass
|
|
278
279
|
end
|
279
280
|
end
|
280
281
|
|
281
|
-
our_spcs.all? do |
|
282
|
+
our_spcs.all? do |name, pseudos|
|
282
283
|
pseudos.all? {|pseudo| pseudo.superselector?(their_sseq, parents)}
|
283
284
|
end
|
284
285
|
end
|
285
286
|
|
286
287
|
# @see Simple#to_s
|
287
|
-
def to_s
|
288
|
-
res = @members.
|
289
|
-
|
290
|
-
# :not(%foo) may resolve to the empty string, but it should match every
|
291
|
-
# selector so we replace it with "*".
|
292
|
-
res = '*' if res.empty?
|
293
|
-
|
288
|
+
def to_s
|
289
|
+
res = @members.join
|
294
290
|
res << '!' if subject?
|
295
291
|
res
|
296
292
|
end
|
data/lib/sass/shared.rb
CHANGED
@@ -31,7 +31,7 @@ module Sass
|
|
31
31
|
# A `Fixnum` in 1.8, a `String` in 1.9
|
32
32
|
# @param finish [Character] The character closing the balanced pair.
|
33
33
|
# A `Fixnum` in 1.8, a `String` in 1.9
|
34
|
-
# @param count [
|
34
|
+
# @param count [Fixnum] The number of opening characters matched
|
35
35
|
# before calling this method
|
36
36
|
# @return [(String, String)] The string matched within the balanced pair
|
37
37
|
# and the rest of the string.
|
data/lib/sass/source/map.rb
CHANGED
@@ -37,7 +37,7 @@ module Sass::Source
|
|
37
37
|
|
38
38
|
# Shifts all output source ranges forward one or more lines.
|
39
39
|
#
|
40
|
-
# @param delta [
|
40
|
+
# @param delta [Fixnum] The number of lines to shift the ranges forward.
|
41
41
|
def shift_output_lines(delta)
|
42
42
|
return if delta == 0
|
43
43
|
@data.each do |m|
|
@@ -49,7 +49,7 @@ module Sass::Source
|
|
49
49
|
# Shifts any output source ranges that lie on the first line forward one or
|
50
50
|
# more characters on that line.
|
51
51
|
#
|
52
|
-
# @param delta [
|
52
|
+
# @param delta [Fixnum] The number of characters to shift the ranges
|
53
53
|
# forward.
|
54
54
|
def shift_output_offsets(delta)
|
55
55
|
return if delta == 0
|
@@ -84,6 +84,8 @@ module Sass::Source
|
|
84
84
|
# @return [String] The JSON string.
|
85
85
|
# @raise [ArgumentError] If neither `:css_uri` nor `:css_path` and
|
86
86
|
# `:sourcemap_path` are specified.
|
87
|
+
# @comment
|
88
|
+
# rubocop:disable MethodLength
|
87
89
|
def to_json(options)
|
88
90
|
css_uri, css_path, sourcemap_path =
|
89
91
|
options[:css_uri], options[:css_path], options[:sourcemap_path]
|
@@ -91,8 +93,8 @@ module Sass::Source
|
|
91
93
|
raise ArgumentError.new("Sass::Source::Map#to_json requires either " \
|
92
94
|
"the :css_uri option or both the :css_path and :soucemap_path options.")
|
93
95
|
end
|
94
|
-
css_path &&= Sass::Util.pathname(
|
95
|
-
sourcemap_path &&= Sass::Util.pathname(
|
96
|
+
css_path &&= Sass::Util.pathname(Sass::Util.absolute_path(css_path))
|
97
|
+
sourcemap_path &&= Sass::Util.pathname(Sass::Util.absolute_path(sourcemap_path))
|
96
98
|
css_uri ||= Sass::Util.file_uri_from_path(
|
97
99
|
Sass::Util.relative_path_from(css_path, sourcemap_path.dirname))
|
98
100
|
|
@@ -116,14 +118,12 @@ module Sass::Source
|
|
116
118
|
@data.each do |m|
|
117
119
|
file, importer = m.input.file, m.input.importer
|
118
120
|
|
119
|
-
next unless importer
|
120
|
-
|
121
121
|
if options[:type] == :inline
|
122
122
|
source_uri = file
|
123
123
|
else
|
124
124
|
sourcemap_dir = sourcemap_path && sourcemap_path.dirname.to_s
|
125
125
|
sourcemap_dir = nil if options[:type] == :file
|
126
|
-
source_uri = importer.public_url(file, sourcemap_dir)
|
126
|
+
source_uri = importer && importer.public_url(file, sourcemap_dir)
|
127
127
|
next unless source_uri
|
128
128
|
end
|
129
129
|
|
@@ -195,6 +195,8 @@ module Sass::Source
|
|
195
195
|
result << "\n}"
|
196
196
|
result
|
197
197
|
end
|
198
|
+
# @comment
|
199
|
+
# rubocop:enable MethodLength
|
198
200
|
|
199
201
|
private
|
200
202
|
|
data/lib/sass/source/position.rb
CHANGED
@@ -2,17 +2,17 @@ module Sass::Source
|
|
2
2
|
class Position
|
3
3
|
# The one-based line of the document associated with the position.
|
4
4
|
#
|
5
|
-
# @return [
|
5
|
+
# @return [Fixnum]
|
6
6
|
attr_accessor :line
|
7
7
|
|
8
8
|
# The one-based offset in the line of the document associated with the
|
9
9
|
# position.
|
10
10
|
#
|
11
|
-
# @return [
|
11
|
+
# @return [Fixnum]
|
12
12
|
attr_accessor :offset
|
13
13
|
|
14
|
-
# @param line [
|
15
|
-
# @param offset [
|
14
|
+
# @param line [Fixnum] The source line
|
15
|
+
# @param offset [Fixnum] The source offset
|
16
16
|
def initialize(line, offset)
|
17
17
|
@line = line
|
18
18
|
@offset = offset
|