sass 3.1.0.alpha.25 → 3.1.0.alpha.26
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/EDGE_GEM_VERSION +1 -1
- data/VERSION +1 -1
- data/lib/sass/engine.rb +3 -0
- data/lib/sass/scss/parser.rb +1 -1
- data/lib/sass/tree/media_node.rb +72 -0
- data/lib/sass/tree/rule_node.rb +4 -6
- data/test/sass/engine_test.rb +132 -0
- metadata +2 -1
data/EDGE_GEM_VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
3.1.0.alpha.
|
1
|
+
3.1.0.alpha.26
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
3.1.0.alpha.
|
1
|
+
3.1.0.alpha.26
|
data/lib/sass/engine.rb
CHANGED
@@ -7,6 +7,7 @@ require 'sass/tree/rule_node'
|
|
7
7
|
require 'sass/tree/comment_node'
|
8
8
|
require 'sass/tree/prop_node'
|
9
9
|
require 'sass/tree/directive_node'
|
10
|
+
require 'sass/tree/media_node'
|
10
11
|
require 'sass/tree/variable_node'
|
11
12
|
require 'sass/tree/mixin_def_node'
|
12
13
|
require 'sass/tree/mixin_node'
|
@@ -645,6 +646,8 @@ WARNING
|
|
645
646
|
raise SyntaxError.new("Illegal nesting: Nothing may be nested beneath charset directives.",
|
646
647
|
:line => @line + 1) unless line.children.empty?
|
647
648
|
Tree::CharsetNode.new(name)
|
649
|
+
elsif directive == "media"
|
650
|
+
Tree::MediaNode.new(value)
|
648
651
|
else
|
649
652
|
Tree::DirectiveNode.new(line.text)
|
650
653
|
end
|
data/lib/sass/scss/parser.rb
CHANGED
@@ -253,7 +253,7 @@ module Sass
|
|
253
253
|
|
254
254
|
def media_directive
|
255
255
|
val = str {media_query_list}.strip
|
256
|
-
block(node(Sass::Tree::
|
256
|
+
block(node(Sass::Tree::MediaNode.new(val)), :directive)
|
257
257
|
end
|
258
258
|
|
259
259
|
# http://www.w3.org/TR/css3-mediaqueries/#syntax
|
@@ -0,0 +1,72 @@
|
|
1
|
+
module Sass::Tree
|
2
|
+
# A static node representing a `@media` rule.
|
3
|
+
# `@media` rules behave differently from other directives
|
4
|
+
# in that when they're nested within rules,
|
5
|
+
# they bubble up to top-level.
|
6
|
+
#
|
7
|
+
# @see Sass::Tree
|
8
|
+
class MediaNode < DirectiveNode
|
9
|
+
# The media query (e.g. `print` or `screen`).
|
10
|
+
#
|
11
|
+
# @return [String]
|
12
|
+
attr_accessor :query
|
13
|
+
|
14
|
+
# @see RuleNode#tabs
|
15
|
+
attr_accessor :tabs
|
16
|
+
|
17
|
+
# @see RuleNode#group_end
|
18
|
+
attr_accessor :group_end
|
19
|
+
|
20
|
+
# @param query [String] See \{#query}
|
21
|
+
def initialize(query)
|
22
|
+
@query = query
|
23
|
+
@tabs = 0
|
24
|
+
super('')
|
25
|
+
end
|
26
|
+
|
27
|
+
# @see DirectiveNode#value
|
28
|
+
def value
|
29
|
+
"@media #{query}"
|
30
|
+
end
|
31
|
+
|
32
|
+
# Pass on the parent if it's a RuleNode.
|
33
|
+
#
|
34
|
+
# @see Node#cssize
|
35
|
+
def cssize(extends, parent = nil)
|
36
|
+
_cssize(extends, (parent if [MediaNode, RuleNode].include?(parent.class)))
|
37
|
+
rescue Sass::SyntaxError => e
|
38
|
+
e.modify_backtrace(:filename => filename, :line => line)
|
39
|
+
raise e
|
40
|
+
end
|
41
|
+
|
42
|
+
protected
|
43
|
+
|
44
|
+
# Merge nested media queries.
|
45
|
+
#
|
46
|
+
# @see Node#_cssize
|
47
|
+
def _cssize(extends, parent)
|
48
|
+
node = super
|
49
|
+
media = node.children.select {|c| c.is_a?(MediaNode)}
|
50
|
+
node.children.reject! {|c| c.is_a?(MediaNode)}
|
51
|
+
media.each {|n| n.query = "#{query} and #{n.query}"}
|
52
|
+
(node.children.empty? ? [] : [node]) + media
|
53
|
+
end
|
54
|
+
|
55
|
+
# If we're passed a parent, bubble it down.
|
56
|
+
#
|
57
|
+
# @see Node#cssize
|
58
|
+
def cssize!(extends, parent)
|
59
|
+
return super unless parent.is_a?(RuleNode)
|
60
|
+
new_rule = parent.dup
|
61
|
+
new_rule.children = self.children
|
62
|
+
self.children = Array(new_rule.cssize(extends, self))
|
63
|
+
end
|
64
|
+
|
65
|
+
# @see Node#to_s
|
66
|
+
def _to_s(tabs)
|
67
|
+
str = super(tabs + self.tabs)
|
68
|
+
str.gsub!(/\n\Z/, '') unless style == :compressed || group_end
|
69
|
+
str
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
data/lib/sass/tree/rule_node.rb
CHANGED
@@ -53,11 +53,8 @@ module Sass::Tree
|
|
53
53
|
# @param rule [Array<String, Sass::Script::Node>]
|
54
54
|
# The CSS rule. See \{#rule}
|
55
55
|
def initialize(rule)
|
56
|
-
#p rule
|
57
56
|
merged = Sass::Util.merge_adjacent_strings(rule)
|
58
|
-
#p merged
|
59
57
|
@rule = Sass::Util.strip_string_array(merged)
|
60
|
-
#p @rule
|
61
58
|
@tabs = 0
|
62
59
|
super()
|
63
60
|
end
|
@@ -200,8 +197,8 @@ module Sass::Tree
|
|
200
197
|
# or nil if the parent isn't a {RuleNode}
|
201
198
|
def _cssize(extends, parent)
|
202
199
|
node = super
|
203
|
-
rules = node.children.
|
204
|
-
props = node.children.reject {|c| c.is_a?(RuleNode) || c.invisible?}
|
200
|
+
rules = node.children.select {|c| c.is_a?(RuleNode) || c.is_a?(MediaNode)}
|
201
|
+
props = node.children.reject {|c| c.is_a?(RuleNode) || c.is_a?(MediaNode) || c.invisible?}
|
205
202
|
|
206
203
|
unless props.empty?
|
207
204
|
node.children = props
|
@@ -223,7 +220,8 @@ module Sass::Tree
|
|
223
220
|
# or nil if the parent isn't a {RuleNode}
|
224
221
|
# @raise [Sass::SyntaxError] if the rule has no parents but uses `&`
|
225
222
|
def cssize!(extends, parent)
|
226
|
-
|
223
|
+
# It's possible for resolved_rules to be set if we've duplicated this node during @media bubbling
|
224
|
+
self.resolved_rules ||= @parsed_rules.resolve_parent_refs(parent && parent.resolved_rules)
|
227
225
|
super
|
228
226
|
end
|
229
227
|
|
data/test/sass/engine_test.rb
CHANGED
@@ -2241,6 +2241,138 @@ foo
|
|
2241
2241
|
SASS
|
2242
2242
|
end
|
2243
2243
|
|
2244
|
+
def test_media_bubbling
|
2245
|
+
assert_equal <<CSS, render(<<SASS)
|
2246
|
+
.foo {
|
2247
|
+
a: b; }
|
2248
|
+
@media bar {
|
2249
|
+
.foo {
|
2250
|
+
c: d; } }
|
2251
|
+
.foo .baz {
|
2252
|
+
e: f; }
|
2253
|
+
@media bip {
|
2254
|
+
.foo .baz {
|
2255
|
+
g: h; } }
|
2256
|
+
|
2257
|
+
.other {
|
2258
|
+
i: j; }
|
2259
|
+
CSS
|
2260
|
+
.foo
|
2261
|
+
a: b
|
2262
|
+
@media bar
|
2263
|
+
c: d
|
2264
|
+
.baz
|
2265
|
+
e: f
|
2266
|
+
@media bip
|
2267
|
+
g: h
|
2268
|
+
|
2269
|
+
.other
|
2270
|
+
i: j
|
2271
|
+
SASS
|
2272
|
+
|
2273
|
+
assert_equal <<CSS, render(<<SASS, :style => :compact)
|
2274
|
+
.foo { a: b; }
|
2275
|
+
@media bar { .foo { c: d; } }
|
2276
|
+
.foo .baz { e: f; }
|
2277
|
+
@media bip { .foo .baz { g: h; } }
|
2278
|
+
|
2279
|
+
.other { i: j; }
|
2280
|
+
CSS
|
2281
|
+
.foo
|
2282
|
+
a: b
|
2283
|
+
@media bar
|
2284
|
+
c: d
|
2285
|
+
.baz
|
2286
|
+
e: f
|
2287
|
+
@media bip
|
2288
|
+
g: h
|
2289
|
+
|
2290
|
+
.other
|
2291
|
+
i: j
|
2292
|
+
SASS
|
2293
|
+
|
2294
|
+
assert_equal <<CSS, render(<<SASS, :style => :expanded)
|
2295
|
+
.foo {
|
2296
|
+
a: b;
|
2297
|
+
}
|
2298
|
+
@media bar {
|
2299
|
+
.foo {
|
2300
|
+
c: d;
|
2301
|
+
}
|
2302
|
+
}
|
2303
|
+
.foo .baz {
|
2304
|
+
e: f;
|
2305
|
+
}
|
2306
|
+
@media bip {
|
2307
|
+
.foo .baz {
|
2308
|
+
g: h;
|
2309
|
+
}
|
2310
|
+
}
|
2311
|
+
|
2312
|
+
.other {
|
2313
|
+
i: j;
|
2314
|
+
}
|
2315
|
+
CSS
|
2316
|
+
.foo
|
2317
|
+
a: b
|
2318
|
+
@media bar
|
2319
|
+
c: d
|
2320
|
+
.baz
|
2321
|
+
e: f
|
2322
|
+
@media bip
|
2323
|
+
g: h
|
2324
|
+
|
2325
|
+
.other
|
2326
|
+
i: j
|
2327
|
+
SASS
|
2328
|
+
end
|
2329
|
+
|
2330
|
+
def test_double_media_bubbling
|
2331
|
+
assert_equal <<CSS, render(<<SASS)
|
2332
|
+
@media bar and baz {
|
2333
|
+
.foo {
|
2334
|
+
c: d; } }
|
2335
|
+
CSS
|
2336
|
+
@media bar
|
2337
|
+
@media baz
|
2338
|
+
.foo
|
2339
|
+
c: d
|
2340
|
+
SASS
|
2341
|
+
|
2342
|
+
assert_equal <<CSS, render(<<SASS)
|
2343
|
+
@media bar {
|
2344
|
+
.foo {
|
2345
|
+
a: b; } }
|
2346
|
+
@media bar and baz {
|
2347
|
+
.foo {
|
2348
|
+
c: d; } }
|
2349
|
+
CSS
|
2350
|
+
.foo
|
2351
|
+
@media bar
|
2352
|
+
a: b
|
2353
|
+
@media baz
|
2354
|
+
c: d
|
2355
|
+
SASS
|
2356
|
+
end
|
2357
|
+
|
2358
|
+
def test_rule_media_rule_bubbling
|
2359
|
+
assert_equal <<CSS, render(<<SASS)
|
2360
|
+
@media bar {
|
2361
|
+
.foo {
|
2362
|
+
a: b;
|
2363
|
+
e: f; }
|
2364
|
+
.foo .baz {
|
2365
|
+
c: d; } }
|
2366
|
+
CSS
|
2367
|
+
.foo
|
2368
|
+
@media bar
|
2369
|
+
a: b
|
2370
|
+
.baz
|
2371
|
+
c: d
|
2372
|
+
e: f
|
2373
|
+
SASS
|
2374
|
+
end
|
2375
|
+
|
2244
2376
|
# Encodings
|
2245
2377
|
|
2246
2378
|
unless Sass::Util.ruby1_8?
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sass
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.1.0.alpha.
|
4
|
+
version: 3.1.0.alpha.26
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Nathan Weizenbaum
|
@@ -121,6 +121,7 @@ files:
|
|
121
121
|
- lib/sass/tree/warn_node.rb
|
122
122
|
- lib/sass/tree/while_node.rb
|
123
123
|
- lib/sass/tree/each_node.rb
|
124
|
+
- lib/sass/tree/media_node.rb
|
124
125
|
- lib/sass/util.rb
|
125
126
|
- lib/sass/util/subset_map.rb
|
126
127
|
- lib/sass/version.rb
|