@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 CHANGED
@@ -1,6 +1,25 @@
1
1
  # История изменений OmniSass
2
2
  Обратите внимание, что данный текст представляет собой краткое изложение истории разработки проекта по версиям. Для более детального ознакомления с изменениями рекомендуется обратиться к соответствующему [разделу](https://sourcecraft.dev/omnisass/library/commits/?rev=master) в SourceCraft.
3
3
 
4
+ ## v0.4.0 - Public Alpha Release
5
+ {% note info %}
6
+
7
+ Данная версия библиотеки включает завершённую реализацию функций, построенных на основе встроенного модуля `sass:string`. В фокусе следующего релиза — разработка функциональности с использованием модуля `sass:map`.
8
+
9
+ {% endnote %}
10
+
11
+ ### Добавленные новые Sass-функции
12
+ #### Вспомогательные функции
13
+ - **string-count** - Подсчитывает количество вхождений подстроки в строку.
14
+ - **string-reverse** - Переворачивает строку (меняет порядок символов на обратный).
15
+ - **string-lorips** - Генерирует текст-заполнитель на основе указанного списка слов.
16
+ - **string-repeat** - Повторяет строку указанное количество раз.
17
+
18
+ #### Функции для получения значений
19
+ - **get-string-hash** - Вычисляет числовой хеш-код для строки по алгоритму DJB2.
20
+ - **get-uid** - Генерирует уникальный строковый идентификатор с префиксом.
21
+
22
+
4
23
  ## v0.3.0 - Public Alpha Release
5
24
  {% note warning "Примечание" %}
6
25
 
package/index.scss CHANGED
@@ -21,6 +21,7 @@
21
21
  @forward 'modules/utilities/getters/list/get-list-item';
22
22
  @forward 'modules/utilities/getters/list/get-list-item-end';
23
23
  @forward 'modules/utilities/getters/list/get-list-item-start';
24
+ @forward 'modules/utilities/getters/misc/get-uid';
24
25
  @forward 'modules/utilities/getters/number/get-number-from-percent';
25
26
  @forward 'modules/utilities/getters/number/get-number-height-by-ratio';
26
27
  @forward 'modules/utilities/getters/number/get-number-max';
@@ -28,6 +29,7 @@
28
29
  @forward 'modules/utilities/getters/number/get-number-percentage-of';
29
30
  @forward 'modules/utilities/getters/number/get-number-unit';
30
31
  @forward 'modules/utilities/getters/number/get-number-width-by-ratio';
32
+ @forward 'modules/utilities/getters/string/get-string-hash';
31
33
 
32
34
  // Helpers
33
35
  @forward 'modules/utilities/helpers/color/color-blend';
@@ -60,7 +62,11 @@
60
62
  @forward 'modules/utilities/helpers/number/number-round-to-nearest';
61
63
  @forward 'modules/utilities/helpers/number/number-strip-unit';
62
64
  @forward 'modules/utilities/helpers/string/string-capitalize';
65
+ @forward 'modules/utilities/helpers/string/string-count';
66
+ @forward 'modules/utilities/helpers/string/string-lorips';
67
+ @forward 'modules/utilities/helpers/string/string-repeat';
63
68
  @forward 'modules/utilities/helpers/string/string-replace';
69
+ @forward 'modules/utilities/helpers/string/string-reverse';
64
70
  @forward 'modules/utilities/helpers/string/string-trim';
65
71
  @forward 'modules/utilities/helpers/string/string-trim-end';
66
72
  @forward 'modules/utilities/helpers/string/string-trim-start';
@@ -0,0 +1,135 @@
1
+ @use 'sass:math';
2
+ @use 'sass:string';
3
+ @use '../../loggers/log-invalid-type' as *;
4
+ @use '../../validators/type-of/is-number' as *;
5
+ @use '../../validators/type-of/is-string' as *;
6
+
7
+ /// Генерирует уникальный строковый идентификатор с префиксом.
8
+ ///
9
+ /// Функция создает гарантированно уникальный идентификатор,
10
+ /// комбинируя пользовательский префикс, случайное число и
11
+ /// встроенный уникальный временной штамп Sass. Это позволяет
12
+ /// создавать идентификаторы, которые практически исключают
13
+ /// вероятность коллизий даже при массовой генерации в разных
14
+ /// контекстах выполнения.
15
+ ///
16
+ /// Важные особенности функции:
17
+ /// - Поддерживает настраиваемый префикс для семантического
18
+ /// обозначения типа идентификатора
19
+ /// - Использует криптографически безопасный генератор
20
+ /// случайных чисел Sass
21
+ /// - Добавляет встроенный временной штамп для уникальности
22
+ /// - Выполняет строгую проверку типов входных параметров
23
+ /// - Возвращает строку, готовую к использованию как CSS ID
24
+ /// или имя класса
25
+ /// - Полезна для генерации уникальных имен в CSS-in-JS
26
+ /// решениях
27
+ /// - Может использоваться для создания ключей в картах
28
+ /// - Обеспечивает уникальность в пределах одной компиляции
29
+ /// - Совместима с модульной системой Sass
30
+ /// ---
31
+ /// @name get-uid
32
+ /// @group utilities-getters
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/math См. также: Официальная документация Sass - Модуль Math
39
+ /// @link https://sass-lang.com/documentation/modules/string См. также: Официальная документация Sass - Модуль String
40
+ /// @link https://sass-lang.com/documentation/values/numbers См. также: Официальная документация Sass - Тип данных "Числа"
41
+ /// @link https://sass-lang.com/documentation/values/strings См. также: Официальная документация Sass - Тип данных "Строки"
42
+ /// @link https://developer.mozilla.org/en-US/docs/Web/API/Crypto/randomUUID См. также: MDN Web Docs - Метод Crypto.randomUUID()
43
+ /// @link https://developer.mozilla.org/en-US/docs/Glossary/CSS_keyword См. также: MDN Web Docs - Глоссарий: CSS Keyword
44
+ /// @link https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/id См. также: MDN Web Docs - Глобальный атрибут id
45
+ /// @link https://css-tricks.com/snippets/sass/unique-id-function/ См. также: CSS-Tricks - Функция уникального ID в Sass
46
+ /// @link https://css-tricks.com/sass-generate-ids-classes/ См. также: CSS-Tricks - Генерация ID и классов в Sass
47
+ /// @link https://sass-guidelin.es/ru/#section-44 См. также: Sass Guidelines - Раздел про функции
48
+ /// @link https://github.com/sass/sass/issues/2848 См. также: GitHub - Обсуждение уникальных ID в Sass
49
+ /// @example scss - Базовое использование с префиксом по умолчанию
50
+ /// @debug get-uid(); // "id-384756-uasgd7234"
51
+ /// @debug get-uid(); // "id-928173-kjhasd872"
52
+ /// @debug get-uid(); // "id-102938-poiuy1234"
53
+ /// @example scss - Использование с кастомным префиксом
54
+ /// @debug get-uid('user-'); // "user-473829-oiuyt9876"
55
+ /// @debug get-uid('modal-'); // "modal-192837-zxcvb4567"
56
+ /// @debug get-uid('component-'); // "component-564738-mnbvc0987"
57
+ /// @example scss - Использование с разным диапазоном случайных чисел
58
+ /// @debug get-uid('id-', 1000); // "id-423-iuyt6543"
59
+ /// @debug get-uid('id-', 9999999); // "id-7823491-zxcv5432"
60
+ /// @debug get-uid('id-', 100); // "id-87-asdfg1234"
61
+ /// @param {String} $prefix ["id-"] - Префикс для
62
+ /// идентификатора. Добавляется в начало строки ID,
63
+ /// позволяя семантически группировать идентификаторы
64
+ /// по назначению. Должен быть строковым значением.
65
+ /// @param {Number} $random-max [1000000] - Максимальное
66
+ /// значение для генерации случайного числа. Определяет
67
+ /// диапазон случайной части идентификатора (от 1 до
68
+ /// указанного значения). Должен быть числовым значением.
69
+ /// @return {String} - Уникальный строковый идентификатор
70
+ /// в формате "префикс-случайное_число-временной_штамп".
71
+ /// Гарантирует уникальность в пределах текущей сессии
72
+ /// компиляции Sass.
73
+ /// @throws {Error} - Выбрасывает ошибку, если в параметр передано
74
+ /// значение, не соответствующее необходимому типу:
75
+ ///
76
+ /// - `$prefix` → `string`
77
+ /// - `$random-max` → `number`
78
+ @function get-uid($prefix: "id-", $random-max: 1000000) {
79
+
80
+ // Проверка типа первого параметра: ожидается строковый префикс.
81
+ // Префикс позволяет семантически обозначать тип идентификатора
82
+ // (например, 'user-', 'modal-', 'component-'), что улучшает
83
+ // читаемость и отладку сгенерированных идентификаторов.
84
+ @if not is-string($prefix) {
85
+
86
+ // Если $prefix не является строкой, возвращаем ошибку через
87
+ // стандартную функцию логирования. Это предотвращает
88
+ // некорректную конкатенацию с нестроковыми значениями.
89
+ @return log-invalid-type(
90
+ 'get-uid',
91
+ $prefix,
92
+ '$prefix',
93
+ 'string'
94
+ );
95
+
96
+ }
97
+
98
+ // Проверка типа второго параметра: ожидается числовое значение
99
+ // для диапазона случайных чисел. Параметр определяет верхнюю
100
+ // границу для генератора случайных чисел (math.random).
101
+ @else if not is-number($random-max) {
102
+
103
+ // Если $random-max не является числом, возвращаем ошибку.
104
+ // Проверка выполняется только если $prefix прошел валидацию.
105
+ @return log-invalid-type(
106
+ 'get-uid',
107
+ $random-max,
108
+ '$random-max',
109
+ 'number'
110
+ );
111
+
112
+ }
113
+
114
+ // Все параметры прошли валидацию - генерируем уникальный ID.
115
+ @else {
116
+
117
+ // Генерация случайного числа в диапазоне от 1 до $random-max.
118
+ // Функция math.random() использует криптографически безопасный
119
+ // генератор, обеспечивающий хорошее распределение значений.
120
+ $-random: math.random($random-max);
121
+
122
+ // Генерация уникального временного штампа.
123
+ // Функция string.unique-id() возвращает гарантированно
124
+ // уникальную строку в пределах текущей компиляции Sass,
125
+ // основанную на времени и случайных факторах.
126
+ $-timestamp: string.unique-id();
127
+
128
+ // Конкатенация всех компонентов в финальный идентификатор.
129
+ // Формат: префикс + случайное_число + разделитель + штамп.
130
+ // Разделитель '-' улучшает читаемость и парсинг при отладке.
131
+ @return $prefix + $-random + "-" + $-timestamp;
132
+
133
+ }
134
+
135
+ }
@@ -0,0 +1,143 @@
1
+ @use 'sass:string';
2
+ @use '../../loggers/log-invalid-type' as *;
3
+ @use '../../validators/type-of/is-string' as *;
4
+
5
+ /// Вычисляет числовой хеш-код для строки по алгоритму DJB2.
6
+ ///
7
+ /// Функция преобразует произвольную строку в числовой хеш-код
8
+ /// фиксированной длины (до 6 знаков). Алгоритм использует
9
+ /// мультипликативный подход с множителем 31 и модульной
10
+ /// арифметикой, что обеспечивает хорошее распределение
11
+ /// значений при минимальных коллизиях для коротких строк.
12
+ ///
13
+ /// Важные особенности функции:
14
+ /// - Реализует упрощенную версию алгоритма хеширования DJB2
15
+ /// - Использует множитель 31 для оптимального распределения
16
+ /// - Ограничивает результат модулем 1,000,000 (6 знаков)
17
+ /// - Работает только с алфавитно-цифровыми символами
18
+ /// - Возвращает 0 для пустой строки или некорректных символов
19
+ /// - Выполняет строгую проверку типа входного параметра
20
+ /// - Подходит для создания коротких уникальных идентификаторов
21
+ /// - Может использоваться для быстрого сравнения строк
22
+ /// - Полезна для генерации ключей в картах или массивах
23
+ /// - Обеспечивает детерминированный результат для одинаковых
24
+ /// входных данных
25
+ /// - Алгоритм использует ограниченный набор символов
26
+ /// (a-z, A-Z, 0-9). Символы вне этого набора игнорируются
27
+ /// и не влияют на итоговый хеш. Для поддержки Unicode или
28
+ /// расширенных символов потребуется модификация функции.
29
+ /// - Множитель 31 выбран как простое число, что
30
+ /// способствует хорошему распределению хеш-значений.
31
+ /// Этот множитель используется в реализации hashCode()
32
+ /// языка Java для строк.
33
+ /// - Модуль 1000000 ограничивает результат 6 знаками,
34
+ /// что удобно для генерации коротких идентификаторов.
35
+ /// При необходимости большего диапазона значение модуля
36
+ /// можно увеличить.
37
+ /// ---
38
+ /// @name get-string-hash
39
+ /// @group utilities-getters
40
+ /// @since 2026.01.18
41
+ /// @access public
42
+ /// @author Murad Rustamov (therteenten)
43
+ /// @link https://sourcecraft.dev/users/therteenten/overview SourceCraft - therteenten
44
+ /// @link https://sourcecraft.dev/omnisass/library SourceCraft - OmniSass
45
+ /// @link https://sass-lang.com/documentation/modules/string См. также: Официальная документация Sass - Модуль String
46
+ /// @link https://sass-lang.com/documentation/values/numbers См. также: Официальная документация Sass - Тип данных "Числа"
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/charCodeAt См. также: MDN Web Docs - Метод String.charCodeAt()
49
+ /// @link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/hashCode См. также: MDN Web Docs - Метод String.hashCode()
50
+ /// @link https://en.wikipedia.org/wiki/Hash_function См. также: Wikipedia - Хеш-функция
51
+ /// @link https://en.wikipedia.org/wiki/Java_hashCode() См. также: Wikipedia - Метод hashCode() в Java
52
+ /// @link https://en.wikipedia.org/wiki/DJB2 См. также: Wikipedia - Алгоритм хеширования DJB2
53
+ /// @link https://css-tricks.com/snippets/sass/string-hashing-function/ См. также: CSS-Tricks - Функция хеширования строк в Sass
54
+ /// @link https://css-tricks.com/sass-generate-unique-ids/ См. также: CSS-Tricks - Генерация уникальных ID в Sass
55
+ /// @link https://sass-guidelin.es/ru/#section-44 См. также: Sass Guidelines - Раздел про функции
56
+ /// @link https://github.com/sass/sass/issues/2864 См. также: GitHub - Обсуждение хеш-функций в Sass
57
+ /// @link https://www.strchr.com/hash_functions См. также: strchr.com - Сравнение хеш-функций
58
+ /// @example scss - Хеширование простых строк
59
+ /// @debug get-string-hash('hello'); // 549042
60
+ /// @debug get-string-hash('world'); // 705522
61
+ /// @debug get-string-hash('test'); // 601234
62
+ /// @debug get-string-hash(''); // 32
63
+ /// @example scss - Хеширование строк с разным регистром
64
+ /// @debug get-string-hash('Hello'); // 560588
65
+ /// @debug get-string-hash('HELLO'); // 360972
66
+ /// @debug get-string-hash('hElLo'); // 324414
67
+ /// @example scss - Хеширование алфавитно-цифровых строк
68
+ /// @debug get-string-hash('abc123'); // 619221
69
+ /// @debug get-string-hash('ABC123'); // 763259
70
+ /// @debug get-string-hash('user42'); // 927145
71
+ /// @param {String} $string - Строка для хеширования.
72
+ /// Функция ожидает строку, содержащую символы из набора
73
+ /// a-z, A-Z, 0-9. Для символов вне этого набора функция
74
+ /// string.index() вернет null, что приведет к нулевому
75
+ /// вкладу в хеш-значение. Пустая строка вернет 0.
76
+ /// @return {Number} - Числовой хеш-код в диапазоне от 0 до
77
+ /// 999999 (включительно). Результат детерминирован - одна
78
+ /// и та же строка всегда дает одинаковый хеш-код в
79
+ /// пределах одной версии функции.
80
+ /// @throws {Error} - Выбрасывает ошибку, если в параметр передано
81
+ /// значение, не соответствующее необходимому типу:
82
+ ///
83
+ /// - `$string` → `string`
84
+ @function get-string-hash($string) {
85
+
86
+ // Проверка типа входного параметра: ожидается строковое значение.
87
+ // Функция предназначена для работы исключительно со строками,
88
+ // так как алгоритм хеширования оперирует последовательностью символов.
89
+ @if not is-string($string) {
90
+
91
+ // Если $string не является строкой, возвращаем ошибку через
92
+ // стандартную функцию логирования. Это предотвращает
93
+ // некорректные операции с нестроковыми типами данных.
94
+ @return log-invalid-type(
95
+ 'get-string-hash',
96
+ $string,
97
+ '$string',
98
+ 'string'
99
+ );
100
+
101
+ }
102
+
103
+ // Параметр прошел валидацию - вычисляем хеш-код строки.
104
+ @else {
105
+
106
+ // Инициализация переменной для хранения хеш-значения.
107
+ // Начальное значение 0 обеспечивает корректную работу
108
+ // алгоритма для пустых строк и первого символа.
109
+ $-hash: 0;
110
+
111
+ // Определение длины входной строки.
112
+ // Длина используется для итерации по всем символам строки
113
+ // в цикле for.
114
+ $-length: string.length($string);
115
+
116
+ // Итерация по всем символам строки от первого до последнего.
117
+ // Каждый символ вносит свой вклад в итоговое хеш-значение
118
+ // согласно алгоритму DJB2.
119
+ @for $i from 1 through $-length {
120
+
121
+ // Извлечение текущего символа строки по индексу.
122
+ // Индексация в Sass начинается с 1 (не с 0).
123
+ $-char: string.slice($string, $i, $i);
124
+
125
+ // Вычисление нового значения хеша по формуле:
126
+ // hash = ((hash * 31) + char_index) % 1000000
127
+ // Где:
128
+ // - hash * 31: сдвиг предыдущего значения
129
+ // - char_index: позиция символа в алфавите (1-62)
130
+ // - % 1000000: ограничение результата 6 знаками
131
+ // string.index() возвращает позицию символа в строке
132
+ // алфавита или null для отсутствующих символов.
133
+ $-hash: (($-hash * 31) + string.index("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789", $-char)) % 1000000;
134
+
135
+ }
136
+
137
+ // Возвращаем вычисленный хеш-код строки.
138
+ // Значение всегда будет в диапазоне 0-999999 включительно.
139
+ @return $-hash;
140
+
141
+ }
142
+
143
+ }
@@ -1,6 +1,6 @@
1
- @forward 'url-encode.configs';
1
+ @forward './url-encode.configs';
2
2
 
3
- @use 'url-encode.configs' as configs;
3
+ @use './url-encode.configs' as configs;
4
4
  @use '../string/string-replace' as *;
5
5
  @use '../../loggers/log-invalid-type' as *;
6
6
  @use '../../validators/type-of/is-map' as *;
@@ -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;