sassc 1.5.1 → 1.6.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +12 -1
- data/lib/sassc/error.rb +5 -3
- data/lib/sassc/functions_handler.rb +23 -48
- data/lib/sassc/native/native_functions_api.rb +17 -0
- data/lib/sassc/script.rb +12 -2
- data/lib/sassc/script/value_conversion.rb +42 -0
- data/lib/sassc/script/value_conversion/base.rb +11 -0
- data/lib/sassc/script/value_conversion/color.rb +16 -0
- data/lib/sassc/script/value_conversion/string.rb +15 -0
- data/lib/sassc/version.rb +1 -1
- data/test/functions_test.rb +87 -64
- metadata +6 -4
- data/lib/sassc/script/color.rb +0 -11
- data/lib/sassc/script/string.rb +0 -103
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: bac3ffe63156b284a72c2c8496c06a5b14bccc62
|
4
|
+
data.tar.gz: 55a875b297d4253f639461174e5ddd33dbe464e6
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: fe168c4733030c3fe7132a38c3ea09ebf03113e665cbb3df82abfdf114a32a361dc1673083037b8c9d1d6174b87e7f86e75ecdfacf23a4c3144fe1d2e7b3c499
|
7
|
+
data.tar.gz: 3159f2ef6faf4f214b1a788104f1d14511fe3d4e50503e81843821e0a05959e339b1b98514b8e8d502e278003557c0bdacb31015909d6aa440f5a79d1725dbb4
|
data/README.md
CHANGED
@@ -18,11 +18,22 @@ to CSS. To compile, use a `SassC::Engine`.
|
|
18
18
|
|
19
19
|
Additionally, you can use `SassC::Sass2Scss` to convert Sass syntax to Scss syntax.
|
20
20
|
|
21
|
+
## Credits
|
22
|
+
|
23
|
+
This gem is maintained by [Ryan Boland](https://ryanboland.com)
|
24
|
+
and [awesome contributors](https://github.com/bolandrm/sassc-ruby/graphs/contributors).
|
25
|
+
|
21
26
|
## Changelog
|
22
27
|
|
28
|
+
- **1.6.0**
|
29
|
+
- [Support Sass Color types](https://github.com/bolandrm/sassc-ruby/pull/14)
|
30
|
+
- [Support quoted strings](https://github.com/bolandrm/sassc-ruby/pull/13)
|
31
|
+
- [Improve custom function error handling](https://github.com/bolandrm/sassc-ruby/pull/15)
|
32
|
+
- **1.5.1**
|
33
|
+
- 2nd attempt at fixing compilation bug (issue [#12](https://github.com/bolandrm/sassc-ruby/issues/12))
|
23
34
|
- **1.5.0**
|
24
35
|
- Add support for inline source maps
|
25
|
-
- Fix compilation bug (issue #12
|
36
|
+
- Fix compilation bug (issue [#12](https://github.com/bolandrm/sassc-ruby/issues/12))
|
26
37
|
- **1.4.0**
|
27
38
|
- Add support for line number comments
|
28
39
|
- **1.3.0**
|
data/lib/sassc/error.rb
CHANGED
@@ -1,7 +1,9 @@
|
|
1
1
|
require 'sass/error'
|
2
2
|
|
3
3
|
module SassC
|
4
|
-
class
|
5
|
-
class
|
6
|
-
class
|
4
|
+
class BaseError < StandardError; end
|
5
|
+
class SyntaxError < BaseError; end
|
6
|
+
class NotRenderedError < BaseError; end
|
7
|
+
class InvalidStyleError < BaseError; end
|
8
|
+
class UnsupportedValue < BaseError; end
|
7
9
|
end
|
@@ -15,46 +15,13 @@ module SassC
|
|
15
15
|
|
16
16
|
Script.custom_functions.each_with_index do |custom_function, i|
|
17
17
|
@callbacks[custom_function] = FFI::Function.new(:pointer, [:pointer, :pointer]) do |native_argument_list, cookie|
|
18
|
-
native_argument_list_length = Native.list_get_length(native_argument_list)
|
19
|
-
custom_function_arguments = []
|
20
|
-
error_tag = nil
|
21
|
-
|
22
|
-
(0...native_argument_list_length).each do |i|
|
23
|
-
native_value = Native.list_get_value(native_argument_list, i)
|
24
|
-
|
25
|
-
case value_tag = Native.value_get_tag(native_value)
|
26
|
-
when :sass_null
|
27
|
-
# no-op
|
28
|
-
when :sass_string
|
29
|
-
native_string = Native.string_get_value(native_value)
|
30
|
-
argument = Script::String.new(Script::String.unquote(native_string), Script::String.type(native_string))
|
31
|
-
|
32
|
-
custom_function_arguments << argument
|
33
|
-
when :sass_color
|
34
|
-
red, green, blue, alpha = Native.color_get_r(native_value), Native.color_get_g(native_value), Native.color_get_b(native_value), Native.color_get_a(native_value)
|
35
|
-
|
36
|
-
argument = Script::Color.new([red, green, blue, alpha])
|
37
|
-
argument.options = @options
|
38
|
-
|
39
|
-
custom_function_arguments << argument
|
40
|
-
else
|
41
|
-
error_tag = error("Sass argument of type #{value_tag} unsupported")
|
42
|
-
break
|
43
|
-
end
|
44
|
-
end
|
45
|
-
|
46
|
-
next error_tag if error_tag
|
47
|
-
|
48
18
|
begin
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
value = Script::String.new(Script::String.unquote(value.to_s), value.type)
|
53
|
-
value.to_native
|
54
|
-
else
|
55
|
-
Script::String.new("").to_native
|
56
|
-
end
|
19
|
+
function_arguments = arguments_from_native_list(native_argument_list)
|
20
|
+
result = functions.send(custom_function, *function_arguments)
|
21
|
+
to_native_value(result)
|
57
22
|
rescue StandardError => exception
|
23
|
+
# This rescues any exceptions that occur either in value conversion
|
24
|
+
# or during the execution of a custom function.
|
58
25
|
error(exception.message)
|
59
26
|
end
|
60
27
|
end
|
@@ -75,19 +42,27 @@ module SassC
|
|
75
42
|
|
76
43
|
private
|
77
44
|
|
78
|
-
def
|
79
|
-
|
80
|
-
value[:unknown] = Native::SassUnknown.new
|
45
|
+
def arguments_from_native_list(native_argument_list)
|
46
|
+
native_argument_list_length = Native.list_get_length(native_argument_list)
|
81
47
|
|
82
|
-
|
83
|
-
|
48
|
+
(0...native_argument_list_length).map do |i|
|
49
|
+
native_value = Native.list_get_value(native_argument_list, i)
|
50
|
+
Script::ValueConversion.from_native(native_value, @options)
|
51
|
+
end.compact
|
52
|
+
end
|
84
53
|
|
85
|
-
|
86
|
-
|
54
|
+
def to_native_value(sass_value)
|
55
|
+
# if the custom function returns nil, we provide a "default" return
|
56
|
+
# value of an empty string
|
57
|
+
sass_value ||= Script::String.new("")
|
87
58
|
|
88
|
-
|
89
|
-
|
90
|
-
|
59
|
+
sass_value.options = @options
|
60
|
+
Script::ValueConversion.to_native(sass_value)
|
61
|
+
end
|
62
|
+
|
63
|
+
def error(message)
|
64
|
+
$stderr.puts "[SassC::FunctionsHandler] #{message}"
|
65
|
+
Native.make_error(message)
|
91
66
|
end
|
92
67
|
|
93
68
|
class FunctionWrapper
|
@@ -14,8 +14,18 @@ module SassC
|
|
14
14
|
|
15
15
|
# ADDAPI union Sass_Value* ADDCALL sass_make_number (double val, const char* unit);
|
16
16
|
attach_function :sass_make_number, [:double, :string], :sass_value_ptr
|
17
|
+
|
18
|
+
# ADDAPI union Sass_Value* ADDCALL sass_make_string (const char* val);
|
17
19
|
attach_function :sass_make_string, [:string], :sass_value_ptr
|
18
20
|
|
21
|
+
# ADDAPI union Sass_Value* ADDCALL sass_make_qstring (const char* val);
|
22
|
+
attach_function :sass_make_qstring, [:string], :sass_value_ptr
|
23
|
+
|
24
|
+
# ADDAPI union Sass_Value* ADDCALL sass_make_color (double r, double g, double b, double a);
|
25
|
+
attach_function :sass_make_color, [:double, :double, :double, :double], :sass_value_ptr
|
26
|
+
|
27
|
+
# ADDAPI union Sass_Value* ADDCALL sass_make_error (const char* msg);
|
28
|
+
attach_function :sass_make_error, [:string], :sass_value_ptr
|
19
29
|
|
20
30
|
# ADDAPI enum Sass_Tag ADDCALL sass_value_get_tag (const union Sass_Value* v);
|
21
31
|
attach_function :sass_value_get_tag, [:sass_value_ptr], SassTag
|
@@ -24,6 +34,13 @@ module SassC
|
|
24
34
|
# ADDAPI const char* ADDCALL sass_string_get_value (const union Sass_Value* v);
|
25
35
|
attach_function :sass_string_get_value, [:sass_value_ptr], :string
|
26
36
|
|
37
|
+
# ADDAPI bool ADDCALL sass_string_is_quoted(const union Sass_Value* v);
|
38
|
+
attach_function :sass_string_is_quoted, [:sass_value_ptr], :bool
|
39
|
+
|
40
|
+
def self.string_get_type(native_value)
|
41
|
+
string_is_quoted(native_value) ? :string : :identifier
|
42
|
+
end
|
43
|
+
|
27
44
|
# ADDAPI double ADDCALL sass_color_get_r (const union Sass_Value* v);
|
28
45
|
# ADDAPI void ADDCALL sass_color_set_r (union Sass_Value* v, double r);
|
29
46
|
# ADDAPI double ADDCALL sass_color_get_g (const union Sass_Value* v);
|
data/lib/sassc/script.rb
CHANGED
@@ -13,11 +13,14 @@ module SassC
|
|
13
13
|
|
14
14
|
"#{function_name}(#{params})"
|
15
15
|
end
|
16
|
+
|
17
|
+
module Value
|
18
|
+
end
|
16
19
|
end
|
17
20
|
end
|
18
21
|
|
19
22
|
require_relative "script/functions"
|
20
|
-
require_relative "script/
|
23
|
+
require_relative "script/value_conversion"
|
21
24
|
|
22
25
|
module Sass
|
23
26
|
module Script
|
@@ -26,4 +29,11 @@ end
|
|
26
29
|
|
27
30
|
require 'sass/util'
|
28
31
|
require 'sass/script/value/base'
|
29
|
-
|
32
|
+
require 'sass/script/value/string'
|
33
|
+
require 'sass/script/value/color'
|
34
|
+
|
35
|
+
SassC::Script::String = Sass::Script::Value::String
|
36
|
+
SassC::Script::Value::String = Sass::Script::Value::String
|
37
|
+
|
38
|
+
SassC::Script::Color = Sass::Script::Value::Color
|
39
|
+
SassC::Script::Value::Color = Sass::Script::Value::Color
|
@@ -0,0 +1,42 @@
|
|
1
|
+
module SassC
|
2
|
+
module Script
|
3
|
+
module ValueConversion
|
4
|
+
def self.from_native(native_value, options)
|
5
|
+
case value_tag = Native.value_get_tag(native_value)
|
6
|
+
when :sass_null
|
7
|
+
# no-op
|
8
|
+
when :sass_string
|
9
|
+
value = Native.string_get_value(native_value)
|
10
|
+
type = Native.string_get_type(native_value)
|
11
|
+
argument = Script::String.new(value, type)
|
12
|
+
|
13
|
+
argument
|
14
|
+
when :sass_color
|
15
|
+
red, green, blue, alpha = Native.color_get_r(native_value), Native.color_get_g(native_value), Native.color_get_b(native_value), Native.color_get_a(native_value)
|
16
|
+
|
17
|
+
argument = Script::Color.new([red, green, blue, alpha])
|
18
|
+
argument.options = options
|
19
|
+
|
20
|
+
argument
|
21
|
+
else
|
22
|
+
raise UnsupportedValue.new("Sass argument of type #{value_tag} unsupported")
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
def self.to_native(value)
|
27
|
+
case value_name = value.class.name.split("::").last
|
28
|
+
when "String"
|
29
|
+
String.new(value).to_native
|
30
|
+
when "Color"
|
31
|
+
Color.new(value).to_native
|
32
|
+
else
|
33
|
+
raise UnsupportedValue.new("Sass return type #{value_name} unsupported")
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
require_relative "value_conversion/base"
|
41
|
+
require_relative "value_conversion/string"
|
42
|
+
require_relative "value_conversion/color"
|
@@ -0,0 +1,15 @@
|
|
1
|
+
module SassC
|
2
|
+
module Script
|
3
|
+
module ValueConversion
|
4
|
+
class String < Base
|
5
|
+
def to_native(opts = {})
|
6
|
+
if opts[:quote] == :none || @value.type == :identifier
|
7
|
+
Native::make_string(@value.to_s)
|
8
|
+
else
|
9
|
+
Native::make_qstring(@value.to_s)
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
data/lib/sassc/version.rb
CHANGED
data/test/functions_test.rb
CHANGED
@@ -14,60 +14,75 @@ module SassC
|
|
14
14
|
end
|
15
15
|
|
16
16
|
def test_functions_may_return_sass_string_type
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
div {
|
21
|
-
|
22
|
-
EOS
|
17
|
+
assert_sass <<-SCSS, <<-CSS
|
18
|
+
div { url: url(sass_return_path("foo.svg")); }
|
19
|
+
SCSS
|
20
|
+
div { url: url("foo.svg"); }
|
21
|
+
CSS
|
23
22
|
end
|
24
23
|
|
25
24
|
def test_functions_work_with_varying_quotes_and_string_types
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
25
|
+
assert_sass <<-SCSS, <<-CSS
|
26
|
+
div {
|
27
|
+
url: url(asset-path("foo.svg"));
|
28
|
+
url: url(image-path("foo.png"));
|
29
|
+
url: url(video-path("foo.mov"));
|
30
|
+
url: url(audio-path("foo.mp3"));
|
31
|
+
url: url(font-path("foo.woff"));
|
32
|
+
url: url(javascript-path('foo.js'));
|
33
|
+
url: url(javascript-path("foo.js"));
|
34
|
+
url: url(stylesheet-path("foo.css"));
|
35
|
+
}
|
36
|
+
SCSS
|
37
|
+
div {
|
38
|
+
url: url(asset-path("foo.svg"));
|
39
|
+
url: url(image-path("foo.png"));
|
40
|
+
url: url(video-path("foo.mov"));
|
41
|
+
url: url(audio-path("foo.mp3"));
|
42
|
+
url: url(font-path("foo.woff"));
|
43
|
+
url: url("/js/foo.js");
|
44
|
+
url: url("/js/foo.js");
|
45
|
+
url: url(/css/foo.css);
|
46
|
+
}
|
47
|
+
CSS
|
45
48
|
end
|
46
49
|
|
47
50
|
def test_function_with_no_return_value
|
48
|
-
|
51
|
+
assert_sass <<-SCSS, <<-CSS
|
52
|
+
div {url: url(no-return-path('foo.svg'));}
|
53
|
+
SCSS
|
54
|
+
div { url: url(); }
|
55
|
+
CSS
|
56
|
+
end
|
49
57
|
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
58
|
+
def test_function_that_returns_a_color
|
59
|
+
assert_sass <<-SCSS, <<-CSS
|
60
|
+
div { background: returns-a-color(); }
|
61
|
+
SCSS
|
62
|
+
div { background: black; }
|
63
|
+
CSS
|
54
64
|
end
|
55
65
|
|
56
66
|
def test_function_with_optional_arguments
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
67
|
+
assert_sass <<-SCSS, <<-EXPECTED_CSS
|
68
|
+
div {
|
69
|
+
url: optional_arguments('first');
|
70
|
+
url: optional_arguments('second', 'qux');
|
71
|
+
}
|
72
|
+
SCSS
|
73
|
+
div {
|
74
|
+
url: "first/bar";
|
75
|
+
url: "second/qux";
|
76
|
+
}
|
77
|
+
EXPECTED_CSS
|
63
78
|
end
|
64
79
|
|
65
80
|
def test_functions_may_accept_sass_color_type
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
81
|
+
assert_sass <<-SCSS, <<-EXPECTED_CSS
|
82
|
+
div { color: nice_color_argument(red); }
|
83
|
+
SCSS
|
84
|
+
div { color: "red"; }
|
85
|
+
EXPECTED_CSS
|
71
86
|
end
|
72
87
|
|
73
88
|
def test_function_with_unsupported_tag
|
@@ -77,36 +92,40 @@ div {
|
|
77
92
|
engine.render
|
78
93
|
end
|
79
94
|
|
80
|
-
|
81
|
-
|
95
|
+
assert_match /Sass argument of type sass_number unsupported/, exception.message
|
82
96
|
assert_equal "[SassC::FunctionsHandler] Sass argument of type sass_number unsupported", stderr_output
|
83
97
|
end
|
84
98
|
|
85
99
|
def test_function_with_error
|
86
100
|
engine = Engine.new("div {url: function_that_raises_errors();}")
|
101
|
+
|
87
102
|
exception = assert_raises(SassC::SyntaxError) do
|
88
103
|
engine.render
|
89
104
|
end
|
90
105
|
|
91
|
-
|
92
|
-
|
93
|
-
Backtrace:
|
94
|
-
\tstdin:1, in function `function_that_raises_errors`
|
95
|
-
\tstdin:1
|
96
|
-
on line 1 of stdin
|
97
|
-
>> div {url: function_that_raises_errors();}
|
98
|
-
----------^
|
99
|
-
", exception.message
|
100
|
-
|
106
|
+
assert_match /Error: error in C function function_that_raises_errors/, exception.message
|
107
|
+
assert_match /Intentional wrong thing happened somewhere inside the custom function/, exception.message
|
101
108
|
assert_equal "[SassC::FunctionsHandler] Intentional wrong thing happened somewhere inside the custom function", stderr_output
|
102
109
|
end
|
103
110
|
|
111
|
+
def test_function_that_returns_a_sass_value
|
112
|
+
assert_sass <<-SCSS, <<-CSS
|
113
|
+
div { background: returns-sass-value(); }
|
114
|
+
SCSS
|
115
|
+
div { background: black; }
|
116
|
+
CSS
|
117
|
+
end
|
118
|
+
|
104
119
|
private
|
105
120
|
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
121
|
+
def assert_sass(sass, expected_css)
|
122
|
+
engine = Engine.new(sass)
|
123
|
+
assert_equal expected_css.strip.gsub!(/\s+/, " "), # poor man's String#squish
|
124
|
+
engine.render.strip.gsub!(/\s+/, " ")
|
125
|
+
end
|
126
|
+
|
127
|
+
def stderr_output
|
128
|
+
$stderr.string.gsub("\u0000\n", '').chomp
|
110
129
|
end
|
111
130
|
|
112
131
|
module Script::Functions
|
@@ -119,14 +138,14 @@ div {
|
|
119
138
|
end
|
120
139
|
|
121
140
|
def sass_return_path(path)
|
122
|
-
|
141
|
+
Script::String.new("#{path.value}", :string)
|
123
142
|
end
|
124
143
|
|
125
144
|
def optional_arguments(path, optional = "bar")
|
126
|
-
|
145
|
+
Script::String.new("#{path.value}/#{optional}", :string)
|
127
146
|
end
|
128
147
|
|
129
|
-
def function_that_raises_errors
|
148
|
+
def function_that_raises_errors
|
130
149
|
raise StandardError, "Intentional wrong thing happened somewhere inside the custom function"
|
131
150
|
end
|
132
151
|
|
@@ -137,6 +156,14 @@ div {
|
|
137
156
|
return Script::String.new(color.to_s, :string)
|
138
157
|
end
|
139
158
|
|
159
|
+
def returns_a_color
|
160
|
+
return Script::Color.new(red: 0, green: 0, blue: 0)
|
161
|
+
end
|
162
|
+
|
163
|
+
def returns_sass_value
|
164
|
+
return Sass::Script::Value::Color.new(red: 0, green: 0, blue: 0)
|
165
|
+
end
|
166
|
+
|
140
167
|
module Compass
|
141
168
|
def stylesheet_path(path)
|
142
169
|
Script::String.new("/css/#{path.value}", :identifier)
|
@@ -144,9 +171,5 @@ div {
|
|
144
171
|
end
|
145
172
|
include Compass
|
146
173
|
end
|
147
|
-
|
148
|
-
def stderr_output
|
149
|
-
$stderr.string.gsub("\u0000\n", '')
|
150
|
-
end
|
151
174
|
end
|
152
175
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sassc
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.6.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ryan Boland
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-07-
|
11
|
+
date: 2015-07-29 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake
|
@@ -301,9 +301,11 @@ files:
|
|
301
301
|
- lib/sassc/native/string_list.rb
|
302
302
|
- lib/sassc/sass_2_scss.rb
|
303
303
|
- lib/sassc/script.rb
|
304
|
-
- lib/sassc/script/color.rb
|
305
304
|
- lib/sassc/script/functions.rb
|
306
|
-
- lib/sassc/script/
|
305
|
+
- lib/sassc/script/value_conversion.rb
|
306
|
+
- lib/sassc/script/value_conversion/base.rb
|
307
|
+
- lib/sassc/script/value_conversion/color.rb
|
308
|
+
- lib/sassc/script/value_conversion/string.rb
|
307
309
|
- lib/sassc/version.rb
|
308
310
|
- lib/tasks/libsass.rb
|
309
311
|
- sassc.gemspec
|
data/lib/sassc/script/color.rb
DELETED
data/lib/sassc/script/string.rb
DELETED
@@ -1,103 +0,0 @@
|
|
1
|
-
module SassC
|
2
|
-
module Script
|
3
|
-
class String
|
4
|
-
# The Ruby value of the string.
|
5
|
-
#
|
6
|
-
# @return [String]
|
7
|
-
attr_reader :value
|
8
|
-
|
9
|
-
# Whether this is a CSS string or a CSS identifier.
|
10
|
-
# The difference is that strings are written with double-quotes,
|
11
|
-
# while identifiers aren't.
|
12
|
-
#
|
13
|
-
# @return [Symbol] `:string` or `:identifier`
|
14
|
-
attr_reader :type
|
15
|
-
|
16
|
-
def self.value(contents)
|
17
|
-
contents.gsub("\\\n", "").gsub(/\\(?:([0-9a-fA-F]{1,6})\s?|(.))/) do
|
18
|
-
next $2 if $2
|
19
|
-
# Handle unicode escapes as per CSS Syntax Level 3 section 4.3.8.
|
20
|
-
code_point = $1.to_i(16)
|
21
|
-
if code_point == 0 || code_point > 0x10FFFF ||
|
22
|
-
(code_point >= 0xD800 && code_point <= 0xDFFF)
|
23
|
-
'�'
|
24
|
-
else
|
25
|
-
[code_point].pack("U")
|
26
|
-
end
|
27
|
-
end
|
28
|
-
end
|
29
|
-
|
30
|
-
def self.quote(contents, quote = nil)
|
31
|
-
# Short-circuit if there are no characters that need quoting.
|
32
|
-
unless contents =~ /[\n\\"']/
|
33
|
-
quote ||= '"'
|
34
|
-
return "#{quote}#{contents}#{quote}"
|
35
|
-
end
|
36
|
-
|
37
|
-
if quote.nil?
|
38
|
-
if contents.include?('"')
|
39
|
-
if contents.include?("'")
|
40
|
-
quote = '"'
|
41
|
-
else
|
42
|
-
quote = "'"
|
43
|
-
end
|
44
|
-
else
|
45
|
-
quote = '"'
|
46
|
-
end
|
47
|
-
end
|
48
|
-
|
49
|
-
# Replace single backslashes with multiples.
|
50
|
-
contents = contents.gsub("\\", "\\\\\\\\")
|
51
|
-
|
52
|
-
if quote == '"'
|
53
|
-
contents = contents.gsub('"', "\\\"")
|
54
|
-
else
|
55
|
-
contents = contents.gsub("'", "\\'")
|
56
|
-
end
|
57
|
-
|
58
|
-
contents = contents.gsub(/\n(?![a-fA-F0-9\s])/, "\\a").gsub("\n", "\\a ")
|
59
|
-
"#{quote}#{contents}#{quote}"
|
60
|
-
end
|
61
|
-
|
62
|
-
def self.type(contents)
|
63
|
-
unquote(contents) == contents ? :identifier : :string
|
64
|
-
end
|
65
|
-
|
66
|
-
def self.unquote(contents)
|
67
|
-
s = contents.dup
|
68
|
-
|
69
|
-
case contents[0, 1]
|
70
|
-
when "'", '"', '`'
|
71
|
-
s[0] = ''
|
72
|
-
end
|
73
|
-
|
74
|
-
case contents[-1, 1]
|
75
|
-
when "'", '"', '`'
|
76
|
-
s[-1] = ''
|
77
|
-
end
|
78
|
-
|
79
|
-
return s
|
80
|
-
end
|
81
|
-
|
82
|
-
# Creates a new string.
|
83
|
-
#
|
84
|
-
# @param value [String] See \{#value}
|
85
|
-
# @param type [Symbol] See \{#type}
|
86
|
-
def initialize(value, type = :identifier)
|
87
|
-
value.freeze unless value.nil? || value == true || value == false
|
88
|
-
@value = value
|
89
|
-
@type = type
|
90
|
-
end
|
91
|
-
|
92
|
-
def to_native
|
93
|
-
Native::make_string(to_s)
|
94
|
-
end
|
95
|
-
|
96
|
-
# @see Value#to_s
|
97
|
-
def to_s(opts = {})
|
98
|
-
return @value.gsub(/\n\s*/, ' ') if opts[:quote] == :none || @type == :identifier
|
99
|
-
SassC::Script::String.quote(value, opts[:quote])
|
100
|
-
end
|
101
|
-
end
|
102
|
-
end
|
103
|
-
end
|