sass 3.2.0.alpha.244 → 3.2.0.alpha.247
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/VERSION +1 -1
- data/lib/sass/engine.rb +3 -3
- data/lib/sass/media.rb +58 -138
- data/lib/sass/scss/parser.rb +12 -9
- data/lib/sass/tree/css_import_node.rb +12 -4
- data/lib/sass/tree/media_node.rb +14 -4
- data/lib/sass/tree/visitors/convert.rb +2 -2
- data/lib/sass/tree/visitors/cssize.rb +1 -1
- data/lib/sass/tree/visitors/perform.rb +4 -4
- data/lib/sass/tree/visitors/set_options.rb +6 -1
- data/lib/sass/util.rb +1 -1
- data/test/sass/cache_test.rb +2 -2
- data/test/sass/callbacks_test.rb +1 -1
- data/test/sass/conversion_test.rb +22 -2
- data/test/sass/css2sass_test.rb +1 -1
- data/test/sass/engine_test.rb +2 -2
- data/test/sass/extend_test.rb +1 -1
- data/test/sass/functions_test.rb +1 -1
- data/test/sass/importer_test.rb +2 -2
- data/test/sass/less_conversion_test.rb +1 -1
- data/test/sass/logger_test.rb +1 -1
- data/test/sass/plugin_test.rb +2 -2
- data/test/sass/script_conversion_test.rb +1 -1
- data/test/sass/script_test.rb +1 -1
- data/test/sass/scss/css_test.rb +5 -1
- data/test/sass/scss/rx_test.rb +1 -1
- data/test/sass/scss/scss_test.rb +26 -1
- data/test/sass/scss/test_helper.rb +1 -1
- data/test/sass/util/multibyte_string_scanner_test.rb +1 -1
- data/test/sass/util/subset_map_test.rb +1 -1
- data/test/sass/util_test.rb +1 -1
- metadata +5 -5
data/REVISION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
|
1
|
+
5cc7590756da94e5c6df3da3be9ca8ff946d7279
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
3.2.0.alpha.
|
1
|
+
3.2.0.alpha.247
|
data/lib/sass/engine.rb
CHANGED
@@ -705,7 +705,7 @@ WARNING
|
|
705
705
|
Tree::CharsetNode.new(name)
|
706
706
|
when 'media'
|
707
707
|
parser = Sass::SCSS::Parser.new(value, @options[:filename], @line)
|
708
|
-
Tree::MediaNode.new(parser.parse_media_query_list)
|
708
|
+
Tree::MediaNode.new(parser.parse_media_query_list.to_a)
|
709
709
|
else
|
710
710
|
Tree::DirectiveNode.new(
|
711
711
|
value.nil? ? ["@#{directive}"] : ["@#{directive} "] + parse_interp(value, offset))
|
@@ -800,7 +800,7 @@ WARNING
|
|
800
800
|
str = script_parser.parse_string
|
801
801
|
media_parser = Sass::SCSS::Parser.new(scanner, @options[:filename], @line)
|
802
802
|
media = media_parser.parse_media_query_list
|
803
|
-
return Tree::CssImportNode.new(str, media)
|
803
|
+
return Tree::CssImportNode.new(str, media.to_a)
|
804
804
|
end
|
805
805
|
|
806
806
|
unless str = scanner.scan(Sass::SCSS::RX::STRING)
|
@@ -812,7 +812,7 @@ WARNING
|
|
812
812
|
if !scanner.match?(/[,;]|$/)
|
813
813
|
media_parser = Sass::SCSS::Parser.new(scanner, @options[:filename], @line)
|
814
814
|
media = media_parser.parse_media_query_list
|
815
|
-
Tree::CssImportNode.new(str || uri, media)
|
815
|
+
Tree::CssImportNode.new(str || uri, media.to_a)
|
816
816
|
elsif val =~ /^http:\/\//
|
817
817
|
Tree::CssImportNode.new("url(#{val})")
|
818
818
|
else
|
data/lib/sass/media.rb
CHANGED
@@ -14,16 +14,6 @@ module Sass::Media
|
|
14
14
|
@queries = queries
|
15
15
|
end
|
16
16
|
|
17
|
-
# Runs the SassScript in the media query list.
|
18
|
-
#
|
19
|
-
# @yield [interp] A block that should perform interpolation.
|
20
|
-
# @yieldparam interp [Array<String, Sass::Script::Node>]
|
21
|
-
# An interpolation array to perform.
|
22
|
-
# @yieldreturn [String] The interpolated value.
|
23
|
-
def perform(&run_interp)
|
24
|
-
@queries.each {|q| q.perform(&run_interp)}
|
25
|
-
end
|
26
|
-
|
27
17
|
# Merges this query list with another. The returned query list
|
28
18
|
# queries for the intersection between the two inputs.
|
29
19
|
#
|
@@ -52,19 +42,22 @@ module Sass::Media
|
|
52
42
|
queries.map {|q| q.to_src(options)}.join(', ')
|
53
43
|
end
|
54
44
|
|
45
|
+
# Returns a representation of the query as an array of strings and
|
46
|
+
# potentially {Sass::Script::Node}s (if there's interpolation in it). When
|
47
|
+
# the interpolation is resolved and the strings are joined together, this
|
48
|
+
# will be the string representation of this query.
|
49
|
+
#
|
50
|
+
# @return [Array<String, Sass::Script::Node>]
|
51
|
+
def to_a
|
52
|
+
Sass::Util.intersperse(queries.map {|q| q.to_a}, ', ').flatten
|
53
|
+
end
|
54
|
+
|
55
55
|
# Returns a deep copy of this query list and all its children.
|
56
56
|
#
|
57
57
|
# @return [QueryList]
|
58
58
|
def deep_copy
|
59
59
|
QueryList.new(queries.map {|q| q.deep_copy})
|
60
60
|
end
|
61
|
-
|
62
|
-
# Sets the options hash for the script nodes in the media query.
|
63
|
-
#
|
64
|
-
# @param options [{Symbol => Object}] The options has to set.
|
65
|
-
def options=(options)
|
66
|
-
queries.each {|q| q.options = options}
|
67
|
-
end
|
68
61
|
end
|
69
62
|
|
70
63
|
# A single media query.
|
@@ -73,50 +66,51 @@ module Sass::Media
|
|
73
66
|
class Query
|
74
67
|
# The modifier for the query.
|
75
68
|
#
|
69
|
+
# When parsed as Sass code, this contains strings and SassScript nodes. When
|
70
|
+
# parsed as CSS, it contains a single string (accessible via
|
71
|
+
# \{#resolved_modifier}).
|
72
|
+
#
|
76
73
|
# @return [Array<String, Sass::Script::Node>]
|
77
74
|
attr_accessor :modifier
|
78
75
|
|
79
|
-
# The modifier for the query after any SassScript has been resolved.
|
80
|
-
# Only set once \{Tree::Visitors::Perform} has been run.
|
81
|
-
#
|
82
|
-
# @return [String]
|
83
|
-
attr_accessor :resolved_modifier
|
84
|
-
|
85
76
|
# The type of the query (e.g. `"screen"` or `"print"`).
|
86
77
|
#
|
78
|
+
# When parsed as Sass code, this contains strings and SassScript nodes. When
|
79
|
+
# parsed as CSS, it contains a single string (accessible via
|
80
|
+
# \{#resolved_type}).
|
81
|
+
#
|
87
82
|
# @return [Array<String, Sass::Script::Node>]
|
88
83
|
attr_accessor :type
|
89
84
|
|
90
|
-
# The type of the query after any SassScript has been resolved.
|
91
|
-
# Only set once \{Tree::Visitors::Perform} has been run.
|
92
|
-
#
|
93
|
-
# @return [String]
|
94
|
-
attr_accessor :resolved_type
|
95
|
-
|
96
85
|
# The trailing expressions in the query.
|
97
86
|
#
|
98
|
-
#
|
87
|
+
# When parsed as Sass code, each expression contains strings and SassScript
|
88
|
+
# nodes. When parsed as CSS, each one contains a single string.
|
89
|
+
#
|
90
|
+
# @return [Array<Array<String, Sass::Script::Node>>]
|
99
91
|
attr_accessor :expressions
|
100
92
|
|
101
93
|
# @param modifier [Array<String, Sass::Script::Node>] See \{#modifier}
|
102
94
|
# @param type [Array<String, Sass::Script::Node>] See \{#type}
|
103
|
-
# @param expressions [Array<
|
95
|
+
# @param expressions [Array<Array<String, Sass::Script::Node>>] See \{#expressions}
|
104
96
|
def initialize(modifier, type, expressions)
|
105
97
|
@modifier = modifier
|
106
98
|
@type = type
|
107
99
|
@expressions = expressions
|
108
100
|
end
|
109
101
|
|
110
|
-
#
|
111
|
-
#
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
102
|
+
# See \{#modifier}.
|
103
|
+
# @return [String]
|
104
|
+
def resolved_modifier
|
105
|
+
# modifier should contain only a single string
|
106
|
+
modifier.first || ''
|
107
|
+
end
|
108
|
+
|
109
|
+
# See \{#type}.
|
110
|
+
# @return [String]
|
111
|
+
def resolved_type
|
112
|
+
# type should contain only a single string
|
113
|
+
type.first || ''
|
120
114
|
end
|
121
115
|
|
122
116
|
# Merges this query with another. The returned query queries for
|
@@ -147,8 +141,8 @@ module Sass::Media
|
|
147
141
|
mod = m1.empty? ? m2 : m1
|
148
142
|
end
|
149
143
|
q = Query.new([], [], other.expressions + expressions)
|
150
|
-
q.
|
151
|
-
q.
|
144
|
+
q.type = [type]
|
145
|
+
q.modifier = [mod]
|
152
146
|
return q
|
153
147
|
end
|
154
148
|
|
@@ -161,7 +155,12 @@ module Sass::Media
|
|
161
155
|
css << ' ' unless resolved_modifier.empty?
|
162
156
|
css << resolved_type
|
163
157
|
css << ' and ' unless resolved_type.empty? || expressions.empty?
|
164
|
-
css << expressions.map
|
158
|
+
css << expressions.map do |e|
|
159
|
+
# It's possible for there to be script nodes in Expressions even when
|
160
|
+
# we're converting to CSS in the case where we parsed the document as
|
161
|
+
# CSS originally (as in css_test.rb).
|
162
|
+
e.map {|c| c.is_a?(Sass::Script::Node) ? c.to_sass : c.to_s}.join
|
163
|
+
end.join(' and ')
|
165
164
|
css
|
166
165
|
end
|
167
166
|
|
@@ -175,10 +174,23 @@ module Sass::Media
|
|
175
174
|
src << ' ' unless modifier.empty?
|
176
175
|
src << Sass::Media._interp_to_src(type, options)
|
177
176
|
src << ' and ' unless type.empty? || expressions.empty?
|
178
|
-
src << expressions.map
|
177
|
+
src << expressions.map do |e|
|
178
|
+
Sass::Media._interp_to_src(e, options)
|
179
|
+
end.join(' and ')
|
179
180
|
src
|
180
181
|
end
|
181
182
|
|
183
|
+
# @see \{MediaQuery#to\_a}
|
184
|
+
def to_a
|
185
|
+
res = []
|
186
|
+
res += modifier
|
187
|
+
res << ' ' unless modifier.empty?
|
188
|
+
res += type
|
189
|
+
res << ' and ' unless type.empty? || expressions.empty?
|
190
|
+
res += Sass::Util.intersperse(expressions, ' and ').flatten
|
191
|
+
res
|
192
|
+
end
|
193
|
+
|
182
194
|
# Returns a deep copy of this query and all its children.
|
183
195
|
#
|
184
196
|
# @return [Query]
|
@@ -186,99 +198,7 @@ module Sass::Media
|
|
186
198
|
Query.new(
|
187
199
|
modifier.map {|c| c.is_a?(Sass::Script::Node) ? c.deep_copy : c},
|
188
200
|
type.map {|c| c.is_a?(Sass::Script::Node) ? c.deep_copy : c},
|
189
|
-
expressions.map {|
|
190
|
-
end
|
191
|
-
|
192
|
-
# Sets the options hash for the script nodes in the media query.
|
193
|
-
#
|
194
|
-
# @param options [{Symbol => Object}] The options has to set.
|
195
|
-
def options=(options)
|
196
|
-
modifier.each {|m| m.options = options if m.is_a?(Sass::Script::Node)}
|
197
|
-
type.each {|t| t.options = options if t.is_a?(Sass::Script::Node)}
|
198
|
-
expressions.each {|e| e.options = options}
|
199
|
-
end
|
200
|
-
end
|
201
|
-
|
202
|
-
# A media query expression.
|
203
|
-
#
|
204
|
-
# '(' S* media_feature S* [ ':' S* expr ]? ')'
|
205
|
-
class Expression
|
206
|
-
# The name of the feature being queried for.
|
207
|
-
#
|
208
|
-
# @return [Sass::Script::Node]
|
209
|
-
attr_accessor :name
|
210
|
-
|
211
|
-
# The name of the feature after any SassScript has been resolved.
|
212
|
-
# Only set once \{Tree::Visitors::Perform} has been run.
|
213
|
-
#
|
214
|
-
# @return [String]
|
215
|
-
attr_accessor :resolved_name
|
216
|
-
|
217
|
-
# The value of the feature.
|
218
|
-
#
|
219
|
-
# @return [Sass::Script::Node]
|
220
|
-
attr_accessor :value
|
221
|
-
|
222
|
-
# The value of the feature after any SassScript has been resolved.
|
223
|
-
# Only set once \{Tree::Visitors::Perform} has been run.
|
224
|
-
#
|
225
|
-
# @return [String]
|
226
|
-
attr_accessor :resolved_value
|
227
|
-
|
228
|
-
# @param name [Sass::Script::Node] See \{#name}
|
229
|
-
# @param value [Sass::Script::Node] See \{#value}
|
230
|
-
def initialize(name, value)
|
231
|
-
@name = name
|
232
|
-
@value = value
|
233
|
-
end
|
234
|
-
|
235
|
-
# Runs the SassScript in the expression.
|
236
|
-
#
|
237
|
-
# @yield [interp] A block that should perform interpolation.
|
238
|
-
# @yieldparam interp [Array<String, Sass::Script::Node>]
|
239
|
-
# An interpolation array to perform.
|
240
|
-
# @yieldreturn [String] The interpolated value.
|
241
|
-
def perform
|
242
|
-
@resolved_name = yield name ? [name] : []
|
243
|
-
@resolved_value = yield value ? [value] : []
|
244
|
-
end
|
245
|
-
|
246
|
-
# Returns the CSS for the expression.
|
247
|
-
#
|
248
|
-
# @return [String]
|
249
|
-
def to_css
|
250
|
-
css = '('
|
251
|
-
css << resolved_name
|
252
|
-
css << ': ' << resolved_value unless resolved_value.empty?
|
253
|
-
css << ')'
|
254
|
-
css
|
255
|
-
end
|
256
|
-
|
257
|
-
# Returns the Sass/SCSS code for the expression.
|
258
|
-
#
|
259
|
-
# @param options [{Symbol => Object}] An options hash (see {Sass::CSS#initialize}).
|
260
|
-
# @return [String]
|
261
|
-
def to_src(options)
|
262
|
-
src = '('
|
263
|
-
src << name.to_sass(options)
|
264
|
-
src << ': ' << value.to_sass(options) if value
|
265
|
-
src << ')'
|
266
|
-
src
|
267
|
-
end
|
268
|
-
|
269
|
-
# Returns a deep copy of this expression.
|
270
|
-
#
|
271
|
-
# @return [Expression]
|
272
|
-
def deep_copy
|
273
|
-
Expression.new(name.deep_copy, value && value.deep_copy)
|
274
|
-
end
|
275
|
-
|
276
|
-
# Sets the options hash for the script nodes in the expression.
|
277
|
-
#
|
278
|
-
# @param options [{Symbol => Object}] The options has to set.
|
279
|
-
def options=(options)
|
280
|
-
name.options = options
|
281
|
-
value.options = options if value
|
201
|
+
expressions.map {|e| e.map {|c| c.is_a?(Sass::Script::Node) ? c.deep_copy : c}})
|
282
202
|
end
|
283
203
|
end
|
284
204
|
|
data/lib/sass/scss/parser.rb
CHANGED
@@ -309,7 +309,7 @@ module Sass
|
|
309
309
|
str = sass_script(:parse_string)
|
310
310
|
media = media_query_list
|
311
311
|
ss
|
312
|
-
return node(Tree::CssImportNode.new(str, media))
|
312
|
+
return node(Tree::CssImportNode.new(str, media.to_a))
|
313
313
|
end
|
314
314
|
|
315
315
|
path = @scanner[1] || @scanner[2]
|
@@ -317,7 +317,7 @@ module Sass
|
|
317
317
|
|
318
318
|
media = media_query_list
|
319
319
|
if path =~ /^http:\/\// || media || use_css_import?
|
320
|
-
return node(Sass::Tree::CssImportNode.new(str, media))
|
320
|
+
return node(Sass::Tree::CssImportNode.new(str, media.to_a))
|
321
321
|
end
|
322
322
|
|
323
323
|
node(Sass::Tree::ImportNode.new(path.strip))
|
@@ -326,7 +326,7 @@ module Sass
|
|
326
326
|
def use_css_import?; false; end
|
327
327
|
|
328
328
|
def media_directive
|
329
|
-
block(node(Sass::Tree::MediaNode.new(media_query_list)), :directive)
|
329
|
+
block(node(Sass::Tree::MediaNode.new(media_query_list.to_a)), :directive)
|
330
330
|
end
|
331
331
|
|
332
332
|
# http://www.w3.org/TR/css3-mediaqueries/#syntax
|
@@ -378,17 +378,20 @@ module Sass
|
|
378
378
|
end
|
379
379
|
|
380
380
|
def media_expr
|
381
|
+
interp = interpolation and return interp
|
381
382
|
return unless tok(/\(/)
|
383
|
+
res = ['(']
|
382
384
|
ss
|
383
|
-
|
385
|
+
res << sass_script(:parse)
|
384
386
|
|
385
387
|
if tok(/:/)
|
386
|
-
|
388
|
+
res << ': '
|
389
|
+
ss
|
390
|
+
res << sass_script(:parse)
|
387
391
|
end
|
388
|
-
tok!(/\)/)
|
392
|
+
res << tok!(/\)/)
|
389
393
|
ss
|
390
|
-
|
391
|
-
Sass::Media::Expression.new(name, value)
|
394
|
+
res
|
392
395
|
end
|
393
396
|
|
394
397
|
def charset_directive
|
@@ -724,7 +727,7 @@ module Sass
|
|
724
727
|
val = interp_ident || expr!(:interp_string)
|
725
728
|
ss
|
726
729
|
end
|
727
|
-
tok(/\]/)
|
730
|
+
tok!(/\]/)
|
728
731
|
|
729
732
|
Selector::Attribute.new(merge(name), merge(ns), op, merge(val))
|
730
733
|
end
|
@@ -15,13 +15,21 @@ module Sass::Tree
|
|
15
15
|
# @return [String]
|
16
16
|
attr_accessor :resolved_uri
|
17
17
|
|
18
|
-
# The media query,
|
18
|
+
# The media query for this rule, interspersed with {Sass::Script::Node}s
|
19
|
+
# representing `#{}`-interpolation. Any adjacent strings will be merged
|
20
|
+
# together.
|
19
21
|
#
|
20
|
-
# @return [Sass::
|
22
|
+
# @return [Array<String, Sass::Script::Node>]
|
21
23
|
attr_accessor :query
|
22
24
|
|
25
|
+
# The media query for this rule, without any unresolved interpolation. It's
|
26
|
+
# only set once {Tree::Node#perform} has been called.
|
27
|
+
#
|
28
|
+
# @return [Sass::Media::QueryList]
|
29
|
+
attr_accessor :resolved_query
|
30
|
+
|
23
31
|
# @param uri [String, Sass::Script::Node] See \{#uri}
|
24
|
-
# @param query [Sass::
|
32
|
+
# @param query [Array<String, Sass::Script::Node>] See \{#query}
|
25
33
|
def initialize(uri, query = nil)
|
26
34
|
@uri = uri
|
27
35
|
@query = query
|
@@ -44,7 +52,7 @@ module Sass::Tree
|
|
44
52
|
@resolved_value ||=
|
45
53
|
begin
|
46
54
|
str = "@import #{resolved_uri}"
|
47
|
-
str << " #{
|
55
|
+
str << " #{resolved_query.to_css}" if resolved_query
|
48
56
|
str
|
49
57
|
end
|
50
58
|
end
|
data/lib/sass/tree/media_node.rb
CHANGED
@@ -6,18 +6,28 @@ module Sass::Tree
|
|
6
6
|
#
|
7
7
|
# @see Sass::Tree
|
8
8
|
class MediaNode < DirectiveNode
|
9
|
-
#
|
9
|
+
# TODO: parse and cache the query immediately if it has no dynamic elements
|
10
|
+
|
11
|
+
# The media query for this rule, interspersed with {Sass::Script::Node}s
|
12
|
+
# representing `#{}`-interpolation. Any adjacent strings will be merged
|
13
|
+
# together.
|
10
14
|
#
|
11
|
-
# @return [Sass::
|
15
|
+
# @return [Array<String, Sass::Script::Node>]
|
12
16
|
attr_accessor :query
|
13
17
|
|
18
|
+
# The media query for this rule, without any unresolved interpolation. It's
|
19
|
+
# only set once {Tree::Node#perform} has been called.
|
20
|
+
#
|
21
|
+
# @return [Sass::Media::QueryList]
|
22
|
+
attr_accessor :resolved_query
|
23
|
+
|
14
24
|
# @see RuleNode#tabs
|
15
25
|
attr_accessor :tabs
|
16
26
|
|
17
27
|
# @see RuleNode#group_end
|
18
28
|
attr_accessor :group_end
|
19
29
|
|
20
|
-
# @param query [Sass::
|
30
|
+
# @param query [Array<String, Sass::Script::Node>] See \{#query}
|
21
31
|
def initialize(query)
|
22
32
|
@query = query
|
23
33
|
@tabs = 0
|
@@ -32,7 +42,7 @@ module Sass::Tree
|
|
32
42
|
|
33
43
|
# @see DirectiveNode#resolved_value
|
34
44
|
def resolved_value
|
35
|
-
@resolved_value ||= "@media #{
|
45
|
+
@resolved_value ||= "@media #{resolved_query.to_css}"
|
36
46
|
end
|
37
47
|
|
38
48
|
# True when the directive has no visible children.
|
@@ -148,7 +148,7 @@ class Sass::Tree::Visitors::Convert < Sass::Tree::Visitors::Base
|
|
148
148
|
end
|
149
149
|
|
150
150
|
def visit_media(node)
|
151
|
-
"#{tab_str}@media #{node.query
|
151
|
+
"#{tab_str}@media #{interp_to_src(node.query)}#{yield}"
|
152
152
|
end
|
153
153
|
|
154
154
|
def visit_supports(node)
|
@@ -161,7 +161,7 @@ class Sass::Tree::Visitors::Convert < Sass::Tree::Visitors::Base
|
|
161
161
|
else
|
162
162
|
str = "#{tab_str}@import #{node.uri}"
|
163
163
|
end
|
164
|
-
str << " #{node.query
|
164
|
+
str << " #{interp_to_src(node.query)}" unless node.query.empty?
|
165
165
|
"#{str}#{semi}\n"
|
166
166
|
end
|
167
167
|
|
@@ -139,7 +139,7 @@ class Sass::Tree::Visitors::Cssize < Sass::Tree::Visitors::Base
|
|
139
139
|
yield unless bubble(node)
|
140
140
|
media = node.children.select {|c| c.is_a?(Sass::Tree::MediaNode)}
|
141
141
|
node.children.reject! {|c| c.is_a?(Sass::Tree::MediaNode)}
|
142
|
-
media = media.select {|n| n.
|
142
|
+
media = media.select {|n| n.resolved_query = n.resolved_query.merge(node.resolved_query)}
|
143
143
|
(node.children.empty? ? [] : [node]) + media
|
144
144
|
end
|
145
145
|
|
@@ -298,8 +298,8 @@ END
|
|
298
298
|
end
|
299
299
|
|
300
300
|
def visit_media(node)
|
301
|
-
node.query
|
302
|
-
node.
|
301
|
+
parser = Sass::SCSS::StaticParser.new(run_interp(node.query), node.filename, node.line)
|
302
|
+
node.resolved_query ||= parser.parse_media_query_list
|
303
303
|
yield
|
304
304
|
end
|
305
305
|
|
@@ -312,8 +312,8 @@ END
|
|
312
312
|
def visit_cssimport(node)
|
313
313
|
node.resolved_uri = run_interp([node.uri])
|
314
314
|
if node.query
|
315
|
-
node.query
|
316
|
-
node.
|
315
|
+
parser = Sass::SCSS::StaticParser.new(run_interp(node.query), node.filename, node.line)
|
316
|
+
node.resolved_query ||= parser.parse_media_query_list
|
317
317
|
end
|
318
318
|
yield
|
319
319
|
end
|
@@ -101,7 +101,12 @@ class Sass::Tree::Visitors::SetOptions < Sass::Tree::Visitors::Base
|
|
101
101
|
end
|
102
102
|
|
103
103
|
def visit_media(node)
|
104
|
-
node.query.options = @options
|
104
|
+
node.query.each {|c| c.options = @options if c.is_a?(Sass::Script::Node)}
|
105
|
+
yield
|
106
|
+
end
|
107
|
+
|
108
|
+
def visit_cssimport(node)
|
109
|
+
node.query.each {|c| c.options = @options if c.is_a?(Sass::Script::Node)} if node.query
|
105
110
|
yield
|
106
111
|
end
|
107
112
|
|
data/lib/sass/util.rb
CHANGED
@@ -591,7 +591,7 @@ MSG
|
|
591
591
|
Regexp.new(/\A(?:#{_enc("\uFEFF", e)})?#{
|
592
592
|
_enc('@charset "', e)}(.*?)#{_enc('"', e)}|\A(#{
|
593
593
|
_enc("\uFEFF", e)})/)
|
594
|
-
rescue Encoding::
|
594
|
+
rescue Encoding::ConverterNotFoundError => _
|
595
595
|
nil # JRuby on Java 5 doesn't support UTF-32
|
596
596
|
rescue
|
597
597
|
# /\A@charset "(.*?)"/
|
data/test/sass/cache_test.rb
CHANGED
data/test/sass/callbacks_test.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
|
-
require 'test_helper'
|
2
|
+
require File.dirname(__FILE__) + '/../test_helper'
|
3
3
|
|
4
4
|
class ConversionTest < Test::Unit::TestCase
|
5
5
|
def test_basic
|
@@ -1153,7 +1153,17 @@ SCSS
|
|
1153
1153
|
end
|
1154
1154
|
|
1155
1155
|
def test_media_with_expressions
|
1156
|
-
|
1156
|
+
# TODO: get rid of the #{} in the expression output
|
1157
|
+
assert_sass_to_scss <<SCSS, <<SASS
|
1158
|
+
$media1: screen;
|
1159
|
+
$media2: print;
|
1160
|
+
$var: -webkit-min-device-pixel-ratio;
|
1161
|
+
$val: 20;
|
1162
|
+
|
1163
|
+
@media \#{$media1} and (\#{$var + "-foo"}: \#{$val + 5}), only \#{$media2} {
|
1164
|
+
a: b;
|
1165
|
+
}
|
1166
|
+
SCSS
|
1157
1167
|
$media1: screen
|
1158
1168
|
$media2: print
|
1159
1169
|
$var: -webkit-min-device-pixel-ratio
|
@@ -1162,6 +1172,16 @@ $val: 20
|
|
1162
1172
|
@media \#{$media1} and ($var + "-foo": $val + 5), only \#{$media2}
|
1163
1173
|
a: b
|
1164
1174
|
SASS
|
1175
|
+
|
1176
|
+
assert_scss_to_sass <<SASS, <<SCSS
|
1177
|
+
$media1: screen
|
1178
|
+
$media2: print
|
1179
|
+
$var: -webkit-min-device-pixel-ratio
|
1180
|
+
$val: 20
|
1181
|
+
|
1182
|
+
@media \#{$media1} and (\#{$var + "-foo"}: \#{$val + 5}), only \#{$media2}
|
1183
|
+
a: b
|
1184
|
+
SASS
|
1165
1185
|
$media1: screen;
|
1166
1186
|
$media2: print;
|
1167
1187
|
$var: -webkit-min-device-pixel-ratio;
|
data/test/sass/css2sass_test.rb
CHANGED
data/test/sass/engine_test.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
# -*- coding: utf-8 -*-
|
3
|
-
require 'test_helper'
|
4
|
-
require '
|
3
|
+
require File.dirname(__FILE__) + '/../test_helper'
|
4
|
+
require File.dirname(__FILE__) + '/test_helper'
|
5
5
|
require 'sass/engine'
|
6
6
|
require 'stringio'
|
7
7
|
require 'mock_importer'
|
data/test/sass/extend_test.rb
CHANGED
data/test/sass/functions_test.rb
CHANGED
data/test/sass/importer_test.rb
CHANGED
data/test/sass/logger_test.rb
CHANGED
data/test/sass/plugin_test.rb
CHANGED
data/test/sass/script_test.rb
CHANGED
data/test/sass/scss/css_test.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
# -*- coding: utf-8 -*-
|
3
|
-
require '
|
3
|
+
require File.dirname(__FILE__) + '/test_helper'
|
4
4
|
require 'sass/scss/css_parser'
|
5
5
|
|
6
6
|
# These tests just test the parsing of CSS
|
@@ -957,6 +957,10 @@ SCSS
|
|
957
957
|
|
958
958
|
## Regressions
|
959
959
|
|
960
|
+
def test_selector_without_closing_bracket
|
961
|
+
assert_not_parses('"]"', "foo[bar <err>{a: b}")
|
962
|
+
end
|
963
|
+
|
960
964
|
def test_closing_line_comment_end_with_compact_output
|
961
965
|
assert_equal(<<CSS, render(<<SCSS, :style => :compact))
|
962
966
|
/* foo */
|
data/test/sass/scss/rx_test.rb
CHANGED
data/test/sass/scss/scss_test.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
# -*- coding: utf-8 -*-
|
3
|
-
require
|
3
|
+
require File.dirname(__FILE__) + '/test_helper'
|
4
4
|
|
5
5
|
class ScssTest < Test::Unit::TestCase
|
6
6
|
include ScssTestHelper
|
@@ -936,6 +936,31 @@ $vals: 1 2 3;
|
|
936
936
|
SCSS
|
937
937
|
end
|
938
938
|
|
939
|
+
def test_media_interpolation_with_reparse
|
940
|
+
assert_equal <<CSS, render(<<SCSS)
|
941
|
+
@media screen and (max-width: 300px) {
|
942
|
+
a: b; }
|
943
|
+
@media screen and (max-width: 300px) {
|
944
|
+
a: b; }
|
945
|
+
@media screen and (max-width: 300px) {
|
946
|
+
a: b; }
|
947
|
+
@media screen and (max-width: 300px), print and (max-width: 300px) {
|
948
|
+
a: b; }
|
949
|
+
CSS
|
950
|
+
$constraint: "(max-width: 300px)";
|
951
|
+
$fragment: "nd \#{$constraint}";
|
952
|
+
$comma: "een, pri";
|
953
|
+
@media screen and \#{$constraint} {a: b}
|
954
|
+
@media screen {
|
955
|
+
@media \#{$constraint} {a: b}
|
956
|
+
}
|
957
|
+
@media screen a\#{$fragment} {a: b}
|
958
|
+
@media scr\#{$comma}nt {
|
959
|
+
@media \#{$constraint} {a: b}
|
960
|
+
}
|
961
|
+
SCSS
|
962
|
+
end
|
963
|
+
|
939
964
|
def test_moz_document_interpolation
|
940
965
|
assert_equal <<CSS, render(<<SCSS)
|
941
966
|
@-moz-document url(http://sass-lang.com/),
|
data/test/sass/util_test.rb
CHANGED
metadata
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sass
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 592302835
|
5
5
|
prerelease: 6
|
6
6
|
segments:
|
7
7
|
- 3
|
8
8
|
- 2
|
9
9
|
- 0
|
10
10
|
- alpha
|
11
|
-
-
|
12
|
-
version: 3.2.0.alpha.
|
11
|
+
- 247
|
12
|
+
version: 3.2.0.alpha.247
|
13
13
|
platform: ruby
|
14
14
|
authors:
|
15
15
|
- Nathan Weizenbaum
|
@@ -19,7 +19,7 @@ autorequire:
|
|
19
19
|
bindir: bin
|
20
20
|
cert_chain: []
|
21
21
|
|
22
|
-
date: 2012-
|
22
|
+
date: 2012-06-15 00:00:00 -04:00
|
23
23
|
default_executable:
|
24
24
|
dependencies:
|
25
25
|
- !ruby/object:Gem::Dependency
|
@@ -154,6 +154,7 @@ files:
|
|
154
154
|
- lib/sass/tree/content_node.rb
|
155
155
|
- lib/sass/tree/css_import_node.rb
|
156
156
|
- lib/sass/tree/variable_node.rb
|
157
|
+
- lib/sass/tree/warn_node.rb
|
157
158
|
- lib/sass/tree/visitors/base.rb
|
158
159
|
- lib/sass/tree/visitors/check_nesting.rb
|
159
160
|
- lib/sass/tree/visitors/convert.rb
|
@@ -163,7 +164,6 @@ files:
|
|
163
164
|
- lib/sass/tree/visitors/perform.rb
|
164
165
|
- lib/sass/tree/visitors/set_options.rb
|
165
166
|
- lib/sass/tree/visitors/to_css.rb
|
166
|
-
- lib/sass/tree/warn_node.rb
|
167
167
|
- lib/sass/tree/while_node.rb
|
168
168
|
- lib/sass/tree/supports_node.rb
|
169
169
|
- lib/sass/tree/trace_node.rb
|