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
@@ -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
|