sass 3.2.0.alpha.55 → 3.2.0.alpha.56

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.
data/REVISION CHANGED
@@ -1 +1 @@
1
- 08c1d5258cbb8128cead8f24418ab288a544272d
1
+ ade170e613352cd597338cf29e865d98e8316f9b
data/VERSION CHANGED
@@ -1 +1 @@
1
- 3.2.0.alpha.55
1
+ 3.2.0.alpha.56
@@ -134,10 +134,11 @@ module Sass
134
134
  last_current.unshift(current.pop)
135
135
  end
136
136
  befores = Sass::Util.flatten(befores.map do |before|
137
- subweave(before, current).map {|seqs| seqs + last_current}
137
+ next [] unless sub = subweave(before, current)
138
+ sub.map {|seqs| seqs + last_current}
138
139
  end, 1)
139
- return befores if afters.empty?
140
140
  end
141
+ return befores
141
142
  end
142
143
 
143
144
  # This interweaves two lists of selectors,
@@ -149,14 +150,14 @@ module Sass
149
150
  # `.foo .baz .bar .bang`, `.foo .baz .bar.bang`, `.foo .baz .bang .bar`,
150
151
  # and so on until `.baz .bang .foo .bar`.
151
152
  #
152
- # @overload def subweave(seq1, seq2)
153
153
  # @param seq1 [Array<SimpleSequence or String>]
154
154
  # @param seq2 [Array<SimpleSequence or String>]
155
155
  # @return [Array<Array<SimpleSequence or String>>]
156
- def subweave(seq1, seq2, cache = {})
156
+ def subweave(seq1, seq2)
157
157
  return [seq2] if seq1.empty?
158
158
  return [seq1] if seq2.empty?
159
159
 
160
+ return unless init = merge_initial_ops(seq1, seq2)
160
161
  seq1 = group_selectors(seq1)
161
162
  seq2 = group_selectors(seq2)
162
163
  lcs = Sass::Util.lcs(seq2, seq1) do |s1, s2|
@@ -166,7 +167,7 @@ module Sass
166
167
  next s1 if subweave_superselector?(s2, s1)
167
168
  end
168
169
 
169
- diff = []
170
+ diff = [[init]]
170
171
  until lcs.empty?
171
172
  diff << chunks(seq1, seq2) {|s| subweave_superselector?(s.first, lcs.first)} << [lcs.shift]
172
173
  seq1.shift
@@ -178,6 +179,50 @@ module Sass
178
179
  Sass::Util.paths(diff).map {|p| p.flatten}
179
180
  end
180
181
 
182
+ # Extracts initial selector operators (`"+"`, `">"`, `"~"`, and `"\n"`)
183
+ # from two sequences and merges them together into a single array of
184
+ # selector operators.
185
+ #
186
+ # @param seq1 [Array<SimpleSequence or String>]
187
+ # @param seq2 [Array<SimpleSequence or String>]
188
+ # @return [Array<String>, nil] If there are no operators in the merged
189
+ # sequence, this will be the empty array. If the operators cannot be
190
+ # merged, this will be nil.
191
+ def merge_initial_ops(seq1, seq2)
192
+ ops1, ops2 = [], []
193
+ ops1 << seq1.shift while seq1.first.is_a?(String)
194
+ ops2 << seq2.shift while seq2.first.is_a?(String)
195
+
196
+ newline = false
197
+ newline ||= !!ops1.shift if ops1.first == "\n"
198
+ newline ||= !!ops2.shift if ops2.first == "\n"
199
+
200
+ # If neither sequence is a subsequence of the other, they cannot be
201
+ # merged successfully
202
+ lcs = Sass::Util.lcs(ops1, ops2)
203
+ return unless lcs == ops1 || lcs == ops2
204
+ return (newline ? ["\n"] : []) + (ops1.size > ops2.size ? ops1 : ops2)
205
+ end
206
+
207
+ # Takes initial subsequences of `seq1` and `seq2` and returns all
208
+ # orderings of those subsequences. The initial subsequences are determined
209
+ # by a block.
210
+ #
211
+ # Destructively removes the initial subsequences of `seq1` and `seq2`.
212
+ #
213
+ # For example, given `(A B C | D E)` and `(1 2 | 3 4 5)` (with `|`
214
+ # denoting the boundary of the initial subsequence), this would return
215
+ # `[(A B C 1 2), (1 2 A B C)]`. The sequences would then be `(D E)` and
216
+ # `(3 4 5)`.
217
+ #
218
+ # @param seq1 [Array]
219
+ # @param seq2 [Array]
220
+ # @yield [a] Used to determine when to cut off the initial subsequences.
221
+ # Called repeatedly for each sequence until it returns true.
222
+ # @yieldparam a [Array] A final subsequence of one input sequence after
223
+ # cutting off some initial subsequence.
224
+ # @yieldreturn [Boolean] Whether or not to cut off the initial subsequence
225
+ # here.
181
226
  def chunks(seq1, seq2)
182
227
  chunk1 = []
183
228
  chunk1 << seq1.shift until yield seq1
@@ -189,6 +234,15 @@ module Sass
189
234
  [chunk1 + chunk2, chunk2 + chunk1]
190
235
  end
191
236
 
237
+ # Groups a sequence into subsequences. The subsequences are determined by
238
+ # strings; adjacent non-string elements will be put into separate groups,
239
+ # but any element adjacent to a string will be grouped with that string.
240
+ #
241
+ # For example, `(A B "C" D E "F" G "H" "I" J)` will become `[(A) (B "C" D)
242
+ # (E "F" G "H" "I" J)]`.
243
+ #
244
+ # @param seq [Array]
245
+ # @return [Array<Array>]
192
246
  def group_selectors(seq)
