Verzeichnisstruktur phpBB-3.2.0
- Veröffentlicht
- 06.01.2017
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 |
ProgressIndicator.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\Helper;
013
014 use Symfony\Component\Console\Exception\InvalidArgumentException;
015 use Symfony\Component\Console\Exception\LogicException;
016 use Symfony\Component\Console\Output\OutputInterface;
017
018 /**
019 * @author Kevin Bond <kevinbond@gmail.com>
020 */
021 class ProgressIndicator
022 {
023 private $output;
024 private $startTime;
025 private $format;
026 private $message;
027 private $indicatorValues;
028 private $indicatorCurrent;
029 private $indicatorChangeInterval;
030 private $indicatorUpdateTime;
031 private $started = false;
032
033 private static $formatters;
034 private static $formats;
035
036 /**
037 * @param OutputInterface $output
038 * @param string|null $format Indicator format
039 * @param int $indicatorChangeInterval Change interval in milliseconds
040 * @param array|null $indicatorValues Animated indicator characters
041 */
042 public function __construct(OutputInterface $output, $format = null, $indicatorChangeInterval = 100, $indicatorValues = null)
043 {
044 $this->output = $output;
045
046 if (null === $format) {
047 $format = $this->determineBestFormat();
048 }
049
050 if (null === $indicatorValues) {
051 $indicatorValues = array('-', '\\', '|', '/');
052 }
053
054 $indicatorValues = array_values($indicatorValues);
055
056 if (2 > count($indicatorValues)) {
057 throw new InvalidArgumentException('Must have at least 2 indicator value characters.');
058 }
059
060 $this->format = self::getFormatDefinition($format);
061 $this->indicatorChangeInterval = $indicatorChangeInterval;
062 $this->indicatorValues = $indicatorValues;
063 $this->startTime = time();
064 }
065
066 /**
067 * Sets the current indicator message.
068 *
069 * @param string|null $message
070 */
071 public function setMessage($message)
072 {
073 $this->message = $message;
074
075 $this->display();
076 }
077
078 /**
079 * Gets the current indicator message.
080 *
081 * @return string|null
082 *
083 * @internal for PHP 5.3 compatibility
084 */
085 public function getMessage()
086 {
087 return $this->message;
088 }
089
090 /**
091 * Gets the progress bar start time.
092 *
093 * @return int The progress bar start time
094 *
095 * @internal for PHP 5.3 compatibility
096 */
097 public function getStartTime()
098 {
099 return $this->startTime;
100 }
101
102 /**
103 * Gets the current animated indicator character.
104 *
105 * @return string
106 *
107 * @internal for PHP 5.3 compatibility
108 */
109 public function getCurrentValue()
110 {
111 return $this->indicatorValues[$this->indicatorCurrent % count($this->indicatorValues)];
112 }
113
114 /**
115 * Starts the indicator output.
116 *
117 * @param $message
118 */
119 public function start($message)
120 {
121 if ($this->started) {
122 throw new LogicException('Progress indicator already started.');
123 }
124
125 $this->message = $message;
126 $this->started = true;
127 $this->startTime = time();
128 $this->indicatorUpdateTime = $this->getCurrentTimeInMilliseconds() + $this->indicatorChangeInterval;
129 $this->indicatorCurrent = 0;
130
131 $this->display();
132 }
133
134 /**
135 * Advances the indicator.
136 */
137 public function advance()
138 {
139 if (!$this->started) {
140 throw new LogicException('Progress indicator has not yet been started.');
141 }
142
143 if (!$this->output->isDecorated()) {
144 return;
145 }
146
147 $currentTime = $this->getCurrentTimeInMilliseconds();
148
149 if ($currentTime < $this->indicatorUpdateTime) {
150 return;
151 }
152
153 $this->indicatorUpdateTime = $currentTime + $this->indicatorChangeInterval;
154 ++$this->indicatorCurrent;
155
156 $this->display();
157 }
158
159 /**
160 * Finish the indicator with message.
161 *
162 * @param $message
163 */
164 public function finish($message)
165 {
166 if (!$this->started) {
167 throw new LogicException('Progress indicator has not yet been started.');
168 }
169
170 $this->message = $message;
171 $this->display();
172 $this->output->writeln('');
173 $this->started = false;
174 }
175
176 /**
177 * Gets the format for a given name.
178 *
179 * @param string $name The format name
180 *
181 * @return string|null A format string
182 */
183 public static function getFormatDefinition($name)
184 {
185 if (!self::$formats) {
186 self::$formats = self::initFormats();
187 }
188
189 return isset(self::$formats[$name]) ? self::$formats[$name] : null;
190 }
191
192 /**
193 * Sets a placeholder formatter for a given name.
194 *
195 * This method also allow you to override an existing placeholder.
196 *
197 * @param string $name The placeholder name (including the delimiter char like %)
198 * @param callable $callable A PHP callable
199 */
200 public static function setPlaceholderFormatterDefinition($name, $callable)
201 {
202 if (!self::$formatters) {
203 self::$formatters = self::initPlaceholderFormatters();
204 }
205
206 self::$formatters[$name] = $callable;
207 }
208
209 /**
210 * Gets the placeholder formatter for a given name.
211 *
212 * @param string $name The placeholder name (including the delimiter char like %)
213 *
214 * @return callable|null A PHP callable
215 */
216 public static function getPlaceholderFormatterDefinition($name)
217 {
218 if (!self::$formatters) {
219 self::$formatters = self::initPlaceholderFormatters();
220 }
221
222 return isset(self::$formatters[$name]) ? self::$formatters[$name] : null;
223 }
224
225 private function display()
226 {
227 if (OutputInterface::VERBOSITY_QUIET === $this->output->getVerbosity()) {
228 return;
229 }
230
231 $self = $this;
232
233 $this->overwrite(preg_replace_callback("{%([a-z\-_]+)(?:\:([^%]+))?%}i", function ($matches) use ($self) {
234 if ($formatter = $self::getPlaceholderFormatterDefinition($matches[1])) {
235 return call_user_func($formatter, $self);
236 }
237
238 return $matches[0];
239 }, $this->format));
240 }
241
242 private function determineBestFormat()
243 {
244 switch ($this->output->getVerbosity()) {
245 // OutputInterface::VERBOSITY_QUIET: display is disabled anyway
246 case OutputInterface::VERBOSITY_VERBOSE:
247 return $this->output->isDecorated() ? 'verbose' : 'verbose_no_ansi';
248 case OutputInterface::VERBOSITY_VERY_VERBOSE:
249 case OutputInterface::VERBOSITY_DEBUG:
250 return $this->output->isDecorated() ? 'very_verbose' : 'very_verbose_no_ansi';
251 default:
252 return $this->output->isDecorated() ? 'normal' : 'normal_no_ansi';
253 }
254 }
255
256 /**
257 * Overwrites a previous message to the output.
258 *
259 * @param string $message The message
260 */
261 private function overwrite($message)
262 {
263 if ($this->output->isDecorated()) {
264 $this->output->write("\x0D\x1B[2K");
265 $this->output->write($message);
266 } else {
267 $this->output->writeln($message);
268 }
269 }
270
271 private function getCurrentTimeInMilliseconds()
272 {
273 return round(microtime(true) * 1000);
274 }
275
276 private static function initPlaceholderFormatters()
277 {
278 return array(
279 'indicator' => function (ProgressIndicator $indicator) {
280 return $indicator->getCurrentValue();
281 },
282 'message' => function (ProgressIndicator $indicator) {
283 return $indicator->getMessage();
284 },
285 'elapsed' => function (ProgressIndicator $indicator) {
286 return Helper::formatTime(time() - $indicator->getStartTime());
287 },
288 'memory' => function () {
289 return Helper::formatMemory(memory_get_usage(true));
290 },
291 );
292 }
293
294 private static function initFormats()
295 {
296 return array(
297 'normal' => ' %indicator% %message%',
298 'normal_no_ansi' => ' %message%',
299
300 'verbose' => ' %indicator% %message% (%elapsed:6s%)',
301 'verbose_no_ansi' => ' %message% (%elapsed:6s%)',
302
303 'very_verbose' => ' %indicator% %message% (%elapsed:6s%, %memory:6s%)',
304 'very_verbose_no_ansi' => ' %message% (%elapsed:6s%, %memory:6s%)',
305 );
306 }
307 }
308