sass 3.2.0.alpha.64 → 3.2.0.alpha.70
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/css.rb +2 -0
- data/lib/sass/engine.rb +1 -1
- data/lib/sass/exec.rb +24 -3
- data/lib/sass/plugin/staleness_checker.rb +14 -4
- data/lib/sass/repl.rb +2 -2
- data/lib/sass/script/color.rb +150 -19
- data/lib/sass/script/functions.rb +36 -7
- data/lib/sass/script/parser.rb +1 -1
- data/lib/sass/scss/parser.rb +1 -1
- data/lib/sass/tree/visitors/convert.rb +4 -2
- data/lib/sass/tree/visitors/deep_copy.rb +1 -1
- data/lib/sass/tree/visitors/perform.rb +3 -1
- data/test/sass/conversion_test.rb +321 -95
- data/test/sass/engine_test.rb +7 -0
- data/test/sass/extend_test.rb +14 -0
- data/test/sass/functions_test.rb +13 -3
- data/test/sass/less_conversion_test.rb +162 -79
- data/test/sass/plugin_test.rb +24 -0
- data/test/sass/templates/_double_import_loop2.sass +1 -0
- data/test/sass/templates/double_import_loop1.sass +1 -0
- data/test/sass/templates/single_import_loop.sass +1 -0
- data/vendor/fssm/ext/rakefile.rb +14 -0
- data/vendor/fssm/fssm.gemspec +3 -0
- data/vendor/fssm/lib/fssm.rb +57 -20
- data/vendor/fssm/lib/fssm/support.rb +20 -25
- data/vendor/fssm/lib/fssm/version.rb +1 -1
- metadata +12 -8
data/REVISION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
|
1
|
+
ba7e79376e9d6d6b78d9ddf79fbba00239f6e675
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
3.2.0.alpha.
|
1
|
+
3.2.0.alpha.70
|
data/lib/sass/css.rb
CHANGED
@@ -24,6 +24,8 @@ module Sass
|
|
24
24
|
# (`:color blue` as opposed to `color: blue`).
|
25
25
|
# This is only meaningful when generating Sass code,
|
26
26
|
# rather than SCSS.
|
27
|
+
# @option options :indent [String] (" ")
|
28
|
+
# The string to use for indenting each line. Defaults to two spaces.
|
27
29
|
def initialize(template, options = {})
|
28
30
|
if template.is_a? IO
|
29
31
|
template = template.read
|
data/lib/sass/engine.rb
CHANGED
data/lib/sass/exec.rb
CHANGED
@@ -404,6 +404,7 @@ MSG
|
|
404
404
|
raise error unless error.is_a?(::Sass::SyntaxError) && !@options[:stop_on_error]
|
405
405
|
had_error = true
|
406
406
|
puts_action :error, :red, "#{error.sass_filename} (Line #{error.sass_line}: #{error.message})"
|
407
|
+
STDOUT.flush
|
407
408
|
end
|
408
409
|
|
409
410
|
if @options[:update]
|
@@ -414,9 +415,18 @@ MSG
|
|
414
415
|
|
415
416
|
puts ">>> Sass is watching for changes. Press Ctrl-C to stop."
|
416
417
|
|
417
|
-
::Sass::Plugin.on_template_modified
|
418
|
-
|
419
|
-
|
418
|
+
::Sass::Plugin.on_template_modified do |template|
|
419
|
+
puts ">>> Change detected to: #{template}"
|
420
|
+
STDOUT.flush
|
421
|
+
end
|
422
|
+
::Sass::Plugin.on_template_created do |template|
|
423
|
+
puts ">>> New template detected: #{template}"
|
424
|
+
STDOUT.flush
|
425
|
+
end
|
426
|
+
::Sass::Plugin.on_template_deleted do |template|
|
427
|
+
puts ">>> Deleted template detected: #{template}"
|
428
|
+
STDOUT.flush
|
429
|
+
end
|
420
430
|
|
421
431
|
::Sass::Plugin.watch(files)
|
422
432
|
end
|
@@ -515,6 +525,17 @@ END
|
|
515
525
|
@options[:for_tree][:dasherize] = true
|
516
526
|
end
|
517
527
|
|
528
|
+
opts.on('--indent NUM',
|
529
|
+
'How many spaces to use for each level of indentation. Defaults to 2.',
|
530
|
+
'"t" means use hard tabs.') do |indent|
|
531
|
+
|
532
|
+
if indent == 't'
|
533
|
+
@options[:for_tree][:indent] = "\t"
|
534
|
+
else
|
535
|
+
@options[:for_tree][:indent] = " " * indent.to_i
|
536
|
+
end
|
537
|
+
end
|
538
|
+
|
518
539
|
opts.on('--old', 'Output the old-style ":prop val" property syntax.',
|
519
540
|
'Only meaningful when generating Sass.') do
|
520
541
|
@options[:for_tree][:old] = true
|
@@ -39,6 +39,10 @@ module Sass
|
|
39
39
|
def initialize(options)
|
40
40
|
@dependencies = self.class.dependencies_cache
|
41
41
|
|
42
|
+
# URIs that are being actively checked for staleness. Protects against
|
43
|
+
# import loops.
|
44
|
+
@actively_checking = Set.new
|
45
|
+
|
42
46
|
# Entries in the following instance-level caches are never explicitly expired.
|
43
47
|
# Instead they are supposed to automaticaly go out of scope when a series of staleness checks
|
44
48
|
# (this instance of StalenessChecker was created for) is finished.
|
@@ -148,10 +152,16 @@ module Sass
|
|
148
152
|
|
149
153
|
def dependency_updated?(css_mtime)
|
150
154
|
Proc.new do |uri, importer|
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
+
next true if @actively_checking.include?(uri)
|
156
|
+
begin
|
157
|
+
@actively_checking << uri
|
158
|
+
sass_mtime = mtime(uri, importer)
|
159
|
+
!sass_mtime ||
|
160
|
+
sass_mtime > css_mtime ||
|
161
|
+
dependencies_stale?(uri, importer, css_mtime)
|
162
|
+
ensure
|
163
|
+
@actively_checking.delete uri
|
164
|
+
end
|
155
165
|
end
|
156
166
|
end
|
157
167
|
|
data/lib/sass/repl.rb
CHANGED
@@ -34,8 +34,8 @@ module Sass
|
|
34
34
|
case text
|
35
35
|
when Script::MATCH
|
36
36
|
name = $1
|
37
|
-
guarded =
|
38
|
-
val = Script::Parser.parse($
|
37
|
+
guarded = !!$3
|
38
|
+
val = Script::Parser.parse($2, @line, text.size - ($3 || '').size - $2.size)
|
39
39
|
|
40
40
|
unless guarded && environment.var(name)
|
41
41
|
environment.set_var(name, val.perform(environment))
|
data/lib/sass/script/color.rb
CHANGED
@@ -19,26 +19,157 @@ module Sass::Script
|
|
19
19
|
class << self; include Sass::Util; end
|
20
20
|
|
21
21
|
# A hash from color names to `[red, green, blue]` value arrays.
|
22
|
-
|
23
|
-
'
|
24
|
-
'
|
25
|
-
'
|
26
|
-
'
|
27
|
-
'
|
28
|
-
'
|
29
|
-
'
|
22
|
+
COLOR_NAMES = map_vals({
|
23
|
+
'aliceblue' => 0xf0f8ff,
|
24
|
+
'antiquewhite' => 0xfaebd7,
|
25
|
+
'aqua' => 0x00ffff,
|
26
|
+
'aquamarine' => 0x7fffd4,
|
27
|
+
'azure' => 0xf0ffff,
|
28
|
+
'beige' => 0xf5f5dc,
|
29
|
+
'bisque' => 0xffe4c4,
|
30
|
+
'black' => 0x000000,
|
31
|
+
'blanchedalmond' => 0xffebcd,
|
32
|
+
'blue' => 0x0000ff,
|
33
|
+
'blueviolet' => 0x8a2be2,
|
34
|
+
'brown' => 0xa52a2a,
|
35
|
+
'burlywood' => 0xdeb887,
|
36
|
+
'cadetblue' => 0x5f9ea0,
|
37
|
+
'chartreuse' => 0x7fff00,
|
38
|
+
'chocolate' => 0xd2691e,
|
39
|
+
'coral' => 0xff7f50,
|
40
|
+
'cornflowerblue' => 0x6495ed,
|
41
|
+
'cornsilk' => 0xfff8dc,
|
42
|
+
'crimson' => 0xdc143c,
|
43
|
+
'cyan' => 0x00ffff,
|
44
|
+
'darkblue' => 0x00008b,
|
45
|
+
'darkcyan' => 0x008b8b,
|
46
|
+
'darkgoldenrod' => 0xb8860b,
|
47
|
+
'darkgray' => 0xa9a9a9,
|
48
|
+
'darkgrey' => 0xa9a9a9,
|
49
|
+
'darkgreen' => 0x006400,
|
50
|
+
'darkkhaki' => 0xbdb76b,
|
51
|
+
'darkmagenta' => 0x8b008b,
|
52
|
+
'darkolivegreen' => 0x556b2f,
|
53
|
+
'darkorange' => 0xff8c00,
|
54
|
+
'darkorchid' => 0x9932cc,
|
55
|
+
'darkred' => 0x8b0000,
|
56
|
+
'darksalmon' => 0xe9967a,
|
57
|
+
'darkseagreen' => 0x8fbc8f,
|
58
|
+
'darkslateblue' => 0x483d8b,
|
59
|
+
'darkslategray' => 0x2f4f4f,
|
60
|
+
'darkslategrey' => 0x2f4f4f,
|
61
|
+
'darkturquoise' => 0x00ced1,
|
62
|
+
'darkviolet' => 0x9400d3,
|
63
|
+
'deeppink' => 0xff1493,
|
64
|
+
'deepskyblue' => 0x00bfff,
|
65
|
+
'dimgray' => 0x696969,
|
66
|
+
'dimgrey' => 0x696969,
|
67
|
+
'dodgerblue' => 0x1e90ff,
|
68
|
+
'firebrick' => 0xb22222,
|
69
|
+
'floralwhite' => 0xfffaf0,
|
70
|
+
'forestgreen' => 0x228b22,
|
30
71
|
'fuchsia' => 0xff00ff,
|
31
|
-
'
|
32
|
-
'
|
33
|
-
'
|
34
|
-
'
|
35
|
-
'
|
36
|
-
'
|
37
|
-
'
|
38
|
-
'
|
72
|
+
'gainsboro' => 0xdcdcdc,
|
73
|
+
'ghostwhite' => 0xf8f8ff,
|
74
|
+
'gold' => 0xffd700,
|
75
|
+
'goldenrod' => 0xdaa520,
|
76
|
+
'gray' => 0x808080,
|
77
|
+
'green' => 0x008000,
|
78
|
+
'greenyellow' => 0xadff2f,
|
79
|
+
'honeydew' => 0xf0fff0,
|
80
|
+
'hotpink' => 0xff69b4,
|
81
|
+
'indianred' => 0xcd5c5c,
|
82
|
+
'indigo' => 0x4b0082,
|
83
|
+
'ivory' => 0xfffff0,
|
84
|
+
'khaki' => 0xf0e68c,
|
85
|
+
'lavender' => 0xe6e6fa,
|
86
|
+
'lavenderblush' => 0xfff0f5,
|
87
|
+
'lawngreen' => 0x7cfc00,
|
88
|
+
'lemonchiffon' => 0xfffacd,
|
89
|
+
'lightblue' => 0xadd8e6,
|
90
|
+
'lightcoral' => 0xf08080,
|
91
|
+
'lightcyan' => 0xe0ffff,
|
92
|
+
'lightgoldenrodyellow' => 0xfafad2,
|
93
|
+
'lightgreen' => 0x90ee90,
|
94
|
+
'lightgray' => 0xd3d3d3,
|
95
|
+
'lightgrey' => 0xd3d3d3,
|
96
|
+
'lightpink' => 0xffb6c1,
|
97
|
+
'lightsalmon' => 0xffa07a,
|
98
|
+
'lightseagreen' => 0x20b2aa,
|
99
|
+
'lightskyblue' => 0x87cefa,
|
100
|
+
'lightslategray' => 0x778899,
|
101
|
+
'lightslategrey' => 0x778899,
|
102
|
+
'lightsteelblue' => 0xb0c4de,
|
103
|
+
'lightyellow' => 0xffffe0,
|
104
|
+
'lime' => 0x00ff00,
|
105
|
+
'limegreen' => 0x32cd32,
|
106
|
+
'linen' => 0xfaf0e6,
|
107
|
+
'magenta' => 0xff00ff,
|
108
|
+
'maroon' => 0x800000,
|
109
|
+
'mediumaquamarine' => 0x66cdaa,
|
110
|
+
'mediumblue' => 0x0000cd,
|
111
|
+
'mediumorchid' => 0xba55d3,
|
112
|
+
'mediumpurple' => 0x9370db,
|
113
|
+
'mediumseagreen' => 0x3cb371,
|
114
|
+
'mediumslateblue' => 0x7b68ee,
|
115
|
+
'mediumspringgreen' => 0x00fa9a,
|
116
|
+
'mediumturquoise' => 0x48d1cc,
|
117
|
+
'mediumvioletred' => 0xc71585,
|
118
|
+
'midnightblue' => 0x191970,
|
119
|
+
'mintcream' => 0xf5fffa,
|
120
|
+
'mistyrose' => 0xffe4e1,
|
121
|
+
'moccasin' => 0xffe4b5,
|
122
|
+
'navajowhite' => 0xffdead,
|
123
|
+
'navy' => 0x000080,
|
124
|
+
'oldlace' => 0xfdf5e6,
|
125
|
+
'olive' => 0x808000,
|
126
|
+
'olivedrab' => 0x6b8e23,
|
127
|
+
'orange' => 0xffa500,
|
128
|
+
'orangered' => 0xff4500,
|
129
|
+
'orchid' => 0xda70d6,
|
130
|
+
'palegoldenrod' => 0xeee8aa,
|
131
|
+
'palegreen' => 0x98fb98,
|
132
|
+
'paleturquoise' => 0xafeeee,
|
133
|
+
'palevioletred' => 0xdb7093,
|
134
|
+
'papayawhip' => 0xffefd5,
|
135
|
+
'peachpuff' => 0xffdab9,
|
136
|
+
'peru' => 0xcd853f,
|
137
|
+
'pink' => 0xffc0cb,
|
138
|
+
'plum' => 0xdda0dd,
|
139
|
+
'powderblue' => 0xb0e0e6,
|
140
|
+
'purple' => 0x800080,
|
141
|
+
'red' => 0xff0000,
|
142
|
+
'rosybrown' => 0xbc8f8f,
|
143
|
+
'royalblue' => 0x4169e1,
|
144
|
+
'saddlebrown' => 0x8b4513,
|
145
|
+
'salmon' => 0xfa8072,
|
146
|
+
'sandybrown' => 0xf4a460,
|
147
|
+
'seagreen' => 0x2e8b57,
|
148
|
+
'seashell' => 0xfff5ee,
|
149
|
+
'sienna' => 0xa0522d,
|
150
|
+
'silver' => 0xc0c0c0,
|
151
|
+
'skyblue' => 0x87ceeb,
|
152
|
+
'slateblue' => 0x6a5acd,
|
153
|
+
'slategray' => 0x708090,
|
154
|
+
'slategrey' => 0x708090,
|
155
|
+
'snow' => 0xfffafa,
|
156
|
+
'springgreen' => 0x00ff7f,
|
157
|
+
'steelblue' => 0x4682b4,
|
158
|
+
'tan' => 0xd2b48c,
|
159
|
+
'teal' => 0x008080,
|
160
|
+
'thistle' => 0xd8bfd8,
|
161
|
+
'tomato' => 0xff6347,
|
162
|
+
'turquoise' => 0x40e0d0,
|
163
|
+
'violet' => 0xee82ee,
|
164
|
+
'wheat' => 0xf5deb3,
|
165
|
+
'white' => 0xffffff,
|
166
|
+
'whitesmoke' => 0xf5f5f5,
|
167
|
+
'yellow' => 0xffff00,
|
168
|
+
'yellowgreen' => 0x9acd32
|
39
169
|
}) {|color| (0..2).map {|n| color >> (n << 3) & 0xff}.reverse}
|
170
|
+
|
40
171
|
# A hash from `[red, green, blue]` value arrays to color names.
|
41
|
-
|
172
|
+
COLOR_NAMES_REVERSE = map_hash(COLOR_NAMES) {|k, v| [v, k]}
|
42
173
|
|
43
174
|
# Constructs an RGB or HSL color object,
|
44
175
|
# optionally with an alpha channel.
|
@@ -368,7 +499,7 @@ module Sass::Script
|
|
368
499
|
def to_s(opts = {})
|
369
500
|
return rgba_str if alpha?
|
370
501
|
return smallest if options[:style] == :compressed
|
371
|
-
return
|
502
|
+
return COLOR_NAMES_REVERSE[rgb] if COLOR_NAMES_REVERSE[rgb]
|
372
503
|
hex_str
|
373
504
|
end
|
374
505
|
alias_method :to_sass, :to_s
|
@@ -384,7 +515,7 @@ module Sass::Script
|
|
384
515
|
|
385
516
|
def smallest
|
386
517
|
small_hex_str = hex_str.gsub(/^#(.)\1(.)\2(.)\3$/, '#\1\2\3')
|
387
|
-
return small_hex_str unless (color =
|
518
|
+
return small_hex_str unless (color = COLOR_NAMES_REVERSE[rgb]) &&
|
388
519
|
color.size <= small_hex_str.size
|
389
520
|
return color
|
390
521
|
end
|
@@ -99,6 +99,9 @@ module Sass::Script
|
|
99
99
|
# \{#change_color change-color($color, \[$red\], \[$green\], \[$blue\], \[$hue\], \[$saturation\], \[$lightness\], \[$alpha\]}
|
100
100
|
# : Changes one or more properties of a color.
|
101
101
|
#
|
102
|
+
# \{#ie_hex_str ie-hex-str($color)}
|
103
|
+
# : Converts a color into the format understood by IE filters.
|
104
|
+
#
|
102
105
|
# ## String Functions
|
103
106
|
#
|
104
107
|
# \{#unquote unquote($string)}
|
@@ -241,7 +244,7 @@ module Sass::Script
|
|
241
244
|
# to {Sass::Script::Literal}s as the last argument.
|
242
245
|
# In addition, if this is true and `:var_args` is not,
|
243
246
|
# Sass will ensure that the last argument passed is a hash.
|
244
|
-
#
|
247
|
+
#
|
245
248
|
# @example
|
246
249
|
# declare :rgba, [:hex, :alpha]
|
247
250
|
# declare :rgba, [:red, :green, :blue, :alpha]
|
@@ -733,6 +736,23 @@ module Sass::Script
|
|
733
736
|
end
|
734
737
|
declare :adjust_hue, [:color, :degrees]
|
735
738
|
|
739
|
+
# Returns an IE hex string for a color with an alpha channel
|
740
|
+
# suitable for passing to IE filters.
|
741
|
+
#
|
742
|
+
# @example
|
743
|
+
# ie-hex-str(#abc) => #FFAABBCC
|
744
|
+
# ie-hex-str(#3322BB) => #FF3322BB
|
745
|
+
# ie-hex-str(rgba(0, 255, 0, 0.5)) => #8000FF00
|
746
|
+
# @param color [Color]
|
747
|
+
# @return [String]
|
748
|
+
# @raise [ArgumentError] If `color` isn't a color
|
749
|
+
def ie_hex_str(color)
|
750
|
+
assert_type color, :Color
|
751
|
+
alpha = (color.alpha * 255).round.to_s(16).rjust(2, '0')
|
752
|
+
Sass::Script::String.new("##{alpha}#{color.send(:hex_str)[1..-1]}".upcase)
|
753
|
+
end
|
754
|
+
declare :ie_hex_str, [:color]
|
755
|
+
|
736
756
|
# Adjusts one or more properties of a color.
|
737
757
|
# This can change the red, green, blue, hue, saturation, value, and alpha properties.
|
738
758
|
# The properties are specified as keyword arguments,
|
@@ -982,14 +1002,23 @@ module Sass::Script
|
|
982
1002
|
declare :mix, [:color_1, :color_2]
|
983
1003
|
declare :mix, [:color_1, :color_2, :weight]
|
984
1004
|
|
985
|
-
#
|
986
|
-
#
|
1005
|
+
# @overload grayscale(color)
|
1006
|
+
# Converts a color to grayscale.
|
1007
|
+
# This is identical to `desaturate(color, 100%)`.
|
987
1008
|
#
|
988
|
-
#
|
989
|
-
#
|
990
|
-
#
|
991
|
-
#
|
1009
|
+
# @param color [Color]
|
1010
|
+
# @return [Color]
|
1011
|
+
# @raise [ArgumentError] if `color` isn't a color
|
1012
|
+
# @see #desaturate
|
1013
|
+
# @overload grayscale(number)
|
1014
|
+
# Returns an unquoted string `grayscale(number)`, as though the function
|
1015
|
+
# were not defined. This is for the `grayscale` function used in
|
1016
|
+
# `-webkit-filter`.
|
1017
|
+
#
|
1018
|
+
# @param number [Number]
|
1019
|
+
# @return [Sass::Script::String]
|
992
1020
|
def grayscale(color)
|
1021
|
+
return Sass::Script::String.new("grayscale(#{color})") if color.is_a?(Sass::Script::Number)
|
993
1022
|
desaturate color, Number.new(100)
|
994
1023
|
end
|
995
1024
|
declare :grayscale, [:color]
|
data/lib/sass/script/parser.rb
CHANGED
@@ -316,7 +316,7 @@ RUBY
|
|
316
316
|
return if @stop_at && @stop_at.include?(@lexer.peek.value)
|
317
317
|
|
318
318
|
name = @lexer.next
|
319
|
-
if color = Color::
|
319
|
+
if color = Color::COLOR_NAMES[name.value.downcase]
|
320
320
|
return node(Color.new(color))
|
321
321
|
end
|
322
322
|
node(Script::String.new(name.value, :identifier))
|
data/lib/sass/scss/parser.rb
CHANGED
@@ -16,12 +16,14 @@ class Sass::Tree::Visitors::Convert < Sass::Tree::Visitors::Base
|
|
16
16
|
@options = options
|
17
17
|
@format = format
|
18
18
|
@tabs = 0
|
19
|
+
# 2 spaces by default
|
20
|
+
@tab_chars = @options[:indent] || " "
|
19
21
|
end
|
20
22
|
|
21
23
|
def visit_children(parent)
|
22
24
|
@tabs += 1
|
23
25
|
return @format == :sass ? "\n" : " {}\n" if parent.children.empty?
|
24
|
-
(@format == :sass ? "\n" : " {\n") + super.join.rstrip + (@format == :sass ? "\n" : " }\n")
|
26
|
+
(@format == :sass ? "\n" : " {\n") + super.join.rstrip + (@format == :sass ? "\n" : "\n#{ @tab_chars * (@tabs-1)}}\n")
|
25
27
|
ensure
|
26
28
|
@tabs -= 1
|
27
29
|
end
|
@@ -249,7 +251,7 @@ class Sass::Tree::Visitors::Convert < Sass::Tree::Visitors::Base
|
|
249
251
|
end
|
250
252
|
|
251
253
|
def tab_str
|
252
|
-
|
254
|
+
@tab_chars * @tabs
|
253
255
|
end
|
254
256
|
|
255
257
|
def dasherize(s)
|
@@ -358,7 +358,9 @@ END
|
|
358
358
|
def handle_import_loop!(node)
|
359
359
|
msg = "An @import loop has been found:"
|
360
360
|
files = @stack.map {|s| s[:filename]}.compact
|
361
|
-
|
361
|
+
if node.filename == node.imported_file.options[:filename]
|
362
|
+
raise Sass::SyntaxError.new("#{msg} #{node.filename} imports itself")
|
363
|
+
end
|
362
364
|
|
363
365
|
files << node.filename << node.imported_file.options[:filename]
|
364
366
|
msg << "\n" << Sass::Util.enum_cons(files, 2).map do |m1, m2|
|