sass-embedded 1.58.0-x86_64-linux-musl
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 +7 -0
- data/LICENSE +20 -0
- data/README.md +42 -0
- data/ext/sass/embedded.rb +12 -0
- data/ext/sass/embedded_sass_pb.rb +349 -0
- data/ext/sass/sass_embedded/dart-sass-embedded +20 -0
- data/ext/sass/sass_embedded/src/LICENSE +1434 -0
- data/ext/sass/sass_embedded/src/dart +0 -0
- data/ext/sass/sass_embedded/src/dart-sass-embedded.snapshot +0 -0
- data/lib/sass/compile_error.rb +28 -0
- data/lib/sass/compile_result.rb +23 -0
- data/lib/sass/embedded/async.rb +58 -0
- data/lib/sass/embedded/channel.rb +61 -0
- data/lib/sass/embedded/compiler.rb +60 -0
- data/lib/sass/embedded/dispatcher.rb +98 -0
- data/lib/sass/embedded/host/function_registry.rb +89 -0
- data/lib/sass/embedded/host/importer_registry.rb +104 -0
- data/lib/sass/embedded/host/logger_registry.rb +50 -0
- data/lib/sass/embedded/host/value_protofier.rb +241 -0
- data/lib/sass/embedded/host.rb +141 -0
- data/lib/sass/embedded/protofier.rb +78 -0
- data/lib/sass/embedded/structifier.rb +39 -0
- data/lib/sass/embedded/varint.rb +35 -0
- data/lib/sass/embedded/version.rb +7 -0
- data/lib/sass/embedded.rb +251 -0
- data/lib/sass/logger/silent.rb +26 -0
- data/lib/sass/logger/source_location.rb +21 -0
- data/lib/sass/logger/source_span.rb +27 -0
- data/lib/sass/script_error.rb +10 -0
- data/lib/sass/value/argument_list.rb +37 -0
- data/lib/sass/value/boolean.rb +52 -0
- data/lib/sass/value/color.rb +253 -0
- data/lib/sass/value/function.rb +54 -0
- data/lib/sass/value/fuzzy_math.rb +80 -0
- data/lib/sass/value/list.rb +79 -0
- data/lib/sass/value/map.rb +71 -0
- data/lib/sass/value/null.rb +48 -0
- data/lib/sass/value/number/unit.rb +186 -0
- data/lib/sass/value/number.rb +365 -0
- data/lib/sass/value/string.rb +55 -0
- data/lib/sass/value.rb +128 -0
- data/lib/sass-embedded.rb +4 -0
- metadata +186 -0
@@ -0,0 +1,54 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Sass
|
4
|
+
module Value
|
5
|
+
# Sass's function type.
|
6
|
+
#
|
7
|
+
# @see https://sass-lang.com/documentation/js-api/classes/SassFunction
|
8
|
+
class Function
|
9
|
+
include Value
|
10
|
+
|
11
|
+
# @overload initialize(id)
|
12
|
+
# @param id [Numeric]
|
13
|
+
# @overload initialize(signature, callback)
|
14
|
+
# @param signature [::String]
|
15
|
+
# @param callback [Proc]
|
16
|
+
def initialize(id_or_signature, callback = nil)
|
17
|
+
if id_or_signature.is_a? Numeric
|
18
|
+
@id = id_or_signature
|
19
|
+
else
|
20
|
+
@signature = id_or_signature
|
21
|
+
@callback = callback
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
# @return [Integer, nil]
|
26
|
+
attr_reader :id
|
27
|
+
|
28
|
+
# @return [::String, nil]
|
29
|
+
attr_reader :signature
|
30
|
+
|
31
|
+
# @return [Proc, nil]
|
32
|
+
attr_reader :callback
|
33
|
+
|
34
|
+
# @return [::Boolean]
|
35
|
+
def ==(other)
|
36
|
+
if id.nil?
|
37
|
+
other.equal? self
|
38
|
+
else
|
39
|
+
other.is_a?(Sass::Value::Function) && other.id == id
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
# @return [Integer]
|
44
|
+
def hash
|
45
|
+
id.nil? ? signature.hash : id.hash
|
46
|
+
end
|
47
|
+
|
48
|
+
# @return [Function]
|
49
|
+
def assert_function(_name = nil)
|
50
|
+
self
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
@@ -0,0 +1,80 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Sass
|
4
|
+
module Value
|
5
|
+
# Sass's {FuzzyMath} module.
|
6
|
+
module FuzzyMath
|
7
|
+
PRECISION = 10
|
8
|
+
|
9
|
+
EPSILON = 10.pow(-PRECISION - 1)
|
10
|
+
|
11
|
+
INVERSE_EPSILON = 1 / EPSILON
|
12
|
+
|
13
|
+
module_function
|
14
|
+
|
15
|
+
def equals(number1, number2)
|
16
|
+
(number1 - number2).abs < EPSILON
|
17
|
+
end
|
18
|
+
|
19
|
+
def less_than(number1, number2)
|
20
|
+
number1 < number2 && !equals(number1, number2)
|
21
|
+
end
|
22
|
+
|
23
|
+
def less_than_or_equals(number1, number2)
|
24
|
+
number1 < number2 || equals(number1, number2)
|
25
|
+
end
|
26
|
+
|
27
|
+
def greater_than(number1, number2)
|
28
|
+
number1 > number2 && !equals(number1, number2)
|
29
|
+
end
|
30
|
+
|
31
|
+
def greater_than_or_equals(number1, number2)
|
32
|
+
number1 > number2 || equals(number1, number2)
|
33
|
+
end
|
34
|
+
|
35
|
+
def integer?(number)
|
36
|
+
return false unless number.finite?
|
37
|
+
return true if number.integer?
|
38
|
+
|
39
|
+
equals((number - 0.5).abs % 1, 0.5)
|
40
|
+
end
|
41
|
+
|
42
|
+
def to_i(number)
|
43
|
+
integer?(number) ? number.round : nil
|
44
|
+
end
|
45
|
+
|
46
|
+
def round(number)
|
47
|
+
if number.positive?
|
48
|
+
less_than(number % 1, 0.5) ? number.floor : number.ceil
|
49
|
+
else
|
50
|
+
less_than_or_equals(number % 1, 0.5) ? number.floor : number.ceil
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
def between(number, min, max)
|
55
|
+
return min if equals(number, min)
|
56
|
+
return max if equals(number, max)
|
57
|
+
return number if number > min && number < max
|
58
|
+
|
59
|
+
nil
|
60
|
+
end
|
61
|
+
|
62
|
+
def assert_between(number, min, max, name)
|
63
|
+
result = between(number, min, max)
|
64
|
+
return result unless result.nil?
|
65
|
+
|
66
|
+
raise Sass::ScriptError.new("#{number} must be between #{min} and #{max}.", name)
|
67
|
+
end
|
68
|
+
|
69
|
+
def hash(number)
|
70
|
+
@hash ||= if number.finite?
|
71
|
+
(number * INVERSE_EPSILON).round.hash
|
72
|
+
else
|
73
|
+
number.hash
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
private_constant :FuzzyMath
|
79
|
+
end
|
80
|
+
end
|
@@ -0,0 +1,79 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Sass
|
4
|
+
module Value
|
5
|
+
# Sass's list type.
|
6
|
+
#
|
7
|
+
# @see https://sass-lang.com/documentation/js-api/classes/SassList
|
8
|
+
class List
|
9
|
+
include Value
|
10
|
+
|
11
|
+
# @param contents [Array<Value>]
|
12
|
+
# @param separator [::String]
|
13
|
+
# @param bracketed [::Boolean]
|
14
|
+
def initialize(contents = [], separator: ',', bracketed: false)
|
15
|
+
if separator.nil? && contents.length > 1
|
16
|
+
raise Sass::ScriptError, 'A list with more than one element must have an explicit separator'
|
17
|
+
end
|
18
|
+
|
19
|
+
@contents = contents.freeze
|
20
|
+
@separator = separator.freeze
|
21
|
+
@bracketed = bracketed.freeze
|
22
|
+
end
|
23
|
+
|
24
|
+
# @return [Array<Value>]
|
25
|
+
attr_reader :contents
|
26
|
+
|
27
|
+
# @return [::String, nil]
|
28
|
+
attr_reader :separator
|
29
|
+
|
30
|
+
# @return [::Boolean]
|
31
|
+
def bracketed?
|
32
|
+
@bracketed
|
33
|
+
end
|
34
|
+
|
35
|
+
# @return [::Boolean]
|
36
|
+
def ==(other)
|
37
|
+
(other.is_a?(Sass::Value::List) &&
|
38
|
+
other.contents == contents &&
|
39
|
+
other.separator == separator &&
|
40
|
+
other.bracketed? == bracketed?) ||
|
41
|
+
(to_a.empty? && other.is_a?(Sass::Value::Map) && other.to_a.empty?)
|
42
|
+
end
|
43
|
+
|
44
|
+
# @param index [Numeric]
|
45
|
+
# @return [Value]
|
46
|
+
def at(index)
|
47
|
+
index = index.floor
|
48
|
+
index = to_a.length + index if index.negative?
|
49
|
+
return nil if index.negative? || index >= to_a.length
|
50
|
+
|
51
|
+
to_a[index]
|
52
|
+
end
|
53
|
+
|
54
|
+
# @return [Integer]
|
55
|
+
def hash
|
56
|
+
@hash ||= contents.hash
|
57
|
+
end
|
58
|
+
|
59
|
+
alias to_a contents
|
60
|
+
|
61
|
+
# @return [Map, nil]
|
62
|
+
def to_map
|
63
|
+
to_a.empty? ? Sass::Value::Map.new({}) : nil
|
64
|
+
end
|
65
|
+
|
66
|
+
# @return [Map]
|
67
|
+
# @raise [ScriptError]
|
68
|
+
def assert_map(name = nil)
|
69
|
+
to_a.empty? ? Sass::Value::Map.new({}) : super.assert_map(name)
|
70
|
+
end
|
71
|
+
|
72
|
+
private
|
73
|
+
|
74
|
+
def to_a_length
|
75
|
+
to_a.length
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
@@ -0,0 +1,71 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Sass
|
4
|
+
module Value
|
5
|
+
# Sass's map type.
|
6
|
+
#
|
7
|
+
# @see https://sass-lang.com/documentation/js-api/classes/SassMap
|
8
|
+
class Map
|
9
|
+
include Value
|
10
|
+
|
11
|
+
# @param contents [Hash<Value, Value>]
|
12
|
+
def initialize(contents = {})
|
13
|
+
@contents = contents.freeze
|
14
|
+
end
|
15
|
+
|
16
|
+
# @return [Hash<Value, Value>]
|
17
|
+
attr_reader :contents
|
18
|
+
|
19
|
+
# @return [::String, nil]
|
20
|
+
def separator
|
21
|
+
contents.empty? ? nil : ','
|
22
|
+
end
|
23
|
+
|
24
|
+
# @return [::Boolean]
|
25
|
+
def ==(other)
|
26
|
+
(other.is_a?(Sass::Value::Map) && other.contents == contents) ||
|
27
|
+
(contents.empty? && other.is_a?(Sass::Value::List) && other.to_a.empty?)
|
28
|
+
end
|
29
|
+
|
30
|
+
# @param index [Numeric, Value]
|
31
|
+
# @return [List<(Value, Value)>, Value]
|
32
|
+
def at(index)
|
33
|
+
if index.is_a? Numeric
|
34
|
+
index = index.floor
|
35
|
+
index = to_a.length + index if index.negative?
|
36
|
+
return nil if index.negative? || index >= to_a.length
|
37
|
+
|
38
|
+
to_a[index]
|
39
|
+
else
|
40
|
+
contents[index]
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
# @return [Integer]
|
45
|
+
def hash
|
46
|
+
@hash ||= contents.hash
|
47
|
+
end
|
48
|
+
|
49
|
+
# @return [Array<List<(Value, Value)>>]
|
50
|
+
def to_a
|
51
|
+
contents.to_a.map { |entry| Sass::Value::List.new(entry, separator: ' ') }
|
52
|
+
end
|
53
|
+
|
54
|
+
# @return [Map]
|
55
|
+
def to_map
|
56
|
+
self
|
57
|
+
end
|
58
|
+
|
59
|
+
# @return [Map]
|
60
|
+
def assert_map(_name = nil)
|
61
|
+
self
|
62
|
+
end
|
63
|
+
|
64
|
+
private
|
65
|
+
|
66
|
+
def to_a_length
|
67
|
+
contents.length
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Sass
|
4
|
+
module Value
|
5
|
+
# Sass's null type.
|
6
|
+
#
|
7
|
+
# @see https://sass-lang.com/documentation/js-api/modules#sassNull
|
8
|
+
class Null
|
9
|
+
include Value
|
10
|
+
|
11
|
+
def initialize
|
12
|
+
@value = nil
|
13
|
+
end
|
14
|
+
|
15
|
+
# @return [nil]
|
16
|
+
attr_reader :value
|
17
|
+
|
18
|
+
# @return [Boolean]
|
19
|
+
def !
|
20
|
+
Boolean::TRUE
|
21
|
+
end
|
22
|
+
|
23
|
+
# @return [::Boolean]
|
24
|
+
def ==(other)
|
25
|
+
other.is_a?(Sass::Value::Null)
|
26
|
+
end
|
27
|
+
|
28
|
+
# @return [Integer]
|
29
|
+
def hash
|
30
|
+
@hash ||= value.hash
|
31
|
+
end
|
32
|
+
|
33
|
+
# @return [::Boolean]
|
34
|
+
def to_bool
|
35
|
+
false
|
36
|
+
end
|
37
|
+
|
38
|
+
alias to_nil value
|
39
|
+
|
40
|
+
# Sass's null value.
|
41
|
+
NULL = Null.new
|
42
|
+
|
43
|
+
def self.new
|
44
|
+
NULL
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
@@ -0,0 +1,186 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Sass
|
4
|
+
module Value
|
5
|
+
class Number
|
6
|
+
# The {Unit} module.
|
7
|
+
module Unit
|
8
|
+
CONVERSIONS = {
|
9
|
+
# Length
|
10
|
+
'in' => {
|
11
|
+
'in' => Rational(1),
|
12
|
+
'cm' => Rational(1, 2.54),
|
13
|
+
'pc' => Rational(1, 6),
|
14
|
+
'mm' => Rational(1, 25.4),
|
15
|
+
'q' => Rational(1, 101.6),
|
16
|
+
'pt' => Rational(1, 72),
|
17
|
+
'px' => Rational(1, 96)
|
18
|
+
},
|
19
|
+
'cm' => {
|
20
|
+
'in' => Rational(2.54),
|
21
|
+
'cm' => Rational(1),
|
22
|
+
'pc' => Rational(2.54, 6),
|
23
|
+
'mm' => Rational(1, 10),
|
24
|
+
'q' => Rational(1, 40),
|
25
|
+
'pt' => Rational(2.54, 72),
|
26
|
+
'px' => Rational(2.54, 96)
|
27
|
+
},
|
28
|
+
'pc' => {
|
29
|
+
'in' => Rational(6),
|
30
|
+
'cm' => Rational(6, 2.54),
|
31
|
+
'pc' => Rational(1),
|
32
|
+
'mm' => Rational(6, 25.4),
|
33
|
+
'q' => Rational(6, 101.6),
|
34
|
+
'pt' => Rational(1, 12),
|
35
|
+
'px' => Rational(1, 16)
|
36
|
+
},
|
37
|
+
'mm' => {
|
38
|
+
'in' => Rational(25.4),
|
39
|
+
'cm' => Rational(10),
|
40
|
+
'pc' => Rational(25.4, 6),
|
41
|
+
'mm' => Rational(1),
|
42
|
+
'q' => Rational(1, 4),
|
43
|
+
'pt' => Rational(25.4, 72),
|
44
|
+
'px' => Rational(25.4, 96)
|
45
|
+
},
|
46
|
+
'q' => {
|
47
|
+
'in' => Rational(101.6),
|
48
|
+
'cm' => Rational(40),
|
49
|
+
'pc' => Rational(101.6, 6),
|
50
|
+
'mm' => Rational(4),
|
51
|
+
'q' => Rational(1),
|
52
|
+
'pt' => Rational(101.6, 72),
|
53
|
+
'px' => Rational(101.6, 96)
|
54
|
+
},
|
55
|
+
'pt' => {
|
56
|
+
'in' => Rational(72),
|
57
|
+
'cm' => Rational(72, 2.54),
|
58
|
+
'pc' => Rational(12),
|
59
|
+
'mm' => Rational(72, 25.4),
|
60
|
+
'q' => Rational(72, 101.6),
|
61
|
+
'pt' => Rational(1),
|
62
|
+
'px' => Rational(3, 4)
|
63
|
+
},
|
64
|
+
'px' => {
|
65
|
+
'in' => Rational(96),
|
66
|
+
'cm' => Rational(96, 2.54),
|
67
|
+
'pc' => Rational(16),
|
68
|
+
'mm' => Rational(96, 25.4),
|
69
|
+
'q' => Rational(96, 101.6),
|
70
|
+
'pt' => Rational(4, 3),
|
71
|
+
'px' => Rational(1)
|
72
|
+
},
|
73
|
+
|
74
|
+
# Rotation
|
75
|
+
'deg' => {
|
76
|
+
'deg' => Rational(1),
|
77
|
+
'grad' => Rational(9, 10),
|
78
|
+
'rad' => Rational(180, Math::PI),
|
79
|
+
'turn' => Rational(360)
|
80
|
+
},
|
81
|
+
'grad' => {
|
82
|
+
'deg' => Rational(10, 9),
|
83
|
+
'grad' => Rational(1),
|
84
|
+
'rad' => Rational(200, Math::PI),
|
85
|
+
'turn' => Rational(400)
|
86
|
+
},
|
87
|
+
'rad' => {
|
88
|
+
'deg' => Rational(Math::PI, 180),
|
89
|
+
'grad' => Rational(Math::PI, 200),
|
90
|
+
'rad' => Rational(1),
|
91
|
+
'turn' => Rational(Math::PI * 2)
|
92
|
+
},
|
93
|
+
'turn' => {
|
94
|
+
'deg' => Rational(1, 360),
|
95
|
+
'grad' => Rational(1, 400),
|
96
|
+
'rad' => Rational(1, Math::PI * 2),
|
97
|
+
'turn' => Rational(1)
|
98
|
+
},
|
99
|
+
|
100
|
+
# Time
|
101
|
+
's' => {
|
102
|
+
's' => Rational(1),
|
103
|
+
'ms' => Rational(1, 1000)
|
104
|
+
},
|
105
|
+
'ms' => {
|
106
|
+
's' => Rational(1000),
|
107
|
+
'ms' => Rational(1)
|
108
|
+
},
|
109
|
+
|
110
|
+
# Frequency
|
111
|
+
'Hz' => {
|
112
|
+
'Hz' => Rational(1),
|
113
|
+
'kHz' => Rational(1000)
|
114
|
+
},
|
115
|
+
'kHz' => {
|
116
|
+
'Hz' => Rational(1, 1000),
|
117
|
+
'kHz' => Rational(1)
|
118
|
+
},
|
119
|
+
|
120
|
+
# Pixel density
|
121
|
+
'dpi' => {
|
122
|
+
'dpi' => Rational(1),
|
123
|
+
'dpcm' => Rational(2.54),
|
124
|
+
'dppx' => Rational(96)
|
125
|
+
},
|
126
|
+
'dpcm' => {
|
127
|
+
'dpi' => Rational(1, 2.54),
|
128
|
+
'dpcm' => Rational(1),
|
129
|
+
'dppx' => Rational(96, 2.54)
|
130
|
+
},
|
131
|
+
'dppx' => {
|
132
|
+
'dpi' => Rational(1, 96),
|
133
|
+
'dpcm' => Rational(2.54, 96),
|
134
|
+
'dppx' => Rational(1)
|
135
|
+
}
|
136
|
+
}.freeze
|
137
|
+
|
138
|
+
UNITS_BY_TYPE = {
|
139
|
+
time: %w[s ms],
|
140
|
+
frequency: %w[Hz kHz],
|
141
|
+
'pixel density': %w[dpi dpcm dppx]
|
142
|
+
}.freeze
|
143
|
+
|
144
|
+
TYPES_BY_UNIT = UNITS_BY_TYPE.invert
|
145
|
+
.to_a
|
146
|
+
.flat_map { |pair| pair[0].map { |key| [key, pair[1]] } }
|
147
|
+
.to_h
|
148
|
+
|
149
|
+
module_function
|
150
|
+
|
151
|
+
def conversion_factor(unit1, unit2)
|
152
|
+
return 1 if unit1 == unit2
|
153
|
+
|
154
|
+
CONVERSIONS.dig(unit1, unit2)
|
155
|
+
end
|
156
|
+
|
157
|
+
def canonicalize_units(units)
|
158
|
+
return units if units.empty?
|
159
|
+
|
160
|
+
if units.length == 1
|
161
|
+
type = TYPES_BY_UNIT[units.first]
|
162
|
+
return type.nil? ? units : [UNITS_BY_TYPE[type].first]
|
163
|
+
end
|
164
|
+
|
165
|
+
units.map do |unit|
|
166
|
+
type = TYPES_BY_UNIT[unit]
|
167
|
+
type.nil? ? units : [UNITS_BY_TYPE[type].first]
|
168
|
+
end.sort
|
169
|
+
end
|
170
|
+
|
171
|
+
def canonical_multiplier(units)
|
172
|
+
units.reduce(1) do |multiplier, unit|
|
173
|
+
multiplier * canonical_multiplier_for_unit(unit)
|
174
|
+
end
|
175
|
+
end
|
176
|
+
|
177
|
+
def canonical_multiplier_for_unit(unit)
|
178
|
+
inner_map = CONVERSIONS[unit]
|
179
|
+
inner_map.nil? ? 1 : 1 / inner_map.values.first
|
180
|
+
end
|
181
|
+
end
|
182
|
+
|
183
|
+
private_constant :Unit
|
184
|
+
end
|
185
|
+
end
|
186
|
+
end
|