summaryrefslogtreecommitdiff
path: root/vendor/symfony/console/Formatter/OutputFormatterStyleStack.php
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/symfony/console/Formatter/OutputFormatterStyleStack.php')
-rw-r--r--vendor/symfony/console/Formatter/OutputFormatterStyleStack.php103
1 files changed, 103 insertions, 0 deletions
diff --git a/vendor/symfony/console/Formatter/OutputFormatterStyleStack.php b/vendor/symfony/console/Formatter/OutputFormatterStyleStack.php
new file mode 100644
index 0000000..4985213
--- /dev/null
+++ b/vendor/symfony/console/Formatter/OutputFormatterStyleStack.php
@@ -0,0 +1,103 @@
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\Formatter;
13
14use Symfony\Component\Console\Exception\InvalidArgumentException;
15use Symfony\Contracts\Service\ResetInterface;
16
17/**
18 * @author Jean-François Simon <contact@jfsimon.fr>
19 */
20class OutputFormatterStyleStack implements ResetInterface
21{
22 /**
23 * @var OutputFormatterStyleInterface[]
24 */
25 private array $styles = [];
26
27 private OutputFormatterStyleInterface $emptyStyle;
28
29 public function __construct(?OutputFormatterStyleInterface $emptyStyle = null)
30 {
31 $this->emptyStyle = $emptyStyle ?? new OutputFormatterStyle();
32 $this->reset();
33 }
34
35 /**
36 * Resets stack (ie. empty internal arrays).
37 */
38 public function reset(): void
39 {
40 $this->styles = [];
41 }
42
43 /**
44 * Pushes a style in the stack.
45 */
46 public function push(OutputFormatterStyleInterface $style): void
47 {
48 $this->styles[] = $style;
49 }
50
51 /**
52 * Pops a style from the stack.
53 *
54 * @throws InvalidArgumentException When style tags incorrectly nested
55 */
56 public function pop(?OutputFormatterStyleInterface $style = null): OutputFormatterStyleInterface
57 {
58 if (!$this->styles) {
59 return $this->emptyStyle;
60 }
61
62 if (null === $style) {
63 return array_pop($this->styles);
64 }
65
66 foreach (array_reverse($this->styles, true) as $index => $stackedStyle) {
67 if ($style->apply('') === $stackedStyle->apply('')) {
68 $this->styles = \array_slice($this->styles, 0, $index);
69
70 return $stackedStyle;
71 }
72 }
73
74 throw new InvalidArgumentException('Incorrectly nested style tag found.');
75 }
76
77 /**
78 * Computes current style with stacks top codes.
79 */
80 public function getCurrent(): OutputFormatterStyleInterface
81 {
82 if (!$this->styles) {
83 return $this->emptyStyle;
84 }
85
86 return $this->styles[\count($this->styles) - 1];
87 }
88
89 /**
90 * @return $this
91 */
92 public function setEmptyStyle(OutputFormatterStyleInterface $emptyStyle): static
93 {
94 $this->emptyStyle = $emptyStyle;
95
96 return $this;
97 }
98
99 public function getEmptyStyle(): OutputFormatterStyleInterface
100 {
101 return $this->emptyStyle;
102 }
103}