sass 3.1.0.alpha.48 → 3.1.0.alpha.49
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 +5 -0
- data/lib/sass/selector/comma_sequence.rb +2 -3
- data/lib/sass/selector/sequence.rb +2 -3
- data/lib/sass/selector/simple_sequence.rb +2 -3
- data/lib/sass/tree/charset_node.rb +0 -15
- data/lib/sass/tree/comment_node.rb +0 -72
- data/lib/sass/tree/debug_node.rb +4 -22
- data/lib/sass/tree/directive_node.rb +0 -52
- data/lib/sass/tree/each_node.rb +8 -24
- data/lib/sass/tree/extend_node.rb +12 -48
- data/lib/sass/tree/for_node.rb +20 -39
- data/lib/sass/tree/if_node.rb +7 -32
- data/lib/sass/tree/import_node.rb +0 -56
- data/lib/sass/tree/media_node.rb +0 -43
- data/lib/sass/tree/mixin_def_node.rb +12 -33
- data/lib/sass/tree/mixin_node.rb +14 -106
- data/lib/sass/tree/node.rb +12 -249
- data/lib/sass/tree/prop_node.rb +15 -78
- data/lib/sass/tree/root_node.rb +1 -121
- data/lib/sass/tree/rule_node.rb +1 -157
- data/lib/sass/tree/variable_node.rb +14 -23
- data/lib/sass/tree/visitors/base.rb +64 -0
- data/lib/sass/tree/visitors/convert.rb +234 -0
- data/lib/sass/tree/visitors/cssize.rb +177 -0
- data/lib/sass/tree/visitors/perform.rb +278 -0
- data/lib/sass/tree/visitors/to_css.rb +200 -0
- data/lib/sass/tree/warn_node.rb +4 -28
- data/lib/sass/tree/while_node.rb +5 -23
- metadata +19 -14
data/lib/sass/tree/prop_node.rb
CHANGED
@@ -13,7 +13,7 @@ module Sass::Tree
|
|
13
13
|
|
14
14
|
# The name of the property
|
15
15
|
# after any interpolated SassScript has been resolved.
|
16
|
-
# Only set once \{Tree::
|
16
|
+
# Only set once \{Tree::Visitors::Perform} has been run.
|
17
17
|
#
|
18
18
|
# @return [String]
|
19
19
|
attr_accessor :resolved_name
|
@@ -25,7 +25,7 @@ module Sass::Tree
|
|
25
25
|
|
26
26
|
# The value of the property
|
27
27
|
# after any interpolated SassScript has been resolved.
|
28
|
-
# Only set once \{Tree::
|
28
|
+
# Only set once \{Tree::Visitors::Perform} has been run.
|
29
29
|
#
|
30
30
|
# @return [String]
|
31
31
|
attr_accessor :resolved_value
|
@@ -74,73 +74,22 @@ module Sass::Tree
|
|
74
74
|
"\nIf #{declaration.dump} should be a selector, use \"\\#{declaration}\" instead."
|
75
75
|
end
|
76
76
|
|
77
|
-
|
78
|
-
|
79
|
-
#
|
80
|
-
def to_src(tabs, opts, fmt)
|
81
|
-
res = declaration(tabs, opts, fmt)
|
82
|
-
return res + "#{semi fmt}\n" if children.empty?
|
83
|
-
res + children_to_src(tabs, opts, fmt).rstrip + semi(fmt) + "\n"
|
84
|
-
end
|
85
|
-
|
86
|
-
# Computes the CSS for the property.
|
87
|
-
#
|
88
|
-
# @param tabs [Fixnum] The level of indentation for the CSS
|
89
|
-
# @return [String] The resulting CSS
|
90
|
-
def _to_s(tabs)
|
91
|
-
tab_str = ' ' * (tabs - 1 + self.tabs)
|
92
|
-
if style == :compressed
|
93
|
-
"#{tab_str}#{resolved_name}:#{resolved_value}"
|
94
|
-
else
|
95
|
-
"#{tab_str}#{resolved_name}: #{resolved_value};"
|
96
|
-
end
|
97
|
-
end
|
98
|
-
|
99
|
-
# Converts nested properties into flat properties.
|
77
|
+
# Computes the Sass or SCSS code for the variable declaration.
|
78
|
+
# This is like \{#to\_scss} or \{#to\_sass},
|
79
|
+
# except it doesn't print any child properties or a trailing semicolon.
|
100
80
|
#
|
101
|
-
# @param
|
102
|
-
#
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
node = super
|
108
|
-
result = node.children.dup
|
109
|
-
if !node.resolved_value.empty? || node.children.empty?
|
110
|
-
node.send(:check!)
|
111
|
-
result.unshift(node)
|
81
|
+
# @param opts [{Symbol => Object}] The options hash for the tree.
|
82
|
+
# @param fmt [Symbol] `:scss` or `:sass`.
|
83
|
+
def declaration(opts = {:old => @prop_syntax == :old}, fmt = :sass)
|
84
|
+
name = self.name.map {|n| n.is_a?(String) ? n : "\#{#{n.to_sass(opts)}}"}.join
|
85
|
+
if name[0] == ?:
|
86
|
+
raise Sass::SyntaxError.new("The \"#{name}: #{self.class.val_to_sass(value, opts)}\" hack is not allowed in the Sass indented syntax")
|
112
87
|
end
|
113
|
-
result
|
114
|
-
end
|
115
88
|
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
# The extensions defined for this tree
|
121
|
-
# @param parent [PropNode, nil] The parent node of this node,
|
122
|
-
# or nil if the parent isn't a {PropNode}
|
123
|
-
def cssize!(extends, parent)
|
124
|
-
self.resolved_name = "#{parent.resolved_name}-#{resolved_name}" if parent
|
125
|
-
self.tabs = parent.tabs + (parent.resolved_value.empty? ? 0 : 1) if parent && style == :nested
|
126
|
-
super
|
127
|
-
end
|
128
|
-
|
129
|
-
# Runs any SassScript that may be embedded in the property,
|
130
|
-
# and invludes the parent property, if any.
|
131
|
-
#
|
132
|
-
# @param environment [Sass::Environment] The lexical environment containing
|
133
|
-
# variable and mixin values
|
134
|
-
def perform!(environment)
|
135
|
-
@resolved_name = run_interp(@name, environment)
|
136
|
-
val = @value.perform(environment)
|
137
|
-
@resolved_value =
|
138
|
-
if @value.context == :equals && val.is_a?(Sass::Script::String)
|
139
|
-
val.value
|
140
|
-
else
|
141
|
-
val.to_s
|
142
|
-
end
|
143
|
-
super
|
89
|
+
old = opts[:old] && fmt == :sass
|
90
|
+
initial = old ? ':' : ''
|
91
|
+
mid = old ? '' : ':'
|
92
|
+
"#{initial}#{name}#{mid} #{self.class.val_to_sass(value, opts)}".rstrip
|
144
93
|
end
|
145
94
|
|
146
95
|
# Returns an error message if the given child node is invalid,
|
@@ -167,18 +116,6 @@ module Sass::Tree
|
|
167
116
|
end
|
168
117
|
end
|
169
118
|
|
170
|
-
def declaration(tabs = 0, opts = {:old => @prop_syntax == :old}, fmt = :sass)
|
171
|
-
name = self.name.map {|n| n.is_a?(String) ? n : "\#{#{n.to_sass(opts)}}"}.join
|
172
|
-
if name[0] == ?:
|
173
|
-
raise Sass::SyntaxError.new("The \"#{name}: #{self.class.val_to_sass(value, opts)}\" hack is not allowed in the Sass indented syntax")
|
174
|
-
end
|
175
|
-
|
176
|
-
old = opts[:old] && fmt == :sass
|
177
|
-
initial = old ? ':' : ''
|
178
|
-
mid = old ? '' : ':'
|
179
|
-
"#{' ' * tabs}#{initial}#{name}#{mid} #{self.class.val_to_sass(value, opts)}".rstrip
|
180
|
-
end
|
181
|
-
|
182
119
|
class << self
|
183
120
|
# @private
|
184
121
|
def val_to_sass(value, opts)
|
data/lib/sass/tree/root_node.rb
CHANGED
@@ -13,134 +13,14 @@ module Sass
|
|
13
13
|
@template = template
|
14
14
|
end
|
15
15
|
|
16
|
-
# @see Node#to_s
|
17
|
-
def to_s(*args)
|
18
|
-
super
|
19
|
-
rescue Sass::SyntaxError => e
|
20
|
-
e.sass_template ||= @template
|
21
|
-
raise e
|
22
|
-
end
|
23
|
-
|
24
16
|
# Runs the dynamic Sass code *and* computes the CSS for the tree.
|
25
|
-
#
|
26
|
-
# @see #perform
|
27
17
|
# @see #to_s
|
28
18
|
def render
|
29
|
-
result, extends =
|
19
|
+
result, extends = Visitors::Cssize.visit(Visitors::Perform.visit(self))
|
30
20
|
result = result.do_extend(extends) unless extends.empty?
|
31
21
|
result.to_s
|
32
22
|
end
|
33
23
|
|
34
|
-
# @see Node#perform
|
35
|
-
def perform(environment)
|
36
|
-
environment.options = @options if environment.options.nil? || environment.options.empty?
|
37
|
-
super
|
38
|
-
rescue Sass::SyntaxError => e
|
39
|
-
e.sass_template ||= @template
|
40
|
-
raise e
|
41
|
-
end
|
42
|
-
|
43
|
-
# Like {Node#cssize}, except that this method
|
44
|
-
# will create its own `extends` map if necessary,
|
45
|
-
# and it returns that map along with the cssized tree.
|
46
|
-
#
|
47
|
-
# @return [(Tree::Node, Sass::Util::SubsetMap)] The resulting tree of static nodes
|
48
|
-
# *and* the extensions defined for this tree
|
49
|
-
def cssize(extends = Sass::Util::SubsetMap.new, parent = nil)
|
50
|
-
return super(extends, parent), extends
|
51
|
-
rescue Sass::SyntaxError => e
|
52
|
-
e.sass_template ||= @template
|
53
|
-
raise e
|
54
|
-
end
|
55
|
-
|
56
|
-
# @see \{Node#perform!}
|
57
|
-
def perform!(environment)
|
58
|
-
environment.options = @options if environment.options.nil? || environment.options.empty?
|
59
|
-
super
|
60
|
-
end
|
61
|
-
|
62
|
-
# Converts a node to Sass code that will generate it.
|
63
|
-
#
|
64
|
-
# @param opts [{Symbol => Object}] An options hash (see {Sass::CSS#initialize})
|
65
|
-
# @return [String] The Sass code corresponding to the node
|
66
|
-
def to_sass(opts = {})
|
67
|
-
to_src(opts, :sass)
|
68
|
-
end
|
69
|
-
|
70
|
-
# Converts a node to SCSS code that will generate it.
|
71
|
-
#
|
72
|
-
# @param opts [{Symbol => Object}] An options hash (see {Sass::CSS#initialize})
|
73
|
-
# @return [String] The SCSS code corresponding to the node
|
74
|
-
def to_scss(opts = {})
|
75
|
-
to_src(opts, :scss)
|
76
|
-
end
|
77
|
-
|
78
|
-
protected
|
79
|
-
|
80
|
-
# @see Node#to_src
|
81
|
-
def to_src(opts, fmt)
|
82
|
-
Sass::Util.enum_cons(children + [nil], 2).map do |child, nxt|
|
83
|
-
child.send("to_#{fmt}", 0, opts) +
|
84
|
-
if nxt &&
|
85
|
-
(child.is_a?(CommentNode) && child.line + child.value.count("\n") + 1 == nxt.line) ||
|
86
|
-
(child.is_a?(ImportNode) && nxt.is_a?(ImportNode) && child.line + 1 == nxt.line) ||
|
87
|
-
(child.is_a?(VariableNode) && nxt.is_a?(VariableNode) && child.line + 1 == nxt.line)
|
88
|
-
""
|
89
|
-
else
|
90
|
-
"\n"
|
91
|
-
end
|
92
|
-
end.join.rstrip + "\n"
|
93
|
-
end
|
94
|
-
|
95
|
-
# Computes the CSS corresponding to this Sass tree.
|
96
|
-
#
|
97
|
-
# @param args [Array] ignored
|
98
|
-
# @return [String] The resulting CSS
|
99
|
-
# @see Sass::Tree
|
100
|
-
def _to_s(*args)
|
101
|
-
result = String.new
|
102
|
-
children.each do |child|
|
103
|
-
next if child.invisible?
|
104
|
-
child_str = child.to_s(1)
|
105
|
-
result << child_str + (style == :compressed ? '' : "\n")
|
106
|
-
end
|
107
|
-
result.rstrip!
|
108
|
-
return "" if result.empty?
|
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
|
142
|
-
end
|
143
|
-
|
144
24
|
# Returns an error message if the given child node is invalid,
|
145
25
|
# and false otherwise.
|
146
26
|
#
|
data/lib/sass/tree/rule_node.rb
CHANGED
@@ -27,7 +27,7 @@ module Sass::Tree
|
|
27
27
|
|
28
28
|
# The CSS selector for this rule,
|
29
29
|
# without any unresolved interpolation or parent references.
|
30
|
-
# It's only set once {Tree::
|
30
|
+
# It's only set once {Tree::Visitors::Cssize} has been run.
|
31
31
|
#
|
32
32
|
# @return [Selector::CommaSequence]
|
33
33
|
attr_accessor :resolved_rules
|
@@ -82,26 +82,6 @@ module Sass::Tree
|
|
82
82
|
last.is_a?(String) && last[-1] == ?,
|
83
83
|
end
|
84
84
|
|
85
|
-
# @see Node#to_sass
|
86
|
-
def to_sass(tabs, opts = {})
|
87
|
-
name = selector_to_sass(rule, opts)
|
88
|
-
name = "\\" + name if name[0] == ?:
|
89
|
-
name.gsub(/^/, ' ' * tabs) + children_to_src(tabs, opts, :sass)
|
90
|
-
end
|
91
|
-
|
92
|
-
# @see Node#to_scss
|
93
|
-
def to_scss(tabs, opts = {})
|
94
|
-
name = selector_to_scss(rule, tabs, opts)
|
95
|
-
res = name + children_to_src(tabs, opts, :scss)
|
96
|
-
|
97
|
-
if children.last.is_a?(CommentNode) && children.last.silent
|
98
|
-
res.slice!(-3..-1)
|
99
|
-
res << "\n" << (' ' * tabs) << "}\n"
|
100
|
-
end
|
101
|
-
|
102
|
-
res
|
103
|
-
end
|
104
|
-
|
105
85
|
# Extends this Rule's selector with the given `extends`.
|
106
86
|
#
|
107
87
|
# @see Node#do_extend
|
@@ -111,120 +91,6 @@ module Sass::Tree
|
|
111
91
|
node
|
112
92
|
end
|
113
93
|
|
114
|
-
protected
|
115
|
-
|
116
|
-
# Computes the CSS for the rule.
|
117
|
-
#
|
118
|
-
# @param tabs [Fixnum] The level of indentation for the CSS
|
119
|
-
# @return [String] The resulting CSS
|
120
|
-
def _to_s(tabs)
|
121
|
-
output_style = style
|
122
|
-
tabs = tabs + self.tabs
|
123
|
-
|
124
|
-
rule_separator = output_style == :compressed ? ',' : ', '
|
125
|
-
line_separator =
|
126
|
-
case output_style
|
127
|
-
when :nested, :expanded; "\n"
|
128
|
-
when :compressed; ""
|
129
|
-
else; " "
|
130
|
-
end
|
131
|
-
rule_indent = ' ' * (tabs - 1)
|
132
|
-
per_rule_indent, total_indent = [:nested, :expanded].include?(output_style) ? [rule_indent, ''] : ['', rule_indent]
|
133
|
-
|
134
|
-
total_rule = total_indent + resolved_rules.members.
|
135
|
-
map {|seq| seq.to_a.join.gsub(/([^,])\n/m, style == :compressed ? '\1 ' : "\\1\n")}.
|
136
|
-
join(rule_separator).split("\n").map do |line|
|
137
|
-
per_rule_indent + line.strip
|
138
|
-
end.join(line_separator)
|
139
|
-
|
140
|
-
to_return = ''
|
141
|
-
old_spaces = ' ' * (tabs - 1)
|
142
|
-
spaces = ' ' * tabs
|
143
|
-
if output_style != :compressed
|
144
|
-
if @options[:debug_info]
|
145
|
-
to_return << debug_info_rule.to_s(tabs) << "\n"
|
146
|
-
elsif @options[:line_comments]
|
147
|
-
to_return << "#{old_spaces}/* line #{line}"
|
148
|
-
|
149
|
-
if filename
|
150
|
-
relative_filename = if @options[:css_filename]
|
151
|
-
begin
|
152
|
-
Pathname.new(filename).relative_path_from(
|
153
|
-
Pathname.new(File.dirname(@options[:css_filename]))).to_s
|
154
|
-
rescue ArgumentError
|
155
|
-
nil
|
156
|
-
end
|
157
|
-
end
|
158
|
-
relative_filename ||= filename
|
159
|
-
to_return << ", #{relative_filename}"
|
160
|
-
end
|
161
|
-
|
162
|
-
to_return << " */\n"
|
163
|
-
end
|
164
|
-
end
|
165
|
-
|
166
|
-
if output_style == :compact
|
167
|
-
properties = children.map { |a| a.to_s(1) }.join(' ')
|
168
|
-
to_return << "#{total_rule} { #{properties} }#{"\n" if group_end}"
|
169
|
-
elsif output_style == :compressed
|
170
|
-
properties = children.map { |a| a.to_s(1) }.join(';')
|
171
|
-
to_return << "#{total_rule}{#{properties}}"
|
172
|
-
else
|
173
|
-
properties = children.map { |a| a.to_s(tabs + 1) }.join("\n")
|
174
|
-
end_props = (output_style == :expanded ? "\n" + old_spaces : ' ')
|
175
|
-
to_return << "#{total_rule} {\n#{properties}#{end_props}}#{"\n" if group_end}"
|
176
|
-
end
|
177
|
-
|
178
|
-
to_return
|
179
|
-
end
|
180
|
-
|
181
|
-
# Runs SassScript interpolation in the selector,
|
182
|
-
# and then parses the result into a {Sass::Selector::CommaSequence}.
|
183
|
-
#
|
184
|
-
# @param environment [Sass::Environment] The lexical environment containing
|
185
|
-
# variable and mixin values
|
186
|
-
def perform!(environment)
|
187
|
-
@parsed_rules = Sass::SCSS::StaticParser.new(run_interp(@rule, environment), self.line).
|
188
|
-
parse_selector(self.filename)
|
189
|
-
super
|
190
|
-
end
|
191
|
-
|
192
|
-
# Converts nested rules into a flat list of rules.
|
193
|
-
#
|
194
|
-
# @param extends [Sass::Util::SubsetMap{Selector::Simple => Selector::Sequence}]
|
195
|
-
# The extensions defined for this tree
|
196
|
-
# @param parent [RuleNode, nil] The parent node of this node,
|
197
|
-
# or nil if the parent isn't a {RuleNode}
|
198
|
-
def _cssize(extends, parent)
|
199
|
-
node = super
|
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?}
|
202
|
-
|
203
|
-
unless props.empty?
|
204
|
-
node.children = props
|
205
|
-
rules.each {|r| r.tabs += 1} if style == :nested
|
206
|
-
rules.unshift(node)
|
207
|
-
end
|
208
|
-
|
209
|
-
rules.last.group_end = true unless parent || rules.empty?
|
210
|
-
|
211
|
-
rules
|
212
|
-
end
|
213
|
-
|
214
|
-
# Resolves parent references and nested selectors,
|
215
|
-
# and updates the indentation based on the parent's indentation.
|
216
|
-
#
|
217
|
-
# @param extends [Sass::Util::SubsetMap{Selector::Simple => Selector::Sequence}]
|
218
|
-
# The extensions defined for this tree
|
219
|
-
# @param parent [RuleNode, nil] The parent node of this node,
|
220
|
-
# or nil if the parent isn't a {RuleNode}
|
221
|
-
# @raise [Sass::SyntaxError] if the rule has no parents but uses `&`
|
222
|
-
def cssize!(extends, parent)
|
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)
|
225
|
-
super
|
226
|
-
end
|
227
|
-
|
228
94
|
# A hash that will be associated with this rule in the CSS document
|
229
95
|
# if the {file:SASS_REFERENCE.md#debug_info-option `:debug_info` option} is enabled.
|
230
96
|
# This data is used by e.g. [the FireSass Firebug extension](https://addons.mozilla.org/en-US/firefox/addon/103988).
|
@@ -234,27 +100,5 @@ module Sass::Tree
|
|
234
100
|
{:filename => filename && ("file://" + URI.escape(File.expand_path(filename))),
|
235
101
|
:line => self.line}
|
236
102
|
end
|
237
|
-
|
238
|
-
private
|
239
|
-
|
240
|
-
def debug_info_rule
|
241
|
-
node = DirectiveNode.new("@media -sass-debug-info")
|
242
|
-
debug_info.map {|k, v| [k.to_s, v.to_s]}.sort.each do |k, v|
|
243
|
-
rule = RuleNode.new([""])
|
244
|
-
rule.resolved_rules = Sass::Selector::CommaSequence.new(
|
245
|
-
[Sass::Selector::Sequence.new(
|
246
|
-
[Sass::Selector::SimpleSequence.new(
|
247
|
-
[Sass::Selector::Element.new(k.to_s.gsub(/[^\w-]/, "\\\\\\0"), nil)])
|
248
|
-
])
|
249
|
-
])
|
250
|
-
prop = PropNode.new([""], "", :new)
|
251
|
-
prop.resolved_name = "font-family"
|
252
|
-
prop.resolved_value = Sass::SCSS::RX.escape_ident(v.to_s)
|
253
|
-
rule << prop
|
254
|
-
node << rule
|
255
|
-
end
|
256
|
-
node.options = @options.merge(:debug_info => false, :line_comments => false, :style => :compressed)
|
257
|
-
node
|
258
|
-
end
|
259
103
|
end
|
260
104
|
end
|
@@ -4,36 +4,27 @@ module Sass
|
|
4
4
|
#
|
5
5
|
# @see Sass::Tree
|
6
6
|
class VariableNode < Node
|
7
|
+
# The name of the variable.
|
8
|
+
# @return [String]
|
9
|
+
attr_reader :name
|
10
|
+
|
11
|
+
# The parse tree for the variable value.
|
12
|
+
# @return [Script::Node]
|
13
|
+
attr_reader :expr
|
14
|
+
|
15
|
+
# Whether this is a guarded variable assignment (`!default`).
|
16
|
+
# @return [Boolean]
|
17
|
+
attr_reader :guarded
|
18
|
+
|
7
19
|
# @param name [String] The name of the variable
|
8
|
-
# @param expr [Script::Node]
|
9
|
-
# @param guarded [Boolean]
|
20
|
+
# @param expr [Script::Node] See \{#expr}
|
21
|
+
# @param guarded [Boolean] See \{#guarded}
|
10
22
|
def initialize(name, expr, guarded)
|
11
23
|
@name = name
|
12
24
|
@expr = expr
|
13
25
|
@guarded = guarded
|
14
26
|
super()
|
15
27
|
end
|
16
|
-
|
17
|
-
protected
|
18
|
-
|
19
|
-
# @see Node#to_src
|
20
|
-
def to_src(tabs, opts, fmt)
|
21
|
-
"#{' ' * tabs}$#{dasherize(@name, opts)}: #{@expr.to_sass(opts)}#{' !default' if @guarded}#{semi fmt}\n"
|
22
|
-
end
|
23
|
-
|
24
|
-
# Loads the new variable value into the environment.
|
25
|
-
#
|
26
|
-
# @param environment [Sass::Environment] The lexical environment containing
|
27
|
-
# variable and mixin values
|
28
|
-
def _perform(environment)
|
29
|
-
return [] if @guarded && !environment.var(@name).nil?
|
30
|
-
val = @expr.perform(environment)
|
31
|
-
if @expr.context == :equals && val.is_a?(Sass::Script::String)
|
32
|
-
val = Sass::Script::String.new(val.value)
|
33
|
-
end
|
34
|
-
environment.set_var(@name, val)
|
35
|
-
[]
|
36
|
-
end
|
37
28
|
end
|
38
29
|
end
|
39
30
|
end
|