summaryrefslogtreecommitdiff
path: root/vendor/symfony/console/Helper/Helper.php
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/symfony/console/Helper/Helper.php')
-rw-r--r--vendor/symfony/console/Helper/Helper.php159
1 files changed, 159 insertions, 0 deletions
diff --git a/vendor/symfony/console/Helper/Helper.php b/vendor/symfony/console/Helper/Helper.php
new file mode 100644
index 0000000..de09006
--- /dev/null
+++ b/vendor/symfony/console/Helper/Helper.php
@@ -0,0 +1,159 @@
1<?php
2
3/*
4 * This file is part of the Symfony package.
5 *
6 * (c) Fabien Potencier <fabien@symfony.com>
7 *
8 * For the full copyright and license information, please view the LICENSE
9 * file that was distributed with this source code.
10 */
11
12namespace Symfony\Component\Console\Helper;
13
14use Symfony\Component\Console\Formatter\OutputFormatterInterface;
15use Symfony\Component\String\UnicodeString;
16
17/**
18 * Helper is the base class for all helper classes.
19 *
20 * @author Fabien Potencier <fabien@symfony.com>
21 */
22abstract class Helper implements HelperInterface
23{
24 protected ?HelperSet $helperSet = null;
25
26 public function setHelperSet(?HelperSet $helperSet): void
27 {
28 $this->helperSet = $helperSet;
29 }
30
31 public function getHelperSet(): ?HelperSet
32 {
33 return $this->helperSet;
34 }
35
36 /**
37 * Returns the width of a string, using mb_strwidth if it is available.
38 * The width is how many characters positions the string will use.
39 */
40 public static function width(?string $string): int
41 {
42 $string ??= '';
43
44 if (preg_match('//u', $string)) {
45 return (new UnicodeString($string))->width(false);
46 }
47
48 if (false === $encoding = mb_detect_encoding($string, null, true)) {
49 return \strlen($string);
50 }
51
52 return mb_strwidth($string, $encoding);
53 }
54
55 /**
56 * Returns the length of a string, using mb_strlen if it is available.
57 * The length is related to how many bytes the string will use.
58 */
59 public static function length(?string $string): int
60 {
61 $string ??= '';
62
63 if (preg_match('//u', $string)) {
64 return (new UnicodeString($string))->length();
65 }
66
67 if (false === $encoding = mb_detect_encoding($string, null, true)) {
68 return \strlen($string);
69 }
70
71 return mb_strlen($string, $encoding);
72 }
73
74 /**
75 * Returns the subset of a string, using mb_substr if it is available.
76 */
77 public static function substr(?string $string, int $from, ?int $length = null): string
78 {
79 $string ??= '';
80
81 if (false === $encoding = mb_detect_encoding($string, null, true)) {
82 return substr($string, $from, $length);
83 }
84
85 return mb_substr($string, $from, $length, $encoding);
86 }
87
88 public static function formatTime(int|float $secs, int $precision = 1): string
89 {
90 $secs = (int) floor($secs);
91
92 if (0 === $secs) {
93 return '< 1 sec';
94 }
95
96 static $timeFormats = [
97 [1, '1 sec', 'secs'],
98 [60, '1 min', 'mins'],
99 [3600, '1 hr', 'hrs'],
100 [86400, '1 day', 'days'],
101 ];
102
103 $times = [];
104 foreach ($timeFormats as $index => $format) {
105 $seconds = isset($timeFormats[$index + 1]) ? $secs % $timeFormats[$index + 1][0] : $secs;
106
107 if (isset($times[$index - $precision])) {
108 unset($times[$index - $precision]);
109 }
110
111 if (0 === $seconds) {
112 continue;
113 }
114
115 $unitCount = ($seconds / $format[0]);
116 $times[$index] = 1 === $unitCount ? $format[1] : $unitCount.' '.$format[2];
117
118 if ($secs === $seconds) {
119 break;
120 }
121
122 $secs -= $seconds;
123 }
124
125 return implode(', ', array_reverse($times));
126 }
127
128 public static function formatMemory(int $memory): string
129 {
130 if ($memory >= 1024 * 1024 * 1024) {
131 return sprintf('%.1f GiB', $memory / 1024 / 1024 / 1024);
132 }
133
134 if ($memory >= 1024 * 1024) {
135 return sprintf('%.1f MiB', $memory / 1024 / 1024);
136 }
137
138 if ($memory >= 1024) {
139 return sprintf('%d KiB', $memory / 1024);
140 }
141
142 return sprintf('%d B', $memory);
143 }
144
145 public static function removeDecoration(OutputFormatterInterface $formatter, ?string $string): string
146 {
147 $isDecorated = $formatter->isDecorated();
148 $formatter->setDecorated(false);
149 // remove <...> formatting
150 $string = $formatter->format($string ?? '');
151 // remove already formatted characters
152 $string = preg_replace("/\033\[[^m]*m/", '', $string ?? '');
153 // remove terminal hyperlinks
154 $string = preg_replace('/\\033]8;[^;]*;[^\\033]*\\033\\\\/', '', $string ?? '');
155 $formatter->setDecorated($isDecorated);
156
157 return $string;
158 }
159}