sass 3.3.0.rc.1 → 3.3.0.rc.2
Sign up to get free protection for your applications and to get access to all the features.
- data/Rakefile +1 -1
- data/VERSION +1 -1
- data/VERSION_DATE +1 -1
- data/lib/sass.rb +5 -0
- data/lib/sass/engine.rb +3 -5
- data/lib/sass/plugin.rb +0 -1
- data/lib/sass/plugin/compiler.rb +1 -2
- data/lib/sass/script/functions.rb +16 -2
- data/lib/sass/script/lexer.rb +22 -12
- data/lib/sass/script/parser.rb +27 -14
- data/lib/sass/script/tree/variable.rb +1 -1
- data/lib/sass/script/value/base.rb +1 -1
- data/lib/sass/script/value/color.rb +29 -17
- data/lib/sass/script/value/list.rb +1 -1
- data/lib/sass/script/value/number.rb +8 -1
- data/lib/sass/scss/parser.rb +2 -2
- data/lib/sass/selector/sequence.rb +18 -19
- data/lib/sass/selector/simple_sequence.rb +5 -5
- data/lib/sass/source/map.rb +1 -1
- data/lib/sass/tree/node.rb +25 -0
- data/lib/sass/tree/variable_node.rb +5 -0
- data/lib/sass/tree/visitors/base.rb +4 -7
- data/lib/sass/tree/visitors/check_nesting.rb +2 -2
- data/lib/sass/tree/visitors/perform.rb +12 -7
- data/lib/sass/util.rb +95 -50
- data/lib/sass/util/normalized_map.rb +63 -14
- data/lib/sass/util/ordered_hash.rb +9 -5
- data/lib/sass/version.rb +10 -12
- data/test/sass/engine_test.rb +37 -0
- data/test/sass/functions_test.rb +9 -2
- data/test/sass/importer_test.rb +3 -3
- data/test/sass/script_test.rb +12 -10
- data/test/sass/source_map_test.rb +8 -8
- data/test/sass/util/normalized_map_test.rb +22 -1
- data/test/sass/util_test.rb +18 -0
- data/test/test_helper.rb +16 -0
- data/vendor/listen/CHANGELOG.md +228 -0
- data/vendor/listen/CONTRIBUTING.md +38 -0
- data/vendor/listen/Gemfile +30 -0
- data/vendor/listen/Guardfile +8 -0
- data/vendor/listen/LICENSE +20 -0
- data/vendor/listen/README.md +315 -0
- data/vendor/listen/Rakefile +47 -0
- data/vendor/listen/Vagrantfile +96 -0
- data/vendor/listen/lib/listen.rb +40 -0
- data/vendor/listen/lib/listen/adapter.rb +214 -0
- data/vendor/listen/lib/listen/adapters/bsd.rb +112 -0
- data/vendor/listen/lib/listen/adapters/darwin.rb +85 -0
- data/vendor/listen/lib/listen/adapters/linux.rb +113 -0
- data/vendor/listen/lib/listen/adapters/polling.rb +67 -0
- data/vendor/listen/lib/listen/adapters/windows.rb +87 -0
- data/vendor/listen/lib/listen/dependency_manager.rb +126 -0
- data/vendor/listen/lib/listen/directory_record.rb +371 -0
- data/vendor/listen/lib/listen/listener.rb +225 -0
- data/vendor/listen/lib/listen/multi_listener.rb +143 -0
- data/vendor/listen/lib/listen/turnstile.rb +28 -0
- data/vendor/listen/lib/listen/version.rb +3 -0
- data/vendor/listen/listen.gemspec +22 -0
- data/vendor/listen/spec/listen/adapter_spec.rb +183 -0
- data/vendor/listen/spec/listen/adapters/bsd_spec.rb +36 -0
- data/vendor/listen/spec/listen/adapters/darwin_spec.rb +37 -0
- data/vendor/listen/spec/listen/adapters/linux_spec.rb +47 -0
- data/vendor/listen/spec/listen/adapters/polling_spec.rb +68 -0
- data/vendor/listen/spec/listen/adapters/windows_spec.rb +30 -0
- data/vendor/listen/spec/listen/dependency_manager_spec.rb +107 -0
- data/vendor/listen/spec/listen/directory_record_spec.rb +1225 -0
- data/vendor/listen/spec/listen/listener_spec.rb +169 -0
- data/vendor/listen/spec/listen/multi_listener_spec.rb +174 -0
- data/vendor/listen/spec/listen/turnstile_spec.rb +56 -0
- data/vendor/listen/spec/listen_spec.rb +73 -0
- data/vendor/listen/spec/spec_helper.rb +21 -0
- data/vendor/listen/spec/support/adapter_helper.rb +629 -0
- data/vendor/listen/spec/support/directory_record_helper.rb +55 -0
- data/vendor/listen/spec/support/fixtures_helper.rb +29 -0
- data/vendor/listen/spec/support/listeners_helper.rb +156 -0
- data/vendor/listen/spec/support/platform_helper.rb +15 -0
- metadata +318 -300
- data/test/Gemfile.lock +0 -10
data/Rakefile
CHANGED
@@ -21,7 +21,7 @@ end
|
|
21
21
|
|
22
22
|
# ----- Code Style Enforcement -----
|
23
23
|
|
24
|
-
if RUBY_VERSION !~ /^(1\.8|2\.1)/ && (ENV.has_key?("RUBOCOP") && ENV["RUBOCOP"] == "true" || !ENV.has_key?("RUBOCOP"))
|
24
|
+
if RUBY_VERSION !~ /^(1\.8|2\.1)/ && (ENV.has_key?("RUBOCOP") && ENV["RUBOCOP"] == "true" || !(ENV.has_key?("RUBOCOP") || ENV.has_key?("TEST")))
|
25
25
|
require 'rubocop/rake_task'
|
26
26
|
Rubocop::RakeTask.new do |t|
|
27
27
|
t.patterns = FileList["lib/**/*"]
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
3.3.0.rc.
|
1
|
+
3.3.0.rc.2
|
data/VERSION_DATE
CHANGED
@@ -1 +1 @@
|
|
1
|
-
|
1
|
+
23 November 2013 02:13:52 UTC
|
data/lib/sass.rb
CHANGED
@@ -17,6 +17,11 @@ require 'sass/version'
|
|
17
17
|
#
|
18
18
|
# Also see the {file:SASS_REFERENCE.md full Sass reference}.
|
19
19
|
module Sass
|
20
|
+
class << self
|
21
|
+
# @private
|
22
|
+
attr_accessor :tests_running
|
23
|
+
end
|
24
|
+
|
20
25
|
# The global load paths for Sass files. This is meant for plugins and
|
21
26
|
# libraries to register the paths to their Sass stylesheets to that they may
|
22
27
|
# be `@imported`. This load path is used by every instance of {Sass::Engine}.
|
data/lib/sass/engine.rb
CHANGED
@@ -88,8 +88,6 @@ module Sass
|
|
88
88
|
# output = sass_engine.render
|
89
89
|
# puts output
|
90
90
|
class Engine
|
91
|
-
include Sass::Util
|
92
|
-
|
93
91
|
# A line of Sass code.
|
94
92
|
#
|
95
93
|
# `text`: `String`
|
@@ -375,7 +373,7 @@ ERR
|
|
375
373
|
end
|
376
374
|
|
377
375
|
def encode_and_set_charset(rendered)
|
378
|
-
return rendered if ruby1_8?
|
376
|
+
return rendered if Sass::Util.ruby1_8?
|
379
377
|
begin
|
380
378
|
# Try to convert the result to the original encoding,
|
381
379
|
# but if that doesn't work fall back on UTF-8
|
@@ -431,7 +429,7 @@ ERR
|
|
431
429
|
def check_encoding!
|
432
430
|
return if @checked_encoding
|
433
431
|
@checked_encoding = true
|
434
|
-
@template, @original_encoding = check_sass_encoding(@template) do |msg, line|
|
432
|
+
@template, @original_encoding = Sass::Util.check_sass_encoding(@template) do |msg, line|
|
435
433
|
raise Sass::SyntaxError.new(msg, :line => line)
|
436
434
|
end
|
437
435
|
end
|
@@ -766,7 +764,7 @@ WARNING
|
|
766
764
|
value = self.class.parse_interp(
|
767
765
|
line.text, line.index, to_parser_offset(line.offset), :filename => @filename)
|
768
766
|
end
|
769
|
-
value = with_extracted_values(value) do |str|
|
767
|
+
value = Sass::Util.with_extracted_values(value) do |str|
|
770
768
|
str = str.gsub(/^#{line.comment_tab_str}/m, '')[2..-1] # get rid of // or /*
|
771
769
|
format_comment_text(str, silent)
|
772
770
|
end
|
data/lib/sass/plugin.rb
CHANGED
data/lib/sass/plugin/compiler.rb
CHANGED
@@ -27,7 +27,6 @@ module Sass::Plugin
|
|
27
27
|
# * `:never_update`
|
28
28
|
# * `:always_check`
|
29
29
|
class Compiler
|
30
|
-
include Sass::Util
|
31
30
|
include Configuration
|
32
31
|
extend Sass::Callbacks
|
33
32
|
|
@@ -61,7 +60,7 @@ module Sass::Plugin
|
|
61
60
|
# when an exception CSS file is being written.
|
62
61
|
# To run an action for those files, use \{#on\_compilation\_error}.
|
63
62
|
#
|
64
|
-
# @yield [template, css]
|
63
|
+
# @yield [template, css, sourcemap]
|
65
64
|
# @yieldparam template [String]
|
66
65
|
# The location of the Sass/SCSS file being updated.
|
67
66
|
# @yieldparam css [String]
|
@@ -219,6 +219,9 @@ module Sass::Script
|
|
219
219
|
# \{#mixin_exists mixin-exists($name)}
|
220
220
|
# : Returns whether a mixin with the given name exists.
|
221
221
|
#
|
222
|
+
# \{#inspect inspect($value)}
|
223
|
+
# : Returns the string representation of a value as it would be represented in Sass.
|
224
|
+
#
|
222
225
|
# \{#type_of type-of($value)}
|
223
226
|
# : Returns the type of a value.
|
224
227
|
#
|
@@ -1155,12 +1158,12 @@ module Sass::Script
|
|
1155
1158
|
# same time
|
1156
1159
|
def change_color(color, kwargs)
|
1157
1160
|
assert_type color, :Color, :color
|
1158
|
-
with = Sass::Util.
|
1161
|
+
with = Sass::Util.to_hash(%w[red green blue hue saturation lightness alpha].map do |name|
|
1159
1162
|
val = kwargs.delete(name)
|
1160
1163
|
next unless val
|
1161
1164
|
assert_type val, :Number, name
|
1162
1165
|
[name.to_sym, val.value]
|
1163
|
-
end
|
1166
|
+
end)
|
1164
1167
|
|
1165
1168
|
unless kwargs.empty?
|
1166
1169
|
name, val = kwargs.to_a.first
|
@@ -2154,6 +2157,17 @@ module Sass::Script
|
|
2154
2157
|
end
|
2155
2158
|
declare :mixin_exists, [:name]
|
2156
2159
|
|
2160
|
+
|
2161
|
+
# Return a string containing the value as its Sass representation.
|
2162
|
+
#
|
2163
|
+
# @param value [Sass::Script::Value::Base] The value to inspect.
|
2164
|
+
# @return [Sass::Script::Value::String] A respresentation of the value as
|
2165
|
+
# it would be written in Sass.
|
2166
|
+
def inspect(value)
|
2167
|
+
unquoted_string(value.to_sass)
|
2168
|
+
end
|
2169
|
+
declare :inspect, [:value]
|
2170
|
+
|
2157
2171
|
private
|
2158
2172
|
|
2159
2173
|
# This method implements the pattern of transforming a numeric value into
|
data/lib/sass/script/lexer.rb
CHANGED
@@ -117,18 +117,28 @@ module Sass
|
|
117
117
|
# while the boolean represents whether or not the string
|
118
118
|
# is following an interpolated segment.
|
119
119
|
STRING_REGULAR_EXPRESSIONS = {
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
120
|
+
:double => {
|
121
|
+
false => string_re('"', '"'),
|
122
|
+
true => string_re('', '"')
|
123
|
+
},
|
124
|
+
:single => {
|
125
|
+
false => string_re("'", "'"),
|
126
|
+
true => string_re('', "'")
|
127
|
+
},
|
128
|
+
:uri => {
|
129
|
+
false => /url\(#{W}(#{URLCHAR}*?)(#{W}\)|#\{)/,
|
130
|
+
true => /(#{URLCHAR}*?)(#{W}\)|#\{)/
|
131
|
+
},
|
126
132
|
# Defined in https://developer.mozilla.org/en/CSS/@-moz-document as a
|
127
133
|
# non-standard version of http://www.w3.org/TR/css3-conditional/
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
134
|
+
:url_prefix => {
|
135
|
+
false => /url-prefix\(#{W}(#{URLCHAR}*?)(#{W}\)|#\{)/,
|
136
|
+
true => /(#{URLCHAR}*?)(#{W}\)|#\{)/
|
137
|
+
},
|
138
|
+
:domain => {
|
139
|
+
false => /domain\(#{W}(#{URLCHAR}*?)(#{W}\)|#\{)/,
|
140
|
+
true => /(#{URLCHAR}*?)(#{W}\)|#\{)/
|
141
|
+
}
|
132
142
|
}
|
133
143
|
|
134
144
|
# @param str [String, StringScanner] The source text to lex
|
@@ -265,7 +275,7 @@ module Sass
|
|
265
275
|
end
|
266
276
|
|
267
277
|
def string(re, open)
|
268
|
-
return unless scan(STRING_REGULAR_EXPRESSIONS[[
|
278
|
+
return unless scan(STRING_REGULAR_EXPRESSIONS[re][open])
|
269
279
|
if @scanner[2] == '#{' # '
|
270
280
|
@scanner.pos -= 2 # Don't actually consume the #{
|
271
281
|
@offset -= 2
|
@@ -364,7 +374,7 @@ MESSAGE
|
|
364
374
|
return unless str
|
365
375
|
c = str.count("\n")
|
366
376
|
@line += c
|
367
|
-
@offset = (c == 0 ? @offset + str.size : str
|
377
|
+
@offset = (c == 0 ? @offset + str.size : str.size - str.rindex("\n") + 1)
|
368
378
|
str
|
369
379
|
end
|
370
380
|
|
data/lib/sass/script/parser.rb
CHANGED
@@ -219,7 +219,7 @@ module Sass
|
|
219
219
|
interp = try_ops_after_interp(#{ops.inspect}, #{name.inspect})
|
220
220
|
return interp if interp
|
221
221
|
return unless e = #{sub}
|
222
|
-
while tok =
|
222
|
+
while tok = try_toks(#{ops.map {|o| o.inspect}.join(', ')})
|
223
223
|
if interp = try_op_before_interp(tok, e)
|
224
224
|
other_interp = try_ops_after_interp(#{ops.inspect}, #{name.inspect}, interp)
|
225
225
|
return interp unless other_interp
|
@@ -266,12 +266,12 @@ RUBY
|
|
266
266
|
return unless e
|
267
267
|
return list e, start_pos unless @lexer.peek && @lexer.peek.type == :colon
|
268
268
|
|
269
|
-
|
270
|
-
map = node(Sass::Script::Tree::MapLiteral.new([
|
269
|
+
pair = map_pair(e)
|
270
|
+
map = node(Sass::Script::Tree::MapLiteral.new([pair]), start_pos)
|
271
271
|
while try_tok(:comma)
|
272
|
-
|
273
|
-
|
274
|
-
map.pairs <<
|
272
|
+
pair = map_pair
|
273
|
+
return map unless pair
|
274
|
+
map.pairs << pair
|
275
275
|
end
|
276
276
|
map
|
277
277
|
end
|
@@ -321,7 +321,7 @@ RUBY
|
|
321
321
|
|
322
322
|
def try_ops_after_interp(ops, name, prev = nil)
|
323
323
|
return unless @lexer.after_interpolation?
|
324
|
-
op =
|
324
|
+
op = try_toks(*ops)
|
325
325
|
return unless op
|
326
326
|
interp = try_op_before_interp(op, prev)
|
327
327
|
return interp if interp
|
@@ -413,12 +413,12 @@ RUBY
|
|
413
413
|
if try_tok(:colon)
|
414
414
|
val = assert_expr(:space)
|
415
415
|
must_have_default = true
|
416
|
-
elsif must_have_default
|
417
|
-
raise SyntaxError.new(
|
418
|
-
"Required argument #{var.inspect} must come before any optional arguments.")
|
419
416
|
elsif try_tok(:splat)
|
420
417
|
splat = var
|
421
418
|
break
|
419
|
+
elsif must_have_default
|
420
|
+
raise SyntaxError.new(
|
421
|
+
"Required argument #{var.inspect} must come before any optional arguments.")
|
422
422
|
end
|
423
423
|
res << [var, val]
|
424
424
|
break unless try_tok(:comma)
|
@@ -543,7 +543,7 @@ RUBY
|
|
543
543
|
end
|
544
544
|
|
545
545
|
def literal
|
546
|
-
t =
|
546
|
+
t = try_toks(:color, :bool, :null)
|
547
547
|
return literal_node(t.value, t.source_range) if t
|
548
548
|
end
|
549
549
|
|
@@ -564,13 +564,26 @@ RUBY
|
|
564
564
|
@lexer.expected!(expected || EXPR_NAMES[name] || EXPR_NAMES[:default])
|
565
565
|
end
|
566
566
|
|
567
|
-
def assert_tok(
|
568
|
-
|
567
|
+
def assert_tok(name)
|
568
|
+
# Avoids an array allocation caused by argument globbing in assert_toks.
|
569
|
+
t = try_tok(name)
|
570
|
+
return t if t
|
571
|
+
@lexer.expected!(Lexer::TOKEN_NAMES[name] || name.to_s)
|
572
|
+
end
|
573
|
+
|
574
|
+
def assert_toks(*names)
|
575
|
+
t = try_toks(*names)
|
569
576
|
return t if t
|
570
577
|
@lexer.expected!(names.map {|tok| Lexer::TOKEN_NAMES[tok] || tok}.join(" or "))
|
571
578
|
end
|
572
579
|
|
573
|
-
def try_tok(
|
580
|
+
def try_tok(name)
|
581
|
+
# Avoids an array allocation caused by argument globbing in the try_toks method.
|
582
|
+
peeked = @lexer.peek
|
583
|
+
peeked && name == peeked.type && @lexer.next
|
584
|
+
end
|
585
|
+
|
586
|
+
def try_toks(*names)
|
574
587
|
peeked = @lexer.peek
|
575
588
|
peeked && names.include?(peeked.type) && @lexer.next
|
576
589
|
end
|
@@ -47,7 +47,7 @@ module Sass::Script::Tree
|
|
47
47
|
def _perform(environment)
|
48
48
|
val = environment.var(name)
|
49
49
|
raise Sass::SyntaxError.new("Undefined variable: \"$#{name}\".") unless val
|
50
|
-
if val.is_a?(Sass::Script::Value::Number)
|
50
|
+
if val.is_a?(Sass::Script::Value::Number) && val.original
|
51
51
|
val = val.dup
|
52
52
|
val.original = nil
|
53
53
|
end
|
@@ -14,13 +14,33 @@ module Sass::Script::Value
|
|
14
14
|
# If only the alpha channel is modified using \{#with},
|
15
15
|
# the cached RGB and HSL values are retained.
|
16
16
|
class Color < Base
|
17
|
-
|
17
|
+
# @private
|
18
|
+
#
|
19
|
+
# Convert a ruby integer to a rgba components
|
20
|
+
# @param color [Fixnum]
|
21
|
+
# @return [Array<Fixnum>] Array of 4 numbers representing r,g,b and alpha
|
22
|
+
def self.int_to_rgba(color)
|
23
|
+
rgba = (0..3).map {|n| color >> (n << 3) & 0xff}.reverse
|
24
|
+
rgba[-1] = rgba[-1] / 255.0
|
25
|
+
rgba
|
26
|
+
end
|
27
|
+
|
28
|
+
ALTERNATE_COLOR_NAMES = Sass::Util.map_vals({
|
29
|
+
'aqua' => 0x00FFFFFF,
|
30
|
+
'darkgrey' => 0xA9A9A9FF,
|
31
|
+
'darkslategrey' => 0x2F4F4FFF,
|
32
|
+
'dimgrey' => 0x696969FF,
|
33
|
+
'fuchsia' => 0xFF00FFFF,
|
34
|
+
'grey' => 0x808080FF,
|
35
|
+
'lightgrey' => 0xD3D3D3FF,
|
36
|
+
'lightslategrey' => 0x778899FF,
|
37
|
+
'slategrey' => 0x708090FF,
|
38
|
+
}, &method(:int_to_rgba))
|
18
39
|
|
19
40
|
# A hash from color names to `[red, green, blue]` value arrays.
|
20
|
-
COLOR_NAMES = map_vals(
|
41
|
+
COLOR_NAMES = Sass::Util.map_vals({
|
21
42
|
'aliceblue' => 0xF0F8FFFF,
|
22
43
|
'antiquewhite' => 0xFAEBD7FF,
|
23
|
-
'aqua' => 0x00FFFFFF,
|
24
44
|
'aquamarine' => 0x7FFFD4FF,
|
25
45
|
'azure' => 0xF0FFFFFF,
|
26
46
|
'beige' => 0xF5F5DCFF,
|
@@ -43,7 +63,6 @@ module Sass::Script::Value
|
|
43
63
|
'darkcyan' => 0x008B8BFF,
|
44
64
|
'darkgoldenrod' => 0xB8860BFF,
|
45
65
|
'darkgray' => 0xA9A9A9FF,
|
46
|
-
'darkgrey' => 0xA9A9A9FF,
|
47
66
|
'darkgreen' => 0x006400FF,
|
48
67
|
'darkkhaki' => 0xBDB76BFF,
|
49
68
|
'darkmagenta' => 0x8B008BFF,
|
@@ -55,24 +74,20 @@ module Sass::Script::Value
|
|
55
74
|
'darkseagreen' => 0x8FBC8FFF,
|
56
75
|
'darkslateblue' => 0x483D8BFF,
|
57
76
|
'darkslategray' => 0x2F4F4FFF,
|
58
|
-
'darkslategrey' => 0x2F4F4FFF,
|
59
77
|
'darkturquoise' => 0x00CED1FF,
|
60
78
|
'darkviolet' => 0x9400D3FF,
|
61
79
|
'deeppink' => 0xFF1493FF,
|
62
80
|
'deepskyblue' => 0x00BFFFFF,
|
63
81
|
'dimgray' => 0x696969FF,
|
64
|
-
'dimgrey' => 0x696969FF,
|
65
82
|
'dodgerblue' => 0x1E90FFFF,
|
66
83
|
'firebrick' => 0xB22222FF,
|
67
84
|
'floralwhite' => 0xFFFAF0FF,
|
68
85
|
'forestgreen' => 0x228B22FF,
|
69
|
-
'fuchsia' => 0xFF00FFFF,
|
70
86
|
'gainsboro' => 0xDCDCDCFF,
|
71
87
|
'ghostwhite' => 0xF8F8FFFF,
|
72
88
|
'gold' => 0xFFD700FF,
|
73
89
|
'goldenrod' => 0xDAA520FF,
|
74
90
|
'gray' => 0x808080FF,
|
75
|
-
'grey' => 0x808080FF,
|
76
91
|
'green' => 0x008000FF,
|
77
92
|
'greenyellow' => 0xADFF2FFF,
|
78
93
|
'honeydew' => 0xF0FFF0FF,
|
@@ -91,13 +106,11 @@ module Sass::Script::Value
|
|
91
106
|
'lightgoldenrodyellow' => 0xFAFAD2FF,
|
92
107
|
'lightgreen' => 0x90EE90FF,
|
93
108
|
'lightgray' => 0xD3D3D3FF,
|
94
|
-
'lightgrey' => 0xD3D3D3FF,
|
95
109
|
'lightpink' => 0xFFB6C1FF,
|
96
110
|
'lightsalmon' => 0xFFA07AFF,
|
97
111
|
'lightseagreen' => 0x20B2AAFF,
|
98
112
|
'lightskyblue' => 0x87CEFAFF,
|
99
113
|
'lightslategray' => 0x778899FF,
|
100
|
-
'lightslategrey' => 0x778899FF,
|
101
114
|
'lightsteelblue' => 0xB0C4DEFF,
|
102
115
|
'lightyellow' => 0xFFFFE0FF,
|
103
116
|
'lime' => 0x00FF00FF,
|
@@ -150,7 +163,6 @@ module Sass::Script::Value
|
|
150
163
|
'skyblue' => 0x87CEEBFF,
|
151
164
|
'slateblue' => 0x6A5ACDFF,
|
152
165
|
'slategray' => 0x708090FF,
|
153
|
-
'slategrey' => 0x708090FF,
|
154
166
|
'snow' => 0xFFFAFAFF,
|
155
167
|
'springgreen' => 0x00FF7FFF,
|
156
168
|
'steelblue' => 0x4682B4FF,
|
@@ -166,14 +178,14 @@ module Sass::Script::Value
|
|
166
178
|
'whitesmoke' => 0xF5F5F5FF,
|
167
179
|
'yellow' => 0xFFFF00FF,
|
168
180
|
'yellowgreen' => 0x9ACD32FF
|
169
|
-
|
170
|
-
rgba = (0..3).map {|n| color >> (n << 3) & 0xff}.reverse
|
171
|
-
rgba[-1] = rgba[-1] / 255.0
|
172
|
-
rgba
|
173
|
-
end
|
181
|
+
}, &method(:int_to_rgba))
|
174
182
|
|
175
183
|
# A hash from `[red, green, blue, alpha]` value arrays to color names.
|
176
|
-
COLOR_NAMES_REVERSE =
|
184
|
+
COLOR_NAMES_REVERSE = COLOR_NAMES.invert.freeze
|
185
|
+
|
186
|
+
# We add the alternate color names after inverting because
|
187
|
+
# different ruby implementations and versions vary on the ordering of the result of invert.
|
188
|
+
COLOR_NAMES.update(ALTERNATE_COLOR_NAMES).freeze
|
177
189
|
|
178
190
|
# Constructs an RGB or HSL color object,
|
179
191
|
# optionally with an alpha channel.
|
@@ -52,7 +52,7 @@ module Sass::Script::Value
|
|
52
52
|
def to_sass(opts = {})
|
53
53
|
return "()" if value.empty?
|
54
54
|
precedence = Sass::Script::Parser.precedence_of(separator)
|
55
|
-
members = value.
|
55
|
+
members = value.map do |v|
|
56
56
|
if v.is_a?(List) && Sass::Script::Parser.precedence_of(v.separator) <= precedence ||
|
57
57
|
separator == :space && v.is_a?(Sass::Script::Tree::UnaryOperation) &&
|
58
58
|
(v.operator == :minus || v.operator == :plus)
|
@@ -276,7 +276,14 @@ module Sass::Script::Value
|
|
276
276
|
# @return [String] The representation
|
277
277
|
def inspect(opts = {})
|
278
278
|
value = self.class.round(self.value)
|
279
|
-
|
279
|
+
str = value.to_s
|
280
|
+
|
281
|
+
# Ruby will occasionally print in scientific notation if the number is
|
282
|
+
# small enough. That's technically valid CSS, but it's not well-supported
|
283
|
+
# and confusing.
|
284
|
+
str = ("%0.#{self.class.precision}f" % value).gsub(/0*$/, '') if str.include?('e')
|
285
|
+
|
286
|
+
unitless? ? str : "#{str}#{unit_str}"
|
280
287
|
end
|
281
288
|
alias_method :to_sass, :inspect
|
282
289
|
|
data/lib/sass/scss/parser.rb
CHANGED
@@ -1092,11 +1092,11 @@ MESSAGE
|
|
1092
1092
|
end
|
1093
1093
|
|
1094
1094
|
def _interp_string(type)
|
1095
|
-
start = tok(Sass::Script::Lexer::STRING_REGULAR_EXPRESSIONS[[
|
1095
|
+
start = tok(Sass::Script::Lexer::STRING_REGULAR_EXPRESSIONS[type][false])
|
1096
1096
|
return unless start
|
1097
1097
|
res = [start]
|
1098
1098
|
|
1099
|
-
mid_re = Sass::Script::Lexer::STRING_REGULAR_EXPRESSIONS[[
|
1099
|
+
mid_re = Sass::Script::Lexer::STRING_REGULAR_EXPRESSIONS[type][true]
|
1100
1100
|
# @scanner[2].empty? means we've started an interpolated section
|
1101
1101
|
while @scanner[2] == '#{'
|
1102
1102
|
@scanner.pos -= 2 # Don't consume the #{
|