summaryrefslogtreecommitdiff
path: root/vendor/symfony/console/Style
diff options
context:
space:
mode:
authorpolo <ordipolo@gmx.fr>2024-08-13 23:45:21 +0200
committerpolo <ordipolo@gmx.fr>2024-08-13 23:45:21 +0200
commitbf6655a534a6775d30cafa67bd801276bda1d98d (patch)
treec6381e3f6c81c33eab72508f410b165ba05f7e9c /vendor/symfony/console/Style
parent94d67a4b51f8e62e7d518cce26a526ae1ec48278 (diff)
downloadAppliGestionPHP-bf6655a534a6775d30cafa67bd801276bda1d98d.zip
VERSION 0.2 doctrine ORM et entités
Diffstat (limited to 'vendor/symfony/console/Style')
-rw-r--r--vendor/symfony/console/Style/OutputStyle.php109
-rw-r--r--vendor/symfony/console/Style/StyleInterface.php110
-rw-r--r--vendor/symfony/console/Style/SymfonyStyle.php455
3 files changed, 674 insertions, 0 deletions
diff --git a/vendor/symfony/console/Style/OutputStyle.php b/vendor/symfony/console/Style/OutputStyle.php
new file mode 100644
index 0000000..9f62ea3
--- /dev/null
+++ b/vendor/symfony/console/Style/OutputStyle.php
@@ -0,0 +1,109 @@
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\Style;
13
14use Symfony\Component\Console\Formatter\OutputFormatterInterface;
15use Symfony\Component\Console\Helper\ProgressBar;
16use Symfony\Component\Console\Output\ConsoleOutputInterface;
17use Symfony\Component\Console\Output\OutputInterface;
18
19/**
20 * Decorates output to add console style guide helpers.
21 *
22 * @author Kevin Bond <kevinbond@gmail.com>
23 */
24abstract class OutputStyle implements OutputInterface, StyleInterface
25{
26 public function __construct(
27 private OutputInterface $output,
28 ) {
29 }
30
31 public function newLine(int $count = 1): void
32 {
33 $this->output->write(str_repeat(\PHP_EOL, $count));
34 }
35
36 public function createProgressBar(int $max = 0): ProgressBar
37 {
38 return new ProgressBar($this->output, $max);
39 }
40
41 public function write(string|iterable $messages, bool $newline = false, int $type = self::OUTPUT_NORMAL): void
42 {
43 $this->output->write($messages, $newline, $type);
44 }
45
46 public function writeln(string|iterable $messages, int $type = self::OUTPUT_NORMAL): void
47 {
48 $this->output->writeln($messages, $type);
49 }
50
51 public function setVerbosity(int $level): void
52 {
53 $this->output->setVerbosity($level);
54 }
55
56 public function getVerbosity(): int
57 {
58 return $this->output->getVerbosity();
59 }
60
61 public function setDecorated(bool $decorated): void
62 {
63 $this->output->setDecorated($decorated);
64 }
65
66 public function isDecorated(): bool
67 {
68 return $this->output->isDecorated();
69 }
70
71 public function setFormatter(OutputFormatterInterface $formatter): void
72 {
73 $this->output->setFormatter($formatter);
74 }
75
76 public function getFormatter(): OutputFormatterInterface
77 {
78 return $this->output->getFormatter();
79 }
80
81 public function isQuiet(): bool
82 {
83 return $this->output->isQuiet();
84 }
85
86 public function isVerbose(): bool
87 {
88 return $this->output->isVerbose();
89 }
90
91 public function isVeryVerbose(): bool
92 {
93 return $this->output->isVeryVerbose();
94 }
95
96 public function isDebug(): bool
97 {
98 return $this->output->isDebug();
99 }
100
101 protected function getErrorOutput(): OutputInterface
102 {
103 if (!$this->output instanceof ConsoleOutputInterface) {
104 return $this->output;
105 }
106
107 return $this->output->getErrorOutput();
108 }
109}
diff --git a/vendor/symfony/console/Style/StyleInterface.php b/vendor/symfony/console/Style/StyleInterface.php
new file mode 100644
index 0000000..fcc5bc7
--- /dev/null
+++ b/vendor/symfony/console/Style/StyleInterface.php
@@ -0,0 +1,110 @@
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\Style;
13
14/**
15 * Output style helpers.
16 *
17 * @author Kevin Bond <kevinbond@gmail.com>
18 */
19interface StyleInterface
20{
21 /**
22 * Formats a command title.
23 */
24 public function title(string $message): void;
25
26 /**
27 * Formats a section title.
28 */
29 public function section(string $message): void;
30
31 /**
32 * Formats a list.
33 */
34 public function listing(array $elements): void;
35
36 /**
37 * Formats informational text.
38 */
39 public function text(string|array $message): void;
40
41 /**
42 * Formats a success result bar.
43 */
44 public function success(string|array $message): void;
45
46 /**
47 * Formats an error result bar.
48 */
49 public function error(string|array $message): void;
50
51 /**
52 * Formats an warning result bar.
53 */
54 public function warning(string|array $message): void;
55
56 /**
57 * Formats a note admonition.
58 */
59 public function note(string|array $message): void;
60
61 /**
62 * Formats a caution admonition.
63 */
64 public function caution(string|array $message): void;
65
66 /**
67 * Formats a table.
68 */
69 public function table(array $headers, array $rows): void;
70
71 /**
72 * Asks a question.
73 */
74 public function ask(string $question, ?string $default = null, ?callable $validator = null): mixed;
75
76 /**
77 * Asks a question with the user input hidden.
78 */
79 public function askHidden(string $question, ?callable $validator = null): mixed;
80
81 /**
82 * Asks for confirmation.
83 */
84 public function confirm(string $question, bool $default = true): bool;
85
86 /**
87 * Asks a choice question.
88 */
89 public function choice(string $question, array $choices, mixed $default = null): mixed;
90
91 /**
92 * Add newline(s).
93 */
94 public function newLine(int $count = 1): void;
95
96 /**
97 * Starts the progress output.
98 */
99 public function progressStart(int $max = 0): void;
100
101 /**
102 * Advances the progress output X steps.
103 */
104 public function progressAdvance(int $step = 1): void;
105
106 /**
107 * Finishes the progress output.
108 */
109 public function progressFinish(): void;
110}
diff --git a/vendor/symfony/console/Style/SymfonyStyle.php b/vendor/symfony/console/Style/SymfonyStyle.php
new file mode 100644
index 0000000..19ad892
--- /dev/null
+++ b/vendor/symfony/console/Style/SymfonyStyle.php
@@ -0,0 +1,455 @@
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\Style;
13
14use Symfony\Component\Console\Exception\InvalidArgumentException;
15use Symfony\Component\Console\Exception\RuntimeException;
16use Symfony\Component\Console\Formatter\OutputFormatter;
17use Symfony\Component\Console\Helper\Helper;
18use Symfony\Component\Console\Helper\OutputWrapper;
19use Symfony\Component\Console\Helper\ProgressBar;
20use Symfony\Component\Console\Helper\SymfonyQuestionHelper;
21use Symfony\Component\Console\Helper\Table;
22use Symfony\Component\Console\Helper\TableCell;
23use Symfony\Component\Console\Helper\TableSeparator;
24use Symfony\Component\Console\Input\InputInterface;
25use Symfony\Component\Console\Output\ConsoleOutputInterface;
26use Symfony\Component\Console\Output\ConsoleSectionOutput;
27use Symfony\Component\Console\Output\OutputInterface;
28use Symfony\Component\Console\Output\TrimmedBufferOutput;
29use Symfony\Component\Console\Question\ChoiceQuestion;
30use Symfony\Component\Console\Question\ConfirmationQuestion;
31use Symfony\Component\Console\Question\Question;
32use Symfony\Component\Console\Terminal;
33
34/**
35 * Output decorator helpers for the Symfony Style Guide.
36 *
37 * @author Kevin Bond <kevinbond@gmail.com>
38 */
39class SymfonyStyle extends OutputStyle
40{
41 public const MAX_LINE_LENGTH = 120;
42
43 private SymfonyQuestionHelper $questionHelper;
44 private ProgressBar $progressBar;
45 private int $lineLength;
46 private TrimmedBufferOutput $bufferedOutput;
47
48 public function __construct(
49 private InputInterface $input,
50 private OutputInterface $output,
51 ) {
52 $this->bufferedOutput = new TrimmedBufferOutput(\DIRECTORY_SEPARATOR === '\\' ? 4 : 2, $output->getVerbosity(), false, clone $output->getFormatter());
53 // Windows cmd wraps lines as soon as the terminal width is reached, whether there are following chars or not.
54 $width = (new Terminal())->getWidth() ?: self::MAX_LINE_LENGTH;
55 $this->lineLength = min($width - (int) (\DIRECTORY_SEPARATOR === '\\'), self::MAX_LINE_LENGTH);
56
57 parent::__construct($output);
58 }
59
60 /**
61 * Formats a message as a block of text.
62 */
63 public function block(string|array $messages, ?string $type = null, ?string $style = null, string $prefix = ' ', bool $padding = false, bool $escape = true): void
64 {
65 $messages = \is_array($messages) ? array_values($messages) : [$messages];
66
67 $this->autoPrependBlock();
68 $this->writeln($this->createBlock($messages, $type, $style, $prefix, $padding, $escape));
69 $this->newLine();
70 }
71
72 public function title(string $message): void
73 {
74 $this->autoPrependBlock();
75 $this->writeln([
76 sprintf('<comment>%s</>', OutputFormatter::escapeTrailingBackslash($message)),
77 sprintf('<comment>%s</>', str_repeat('=', Helper::width(Helper::removeDecoration($this->getFormatter(), $message)))),
78 ]);
79 $this->newLine();
80 }
81
82 public function section(string $message): void
83 {
84 $this->autoPrependBlock();
85 $this->writeln([
86 sprintf('<comment>%s</>', OutputFormatter::escapeTrailingBackslash($message)),
87 sprintf('<comment>%s</>', str_repeat('-', Helper::width(Helper::removeDecoration($this->getFormatter(), $message)))),
88 ]);
89 $this->newLine();
90 }
91
92 public function listing(array $elements): void
93 {
94 $this->autoPrependText();
95 $elements = array_map(fn ($element) => sprintf(' * %s', $element), $elements);
96
97 $this->writeln($elements);
98 $this->newLine();
99 }
100
101 public function text(string|array $message): void
102 {
103 $this->autoPrependText();
104
105 $messages = \is_array($message) ? array_values($message) : [$message];
106 foreach ($messages as $message) {
107 $this->writeln(sprintf(' %s', $message));
108 }
109 }
110
111 /**
112 * Formats a command comment.
113 */
114 public function comment(string|array $message): void
115 {
116 $this->block($message, null, null, '<fg=default;bg=default> // </>', false, false);
117 }
118
119 public function success(string|array $message): void
120 {
121 $this->block($message, 'OK', 'fg=black;bg=green', ' ', true);
122 }
123
124 public function error(string|array $message): void
125 {
126 $this->block($message, 'ERROR', 'fg=white;bg=red', ' ', true);
127 }
128
129 public function warning(string|array $message): void
130 {
131 $this->block($message, 'WARNING', 'fg=black;bg=yellow', ' ', true);
132 }
133
134 public function note(string|array $message): void
135 {
136 $this->block($message, 'NOTE', 'fg=yellow', ' ! ');
137 }
138
139 /**
140 * Formats an info message.
141 */
142 public function info(string|array $message): void
143 {
144 $this->block($message, 'INFO', 'fg=green', ' ', true);
145 }
146
147 public function caution(string|array $message): void
148 {
149 $this->block($message, 'CAUTION', 'fg=white;bg=red', ' ! ', true);
150 }
151
152 public function table(array $headers, array $rows): void
153 {
154 $this->createTable()
155 ->setHeaders($headers)
156 ->setRows($rows)
157 ->render()
158 ;
159
160 $this->newLine();
161 }
162
163 /**
164 * Formats a horizontal table.
165 */
166 public function horizontalTable(array $headers, array $rows): void
167 {
168 $this->createTable()
169 ->setHorizontal(true)
170 ->setHeaders($headers)
171 ->setRows($rows)
172 ->render()
173 ;
174
175 $this->newLine();
176 }
177
178 /**
179 * Formats a list of key/value horizontally.
180 *
181 * Each row can be one of:
182 * * 'A title'
183 * * ['key' => 'value']
184 * * new TableSeparator()
185 */
186 public function definitionList(string|array|TableSeparator ...$list): void
187 {
188 $headers = [];
189 $row = [];
190 foreach ($list as $value) {
191 if ($value instanceof TableSeparator) {
192 $headers[] = $value;
193 $row[] = $value;
194 continue;
195 }
196 if (\is_string($value)) {
197 $headers[] = new TableCell($value, ['colspan' => 2]);
198 $row[] = null;
199 continue;
200 }
201 if (!\is_array($value)) {
202 throw new InvalidArgumentException('Value should be an array, string, or an instance of TableSeparator.');
203 }
204 $headers[] = key($value);
205 $row[] = current($value);
206 }
207
208 $this->horizontalTable($headers, [$row]);
209 }
210
211 public function ask(string $question, ?string $default = null, ?callable $validator = null): mixed
212 {
213 $question = new Question($question, $default);
214 $question->setValidator($validator);
215
216 return $this->askQuestion($question);
217 }
218
219 public function askHidden(string $question, ?callable $validator = null): mixed
220 {
221 $question = new Question($question);
222
223 $question->setHidden(true);
224 $question->setValidator($validator);
225
226 return $this->askQuestion($question);
227 }
228
229 public function confirm(string $question, bool $default = true): bool
230 {
231 return $this->askQuestion(new ConfirmationQuestion($question, $default));
232 }
233
234 public function choice(string $question, array $choices, mixed $default = null, bool $multiSelect = false): mixed
235 {
236 if (null !== $default) {
237 $values = array_flip($choices);
238 $default = $values[$default] ?? $default;
239 }
240
241 $questionChoice = new ChoiceQuestion($question, $choices, $default);
242 $questionChoice->setMultiselect($multiSelect);
243
244 return $this->askQuestion($questionChoice);
245 }
246
247 public function progressStart(int $max = 0): void
248 {
249 $this->progressBar = $this->createProgressBar($max);
250 $this->progressBar->start();
251 }
252
253 public function progressAdvance(int $step = 1): void
254 {
255 $this->getProgressBar()->advance($step);
256 }
257
258 public function progressFinish(): void
259 {
260 $this->getProgressBar()->finish();
261 $this->newLine(2);
262 unset($this->progressBar);
263 }
264
265 public function createProgressBar(int $max = 0): ProgressBar
266 {
267 $progressBar = parent::createProgressBar($max);
268
269 if ('\\' !== \DIRECTORY_SEPARATOR || 'Hyper' === getenv('TERM_PROGRAM')) {
270 $progressBar->setEmptyBarCharacter('░'); // light shade character \u2591
271 $progressBar->setProgressCharacter('');
272 $progressBar->setBarCharacter('▓'); // dark shade character \u2593
273 }
274
275 return $progressBar;
276 }
277
278 /**
279 * @see ProgressBar::iterate()
280 *
281 * @template TKey
282 * @template TValue
283 *
284 * @param iterable<TKey, TValue> $iterable
285 * @param int|null $max Number of steps to complete the bar (0 if indeterminate), if null it will be inferred from $iterable
286 *
287 * @return iterable<TKey, TValue>
288 */
289 public function progressIterate(iterable $iterable, ?int $max = null): iterable
290 {
291 yield from $this->createProgressBar()->iterate($iterable, $max);
292
293 $this->newLine(2);
294 }
295
296 public function askQuestion(Question $question): mixed
297 {
298 if ($this->input->isInteractive()) {
299 $this->autoPrependBlock();
300 }
301
302 $this->questionHelper ??= new SymfonyQuestionHelper();
303
304 $answer = $this->questionHelper->ask($this->input, $this, $question);
305
306 if ($this->input->isInteractive()) {
307 if ($this->output instanceof ConsoleSectionOutput) {
308 // add the new line of the `return` to submit the input to ConsoleSectionOutput, because ConsoleSectionOutput is holding all it's lines.
309 // this is relevant when a `ConsoleSectionOutput::clear` is called.
310 $this->output->addNewLineOfInputSubmit();
311 }
312 $this->newLine();
313 $this->bufferedOutput->write("\n");
314 }
315
316 return $answer;
317 }
318
319 public function writeln(string|iterable $messages, int $type = self::OUTPUT_NORMAL): void
320 {
321 if (!is_iterable($messages)) {
322 $messages = [$messages];
323 }
324
325 foreach ($messages as $message) {
326 parent::writeln($message, $type);
327 $this->writeBuffer($message, true, $type);
328 }
329 }
330
331 public function write(string|iterable $messages, bool $newline = false, int $type = self::OUTPUT_NORMAL): void
332 {
333 if (!is_iterable($messages)) {
334 $messages = [$messages];
335 }
336
337 foreach ($messages as $message) {
338 parent::write($message, $newline, $type);
339 $this->writeBuffer($message, $newline, $type);
340 }
341 }
342
343 public function newLine(int $count = 1): void
344 {
345 parent::newLine($count);
346 $this->bufferedOutput->write(str_repeat("\n", $count));
347 }
348
349 /**
350 * Returns a new instance which makes use of stderr if available.
351 */
352 public function getErrorStyle(): self
353 {
354 return new self($this->input, $this->getErrorOutput());
355 }
356
357 public function createTable(): Table
358 {
359 $output = $this->output instanceof ConsoleOutputInterface ? $this->output->section() : $this->output;
360 $style = clone Table::getStyleDefinition('symfony-style-guide');
361 $style->setCellHeaderFormat('<info>%s</info>');
362
363 return (new Table($output))->setStyle($style);
364 }
365
366 private function getProgressBar(): ProgressBar
367 {
368 return $this->progressBar
369 ?? throw new RuntimeException('The ProgressBar is not started.');
370 }
371
372 private function autoPrependBlock(): void
373 {
374 $chars = substr(str_replace(\PHP_EOL, "\n", $this->bufferedOutput->fetch()), -2);
375
376 if (!isset($chars[0])) {
377 $this->newLine(); // empty history, so we should start with a new line.
378
379 return;
380 }
381 // Prepend new line for each non LF chars (This means no blank line was output before)
382 $this->newLine(2 - substr_count($chars, "\n"));
383 }
384
385 private function autoPrependText(): void
386 {
387 $fetched = $this->bufferedOutput->fetch();
388 // Prepend new line if last char isn't EOL:
389 if ($fetched && !str_ends_with($fetched, "\n")) {
390 $this->newLine();
391 }
392 }
393
394 private function writeBuffer(string $message, bool $newLine, int $type): void
395 {
396 // We need to know if the last chars are PHP_EOL
397 $this->bufferedOutput->write($message, $newLine, $type);
398 }
399
400 private function createBlock(iterable $messages, ?string $type = null, ?string $style = null, string $prefix = ' ', bool $padding = false, bool $escape = false): array
401 {
402 $indentLength = 0;
403 $prefixLength = Helper::width(Helper::removeDecoration($this->getFormatter(), $prefix));
404 $lines = [];
405
406 if (null !== $type) {
407 $type = sprintf('[%s] ', $type);
408 $indentLength = Helper::width($type);
409 $lineIndentation = str_repeat(' ', $indentLength);
410 }
411
412 // wrap and add newlines for each element
413 $outputWrapper = new OutputWrapper();
414 foreach ($messages as $key => $message) {
415 if ($escape) {
416 $message = OutputFormatter::escape($message);
417 }
418
419 $lines = array_merge(
420 $lines,
421 explode(\PHP_EOL, $outputWrapper->wrap(
422 $message,
423 $this->lineLength - $prefixLength - $indentLength,
424 \PHP_EOL
425 ))
426 );
427
428 if (\count($messages) > 1 && $key < \count($messages) - 1) {
429 $lines[] = '';
430 }
431 }
432
433 $firstLineIndex = 0;
434 if ($padding && $this->isDecorated()) {
435 $firstLineIndex = 1;
436 array_unshift($lines, '');
437 $lines[] = '';
438 }
439
440 foreach ($lines as $i => &$line) {
441 if (null !== $type) {
442 $line = $firstLineIndex === $i ? $type.$line : $lineIndentation.$line;
443 }
444
445 $line = $prefix.$line;
446 $line .= str_repeat(' ', max($this->lineLength - Helper::width(Helper::removeDecoration($this->getFormatter(), $line)), 0));
447
448 if ($style) {
449 $line = sprintf('<%s>%s</>', $style, $line);
450 }
451 }
452
453 return $lines;
454 }
455}