sass 3.2.0.alpha.11 → 3.2.0.alpha.21
Sign up to get free protection for your applications and to get access to all the features.
- data/REVISION +1 -1
- data/VERSION +1 -1
- data/lib/sass/cache_stores/base.rb +4 -9
- data/lib/sass/cache_stores/filesystem.rb +2 -0
- data/lib/sass/css.rb +2 -1
- data/lib/sass/engine.rb +28 -8
- data/lib/sass/environment.rb +26 -0
- data/lib/sass/exec.rb +13 -0
- data/lib/sass/importers/base.rb +2 -1
- data/lib/sass/script/funcall.rb +8 -0
- data/lib/sass/script/interpolation.rb +9 -0
- data/lib/sass/script/list.rb +7 -0
- data/lib/sass/script/literal.rb +5 -0
- data/lib/sass/script/node.rb +8 -0
- data/lib/sass/script/number.rb +28 -5
- data/lib/sass/script/operation.rb +8 -0
- data/lib/sass/script/string_interpolation.rb +9 -0
- data/lib/sass/script/unary_operation.rb +7 -0
- data/lib/sass/script/variable.rb +5 -0
- data/lib/sass/scss/parser.rb +26 -13
- data/lib/sass/scss/rx.rb +1 -1
- data/lib/sass/scss/static_parser.rb +2 -2
- data/lib/sass/tree/content_node.rb +9 -0
- data/lib/sass/tree/debug_node.rb +1 -6
- data/lib/sass/tree/each_node.rb +1 -7
- data/lib/sass/tree/extend_node.rb +1 -1
- data/lib/sass/tree/for_node.rb +2 -7
- data/lib/sass/tree/function_node.rb +1 -6
- data/lib/sass/tree/if_node.rb +1 -19
- data/lib/sass/tree/mixin_def_node.rb +5 -6
- data/lib/sass/tree/mixin_node.rb +2 -7
- data/lib/sass/tree/node.rb +4 -19
- data/lib/sass/tree/prop_node.rb +0 -5
- data/lib/sass/tree/return_node.rb +1 -6
- data/lib/sass/tree/rule_node.rb +9 -7
- data/lib/sass/tree/trace_node.rb +32 -0
- data/lib/sass/tree/variable_node.rb +1 -7
- data/lib/sass/tree/visitors/check_nesting.rb +30 -13
- data/lib/sass/tree/visitors/convert.rb +5 -1
- data/lib/sass/tree/visitors/cssize.rb +3 -3
- data/lib/sass/tree/visitors/deep_copy.rb +87 -0
- data/lib/sass/tree/visitors/perform.rb +36 -16
- data/lib/sass/tree/visitors/set_options.rb +97 -0
- data/lib/sass/tree/visitors/to_css.rb +5 -1
- data/lib/sass/tree/warn_node.rb +1 -7
- data/lib/sass/tree/while_node.rb +1 -7
- data/test/sass/cache_test.rb +15 -0
- data/test/sass/conversion_test.rb +38 -0
- data/test/sass/css2sass_test.rb +9 -0
- data/test/sass/engine_test.rb +248 -17
- data/test/sass/scss/css_test.rb +4 -2
- data/test/sass/scss/scss_test.rb +53 -12
- data/vendor/fssm/Gemfile +3 -0
- data/vendor/fssm/LICENSE +1 -1
- data/vendor/fssm/README.markdown +55 -27
- data/vendor/fssm/Rakefile +6 -54
- data/vendor/fssm/example.rb +6 -3
- data/vendor/fssm/fssm.gemspec +17 -70
- data/vendor/fssm/lib/fssm.rb +7 -3
- data/vendor/fssm/lib/fssm/backends/fsevents.rb +1 -1
- data/vendor/fssm/lib/fssm/backends/inotify.rb +2 -2
- data/vendor/fssm/lib/fssm/backends/polling.rb +2 -2
- data/vendor/fssm/lib/fssm/backends/rbfsevent.rb +42 -0
- data/vendor/fssm/lib/fssm/backends/rubycocoa/fsevents.rb +10 -10
- data/vendor/fssm/lib/fssm/monitor.rb +19 -9
- data/vendor/fssm/lib/fssm/path.rb +24 -21
- data/vendor/fssm/lib/fssm/pathname.rb +13 -479
- data/vendor/fssm/lib/fssm/state/directory.rb +29 -11
- data/vendor/fssm/lib/fssm/state/file.rb +1 -1
- data/vendor/fssm/lib/fssm/support.rb +41 -12
- data/vendor/fssm/lib/fssm/tree.rb +6 -6
- data/vendor/fssm/lib/fssm/version.rb +3 -0
- data/vendor/fssm/profile/prof-cache.rb +3 -3
- data/vendor/fssm/profile/prof-pathname-rubinius.rb +35 -0
- data/vendor/fssm/profile/prof-pathname.rb +7 -7
- data/vendor/fssm/spec/count_down_latch.rb +151 -0
- data/vendor/fssm/spec/monitor_spec.rb +202 -0
- data/vendor/fssm/spec/path_spec.rb +36 -15
- data/vendor/fssm/spec/spec_helper.rb +6 -6
- metadata +14 -4
- data/vendor/fssm/VERSION.yml +0 -5
@@ -175,7 +175,11 @@ class Sass::Tree::Visitors::Convert < Sass::Tree::Visitors::Base
|
|
175
175
|
keywords = node.keywords.map {|k, v| "$#{dasherize(k)}: #{v.to_sass(@options)}"}.join(', ')
|
176
176
|
arglist = "(#{args}#{', ' unless args.empty? || keywords.empty?}#{keywords})"
|
177
177
|
end
|
178
|
-
"#{tab_str}#{@format == :sass ? '+' : '@include '}#{dasherize(node.name)}#{arglist}#{semi}\n"
|
178
|
+
"#{tab_str}#{@format == :sass ? '+' : '@include '}#{dasherize(node.name)}#{arglist}#{node.has_children ? yield : semi}\n"
|
179
|
+
end
|
180
|
+
|
181
|
+
def visit_content(node)
|
182
|
+
"#{tab_str}@content#{semi}\n"
|
179
183
|
end
|
180
184
|
|
181
185
|
def visit_prop(node)
|
@@ -121,9 +121,9 @@ class Sass::Tree::Visitors::Cssize < Sass::Tree::Visitors::Base
|
|
121
121
|
(node.children.empty? ? [] : [node]) + media
|
122
122
|
end
|
123
123
|
|
124
|
-
# Asserts that all the
|
125
|
-
def
|
126
|
-
# Don't use #visit_children to avoid adding the
|
124
|
+
# Asserts that all the traced children are valid in their new location.
|
125
|
+
def visit_trace(node)
|
126
|
+
# Don't use #visit_children to avoid adding the trace node to the list of parents.
|
127
127
|
node.children.map {|c| visit(c)}.flatten
|
128
128
|
rescue Sass::SyntaxError => e
|
129
129
|
e.modify_backtrace(:mixin => node.name, :filename => node.filename, :line => node.line)
|
@@ -0,0 +1,87 @@
|
|
1
|
+
# A visitor for copying the full structure of a Sass tree.
|
2
|
+
class Sass::Tree::Visitors::DeepCopy < Sass::Tree::Visitors::Base
|
3
|
+
protected
|
4
|
+
|
5
|
+
def visit(node)
|
6
|
+
super(node.dup)
|
7
|
+
end
|
8
|
+
|
9
|
+
def visit_children(parent)
|
10
|
+
parent.children = parent.children.map {|c| visit(c)}
|
11
|
+
parent
|
12
|
+
end
|
13
|
+
|
14
|
+
def visit_debug(node)
|
15
|
+
node.expr = node.expr.deep_copy
|
16
|
+
yield
|
17
|
+
end
|
18
|
+
|
19
|
+
def visit_each(node)
|
20
|
+
node.list = node.list.deep_copy
|
21
|
+
yield
|
22
|
+
end
|
23
|
+
|
24
|
+
def visit_extend(node)
|
25
|
+
node.selector = node.selector.map {|c| c.is_a?(Sass::Script::Node) ? c.deep_copy : c}
|
26
|
+
yield
|
27
|
+
end
|
28
|
+
|
29
|
+
def visit_for(node)
|
30
|
+
node.from = node.from.deep_copy
|
31
|
+
node.to = node.to.deep_copy
|
32
|
+
yield
|
33
|
+
end
|
34
|
+
|
35
|
+
def visit_function(node)
|
36
|
+
node.args = node.args.map {|k, v| [k.deep_copy, v && v.deep_copy]}
|
37
|
+
yield
|
38
|
+
end
|
39
|
+
|
40
|
+
def visit_if(node)
|
41
|
+
node.expr = node.expr.deep_copy if node.expr
|
42
|
+
node.else = visit(node.else) if node.else
|
43
|
+
yield
|
44
|
+
end
|
45
|
+
|
46
|
+
def visit_mixin_def(node)
|
47
|
+
node.args = node.args.map {|k, v| [k.deep_copy, v && v.deep_copy]}
|
48
|
+
yield
|
49
|
+
end
|
50
|
+
|
51
|
+
def visit_mixin(node)
|
52
|
+
node.args = node.args.map {|a| a.deep_copy}
|
53
|
+
node.keywords = Hash[node.keywords.map {|k, v| [k, v.deep_copy]}]
|
54
|
+
yield
|
55
|
+
end
|
56
|
+
|
57
|
+
def visit_prop(node)
|
58
|
+
node.name = node.name.map {|c| c.is_a?(Sass::Script::Node) ? c.deep_copy : c}
|
59
|
+
node.value = node.value.deep_copy
|
60
|
+
yield
|
61
|
+
end
|
62
|
+
|
63
|
+
def visit_return(node)
|
64
|
+
node.expr = node.expr.deep_copy
|
65
|
+
yield
|
66
|
+
end
|
67
|
+
|
68
|
+
def visit_rule(node)
|
69
|
+
node.rule = node.rule.map {|c| c.is_a?(Sass::Script::Node) ? c.deep_copy : c}
|
70
|
+
yield
|
71
|
+
end
|
72
|
+
|
73
|
+
def visit_variable(node)
|
74
|
+
node.expr = node.expr.deep_copy
|
75
|
+
yield
|
76
|
+
end
|
77
|
+
|
78
|
+
def visit_warn(node)
|
79
|
+
node.expr = node.expr.deep_copy
|
80
|
+
yield
|
81
|
+
end
|
82
|
+
|
83
|
+
def visit_while(node)
|
84
|
+
node.expr = node.expr.deep_copy
|
85
|
+
yield
|
86
|
+
end
|
87
|
+
end
|
@@ -13,7 +13,7 @@ class Sass::Tree::Visitors::Perform < Sass::Tree::Visitors::Base
|
|
13
13
|
@environment = env
|
14
14
|
end
|
15
15
|
|
16
|
-
# If an exception is raised, this
|
16
|
+
# If an exception is raised, this adds proper metadata to the backtrace.
|
17
17
|
def visit(node)
|
18
18
|
super(node.dup)
|
19
19
|
rescue Sass::SyntaxError => e
|
@@ -89,8 +89,8 @@ class Sass::Tree::Visitors::Perform < Sass::Tree::Visitors::Base
|
|
89
89
|
# Runs SassScript interpolation in the selector,
|
90
90
|
# and then parses the result into a {Sass::Selector::CommaSequence}.
|
91
91
|
def visit_extend(node)
|
92
|
-
parser = Sass::SCSS::CssParser.new(run_interp(node.selector), node.line)
|
93
|
-
node.resolved_selector = parser.parse_selector
|
92
|
+
parser = Sass::SCSS::CssParser.new(run_interp(node.selector), node.filename, node.line)
|
93
|
+
node.resolved_selector = parser.parse_selector
|
94
94
|
node
|
95
95
|
end
|
96
96
|
|
@@ -116,7 +116,7 @@ class Sass::Tree::Visitors::Perform < Sass::Tree::Visitors::Base
|
|
116
116
|
# Loads the function into the environment.
|
117
117
|
def visit_function(node)
|
118
118
|
@environment.set_function(node.name,
|
119
|
-
Sass::Callable.new(node.name, node.args, @environment, node.children))
|
119
|
+
Sass::Callable.new(node.name, node.args, @environment, node.children, !:has_content))
|
120
120
|
[]
|
121
121
|
end
|
122
122
|
|
@@ -155,7 +155,7 @@ class Sass::Tree::Visitors::Perform < Sass::Tree::Visitors::Base
|
|
155
155
|
# Loads a mixin into the environment.
|
156
156
|
def visit_mixindef(node)
|
157
157
|
@environment.set_mixin(node.name,
|
158
|
-
Sass::Callable.new(node.name, node.args, @environment, node.children))
|
158
|
+
Sass::Callable.new(node.name, node.args, @environment, node.children, node.has_content))
|
159
159
|
[]
|
160
160
|
end
|
161
161
|
|
@@ -168,6 +168,10 @@ class Sass::Tree::Visitors::Perform < Sass::Tree::Visitors::Base
|
|
168
168
|
original_env.prepare_frame(:mixin => node.name)
|
169
169
|
raise Sass::SyntaxError.new("Undefined mixin '#{node.name}'.") unless mixin = @environment.mixin(node.name)
|
170
170
|
|
171
|
+
if node.children.any? && !mixin.has_content
|
172
|
+
raise Sass::SyntaxError.new(%Q{Mixin "#{node.name}" does not accept a content block.})
|
173
|
+
end
|
174
|
+
|
171
175
|
passed_args = node.args.dup
|
172
176
|
passed_keywords = node.keywords.dup
|
173
177
|
|
@@ -196,9 +200,12 @@ END
|
|
196
200
|
raise Sass::SyntaxError.new("Mixin #{node.name} is missing parameter #{var.inspect}.") unless env.var(var.name)
|
197
201
|
env
|
198
202
|
end
|
203
|
+
environment.caller = Sass::Environment.new(original_env)
|
204
|
+
environment.content = node.children if node.has_children
|
199
205
|
|
200
|
-
|
201
|
-
|
206
|
+
trace_node = Sass::Tree::TraceNode.from_node(node.name, node)
|
207
|
+
with_environment(environment) {trace_node.children = mixin.tree.map {|c| visit(c)}.flatten}
|
208
|
+
trace_node
|
202
209
|
rescue Sass::SyntaxError => e
|
203
210
|
if original_env # Don't add backtrace info if this is an @include loop
|
204
211
|
e.modify_backtrace(:mixin => node.name, :line => node.line)
|
@@ -209,6 +216,17 @@ END
|
|
209
216
|
original_env.pop_frame if original_env
|
210
217
|
end
|
211
218
|
|
219
|
+
def visit_content(node)
|
220
|
+
raise Sass::SyntaxError.new("No @content passed.") unless content = @environment.content
|
221
|
+
trace_node = Sass::Tree::TraceNode.from_node('@content', node)
|
222
|
+
with_environment(@environment.caller) {trace_node.children = content.map {|c| visit(c.dup)}.flatten}
|
223
|
+
trace_node
|
224
|
+
rescue Sass::SyntaxError => e
|
225
|
+
e.modify_backtrace(:mixin => '@content', :line => node.line)
|
226
|
+
e.add_backtrace(:line => node.line)
|
227
|
+
raise e
|
228
|
+
end
|
229
|
+
|
212
230
|
# Runs any SassScript that may be embedded in a property.
|
213
231
|
def visit_prop(node)
|
214
232
|
node.resolved_name = run_interp(node.name)
|
@@ -225,8 +243,13 @@ END
|
|
225
243
|
# Runs SassScript interpolation in the selector,
|
226
244
|
# and then parses the result into a {Sass::Selector::CommaSequence}.
|
227
245
|
def visit_rule(node)
|
228
|
-
parser = Sass::SCSS::StaticParser.new(run_interp(node.rule), node.line)
|
229
|
-
node.parsed_rules ||= parser.parse_selector
|
246
|
+
parser = Sass::SCSS::StaticParser.new(run_interp(node.rule), node.filename, node.line)
|
247
|
+
node.parsed_rules ||= parser.parse_selector
|
248
|
+
if node.options[:trace_selectors]
|
249
|
+
@environment.push_frame(:filename => node.filename, :line => node.line)
|
250
|
+
node.stack_trace = @environment.stack_trace
|
251
|
+
@environment.pop_frame
|
252
|
+
end
|
230
253
|
yield
|
231
254
|
end
|
232
255
|
|
@@ -243,13 +266,10 @@ END
|
|
243
266
|
@environment.push_frame(:filename => node.filename, :line => node.line)
|
244
267
|
res = node.expr.perform(@environment)
|
245
268
|
res = res.value if res.is_a?(Sass::Script::String)
|
246
|
-
msg = "WARNING: #{res}\n"
|
247
|
-
@environment.
|
248
|
-
|
249
|
-
|
250
|
-
msg << ", in `#{entry[:mixin]}'" if entry[:mixin]
|
251
|
-
msg << "\n"
|
252
|
-
end
|
269
|
+
msg = "WARNING: #{res}\n "
|
270
|
+
msg << @environment.stack_trace.join("\n ")
|
271
|
+
# JRuby doesn't automatically add a newline for #warn
|
272
|
+
msg << (RUBY_PLATFORM =~ /java/ ? "\n\n" : "\n")
|
253
273
|
Sass::Util.sass_warn msg
|
254
274
|
[]
|
255
275
|
ensure
|
@@ -0,0 +1,97 @@
|
|
1
|
+
# A visitor for setting options on the Sass tree
|
2
|
+
class Sass::Tree::Visitors::SetOptions < Sass::Tree::Visitors::Base
|
3
|
+
# @param root [Tree::Node] The root node of the tree to visit.
|
4
|
+
# @param options [{Symbol => Object}] The options has to set.
|
5
|
+
def self.visit(root, options); new(options).send(:visit, root); end
|
6
|
+
|
7
|
+
protected
|
8
|
+
|
9
|
+
def initialize(options)
|
10
|
+
@options = options
|
11
|
+
end
|
12
|
+
|
13
|
+
def visit(node)
|
14
|
+
node.instance_variable_set('@options', @options)
|
15
|
+
super
|
16
|
+
end
|
17
|
+
|
18
|
+
def visit_debug(node)
|
19
|
+
node.expr.options = @options
|
20
|
+
yield
|
21
|
+
end
|
22
|
+
|
23
|
+
def visit_each(node)
|
24
|
+
node.list.options = @options
|
25
|
+
yield
|
26
|
+
end
|
27
|
+
|
28
|
+
def visit_extend(node)
|
29
|
+
node.selector.each {|c| c.options = @options if c.is_a?(Sass::Script::Node)}
|
30
|
+
yield
|
31
|
+
end
|
32
|
+
|
33
|
+
def visit_for(node)
|
34
|
+
node.from.options = @options
|
35
|
+
node.to.options = @options
|
36
|
+
yield
|
37
|
+
end
|
38
|
+
|
39
|
+
def visit_function(node)
|
40
|
+
node.args.each do |k, v|
|
41
|
+
k.options = @options
|
42
|
+
v.options = @options if v
|
43
|
+
end
|
44
|
+
yield
|
45
|
+
end
|
46
|
+
|
47
|
+
def visit_if(node)
|
48
|
+
node.expr.options = @options if node.expr
|
49
|
+
visit(node.else) if node.else
|
50
|
+
yield
|
51
|
+
end
|
52
|
+
|
53
|
+
def visit_mixin_def(node)
|
54
|
+
node.args.each do |k, v|
|
55
|
+
k.options = @options
|
56
|
+
v.options = @options if v
|
57
|
+
end
|
58
|
+
yield
|
59
|
+
end
|
60
|
+
|
61
|
+
def visit_mixin(node)
|
62
|
+
node.args.each {|a| a.options = @options}
|
63
|
+
node.keywords.each {|k, v| v.options = @options}
|
64
|
+
yield
|
65
|
+
end
|
66
|
+
|
67
|
+
def visit_prop(node)
|
68
|
+
node.name.each {|c| c.options = @options if c.is_a?(Sass::Script::Node)}
|
69
|
+
node.value.options = @options
|
70
|
+
yield
|
71
|
+
end
|
72
|
+
|
73
|
+
def visit_return(node)
|
74
|
+
node.expr.options = @options
|
75
|
+
yield
|
76
|
+
end
|
77
|
+
|
78
|
+
def visit_rule(node)
|
79
|
+
node.rule.each {|c| c.options = @options if c.is_a?(Sass::Script::Node)}
|
80
|
+
yield
|
81
|
+
end
|
82
|
+
|
83
|
+
def visit_variable(node)
|
84
|
+
node.expr.options = @options
|
85
|
+
yield
|
86
|
+
end
|
87
|
+
|
88
|
+
def visit_warn(node)
|
89
|
+
node.expr.options = @options
|
90
|
+
yield
|
91
|
+
end
|
92
|
+
|
93
|
+
def visit_while(node)
|
94
|
+
node.expr.options = @options
|
95
|
+
yield
|
96
|
+
end
|
97
|
+
end
|
@@ -156,6 +156,10 @@ MESSAGE
|
|
156
156
|
if node.style != :compressed
|
157
157
|
if node.options[:debug_info]
|
158
158
|
to_return << visit(debug_info_rule(node.debug_info, node.options)) << "\n"
|
159
|
+
elsif node.options[:trace_selectors]
|
160
|
+
to_return << "#{old_spaces}/* "
|
161
|
+
to_return << node.stack_trace.join("\n #{old_spaces}")
|
162
|
+
to_return << " */\n"
|
159
163
|
elsif node.options[:line_comments]
|
160
164
|
to_return << "#{old_spaces}/* line #{node.line}"
|
161
165
|
|
@@ -204,7 +208,7 @@ MESSAGE
|
|
204
208
|
[Sass::Selector::Element.new(k.to_s.gsub(/[^\w-]/, "\\\\\\0"), nil)])
|
205
209
|
])
|
206
210
|
])
|
207
|
-
prop = Sass::Tree::PropNode.new([""],
|
211
|
+
prop = Sass::Tree::PropNode.new([""], Sass::Script::String.new(''), :new)
|
208
212
|
prop.resolved_name = "font-family"
|
209
213
|
prop.resolved_value = Sass::SCSS::RX.escape_ident(v.to_s)
|
210
214
|
rule << prop
|
data/lib/sass/tree/warn_node.rb
CHANGED
@@ -6,19 +6,13 @@ module Sass
|
|
6
6
|
class WarnNode < Node
|
7
7
|
# The expression to print.
|
8
8
|
# @return [Script::Node]
|
9
|
-
|
9
|
+
attr_accessor :expr
|
10
10
|
|
11
11
|
# @param expr [Script::Node] The expression to print
|
12
12
|
def initialize(expr)
|
13
13
|
@expr = expr
|
14
14
|
super()
|
15
15
|
end
|
16
|
-
|
17
|
-
# Returns sub nodes that are not tree children.
|
18
|
-
def subnodes
|
19
|
-
Array(expr)
|
20
|
-
end
|
21
|
-
|
22
16
|
end
|
23
17
|
end
|
24
18
|
end
|
data/lib/sass/tree/while_node.rb
CHANGED
@@ -7,18 +7,12 @@ module Sass::Tree
|
|
7
7
|
class WhileNode < Node
|
8
8
|
# The parse tree for the continuation expression.
|
9
9
|
# @return [Script::Node]
|
10
|
-
|
10
|
+
attr_accessor :expr
|
11
11
|
|
12
12
|
# @param expr [Script::Node] See \{#expr}
|
13
13
|
def initialize(expr)
|
14
14
|
@expr = expr
|
15
15
|
super()
|
16
16
|
end
|
17
|
-
|
18
|
-
# Returns sub nodes that are not tree children.
|
19
|
-
def subnodes
|
20
|
-
Array(expr)
|
21
|
-
end
|
22
|
-
|
23
17
|
end
|
24
18
|
end
|
data/test/sass/cache_test.rb
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
require File.dirname(__FILE__) + '/../test_helper'
|
3
|
+
require File.dirname(__FILE__) + '/test_helper'
|
3
4
|
require 'sass/engine'
|
4
5
|
|
5
6
|
class CacheTest < Test::Unit::TestCase
|
@@ -11,6 +12,7 @@ class CacheTest < Test::Unit::TestCase
|
|
11
12
|
|
12
13
|
def teardown
|
13
14
|
FileUtils.rm_rf @@cache_dir
|
15
|
+
clean_up_sassc
|
14
16
|
end
|
15
17
|
|
16
18
|
def test_file_cache_writes_a_file
|
@@ -64,6 +66,19 @@ class CacheTest < Test::Unit::TestCase
|
|
64
66
|
assert_equal an_object, cache.retrieve("an_object", "")
|
65
67
|
end
|
66
68
|
|
69
|
+
class Unmarshalable
|
70
|
+
def _dump(_)
|
71
|
+
raise 'Unmarshalable'
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
def test_cache_node_with_unmarshalable_option
|
76
|
+
engine = Sass::Engine.new("foo {a: b + c}",
|
77
|
+
:syntax => :scss, :object => Unmarshalable.new, :filename => 'file.scss',
|
78
|
+
:importer => Sass::Importers::Filesystem.new(absolutize('templates')))
|
79
|
+
engine.to_tree
|
80
|
+
end
|
81
|
+
|
67
82
|
private
|
68
83
|
def root_node
|
69
84
|
Sass::Engine.new(<<-SCSS, :syntax => :scss).to_tree
|
@@ -1152,6 +1152,44 @@ SASS
|
|
1152
1152
|
SCSS
|
1153
1153
|
end
|
1154
1154
|
|
1155
|
+
def test_content_conversion
|
1156
|
+
assert_renders(<<SASS, <<SCSS)
|
1157
|
+
$color: blue
|
1158
|
+
|
1159
|
+
=context($class, $color: red)
|
1160
|
+
.\#{$class}
|
1161
|
+
background-color: $color
|
1162
|
+
@content
|
1163
|
+
border-color: $color
|
1164
|
+
|
1165
|
+
+context(parent)
|
1166
|
+
+context(child, $color: yellow)
|
1167
|
+
color: $color
|
1168
|
+
SASS
|
1169
|
+
$color: blue;
|
1170
|
+
|
1171
|
+
@mixin context($class, $color: red) {
|
1172
|
+
.\#{$class} {
|
1173
|
+
background-color: $color;
|
1174
|
+
@content;
|
1175
|
+
border-color: $color; } }
|
1176
|
+
|
1177
|
+
@include context(parent) {
|
1178
|
+
@include context(child, $color: yellow) {
|
1179
|
+
color: $color; } }
|
1180
|
+
SCSS
|
1181
|
+
|
1182
|
+
end
|
1183
|
+
|
1184
|
+
def test_empty_content
|
1185
|
+
assert_scss_to_scss(<<SCSS)
|
1186
|
+
@mixin foo {
|
1187
|
+
@content; }
|
1188
|
+
|
1189
|
+
@include foo {}
|
1190
|
+
SCSS
|
1191
|
+
end
|
1192
|
+
|
1155
1193
|
private
|
1156
1194
|
|
1157
1195
|
def assert_sass_to_sass(sass, options = {})
|