@omnisass/library 0.3.0 → 0.4.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 +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/misc/_url-encode.scss +2 -2
- 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-reverse.scss +139 -0
- package/package.json +1 -1
- package/package.scss +1 -1
- package/test2.sh +158 -0
- package/modules/utilities/setters/_index.scss +0 -3
|
@@ -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
|
+
}
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
@use '../../loggers/log-invalid-type' as *;
|
|
2
|
+
@use '../../validators/type-of/is-string' as *;
|
|
3
|
+
@use '../../validators/type-of/is-number' as *;
|
|
4
|
+
|
|
5
|
+
/// Повторяет строку указанное количество раз.
|
|
6
|
+
///
|
|
7
|
+
/// Функция создает новую строку путем конкатенации исходной
|
|
8
|
+
/// строки с собой заданное количество раз. Это полезно для
|
|
9
|
+
/// генерации повторяющихся паттернов, заполнителей, рамок
|
|
10
|
+
/// или любых других конструкций, требующих дублирования
|
|
11
|
+
/// строковых элементов.
|
|
12
|
+
///
|
|
13
|
+
/// Важные особенности функции:
|
|
14
|
+
/// - Выполняет строгую проверку типов обоих параметров
|
|
15
|
+
/// - Возвращает пустую строку при нулевом количестве повторов
|
|
16
|
+
/// - Обрабатывает целые положительные числа повторений
|
|
17
|
+
/// - Использует эффективный цикл для построения результата
|
|
18
|
+
/// - Сохраняет исходную строку без изменений
|
|
19
|
+
/// - Полезна для создания визуальных разделителей
|
|
20
|
+
/// - Может использоваться для генерации тестовых данных
|
|
21
|
+
/// - Подходит для построения ASCII-графики или рамок
|
|
22
|
+
/// - Обеспечивает детерминированный результат
|
|
23
|
+
/// - Совместима с многострочными строками и Unicode
|
|
24
|
+
/// - Функция использует простой цикл `for` для
|
|
25
|
+
/// конкатенации строк. Для большого количества повторов
|
|
26
|
+
/// (>1000) производительность может снижаться.
|
|
27
|
+
/// - Для работы с очень большими строками или
|
|
28
|
+
/// количеством повторов рекомендуется использовать
|
|
29
|
+
/// рекурсивную реализацию или мемоизацию.
|
|
30
|
+
/// ---
|
|
31
|
+
/// @name string-repeat
|
|
32
|
+
/// @group utilities-helpers
|
|
33
|
+
/// @since 2026.01.18
|
|
34
|
+
/// @access public
|
|
35
|
+
/// @author Murad Rustamov (therteenten)
|
|
36
|
+
/// @link https://sourcecraft.dev/users/therteenten/overview SourceCraft - therteenten
|
|
37
|
+
/// @link https://sourcecraft.dev/omnisass/library SourceCraft - OmniSass
|
|
38
|
+
/// @link https://sass-lang.com/documentation/modules/string См. также: Официальная документация Sass - Модуль String
|
|
39
|
+
/// @link https://sass-lang.com/documentation/values/strings См. также: Официальная документация Sass - Тип данных "Строки"
|
|
40
|
+
/// @link https://sass-lang.com/documentation/values/numbers См. также: Официальная документация Sass - Тип данных "Числа"
|
|
41
|
+
/// @link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/repeat См. также: MDN Web Docs - Метод String.repeat()
|
|
42
|
+
/// @link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/concat См. также: MDN Web Docs - Метод String.concat()
|
|
43
|
+
/// @link https://en.wikipedia.org/wiki/String_(computer_science)#Concatenation См. также: Wikipedia - Конкатенация строк
|
|
44
|
+
/// @link https://en.wikipedia.org/wiki/Iteration См. также: Wikipedia - Итерация (программирование)
|
|
45
|
+
/// @link https://css-tricks.com/snippets/sass/string-repetition-function/ См. также: CSS-Tricks - Функция повторения строк в Sass
|
|
46
|
+
/// @link https://css-tricks.com/sass-string-manipulation-functions/ См. также: CSS-Tricks - Функции для работы со строками в Sass
|
|
47
|
+
/// @link https://sass-guidelin.es/ru/#section-44 См. также: Sass Guidelines - Раздел про функции
|
|
48
|
+
/// @link https://github.com/sass/sass/issues/1402 См. также: GitHub - Обсуждение строковых операций в Sass
|
|
49
|
+
/// @link https://www.30secondsofcode.org/sass/p/1/string-repeat См. также: 30 seconds of code - Функция string-repeat
|
|
50
|
+
/// @example scss - Базовое повторение строк
|
|
51
|
+
/// @debug string-repeat('a', 5); // "aaaaa"
|
|
52
|
+
/// @debug string-repeat('ab', 3); // "ababab"
|
|
53
|
+
/// @debug string-repeat('test', 2); // "testtest"
|
|
54
|
+
/// @debug string-repeat('', 10); // ""
|
|
55
|
+
/// @example scss - Создание разделителей и рамок
|
|
56
|
+
/// @debug string-repeat('-', 20); // "--------------------"
|
|
57
|
+
/// @debug string-repeat('* ', 10); // "* * * * * * * * * * "
|
|
58
|
+
/// @debug string-repeat('=-', 8); // "-=-=-=-=-=-=-=-=-=-="
|
|
59
|
+
/// @debug string-repeat('▮', 5); // "▮▮▮▮▮"
|
|
60
|
+
/// @example scss - Граничные случаи
|
|
61
|
+
/// @debug string-repeat('abc', 0); // ""
|
|
62
|
+
/// @debug string-repeat('abc', 1); // "abc"
|
|
63
|
+
/// @debug string-repeat(' ', 10); // " "
|
|
64
|
+
/// @debug string-repeat('\n', 3); // "nnn"
|
|
65
|
+
/// @param {String} $string - Исходная строка для повторения.
|
|
66
|
+
/// Может быть любой строкой, включая пустую строку,
|
|
67
|
+
/// многострочные строки, строки с пробелами и Unicode-
|
|
68
|
+
/// символами. Каждое повторение будет точной копией
|
|
69
|
+
/// исходной строки.
|
|
70
|
+
/// @param {Number} $repetitions - Количество повторений
|
|
71
|
+
/// строки. Должно быть целым неотрицательным числом.
|
|
72
|
+
/// При значении 0 возвращается пустая строка. При
|
|
73
|
+
/// значении 1 возвращается исходная строка без изменений.
|
|
74
|
+
/// @return {String} - Новая строка, состоящая из исходной
|
|
75
|
+
/// строки, повторенной указанное количество раз. Если
|
|
76
|
+
/// $repetitions равно 0, возвращается пустая строка.
|
|
77
|
+
/// Если $repetitions равно 1, возвращается исходная
|
|
78
|
+
/// строка. Для отрицательных чисел поведение не определено.
|
|
79
|
+
/// @throws {Error} - Выбрасывает ошибку, если в параметр передано
|
|
80
|
+
/// значение, не соответствующее необходимому типу:
|
|
81
|
+
///
|
|
82
|
+
/// - `$string` → `string`
|
|
83
|
+
/// - `$repetitions` → `number`
|
|
84
|
+
@function string-repeat($string, $repetitions) {
|
|
85
|
+
|
|
86
|
+
// Проверка типа первого параметра: ожидается строковое значение.
|
|
87
|
+
// Функция предназначена для повторения именно строк, так как
|
|
88
|
+
// операция конкатенации определена только для строковых значений.
|
|
89
|
+
@if not is-string($string) {
|
|
90
|
+
|
|
91
|
+
// Если $string не является строкой, возвращаем ошибку через
|
|
92
|
+
// стандартную функцию логирования. Это предотвращает
|
|
93
|
+
// попытки конкатенации нестроковых значений.
|
|
94
|
+
@return log-invalid-type(
|
|
95
|
+
'string-repeat',
|
|
96
|
+
$string,
|
|
97
|
+
'$string',
|
|
98
|
+
'string'
|
|
99
|
+
);
|
|
100
|
+
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
// Проверка типа второго параметра: ожидается числовое значение.
|
|
104
|
+
// Количество повторений должно быть числом, чтобы можно было
|
|
105
|
+
// использовать его в цикле for.
|
|
106
|
+
@else if not is-number($repetitions) {
|
|
107
|
+
|
|
108
|
+
// Если $repetitions не является числом, возвращаем ошибку.
|
|
109
|
+
// Проверка выполняется только если $string прошел валидацию.
|
|
110
|
+
@return log-invalid-type(
|
|
111
|
+
'string-repeat',
|
|
112
|
+
$repetitions,
|
|
113
|
+
'$repetitions',
|
|
114
|
+
'number'
|
|
115
|
+
);
|
|
116
|
+
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
// Все параметры прошли валидацию - выполняем повторение строки.
|
|
120
|
+
@else {
|
|
121
|
+
|
|
122
|
+
// Инициализация переменной результата.
|
|
123
|
+
// Начальное значение null позволяет начать конкатенацию
|
|
124
|
+
// с первой итерации цикла без специальной обработки.
|
|
125
|
+
$-result: null;
|
|
126
|
+
|
|
127
|
+
// Цикл повторения строки заданное количество раз.
|
|
128
|
+
// Цикл выполняется от 1 до $repetitions включительно.
|
|
129
|
+
// Каждая итерация добавляет исходную строку к результату.
|
|
130
|
+
@for $i from 1 through $repetitions {
|
|
131
|
+
|
|
132
|
+
// Конкатенация текущего результата с исходной строкой.
|
|
133
|
+
// При первой итерации $-result равен null, что приводит
|
|
134
|
+
// к начальному значению, равному $string.
|
|
135
|
+
$-result: $-result + $string;
|
|
136
|
+
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
// Возвращаем итоговую строку после всех повторений.
|
|
140
|
+
// Если $repetitions было 0, цикл не выполнится ни разу,
|
|
141
|
+
// и функция вернет null, который в контексте строки
|
|
142
|
+
// преобразуется в пустую строку.
|
|
143
|
+
@return $-result;
|
|
144
|
+
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
}
|
|
@@ -0,0 +1,139 @@
|
|
|
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
|
+
/// "hello" превращается в "olleh". Это полезно для различных
|
|
10
|
+
/// текстовых манипуляций, создания зеркальных эффектов в дизайне
|
|
11
|
+
/// или обработки строк в специфичных сценариях.
|
|
12
|
+
///
|
|
13
|
+
/// Важные особенности функции:
|
|
14
|
+
/// - Сохраняет все символы исходной строки без изменений
|
|
15
|
+
/// - Работает с любыми символами, включая Unicode, пробелы, цифры
|
|
16
|
+
/// - Выполняет строгую проверку типа входного параметра
|
|
17
|
+
/// - Использует цикл для итерации по символам строки в обратном порядке
|
|
18
|
+
/// - Возвращает пустую строку для пустого входного значения
|
|
19
|
+
/// - Полезна для создания палиндромов или проверки симметрии текста
|
|
20
|
+
/// - Может использоваться для зеркального отображения текста в CSS
|
|
21
|
+
/// - Подходит для шифрования простых текстовых преобразований
|
|
22
|
+
/// - Обрабатывает строки любой длины
|
|
23
|
+
/// - Совместима с многострочными строками
|
|
24
|
+
/// - Сохраняет пробелы и специальные символы
|
|
25
|
+
/// - Функция использует цикл for с обратным порядком
|
|
26
|
+
/// итерации `(from $-length through 1)`. Это эффективный
|
|
27
|
+
/// способ перевернуть строку в Sass.
|
|
28
|
+
/// - Для палиндромов (строк, которые читаются одинаково
|
|
29
|
+
/// слева направо и справа налево) функция вернет исходную
|
|
30
|
+
/// строку без изменений.
|
|
31
|
+
/// - Функция корректно работает с Unicode-символами
|
|
32
|
+
/// (например, эмодзи или символами нелатинских алфавитов),
|
|
33
|
+
/// так как `string.slice()` в Sass правильно обрабатывает
|
|
34
|
+
/// Unicode.
|
|
35
|
+
/// - Производительность функции снижается для очень
|
|
36
|
+
/// длинных строк (сотни символов), так как каждый символ
|
|
37
|
+
/// обрабатывается в отдельной итерации цикла.
|
|
38
|
+
/// ---
|
|
39
|
+
/// @name string-reverse
|
|
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/Array/reverse См. также: MDN Web Docs - Метод Array.reverse()
|
|
50
|
+
/// @link https://en.wikipedia.org/wiki/Palindrome См. также: Wikipedia - Палиндром
|
|
51
|
+
/// @link https://en.wikipedia.org/wiki/String_(computer_science) См. также: Wikipedia - Строка (информатика)
|
|
52
|
+
/// @link https://css-tricks.com/snippets/sass/string-reverse-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-reverse См. также: 30 seconds of code - Функция string-reverse
|
|
57
|
+
/// @example scss - Базовое использование
|
|
58
|
+
/// @debug string-reverse("hello"); // "olleh"
|
|
59
|
+
/// @debug string-reverse("world"); // "dlrow"
|
|
60
|
+
/// @debug string-reverse("12345"); // "54321"
|
|
61
|
+
/// @debug string-reverse(""); // ""
|
|
62
|
+
/// @debug string-reverse("a"); // "a"
|
|
63
|
+
/// @example scss - Работа с пробелами и специальными символами
|
|
64
|
+
/// @debug string-reverse("hello world"); // "dlrow olleh"
|
|
65
|
+
/// @debug string-reverse("a b c"); // "c b a"
|
|
66
|
+
/// @debug string-reverse("test!"); // "!tset"
|
|
67
|
+
/// @debug string-reverse("привет"); // "тевирп"
|
|
68
|
+
/// @example scss - Создание зеркальных эффектов
|
|
69
|
+
/// @debug string-reverse("CSS"); // "SSC"
|
|
70
|
+
/// @debug string-reverse("level"); // "level" (палиндром)
|
|
71
|
+
/// @debug string-reverse("radar"); // "radar" (палиндром)
|
|
72
|
+
/// @debug string-reverse("madam"); // "madam" (палиндром)
|
|
73
|
+
/// @param {String} $string - Исходная строка для переворачивания.
|
|
74
|
+
/// Может быть любой строкой: пустой, односимвольной,
|
|
75
|
+
/// многосимвольной, содержащей пробелы, Unicode-символы,
|
|
76
|
+
/// цифры или специальные символы. Все символы сохраняются
|
|
77
|
+
/// и меняют только порядок следования.
|
|
78
|
+
/// @return {String} - Новая строка, содержащая все символы
|
|
79
|
+
/// исходной строки в обратном порядке. Для пустой строки
|
|
80
|
+
/// возвращается пустая строка. Для строки из одного символа
|
|
81
|
+
/// возвращается та же строка (так как порядок не меняется).
|
|
82
|
+
/// @throws {Error} - Выбрасывает ошибку, если в параметр передано
|
|
83
|
+
/// значение, не соответствующее необходимому типу:
|
|
84
|
+
///
|
|
85
|
+
/// - `$string` → `string`
|
|
86
|
+
@function string-reverse($string) {
|
|
87
|
+
|
|
88
|
+
// Проверка типа входного параметра: ожидается строковое значение.
|
|
89
|
+
// Функция предназначена для работы исключительно со строками,
|
|
90
|
+
// так как операция реверса имеет смысл только для последовательности
|
|
91
|
+
// символов.
|
|
92
|
+
@if not is-string($string) {
|
|
93
|
+
|
|
94
|
+
// Если $string не является строкой, возвращаем ошибку через
|
|
95
|
+
// стандартную функцию логирования. Это предотвращает
|
|
96
|
+
// некорректные операции с нестроковыми типами данных.
|
|
97
|
+
@return log-invalid-type(
|
|
98
|
+
'string-reverse',
|
|
99
|
+
$string,
|
|
100
|
+
'$string',
|
|
101
|
+
'string'
|
|
102
|
+
);
|
|
103
|
+
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
// Параметр прошел валидацию - переворачиваем строку.
|
|
107
|
+
@else {
|
|
108
|
+
|
|
109
|
+
// Инициализация переменной результата.
|
|
110
|
+
// Начальное значение null позволяет начать конкатенацию
|
|
111
|
+
// с первого символа без специальной обработки.
|
|
112
|
+
$-result: null;
|
|
113
|
+
|
|
114
|
+
// Определение длины входной строки.
|
|
115
|
+
// Длина используется для итерации по символам строки
|
|
116
|
+
// в обратном порядке.
|
|
117
|
+
$-length: string.length($string);
|
|
118
|
+
|
|
119
|
+
// Цикл итерации по символам строки в обратном порядке.
|
|
120
|
+
// Начинаем с последнего символа (индекс $-length) и
|
|
121
|
+
// движемся к первому символу (индекс 1).
|
|
122
|
+
@for $i from $-length through 1 {
|
|
123
|
+
|
|
124
|
+
// Извлечение текущего символа строки по индексу.
|
|
125
|
+
// string.slice($string, $i, $i) возвращает один символ
|
|
126
|
+
// на позиции $i. Индексация в Sass начинается с 1.
|
|
127
|
+
$-result: $-result + string.slice($string, $i, $i);
|
|
128
|
+
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
// Возвращаем перевернутую строку.
|
|
132
|
+
// Если исходная строка была пустой, $-length = 0,
|
|
133
|
+
// цикл не выполнится ни разу, и функция вернет null,
|
|
134
|
+
// который в контексте строки преобразуется в пустую строку.
|
|
135
|
+
@return $-result;
|
|
136
|
+
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@omnisass/library",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.4.0",
|
|
4
4
|
"description": "Библиотека функций и миксинов, написанная на языке CSS-препроцессора Sass. Она предназначена для того, чтобы упростить, ускорить и улучшить процесс создания стилей для веб-сайтов.",
|
|
5
5
|
"main": "index.scss",
|
|
6
6
|
"scripts": {
|
package/package.scss
CHANGED
|
@@ -53,7 +53,7 @@ $description: "Набор утилит, миксинов, расширений
|
|
|
53
53
|
/// @name version
|
|
54
54
|
/// @access private
|
|
55
55
|
/// @type String | Number
|
|
56
|
-
$version: "0.
|
|
56
|
+
$version: "0.4.0";
|
|
57
57
|
|
|
58
58
|
/// Тип лицензии библиотеки - используется для указания
|
|
59
59
|
/// условий использования и распространения.
|