Verzeichnisstruktur phpBB-3.1.0
- Veröffentlicht
- 27.10.2014
So funktioniert es
|
Auf das letzte Element klicken. Dies geht jeweils ein Schritt zurück |
Auf das Icon klicken, dies öffnet das Verzeichnis. Nochmal klicken schließt das Verzeichnis. |
|
(Beispiel Datei-Icons)
|
Auf das Icon klicken um den Quellcode anzuzeigen |
OutputFormatter.php
001 <?php
002
003 /*
004 * This file is part of the Symfony package.
005 *
006 * (c) Fabien Potencier <fabien@symfony.com>
007 *
008 * For the full copyright and license information, please view the LICENSE
009 * file that was distributed with this source code.
010 */
011
012 namespace Symfony\Component\Console\Formatter;
013
014 /**
015 * Formatter class for console output.
016 *
017 * @author Konstantin Kudryashov <ever.zet@gmail.com>
018 *
019 * @api
020 */
021 class OutputFormatter implements OutputFormatterInterface
022 {
023 private $decorated;
024 private $styles = array();
025 private $styleStack;
026
027 /**
028 * Escapes "<" special char in given text.
029 *
030 * @param string $text Text to escape
031 *
032 * @return string Escaped text
033 */
034 public static function escape($text)
035 {
036 return preg_replace('/([^\\\\]?)</is', '$1\\<', $text);
037 }
038
039 /**
040 * Initializes console output formatter.
041 *
042 * @param bool $decorated Whether this formatter should actually decorate strings
043 * @param OutputFormatterStyleInterface[] $styles Array of "name => FormatterStyle" instances
044 *
045 * @api
046 */
047 public function __construct($decorated = false, array $styles = array())
048 {
049 $this->decorated = (bool) $decorated;
050
051 $this->setStyle('error', new OutputFormatterStyle('white', 'red'));
052 $this->setStyle('info', new OutputFormatterStyle('green'));
053 $this->setStyle('comment', new OutputFormatterStyle('yellow'));
054 $this->setStyle('question', new OutputFormatterStyle('black', 'cyan'));
055
056 foreach ($styles as $name => $style) {
057 $this->setStyle($name, $style);
058 }
059
060 $this->styleStack = new OutputFormatterStyleStack();
061 }
062
063 /**
064 * Sets the decorated flag.
065 *
066 * @param bool $decorated Whether to decorate the messages or not
067 *
068 * @api
069 */
070 public function setDecorated($decorated)
071 {
072 $this->decorated = (bool) $decorated;
073 }
074
075 /**
076 * Gets the decorated flag.
077 *
078 * @return bool true if the output will decorate messages, false otherwise
079 *
080 * @api
081 */
082 public function isDecorated()
083 {
084 return $this->decorated;
085 }
086
087 /**
088 * Sets a new style.
089 *
090 * @param string $name The style name
091 * @param OutputFormatterStyleInterface $style The style instance
092 *
093 * @api
094 */
095 public function setStyle($name, OutputFormatterStyleInterface $style)
096 {
097 $this->styles[strtolower($name)] = $style;
098 }
099
100 /**
101 * Checks if output formatter has style with specified name.
102 *
103 * @param string $name
104 *
105 * @return bool
106 *
107 * @api
108 */
109 public function hasStyle($name)
110 {
111 return isset($this->styles[strtolower($name)]);
112 }
113
114 /**
115 * Gets style options from style with specified name.
116 *
117 * @param string $name
118 *
119 * @return OutputFormatterStyleInterface
120 *
121 * @throws \InvalidArgumentException When style isn't defined
122 *
123 * @api
124 */
125 public function getStyle($name)
126 {
127 if (!$this->hasStyle($name)) {
128 throw new \InvalidArgumentException(sprintf('Undefined style: %s', $name));
129 }
130
131 return $this->styles[strtolower($name)];
132 }
133
134 /**
135 * Formats a message according to the given styles.
136 *
137 * @param string $message The message to style
138 *
139 * @return string The styled message
140 *
141 * @api
142 */
143 public function format($message)
144 {
145 $offset = 0;
146 $output = '';
147 $tagRegex = '[a-z][a-z0-9_=;-]*';
148 preg_match_all("#<(($tagRegex) | /($tagRegex)?)>#isx", $message, $matches, PREG_OFFSET_CAPTURE);
149 foreach ($matches[0] as $i => $match) {
150 $pos = $match[1];
151 $text = $match[0];
152
153 // add the text up to the next tag
154 $output .= $this->applyCurrentStyle(substr($message, $offset, $pos - $offset));
155 $offset = $pos + strlen($text);
156
157 // opening tag?
158 if ($open = '/' != $text[1]) {
159 $tag = $matches[1][$i][0];
160 } else {
161 $tag = isset($matches[3][$i][0]) ? $matches[3][$i][0] : '';
162 }
163
164 if (!$open && !$tag) {
165 // </>
166 $this->styleStack->pop();
167 } elseif ($pos && '\\' == $message[$pos - 1]) {
168 // escaped tag
169 $output .= $this->applyCurrentStyle($text);
170 } elseif (false === $style = $this->createStyleFromString(strtolower($tag))) {
171 $output .= $this->applyCurrentStyle($text);
172 } elseif ($open) {
173 $this->styleStack->push($style);
174 } else {
175 $this->styleStack->pop($style);
176 }
177 }
178
179 $output .= $this->applyCurrentStyle(substr($message, $offset));
180
181 return str_replace('\\<', '<', $output);
182 }
183
184 /**
185 * @return OutputFormatterStyleStack
186 */
187 public function getStyleStack()
188 {
189 return $this->styleStack;
190 }
191
192 /**
193 * Tries to create new style instance from string.
194 *
195 * @param string $string
196 *
197 * @return OutputFormatterStyle|bool false if string is not format string
198 */
199 private function createStyleFromString($string)
200 {
201 if (isset($this->styles[$string])) {
202 return $this->styles[$string];
203 }
204
205 if (!preg_match_all('/([^=]+)=([^;]+)(;|$)/', strtolower($string), $matches, PREG_SET_ORDER)) {
206 return false;
207 }
208
209 $style = new OutputFormatterStyle();
210 foreach ($matches as $match) {
211 array_shift($match);
212
213 if ('fg' == $match[0]) {
214 $style->setForeground($match[1]);
215 } elseif ('bg' == $match[0]) {
216 $style->setBackground($match[1]);
217 } else {
218 try {
219 $style->setOption($match[1]);
220 } catch (\InvalidArgumentException $e) {
221 return false;
222 }
223 }
224 }
225
226 return $style;
227 }
228
229 /**
230 * Applies current style from stack to text, if must be applied.
231 *
232 * @param string $text Input text
233 *
234 * @return string Styled text
235 */
236 private function applyCurrentStyle($text)
237 {
238 return $this->isDecorated() && strlen($text) > 0 ? $this->styleStack->getCurrent()->apply($text) : $text;
239 }
240 }
241