@omnisass/library 0.3.0 → 0.4.1
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 +19 -0
- package/index.scss +6 -0
- package/modules/utilities/getters/misc/_get-uid.scss +135 -0
- package/modules/utilities/getters/string/_get-string-hash.scss +143 -0
- package/modules/utilities/helpers/list/_list-sum-numbers-safe.scss +4 -3
- package/modules/utilities/helpers/list/_list-sum-numbers.scss +4 -3
- package/modules/utilities/helpers/misc/_url-encode.scss +7 -6
- package/modules/utilities/helpers/number/_number-ceil-to.scss +5 -3
- package/modules/utilities/helpers/number/_number-clamp-max.scss +5 -3
- package/modules/utilities/helpers/number/_number-clamp-min.scss +5 -3
- package/modules/utilities/helpers/number/_number-clamp.scss +6 -3
- package/modules/utilities/helpers/number/_number-denormalize.scss +6 -3
- package/modules/utilities/helpers/number/_number-fibonacci.scss +4 -3
- package/modules/utilities/helpers/number/_number-floor-to.scss +5 -3
- package/modules/utilities/helpers/number/_number-format-with-separator.scss +5 -4
- package/modules/utilities/helpers/number/_number-normalize.scss +6 -3
- package/modules/utilities/helpers/number/_number-random-between-int.scss +5 -3
- package/modules/utilities/helpers/number/_number-random-between.scss +5 -3
- package/modules/utilities/helpers/number/_number-range.scss +6 -3
- package/modules/utilities/helpers/number/_number-round-to-nearest.scss +5 -3
- package/modules/utilities/helpers/number/_number-round-to.scss +5 -3
- package/modules/utilities/helpers/number/_number-strip-unit.scss +4 -3
- package/modules/utilities/helpers/string/_string-capitalize.scss +4 -3
- package/modules/utilities/helpers/string/_string-count.scss +173 -0
- package/modules/utilities/helpers/string/_string-lorips.config.scss +81 -0
- package/modules/utilities/helpers/string/_string-lorips.scss +198 -0
- package/modules/utilities/helpers/string/_string-repeat.scss +147 -0
- package/modules/utilities/helpers/string/_string-replace.scss +6 -3
- package/modules/utilities/helpers/string/_string-reverse.scss +139 -0
- package/modules/utilities/helpers/string/_string-trim-end.scss +4 -3
- package/modules/utilities/helpers/string/_string-trim-start.scss +4 -3
- package/modules/utilities/helpers/string/_string-trim.scss +4 -3
- package/modules/utilities/validators/color/_is-color-light.scss +5 -4
- package/modules/utilities/validators/color/_is-color-list.scss +4 -3
- package/modules/utilities/validators/list/_is-list-contained.scss +5 -4
- package/modules/utilities/validators/number/_is-int-even.scss +4 -3
- package/modules/utilities/validators/number/_is-int-odd.scss +4 -3
- package/modules/utilities/validators/number/_is-int.scss +5 -3
- package/modules/utilities/validators/number/_is-number-has-unit.scss +4 -3
- package/modules/utilities/validators/number/_is-number-negative.scss +4 -3
- package/modules/utilities/validators/number/_is-number-positive.scss +4 -3
- package/modules/utilities/validators/number/_is-number-unitless.scss +4 -3
- package/modules/utilities/validators/number/_is-number-zero.scss +4 -3
- package/modules/utilities/validators/string/_is-string-contained.scss +5 -3
- package/modules/utilities/validators/string/_is-string-empty.scss +4 -3
- package/modules/utilities/validators/string/_is-string-ending-with.scss +5 -3
- package/modules/utilities/validators/string/_is-string-starting-with.scss +5 -3
- package/package.json +1 -1
- package/package.scss +2 -2
- package/modules/utilities/setters/_index.scss +0 -3
|
@@ -111,9 +111,11 @@
|
|
|
111
111
|
/// @throws {Error} - Может выбросить ошибку если `$precision`
|
|
112
112
|
/// не является целым неотрицательным числом или если
|
|
113
113
|
/// `$value` не является числом.
|
|
114
|
-
/// @throws {Error} - Выбрасывает ошибку, если в
|
|
115
|
-
/// значение, не соответствующее
|
|
116
|
-
///
|
|
114
|
+
/// @throws {Error} - Выбрасывает ошибку, если в параметр передано
|
|
115
|
+
/// значение, не соответствующее необходимому типу:
|
|
116
|
+
///
|
|
117
|
+
/// - `$value` → `number`
|
|
118
|
+
/// - `$precision` → `number`
|
|
117
119
|
@function number-round-to($value, $precision: 2) {
|
|
118
120
|
|
|
119
121
|
// Проверка типа первого параметра: ожидается числовое значение.
|
|
@@ -79,9 +79,10 @@
|
|
|
79
79
|
/// @return {Number} - Безразмерное числовое значение, равное
|
|
80
80
|
/// числовой части входного значения. Если входное значение
|
|
81
81
|
/// уже было безразмерным, возвращается то же самое значение.
|
|
82
|
-
/// @throws {Error} - Выбрасывает ошибку, если в
|
|
83
|
-
/// значение, не соответствующее
|
|
84
|
-
///
|
|
82
|
+
/// @throws {Error} - Выбрасывает ошибку, если в параметр передано
|
|
83
|
+
/// значение, не соответствующее необходимому типу:
|
|
84
|
+
///
|
|
85
|
+
/// - `$value` → `number`
|
|
85
86
|
@function number-strip-unit($value) {
|
|
86
87
|
|
|
87
88
|
// Проверка типа входного параметра: ожидается числовое значение.
|
|
@@ -74,9 +74,10 @@
|
|
|
74
74
|
/// первый символ преобразован в верхний регистр, а все
|
|
75
75
|
/// остальные символы остаются без изменений. Для пустой
|
|
76
76
|
/// строки возвращает пустую строку.
|
|
77
|
-
/// @throws {Error} - Выбрасывает ошибку, если в
|
|
78
|
-
/// значение, не соответствующее
|
|
79
|
-
///
|
|
77
|
+
/// @throws {Error} - Выбрасывает ошибку, если в параметр передано
|
|
78
|
+
/// значение, не соответствующее необходимому типу:
|
|
79
|
+
///
|
|
80
|
+
/// - `$string` → `string`
|
|
80
81
|
@function string-capitalize($string) {
|
|
81
82
|
|
|
82
83
|
// Проверка типа входного параметра: ожидается строковое значение.
|
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
@use 'sass:string';
|
|
2
|
+
@use '../../loggers/log-invalid-type' as *;
|
|
3
|
+
@use '../../validators/type-of/is-string' as *;
|
|
4
|
+
|
|
5
|
+
/// Подсчитывает количество вхождений подстроки в строку.
|
|
6
|
+
///
|
|
7
|
+
/// Функция принимает строку и подстроку, затем возвращает
|
|
8
|
+
/// количество непересекающихся вхождений подстроки в строку.
|
|
9
|
+
/// Поиск чувствителен к регистру и выполняется слева направо.
|
|
10
|
+
/// Это полезно для анализа текста, подсчета символов или слов,
|
|
11
|
+
/// проверки частоты встречаемости определенных паттернов в
|
|
12
|
+
/// строковых данных.
|
|
13
|
+
///
|
|
14
|
+
/// Важные особенности функции:
|
|
15
|
+
/// - Выполняет регистрозависимый поиск подстроки
|
|
16
|
+
/// - Подсчитывает только непересекающиеся вхождения
|
|
17
|
+
/// - Выполняет строгую проверку типов обоих параметров
|
|
18
|
+
/// - Использует цикл while для последовательного поиска
|
|
19
|
+
/// - Возвращает 0, если подстрока не найдена ни разу
|
|
20
|
+
/// - Работает с любыми строками, включая пустые
|
|
21
|
+
/// - Обрабатывает Unicode-символы и многосимвольные подстроки
|
|
22
|
+
/// - Полезна для текстового анализа и статистики
|
|
23
|
+
/// - Может использоваться для подсчета слов или символов
|
|
24
|
+
/// - Подходит для валидации форматов строк
|
|
25
|
+
/// - Эффективна для строк средней длины
|
|
26
|
+
/// - Для пустой подстроки всегда возвращает 0 (поскольку
|
|
27
|
+
/// поиск пустой строки в Sass возвращает null)
|
|
28
|
+
/// - Функция использует алгоритм последовательного поиска
|
|
29
|
+
/// через `string.index()` и усечение строки после каждого
|
|
30
|
+
/// найденного вхождения
|
|
31
|
+
/// - Для длинных строк и часто встречающихся подстрок
|
|
32
|
+
/// производительность может снижаться из-за многократного
|
|
33
|
+
/// вызова `string.slice()`
|
|
34
|
+
/// - Поиск чувствителен к регистру: "Hello" и "hello"
|
|
35
|
+
/// считаются разными подстроками
|
|
36
|
+
/// - Функция корректно обрабатывает многосимвольные
|
|
37
|
+
/// подстроки и Unicode-последовательности
|
|
38
|
+
/// ---
|
|
39
|
+
/// @name string-count
|
|
40
|
+
/// @group utilities-helpers
|
|
41
|
+
/// @since 2026.01.18
|
|
42
|
+
/// @access public
|
|
43
|
+
/// @author Murad Rustamov (therteenten)
|
|
44
|
+
/// @link https://sourcecraft.dev/users/therteenten/overview SourceCraft - therteenten
|
|
45
|
+
/// @link https://sourcecraft.dev/omnisass/library SourceCraft - OmniSass
|
|
46
|
+
/// @link https://sass-lang.com/documentation/modules/string См. также: Официальная документация Sass - Модуль String
|
|
47
|
+
/// @link https://sass-lang.com/documentation/values/strings См. также: Официальная документация Sass - Тип данных "Строки"
|
|
48
|
+
/// @link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String См. также: MDN Web Docs - Объект String
|
|
49
|
+
/// @link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/includes См. также: MDN Web Docs - Метод String.includes()
|
|
50
|
+
/// @link https://en.wikipedia.org/wiki/String_(computer_science) См. также: Wikipedia - Строка (информатика)
|
|
51
|
+
/// @link https://en.wikipedia.org/wiki/Substring См. также: Wikipedia - Подстрока
|
|
52
|
+
/// @link https://css-tricks.com/snippets/sass/string-count-function/ См. также: CSS-Tricks - Функция подсчета подстрок в Sass
|
|
53
|
+
/// @link https://css-tricks.com/sass-string-manipulation-functions/ См. также: CSS-Tricks - Функции для работы со строками в Sass
|
|
54
|
+
/// @link https://sass-guidelin.es/ru/#section-44 См. также: Sass Guidelines - Раздел про функции
|
|
55
|
+
/// @link https://github.com/sass/sass/issues/1402 См. также: GitHub - Обсуждение строковых операций в Sass
|
|
56
|
+
/// @link https://www.30secondsofcode.org/sass/p/1/string-count См. также: 30 seconds of code - Функция string-count
|
|
57
|
+
/// @example scss - Подсчет одиночных символов
|
|
58
|
+
/// @debug string-count("hello", "l"); // 2
|
|
59
|
+
/// @debug string-count("banana", "a"); // 3
|
|
60
|
+
/// @debug string-count("test", "t"); // 2
|
|
61
|
+
/// @debug string-count("abc", "z"); // 0
|
|
62
|
+
/// @debug string-count("", "a"); // 0
|
|
63
|
+
/// @debug string-count("aaa", "aa"); // 1 (непересекающиеся)
|
|
64
|
+
/// @example scss - Подсчет многосимвольных подстрок
|
|
65
|
+
/// @debug string-count("hello world", "lo"); // 1
|
|
66
|
+
/// @debug string-count("test test test", "test"); // 3
|
|
67
|
+
/// @debug string-count("ababab", "ab"); // 3
|
|
68
|
+
/// @debug string-count("one two one", "one"); // 2
|
|
69
|
+
/// @debug string-count("hello hello", "hello"); // 2
|
|
70
|
+
/// @example scss - Регистрозависимый поиск
|
|
71
|
+
/// @debug string-count("Hello World", "hello"); // 0
|
|
72
|
+
/// @debug string-count("Hello World", "Hello"); // 1
|
|
73
|
+
/// @debug string-count("ABC abc ABC", "ABC"); // 2
|
|
74
|
+
/// @debug string-count("Test test", "test"); // 1
|
|
75
|
+
/// @example scss - Граничные случаи
|
|
76
|
+
/// @debug string-count("aaaa", "aa"); // 2
|
|
77
|
+
/// @debug string-count("aaaaa", "aa"); // 2
|
|
78
|
+
/// @debug string-count("a", "a"); // 1
|
|
79
|
+
/// @debug string-count("abc", ""); // 0
|
|
80
|
+
/// @debug string-count("", ""); // 0
|
|
81
|
+
/// @param {String} $string - Исходная строка, в которой
|
|
82
|
+
/// выполняется поиск. Может быть любой строкой: пустой,
|
|
83
|
+
/// односимвольной, содержащей пробелы, Unicode-символы
|
|
84
|
+
/// или специальные символы.
|
|
85
|
+
/// @param {String} $substring - Подстрока, количество
|
|
86
|
+
/// вхождений которой нужно подсчитать. Может быть любой
|
|
87
|
+
/// строкой, включая пустую, односимвольную или
|
|
88
|
+
/// многосимвольную. Поиск регистрозависимый.
|
|
89
|
+
/// @return {Number} - Целое неотрицательное число,
|
|
90
|
+
/// представляющее количество непересекающихся вхождений
|
|
91
|
+
/// подстроки `$substring` в строку `$string`.
|
|
92
|
+
/// @throws {Error} - Выбрасывает ошибку, если в параметр
|
|
93
|
+
/// передано значение, не соответствующее необходимому типу:
|
|
94
|
+
///
|
|
95
|
+
/// - `$string` → `string`
|
|
96
|
+
/// - `$substring` → `string`
|
|
97
|
+
@function string-count($string, $substring) {
|
|
98
|
+
|
|
99
|
+
// Проверка типа первого параметра: ожидается строковое значение.
|
|
100
|
+
// Исходная строка должна быть строкой для выполнения поиска
|
|
101
|
+
// подстроки с помощью функции string.index().
|
|
102
|
+
@if not is-string($string) or $string == '' {
|
|
103
|
+
|
|
104
|
+
// Если $string не является строкой, возвращаем ошибку через
|
|
105
|
+
// стандартную функцию логирования. Это предотвращает
|
|
106
|
+
// некорректные операции с нестроковыми типами данных.
|
|
107
|
+
@return log-invalid-type(
|
|
108
|
+
'string-count',
|
|
109
|
+
$string,
|
|
110
|
+
'$string',
|
|
111
|
+
'string'
|
|
112
|
+
);
|
|
113
|
+
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
// Проверка типа второго параметра: ожидается строковое значение.
|
|
117
|
+
// Подстрока также должна быть строкой, так как string.index()
|
|
118
|
+
// работает только со строковыми аргументами.
|
|
119
|
+
@else if not is-string($substring) or $substring == '' {
|
|
120
|
+
|
|
121
|
+
// Если $substring не является строкой, возвращаем ошибку.
|
|
122
|
+
// Проверка выполняется только если $string прошел валидацию.
|
|
123
|
+
@return log-invalid-type(
|
|
124
|
+
'string-count',
|
|
125
|
+
$substring,
|
|
126
|
+
'$substring',
|
|
127
|
+
'string'
|
|
128
|
+
);
|
|
129
|
+
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
// Все параметры прошли валидацию - подсчитываем вхождения.
|
|
133
|
+
@else {
|
|
134
|
+
|
|
135
|
+
// Инициализация счетчика вхождений.
|
|
136
|
+
// Начальное значение 0 соответствует случаю, когда подстрока
|
|
137
|
+
// не найдена ни разу.
|
|
138
|
+
$-count: 0;
|
|
139
|
+
|
|
140
|
+
// Поиск первого вхождения подстроки в строку.
|
|
141
|
+
// string.index() возвращает позицию первого вхождения
|
|
142
|
+
// подстроки или null, если подстрока не найдена.
|
|
143
|
+
$-index: string.index($string, $substring);
|
|
144
|
+
|
|
145
|
+
// Цикл поиска всех вхождений подстроки.
|
|
146
|
+
// Цикл продолжается, пока находятся новые вхождения
|
|
147
|
+
// подстроки ($-index != null).
|
|
148
|
+
@while $-index != null {
|
|
149
|
+
|
|
150
|
+
// Увеличение счетчика найденных вхождений.
|
|
151
|
+
// Каждое найденное вхождение увеличивает счетчик на 1.
|
|
152
|
+
$-count: $-count + 1;
|
|
153
|
+
|
|
154
|
+
// Усечение строки после найденного вхождения.
|
|
155
|
+
// Новая строка начинается с символа, следующего за
|
|
156
|
+
// концом найденной подстроки, чтобы исключить
|
|
157
|
+
// пересекающиеся вхождения.
|
|
158
|
+
$string: string.slice($string, $-index + string.length($substring));
|
|
159
|
+
|
|
160
|
+
// Поиск следующего вхождения подстроки в усеченной строке.
|
|
161
|
+
// Если подстрока найдена снова, цикл продолжится,
|
|
162
|
+
// иначе $-index станет null, и цикл завершится.
|
|
163
|
+
$-index: string.index($string, $substring);
|
|
164
|
+
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
// Возвращаем общее количество найденных вхождений.
|
|
168
|
+
// Если подстрока не была найдена ни разу, $-count останется 0.
|
|
169
|
+
@return $-count;
|
|
170
|
+
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
/// Глобальная переменная с набором слов Lorem Ipsum.
|
|
2
|
+
///
|
|
3
|
+
/// Список содержит 35 стандартных слов классического текста-
|
|
4
|
+
/// заполнителя Lorem Ipsum в нижнем регистре. Переменная
|
|
5
|
+
/// используется функциями для генерации текста-заполнителя
|
|
6
|
+
/// и может быть переопределена для использования кастомного
|
|
7
|
+
/// набора слов или другого языка.
|
|
8
|
+
///
|
|
9
|
+
/// - Переменная объявлена с флагом `!default`, что
|
|
10
|
+
/// позволяет переопределить ее в проекте перед импортом
|
|
11
|
+
/// библиотеки. Это полезно для локализации или
|
|
12
|
+
/// использования кастомного набора слов.
|
|
13
|
+
/// - Для генерации корректного текста-заполнителя
|
|
14
|
+
/// рекомендуется использовать функции, которые учитывают
|
|
15
|
+
/// капитализацию первого слова и добавление пунктуации.
|
|
16
|
+
/// - Многострочное форматирование списка улучшает
|
|
17
|
+
/// читаемость кода, но не влияет на содержимое переменной.
|
|
18
|
+
/// Каждое слово находится на отдельной строке для удобства
|
|
19
|
+
/// просмотра и редактирования.
|
|
20
|
+
/// - Все слова приведены к нижнему регистру.
|
|
21
|
+
/// Функции, использующие эту переменную, должны сами
|
|
22
|
+
/// заботиться о капитализации при необходимости.
|
|
23
|
+
/// ---
|
|
24
|
+
/// @name set-lorem-ipsum-words
|
|
25
|
+
/// @group utilities-helpers
|
|
26
|
+
/// @since 2026.01.18
|
|
27
|
+
/// @access public
|
|
28
|
+
/// @author Murad Rustamov (therteenten)
|
|
29
|
+
/// @link https://sourcecraft.dev/users/therteenten/overview SourceCraft - therteenten
|
|
30
|
+
/// @link https://sourcecraft.dev/omnisass/library SourceCraft - OmniSass
|
|
31
|
+
/// @link https://sass-lang.com/documentation/values/lists См. также: Официальная документация Sass - Тип данных "Списки"
|
|
32
|
+
/// @link https://sass-lang.com/documentation/values/strings См. также: Официальная документация Sass - Тип данных "Строки"
|
|
33
|
+
/// @link https://en.wikipedia.org/wiki/Lorem_ipsum См. также: Wikipedia - Lorem ipsum
|
|
34
|
+
/// @link https://en.wikipedia.org/wiki/Latin См. также: Wikipedia - Латинский язык
|
|
35
|
+
/// @link https://developer.mozilla.org/en-US/docs/Web/CSS/content См. также: MDN Web Docs - CSS свойство content
|
|
36
|
+
/// @link https://css-tricks.com/snippets/sass/lorem-ipsum-generator/ См. также: CSS-Tricks - Генератор Lorem Ipsum на Sass
|
|
37
|
+
/// @link https://css-tricks.com/design-systems-with-sass-placeholders/ См. также: CSS-Tricks - Дизайн-системы с заполнителями
|
|
38
|
+
/// @link https://sass-guidelin.es/ru/#section-23 См. также: Sass Guidelines - Раздел про переменные
|
|
39
|
+
/// @link https://loremipsum.io/generator/ См. также: Lorem Ipsum - Генератор с настройками
|
|
40
|
+
/// @link https://www.lipsum.com/feed/html См. также: Lipsum.com - Генератор HTML Lorem Ipsum
|
|
41
|
+
/// @link https://github.com/sass/sass/issues/2871 См. также: GitHub - Обсуждение текстовых утилит в Sass
|
|
42
|
+
/// @see string-lorips - Функция для генерации текста-
|
|
43
|
+
/// заполнителя на основе этого набора слов.
|
|
44
|
+
/// @type List
|
|
45
|
+
$set-lorem-ipsum-words: "lorem"
|
|
46
|
+
"ipsum"
|
|
47
|
+
"dolor"
|
|
48
|
+
"sit"
|
|
49
|
+
"amet"
|
|
50
|
+
"consectetur"
|
|
51
|
+
"adipiscing"
|
|
52
|
+
"elit"
|
|
53
|
+
"sed"
|
|
54
|
+
"do"
|
|
55
|
+
"eiusmod"
|
|
56
|
+
"tempor"
|
|
57
|
+
"incididunt"
|
|
58
|
+
"ut"
|
|
59
|
+
"labore"
|
|
60
|
+
"et"
|
|
61
|
+
"dolore"
|
|
62
|
+
"magna"
|
|
63
|
+
"aliqua"
|
|
64
|
+
"ut"
|
|
65
|
+
"enim"
|
|
66
|
+
"ad"
|
|
67
|
+
"minim"
|
|
68
|
+
"veniam"
|
|
69
|
+
"quis"
|
|
70
|
+
"nostrud"
|
|
71
|
+
"exercitation"
|
|
72
|
+
"ullamco"
|
|
73
|
+
"laboris"
|
|
74
|
+
"nisi"
|
|
75
|
+
"ut"
|
|
76
|
+
"aliquip"
|
|
77
|
+
"ex"
|
|
78
|
+
"ea"
|
|
79
|
+
"commodo"
|
|
80
|
+
"consequat"
|
|
81
|
+
!default;
|
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
@forward './string-lorips.config';
|
|
2
|
+
|
|
3
|
+
@use 'sass:list';
|
|
4
|
+
@use './string-capitalize' as *;
|
|
5
|
+
@use './string-lorips.config' as configs;
|
|
6
|
+
@use '../../loggers/log-invalid-type' as *;
|
|
7
|
+
@use '../../validators/type-of/is-list' as *;
|
|
8
|
+
@use '../../validators/type-of/is-number' as *;
|
|
9
|
+
|
|
10
|
+
/// Генерирует текст-заполнитель на основе указанного списка слов.
|
|
11
|
+
///
|
|
12
|
+
/// Функция создает текст-заполнитель указанной длины (в словах)
|
|
13
|
+
/// путем циклического повторения слов из предоставленного списка.
|
|
14
|
+
/// По умолчанию используется классический набор слов Lorem Ipsum.
|
|
15
|
+
/// Результат автоматически капитализируется (первая буква становится
|
|
16
|
+
/// заглавной) и завершается точкой для грамматической корректности.
|
|
17
|
+
///
|
|
18
|
+
/// Важные особенности функции:
|
|
19
|
+
/// - Поддерживает кастомные списки слов через параметр `$words-list`
|
|
20
|
+
/// - Использует классический набор слов Lorem Ipsum по умолчанию
|
|
21
|
+
/// - Поддерживает указание произвольного количества слов
|
|
22
|
+
/// - Автоматически циклически повторяет слова при превышении длины списка
|
|
23
|
+
/// - Капитализирует первую букву результата
|
|
24
|
+
/// - Добавляет завершающую точку для грамматической правильности
|
|
25
|
+
/// - Разделяет слова одиночными пробелами
|
|
26
|
+
/// - Выполняет строгую проверку типов входных параметров
|
|
27
|
+
/// - Возвращает строку, готовую к использованию как текст-заполнитель
|
|
28
|
+
/// - Полезна для создания макетов, прототипов и тестирования типографики
|
|
29
|
+
/// - Обеспечивает единообразный заполнитель во всем проекте
|
|
30
|
+
/// - Позволяет легко локализовать текст-заполнитель
|
|
31
|
+
/// - Сохраняет детерминированность результата
|
|
32
|
+
/// - Функция использует циклический доступ к словам.
|
|
33
|
+
/// При запросе количества слов, превышающего длину списка,
|
|
34
|
+
/// последовательность начинается заново с первого слова.
|
|
35
|
+
/// Это реализовано через операцию модуля (%).
|
|
36
|
+
/// - Все слова в списке должны быть в нижнем регистре
|
|
37
|
+
/// для корректной работы функции `string-capitalize()`.
|
|
38
|
+
/// Капитализация применяется только к первой букве
|
|
39
|
+
/// итоговой строки.
|
|
40
|
+
/// - При передаче пустого списка и ненулевого значения
|
|
41
|
+
/// `$word-count` произойдет ошибка при попытке обращения к
|
|
42
|
+
/// `list.nth()` с индексом. Рекомендуется проверять список
|
|
43
|
+
/// на пустоту в вызывающем коде.
|
|
44
|
+
/// - Функция не проверяет, являются ли все элементы
|
|
45
|
+
/// списка строками. Передача списка с нестроковыми
|
|
46
|
+
/// элементами может привести к непредсказуемому поведению.
|
|
47
|
+
/// ---
|
|
48
|
+
/// @name string-lorips
|
|
49
|
+
/// @group utilities-helpers
|
|
50
|
+
/// @since 2026.01.18
|
|
51
|
+
/// @access public
|
|
52
|
+
/// @author Murad Rustamov (therteenten)
|
|
53
|
+
/// @link https://sourcecraft.dev/users/therteenten/overview SourceCraft - therteenten
|
|
54
|
+
/// @link https://sourcecraft.dev/omnisass/library SourceCraft - OmniSass
|
|
55
|
+
/// @link https://sass-lang.com/documentation/modules/string См. также: Официальная документация Sass - Модуль String
|
|
56
|
+
/// @link https://sass-lang.com/documentation/modules/list См. также: Официальная документация Sass - Модуль List
|
|
57
|
+
/// @link https://sass-lang.com/documentation/values/strings См. также: Официальная документация Sass - Тип данных "Строки"
|
|
58
|
+
/// @link https://en.wikipedia.org/wiki/Lorem_ipsum См. также: Wikipedia - Lorem ipsum
|
|
59
|
+
/// @link https://developer.mozilla.org/en-US/docs/Web/CSS/content См. также: MDN Web Docs - CSS свойство content
|
|
60
|
+
/// @link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/repeat См. также: MDN Web Docs - Метод String.repeat()
|
|
61
|
+
/// @link https://css-tricks.com/snippets/sass/lorem-ipsum-generator/ См. также: CSS-Tricks - Генератор Lorem Ipsum на Sass
|
|
62
|
+
/// @link https://css-tricks.com/design-systems-with-sass-placeholders/ См. также: CSS-Tricks - Дизайн-системы с заполнителями
|
|
63
|
+
/// @link https://sass-guidelin.es/ru/#section-44 См. также: Sass Guidelines - Раздел про функции
|
|
64
|
+
/// @link https://loremipsum.io/ См. также: Lorem Ipsum - Генератор текста-заполнителя
|
|
65
|
+
/// @link https://www.lipsum.com/ См. также: Lipsum.com - Классический генератор Lorem Ipsum
|
|
66
|
+
/// @link https://github.com/sass/sass/issues/2871 См. также: GitHub - Обсуждение текстовых утилит в Sass
|
|
67
|
+
/// @link https://www.30secondsofcode.org/sass/p/1/string-repeat См. также: 30 seconds of code - Функция string-repeat
|
|
68
|
+
/// @example scss - Генерация текста с набором по умолчанию
|
|
69
|
+
/// @debug string-lorips(5); // "Lorem ipsum dolor sit amet."
|
|
70
|
+
/// @debug string-lorips(10); // "Lorem ipsum dolor sit amet consectetur adipiscing elit sed do."
|
|
71
|
+
/// @debug string-lorips(3); // "Lorem ipsum dolor."
|
|
72
|
+
/// @debug string-lorips(1); // "Lorem."
|
|
73
|
+
/// @debug string-lorips(); // "Lorem ipsum dolor sit amet consectetur adipiscing elit sed do."
|
|
74
|
+
/// @example scss - Генерация длинного текста (циклическое повторение)
|
|
75
|
+
/// @debug string-lorips(15); // "Lorem ipsum dolor sit amet consectetur adipiscing elit sed do eiusmod tempor incididunt ut labore."
|
|
76
|
+
/// @debug string-lorips(20); // "Lorem ipsum dolor sit amet consectetur adipiscing elit sed do eiusmod tempor incididunt ut labore et dolore magna aliqua ut."
|
|
77
|
+
/// @debug string-lorips(40); // "Lorem ipsum dolor sit amet consectetur adipiscing elit sed do eiusmod tempor incididunt ut labore et dolore magna aliqua ut enim ad minim veniam quis nostrud exercitation ullamco laboris nisi ut."
|
|
78
|
+
/// @example scss - Использование кастомного списка слов
|
|
79
|
+
/// $my-words: "hello" "world" "test" "example";
|
|
80
|
+
/// @debug string-lorips(5, $my-words); // "Hello world test example hello."
|
|
81
|
+
/// @debug string-lorips(3, $my-words); // "Hello world test."
|
|
82
|
+
/// @debug string-lorips(7, $my-words); // "Hello world test example hello world test."
|
|
83
|
+
/// @example scss - Граничные случаи
|
|
84
|
+
/// @debug string-lorips(0, ()); // Error: $n: calc(NaN) is not an int.
|
|
85
|
+
/// @debug string-lorips(5, ("single",)); // "Single single single single single."
|
|
86
|
+
/// @param {Number} $word-count [10] - Количество слов в
|
|
87
|
+
/// генерируемом тексте. Должно быть целым неотрицательным
|
|
88
|
+
/// числом. При значении 0 возвращается только точка.
|
|
89
|
+
/// При значении 1 возвращается одно слово с точкой.
|
|
90
|
+
/// Значение по умолчанию - 10 слов.
|
|
91
|
+
/// @param {List} $words-list [configs.$set-lorem-ipsum-words] -
|
|
92
|
+
/// Список слов для генерации текста. По умолчанию используется
|
|
93
|
+
/// глобальная переменная с классическим набором слов
|
|
94
|
+
/// Lorem Ipsum. Может быть передан любой список строк
|
|
95
|
+
/// (слов), которые будут использоваться циклически.
|
|
96
|
+
/// При пустом списке и ненулевом $word-count будет ошибка
|
|
97
|
+
/// выполнения при обращении к list.nth().
|
|
98
|
+
/// @return {String} - Текст-заполнитель указанной длины,
|
|
99
|
+
/// начинающийся с заглавной буквы и заканчивающийся точкой.
|
|
100
|
+
/// Если запрошено больше слов, чем в списке, набор слов
|
|
101
|
+
/// циклически повторяется с начала списка.
|
|
102
|
+
/// @throws {Error} - Выбрасывает ошибку, если в параметр передано
|
|
103
|
+
/// значение, не соответствующее необходимому типу:
|
|
104
|
+
///
|
|
105
|
+
/// - `$word-count` → `number`
|
|
106
|
+
/// - `$words-list` → `list`
|
|
107
|
+
@function string-lorips($word-count: 10, $words-list: configs.$set-lorem-ipsum-words) {
|
|
108
|
+
|
|
109
|
+
// Проверка типа первого параметра: ожидается числовое значение.
|
|
110
|
+
// Количество слов должно быть числом для использования в цикле
|
|
111
|
+
// и математических операциях с модулем.
|
|
112
|
+
@if not is-number($word-count) {
|
|
113
|
+
|
|
114
|
+
// Если $word-count не является числом, возвращаем ошибку через
|
|
115
|
+
// стандартную функцию логирования. Это предотвращает
|
|
116
|
+
// некорректные операции с нечисловыми типами данных.
|
|
117
|
+
@return log-invalid-type(
|
|
118
|
+
'string-lorips',
|
|
119
|
+
$word-count,
|
|
120
|
+
'$word-count',
|
|
121
|
+
'number'
|
|
122
|
+
);
|
|
123
|
+
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
// Проверка типа второго параметра: ожидается список (list).
|
|
127
|
+
// Список слов должен быть именно типом list для работы с
|
|
128
|
+
// функциями list.length() и list.nth().
|
|
129
|
+
@if not is-list($words-list) {
|
|
130
|
+
|
|
131
|
+
// Если $words-list не является списком, возвращаем ошибку.
|
|
132
|
+
// Проверка выполняется только если $word-count прошел валидацию.
|
|
133
|
+
@return log-invalid-type(
|
|
134
|
+
'string-lorips',
|
|
135
|
+
$words-list,
|
|
136
|
+
'$words-list',
|
|
137
|
+
'list'
|
|
138
|
+
);
|
|
139
|
+
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
// Все параметры прошли валидацию - генерируем текст-заполнитель.
|
|
143
|
+
@else {
|
|
144
|
+
|
|
145
|
+
// Использование предоставленного списка слов.
|
|
146
|
+
// Локальная переменная создается для удобства работы
|
|
147
|
+
// и лучшей читаемости кода.
|
|
148
|
+
$-words: $words-list;
|
|
149
|
+
|
|
150
|
+
// Инициализация переменной результата.
|
|
151
|
+
// Начальное значение null позволяет начать конкатенацию
|
|
152
|
+
// с первого слова без специальной обработки первого элемента.
|
|
153
|
+
$-result: null;
|
|
154
|
+
|
|
155
|
+
// Цикл генерации указанного количества слов.
|
|
156
|
+
// Цикл выполняется от 1 до $word-count включительно.
|
|
157
|
+
// Каждая итерация добавляет очередное слово из списка.
|
|
158
|
+
@for $i from 1 through $word-count {
|
|
159
|
+
|
|
160
|
+
// Вычисление индекса текущего слова в списке.
|
|
161
|
+
// Формула ($i - 1) % list.length($-words) + 1 обеспечивает:
|
|
162
|
+
// 1. Циклический доступ к словам при превышении длины списка
|
|
163
|
+
// 2. Корректную индексацию (от 1 до длины списка)
|
|
164
|
+
// 3. Последовательное прохождение по всему списку
|
|
165
|
+
$-word-index: ($i - 1) % list.length($-words) + 1;
|
|
166
|
+
|
|
167
|
+
// Получение слова по вычисленному индексу.
|
|
168
|
+
// list.nth() возвращает элемент списка по заданной позиции.
|
|
169
|
+
// Если список пустой и $word-count > 0, здесь будет ошибка.
|
|
170
|
+
$-word: list.nth($-words, $-word-index);
|
|
171
|
+
|
|
172
|
+
// Добавление слова к результату.
|
|
173
|
+
// Конкатенация накапливает слова в итоговой строке.
|
|
174
|
+
// При первой итерации $-result равен null, что приводит
|
|
175
|
+
// к начальному значению, равному $-word.
|
|
176
|
+
$-result: $-result + $-word;
|
|
177
|
+
|
|
178
|
+
// Добавление пробела после слова, если это не последнее слово.
|
|
179
|
+
// Условие $i != $word-count проверяет, не достигли ли мы
|
|
180
|
+
// запрошенного количества слов, чтобы не добавлять лишний пробел
|
|
181
|
+
// в конце строки перед точкой.
|
|
182
|
+
@if $i != $word-count {
|
|
183
|
+
$-result: $-result + " ";
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
// Возвращаем отформатированный результат.
|
|
189
|
+
// string-capitalize() делает первую букву заглавной,
|
|
190
|
+
// а добавление точки завершает предложение.
|
|
191
|
+
// Если $word-count = 0, $-result будет null, что после
|
|
192
|
+
// string-capitalize() станет пустой строкой, и результат
|
|
193
|
+
// будет просто ".".
|
|
194
|
+
@return string-capitalize($-result) + ".";
|
|
195
|
+
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
}
|