diff --git a/CHANGELOG.md b/CHANGELOG.md index de61d770a..9bc63994e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,8 @@ * `hypot()`: given *n* numbers, outputs the length of the *n*-dimensional vector that has components equal to each of the inputs. +* Add the variables `$pi` and `$e` to the built-in "sass:math" module. + ## 1.24.4 ### JavaScript API diff --git a/lib/src/functions/math.dart b/lib/src/functions/math.dart index e0a106183..84d81ff9c 100644 --- a/lib/src/functions/math.dart +++ b/lib/src/functions/math.dart @@ -25,7 +25,10 @@ final global = UnmodifiableListView([ final module = BuiltInModule("math", functions: [ _abs, _ceil, _clamp, _compatible, _floor, _hypot, _isUnitless, _max, _min, // _percentage, _randomFunction, _round, _unit, -]); +], variables: { + "e": SassNumber(math.e), + "pi": SassNumber(math.pi), +}); /// Returns a [Callable] named [name] that transforms a number's value /// using [transform] and preserves its units. diff --git a/lib/src/module/built_in.dart b/lib/src/module/built_in.dart index 63d098687..8e4abf413 100644 --- a/lib/src/module/built_in.dart +++ b/lib/src/module/built_in.dart @@ -17,19 +17,22 @@ class BuiltInModule implements Module { final Uri url; final Map functions; final Map mixins; + final Map variables; List> get upstream => const []; - Map get variables => const {}; Map get variableNodes => const {}; Extender get extender => Extender.empty; CssStylesheet get css => CssStylesheet.empty(url: url); bool get transitivelyContainsCss => false; bool get transitivelyContainsExtensions => false; - BuiltInModule(String name, {Iterable functions, Iterable mixins}) + BuiltInModule(String name, + {Iterable functions, Iterable mixins, Map variables}) : url = Uri(scheme: "sass", path: name), functions = _callableMap(functions), - mixins = _callableMap(mixins); + mixins = _callableMap(mixins), + variables = + variables == null ? const {} : UnmodifiableMapView(variables); /// Returns a map from [callables]' names to their values. static Map _callableMap( @@ -40,7 +43,10 @@ class BuiltInModule implements Module { {for (var callable in callables) callable.name: callable})); void setVariable(String name, Value value, AstNode nodeWithSpan) { - throw SassScriptException("Undefined variable."); + if (!variables.containsKey(name)) { + throw SassScriptException("Undefined variable."); + } + throw SassScriptException("Cannot modify built-in variable."); } Module cloneCss() => this;