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.
Auf den Verzeichnisnamen klicken, dies zeigt nur das Verzeichnis mit Inhalt an

      (Beispiel Datei-Icons)

Auf das Icon klicken um den Quellcode anzuzeigen

SymfonyStyle.php

Zuletzt modifiziert: 09.10.2024, 12:56 - Dateigröße: 11.81 KiB


 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\Style;
 013   
 014  use Symfony\Component\Console\Application;
 015  use Symfony\Component\Console\Exception\RuntimeException;
 016  use Symfony\Component\Console\Formatter\OutputFormatter;
 017  use Symfony\Component\Console\Helper\Helper;
 018  use Symfony\Component\Console\Helper\ProgressBar;
 019  use Symfony\Component\Console\Helper\SymfonyQuestionHelper;
 020  use Symfony\Component\Console\Helper\Table;
 021  use Symfony\Component\Console\Input\InputInterface;
 022  use Symfony\Component\Console\Output\BufferedOutput;
 023  use Symfony\Component\Console\Output\OutputInterface;
 024  use Symfony\Component\Console\Question\ChoiceQuestion;
 025  use Symfony\Component\Console\Question\ConfirmationQuestion;
 026  use Symfony\Component\Console\Question\Question;
 027   
 028  /**
 029   * Output decorator helpers for the Symfony Style Guide.
 030   *
 031   * @author Kevin Bond <kevinbond@gmail.com>
 032   */
 033  class SymfonyStyle extends OutputStyle
 034  {
 035      const MAX_LINE_LENGTH = 120;
 036   
 037      private $input;
 038      private $questionHelper;
 039      private $progressBar;
 040      private $lineLength;
 041      private $bufferedOutput;
 042   
 043      /**
 044       * @param InputInterface  $input
 045       * @param OutputInterface $output
 046       */
 047      public function __construct(InputInterface $input, OutputInterface $output)
 048      {
 049          $this->input = $input;
 050          $this->bufferedOutput = new BufferedOutput($output->getVerbosity(), false, clone $output->getFormatter());
 051          // Windows cmd wraps lines as soon as the terminal width is reached, whether there are following chars or not.
 052          $this->lineLength = min($this->getTerminalWidth() - (int) (DIRECTORY_SEPARATOR === '\\'), self::MAX_LINE_LENGTH);
 053   
 054          parent::__construct($output);
 055      }
 056   
 057      /**
 058       * Formats a message as a block of text.
 059       *
 060       * @param string|array $messages The message to write in the block
 061       * @param string|null  $type     The block type (added in [] on first line)
 062       * @param string|null  $style    The style to apply to the whole block
 063       * @param string       $prefix   The prefix for the block
 064       * @param bool         $padding  Whether to add vertical padding
 065       */
 066      public function block($messages, $type = null, $style = null, $prefix = ' ', $padding = false)
 067      {
 068          $messages = is_array($messages) ? array_values($messages) : array($messages);
 069   
 070          $this->autoPrependBlock();
 071          $this->writeln($this->createBlock($messages, $type, $style, $prefix, $padding, true));
 072          $this->newLine();
 073      }
 074   
 075      /**
 076       * {@inheritdoc}
 077       */
 078      public function title($message)
 079      {
 080          $this->autoPrependBlock();
 081          $this->writeln(array(
 082              sprintf('<comment>%s</>', $message),
 083              sprintf('<comment>%s</>', str_repeat('=', Helper::strlenWithoutDecoration($this->getFormatter(), $message))),
 084          ));
 085          $this->newLine();
 086      }
 087   
 088      /**
 089       * {@inheritdoc}
 090       */
 091      public function section($message)
 092      {
 093          $this->autoPrependBlock();
 094          $this->writeln(array(
 095              sprintf('<comment>%s</>', $message),
 096              sprintf('<comment>%s</>', str_repeat('-', Helper::strlenWithoutDecoration($this->getFormatter(), $message))),
 097          ));
 098          $this->newLine();
 099      }
 100   
 101      /**
 102       * {@inheritdoc}
 103       */
 104      public function listing(array $elements)
 105      {
 106          $this->autoPrependText();
 107          $elements = array_map(function ($element) {
 108              return sprintf(' * %s', $element);
 109          }, $elements);
 110   
 111          $this->writeln($elements);
 112          $this->newLine();
 113      }
 114   
 115      /**
 116       * {@inheritdoc}
 117       */
 118      public function text($message)
 119      {
 120          $this->autoPrependText();
 121   
 122          $messages = is_array($message) ? array_values($message) : array($message);
 123          foreach ($messages as $message) {
 124              $this->writeln(sprintf(' %s', $message));
 125          }
 126      }
 127   
 128      /**
 129       * Formats a command comment.
 130       *
 131       * @param string|array $message
 132       */
 133      public function comment($message)
 134      {
 135          $messages = is_array($message) ? array_values($message) : array($message);
 136   
 137          $this->autoPrependBlock();
 138          $this->writeln($this->createBlock($messages, null, null, '<fg=default;bg=default> // </>'));
 139          $this->newLine();
 140      }
 141   
 142      /**
 143       * {@inheritdoc}
 144       */
 145      public function success($message)
 146      {
 147          $this->block($message, 'OK', 'fg=black;bg=green', ' ', true);
 148      }
 149   
 150      /**
 151       * {@inheritdoc}
 152       */
 153      public function error($message)
 154      {
 155          $this->block($message, 'ERROR', 'fg=white;bg=red', ' ', true);
 156      }
 157   
 158      /**
 159       * {@inheritdoc}
 160       */
 161      public function warning($message)
 162      {
 163          $this->block($message, 'WARNING', 'fg=white;bg=red', ' ', true);
 164      }
 165   
 166      /**
 167       * {@inheritdoc}
 168       */
 169      public function note($message)
 170      {
 171          $this->block($message, 'NOTE', 'fg=yellow', ' ! ');
 172      }
 173   
 174      /**
 175       * {@inheritdoc}
 176       */
 177      public function caution($message)
 178      {
 179          $this->block($message, 'CAUTION', 'fg=white;bg=red', ' ! ', true);
 180      }
 181   
 182      /**
 183       * {@inheritdoc}
 184       */
 185      public function table(array $headers, array $rows)
 186      {
 187          $style = clone Table::getStyleDefinition('symfony-style-guide');
 188          $style->setCellHeaderFormat('<info>%s</info>');
 189   
 190          $table = new Table($this);
 191          $table->setHeaders($headers);
 192          $table->setRows($rows);
 193          $table->setStyle($style);
 194   
 195          $table->render();
 196          $this->newLine();
 197      }
 198   
 199      /**
 200       * {@inheritdoc}
 201       */
 202      public function ask($question, $default = null, $validator = null)
 203      {
 204          $question = new Question($question, $default);
 205          $question->setValidator($validator);
 206   
 207          return $this->askQuestion($question);
 208      }
 209   
 210      /**
 211       * {@inheritdoc}
 212       */
 213      public function askHidden($question, $validator = null)
 214      {
 215          $question = new Question($question);
 216   
 217          $question->setHidden(true);
 218          $question->setValidator($validator);
 219   
 220          return $this->askQuestion($question);
 221      }
 222   
 223      /**
 224       * {@inheritdoc}
 225       */
 226      public function confirm($question, $default = true)
 227      {
 228          return $this->askQuestion(new ConfirmationQuestion($question, $default));
 229      }
 230   
 231      /**
 232       * {@inheritdoc}
 233       */
 234      public function choice($question, array $choices, $default = null)
 235      {
 236          if (null !== $default) {
 237              $values = array_flip($choices);
 238              $default = $values[$default];
 239          }
 240   
 241          return $this->askQuestion(new ChoiceQuestion($question, $choices, $default));
 242      }
 243   
 244      /**
 245       * {@inheritdoc}
 246       */
 247      public function progressStart($max = 0)
 248      {
 249          $this->progressBar = $this->createProgressBar($max);
 250          $this->progressBar->start();
 251      }
 252   
 253      /**
 254       * {@inheritdoc}
 255       */
 256      public function progressAdvance($step = 1)
 257      {
 258          $this->getProgressBar()->advance($step);
 259      }
 260   
 261      /**
 262       * {@inheritdoc}
 263       */
 264      public function progressFinish()
 265      {
 266          $this->getProgressBar()->finish();
 267          $this->newLine(2);
 268          $this->progressBar = null;
 269      }
 270   
 271      /**
 272       * {@inheritdoc}
 273       */
 274      public function createProgressBar($max = 0)
 275      {
 276          $progressBar = parent::createProgressBar($max);
 277   
 278          if ('\\' !== DIRECTORY_SEPARATOR) {
 279              $progressBar->setEmptyBarCharacter('░'); // light shade character \u2591
 280              $progressBar->setProgressCharacter('');
 281              $progressBar->setBarCharacter('▓'); // dark shade character \u2593
 282          }
 283   
 284          return $progressBar;
 285      }
 286   
 287      /**
 288       * @param Question $question
 289       *
 290       * @return string
 291       */
 292      public function askQuestion(Question $question)
 293      {
 294          if ($this->input->isInteractive()) {
 295              $this->autoPrependBlock();
 296          }
 297   
 298          if (!$this->questionHelper) {
 299              $this->questionHelper = new SymfonyQuestionHelper();
 300          }
 301   
 302          $answer = $this->questionHelper->ask($this->input, $this, $question);
 303   
 304          if ($this->input->isInteractive()) {
 305              $this->newLine();
 306              $this->bufferedOutput->write("\n");
 307          }
 308   
 309          return $answer;
 310      }
 311   
 312      /**
 313       * {@inheritdoc}
 314       */
 315      public function writeln($messages, $type = self::OUTPUT_NORMAL)
 316      {
 317          parent::writeln($messages, $type);
 318          $this->bufferedOutput->writeln($this->reduceBuffer($messages), $type);
 319      }
 320   
 321      /**
 322       * {@inheritdoc}
 323       */
 324      public function write($messages, $newline = false, $type = self::OUTPUT_NORMAL)
 325      {
 326          parent::write($messages, $newline, $type);
 327          $this->bufferedOutput->write($this->reduceBuffer($messages), $newline, $type);
 328      }
 329   
 330      /**
 331       * {@inheritdoc}
 332       */
 333      public function newLine($count = 1)
 334      {
 335          parent::newLine($count);
 336          $this->bufferedOutput->write(str_repeat("\n", $count));
 337      }
 338   
 339      /**
 340       * @return ProgressBar
 341       */
 342      private function getProgressBar()
 343      {
 344          if (!$this->progressBar) {
 345              throw new RuntimeException('The ProgressBar is not started.');
 346          }
 347   
 348          return $this->progressBar;
 349      }
 350   
 351      private function getTerminalWidth()
 352      {
 353          $application = new Application();
 354          $dimensions = $application->getTerminalDimensions();
 355   
 356          return $dimensions[0] ?: self::MAX_LINE_LENGTH;
 357      }
 358   
 359      private function autoPrependBlock()
 360      {
 361          $chars = substr(str_replace(PHP_EOL, "\n", $this->bufferedOutput->fetch()), -2);
 362   
 363          if (!isset($chars[0])) {
 364              return $this->newLine(); //empty history, so we should start with a new line.
 365          }
 366          //Prepend new line for each non LF chars (This means no blank line was output before)
 367          $this->newLine(2 - substr_count($chars, "\n"));
 368      }
 369   
 370      private function autoPrependText()
 371      {
 372          $fetched = $this->bufferedOutput->fetch();
 373          //Prepend new line if last char isn't EOL:
 374          if ("\n" !== substr($fetched, -1)) {
 375              $this->newLine();
 376          }
 377      }
 378   
 379      private function reduceBuffer($messages)
 380      {
 381          // We need to know if the two last chars are PHP_EOL
 382          // Preserve the last 4 chars inserted (PHP_EOL on windows is two chars) in the history buffer
 383          return array_map(function ($value) {
 384              return substr($value, -4);
 385          }, array_merge(array($this->bufferedOutput->fetch()), (array) $messages));
 386      }
 387   
 388      private function createBlock($messages, $type = null, $style = null, $prefix = ' ', $padding = false, $escape = false)
 389      {
 390          $indentLength = 0;
 391          $prefixLength = Helper::strlenWithoutDecoration($this->getFormatter(), $prefix);
 392          $lines = array();
 393   
 394          if (null !== $type) {
 395              $type = sprintf('[%s] ', $type);
 396              $indentLength = strlen($type);
 397              $lineIndentation = str_repeat(' ', $indentLength);
 398          }
 399   
 400          // wrap and add newlines for each element
 401          foreach ($messages as $key => $message) {
 402              if ($escape) {
 403                  $message = OutputFormatter::escape($message);
 404              }
 405   
 406              $lines = array_merge($lines, explode(PHP_EOL, wordwrap($message, $this->lineLength - $prefixLength - $indentLength, PHP_EOL, true)));
 407   
 408              if (count($messages) > 1 && $key < count($messages) - 1) {
 409                  $lines[] = '';
 410              }
 411          }
 412   
 413          $firstLineIndex = 0;
 414          if ($padding && $this->isDecorated()) {
 415              $firstLineIndex = 1;
 416              array_unshift($lines, '');
 417              $lines[] = '';
 418          }
 419   
 420          foreach ($lines as $i => &$line) {
 421              if (null !== $type) {
 422                  $line = $firstLineIndex === $i ? $type.$line : $lineIndentation.$line;
 423              }
 424   
 425              $line = $prefix.$line;
 426              $line .= str_repeat(' ', $this->lineLength - Helper::strlenWithoutDecoration($this->getFormatter(), $line));
 427   
 428              if ($style) {
 429                  $line = sprintf('<%s>%s</>', $style, $line);
 430              }
 431          }
 432   
 433          return $lines;
 434      }
 435  }
 436