sass 3.1.0.alpha.221 → 3.1.0.alpha.246
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 +1 -1
- data/Rakefile +1 -1
- data/VERSION +1 -1
- data/lib/sass/cache_stores/filesystem.rb +6 -4
- data/lib/sass/engine.rb +18 -44
- data/lib/sass/exec.rb +3 -10
- data/lib/sass/importers/filesystem.rb +10 -9
- data/lib/sass/less.rb +1 -1
- data/lib/sass/plugin.rb +1 -1
- data/lib/sass/plugin/compiler.rb +2 -2
- data/lib/sass/script.rb +2 -25
- data/lib/sass/script/color.rb +0 -11
- data/lib/sass/script/funcall.rb +0 -9
- data/lib/sass/script/functions.rb +1 -21
- data/lib/sass/script/lexer.rb +1 -4
- data/lib/sass/script/list.rb +0 -1
- data/lib/sass/script/node.rb +0 -27
- data/lib/sass/script/number.rb +1 -1
- data/lib/sass/script/operation.rb +0 -5
- data/lib/sass/script/parser.rb +1 -8
- data/lib/sass/script/string.rb +2 -17
- data/lib/sass/script/string_interpolation.rb +1 -0
- data/lib/sass/scss/parser.rb +3 -1
- data/lib/sass/scss/rx.rb +2 -1
- data/lib/sass/scss/script_lexer.rb +1 -1
- data/lib/sass/tree/comment_node.rb +23 -2
- data/lib/sass/tree/mixin_node.rb +0 -7
- data/lib/sass/tree/prop_node.rb +10 -3
- data/lib/sass/tree/visitors/check_nesting.rb +26 -16
- data/lib/sass/tree/visitors/convert.rb +11 -2
- data/lib/sass/tree/visitors/perform.rb +10 -13
- data/lib/sass/tree/visitors/to_css.rb +17 -5
- data/test/sass/conversion_test.rb +17 -102
- data/test/sass/engine_test.rb +70 -370
- data/test/sass/functions_test.rb +4 -0
- data/test/sass/plugin_test.rb +36 -24
- data/test/sass/script_conversion_test.rb +0 -38
- data/test/test_helper.rb +0 -3
- metadata +2 -4
- data/bin/css2sass +0 -13
data/lib/sass/script/list.rb
CHANGED
data/lib/sass/script/node.rb
CHANGED
@@ -8,18 +8,6 @@ module Sass::Script
|
|
8
8
|
# @return [{Symbol => Object}]
|
9
9
|
attr_reader :options
|
10
10
|
|
11
|
-
# The context in which this node was parsed,
|
12
|
-
# which determines how some operations are performed.
|
13
|
-
#
|
14
|
-
# Can be `:equals`, which means it's part of a `$var = val` or `prop = val` assignment,
|
15
|
-
# or `:default`, which means it's anywhere else
|
16
|
-
# (including `$var: val` and `prop: val` assignments,
|
17
|
-
# `#{}`-interpolations,
|
18
|
-
# and other script contexts such as `@if` conditions).
|
19
|
-
#
|
20
|
-
# @return [Symbol]
|
21
|
-
attr_reader :context
|
22
|
-
|
23
11
|
# The line of the document on which this node appeared.
|
24
12
|
#
|
25
13
|
# @return [Fixnum]
|
@@ -41,21 +29,6 @@ module Sass::Script
|
|
41
29
|
end
|
42
30
|
end
|
43
31
|
|
44
|
-
# Sets the context for this node,
|
45
|
-
# as well as for all child nodes.
|
46
|
-
#
|
47
|
-
# @param context [Symbol]
|
48
|
-
# @see #context
|
49
|
-
def context=(context)
|
50
|
-
@context = context
|
51
|
-
children.each {|c| c.context = context}
|
52
|
-
end
|
53
|
-
|
54
|
-
# Creates a new script node.
|
55
|
-
def initialize
|
56
|
-
@context = :default
|
57
|
-
end
|
58
|
-
|
59
32
|
# Evaluates the node.
|
60
33
|
#
|
61
34
|
# \{#perform} shouldn't be overridden directly;
|
data/lib/sass/script/number.rb
CHANGED
@@ -149,7 +149,7 @@ module Sass::Script
|
|
149
149
|
def div(other)
|
150
150
|
if other.is_a? Number
|
151
151
|
res = operate(other, :/)
|
152
|
-
if self.original && other.original
|
152
|
+
if self.original && other.original
|
153
153
|
res.original = "#{self.original}/#{other.original}"
|
154
154
|
end
|
155
155
|
res
|
@@ -66,11 +66,6 @@ module Sass::Script
|
|
66
66
|
literal1 = @operand1.perform(environment)
|
67
67
|
literal2 = @operand2.perform(environment)
|
68
68
|
|
69
|
-
if @operator == :space && context == :equals
|
70
|
-
literal1 = Sass::Script::String.new(literal1.value) if literal1.is_a?(Sass::Script::String)
|
71
|
-
literal2 = Sass::Script::String.new(literal2.value) if literal2.is_a?(Sass::Script::String)
|
72
|
-
end
|
73
|
-
|
74
69
|
begin
|
75
70
|
opts(literal1.send(@operator, literal2))
|
76
71
|
rescue NoMethodError => e
|
data/lib/sass/script/parser.rb
CHANGED
@@ -316,15 +316,8 @@ RUBY
|
|
316
316
|
offset = @lexer.offset + 1
|
317
317
|
c = assert_tok(:const)
|
318
318
|
var = Script::Variable.new(c.value)
|
319
|
-
if tok =
|
319
|
+
if tok = try_tok(:colon)
|
320
320
|
val = assert_expr(:space)
|
321
|
-
|
322
|
-
if tok.type == :single_eq
|
323
|
-
val.context = :equals
|
324
|
-
val.options = @options
|
325
|
-
Script.equals_warning("mixin argument defaults", "$#{c.value}",
|
326
|
-
val.to_sass, false, line, offset, @options[:filename])
|
327
|
-
end
|
328
321
|
must_have_default = true
|
329
322
|
elsif must_have_default
|
330
323
|
raise SyntaxError.new("Required argument #{var.inspect} must come before any optional arguments.")
|
data/lib/sass/script/string.rb
CHANGED
@@ -15,15 +15,6 @@ module Sass::Script
|
|
15
15
|
# @return [Symbol] `:string` or `:identifier`
|
16
16
|
attr_reader :type
|
17
17
|
|
18
|
-
# In addition to setting the \{#context} of the string,
|
19
|
-
# this sets the string to be an identifier if the context is `:equals`.
|
20
|
-
#
|
21
|
-
# @see Node#context=
|
22
|
-
def context=(context)
|
23
|
-
super
|
24
|
-
@type = :identifier if context == :equals
|
25
|
-
end
|
26
|
-
|
27
18
|
# Creates a new string.
|
28
19
|
#
|
29
20
|
# @param value [String] See \{#value}
|
@@ -42,7 +33,7 @@ module Sass::Script
|
|
42
33
|
# @see Node#to_s
|
43
34
|
def to_s(opts = {})
|
44
35
|
if @type == :identifier
|
45
|
-
return @
|
36
|
+
return @value.tr("\n", " ")
|
46
37
|
end
|
47
38
|
|
48
39
|
return "\"#{value.gsub('"', "\\\"")}\"" if opts[:quote] == %q{"}
|
@@ -54,13 +45,7 @@ module Sass::Script
|
|
54
45
|
|
55
46
|
# @see Node#to_sass
|
56
47
|
def to_sass(opts = {})
|
57
|
-
|
58
|
-
self.value !~ Sass::SCSS::RX::URI &&
|
59
|
-
Sass::SCSS::RX.escape_ident(self.value).include?(?\\)
|
60
|
-
return "unquote(#{Sass::Script::String.new(self.value, :string).to_sass})"
|
61
|
-
else
|
62
|
-
return to_s
|
63
|
-
end
|
48
|
+
to_s
|
64
49
|
end
|
65
50
|
end
|
66
51
|
end
|
@@ -23,6 +23,7 @@ module Sass::Script
|
|
23
23
|
# @see Node#to_sass
|
24
24
|
def to_sass(opts = {})
|
25
25
|
# We can get rid of all of this when we remove the deprecated :equals context
|
26
|
+
# XXX CE: It's gone now but I'm not sure what can be removed now.
|
26
27
|
before_unquote, before_quote_char, before_str = parse_str(@before.to_sass(opts))
|
27
28
|
after_unquote, after_quote_char, after_str = parse_str(@after.to_sass(opts))
|
28
29
|
unquote = before_unquote || after_unquote ||
|
data/lib/sass/scss/parser.rb
CHANGED
@@ -638,9 +638,11 @@ MESSAGE
|
|
638
638
|
tok!(/:/)
|
639
639
|
space, value = value!
|
640
640
|
ss
|
641
|
+
important = tok(IMPORTANT)
|
642
|
+
ss
|
641
643
|
require_block = tok?(/\{/)
|
642
644
|
|
643
|
-
node = node(Sass::Tree::PropNode.new(name.flatten.compact, value, :new))
|
645
|
+
node = node(Sass::Tree::PropNode.new(name.flatten.compact, value, !!important, :new))
|
644
646
|
|
645
647
|
return node unless require_block
|
646
648
|
nested_properties! node, space
|
data/lib/sass/scss/rx.rb
CHANGED
@@ -68,6 +68,7 @@ module Sass
|
|
68
68
|
URLCHAR = /[#%&*-~]|#{NONASCII}|#{ESCAPE}/
|
69
69
|
URL = /(#{URLCHAR}*)/
|
70
70
|
W = /[ \t\r\n\f]*/
|
71
|
+
VARIABLE = /(\$)(#{Sass::SCSS::RX::IDENT})/
|
71
72
|
|
72
73
|
# This is more liberal than the spec's definition,
|
73
74
|
# but that definition didn't work well with the greediness rules
|
@@ -118,7 +119,7 @@ module Sass
|
|
118
119
|
# We could use it for 1.9 only, but I don't want to introduce a cross-version
|
119
120
|
# behavior difference.
|
120
121
|
# In any case, almost all CSS idents will be matched by this.
|
121
|
-
STATIC_VALUE = /(-?#{NMSTART}|#{STRING_NOINTERP}|\s(?!%)|#[a-f0-9]|[,%]|#{NUM}
|
122
|
+
STATIC_VALUE = /(-?#{NMSTART}|#{STRING_NOINTERP}|\s(?!%)|#[a-f0-9]|[,%]|#{NUM})+(?=[;}])/i
|
122
123
|
|
123
124
|
STATIC_SELECTOR = /(#{NMCHAR}|\s|[,>+*]|[:#.]#{NMSTART})+(?=[{])/i
|
124
125
|
end
|
@@ -10,6 +10,14 @@ module Sass::Tree
|
|
10
10
|
# @return [String]
|
11
11
|
attr_accessor :value
|
12
12
|
|
13
|
+
# Whether the comment is loud.
|
14
|
+
#
|
15
|
+
# Loud comments start with ! and force the comment to be generated
|
16
|
+
# irrespective of compilation settings or the comment syntax used.
|
17
|
+
#
|
18
|
+
# @return [Boolean]
|
19
|
+
attr_accessor :loud
|
20
|
+
|
13
21
|
# Whether or not the comment is silent (that is, doesn't output to CSS).
|
14
22
|
#
|
15
23
|
# @return [Boolean]
|
@@ -19,8 +27,10 @@ module Sass::Tree
|
|
19
27
|
# @param silent [Boolean] See \{#silent}
|
20
28
|
def initialize(value, silent)
|
21
29
|
@lines = []
|
22
|
-
@value = normalize_indentation value
|
23
30
|
@silent = silent
|
31
|
+
@value = normalize_indentation value
|
32
|
+
@loud = @value =~ %r{^(/[\/\*])?!}
|
33
|
+
@value.sub!("#{$1}!", $1.to_s) if @loud
|
24
34
|
super()
|
25
35
|
end
|
26
36
|
|
@@ -36,9 +46,20 @@ module Sass::Tree
|
|
36
46
|
# Returns `true` if this is a silent comment
|
37
47
|
# or the current style doesn't render comments.
|
38
48
|
#
|
49
|
+
# Comments starting with ! are never invisible (and the ! is removed from the output.)
|
50
|
+
#
|
39
51
|
# @return [Boolean]
|
40
52
|
def invisible?
|
41
|
-
|
53
|
+
if @loud
|
54
|
+
return false
|
55
|
+
else
|
56
|
+
@silent || (style == :compressed)
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
# Returns whether this comment should be interpolated for dynamic comment generation.
|
61
|
+
def evaluated?
|
62
|
+
@loud
|
42
63
|
end
|
43
64
|
|
44
65
|
private
|
data/lib/sass/tree/mixin_node.rb
CHANGED
@@ -19,13 +19,6 @@ module Sass::Tree
|
|
19
19
|
# @return [{String => Script::Node}]
|
20
20
|
attr_reader :keywords
|
21
21
|
|
22
|
-
# @see Node#options=
|
23
|
-
def options=(opts)
|
24
|
-
super
|
25
|
-
@args.each {|a| a.context = :equals} if opts[:sass2]
|
26
|
-
@keywords.each {|k, v| v.context = :equals} if opts[:sass2]
|
27
|
-
end
|
28
|
-
|
29
22
|
# @param name [String] The name of the mixin
|
30
23
|
# @param args [Array<Script::Node>] See \{#args}
|
31
24
|
# @param keywords [{String => Script::Node}] See \{#keywords}
|
data/lib/sass/tree/prop_node.rb
CHANGED
@@ -23,6 +23,11 @@ module Sass::Tree
|
|
23
23
|
# @return [Sass::Script::Node]
|
24
24
|
attr_accessor :value
|
25
25
|
|
26
|
+
# Whether the property was marked as !important.
|
27
|
+
#
|
28
|
+
# @return [Boolean]
|
29
|
+
attr_accessor :important
|
30
|
+
|
26
31
|
# The value of the property
|
27
32
|
# after any interpolated SassScript has been resolved.
|
28
33
|
# Only set once \{Tree::Visitors::Perform} has been run.
|
@@ -44,14 +49,16 @@ module Sass::Tree
|
|
44
49
|
|
45
50
|
# @param name [Array<String, Sass::Script::Node>] See \{#name}
|
46
51
|
# @param value [Sass::Script::Node] See \{#value}
|
52
|
+
# @param important [Boolean] whether this is an !important property
|
47
53
|
# @param prop_syntax [Symbol] `:new` if this property uses `a: b`-style syntax,
|
48
54
|
# `:old` if it uses `:a b`-style syntax
|
49
|
-
def initialize(name, value, prop_syntax)
|
55
|
+
def initialize(name, value, important, prop_syntax)
|
50
56
|
@name = Sass::Util.strip_string_array(
|
51
57
|
Sass::Util.merge_adjacent_strings(name))
|
52
58
|
@value = value
|
53
59
|
@tabs = 0
|
54
60
|
@prop_syntax = prop_syntax
|
61
|
+
@important = important
|
55
62
|
super()
|
56
63
|
end
|
57
64
|
|
@@ -89,7 +96,7 @@ module Sass::Tree
|
|
89
96
|
old = opts[:old] && fmt == :sass
|
90
97
|
initial = old ? ':' : ''
|
91
98
|
mid = old ? '' : ':'
|
92
|
-
"#{initial}#{name}#{mid} #{self.class.val_to_sass(value, opts)}".rstrip
|
99
|
+
"#{initial}#{name}#{mid} #{self.class.val_to_sass(value, opts)}#{' !important' if important}".rstrip
|
93
100
|
end
|
94
101
|
|
95
102
|
private
|
@@ -136,7 +143,7 @@ module Sass::Tree
|
|
136
143
|
unless node.is_a?(Sass::Script::Operation) && node.operator == :div &&
|
137
144
|
node.operand1.is_a?(Sass::Script::Number) &&
|
138
145
|
node.operand2.is_a?(Sass::Script::Number) &&
|
139
|
-
(
|
146
|
+
(!node.operand1.original || !node.operand2.original)
|
140
147
|
return node
|
141
148
|
end
|
142
149
|
|
@@ -17,11 +17,11 @@ class Sass::Tree::Visitors::CheckNesting < Sass::Tree::Visitors::Base
|
|
17
17
|
raise e
|
18
18
|
end
|
19
19
|
|
20
|
+
PARENT_CLASSES = [ Sass::Tree::EachNode, Sass::Tree::ForNode, Sass::Tree::IfNode,
|
21
|
+
Sass::Tree::ImportNode, Sass::Tree::MixinNode, Sass::Tree::WhileNode]
|
20
22
|
def visit_children(parent)
|
21
23
|
old_parent = @parent
|
22
|
-
@parent = parent unless is_any_of?(parent,
|
23
|
-
Sass::Tree::EachNode, Sass::Tree::ForNode, Sass::Tree::IfNode,
|
24
|
-
Sass::Tree::ImportNode, Sass::Tree::MixinNode, Sass::Tree::WhileNode)
|
24
|
+
@parent = parent unless is_any_of?(parent, PARENT_CLASSES)
|
25
25
|
old_real_parent, @real_parent = @real_parent, parent
|
26
26
|
super
|
27
27
|
ensure
|
@@ -48,8 +48,9 @@ class Sass::Tree::Visitors::CheckNesting < Sass::Tree::Visitors::Base
|
|
48
48
|
"@charset may only be used at the root of a document." unless parent.is_a?(Sass::Tree::RootNode)
|
49
49
|
end
|
50
50
|
|
51
|
+
INVALID_EXTEND_PARENTS = [Sass::Tree::RuleNode, Sass::Tree::MixinDefNode]
|
51
52
|
def invalid_extend_parent?(parent, child)
|
52
|
-
unless is_any_of?(parent,
|
53
|
+
unless is_any_of?(parent, INVALID_EXTEND_PARENTS)
|
53
54
|
"Extend directives may only be used within rules."
|
54
55
|
end
|
55
56
|
end
|
@@ -58,18 +59,23 @@ class Sass::Tree::Visitors::CheckNesting < Sass::Tree::Visitors::Base
|
|
58
59
|
"Functions may only be defined at the root of a document." unless parent.is_a?(Sass::Tree::RootNode)
|
59
60
|
end
|
60
61
|
|
62
|
+
INVALID_FUNCTION_CHILDREN = [
|
63
|
+
Sass::Tree::CommentNode, Sass::Tree::DebugNode, Sass::Tree::EachNode,
|
64
|
+
Sass::Tree::ForNode, Sass::Tree::IfNode, Sass::Tree::ReturnNode,
|
65
|
+
Sass::Tree::VariableNode, Sass::Tree::WarnNode, Sass::Tree::WhileNode
|
66
|
+
]
|
61
67
|
def invalid_function_child?(parent, child)
|
62
|
-
unless is_any_of?(child,
|
63
|
-
Sass::Tree::CommentNode, Sass::Tree::DebugNode, Sass::Tree::EachNode,
|
64
|
-
Sass::Tree::ForNode, Sass::Tree::IfNode, Sass::Tree::ReturnNode,
|
65
|
-
Sass::Tree::VariableNode, Sass::Tree::WarnNode, Sass::Tree::WhileNode)
|
68
|
+
unless is_any_of?(child, INVALID_FUNCTION_CHILDREN)
|
66
69
|
"Functions can only contain variable declarations and control directives."
|
67
70
|
end
|
68
71
|
end
|
69
72
|
|
73
|
+
INVALID_IMPORT_PARENTS = [
|
74
|
+
Sass::Tree::IfNode, Sass::Tree::ForNode, Sass::Tree::WhileNode,
|
75
|
+
Sass::Tree::EachNode, Sass::Tree::MixinDefNode
|
76
|
+
]
|
70
77
|
def invalid_import_parent?(parent, child)
|
71
|
-
if is_any_of?(@real_parent,
|
72
|
-
Sass::Tree::EachNode, Sass::Tree::MixinDefNode)
|
78
|
+
if is_any_of?(@real_parent, INVALID_IMPORT_PARENTS)
|
73
79
|
return "Import directives may not be used within control directives or mixins."
|
74
80
|
end
|
75
81
|
return if parent.is_a?(Sass::Tree::RootNode)
|
@@ -92,16 +98,17 @@ class Sass::Tree::Visitors::CheckNesting < Sass::Tree::Visitors::Base
|
|
92
98
|
"Mixins may only be defined at the root of a document." unless parent.is_a?(Sass::Tree::RootNode)
|
93
99
|
end
|
94
100
|
|
101
|
+
INVALID_PROP_CHILDREN = [Sass::Tree::CommentNode, Sass::Tree::PropNode]
|
95
102
|
def invalid_prop_child?(parent, child)
|
96
|
-
unless is_any_of?(child,
|
103
|
+
unless is_any_of?(child, INVALID_PROP_CHILDREN)
|
97
104
|
"Illegal nesting: Only properties may be nested beneath properties."
|
98
105
|
end
|
99
106
|
end
|
100
107
|
|
108
|
+
INVALID_PROP_PARENTS = [Sass::Tree::RuleNode, Sass::Tree::PropNode,
|
109
|
+
Sass::Tree::MixinDefNode, Sass::Tree::DirectiveNode]
|
101
110
|
def invalid_prop_parent?(parent, child)
|
102
|
-
unless is_any_of?(parent,
|
103
|
-
Sass::Tree::RuleNode, Sass::Tree::PropNode,
|
104
|
-
Sass::Tree::MixinDefNode, Sass::Tree::DirectiveNode)
|
111
|
+
unless is_any_of?(parent, INVALID_PROP_PARENTS)
|
105
112
|
"Properties are only allowed within rules, directives, or other properties." + child.pseudo_class_selector_message
|
106
113
|
end
|
107
114
|
end
|
@@ -112,8 +119,11 @@ class Sass::Tree::Visitors::CheckNesting < Sass::Tree::Visitors::Base
|
|
112
119
|
|
113
120
|
private
|
114
121
|
|
115
|
-
def is_any_of?(val,
|
116
|
-
|
122
|
+
def is_any_of?(val, classes)
|
123
|
+
for c in classes
|
124
|
+
return true if val.is_a?(c)
|
125
|
+
end
|
126
|
+
return false
|
117
127
|
end
|
118
128
|
|
119
129
|
def try_send(method, *args, &block)
|
@@ -49,7 +49,7 @@ class Sass::Tree::Visitors::Convert < Sass::Tree::Visitors::Base
|
|
49
49
|
end
|
50
50
|
|
51
51
|
def visit_comment(node)
|
52
|
-
if @format == :sass
|
52
|
+
content = if @format == :sass
|
53
53
|
content = node.value.gsub(/\*\/$/, '').rstrip
|
54
54
|
if content =~ /\A[ \t]/
|
55
55
|
# Re-indent SCSS comments like this:
|
@@ -79,12 +79,21 @@ class Sass::Tree::Visitors::Convert < Sass::Tree::Visitors::Base
|
|
79
79
|
content.rstrip + "\n"
|
80
80
|
else
|
81
81
|
spaces = (' ' * [@tabs - node.value[/^ */].size, 0].max)
|
82
|
-
if node.silent
|
82
|
+
content = if node.silent
|
83
83
|
node.value.gsub(/^[\/ ]\*/, '//').gsub(/ *\*\/$/, '')
|
84
84
|
else
|
85
85
|
node.value
|
86
86
|
end.gsub(/^/, spaces) + "\n"
|
87
|
+
content
|
88
|
+
end
|
89
|
+
if node.loud
|
90
|
+
if node.silent
|
91
|
+
content.gsub!(%r{^\s*(//!?)}, '//!')
|
92
|
+
else
|
93
|
+
content.sub!(%r{^\s*(/\*)}, '/*!')
|
94
|
+
end
|
87
95
|
end
|
96
|
+
content
|
88
97
|
end
|
89
98
|
|
90
99
|
def visit_debug(node)
|
@@ -52,7 +52,14 @@ class Sass::Tree::Visitors::Perform < Sass::Tree::Visitors::Base
|
|
52
52
|
|
53
53
|
# Removes this node from the tree if it's a silent comment.
|
54
54
|
def visit_comment(node)
|
55
|
-
|
55
|
+
return [] if node.invisible?
|
56
|
+
if node.evaluated?
|
57
|
+
node.value.gsub!(/(^|[^\\])\#\{([^}]*)\}/) do |md|
|
58
|
+
$1+Sass::Script.parse($2, node.line, 0, node.options).perform(@environment).to_s
|
59
|
+
end
|
60
|
+
node.value = run_interp([Sass::Script::String.new(node.value)])
|
61
|
+
end
|
62
|
+
node
|
56
63
|
end
|
57
64
|
|
58
65
|
# Prints the expression to STDERR.
|
@@ -184,11 +191,7 @@ END
|
|
184
191
|
elsif kv = passed_keywords[var.underscored_name]
|
185
192
|
kv.perform(env)
|
186
193
|
elsif default
|
187
|
-
|
188
|
-
if default.context == :equals && val.is_a?(Sass::Script::String)
|
189
|
-
val = Sass::Script::String.new(val.value)
|
190
|
-
end
|
191
|
-
val
|
194
|
+
default.perform(env)
|
192
195
|
end)
|
193
196
|
raise Sass::SyntaxError.new("Mixin #{node.name} is missing parameter #{var.inspect}.") unless env.var(var.name)
|
194
197
|
env
|
@@ -210,12 +213,7 @@ END
|
|
210
213
|
def visit_prop(node)
|
211
214
|
node.resolved_name = run_interp(node.name)
|
212
215
|
val = node.value.perform(@environment)
|
213
|
-
node.resolved_value =
|
214
|
-
if node.value.context == :equals && val.is_a?(Sass::Script::String)
|
215
|
-
val.value
|
216
|
-
else
|
217
|
-
val.to_s
|
218
|
-
end
|
216
|
+
node.resolved_value = val.to_s
|
219
217
|
yield
|
220
218
|
end
|
221
219
|
|
@@ -236,7 +234,6 @@ END
|
|
236
234
|
def visit_variable(node)
|
237
235
|
return [] if node.guarded && !@environment.var(node.name).nil?
|
238
236
|
val = node.expr.perform(@environment)
|
239
|
-
val = Sass::Script::String.new(val.value) if node.expr.context == :equals && val.is_a?(Sass::Script::String)
|
240
237
|
@environment.set_var(node.name, val)
|
241
238
|
[]
|
242
239
|
end
|