@@ -23,8 +23,8 @@ final global = UnmodifiableListView([
23
23
24
24
/// The Sass math module.
25
25
final module = BuiltInModule ("math" , functions: [
26
- _abs, _ceil, _clamp, _compatible, _floor, _hypot, _isUnitless, _max, _min , //
27
- _percentage, _randomFunction, _round, _unit,
26
+ _abs, _ceil, _clamp, _compatible, _floor, _hypot, _isUnitless, _log, _max , //
27
+ _min, _pow, _percentage, _randomFunction, _round, _sqrt , _unit,
28
28
], variables: {
29
29
"e" : SassNumber (math.e),
30
30
"pi" : SassNumber (math.pi),
@@ -133,6 +133,86 @@ final _hypot = BuiltInCallable("hypot", r"$numbers...", (arguments) {
133
133
numeratorUnits: numeratorUnits, denominatorUnits: denominatorUnits);
134
134
});
135
135
136
+ ///
137
+ /// Exponential functions
138
+ ///
139
+
140
+ final _log = BuiltInCallable ("log" , r"$number, $base: null" , (arguments) {
141
+ var number = arguments[0 ].assertNumber ("number" );
142
+ if (number.hasUnits) {
143
+ throw SassScriptException ("\$ number: Expected $number to have no units." );
144
+ }
145
+
146
+ var numberValue = fuzzyEquals (number.value, 0 ) ? 0 : number.value;
147
+
148
+ if (arguments[1 ] == sassNull) return SassNumber (math.log (numberValue));
149
+
150
+ var base = arguments[1 ].assertNumber ("base" );
151
+ if (base .hasUnits) {
152
+ throw SassScriptException ("\$ base: Expected $base to have no units." );
153
+ }
154
+
155
+ var baseValue = fuzzyEquals (base .value, 0 ) || fuzzyEquals (base .value, 1 )
156
+ ? fuzzyRound (base .value)
157
+ : base .value;
158
+
159
+ return SassNumber (math.log (numberValue) / math.log (baseValue));
160
+ });
161
+
162
+ final _pow = BuiltInCallable ("pow" , r"$base, $exponent" , (arguments) {
163
+ var base = arguments[0 ].assertNumber ("base" );
164
+ var exponent = arguments[1 ].assertNumber ("exponent" );
165
+
166
+ if (base .hasUnits) {
167
+ throw SassScriptException ("\$ base: Expected $base to have no units." );
168
+ } else if (exponent.hasUnits) {
169
+ throw SassScriptException (
170
+ "\$ exponent: Expected $exponent to have no units." );
171
+ }
172
+
173
+ var baseValue = base .value;
174
+ var exponentValue = exponent.value;
175
+
176
+ if (fuzzyEquals (baseValue.abs (), 1 ) && exponentValue.isInfinite) {
177
+ return SassNumber (double .nan);
178
+ }
179
+
180
+ // Exponentiating certain real numbers leads to special behaviors. Ensure that
181
+ // these behaviors are consistent for numbers within the precision limit.
182
+ if (fuzzyEquals (exponentValue, 0 )) {
183
+ exponentValue = 0 ;
184
+ } else if (fuzzyEquals (baseValue, 0 )) {
185
+ baseValue = baseValue.isNegative ? - 0.0 : 0 ;
186
+ if (exponentValue.isFinite &&
187
+ fuzzyIsInt (exponentValue) &&
188
+ fuzzyAsInt (exponentValue) % 2 == 1 ) {
189
+ exponentValue = fuzzyRound (exponentValue);
190
+ }
191
+ } else if (baseValue.isFinite &&
192
+ fuzzyLessThan (baseValue, 0 ) &&
193
+ exponentValue.isFinite &&
194
+ fuzzyIsInt (exponentValue)) {
195
+ exponentValue = fuzzyRound (exponentValue);
196
+ } else if (baseValue.isInfinite &&
197
+ fuzzyLessThan (baseValue, 0 ) &&
198
+ exponentValue.isFinite &&
199
+ fuzzyIsInt (exponentValue) &&
200
+ fuzzyAsInt (exponentValue) % 2 == 1 ) {
201
+ exponentValue = fuzzyRound (exponentValue);
202
+ }
203
+
204
+ return SassNumber (math.pow (baseValue, exponentValue));
205
+ });
206
+
207
+ final _sqrt = BuiltInCallable ("sqrt" , r"$number" , (arguments) {
208
+ var number = arguments[0 ].assertNumber ("number" );
209
+ if (number.hasUnits) {
210
+ throw SassScriptException ("\$ number: Expected $number to have no units." );
211
+ }
212
+
213
+ return SassNumber (math.sqrt (number.value));
214
+ });
215
+
136
216
///
137
217
/// Unit functions
138
218
///
0 commit comments