@omnisass/library 0.2.0 → 0.3.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.
- package/CHANGELOG.md +101 -3
- package/README.md +94 -0
- package/modules/utilities/converters/_convert-camel2kebab.scss +5 -4
- package/modules/utilities/converters/_convert-em2px.scss +5 -3
- package/modules/utilities/converters/_convert-hex2rgb.scss +4 -0
- package/modules/utilities/converters/_convert-hex2rgba.scss +5 -0
- package/modules/utilities/converters/_convert-kebab2camel.scss +5 -4
- package/modules/utilities/converters/_convert-kebab2snake.scss +4 -4
- package/modules/utilities/converters/_convert-px2em.scss +5 -4
- package/modules/utilities/converters/_convert-px2rem.scss +5 -4
- package/modules/utilities/converters/_convert-rem2px.scss +5 -3
- package/modules/utilities/converters/_convert-snake2kebab.scss +4 -4
- package/modules/utilities/getters/color/_get-color-brightness.scss +4 -0
- package/modules/utilities/getters/color/_get-color-darkest.scss +5 -1
- package/modules/utilities/getters/list/_get-list-item-end.scss +4 -2
- package/modules/utilities/getters/list/_get-list-item-start.scss +4 -2
- package/modules/utilities/getters/list/_get-list-item.scss +6 -4
- package/modules/utilities/getters/number/_get-number-from-percent.scss +6 -2
- package/modules/utilities/getters/number/_get-number-height-by-ratio.scss +5 -0
- package/modules/utilities/getters/number/_get-number-max.scss +4 -0
- package/modules/utilities/getters/number/_get-number-min.scss +4 -0
- package/modules/utilities/getters/number/_get-number-percentage-of.scss +6 -1
- package/modules/utilities/getters/number/_get-number-unit.scss +4 -2
- package/modules/utilities/getters/number/_get-number-width-by-ratio.scss +5 -0
- package/modules/utilities/helpers/color/_color-blend-steps.scss +6 -0
- package/modules/utilities/helpers/color/_color-blend.scss +6 -0
- package/modules/utilities/helpers/color/_color-hue-shift.scss +5 -0
- package/modules/utilities/helpers/color/_color-scale.scss +5 -0
- package/modules/utilities/helpers/color/_color-shade.scss +5 -0
- package/modules/utilities/helpers/color/_color-tint.scss +5 -0
- package/modules/utilities/helpers/color/_color-triad.scss +4 -1
- package/modules/utilities/helpers/list/_list-dedupe.scss +4 -0
- package/modules/utilities/helpers/list/_list-insert-at.scss +5 -0
- package/modules/utilities/helpers/list/_list-merge.scss +54 -8
- package/modules/utilities/helpers/list/_list-remove-at.scss +5 -0
- package/modules/utilities/helpers/list/_list-sum-numbers-safe.scss +3 -0
- package/modules/utilities/helpers/list/_list-sum-numbers.scss +3 -0
- package/modules/utilities/helpers/misc/_url-encode.scss +5 -6
- package/modules/utilities/helpers/number/_number-ceil-to.scss +56 -4
- package/modules/utilities/helpers/number/_number-clamp-max.scss +65 -10
- package/modules/utilities/helpers/number/_number-clamp-min.scss +65 -10
- package/modules/utilities/helpers/number/_number-clamp.scss +88 -12
- package/modules/utilities/helpers/number/_number-denormalize.scss +87 -9
- package/modules/utilities/helpers/number/_number-fibonacci.scss +62 -9
- package/modules/utilities/helpers/number/_number-floor-to.scss +57 -3
- package/modules/utilities/helpers/number/_number-format-with-separator.scss +99 -16
- package/modules/utilities/helpers/number/_number-normalize.scss +88 -10
- package/modules/utilities/helpers/number/_number-random-between-int.scss +74 -13
- package/modules/utilities/helpers/number/_number-random-between.scss +76 -15
- package/modules/utilities/helpers/number/_number-range.scss +105 -12
- package/modules/utilities/helpers/number/_number-round-to-nearest.scss +58 -1
- package/modules/utilities/helpers/number/_number-round-to.scss +65 -2
- package/modules/utilities/helpers/number/_number-strip-unit.scss +43 -9
- package/modules/utilities/helpers/string/_string-capitalize.scss +46 -5
- package/modules/utilities/helpers/string/_string-replace.scss +82 -4
- package/modules/utilities/helpers/string/_string-trim-end.scss +49 -6
- package/modules/utilities/helpers/string/_string-trim-start.scss +49 -6
- package/modules/utilities/helpers/string/_string-trim.scss +56 -11
- package/modules/utilities/loggers/_log-invalid-type.scss +1 -1
- package/modules/utilities/loggers/_log-invalid-value.scss +1 -1
- package/modules/utilities/validators/color/_is-color-light.scss +61 -4
- package/modules/utilities/validators/color/_is-color-list.scss +41 -9
- package/modules/utilities/validators/list/_is-list-contained.scss +42 -3
- package/modules/utilities/validators/misc/_is-time.scss +29 -0
- package/modules/utilities/validators/number/_is-int-even.scss +50 -8
- package/modules/utilities/validators/number/_is-int-odd.scss +51 -9
- package/modules/utilities/validators/number/_is-int.scss +71 -12
- package/modules/utilities/validators/number/_is-number-has-unit.scss +55 -13
- package/modules/utilities/validators/number/_is-number-negative.scss +53 -11
- package/modules/utilities/validators/number/_is-number-positive.scss +52 -10
- package/modules/utilities/validators/number/_is-number-unitless.scss +53 -12
- package/modules/utilities/validators/number/_is-number-zero.scss +54 -10
- package/modules/utilities/validators/string/_is-string-contained.scss +59 -4
- package/modules/utilities/validators/string/_is-string-empty.scss +48 -8
- package/modules/utilities/validators/string/_is-string-ending-with.scss +64 -5
- package/modules/utilities/validators/string/_is-string-starting-with.scss +60 -8
- package/package.json +1 -1
- package/package.scss +9 -8
- package/test.md +0 -168
- package/test.scss +0 -405
- package/test.sh +0 -149
|
@@ -1,9 +1,12 @@
|
|
|
1
|
+
@use '../../loggers/log-invalid-type' as *;
|
|
2
|
+
@use '../../validators/type-of/is-number' as *;
|
|
3
|
+
|
|
1
4
|
/// Денормализует число из единичного интервала [0, 1] в
|
|
2
5
|
/// исходный диапазон.
|
|
3
6
|
///
|
|
4
7
|
/// Функция выполняет обратное линейное преобразование числа
|
|
5
8
|
/// из нормализованного диапазона `[0, 1]` обратно в исходный
|
|
6
|
-
/// диапазон `[$min, $max]`. Это операция, обратная функции
|
|
9
|
+
/// диапазон `[$value-min, $value-max]`. Это операция, обратная функции
|
|
7
10
|
/// `number-normalize()`, и восстанавливает исходное значение
|
|
8
11
|
/// после нормализации.
|
|
9
12
|
///
|
|
@@ -28,8 +31,8 @@
|
|
|
28
31
|
///
|
|
29
32
|
/// > Эта функция является точной обратной операцией к
|
|
30
33
|
/// > `number-normalize()`. Для любого значения `x` в диапазоне
|
|
31
|
-
/// > `[$min, $max]` выполняется тождество:
|
|
32
|
-
/// > `number-denormalize(number-normalize(x, $min, $max), $min, $max) == x`.
|
|
34
|
+
/// > `[$value-min, $value-max]` выполняется тождество:
|
|
35
|
+
/// > `number-denormalize(number-normalize(x, $value-min, $value-max), $value-min, $value-max) == x`.
|
|
33
36
|
/// > Функция также поддерживает экстраполяцию для значений
|
|
34
37
|
/// > вне диапазона [0, 1], что полезно для выхода за пределы
|
|
35
38
|
/// > исходного диапазона или для работы с выбросами.
|
|
@@ -155,18 +158,93 @@
|
|
|
155
158
|
/// диапазоне [0, 1]. Обычно полученное с помощью
|
|
156
159
|
/// `number-normalize()`. Может быть любым числом, включая
|
|
157
160
|
/// значения вне [0, 1] для экстраполяции.
|
|
158
|
-
/// @param {Number} $min - Нижняя граница целевого диапазона.
|
|
161
|
+
/// @param {Number} $value-min - Нижняя граница целевого диапазона.
|
|
159
162
|
/// Значение, соответствующее `0` в нормализованном диапазоне.
|
|
160
|
-
/// @param {Number} $max - Верхняя граница целевого диапазона.
|
|
163
|
+
/// @param {Number} $value-max - Верхняя граница целевого диапазона.
|
|
161
164
|
/// Значение, соответствующее `1` в нормализованном диапазоне.
|
|
162
165
|
/// @return {Number} - Денормализованное значение в целевом
|
|
163
166
|
/// диапазоне. Восстанавливает исходные единицы измерения
|
|
164
|
-
/// из `$min` и `$max`. Для `$value` в [0, 1] результат
|
|
165
|
-
/// будет в диапазоне `[$min, $max]`. Для значений вне [0, 1]
|
|
167
|
+
/// из `$value-min` и `$value-max`. Для `$value` в [0, 1] результат
|
|
168
|
+
/// будет в диапазоне `[$value-min, $value-max]`. Для значений вне [0, 1]
|
|
166
169
|
/// выполняет линейную экстраполяцию.
|
|
167
170
|
/// @throws Не выбрасывает ошибок, безопасно обрабатывает все
|
|
168
171
|
/// числовые значения. Формула математически корректна для
|
|
169
172
|
/// любых числовых аргументов.
|
|
170
|
-
@
|
|
171
|
-
|
|
173
|
+
/// @throws {Error} - Выбрасывает ошибку, если в параметры передано
|
|
174
|
+
/// значение, не соответствующее типу `number`. Компиляция Sass
|
|
175
|
+
/// будет остановлена с ошибкой.
|
|
176
|
+
@function number-denormalize($value, $value-min, $value-max) {
|
|
177
|
+
|
|
178
|
+
// Проверка типа первого параметра: ожидается нормализованное числовое значение.
|
|
179
|
+
// Функция is-number() проверяет, является ли $value числом.
|
|
180
|
+
// $value должно быть числом в диапазоне от 0 до 1 (нормализованное значение).
|
|
181
|
+
@if not is-number($value) {
|
|
182
|
+
|
|
183
|
+
// Если $value не является числом, возвращаем ошибку через
|
|
184
|
+
// стандартную функцию логирования. Это предотвращает
|
|
185
|
+
// некорректные вычисления с нечисловыми данными.
|
|
186
|
+
@return log-invalid-type(
|
|
187
|
+
'number-denormalize',
|
|
188
|
+
$value,
|
|
189
|
+
'$value',
|
|
190
|
+
'number'
|
|
191
|
+
);
|
|
192
|
+
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
// Проверка типа второго параметра: ожидается числовое значение
|
|
196
|
+
// минимальной границы диапазона. $value-min определяет нижнее
|
|
197
|
+
// значение целевого диапазона, в который будет денормализовано число.
|
|
198
|
+
@else if not is-number($value-min) {
|
|
199
|
+
|
|
200
|
+
// Если $value-min не является числом, возвращаем ошибку.
|
|
201
|
+
// Проверка выполняется только если $value прошел валидацию.
|
|
202
|
+
@return log-invalid-type(
|
|
203
|
+
'number-denormalize',
|
|
204
|
+
$value-min,
|
|
205
|
+
'$value-min',
|
|
206
|
+
'number'
|
|
207
|
+
);
|
|
208
|
+
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
// Проверка типа третьего параметра: ожидается числовое значение
|
|
212
|
+
// максимальной границы диапазона. $value-max определяет верхнее
|
|
213
|
+
// значение целевого диапазона, в который будет денормализовано число.
|
|
214
|
+
@else if not is-number($value-max) {
|
|
215
|
+
|
|
216
|
+
// Если $value-max не является числом, возвращаем ошибку.
|
|
217
|
+
// Проверка выполняется только если $value и $value-min
|
|
218
|
+
// прошли валидацию.
|
|
219
|
+
@return log-invalid-type(
|
|
220
|
+
'number-denormalize',
|
|
221
|
+
$value-max,
|
|
222
|
+
'$value-max',
|
|
223
|
+
'number'
|
|
224
|
+
);
|
|
225
|
+
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
// Все параметры прошли валидацию - выполняем денормализацию.
|
|
229
|
+
@else {
|
|
230
|
+
|
|
231
|
+
// Формула денормализации числа из диапазона [0, 1]
|
|
232
|
+
// в произвольный диапазон [$value-min, $value-max]:
|
|
233
|
+
//
|
|
234
|
+
// Алгоритм вычислений:
|
|
235
|
+
// 1. ($value-max - $value-min) - вычисляем ширину целевого диапазона
|
|
236
|
+
// 2. $value * ... - умножаем нормализованное значение на ширину диапазона
|
|
237
|
+
// 3. ... + $value-min - добавляем минимальное значение для смещения
|
|
238
|
+
// результата в нужный диапазон
|
|
239
|
+
//
|
|
240
|
+
// Математическая формула:
|
|
241
|
+
// result = value × (value-max - value-min) + value-min
|
|
242
|
+
//
|
|
243
|
+
// Ключевая особенность: функция преобразует нормализованное значение
|
|
244
|
+
// (обычно в диапазоне от 0 до 1) в значение в произвольном диапазоне,
|
|
245
|
+
// сохраняя относительное положение в пределах диапазона.
|
|
246
|
+
@return $value * ($value-max - $value-min) + $value-min;
|
|
247
|
+
|
|
248
|
+
}
|
|
249
|
+
|
|
172
250
|
}
|
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
@use 'sass:list';
|
|
2
|
+
@use '../../loggers/log-invalid-type' as *;
|
|
3
|
+
@use '../../validators/type-of/is-number' as *;
|
|
2
4
|
|
|
3
5
|
/// Генерирует последовательность чисел Фибоначчи.
|
|
4
6
|
///
|
|
@@ -216,20 +218,71 @@
|
|
|
216
218
|
/// - Второй элемент: всегда 1 (если `$n > 1`)
|
|
217
219
|
/// - Каждый последующий элемент: сумма двух предыдущих
|
|
218
220
|
/// - Все элементы: целые положительные числа
|
|
221
|
+
/// @throws {Error} - Выбрасывает ошибку, если в параметры передано
|
|
222
|
+
/// значение, не соответствующее типу `number`. Компиляция Sass
|
|
223
|
+
/// будет остановлена с ошибкой.
|
|
219
224
|
@function number-fibonacci($n) {
|
|
220
|
-
$-result: ();
|
|
221
|
-
$-a: 0;
|
|
222
|
-
$-b: 1;
|
|
223
225
|
|
|
224
|
-
|
|
226
|
+
// Проверка типа входного параметра: ожидается числовое значение.
|
|
227
|
+
// Функция is-number() проверяет, является ли $n числом.
|
|
228
|
+
// $n определяет количество чисел Фибоначчи, которые нужно сгенерировать.
|
|
229
|
+
@if not is-number($n) {
|
|
225
230
|
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
231
|
+
// Если $n не является числом, возвращаем ошибку через
|
|
232
|
+
// стандартную функцию логирования. Это предотвращает
|
|
233
|
+
// некорректные вычисления с нечисловыми данными.
|
|
234
|
+
@return log-invalid-type(
|
|
235
|
+
'number-fibonacci',
|
|
236
|
+
$n,
|
|
237
|
+
'$n',
|
|
238
|
+
'number'
|
|
239
|
+
);
|
|
230
240
|
|
|
231
241
|
}
|
|
232
242
|
|
|
233
|
-
|
|
243
|
+
// Основная логика выполняется только если $n является
|
|
244
|
+
// корректным числом.
|
|
245
|
+
@else {
|
|
246
|
+
|
|
247
|
+
// Инициализация переменной для хранения результата.
|
|
248
|
+
// $-result будет содержать список чисел Фибоначчи.
|
|
249
|
+
$-result: ();
|
|
250
|
+
|
|
251
|
+
// Инициализация начальных значений последовательности Фибоначчи.
|
|
252
|
+
// $-a и $-b представляют два предыдущих числа в последовательности.
|
|
253
|
+
// Последовательность Фибоначчи начинается с: 0, 1, 1, 2, 3, 5, 8...
|
|
254
|
+
// Для генерации n чисел мы начинаем с $-a = 0, $-b = 1.
|
|
255
|
+
$-a: 0;
|
|
256
|
+
$-b: 1;
|
|
257
|
+
|
|
258
|
+
// Цикл генерации чисел Фибоначчи.
|
|
259
|
+
// Переменная $i принимает значения от 1 до $n включительно.
|
|
260
|
+
// На каждой итерации генерируется одно число Фибоначчи.
|
|
261
|
+
@for $i from 1 through $n {
|
|
262
|
+
|
|
263
|
+
// Добавление текущего числа Фибоначчи в список результата.
|
|
264
|
+
// На первой итерации $-b = 1 (первое число Фибоначчи).
|
|
265
|
+
// Функция list.append() добавляет число в конец списка.
|
|
266
|
+
$-result: list.append($-result, $-b);
|
|
267
|
+
|
|
268
|
+
// Вычисление следующего числа Фибоначчи.
|
|
269
|
+
// Алгоритм:
|
|
270
|
+
// 1. $-temp: временная переменная для хранения суммы двух предыдущих чисел
|
|
271
|
+
// 2. $-a: обновление для следующей итерации (становится предыдущим $-b)
|
|
272
|
+
// 3. $-b: обновление для следующей итерации (становится вычисленной суммой)
|
|
273
|
+
$-temp: $-a + $-b;
|
|
274
|
+
$-a: $-b;
|
|
275
|
+
$-b: $-temp;
|
|
276
|
+
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
// Возвращаем список сгенерированных чисел Фибоначчи.
|
|
280
|
+
// Список содержит $n чисел, начиная с 1 (первое число Фибоначчи).
|
|
281
|
+
// Классическая последовательность Фибоначчи начинается с 0, 1,
|
|
282
|
+
// но данная реализация начинает с 1 для более практического использования
|
|
283
|
+
// в дизайне (золотое сечение, пропорции и т.д.).
|
|
284
|
+
@return $-result;
|
|
285
|
+
|
|
286
|
+
}
|
|
234
287
|
|
|
235
288
|
}
|
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
@use 'sass:math';
|
|
2
|
+
@use '../../loggers/log-invalid-type' as *;
|
|
3
|
+
@use '../../validators/type-of/is-number' as *;
|
|
2
4
|
|
|
3
5
|
/// Округляет число вниз до ближайшего кратного значения.
|
|
4
6
|
///
|
|
@@ -106,9 +108,61 @@
|
|
|
106
108
|
/// @return {Number} - Число, округленное вниз до ближайшего
|
|
107
109
|
/// значения, кратного `$nearest`. Сохраняет единицы
|
|
108
110
|
/// измерения исходного числа `$value`.
|
|
109
|
-
/// @throws {Error} - Может выбросить ошибку если
|
|
110
|
-
/// `$nearest` не являются числами, или если происходит
|
|
111
|
+
/// @throws {Error} - Может выбросить ошибку если происходит
|
|
111
112
|
/// деление на ноль.
|
|
113
|
+
/// @throws {Error} - Выбрасывает ошибку, если в параметры передано
|
|
114
|
+
/// значение, не соответствующее типу `number`. Компиляция Sass
|
|
115
|
+
/// будет остановлена с ошибкой.
|
|
112
116
|
@function number-floor-to($value, $nearest) {
|
|
113
|
-
|
|
117
|
+
|
|
118
|
+
// Проверка типа первого параметра: ожидается числовое значение.
|
|
119
|
+
// Функция is-number() проверяет, является ли $value числом.
|
|
120
|
+
// Это может быть целое число, дробное число или число с единицами измерения.
|
|
121
|
+
@if not is-number($value) {
|
|
122
|
+
|
|
123
|
+
// Если $value не является числом, возвращаем ошибку через
|
|
124
|
+
// стандартную функцию логирования. Это предотвращает
|
|
125
|
+
// некорректные вычисления с нечисловыми данными.
|
|
126
|
+
@return log-invalid-type(
|
|
127
|
+
'number-floor-to',
|
|
128
|
+
$value,
|
|
129
|
+
'$value',
|
|
130
|
+
'number'
|
|
131
|
+
);
|
|
132
|
+
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
// Проверка типа второго параметра: ожидается числовое значение
|
|
136
|
+
// для шага округления. $nearest определяет, до какого ближайшего
|
|
137
|
+
// кратного значения нужно округлить исходное число.
|
|
138
|
+
@else if not is-number($nearest) {
|
|
139
|
+
|
|
140
|
+
// Если $nearest не является числом, возвращаем ошибку.
|
|
141
|
+
// Проверка выполняется только если $value прошел валидацию.
|
|
142
|
+
@return log-invalid-type(
|
|
143
|
+
'number-floor-to',
|
|
144
|
+
$nearest,
|
|
145
|
+
'$nearest',
|
|
146
|
+
'number'
|
|
147
|
+
);
|
|
148
|
+
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
// Все параметры прошли валидацию - выполняем округление вниз.
|
|
152
|
+
@else {
|
|
153
|
+
|
|
154
|
+
// Формула округления вниз до ближайшего кратного значения:
|
|
155
|
+
// 1. math.div($value, $nearest) - делим исходное значение на шаг округления
|
|
156
|
+
// 2. math.floor() - округляем результат деления вниз до ближайшего целого
|
|
157
|
+
// 3. * $nearest - умножаем округленное целое на шаг округления
|
|
158
|
+
//
|
|
159
|
+
// Математическая формула:
|
|
160
|
+
// result = floor(value / nearest) × nearest
|
|
161
|
+
//
|
|
162
|
+
// Ключевая особенность: функция всегда округляет ВНИЗ до ближайшего
|
|
163
|
+
// кратного значения, даже если исходное число уже близко к верхнему крайнему.
|
|
164
|
+
@return math.floor(math.div($value, $nearest)) * $nearest;
|
|
165
|
+
|
|
166
|
+
}
|
|
167
|
+
|
|
114
168
|
}
|
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
@use 'sass:math';
|
|
2
2
|
@use 'sass:meta';
|
|
3
3
|
@use 'sass:string';
|
|
4
|
+
@use '../../loggers/log-invalid-type' as *;
|
|
5
|
+
@use '../../validators/type-of/is-number' as *;
|
|
6
|
+
@use '../../validators/type-of/is-string' as *;
|
|
4
7
|
|
|
5
8
|
/// Форматирует число, добавляя разделители тысяч для улучшения
|
|
6
9
|
/// читаемости больших чисел.
|
|
@@ -93,30 +96,110 @@
|
|
|
93
96
|
/// часть исходного числа игнорируется.
|
|
94
97
|
/// @throws {Error} - Может выбросить ошибку если `$value`
|
|
95
98
|
/// не является числом или если `$separator` не является строкой.
|
|
99
|
+
/// @throws {Error} - Выбрасывает ошибку, если в параметры передано
|
|
100
|
+
/// значение, не соответствующее типу `number (`$value`) или
|
|
101
|
+
/// `string` (`$separator`). Компиляция Sass будет остановлена
|
|
102
|
+
/// с ошибкой.
|
|
96
103
|
@function number-format-with-separator($value, $separator: ",") {
|
|
97
104
|
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
105
|
+
// Проверка типа первого параметра: ожидается числовое значение.
|
|
106
|
+
// Функция is-number() проверяет, является ли $value числом.
|
|
107
|
+
// Это может быть целое число или дробное число.
|
|
108
|
+
@if not is-number($value) {
|
|
102
109
|
|
|
103
|
-
|
|
110
|
+
// Если $value не является числом, возвращаем ошибку через
|
|
111
|
+
// стандартную функцию логирования. Это предотвращает
|
|
112
|
+
// некорректные вычисления с нечисловыми данными.
|
|
113
|
+
@return log-invalid-type(
|
|
114
|
+
'number-format-with-separator',
|
|
115
|
+
$value,
|
|
116
|
+
'$value',
|
|
117
|
+
'number'
|
|
118
|
+
);
|
|
104
119
|
|
|
105
|
-
|
|
106
|
-
$-result: $char + $-result;
|
|
107
|
-
$-counter: $-counter + 1;
|
|
120
|
+
}
|
|
108
121
|
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
122
|
+
// Проверка типа второго параметра: ожидается строковое значение
|
|
123
|
+
// разделителя тысяч. $separator определяет символ, который будет
|
|
124
|
+
// использоваться для разделения групп разрядов (по умолчанию запятая).
|
|
125
|
+
@else if not is-string($separator) {
|
|
113
126
|
|
|
114
|
-
|
|
127
|
+
// Если $separator не является строкой, возвращаем ошибку.
|
|
128
|
+
// Проверка выполняется только если $value прошел валидацию.
|
|
129
|
+
@return log-invalid-type(
|
|
130
|
+
'number-format-with-separator',
|
|
131
|
+
$separator,
|
|
132
|
+
'$separator',
|
|
133
|
+
'string'
|
|
134
|
+
);
|
|
115
135
|
|
|
116
|
-
@if $value < 0 {
|
|
117
|
-
$-result: "-" + $-result;
|
|
118
136
|
}
|
|
119
137
|
|
|
120
|
-
|
|
138
|
+
// Все параметры прошли валидацию - выполняем форматирование числа.
|
|
139
|
+
@else {
|
|
140
|
+
|
|
141
|
+
// Инициализация переменной для хранения отформатированной строки.
|
|
142
|
+
// $-result будет содержать число с разделителями тысяч.
|
|
143
|
+
$-result: null;
|
|
144
|
+
|
|
145
|
+
// Преобразование абсолютного значения числа в строку.
|
|
146
|
+
// math.abs() возвращает абсолютное значение (без знака минус).
|
|
147
|
+
// meta.inspect() преобразует число в строковое представление.
|
|
148
|
+
$-str: meta.inspect(math.abs($value));
|
|
149
|
+
|
|
150
|
+
// Определение длины строкового представления числа.
|
|
151
|
+
// string.length() возвращает количество символов в строке.
|
|
152
|
+
$-length: string.length($-str);
|
|
153
|
+
|
|
154
|
+
// Счетчик для отслеживания количества обработанных цифр.
|
|
155
|
+
// Используется для вставки разделителя каждые 3 цифры.
|
|
156
|
+
$-counter: 0;
|
|
157
|
+
|
|
158
|
+
// Обратный цикл по символам строкового представления числа.
|
|
159
|
+
// Переменная $i принимает значения от $-length до 1 включительно.
|
|
160
|
+
// Цикл идет справа налево (от младших разрядов к старшим).
|
|
161
|
+
@for $i from $-length through 1 {
|
|
162
|
+
|
|
163
|
+
// Извлечение текущего символа (цифры) из строки.
|
|
164
|
+
// string.slice() возвращает подстроку, в данном случае один символ.
|
|
165
|
+
$char: string.slice($-str, $i, $i);
|
|
166
|
+
|
|
167
|
+
// Добавление символа в начало результата.
|
|
168
|
+
// Поскольку цикл идет справа налево, каждый новый символ
|
|
169
|
+
// добавляется в начало строки для сохранения правильного порядка.
|
|
170
|
+
$-result: $char + $-result;
|
|
171
|
+
|
|
172
|
+
// Увеличение счетчика обработанных цифр.
|
|
173
|
+
$-counter: $-counter + 1;
|
|
174
|
+
|
|
175
|
+
// Проверка: нужно ли вставить разделитель тысяч.
|
|
176
|
+
// Условие выполняется, если:
|
|
177
|
+
// 1. Обработано 3 цифры ($-counter == 3)
|
|
178
|
+
// 2. Есть еще цифры слева для обработки ($i > 1)
|
|
179
|
+
@if $-counter == 3 and $i > 1 {
|
|
180
|
+
|
|
181
|
+
// Вставка разделителя тысяч в начало результата.
|
|
182
|
+
// Разделитель добавляется перед текущей группой из 3 цифр.
|
|
183
|
+
$-result: $separator + $-result;
|
|
184
|
+
|
|
185
|
+
// Сброс счетчика для начала новой группы.
|
|
186
|
+
$-counter: 0;
|
|
187
|
+
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
// Обработка отрицательных чисел.
|
|
193
|
+
// Если исходное значение было отрицательным, добавляем знак минус
|
|
194
|
+
// в начало отформатированной строки.
|
|
195
|
+
@if $value < 0 {
|
|
196
|
+
$-result: "-" + $-result;
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
// Возвращаем отформатированную строку с разделителями тысяч.
|
|
200
|
+
// Число разбито на группы по 3 цифры, начиная справа.
|
|
201
|
+
@return $-result;
|
|
202
|
+
|
|
203
|
+
}
|
|
121
204
|
|
|
122
205
|
}
|
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
@use 'sass:math';
|
|
2
|
+
@use '../../loggers/log-invalid-type' as *;
|
|
3
|
+
@use '../../validators/type-of/is-number' as *;
|
|
2
4
|
|
|
3
5
|
/// Нормализует число к единичному интервалу [0, 1].
|
|
4
6
|
///
|
|
5
7
|
/// Функция выполняет линейное преобразование числа из
|
|
6
|
-
/// исходного диапазона `[$min, $max]` в нормализованный
|
|
8
|
+
/// исходного диапазона `[$value-min, $value-max]` в нормализованный
|
|
7
9
|
/// диапазон `[0, 1]`. Это фундаментальная математическая
|
|
8
10
|
/// операция, используемая в статистике, компьютерной графике,
|
|
9
11
|
/// анимациях и алгоритмах интерполяции.
|
|
@@ -33,7 +35,7 @@
|
|
|
33
35
|
/// > создания прогресс-баров, цветовых градиентов и других
|
|
34
36
|
/// > алгоритмов, требующих значений в единичном интервале.
|
|
35
37
|
/// >
|
|
36
|
-
/// > Для значений вне диапазона `[$min, $max]` результат будет
|
|
38
|
+
/// > Для значений вне диапазона `[$value-min, $value-max]` результат будет
|
|
37
39
|
/// > выходить за пределы [0, 1], что может быть полезно для
|
|
38
40
|
/// > экстраполяции или обнаружения выбросов.
|
|
39
41
|
/// ---
|
|
@@ -143,18 +145,94 @@
|
|
|
143
145
|
/// @param {Number} $value - Число для нормализации.
|
|
144
146
|
/// Может быть любым числом: целым, дробным, положительным,
|
|
145
147
|
/// отрицательным, с единицами измерения или без.
|
|
146
|
-
/// @param {Number} $min - Нижняя граница исходного диапазона.
|
|
148
|
+
/// @param {Number} $value-min - Нижняя граница исходного диапазона.
|
|
147
149
|
/// Значение, соответствующее `0` в нормализованном диапазоне.
|
|
148
|
-
/// @param {Number} $max - Верхняя граница исходного диапазона.
|
|
150
|
+
/// @param {Number} $value-max - Верхняя граница исходного диапазона.
|
|
149
151
|
/// Значение, соответствующее `1` в нормализованном диапазоне.
|
|
150
152
|
/// @return {Number} - Нормализованное значение в диапазоне [0, 1].
|
|
151
153
|
/// Возвращает дробное безразмерное число. Если `$value` находится
|
|
152
|
-
/// между `$min` и `$max`, результат будет в диапазоне [0, 1].
|
|
153
|
-
/// Если `$value` меньше `$min`, результат будет отрицательным.
|
|
154
|
-
/// Если `$value` больше `$max`, результат будет больше 1.
|
|
154
|
+
/// между `$value-min` и `$value-max`, результат будет в диапазоне [0, 1].
|
|
155
|
+
/// Если `$value` меньше `$value-min`, результат будет отрицательным.
|
|
156
|
+
/// Если `$value` больше `$value-max`, результат будет больше 1.
|
|
155
157
|
/// @throws {Error} - Может выбросить ошибку деления на ноль, если
|
|
156
|
-
/// `$min == $max`. В этом случае знаменатель формулы становится
|
|
158
|
+
/// `$value-min == $value-max`. В этом случае знаменатель формулы становится
|
|
157
159
|
/// нулем, что приводит к математической неопределенности.
|
|
158
|
-
@
|
|
159
|
-
|
|
160
|
+
/// @throws {Error} - Выбрасывает ошибку, если в параметры передано
|
|
161
|
+
/// значение, не соответствующее типу `number`. Компиляция Sass
|
|
162
|
+
/// будет остановлена с ошибкой.
|
|
163
|
+
@function number-normalize($value, $value-min, $value-max) {
|
|
164
|
+
|
|
165
|
+
// Проверка типа первого параметра: ожидается числовое значение.
|
|
166
|
+
// Функция is-number() проверяет, является ли $value числом.
|
|
167
|
+
// $value будет нормализовано в диапазон от 0 до 1.
|
|
168
|
+
@if not is-number($value) {
|
|
169
|
+
|
|
170
|
+
// Если $value не является числом, возвращаем ошибку через
|
|
171
|
+
// стандартную функцию логирования. Это предотвращает
|
|
172
|
+
// некорректные вычисления с нечисловыми данными.
|
|
173
|
+
@return log-invalid-type(
|
|
174
|
+
'number-normalize',
|
|
175
|
+
$value,
|
|
176
|
+
'$value',
|
|
177
|
+
'number'
|
|
178
|
+
);
|
|
179
|
+
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
// Проверка типа второго параметра: ожидается числовое значение
|
|
183
|
+
// минимальной границы исходного диапазона. $value-min определяет
|
|
184
|
+
// нижнюю границу диапазона, из которого будет нормализовано число.
|
|
185
|
+
@else if not is-number($value-min) {
|
|
186
|
+
|
|
187
|
+
// Если $value-min не является числом, возвращаем ошибку.
|
|
188
|
+
// Проверка выполняется только если $value прошел валидацию.
|
|
189
|
+
@return log-invalid-type(
|
|
190
|
+
'number-normalize',
|
|
191
|
+
$value-min,
|
|
192
|
+
'$value-min',
|
|
193
|
+
'number'
|
|
194
|
+
);
|
|
195
|
+
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
// Проверка типа третьего параметра: ожидается числовое значение
|
|
199
|
+
// максимальной границы исходного диапазона. $value-max определяет
|
|
200
|
+
// верхнюю границу диапазона, из которого будет нормализовано число.
|
|
201
|
+
@else if not is-number($value-max) {
|
|
202
|
+
|
|
203
|
+
// Если $value-max не является числом, возвращаем ошибку.
|
|
204
|
+
// Проверка выполняется только если $value и $value-min
|
|
205
|
+
// прошли валидацию.
|
|
206
|
+
@return log-invalid-type(
|
|
207
|
+
'number-normalize',
|
|
208
|
+
$value-max,
|
|
209
|
+
'$value-max',
|
|
210
|
+
'number'
|
|
211
|
+
);
|
|
212
|
+
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
// Все параметры прошли валидацию - выполняем нормализацию.
|
|
216
|
+
@else {
|
|
217
|
+
|
|
218
|
+
// Формула нормализации числа из произвольного диапазона
|
|
219
|
+
// [$value-min, $value-max] в диапазон [0, 1]:
|
|
220
|
+
//
|
|
221
|
+
// Алгоритм вычислений:
|
|
222
|
+
// 1. $value - $value-min - смещаем значение так, чтобы минимальное
|
|
223
|
+
// значение диапазона стало 0
|
|
224
|
+
// 2. $value-max - $value-min - вычисляем ширину исходного диапазона
|
|
225
|
+
// 3. math.div(...) - делим смещенное значение на ширину диапазона
|
|
226
|
+
// для получения нормализованного значения от 0 до 1
|
|
227
|
+
//
|
|
228
|
+
// Математическая формула:
|
|
229
|
+
// result = (value - value-min) ÷ (value-max - value-min)
|
|
230
|
+
//
|
|
231
|
+
// Ключевая особенность: функция преобразует значение из произвольного
|
|
232
|
+
// диапазона в нормализованное значение от 0 до 1, где 0 соответствует
|
|
233
|
+
// $value-min, а 1 соответствует $value-max.
|
|
234
|
+
@return math.div($value - $value-min, $value-max - $value-min);
|
|
235
|
+
|
|
236
|
+
}
|
|
237
|
+
|
|
160
238
|
}
|