haml 3.1.0.alpha.33 → 3.1.0.alpha.36
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/vendor/sass/doc-src/SASS_CHANGELOG.md +177 -2
- data/vendor/sass/doc-src/SASS_REFERENCE.md +140 -3
- data/vendor/sass/lib/sass/cache_stores.rb +14 -0
- data/vendor/sass/lib/sass/cache_stores/active_support.rb +28 -0
- data/vendor/sass/lib/sass/cache_stores/base.rb +84 -0
- data/vendor/sass/lib/sass/cache_stores/filesystem.rb +56 -0
- data/vendor/sass/lib/sass/cache_stores/memory.rb +51 -0
- data/vendor/sass/lib/sass/cache_stores/null.rb +25 -0
- data/vendor/sass/lib/sass/engine.rb +86 -25
- data/vendor/sass/lib/sass/exec.rb +10 -1
- data/vendor/sass/lib/sass/importers/rails.rb +75 -0
- data/vendor/sass/lib/sass/less.rb +1 -1
- data/vendor/sass/lib/sass/plugin/compiler.rb +4 -1
- data/vendor/sass/lib/sass/plugin/configuration.rb +4 -2
- data/vendor/sass/lib/sass/plugin/rack.rb +15 -2
- data/vendor/sass/lib/sass/plugin/rails.rb +89 -9
- data/vendor/sass/lib/sass/plugin/staleness_checker.rb +30 -2
- data/vendor/sass/lib/sass/script/css_parser.rb +1 -1
- data/vendor/sass/lib/sass/script/functions.rb +126 -5
- data/vendor/sass/lib/sass/script/lexer.rb +1 -1
- data/vendor/sass/lib/sass/script/list.rb +76 -0
- data/vendor/sass/lib/sass/script/literal.rb +10 -1
- data/vendor/sass/lib/sass/script/number.rb +1 -1
- data/vendor/sass/lib/sass/script/operation.rb +3 -2
- data/vendor/sass/lib/sass/script/parser.rb +25 -12
- data/vendor/sass/lib/sass/scss/css_parser.rb +0 -5
- data/vendor/sass/lib/sass/scss/parser.rb +46 -7
- data/vendor/sass/lib/sass/scss/static_parser.rb +1 -1
- data/vendor/sass/lib/sass/tree/charset_node.rb +37 -0
- data/vendor/sass/lib/sass/tree/directive_node.rb +2 -2
- data/vendor/sass/lib/sass/tree/each_node.rb +54 -0
- data/vendor/sass/lib/sass/tree/if_node.rb +19 -0
- data/vendor/sass/lib/sass/tree/media_node.rb +75 -0
- data/vendor/sass/lib/sass/tree/prop_node.rb +1 -1
- data/vendor/sass/lib/sass/tree/root_node.rb +37 -5
- data/vendor/sass/lib/sass/tree/rule_node.rb +4 -6
- data/vendor/sass/lib/sass/util.rb +18 -1
- data/vendor/sass/test/sass/cache_test.rb +7 -7
- data/vendor/sass/test/sass/conversion_test.rb +28 -0
- data/vendor/sass/test/sass/engine_test.rb +214 -11
- data/vendor/sass/test/sass/functions_test.rb +69 -0
- data/vendor/sass/test/sass/plugin_test.rb +13 -4
- data/vendor/sass/test/sass/results/import_charset.css +4 -0
- data/vendor/sass/test/sass/results/import_charset_1_8.css +4 -0
- data/vendor/sass/test/sass/results/import_charset_ibm866.css +4 -0
- data/vendor/sass/test/sass/script_conversion_test.rb +27 -25
- data/vendor/sass/test/sass/script_test.rb +12 -1
- data/vendor/sass/test/sass/scss/css_test.rb +27 -8
- data/vendor/sass/test/sass/scss/scss_test.rb +77 -0
- data/vendor/sass/test/sass/templates/_imported_charset_ibm866.sass +4 -0
- data/vendor/sass/test/sass/templates/_imported_charset_utf8.sass +4 -0
- data/vendor/sass/test/sass/templates/import_charset.sass +7 -0
- data/vendor/sass/test/sass/templates/import_charset_1_8.sass +4 -0
- data/vendor/sass/test/sass/templates/import_charset_ibm866.sass +9 -0
- data/vendor/sass/test/sass/templates/script.sass +2 -2
- data/vendor/sass/test/test_helper.rb +8 -0
- metadata +27 -10
- data/REVISION +0 -1
- data/vendor/sass/lib/sass/cache_store.rb +0 -208
|
@@ -36,6 +36,25 @@ module Sass::Tree
|
|
|
36
36
|
self.else.options = options if self.else
|
|
37
37
|
end
|
|
38
38
|
|
|
39
|
+
# @see Node#_around_dump
|
|
40
|
+
def _around_dump
|
|
41
|
+
old_else = @else
|
|
42
|
+
old_last_else = @last_else
|
|
43
|
+
@else = Sass::Util.dump(@else)
|
|
44
|
+
@last_else = (self == @last_else ? nil : Sass::Util.dump(@last_else))
|
|
45
|
+
super
|
|
46
|
+
ensure
|
|
47
|
+
@else = old_else
|
|
48
|
+
@last_else = old_last_else
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
# @see Node#_after_load
|
|
52
|
+
def _after_load
|
|
53
|
+
super
|
|
54
|
+
@else = Sass::Util.load(@else)
|
|
55
|
+
@last_else = (@last_else ? Sass::Util.load(@last_else) : self)
|
|
56
|
+
end
|
|
57
|
+
|
|
39
58
|
protected
|
|
40
59
|
|
|
41
60
|
# @see Node#to_src
|
|
@@ -0,0 +1,75 @@
|
|
|
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
|
+
# If the last child is actually the end of the group,
|
|
64
|
+
# the parent's cssize will set it properly
|
|
65
|
+
self.children.last.group_end = false unless self.children.empty?
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
# @see Node#to_s
|
|
69
|
+
def _to_s(tabs)
|
|
70
|
+
str = super(tabs + self.tabs)
|
|
71
|
+
str.gsub!(/\n\Z/, '') unless style == :compressed || group_end
|
|
72
|
+
str
|
|
73
|
+
end
|
|
74
|
+
end
|
|
75
|
+
end
|
|
@@ -199,7 +199,7 @@ module Sass::Tree
|
|
|
199
199
|
|
|
200
200
|
def val_to_sass_concat(node, opts)
|
|
201
201
|
return node unless node.is_a?(Sass::Script::Operation)
|
|
202
|
-
return val_to_sass_div(node, opts) unless node.operator == :
|
|
202
|
+
return val_to_sass_div(node, opts) unless node.operator == :space
|
|
203
203
|
|
|
204
204
|
Sass::Script::Operation.new(
|
|
205
205
|
val_to_sass_div(node.operand1, opts),
|
|
@@ -17,7 +17,7 @@ module Sass
|
|
|
17
17
|
def to_s(*args)
|
|
18
18
|
super
|
|
19
19
|
rescue Sass::SyntaxError => e
|
|
20
|
-
e.sass_template
|
|
20
|
+
e.sass_template ||= @template
|
|
21
21
|
raise e
|
|
22
22
|
end
|
|
23
23
|
|
|
@@ -36,7 +36,7 @@ module Sass
|
|
|
36
36
|
environment.options = @options if environment.options.nil? || environment.options.empty?
|
|
37
37
|
super
|
|
38
38
|
rescue Sass::SyntaxError => e
|
|
39
|
-
e.sass_template
|
|
39
|
+
e.sass_template ||= @template
|
|
40
40
|
raise e
|
|
41
41
|
end
|
|
42
42
|
|
|
@@ -47,9 +47,9 @@ module Sass
|
|
|
47
47
|
# @return [(Tree::Node, Sass::Util::SubsetMap)] The resulting tree of static nodes
|
|
48
48
|
# *and* the extensions defined for this tree
|
|
49
49
|
def cssize(extends = Sass::Util::SubsetMap.new, parent = nil)
|
|
50
|
-
return super(extends), extends
|
|
50
|
+
return super(extends, parent), extends
|
|
51
51
|
rescue Sass::SyntaxError => e
|
|
52
|
-
e.sass_template
|
|
52
|
+
e.sass_template ||= @template
|
|
53
53
|
raise e
|
|
54
54
|
end
|
|
55
55
|
|
|
@@ -106,7 +106,39 @@ module Sass
|
|
|
106
106
|
end
|
|
107
107
|
result.rstrip!
|
|
108
108
|
return "" if result.empty?
|
|
109
|
-
|
|
109
|
+
result << "\n"
|
|
110
|
+
unless Sass::Util.ruby1_8? || result.ascii_only?
|
|
111
|
+
if children.first.is_a?(CharsetNode)
|
|
112
|
+
begin
|
|
113
|
+
encoding = children.first.name
|
|
114
|
+
# Default to big-endian encoding, because we have to decide somehow
|
|
115
|
+
encoding << 'BE' if encoding =~ /\Autf-(16|32)\Z/i
|
|
116
|
+
result = result.encode(Encoding.find(encoding))
|
|
117
|
+
rescue EncodingError
|
|
118
|
+
end
|
|
119
|
+
end
|
|
120
|
+
|
|
121
|
+
result = "@charset \"#{result.encoding.name}\";#{
|
|
122
|
+
style == :compressed ? '' : "\n"
|
|
123
|
+
}".encode(result.encoding) + result
|
|
124
|
+
end
|
|
125
|
+
result
|
|
126
|
+
end
|
|
127
|
+
|
|
128
|
+
# In Ruby 1.8, ensures that there's only one @charset directive
|
|
129
|
+
# and that it's at the top of the document.
|
|
130
|
+
#
|
|
131
|
+
# @see Node#cssize
|
|
132
|
+
def cssize!(extends, parent)
|
|
133
|
+
super
|
|
134
|
+
|
|
135
|
+
# In Ruby 1.9 we can make all @charset nodes invisible
|
|
136
|
+
# and infer the final @charset from the encoding of the final string.
|
|
137
|
+
if Sass::Util.ruby1_8? && parent.nil?
|
|
138
|
+
charset = self.children.find {|c| c.is_a?(CharsetNode)}
|
|
139
|
+
self.children.reject! {|c| c.is_a?(CharsetNode)}
|
|
140
|
+
self.children.unshift charset if charset
|
|
141
|
+
end
|
|
110
142
|
end
|
|
111
143
|
|
|
112
144
|
# Returns an error message if the given child node is invalid,
|
|
@@ -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
|
|
|
@@ -17,6 +17,11 @@ module Sass
|
|
|
17
17
|
# @api public
|
|
18
18
|
RUBY_VERSION = ::RUBY_VERSION.split(".").map {|s| s.to_i}
|
|
19
19
|
|
|
20
|
+
# The Ruby engine we're running under. Defaults to `"ruby"`
|
|
21
|
+
# if the top-level constant is undefined.
|
|
22
|
+
# @api public
|
|
23
|
+
RUBY_ENGINE = defined?(::RUBY_ENGINE) ? ::RUBY_ENGINE : "ruby"
|
|
24
|
+
|
|
20
25
|
# Returns the path of a file relative to the Sass root directory.
|
|
21
26
|
#
|
|
22
27
|
# @param file [String] The filename relative to the Sass root
|
|
@@ -416,13 +421,25 @@ module Sass
|
|
|
416
421
|
RbConfig::CONFIG['host_os'] =~ /mswin|windows|mingw/i
|
|
417
422
|
end
|
|
418
423
|
|
|
424
|
+
# Whether or not this is running on IronRuby.
|
|
425
|
+
#
|
|
426
|
+
# @return [Boolean]
|
|
427
|
+
def ironruby?
|
|
428
|
+
RUBY_ENGINE == "ironruby"
|
|
429
|
+
end
|
|
430
|
+
|
|
419
431
|
## Cross-Ruby-Version Compatibility
|
|
420
432
|
|
|
421
433
|
# Whether or not this is running under Ruby 1.8 or lower.
|
|
422
434
|
#
|
|
435
|
+
# Note that IronRuby counts as Ruby 1.8,
|
|
436
|
+
# because it doesn't support the Ruby 1.9 encoding API.
|
|
437
|
+
#
|
|
423
438
|
# @return [Boolean]
|
|
424
439
|
def ruby1_8?
|
|
425
|
-
|
|
440
|
+
# IronRuby says its version is 1.9, but doesn't support any of the encoding APIs.
|
|
441
|
+
# We have to fall back to 1.8 behavior.
|
|
442
|
+
ironruby? || (Sass::Util::RUBY_VERSION[0] == 1 && Sass::Util::RUBY_VERSION[1] < 9)
|
|
426
443
|
end
|
|
427
444
|
|
|
428
445
|
# Whether or not this is running under Ruby 1.8.6 or lower.
|
|
@@ -14,13 +14,13 @@ class CacheTest < Test::Unit::TestCase
|
|
|
14
14
|
end
|
|
15
15
|
|
|
16
16
|
def test_file_cache_writes_a_file
|
|
17
|
-
file_store = Sass::
|
|
17
|
+
file_store = Sass::CacheStores::Filesystem.new(@@cache_dir)
|
|
18
18
|
file_store.store("asdf/foo.scssc", "fakesha1", root_node)
|
|
19
19
|
assert File.exists?("#{@@cache_dir}/asdf/foo.scssc")
|
|
20
20
|
end
|
|
21
21
|
|
|
22
22
|
def test_file_cache_reads_a_file
|
|
23
|
-
file_store = Sass::
|
|
23
|
+
file_store = Sass::CacheStores::Filesystem.new(@@cache_dir)
|
|
24
24
|
assert !File.exists?("#{@@cache_dir}/asdf/foo.scssc")
|
|
25
25
|
file_store.store("asdf/foo.scssc", "fakesha1", root_node)
|
|
26
26
|
assert File.exists?("#{@@cache_dir}/asdf/foo.scssc")
|
|
@@ -28,13 +28,13 @@ class CacheTest < Test::Unit::TestCase
|
|
|
28
28
|
end
|
|
29
29
|
|
|
30
30
|
def test_file_cache_miss_returns_nil
|
|
31
|
-
file_store = Sass::
|
|
31
|
+
file_store = Sass::CacheStores::Filesystem.new(@@cache_dir)
|
|
32
32
|
assert !File.exists?("#{@@cache_dir}/asdf/foo.scssc")
|
|
33
33
|
assert_nil file_store.retrieve("asdf/foo.scssc", "fakesha1")
|
|
34
34
|
end
|
|
35
35
|
|
|
36
36
|
def test_sha_change_invalidates_cache_and_cleans_up
|
|
37
|
-
file_store = Sass::
|
|
37
|
+
file_store = Sass::CacheStores::Filesystem.new(@@cache_dir)
|
|
38
38
|
assert !File.exists?("#{@@cache_dir}/asdf/foo.scssc")
|
|
39
39
|
file_store.store("asdf/foo.scssc", "fakesha1", root_node)
|
|
40
40
|
assert File.exists?("#{@@cache_dir}/asdf/foo.scssc")
|
|
@@ -43,7 +43,7 @@ class CacheTest < Test::Unit::TestCase
|
|
|
43
43
|
end
|
|
44
44
|
|
|
45
45
|
def test_version_change_invalidates_cache_and_cleans_up
|
|
46
|
-
file_store = Sass::
|
|
46
|
+
file_store = Sass::CacheStores::Filesystem.new(@@cache_dir)
|
|
47
47
|
assert !File.exists?("#{@@cache_dir}/asdf/foo.scssc")
|
|
48
48
|
file_store.store("asdf/foo.scssc", "fakesha1", root_node)
|
|
49
49
|
assert File.exists?("#{@@cache_dir}/asdf/foo.scssc")
|
|
@@ -58,7 +58,7 @@ class CacheTest < Test::Unit::TestCase
|
|
|
58
58
|
end
|
|
59
59
|
|
|
60
60
|
def test_arbitrary_objects_can_go_into_cache
|
|
61
|
-
cache = Sass::
|
|
61
|
+
cache = Sass::CacheStores::Memory.new
|
|
62
62
|
an_object = {:foo => :bar}
|
|
63
63
|
cache.store("an_object", "", an_object)
|
|
64
64
|
assert_equal an_object, cache.retrieve("an_object", "")
|
|
@@ -71,4 +71,4 @@ class CacheTest < Test::Unit::TestCase
|
|
|
71
71
|
div { @include color(red); }
|
|
72
72
|
SCSS
|
|
73
73
|
end
|
|
74
|
-
end
|
|
74
|
+
end
|
|
@@ -607,6 +607,14 @@ foo {
|
|
|
607
607
|
SCSS
|
|
608
608
|
end
|
|
609
609
|
|
|
610
|
+
def test_charset
|
|
611
|
+
assert_renders <<SASS, <<SCSS
|
|
612
|
+
@charset "utf-8"
|
|
613
|
+
SASS
|
|
614
|
+
@charset "utf-8";
|
|
615
|
+
SCSS
|
|
616
|
+
end
|
|
617
|
+
|
|
610
618
|
def test_for
|
|
611
619
|
assert_renders <<SASS, <<SCSS
|
|
612
620
|
foo
|
|
@@ -667,6 +675,26 @@ foo {
|
|
|
667
675
|
SCSS
|
|
668
676
|
end
|
|
669
677
|
|
|
678
|
+
def test_each
|
|
679
|
+
assert_renders <<SASS, <<SCSS
|
|
680
|
+
a
|
|
681
|
+
@each $number in 1px 2px 3px 4px
|
|
682
|
+
b: $number
|
|
683
|
+
|
|
684
|
+
c
|
|
685
|
+
@each $str in foo, bar, baz, bang
|
|
686
|
+
d: $str
|
|
687
|
+
SASS
|
|
688
|
+
a {
|
|
689
|
+
@each $number in 1px 2px 3px 4px {
|
|
690
|
+
b: $number; } }
|
|
691
|
+
|
|
692
|
+
c {
|
|
693
|
+
@each $str in foo, bar, baz, bang {
|
|
694
|
+
d: $str; } }
|
|
695
|
+
SCSS
|
|
696
|
+
end
|
|
697
|
+
|
|
670
698
|
def test_import
|
|
671
699
|
assert_renders <<SASS, <<SCSS
|
|
672
700
|
@import foo
|
|
@@ -56,12 +56,8 @@ MSG
|
|
|
56
56
|
"$a: #ccc + 2px" => "Cannot add a number with units (2px) to a color (#cccccc).",
|
|
57
57
|
"& a\n :b c" => ["Base-level rules cannot contain the parent-selector-referencing character '&'.", 1],
|
|
58
58
|
"a\n :b\n c" => "Illegal nesting: Only properties may be nested beneath properties.",
|
|
59
|
-
"a,\n :b c" => ["Rules can\'t end in commas.", 1],
|
|
60
|
-
"a," => "Rules can\'t end in commas.",
|
|
61
|
-
"a,\n$b: 1" => ["Rules can\'t end in commas.", 1],
|
|
62
59
|
"$a: b\n :c d\n" => "Illegal nesting: Nothing may be nested beneath variable declarations.",
|
|
63
60
|
"@import foo.sass" => "File to import not found or unreadable: foo.sass.",
|
|
64
|
-
"a,\n$b: 1" => ["Rules can\'t end in commas.", 1],
|
|
65
61
|
"$a: b\n :c d\n" => "Illegal nesting: Nothing may be nested beneath variable declarations.",
|
|
66
62
|
"@import foo.sass" => <<MSG,
|
|
67
63
|
File to import not found or unreadable: foo.sass.
|
|
@@ -610,6 +606,12 @@ SASS
|
|
|
610
606
|
|
|
611
607
|
assert_equal("#foo #bar,#baz #boom{foo:bar}\n",
|
|
612
608
|
render("#foo #bar,\n#baz #boom\n :foo bar", :style => :compressed))
|
|
609
|
+
|
|
610
|
+
assert_equal("#foo #bar,\n#baz #boom {\n foo: bar; }\n",
|
|
611
|
+
render("#foo #bar,,\n,#baz #boom,\n :foo bar"))
|
|
612
|
+
|
|
613
|
+
assert_equal("#bip #bop {\n foo: bar; }\n",
|
|
614
|
+
render("#bip #bop,, ,\n :foo bar"))
|
|
613
615
|
end
|
|
614
616
|
|
|
615
617
|
def test_complex_multiline_selector
|
|
@@ -1281,6 +1283,29 @@ a
|
|
|
1281
1283
|
SASS
|
|
1282
1284
|
end
|
|
1283
1285
|
|
|
1286
|
+
def test_each
|
|
1287
|
+
assert_equal(<<CSS, render(<<SASS))
|
|
1288
|
+
a {
|
|
1289
|
+
b: 1px;
|
|
1290
|
+
b: 2px;
|
|
1291
|
+
b: 3px;
|
|
1292
|
+
b: 4px;
|
|
1293
|
+
c: foo;
|
|
1294
|
+
c: bar;
|
|
1295
|
+
c: baz;
|
|
1296
|
+
c: bang;
|
|
1297
|
+
d: blue; }
|
|
1298
|
+
CSS
|
|
1299
|
+
a
|
|
1300
|
+
@each $number in 1px 2px 3px 4px
|
|
1301
|
+
b: $number
|
|
1302
|
+
@each $str in foo, bar, baz, bang
|
|
1303
|
+
c: $str
|
|
1304
|
+
@each $single in blue
|
|
1305
|
+
d: $single
|
|
1306
|
+
SASS
|
|
1307
|
+
end
|
|
1308
|
+
|
|
1284
1309
|
def test_variable_reassignment
|
|
1285
1310
|
assert_equal(<<CSS, render(<<SASS))
|
|
1286
1311
|
a {
|
|
@@ -2218,6 +2243,180 @@ foo
|
|
|
2218
2243
|
SASS
|
|
2219
2244
|
end
|
|
2220
2245
|
|
|
2246
|
+
def test_media_bubbling
|
|
2247
|
+
assert_equal <<CSS, render(<<SASS)
|
|
2248
|
+
.foo {
|
|
2249
|
+
a: b; }
|
|
2250
|
+
@media bar {
|
|
2251
|
+
.foo {
|
|
2252
|
+
c: d; } }
|
|
2253
|
+
.foo .baz {
|
|
2254
|
+
e: f; }
|
|
2255
|
+
@media bip {
|
|
2256
|
+
.foo .baz {
|
|
2257
|
+
g: h; } }
|
|
2258
|
+
|
|
2259
|
+
.other {
|
|
2260
|
+
i: j; }
|
|
2261
|
+
CSS
|
|
2262
|
+
.foo
|
|
2263
|
+
a: b
|
|
2264
|
+
@media bar
|
|
2265
|
+
c: d
|
|
2266
|
+
.baz
|
|
2267
|
+
e: f
|
|
2268
|
+
@media bip
|
|
2269
|
+
g: h
|
|
2270
|
+
|
|
2271
|
+
.other
|
|
2272
|
+
i: j
|
|
2273
|
+
SASS
|
|
2274
|
+
|
|
2275
|
+
assert_equal <<CSS, render(<<SASS, :style => :compact)
|
|
2276
|
+
.foo { a: b; }
|
|
2277
|
+
@media bar { .foo { c: d; } }
|
|
2278
|
+
.foo .baz { e: f; }
|
|
2279
|
+
@media bip { .foo .baz { g: h; } }
|
|
2280
|
+
|
|
2281
|
+
.other { i: j; }
|
|
2282
|
+
CSS
|
|
2283
|
+
.foo
|
|
2284
|
+
a: b
|
|
2285
|
+
@media bar
|
|
2286
|
+
c: d
|
|
2287
|
+
.baz
|
|
2288
|
+
e: f
|
|
2289
|
+
@media bip
|
|
2290
|
+
g: h
|
|
2291
|
+
|
|
2292
|
+
.other
|
|
2293
|
+
i: j
|
|
2294
|
+
SASS
|
|
2295
|
+
|
|
2296
|
+
assert_equal <<CSS, render(<<SASS, :style => :expanded)
|
|
2297
|
+
.foo {
|
|
2298
|
+
a: b;
|
|
2299
|
+
}
|
|
2300
|
+
@media bar {
|
|
2301
|
+
.foo {
|
|
2302
|
+
c: d;
|
|
2303
|
+
}
|
|
2304
|
+
}
|
|
2305
|
+
.foo .baz {
|
|
2306
|
+
e: f;
|
|
2307
|
+
}
|
|
2308
|
+
@media bip {
|
|
2309
|
+
.foo .baz {
|
|
2310
|
+
g: h;
|
|
2311
|
+
}
|
|
2312
|
+
}
|
|
2313
|
+
|
|
2314
|
+
.other {
|
|
2315
|
+
i: j;
|
|
2316
|
+
}
|
|
2317
|
+
CSS
|
|
2318
|
+
.foo
|
|
2319
|
+
a: b
|
|
2320
|
+
@media bar
|
|
2321
|
+
c: d
|
|
2322
|
+
.baz
|
|
2323
|
+
e: f
|
|
2324
|
+
@media bip
|
|
2325
|
+
g: h
|
|
2326
|
+
|
|
2327
|
+
.other
|
|
2328
|
+
i: j
|
|
2329
|
+
SASS
|
|
2330
|
+
end
|
|
2331
|
+
|
|
2332
|
+
def test_double_media_bubbling
|
|
2333
|
+
assert_equal <<CSS, render(<<SASS)
|
|
2334
|
+
@media bar and baz {
|
|
2335
|
+
.foo {
|
|
2336
|
+
c: d; } }
|
|
2337
|
+
CSS
|
|
2338
|
+
@media bar
|
|
2339
|
+
@media baz
|
|
2340
|
+
.foo
|
|
2341
|
+
c: d
|
|
2342
|
+
SASS
|
|
2343
|
+
|
|
2344
|
+
assert_equal <<CSS, render(<<SASS)
|
|
2345
|
+
@media bar {
|
|
2346
|
+
.foo {
|
|
2347
|
+
a: b; } }
|
|
2348
|
+
@media bar and baz {
|
|
2349
|
+
.foo {
|
|
2350
|
+
c: d; } }
|
|
2351
|
+
CSS
|
|
2352
|
+
.foo
|
|
2353
|
+
@media bar
|
|
2354
|
+
a: b
|
|
2355
|
+
@media baz
|
|
2356
|
+
c: d
|
|
2357
|
+
SASS
|
|
2358
|
+
end
|
|
2359
|
+
|
|
2360
|
+
def test_rule_media_rule_bubbling
|
|
2361
|
+
assert_equal <<CSS, render(<<SASS)
|
|
2362
|
+
@media bar {
|
|
2363
|
+
.foo {
|
|
2364
|
+
a: b;
|
|
2365
|
+
e: f; }
|
|
2366
|
+
.foo .baz {
|
|
2367
|
+
c: d; } }
|
|
2368
|
+
CSS
|
|
2369
|
+
.foo
|
|
2370
|
+
@media bar
|
|
2371
|
+
a: b
|
|
2372
|
+
.baz
|
|
2373
|
+
c: d
|
|
2374
|
+
e: f
|
|
2375
|
+
SASS
|
|
2376
|
+
end
|
|
2377
|
+
|
|
2378
|
+
def test_nested_media_around_properties
|
|
2379
|
+
assert_equal <<CSS, render(<<SASS)
|
|
2380
|
+
.outside {
|
|
2381
|
+
color: red;
|
|
2382
|
+
background: blue; }
|
|
2383
|
+
@media print {
|
|
2384
|
+
.outside {
|
|
2385
|
+
color: black; } }
|
|
2386
|
+
@media print and nested {
|
|
2387
|
+
.outside .inside {
|
|
2388
|
+
border: 1px solid black; } }
|
|
2389
|
+
.outside .middle {
|
|
2390
|
+
display: block; }
|
|
2391
|
+
CSS
|
|
2392
|
+
.outside
|
|
2393
|
+
color: red
|
|
2394
|
+
@media print
|
|
2395
|
+
color: black
|
|
2396
|
+
.inside
|
|
2397
|
+
@media nested
|
|
2398
|
+
border: 1px solid black
|
|
2399
|
+
background: blue
|
|
2400
|
+
.middle
|
|
2401
|
+
display: block
|
|
2402
|
+
SASS
|
|
2403
|
+
end
|
|
2404
|
+
|
|
2405
|
+
def test_media_with_parent_references
|
|
2406
|
+
sass_str = <<SASS
|
|
2407
|
+
.outside
|
|
2408
|
+
@media print
|
|
2409
|
+
&.inside
|
|
2410
|
+
border: 1px solid black
|
|
2411
|
+
SASS
|
|
2412
|
+
css_str = <<CSS
|
|
2413
|
+
@media print {
|
|
2414
|
+
.outside.inside {
|
|
2415
|
+
border: 1px solid black; } }
|
|
2416
|
+
CSS
|
|
2417
|
+
assert_equal css_str, render(sass_str)
|
|
2418
|
+
end
|
|
2419
|
+
|
|
2221
2420
|
# Encodings
|
|
2222
2421
|
|
|
2223
2422
|
unless Sass::Util.ruby1_8?
|
|
@@ -2241,7 +2440,7 @@ SASS
|
|
|
2241
2440
|
|
|
2242
2441
|
def test_same_charset_as_encoding
|
|
2243
2442
|
assert_renders_encoded(<<CSS, <<SASS)
|
|
2244
|
-
@charset "
|
|
2443
|
+
@charset "UTF-8";
|
|
2245
2444
|
fóó {
|
|
2246
2445
|
a: b; }
|
|
2247
2446
|
CSS
|
|
@@ -2253,7 +2452,7 @@ SASS
|
|
|
2253
2452
|
|
|
2254
2453
|
def test_different_charset_than_encoding
|
|
2255
2454
|
assert_renders_encoded(<<CSS.force_encoding("IBM866"), <<SASS)
|
|
2256
|
-
@charset "
|
|
2455
|
+
@charset "IBM866";
|
|
2257
2456
|
fóó {
|
|
2258
2457
|
a: b; }
|
|
2259
2458
|
CSS
|
|
@@ -2265,6 +2464,7 @@ SASS
|
|
|
2265
2464
|
|
|
2266
2465
|
def test_different_encoding_than_system
|
|
2267
2466
|
assert_renders_encoded(<<CSS.encode("IBM866"), <<SASS.encode("IBM866"))
|
|
2467
|
+
@charset "IBM866";
|
|
2268
2468
|
тАЬ {
|
|
2269
2469
|
a: b; }
|
|
2270
2470
|
CSS
|
|
@@ -2274,20 +2474,20 @@ SASS
|
|
|
2274
2474
|
end
|
|
2275
2475
|
|
|
2276
2476
|
def test_multibyte_charset
|
|
2277
|
-
assert_renders_encoded(<<CSS.encode("UTF-
|
|
2278
|
-
@charset "
|
|
2477
|
+
assert_renders_encoded(<<CSS.encode("UTF-16LE"), <<SASS.encode("UTF-16LE").force_encoding("UTF-8"))
|
|
2478
|
+
@charset "UTF-16LE";
|
|
2279
2479
|
fóó {
|
|
2280
2480
|
a: b; }
|
|
2281
2481
|
CSS
|
|
2282
|
-
@charset "utf-
|
|
2482
|
+
@charset "utf-16le"
|
|
2283
2483
|
fóó
|
|
2284
2484
|
a: b
|
|
2285
2485
|
SASS
|
|
2286
2486
|
end
|
|
2287
2487
|
|
|
2288
2488
|
def test_multibyte_charset_without_endian_specifier
|
|
2289
|
-
assert_renders_encoded(<<CSS.encode("UTF-
|
|
2290
|
-
@charset "
|
|
2489
|
+
assert_renders_encoded(<<CSS.encode("UTF-32BE"), <<SASS.encode("UTF-32BE").force_encoding("UTF-8"))
|
|
2490
|
+
@charset "UTF-32BE";
|
|
2291
2491
|
fóó {
|
|
2292
2492
|
a: b; }
|
|
2293
2493
|
CSS
|
|
@@ -2299,6 +2499,7 @@ SASS
|
|
|
2299
2499
|
|
|
2300
2500
|
def test_utf8_bom
|
|
2301
2501
|
assert_renders_encoded(<<CSS, <<SASS.force_encoding("BINARY"))
|
|
2502
|
+
@charset "UTF-8";
|
|
2302
2503
|
fóó {
|
|
2303
2504
|
a: b; }
|
|
2304
2505
|
CSS
|
|
@@ -2309,6 +2510,7 @@ SASS
|
|
|
2309
2510
|
|
|
2310
2511
|
def test_utf16le_bom
|
|
2311
2512
|
assert_renders_encoded(<<CSS.encode("UTF-16LE"), <<SASS.encode("UTF-16LE").force_encoding("BINARY"))
|
|
2513
|
+
@charset "UTF-16LE";
|
|
2312
2514
|
fóó {
|
|
2313
2515
|
a: b; }
|
|
2314
2516
|
CSS
|
|
@@ -2319,6 +2521,7 @@ SASS
|
|
|
2319
2521
|
|
|
2320
2522
|
def test_utf32be_bom
|
|
2321
2523
|
assert_renders_encoded(<<CSS.encode("UTF-32BE"), <<SASS.encode("UTF-32BE").force_encoding("BINARY"))
|
|
2524
|
+
@charset "UTF-32BE";
|
|
2322
2525
|
fóó {
|
|
2323
2526
|
a: b; }
|
|
2324
2527
|
CSS
|