193
247
  newseq = []
194
248
  tail = seq.dup
@@ -202,6 +256,12 @@ module Sass
202
256
  return newseq
203
257
  end
204
258
 
259
+ # Given two sequences of simple selectors, returns whether `sseq1` is a
260
+ # superselector of `sseq2`.
261
+ #
262
+ # @param sseq1 [Array<SimpleSelector or String>]
263
+ # @param sseq2 [Array<SimpleSelector or String>]
264
+ # @return [Boolean]
205
265
  def subweave_superselector?(sseq1, sseq2)
206
266
  if sseq1.size > 1
207
267
  # More complex selectors are never superselectors of less complex ones
@@ -1413,6 +1413,78 @@ $foo: foo;
1413
1413
  SCSS
1414
1414
  end
1415
1415
 
1416
+ # Regression Tests
1417
+
1418
+ def test_duplicated_selector_with_newlines
1419
+ assert_equal(<<CSS, render(<<SCSS))
1420
+ .example-1-1,
1421
+ .example-1-2,
1422
+ .my-page-1 .my-module-1-1,
1423
+ .example-1-3 {
1424
+ a: b; }
1425
+ CSS
1426
+ .example-1-1,
1427
+ .example-1-2,
1428
+ .example-1-3 {
1429
+ a: b;
1430
+ }
1431
+
1432
+ .my-page-1 .my-module-1-1 {@extend .example-1-2}
1433
+ SCSS
1434
+ end
1435
+
1436
+ def test_nested_selector_with_child_selector_hack_extendee
1437
+ assert_equal <<CSS, render(<<SCSS)
1438
+ > .foo, > foo bar {
1439
+ a: b; }
1440
+ CSS
1441
+ > .foo {a: b}
1442
+ foo bar {@extend .foo}
1443
+ SCSS
1444
+ end
1445
+
1446
+ def test_nested_selector_with_child_selector_hack_extender
1447
+ assert_equal <<CSS, render(<<SCSS)
1448
+ .foo .bar, > .foo foo bar, > foo .foo bar {
1449
+ a: b; }
1450
+ CSS
1451
+ .foo .bar {a: b}
1452
+ > foo bar {@extend .bar}
1453
+ SCSS
1454
+ end
1455
+
1456
+ def test_nested_selector_with_child_selector_hack_extender_and_extendee
1457
+ assert_equal <<CSS, render(<<SCSS)
1458
+ > .foo, > foo bar {
1459
+ a: b; }
1460
+ CSS
1461
+ > .foo {a: b}
1462
+ > foo bar {@extend .foo}
1463
+ SCSS
1464
+ end
1465
+
1466
+ def test_nested_selector_with_child_selector_hack_extender_and_sibling_selector_extendee
1467
+ assert_equal <<CSS, render(<<SCSS)
1468
+ ~ .foo {
1469
+ a: b; }
1470
+ CSS
1471
+ ~ .foo {a: b}
1472
+ > foo bar {@extend .foo}
1473
+ SCSS
1474
+ end
1475
+
1476
+ def test_nested_selector_with_child_selector_hack_extender_and_extendee_and_newline
1477
+ assert_equal <<CSS, render(<<SCSS)
1478
+ > .foo, > flip,
1479
+ > foo bar {
1480
+ a: b; }
1481
+ CSS
1482
+ > .foo {a: b}
1483
+ flip,
1484
+ > foo bar {@extend .foo}
1485
+ SCSS
1486
+ end
1487
+
1416
1488
  private
1417
1489
 
1418
1490
  def render(sass, options = {})
metadata CHANGED
@@ -1,15 +1,15 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sass
3
3
  version: !ruby/object:Gem::Version
4
- hash: 592302963
4
+ hash: 592302957
5
5
  prerelease: 6
6
6
  segments:
7
7
  - 3
8
8
  - 2
9
9
  - 0
10
10
  - alpha
11
- - 55
12
- version: 3.2.0.alpha.55
11
+ - 56
12
+ version: 3.2.0.alpha.56
13
13
  platform: ruby
14
14
  authors:
15
15
  - Nathan Weizenbaum
@@ -19,7 +19,7 @@ autorequire:
19
19
  bindir: bin
20
20
  cert_chain: []
21
21
 
22
- date: 2012-01-05 00:00:00 -05:00
22
+ date: 2012-01-13 00:00:00 -05:00
23
23
  default_executable:
24
24
  dependencies:
25
25
  - !ruby/object:Gem::Dependency
@@ -150,6 +150,7 @@ files:
150
150
  - lib/sass/tree/root_node.rb
151
151
  - lib/sass/tree/rule_node.rb
152
152
  - lib/sass/tree/content_node.rb
153
+ - lib/sass/tree/trace_node.rb
153
154
  - lib/sass/tree/variable_node.rb
154
155
  - lib/sass/tree/visitors/base.rb
155
156
  - lib/sass/tree/visitors/check_nesting.rb
@@ -161,7 +162,6 @@ files:
161
162
  - lib/sass/tree/visitors/to_css.rb
162
163
  - lib/sass/tree/warn_node.rb
163
164
  - lib/sass/tree/while_node.rb
164
- - lib/sass/tree/trace_node.rb
165
165
  - lib/sass/util.rb
166
166
  - lib/sass/util/multibyte_string_scanner.rb
167
167
  - lib/sass/util/subset_map.rb