@omnisass/library 0.2.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 +5 -0
- package/LICENSE +21 -0
- package/README.md +2 -0
- package/_configs.scss +68 -0
- package/index.scss +95 -0
- package/modules/utilities/converters/_convert-camel2kebab.scss +186 -0
- package/modules/utilities/converters/_convert-em2px.scss +239 -0
- package/modules/utilities/converters/_convert-hex2rgb.scss +97 -0
- package/modules/utilities/converters/_convert-hex2rgba.scss +124 -0
- package/modules/utilities/converters/_convert-kebab2camel.scss +232 -0
- package/modules/utilities/converters/_convert-kebab2snake.scss +118 -0
- package/modules/utilities/converters/_convert-px2em.scss +236 -0
- package/modules/utilities/converters/_convert-px2rem.scss +180 -0
- package/modules/utilities/converters/_convert-rem2px.scss +207 -0
- package/modules/utilities/converters/_convert-snake2kebab.scss +173 -0
- package/modules/utilities/getters/color/_get-color-brightness.scss +138 -0
- package/modules/utilities/getters/color/_get-color-darkest.scss +178 -0
- package/modules/utilities/getters/list/_get-list-item-end.scss +114 -0
- package/modules/utilities/getters/list/_get-list-item-start.scss +109 -0
- package/modules/utilities/getters/list/_get-list-item.scss +179 -0
- package/modules/utilities/getters/number/_get-number-from-percent.scss +139 -0
- package/modules/utilities/getters/number/_get-number-height-by-ratio.scss +199 -0
- package/modules/utilities/getters/number/_get-number-max.scss +168 -0
- package/modules/utilities/getters/number/_get-number-min.scss +162 -0
- package/modules/utilities/getters/number/_get-number-percentage-of.scss +149 -0
- package/modules/utilities/getters/number/_get-number-unit.scss +111 -0
- package/modules/utilities/getters/number/_get-number-width-by-ratio.scss +223 -0
- package/modules/utilities/helpers/color/_color-blend-steps.scss +210 -0
- package/modules/utilities/helpers/color/_color-blend.scss +183 -0
- package/modules/utilities/helpers/color/_color-hue-shift.scss +148 -0
- package/modules/utilities/helpers/color/_color-scale.scss +208 -0
- package/modules/utilities/helpers/color/_color-shade.scss +113 -0
- package/modules/utilities/helpers/color/_color-tint.scss +118 -0
- package/modules/utilities/helpers/color/_color-triad.scss +141 -0
- package/modules/utilities/helpers/list/_list-dedupe.scss +146 -0
- package/modules/utilities/helpers/list/_list-insert-at.scss +166 -0
- package/modules/utilities/helpers/list/_list-merge.scss +86 -0
- package/modules/utilities/helpers/list/_list-remove-at.scss +160 -0
- package/modules/utilities/helpers/list/_list-sum-numbers-safe.scss +175 -0
- package/modules/utilities/helpers/list/_list-sum-numbers.scss +128 -0
- package/modules/utilities/helpers/misc/_url-encode.configs.scss +64 -0
- package/modules/utilities/helpers/misc/_url-encode.scss +148 -0
- package/modules/utilities/helpers/number/_number-ceil-to.scss +111 -0
- package/modules/utilities/helpers/number/_number-clamp-max.scss +92 -0
- package/modules/utilities/helpers/number/_number-clamp-min.scss +100 -0
- package/modules/utilities/helpers/number/_number-clamp.scss +109 -0
- package/modules/utilities/helpers/number/_number-denormalize.scss +172 -0
- package/modules/utilities/helpers/number/_number-fibonacci.scss +235 -0
- package/modules/utilities/helpers/number/_number-floor-to.scss +114 -0
- package/modules/utilities/helpers/number/_number-format-with-separator.scss +122 -0
- package/modules/utilities/helpers/number/_number-normalize.scss +160 -0
- package/modules/utilities/helpers/number/_number-random-between-int.scss +84 -0
- package/modules/utilities/helpers/number/_number-random-between.scss +120 -0
- package/modules/utilities/helpers/number/_number-range.scss +268 -0
- package/modules/utilities/helpers/number/_number-round-to-nearest.scss +131 -0
- package/modules/utilities/helpers/number/_number-round-to.scss +118 -0
- package/modules/utilities/helpers/number/_number-strip-unit.scss +97 -0
- package/modules/utilities/helpers/string/_string-capitalize.scss +84 -0
- package/modules/utilities/helpers/string/_string-replace.scss +69 -0
- package/modules/utilities/helpers/string/_string-trim-end.scss +62 -0
- package/modules/utilities/helpers/string/_string-trim-start.scss +62 -0
- package/modules/utilities/helpers/string/_string-trim.scss +69 -0
- package/modules/utilities/loggers/_log-invalid-type.scss +151 -0
- package/modules/utilities/loggers/_log-invalid-value.scss +151 -0
- package/modules/utilities/setters/_index.scss +3 -0
- package/modules/utilities/validators/color/_is-color-light.scss +132 -0
- package/modules/utilities/validators/color/_is-color-list.scss +124 -0
- package/modules/utilities/validators/list/_is-list-contained.scss +65 -0
- package/modules/utilities/validators/misc/_is-time.scss +115 -0
- package/modules/utilities/validators/number/_is-int-even.scss +69 -0
- package/modules/utilities/validators/number/_is-int-odd.scss +70 -0
- package/modules/utilities/validators/number/_is-int.scss +124 -0
- package/modules/utilities/validators/number/_is-number-has-unit.scss +85 -0
- package/modules/utilities/validators/number/_is-number-negative.scss +76 -0
- package/modules/utilities/validators/number/_is-number-positive.scss +74 -0
- package/modules/utilities/validators/number/_is-number-unitless.scss +88 -0
- package/modules/utilities/validators/number/_is-number-zero.scss +75 -0
- package/modules/utilities/validators/string/_is-string-contained.scss +108 -0
- package/modules/utilities/validators/string/_is-string-empty.scss +56 -0
- package/modules/utilities/validators/string/_is-string-ending-with.scss +66 -0
- package/modules/utilities/validators/string/_is-string-starting-with.scss +66 -0
- package/modules/utilities/validators/type-of/_is-boolean.scss +92 -0
- package/modules/utilities/validators/type-of/_is-color.scss +96 -0
- package/modules/utilities/validators/type-of/_is-list.scss +105 -0
- package/modules/utilities/validators/type-of/_is-map.scss +105 -0
- package/modules/utilities/validators/type-of/_is-number.scss +103 -0
- package/modules/utilities/validators/type-of/_is-string.scss +110 -0
- package/modules/utilities/validators/type-of/_is-type.scss +77 -0
- package/package.json +54 -0
- package/package.scss +156 -0
- package/test.md +168 -0
- package/test.scss +405 -0
- package/test.sh +149 -0
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
@use 'sass:math';
|
|
2
|
+
|
|
3
|
+
/// Округляет число до ближайшего кратного значения с
|
|
4
|
+
/// использованием стандартного математического округления
|
|
5
|
+
/// (половинки в сторону от нуля).
|
|
6
|
+
///
|
|
7
|
+
/// Функция выполняет округление числа до ближайшего значения,
|
|
8
|
+
/// кратного указанному числу, используя математическое
|
|
9
|
+
/// округление (round half away from zero). Эта функция
|
|
10
|
+
/// полезна для привязки значений к сетке, создания
|
|
11
|
+
/// равномерных интервалов и дискретизации непрерывных величин.
|
|
12
|
+
///
|
|
13
|
+
/// Важные особенности функции:
|
|
14
|
+
/// - Использует математическое округление (половинки в сторону
|
|
15
|
+
/// от нуля)
|
|
16
|
+
/// - Работает с положительными и отрицательными числами
|
|
17
|
+
/// - Сохраняет единицы измерения исходного числа
|
|
18
|
+
/// - Использует `math.round()` для округления до ближайшего
|
|
19
|
+
/// целого
|
|
20
|
+
/// - Поддерживает дробные значения для `$nearest`
|
|
21
|
+
/// - Использует математически корректное деление через
|
|
22
|
+
/// `math.div()`
|
|
23
|
+
/// - Следует правилу "банковского округления" для граничных
|
|
24
|
+
/// случаев
|
|
25
|
+
/// ---
|
|
26
|
+
/// @name number-round-to-nearest
|
|
27
|
+
/// @group utilities-helpers
|
|
28
|
+
/// @since 2025.12.27
|
|
29
|
+
/// @access public
|
|
30
|
+
/// @author Murad Rustamov (therteenten)
|
|
31
|
+
/// @link https://sourcecraft.dev/users/therteenten/overview SourceCraft - therteenten
|
|
32
|
+
/// @link https://sourcecraft.dev/omnisass/library SourceCraft - OmniSass
|
|
33
|
+
/// @link https://sass-lang.com/documentation/modules/math#round См. также: Официальная документация Sass - Функция math.round()
|
|
34
|
+
/// @link https://sass-lang.com/documentation/modules/math#div См. также: Официальная документация Sass - Функция math.div()
|
|
35
|
+
/// @link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/round MDN Web Docs - Math.round()
|
|
36
|
+
/// @link https://en.wikipedia.org/wiki/Rounding См. также: Википедия - Округление чисел
|
|
37
|
+
/// @link https://en.wikipedia.org/wiki/Rounding#Round_half_away_from_zero См. также: Википедия - Округление половинок от нуля
|
|
38
|
+
/// @link https://mathworld.wolfram.com/Round.html См. также: Wolfram MathWorld - Функция округления
|
|
39
|
+
/// @link https://www.britannica.com/science/rounding См. также: Britannica - Округление в математике
|
|
40
|
+
/// @link https://www.khanacademy.org/math/cc-third-grade-math/imp-addition-and-subtraction/imp-rounding/v/rounding-to-the-nearest-10 См. также: Khan Academy - Округление до ближайшего
|
|
41
|
+
/// @link https://www.mathsisfun.com/numbers/rounding-methods.html См. также: Maths is Fun - Методы округления
|
|
42
|
+
/// @link https://www.mathsisfun.com/numbers/rounding-decimals.html См. также: Maths is Fun - Округление десятичных дробей
|
|
43
|
+
/// @link https://www.nist.gov/pml/special-publication-811/nist-guide-si-chapter-7 См. также: NIST Guide to SI - Глава 7: Округление чисел
|
|
44
|
+
/// @link https://ieeexplore.ieee.org/document/4610935 См. также: IEEE Standard 754 - Округление чисел с плавающей запятой
|
|
45
|
+
/// @link https://css-tricks.com/snippets/sass/ См. также: CSS-Tricks - Коллекция сниппетов Sass
|
|
46
|
+
/// @link https://sass-guidelin.es/ru/#math-functions См. также: Sass Guidelines - Математические функции
|
|
47
|
+
/// @link https://frontender.info/sass-numbers/ См. также: Frontender Magazine - Работа с числами в Sass
|
|
48
|
+
/// @link https://www.w3schools.com/sass/sass_functions_numeric.php См. также: W3Schools - Числовые функции в Sass
|
|
49
|
+
/// @link https://habr.com/ru/post/247887/ См. также: Habr - Статья "Sass для верстальщика: числа и математика"
|
|
50
|
+
/// @example scss - Округление до ближайшего кратного
|
|
51
|
+
/// @debug number-round-to-nearest(13, 5); // 15
|
|
52
|
+
/// @debug number-round-to-nearest(12, 5); // 10
|
|
53
|
+
/// @debug number-round-to-nearest(17, 10); // 20
|
|
54
|
+
/// @debug number-round-to-nearest(15, 10); // 20 (половинка вверх)
|
|
55
|
+
/// @debug number-round-to-nearest(100, 50); // 100
|
|
56
|
+
/// @debug number-round-to-nearest(125, 50); // 150
|
|
57
|
+
/// @example scss - Округление дробных чисел
|
|
58
|
+
/// @debug number-round-to-nearest(12.3, 5); // 10
|
|
59
|
+
/// @debug number-round-to-nearest(12.7, 5); // 15
|
|
60
|
+
/// @debug number-round-to-nearest(3.14, 1); // 3
|
|
61
|
+
/// @debug number-round-to-nearest(7.89, 2.5); // 7.5
|
|
62
|
+
/// @debug number-round-to-nearest(8.12, 2.5); // 7.5
|
|
63
|
+
/// @example scss - Округление отрицательных чисел
|
|
64
|
+
/// @debug number-round-to-nearest(-13, 5); // -15
|
|
65
|
+
/// @debug number-round-to-nearest(-12, 5); // -10
|
|
66
|
+
/// @debug number-round-to-nearest(-15, 10); // -20 (половинка от нуля)
|
|
67
|
+
/// @debug number-round-to-nearest(-3.5, 1); // -4
|
|
68
|
+
/// @example scss - Округление чисел с единицами измерения
|
|
69
|
+
/// @debug number-round-to-nearest(13px, 5px); // 15px
|
|
70
|
+
/// @debug number-round-to-nearest(12px, 5px); // 10px
|
|
71
|
+
/// @debug number-round-to-nearest(1.7rem, 0.5rem); // 1.5rem
|
|
72
|
+
/// @debug number-round-to-nearest(45%, 10%); // 50%
|
|
73
|
+
/// @debug number-round-to-nearest(43%, 10%); // 40%
|
|
74
|
+
/// @example scss - Практическое использование для выравнивания по сетке
|
|
75
|
+
/// $element-width: 137px;
|
|
76
|
+
/// $grid-step: 12px;
|
|
77
|
+
/// $aligned-width: number-round-to-nearest($element-width, $grid-step);
|
|
78
|
+
/// // $aligned-width: 144px (137/12≈11.42→12*12=144)
|
|
79
|
+
/// .grid-item {
|
|
80
|
+
/// width: $aligned-width;
|
|
81
|
+
/// }
|
|
82
|
+
/// @example css - Результат
|
|
83
|
+
/// .grid-item {
|
|
84
|
+
/// width: 132px;
|
|
85
|
+
/// }
|
|
86
|
+
/// @example scss - Практическое использование для типографики
|
|
87
|
+
/// $calculated-size: 17.3px;
|
|
88
|
+
/// $type-scale: 2px;
|
|
89
|
+
/// $harmonized-size: number-round-to-nearest($calculated-size, $type-scale);
|
|
90
|
+
/// // $harmonized-size: 18px (17.3/2=8.65→9*2=18)
|
|
91
|
+
/// .heading {
|
|
92
|
+
/// font-size: $harmonized-size;
|
|
93
|
+
/// }
|
|
94
|
+
/// @example css - Результат
|
|
95
|
+
/// .heading {
|
|
96
|
+
/// font-size: 18px;
|
|
97
|
+
/// }
|
|
98
|
+
/// @example scss - Практическое использование для временных интервалов
|
|
99
|
+
/// $duration: 3700ms;
|
|
100
|
+
/// $time-step: 500ms;
|
|
101
|
+
/// $rounded-duration: number-round-to-nearest($duration, $time-step);
|
|
102
|
+
/// // $rounded-duration: 3500ms (3700/500=7.4→7*500=3500)
|
|
103
|
+
/// .animation {
|
|
104
|
+
/// animation-duration: $rounded-duration;
|
|
105
|
+
/// }
|
|
106
|
+
/// @example css - Результат
|
|
107
|
+
/// .animation {
|
|
108
|
+
/// animation-duration: 3500ms;
|
|
109
|
+
/// }
|
|
110
|
+
/// @example scss - Математическое применение для квантования
|
|
111
|
+
/// // Квантование аналогового значения в цифровое
|
|
112
|
+
/// $analog-value: 3.7;
|
|
113
|
+
/// $quantum-step: 0.5;
|
|
114
|
+
/// @debug number-round-to-nearest($analog-value, $quantum-step); // 3.5 (3.7/0.5=7.4→7*0.5=3.5)
|
|
115
|
+
/// @param {Number} $value - Число для округления. Может быть
|
|
116
|
+
/// любым числом: положительным, отрицательным, целым,
|
|
117
|
+
/// дробным, с единицами измерения или без них.
|
|
118
|
+
/// @param {Number} $nearest - Кратное значение, до которого
|
|
119
|
+
/// нужно округлить. Определяет шаг округления. Может быть
|
|
120
|
+
/// дробным числом. Рекомендуется использовать те же единицы
|
|
121
|
+
/// измерения, что и у `$value`.
|
|
122
|
+
/// @return {Number} - Число, округленное до ближайшего
|
|
123
|
+
/// значения, кратного `$nearest`. Сохраняет единицы
|
|
124
|
+
/// измерения исходного числа `$value`. Использует
|
|
125
|
+
/// правило округления половинок в сторону от нуля.
|
|
126
|
+
/// @throws {Error} - Может выбросить ошибку если `$value` или
|
|
127
|
+
/// `$nearest` не являются числами, или если происходит
|
|
128
|
+
/// деление на ноль.
|
|
129
|
+
@function number-round-to-nearest($value, $nearest) {
|
|
130
|
+
@return math.round(math.div($value, $nearest)) * $nearest;
|
|
131
|
+
}
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
@use 'sass:math';
|
|
2
|
+
|
|
3
|
+
/// Округляет число до указанного количества знаков после
|
|
4
|
+
/// запятой.
|
|
5
|
+
///
|
|
6
|
+
/// Функция выполняет математическое округление числа до
|
|
7
|
+
/// заданной точности (количества знаков после десятичной
|
|
8
|
+
/// точки). Использует стандартное математическое округление
|
|
9
|
+
/// (half away from zero).
|
|
10
|
+
///
|
|
11
|
+
/// Важные особенности функции:
|
|
12
|
+
/// - Использует математическое округление (половинки в сторону
|
|
13
|
+
/// от нуля)
|
|
14
|
+
/// - Поддерживает отрицательные числа
|
|
15
|
+
/// - Сохраняет единицы измерения (если они есть)
|
|
16
|
+
/// - Использует `math.pow()` для вычисления множителя
|
|
17
|
+
/// - Работает с любыми числами (целыми, дробными, с единицами
|
|
18
|
+
/// измерения)
|
|
19
|
+
/// - Использует локальные переменные с префиксом `$-` для
|
|
20
|
+
/// избежания конфликтов
|
|
21
|
+
/// ---
|
|
22
|
+
/// @name number-round-to
|
|
23
|
+
/// @group utilities-helpers
|
|
24
|
+
/// @since 2025.12.27
|
|
25
|
+
/// @access public
|
|
26
|
+
/// @author Murad Rustamov (therteenten)
|
|
27
|
+
/// @link https://sourcecraft.dev/users/therteenten/overview SourceCraft - therteenten
|
|
28
|
+
/// @link https://sourcecraft.dev/omnisass/library SourceCraft - OmniSass
|
|
29
|
+
/// @link https://sass-lang.com/documentation/modules/math#round См. также: Официальная документация Sass - Функция math.round()
|
|
30
|
+
/// @link https://sass-lang.com/documentation/modules/math#pow См. также: Официальная документация Sass - Функция math.pow()
|
|
31
|
+
/// @link https://sass-lang.com/documentation/modules/math#div См. также: Официальная документация Sass - Функция math.div()
|
|
32
|
+
/// @link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/round MDN Web Docs - Math.round()
|
|
33
|
+
/// @link https://css-tricks.com/snippets/sass/ См. также: CSS-Tricks - Коллекция сниппетов Sass
|
|
34
|
+
/// @link https://sass-guidelin.es/ru/#math-functions См. также: Sass Guidelines - Математические функции
|
|
35
|
+
/// @link https://frontender.info/sass-numbers/ См. также: Frontender Magazine - Работа с числами в Sass
|
|
36
|
+
/// @link https://www.w3schools.com/sass/sass_functions_numeric.php См. также: W3Schools - Числовые функции в Sass
|
|
37
|
+
/// @link https://habr.com/ru/post/247887/ См. также: Habr - Статья "Sass для верстальщика: числа и математика"
|
|
38
|
+
/// @example scss - Округление до двух знаков (по умолчанию)
|
|
39
|
+
/// @debug number-round-to(3.14159); // 3.14
|
|
40
|
+
/// @debug number-round-to(2.71828); // 2.72
|
|
41
|
+
/// @debug number-round-to(1.005); // 1
|
|
42
|
+
/// @debug number-round-to(0.999); // 1
|
|
43
|
+
/// @debug number-round-to(123.456); // 123.46
|
|
44
|
+
/// @example scss - Округление до разного количества знаков
|
|
45
|
+
/// @debug number-round-to(3.14159, 0); // 3
|
|
46
|
+
/// @debug number-round-to(3.14159, 1); // 3.1
|
|
47
|
+
/// @debug number-round-to(3.14159, 2); // 3.14
|
|
48
|
+
/// @debug number-round-to(3.14159, 3); // 3.142
|
|
49
|
+
/// @debug number-round-to(3.14159, 4); // 3.1416
|
|
50
|
+
/// @example scss - Округление отрицательных чисел
|
|
51
|
+
/// @debug number-round-to(-3.14159, 2); // -3.14
|
|
52
|
+
/// @debug number-round-to(-2.71828, 2); // -2.72
|
|
53
|
+
/// @debug number-round-to(-1.005, 2); // -1
|
|
54
|
+
/// @debug number-round-to(-0.999, 2); // -1
|
|
55
|
+
/// @example scss - Округление чисел с единицами измерения
|
|
56
|
+
/// @debug number-round-to(3.14159px, 2); // 3.14px
|
|
57
|
+
/// @debug number-round-to(2.5rem, 1); // 2.5rem
|
|
58
|
+
/// @debug number-round-to(1.33333em, 3); // 1.333em
|
|
59
|
+
/// @debug number-round-to(0.666666%, 2); // 0.67%
|
|
60
|
+
/// @example scss - Граничные случаи и целые числа
|
|
61
|
+
/// @debug number-round-to(10, 2); // 10
|
|
62
|
+
/// @debug number-round-to(10.0, 2); // 10
|
|
63
|
+
/// @debug number-round-to(0, 2); // 0
|
|
64
|
+
/// @debug number-round-to(0.000, 2); // 0
|
|
65
|
+
/// @debug number-round-to(100.001, 2); // 100.0
|
|
66
|
+
/// @example scss - Практическое использование для финансовых расчетов
|
|
67
|
+
/// $price: 19.994;
|
|
68
|
+
/// $rounded-price: number-round-to($price, 2);
|
|
69
|
+
/// // $rounded-price: 19.99
|
|
70
|
+
/// .price {
|
|
71
|
+
/// content: "#{$rounded-price}€";
|
|
72
|
+
/// }
|
|
73
|
+
/// @example css - Результат
|
|
74
|
+
/// .price {
|
|
75
|
+
/// content: "19.99€";
|
|
76
|
+
/// }
|
|
77
|
+
/// @example scss - Практическое использование для типографики
|
|
78
|
+
/// $line-height: 1.666666;
|
|
79
|
+
/// $rounded-line-height: number-round-to($line-height, 3);
|
|
80
|
+
/// // $rounded-line-height: 1.667
|
|
81
|
+
/// .typography {
|
|
82
|
+
/// line-height: $rounded-line-height;
|
|
83
|
+
/// }
|
|
84
|
+
/// @example css - Результат
|
|
85
|
+
/// .typography {
|
|
86
|
+
/// line-height: 1.667;
|
|
87
|
+
/// }
|
|
88
|
+
/// @example scss - Практическое использование для процентных значений
|
|
89
|
+
/// $percentage: 33.333333%;
|
|
90
|
+
/// $rounded-percentage: number-round-to($percentage, 1);
|
|
91
|
+
/// // $rounded-percentage: 33.3%
|
|
92
|
+
/// .progress-bar {
|
|
93
|
+
/// width: $rounded-percentage;
|
|
94
|
+
/// }
|
|
95
|
+
/// @example css - Результат
|
|
96
|
+
/// .progress-bar {
|
|
97
|
+
/// width: 33.3%;
|
|
98
|
+
/// }
|
|
99
|
+
/// @param {Number} $value - Число для округления. Может быть
|
|
100
|
+
/// любым числом: целым, дробным, положительным, отрицательным,
|
|
101
|
+
/// с единицами измерения или без них.
|
|
102
|
+
/// @param {Number} $precision [2] - Количество знаков после
|
|
103
|
+
/// десятичной точки, до которых нужно округлить. Должно быть
|
|
104
|
+
/// неотрицательным целым числом. При значении `0` округляет до
|
|
105
|
+
/// целого числа.
|
|
106
|
+
/// @return {Number} - Округленное число с сохранением единиц
|
|
107
|
+
/// измерения (если они были). Количество знаков после запятой
|
|
108
|
+
/// соответствует указанной точности.
|
|
109
|
+
/// @throws {Error} - Может выбросить ошибку если `$precision`
|
|
110
|
+
/// не является целым неотрицательным числом или если
|
|
111
|
+
/// `$value` не является числом.
|
|
112
|
+
@function number-round-to($value, $precision: 2) {
|
|
113
|
+
|
|
114
|
+
$-multiplier: math.pow(10, $precision);
|
|
115
|
+
|
|
116
|
+
@return math.div(math.round($value * $-multiplier), $-multiplier);
|
|
117
|
+
|
|
118
|
+
}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
@use 'sass:math';
|
|
2
|
+
@use '../../loggers/log-invalid-type' as *;
|
|
3
|
+
@use '../../validators/type-of/is-number' as *;
|
|
4
|
+
|
|
5
|
+
/// Удаляет единицы измерения из числа, возвращая
|
|
6
|
+
/// безразмерное значение.
|
|
7
|
+
///
|
|
8
|
+
/// Функция принимает число с единицами измерения (например,
|
|
9
|
+
/// `16px`, `2rem`, `50%`) и возвращает то же числовое
|
|
10
|
+
/// значение без привязанных к нему единиц измерения.
|
|
11
|
+
///
|
|
12
|
+
/// Это полезно для математических операций, где необходимо
|
|
13
|
+
/// работать только с числовыми значениями, игнорируя единицы
|
|
14
|
+
/// измерения.
|
|
15
|
+
///
|
|
16
|
+
/// Математический принцип работы функции:
|
|
17
|
+
/// - `$value * 0` преобразует значение в `0` с сохранением
|
|
18
|
+
/// единиц измерения
|
|
19
|
+
/// - `0 + 1` создает значение `1` с теми же единицами измерения
|
|
20
|
+
/// - Деление `$value / 1` эффективно удаляет единицы измерения,
|
|
21
|
+
/// оставляя только числовую часть
|
|
22
|
+
///
|
|
23
|
+
/// Важные особенности функции:
|
|
24
|
+
/// - Сохраняет точность исходного числового значения
|
|
25
|
+
/// - Работает с любыми единицами измерения CSS
|
|
26
|
+
/// - Не изменяет само значение, только удаляет единицы
|
|
27
|
+
/// - Возвращает то же число, что и на входе, но без единиц
|
|
28
|
+
/// - Не выполняет преобразования между единицами измерения
|
|
29
|
+
/// ---
|
|
30
|
+
/// @name number-strip-unit
|
|
31
|
+
/// @group utilities-helpers
|
|
32
|
+
/// @since 2025.12.27
|
|
33
|
+
/// @access public
|
|
34
|
+
/// @author Sindre Sorhus
|
|
35
|
+
/// @author Murad Rustamov (therteenten) [адаптация]
|
|
36
|
+
/// @link https://github.com/sindresorhus GitHub - Sindre Sorhus
|
|
37
|
+
/// @link https://sourcecraft.dev/users/therteenten/overview SourceCraft - therteenten
|
|
38
|
+
/// @link https://sourcecraft.dev/omnisass/library SourceCraft - OmniSass
|
|
39
|
+
/// @link https://sass-lang.com/documentation/values/numbers См. также: Официальная документация Sass - Тип данных "Числа"
|
|
40
|
+
/// @link https://sass-lang.com/documentation/values/numbers#units См. также: Официальная документация Sass - Единицы измерения в числах
|
|
41
|
+
/// @link https://sass-lang.com/documentation/operators/numeric См. также: Официальная документация Sass - Числовые операторы
|
|
42
|
+
/// @link https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Values_and_Units См. также: MDN Web Docs - CSS значения и единицы измерения
|
|
43
|
+
/// @link https://css-tricks.com/snippets/sass/strip-unit-function/ См. также: CSS-Tricks - Функция strip-unit() в Sass
|
|
44
|
+
/// @link https://sass-guidelin.es/ru/#section-41 См. также: Sass Guidelines - Раздел про математические операции
|
|
45
|
+
/// @link https://www.w3schools.com/sass/sass_operators_numeric.php См. также: W3Schools - Числовые операторы в Sass
|
|
46
|
+
/// @example scss - Пиксели и относительные единицы
|
|
47
|
+
/// @debug number-strip-unit(16px); // 16
|
|
48
|
+
/// @debug number-strip-unit(0px); // 0
|
|
49
|
+
/// @debug number-strip-unit(2.5rem); // 2.5
|
|
50
|
+
/// @debug number-strip-unit(1.25em); // 1.25
|
|
51
|
+
/// @debug number-strip-unit(0.75ch); // 0.75
|
|
52
|
+
/// @example scss - Процентные и угловые единицы
|
|
53
|
+
/// @debug number-strip-unit(50%); // 50
|
|
54
|
+
/// @debug number-strip-unit(100%); // 100
|
|
55
|
+
/// @debug number-strip-unit(0.5%); // 0.5
|
|
56
|
+
/// @debug number-strip-unit(90deg); // 90
|
|
57
|
+
/// @debug number-strip-unit(3.14rad); // 3.14
|
|
58
|
+
/// @debug number-strip-unit(0.5turn); // 0.5
|
|
59
|
+
/// @example scss - Временные и частотные единицы
|
|
60
|
+
/// @debug number-strip-unit(1s); // 1
|
|
61
|
+
/// @debug number-strip-unit(250ms); // 250
|
|
62
|
+
/// @debug number-strip-unit(60Hz); // 60
|
|
63
|
+
/// @debug number-strip-unit(2.4kHz); // 2.4
|
|
64
|
+
/// @example scss - Разрешение и прочие единицы
|
|
65
|
+
/// @debug number-strip-unit(96dpi); // 96
|
|
66
|
+
/// @debug number-strip-unit(2.5dppx); // 2.5
|
|
67
|
+
/// @debug number-strip-unit(10vw); // 10
|
|
68
|
+
/// @debug number-strip-unit(50vh); // 50
|
|
69
|
+
/// @debug number-strip-unit(20vmin); // 20
|
|
70
|
+
/// @example scss - Безразмерные числа (без изменений)
|
|
71
|
+
/// @debug number-strip-unit(10); // 10 (остается 10)
|
|
72
|
+
/// @debug number-strip-unit(3.14); // 3.14 (остается 3.14)
|
|
73
|
+
/// @debug number-strip-unit(0); // 0 (остается 0)
|
|
74
|
+
/// @debug number-strip-unit(-5); // -5 (остается -5)
|
|
75
|
+
/// @param {Number} $value - Число с единицами измерения.
|
|
76
|
+
/// Может быть любым числом CSS с любыми единицами измерения
|
|
77
|
+
/// или безразмерным числом. Если передано безразмерное число,
|
|
78
|
+
/// функция вернет его без изменений.
|
|
79
|
+
/// @return {Number} - Безразмерное числовое значение, равное
|
|
80
|
+
/// числовой части входного значения. Если входное значение
|
|
81
|
+
/// уже было безразмерным, возвращается то же самое значение.
|
|
82
|
+
/// @throws {Error} - Может выбросить ошибку, если передано
|
|
83
|
+
/// нечисловое значение, так как математические операции
|
|
84
|
+
/// Sass требуют числовых операндов.
|
|
85
|
+
@function number-strip-unit($value) {
|
|
86
|
+
|
|
87
|
+
$-result: 'null';
|
|
88
|
+
|
|
89
|
+
@if is-number($value) {
|
|
90
|
+
$-result: math.div($value, $value * 0 + 1);
|
|
91
|
+
} @else {
|
|
92
|
+
@debug log-invalid-type('number-strip-unit', $value, '$value', 'number');
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
@return $-result;
|
|
96
|
+
|
|
97
|
+
}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
@use 'sass:string';
|
|
2
|
+
|
|
3
|
+
/// Преобразует первый символ строки в верхний регистр, остальные
|
|
4
|
+
/// оставляет без изменений.
|
|
5
|
+
///
|
|
6
|
+
/// Функция извлекает первый символ строки, преобразует его в
|
|
7
|
+
/// верхний регистр с помощью `string.to-upper-case()`, затем
|
|
8
|
+
/// объединяет с оставшейся частью строки. Удобна для
|
|
9
|
+
/// форматирования имен, заголовков и других текстовых элементов,
|
|
10
|
+
/// требующих капитализации только первого символа.
|
|
11
|
+
///
|
|
12
|
+
/// Важные особенности функции:
|
|
13
|
+
/// - Преобразует только первый символ строки в верхний регистр
|
|
14
|
+
/// - Не изменяет регистр остальных символов строки
|
|
15
|
+
/// - Работает корректно с однобуквенными строками
|
|
16
|
+
/// - Обрабатывает пустые строки, возвращая пустую строку
|
|
17
|
+
/// - Сохраняет все пробелы и специальные символы в исходном виде
|
|
18
|
+
/// - Чувствительна к регистру только для первого символа
|
|
19
|
+
///
|
|
20
|
+
/// > Первый символ преобразуется независимо от того, является
|
|
21
|
+
/// > ли он буквой. Цифры, специальные символы и пробелы остаются
|
|
22
|
+
/// > без изменений, но функция все равно выполнит попытку
|
|
23
|
+
/// > преобразования регистра.
|
|
24
|
+
///
|
|
25
|
+
/// > Для строк, начинающихся с пробела, пробел остается
|
|
26
|
+
/// > первым символом, а первая буква (если есть) преобразуется
|
|
27
|
+
/// > в верхний регистр.
|
|
28
|
+
/// > Функция использует встроенные методы Sass и работает
|
|
29
|
+
/// > эффективно даже с длинными строками.
|
|
30
|
+
/// ---
|
|
31
|
+
/// @name string-capitalize
|
|
32
|
+
/// @group utilities-helpers
|
|
33
|
+
/// @since 2026.01.12
|
|
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#to-upper-case См. также: Официальная документация Sass - Функция string.to-upper-case()
|
|
39
|
+
/// @link https://sass-lang.com/documentation/modules/string#slice См. также: Официальная документация Sass - Функция string.slice()
|
|
40
|
+
/// @link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/toUpperCase См. также: MDN Web Docs - JavaScript метод toUpperCase()
|
|
41
|
+
/// @link https://css-tricks.com/snippets/sass/capitalize-function/ См. также: CSS-Tricks - Sass-функция capitalize()
|
|
42
|
+
/// @link https://sass-guidelin.es/ru/#section-37 См. также: Sass Guidelines - Работа со строками
|
|
43
|
+
/// @link https://www.w3schools.com/sass/sass_functions_string.php См. также: W3Schools - Строковые функции в Sass
|
|
44
|
+
/// @link https://stackoverflow.com/questions/1026069/how-do-i-make-the-first-letter-of-a-string-uppercase-in-javascript См. также: Stack Overflow - Как сделать первую букву строки заглавной в JavaScript
|
|
45
|
+
/// @link https://frontender.info/sass-text-transformations/ См. также: Frontender Magazine - Трансформации текста в Sass
|
|
46
|
+
/// @link https://habr.com/ru/post/247879/ См. также: Habr - Статья "Sass для верстальщика: строковые операции"
|
|
47
|
+
/// @example scss - Базовая капитализация
|
|
48
|
+
/// @debug string-capitalize('hello'); // "Hello"
|
|
49
|
+
/// @debug string-capitalize('hello world'); // "Hello world"
|
|
50
|
+
/// @debug string-capitalize('HELLO'); // "HELLO"
|
|
51
|
+
/// @debug string-capitalize('123abc'); // "123abc"
|
|
52
|
+
/// @example scss - Специальные символы и пробелы
|
|
53
|
+
/// @debug string-capitalize(' hello'); // " hello"
|
|
54
|
+
/// @debug string-capitalize('-webkit-box'); // "-webkit-box"
|
|
55
|
+
/// @debug string-capitalize('_variable'); // "_variable"
|
|
56
|
+
/// @debug string-capitalize('.class-name'); // ".class-name"
|
|
57
|
+
/// @example scss - Граничные случаи
|
|
58
|
+
/// @debug string-capitalize(''); // "" (пустая строка)
|
|
59
|
+
/// @debug string-capitalize('a'); // "A"
|
|
60
|
+
/// @debug string-capitalize('A'); // "A"
|
|
61
|
+
/// @debug string-capitalize(' '); // " " (пробел)
|
|
62
|
+
/// @example scss - Использование в реальных сценариях
|
|
63
|
+
/// @debug string-capitalize('firstName'); // "FirstName"
|
|
64
|
+
/// @debug string-capitalize('user-name'); // "User-name"
|
|
65
|
+
/// @debug string-capitalize('css selector'); // "Css selector"
|
|
66
|
+
/// @debug string-capitalize('php function'); // "Php function"
|
|
67
|
+
/// @param {String} $string - Исходная строка, первый символ
|
|
68
|
+
/// которой нужно преобразовать в верхний регистр.
|
|
69
|
+
/// Может быть пустой строкой, однобуквенной строкой или
|
|
70
|
+
/// строкой любой длины.
|
|
71
|
+
/// @return {String} - Возвращает новую строку, в которой
|
|
72
|
+
/// первый символ преобразован в верхний регистр, а все
|
|
73
|
+
/// остальные символы остаются без изменений. Для пустой
|
|
74
|
+
/// строки возвращает пустую строку.
|
|
75
|
+
/// @throws Не выбрасывает ошибок, корректно обрабатывает строки
|
|
76
|
+
/// любой длины и содержания.
|
|
77
|
+
@function string-capitalize($string) {
|
|
78
|
+
|
|
79
|
+
$-first: string.to-upper-case(string.slice($string, 1, 1));
|
|
80
|
+
$-rest: string.slice($string, 2);
|
|
81
|
+
|
|
82
|
+
@return $-first + $-rest;
|
|
83
|
+
|
|
84
|
+
}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
@use 'sass:string';
|
|
2
|
+
|
|
3
|
+
/// Заменяет все вхождения подстроки в строке на другую подстроку.
|
|
4
|
+
///
|
|
5
|
+
/// Функция рекурсивно ищет первое вхождение заменяемой подстроки в строке,
|
|
6
|
+
/// заменяет его на указанную подстроку-замену, и продолжает поиск
|
|
7
|
+
/// в оставшейся части строки. Процесс повторяется, пока не будут
|
|
8
|
+
/// заменены все вхождения.
|
|
9
|
+
///
|
|
10
|
+
/// Важные особенности функции:
|
|
11
|
+
/// - Использует рекурсивный алгоритм для замены всех вхождений
|
|
12
|
+
/// - Применяет `string.index()` для поиска позиции подстроки
|
|
13
|
+
/// - Использует `string.slice()` для разделения строки на части
|
|
14
|
+
/// - Чувствительна к регистру символов при поиске
|
|
15
|
+
/// - Поддерживает замену на пустую строку (удаление подстроки)
|
|
16
|
+
/// - Обрабатывает множественные вхождения подстроки
|
|
17
|
+
/// ---
|
|
18
|
+
/// @name string-replace
|
|
19
|
+
/// @group utilities-helpers
|
|
20
|
+
/// @since 2026.01.03
|
|
21
|
+
/// @access public
|
|
22
|
+
/// @author Murad Rustamov (therteenten)
|
|
23
|
+
/// @link https://sourcecraft.dev/users/therteenten/overview SourceCraft - therteenten
|
|
24
|
+
/// @link https://sourcecraft.dev/omnisass/library SourceCraft - OmniSass
|
|
25
|
+
/// @link https://sass-lang.com/documentation/values/strings См. также: Официальная документация Sass - Тип данных "Строки"
|
|
26
|
+
/// @link https://sass-lang.com/documentation/modules/string#index См. также: Официальная документация Sass - Функция string.index()
|
|
27
|
+
/// @link https://sass-lang.com/documentation/modules/string#slice См. также: Официальная документация Sass - Функция string.slice()
|
|
28
|
+
/// @link https://sass-lang.com/documentation/modules/string#length См. также: Официальная документация Sass - Функция string.length()
|
|
29
|
+
/// @link https://developer.mozilla.org/en-US/docs/Web/CSS/string_value См. также: MDN Web Docs - CSS-тип <string>
|
|
30
|
+
/// @link https://sass-lang.com/documentation/at-rules/function См. также: Официальная документация Sass - Функции
|
|
31
|
+
/// @link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/replaceAll См. также: MDN Web Docs - JavaScript метод replaceAll()
|
|
32
|
+
/// @example scss - Замена подстроки
|
|
33
|
+
/// @debug string-replace('hello world', 'world', 'universe'); // "hello universe"
|
|
34
|
+
/// @debug string-replace('test test', 'test', 'example'); // "example example"
|
|
35
|
+
/// @debug string-replace('abc abc abc', 'abc', 'xyz'); // "xyz xyz xyz"
|
|
36
|
+
/// @example scss - Удаление подстроки
|
|
37
|
+
/// @debug string-replace('hello-world', '-', ''); // "helloworld"
|
|
38
|
+
/// @debug string-replace('some text here', ' ', ''); // "sometexthere"
|
|
39
|
+
/// @debug string-replace('abc123def', '123', ''); // "abcdef"
|
|
40
|
+
/// @example scss - Граничные случаи
|
|
41
|
+
/// @debug string-replace('', 'abc', 'xyz'); // "" (пустая строка)
|
|
42
|
+
/// @debug string-replace('hello', 'x', 'y'); // "hello" (подстрока не найдена)
|
|
43
|
+
/// @debug string-replace('aaaa', 'aa', 'b'); // "bb" (перекрывающиеся замены)
|
|
44
|
+
/// @example scss - Специальные символы
|
|
45
|
+
/// @debug string-replace('width: 100px;', '100px', '200px'); // "width: 200px;"
|
|
46
|
+
/// @debug string-replace('class1 class2', 'class', 'cls'); // "cls1 cls2"
|
|
47
|
+
/// @debug string-replace('url(image.jpg)', 'image', 'logo'); // "url(logo.jpg)"
|
|
48
|
+
/// @param {String} $string - Исходная строка, в которой
|
|
49
|
+
/// выполняется замена.
|
|
50
|
+
/// @param {String} $replaceable - Подстрока, которую нужно
|
|
51
|
+
/// заменить.
|
|
52
|
+
/// @param {String} $replacement [''] - Подстрока для замены.
|
|
53
|
+
/// По умолчанию - пустая строка (удаление).
|
|
54
|
+
/// @return {String} - Возвращает новую строку, в которой все
|
|
55
|
+
/// вхождения `$replaceable` заменены на `$replacement`. Если
|
|
56
|
+
/// `$replaceable` не найдена, возвращается оригинальная строка.
|
|
57
|
+
/// @throws {Error} - Может вызвать ошибку глубины рекурсии при очень
|
|
58
|
+
/// длинных строках с множественными заменами.
|
|
59
|
+
@function string-replace($string, $replaceable, $replacement: '') {
|
|
60
|
+
|
|
61
|
+
$-index: string.index($string, $replaceable);
|
|
62
|
+
|
|
63
|
+
@if $-index {
|
|
64
|
+
@return string.slice($string, 1, $-index - 1) + $replacement + string-replace(string.slice($string, $-index + string.length($replaceable)), $replaceable, $replacement);
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
@return $string;
|
|
68
|
+
|
|
69
|
+
}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
@use 'sass:string';
|
|
2
|
+
|
|
3
|
+
/// Удаляет пробелы с конца строки (справа).
|
|
4
|
+
///
|
|
5
|
+
/// Функция последовательно проверяет и удаляет пробелы с конца
|
|
6
|
+
/// строки, пока не встретит непробельный символ.
|
|
7
|
+
///
|
|
8
|
+
/// Возвращает строку без конечных пробелов.
|
|
9
|
+
///
|
|
10
|
+
/// Важные особенности функции:
|
|
11
|
+
/// - Использует цикл `@while` для последовательного удаления конечных пробелов
|
|
12
|
+
/// - Проверяет последний символ строки на равенство пробелу
|
|
13
|
+
/// - Использует `string.slice()` для создания подстрок без конечных пробелов
|
|
14
|
+
/// - Удаляет только пробелы (символ " "), не удаляет другие whitespace-символы
|
|
15
|
+
/// - Сохраняет все пробелы в начале строки и между словами
|
|
16
|
+
/// - Полезен для обработки значений с выравниванием по правому краю или trailing spaces
|
|
17
|
+
/// ---
|
|
18
|
+
/// @name string-trim-end
|
|
19
|
+
/// @group utilities-helpers
|
|
20
|
+
/// @since 2026.01.03
|
|
21
|
+
/// @access public
|
|
22
|
+
/// @author Murad Rustamov (therteenten)
|
|
23
|
+
/// @link https://sourcecraft.dev/users/therteenten/overview SourceCraft - therteenten
|
|
24
|
+
/// @link https://sourcecraft.dev/omnisass/library SourceCraft - OmniSass
|
|
25
|
+
/// @link https://sass-lang.com/documentation/values/strings См. также: Официальная документация Sass - Тип данных "Строки"
|
|
26
|
+
/// @link https://sass-lang.com/documentation/modules/string#slice См. также: Официальная документация Sass - Функция string.slice()
|
|
27
|
+
/// @link https://sass-lang.com/documentation/at-rules/control См. также: Официальная документация Sass - Управляющие директивы
|
|
28
|
+
/// @link https://developer.mozilla.org/en-US/docs/Web/CSS/string_value См. также: MDN Web Docs - CSS-тип <string>
|
|
29
|
+
/// @link https://sass-lang.com/documentation/values/strings#interpolation См. также: Официальная документация Sass - Интерполяция строк
|
|
30
|
+
/// @link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/trimEnd См. также: MDN Web Docs - JavaScript метод trimEnd()
|
|
31
|
+
/// @example scss - Удаление конечных пробелов
|
|
32
|
+
/// @debug string-trim-end('hello '); // "hello"
|
|
33
|
+
/// @debug string-trim-end('world '); // "world"
|
|
34
|
+
/// @debug string-trim-end(' test '); // " test" (начальные пробелы сохраняются)
|
|
35
|
+
/// @example scss - Строки без конечных пробелов
|
|
36
|
+
/// @debug string-trim-end('hello'); // "hello"
|
|
37
|
+
/// @debug string-trim-end(' hello'); // " hello"
|
|
38
|
+
/// @debug string-trim-end(''); // ""
|
|
39
|
+
/// @example scss - Граничные случаи
|
|
40
|
+
/// @debug string-trim-end(' '); // "" (только пробелы)
|
|
41
|
+
/// @debug string-trim-end(' a b '); // " a b" (сохраняет начальные и внутренние пробелы)
|
|
42
|
+
/// @debug string-trim-end('hello world '); // "hello world"
|
|
43
|
+
/// @example scss - Сравнение с полным trim
|
|
44
|
+
/// @debug string-trim-end(' text '); // " text"
|
|
45
|
+
/// @debug string-trim(' text '); // "text" (удаляет и начальные пробелы)
|
|
46
|
+
/// @param {String} $string - Строка, из которой нужно удалить
|
|
47
|
+
/// конечные пробелы.
|
|
48
|
+
/// @return {String} - Возвращает новую строку, в которой удалены
|
|
49
|
+
/// все пробелы с конца оригинальной строки.
|
|
50
|
+
/// Если строка состоит только из пробелов, возвращается пустая строка.
|
|
51
|
+
/// @throws {Error} - Не выбрасывает ошибок. Если передано нестроковое
|
|
52
|
+
/// значение, функция может вернуть неожиданный результат или вызвать
|
|
53
|
+
/// ошибку выполнения.
|
|
54
|
+
@function string-trim-end($string) {
|
|
55
|
+
|
|
56
|
+
@while string.slice($string, -1) == " " {
|
|
57
|
+
$string: string.slice($string, 1, -2);
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
@return $string;
|
|
61
|
+
|
|
62
|
+
}
|