sassc 1.5.1 → 1.6.0
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.
- 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
|