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

      (Beispiel Datei-Icons)

Auf das Icon klicken um den Quellcode anzuzeigen

TableHelper.php

Zuletzt modifiziert: 09.10.2024, 12:58 - Dateigröße: 11.52 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\Helper;
 013   
 014  use Symfony\Component\Console\Output\OutputInterface;
 015  use InvalidArgumentException;
 016   
 017  /**
 018   * Provides helpers to display table output.
 019   *
 020   * @author Саша Стаменковић <umpirsky@gmail.com>
 021   */
 022  class TableHelper extends Helper
 023  {
 024      const LAYOUT_DEFAULT = 0;
 025      const LAYOUT_BORDERLESS = 1;
 026   
 027      /**
 028       * Table headers.
 029       *
 030       * @var array
 031       */
 032      private $headers = array();
 033   
 034      /**
 035       * Table rows.
 036       *
 037       * @var array
 038       */
 039      private $rows = array();
 040   
 041      // Rendering options
 042      private $paddingChar;
 043      private $horizontalBorderChar;
 044      private $verticalBorderChar;
 045      private $crossingChar;
 046      private $cellHeaderFormat;
 047      private $cellRowFormat;
 048      private $borderFormat;
 049      private $padType;
 050   
 051      /**
 052       * Column widths cache.
 053       *
 054       * @var array
 055       */
 056      private $columnWidths = array();
 057   
 058      /**
 059       * Number of columns cache.
 060       *
 061       * @var array
 062       */
 063      private $numberOfColumns;
 064   
 065      /**
 066       * @var OutputInterface
 067       */
 068      private $output;
 069   
 070      public function __construct()
 071      {
 072          $this->setLayout(self::LAYOUT_DEFAULT);
 073      }
 074   
 075      /**
 076       * Sets table layout type.
 077       *
 078       * @param int $layout self::LAYOUT_*
 079       *
 080       * @return TableHelper
 081       *
 082       * @throws InvalidArgumentException when the table layout is not known
 083       */
 084      public function setLayout($layout)
 085      {
 086          switch ($layout) {
 087              case self::LAYOUT_BORDERLESS:
 088                  $this
 089                      ->setPaddingChar(' ')
 090                      ->setHorizontalBorderChar('=')
 091                      ->setVerticalBorderChar(' ')
 092                      ->setCrossingChar(' ')
 093                      ->setCellHeaderFormat('<info>%s</info>')
 094                      ->setCellRowFormat('<comment>%s</comment>')
 095                      ->setBorderFormat('%s')
 096                      ->setPadType(STR_PAD_RIGHT)
 097                  ;
 098                  break;
 099   
 100              case self::LAYOUT_DEFAULT:
 101                  $this
 102                      ->setPaddingChar(' ')
 103                      ->setHorizontalBorderChar('-')
 104                      ->setVerticalBorderChar('|')
 105                      ->setCrossingChar('+')
 106                      ->setCellHeaderFormat('<info>%s</info>')
 107                      ->setCellRowFormat('<comment>%s</comment>')
 108                      ->setBorderFormat('%s')
 109                      ->setPadType(STR_PAD_RIGHT)
 110                  ;
 111                  break;
 112   
 113              default:
 114                  throw new InvalidArgumentException(sprintf('Invalid table layout "%s".', $layout));
 115                  break;
 116          };
 117   
 118          return $this;
 119      }
 120   
 121      public function setHeaders(array $headers)
 122      {
 123          $this->headers = array_values($headers);
 124   
 125          return $this;
 126      }
 127   
 128      public function setRows(array $rows)
 129      {
 130          $this->rows = array();
 131   
 132          return $this->addRows($rows);
 133      }
 134   
 135      public function addRows(array $rows)
 136      {
 137          foreach ($rows as $row) {
 138              $this->addRow($row);
 139          }
 140   
 141          return $this;
 142      }
 143   
 144      public function addRow(array $row)
 145      {
 146          $this->rows[] = array_values($row);
 147   
 148          $keys = array_keys($this->rows);
 149          $rowKey = array_pop($keys);
 150   
 151          foreach ($row as $key => $cellValue) {
 152              if (!strstr($cellValue, "\n")) {
 153                  continue;
 154              }
 155   
 156              $lines = explode("\n", $cellValue);
 157              $this->rows[$rowKey][$key] = $lines[0];
 158              unset($lines[0]);
 159   
 160              foreach ($lines as $lineKey => $line) {
 161                  $nextRowKey = $rowKey + $lineKey + 1;
 162   
 163                  if (isset($this->rows[$nextRowKey])) {
 164                      $this->rows[$nextRowKey][$key] = $line;
 165                  } else {
 166                      $this->rows[$nextRowKey] = array($key => $line);
 167                  }
 168              }
 169          }
 170   
 171          return $this;
 172      }
 173   
 174      public function setRow($column, array $row)
 175      {
 176          $this->rows[$column] = $row;
 177   
 178          return $this;
 179      }
 180   
 181      /**
 182       * Sets padding character, used for cell padding.
 183       *
 184       * @param string $paddingChar
 185       *
 186       * @return TableHelper
 187       */
 188      public function setPaddingChar($paddingChar)
 189      {
 190          $this->paddingChar = $paddingChar;
 191   
 192          return $this;
 193      }
 194   
 195      /**
 196       * Sets horizontal border character.
 197       *
 198       * @param string $horizontalBorderChar
 199       *
 200       * @return TableHelper
 201       */
 202      public function setHorizontalBorderChar($horizontalBorderChar)
 203      {
 204          $this->horizontalBorderChar = $horizontalBorderChar;
 205   
 206          return $this;
 207      }
 208   
 209      /**
 210       * Sets vertical border character.
 211       *
 212       * @param string $verticalBorderChar
 213       *
 214       * @return TableHelper
 215       */
 216      public function setVerticalBorderChar($verticalBorderChar)
 217      {
 218          $this->verticalBorderChar = $verticalBorderChar;
 219   
 220          return $this;
 221      }
 222   
 223      /**
 224       * Sets crossing character.
 225       *
 226       * @param string $crossingChar
 227       *
 228       * @return TableHelper
 229       */
 230      public function setCrossingChar($crossingChar)
 231      {
 232          $this->crossingChar = $crossingChar;
 233   
 234          return $this;
 235      }
 236   
 237      /**
 238       * Sets header cell format.
 239       *
 240       * @param string $cellHeaderFormat
 241       *
 242       * @return TableHelper
 243       */
 244      public function setCellHeaderFormat($cellHeaderFormat)
 245      {
 246          $this->cellHeaderFormat = $cellHeaderFormat;
 247   
 248          return $this;
 249      }
 250   
 251      /**
 252       * Sets row cell format.
 253       *
 254       * @param string $cellRowFormat
 255       *
 256       * @return TableHelper
 257       */
 258      public function setCellRowFormat($cellRowFormat)
 259      {
 260          $this->cellRowFormat = $cellRowFormat;
 261   
 262          return $this;
 263      }
 264   
 265      /**
 266       * Sets table border format.
 267       *
 268       * @param string $borderFormat
 269       *
 270       * @return TableHelper
 271       */
 272      public function setBorderFormat($borderFormat)
 273      {
 274          $this->borderFormat = $borderFormat;
 275   
 276          return $this;
 277      }
 278   
 279      /**
 280       * Sets cell padding type.
 281       *
 282       * @param int     $padType STR_PAD_*
 283       *
 284       * @return TableHelper
 285       */
 286      public function setPadType($padType)
 287      {
 288          $this->padType = $padType;
 289   
 290          return $this;
 291      }
 292   
 293      /**
 294       * Renders table to output.
 295       *
 296       * Example:
 297       * +---------------+-----------------------+------------------+
 298       * | ISBN          | Title                 | Author           |
 299       * +---------------+-----------------------+------------------+
 300       * | 99921-58-10-7 | Divine Comedy         | Dante Alighieri  |
 301       * | 9971-5-0210-0 | A Tale of Two Cities  | Charles Dickens  |
 302       * | 960-425-059-0 | The Lord of the Rings | J. R. R. Tolkien |
 303       * +---------------+-----------------------+------------------+
 304       *
 305       * @param OutputInterface $output
 306       */
 307      public function render(OutputInterface $output)
 308      {
 309          $this->output = $output;
 310   
 311          $this->renderRowSeparator();
 312          $this->renderRow($this->headers, $this->cellHeaderFormat);
 313          if (!empty($this->headers)) {
 314              $this->renderRowSeparator();
 315          }
 316          foreach ($this->rows as $row) {
 317              $this->renderRow($row, $this->cellRowFormat);
 318          }
 319          if (!empty($this->rows)) {
 320              $this->renderRowSeparator();
 321          }
 322   
 323          $this->cleanup();
 324      }
 325   
 326      /**
 327       * Renders horizontal header separator.
 328       *
 329       * Example: +-----+-----------+-------+
 330       */
 331      private function renderRowSeparator()
 332      {
 333          if (0 === $count = $this->getNumberOfColumns()) {
 334              return;
 335          }
 336   
 337          $markup = $this->crossingChar;
 338          for ($column = 0; $column < $count; $column++) {
 339              $markup .= str_repeat($this->horizontalBorderChar, $this->getColumnWidth($column))
 340                      .$this->crossingChar
 341              ;
 342          }
 343   
 344          $this->output->writeln(sprintf($this->borderFormat, $markup));
 345      }
 346   
 347      /**
 348       * Renders vertical column separator.
 349       */
 350      private function renderColumnSeparator()
 351      {
 352          $this->output->write(sprintf($this->borderFormat, $this->verticalBorderChar));
 353      }
 354   
 355      /**
 356       * Renders table row.
 357       *
 358       * Example: | 9971-5-0210-0 | A Tale of Two Cities  | Charles Dickens  |
 359       *
 360       * @param array  $row
 361       * @param string $cellFormat
 362       */
 363      private function renderRow(array $row, $cellFormat)
 364      {
 365          if (empty($row)) {
 366              return;
 367          }
 368   
 369          $this->renderColumnSeparator();
 370          for ($column = 0, $count = $this->getNumberOfColumns(); $column < $count; $column++) {
 371              $this->renderCell($row, $column, $cellFormat);
 372              $this->renderColumnSeparator();
 373          }
 374          $this->output->writeln('');
 375      }
 376   
 377      /**
 378       * Renders table cell with padding.
 379       *
 380       * @param array   $row
 381       * @param int     $column
 382       * @param string  $cellFormat
 383       */
 384      private function renderCell(array $row, $column, $cellFormat)
 385      {
 386          $cell = isset($row[$column]) ? $row[$column] : '';
 387          $width = $this->getColumnWidth($column);
 388   
 389          // str_pad won't work properly with multi-byte strings, we need to fix the padding
 390          if (function_exists('mb_strlen') && false !== $encoding = mb_detect_encoding($cell)) {
 391              $width += strlen($cell) - mb_strlen($cell, $encoding);
 392          }
 393   
 394          $width += $this->strlen($cell) - $this->computeLengthWithoutDecoration($cell);
 395   
 396          $this->output->write(sprintf(
 397              $cellFormat,
 398              str_pad(
 399                  $this->paddingChar.$cell.$this->paddingChar,
 400                  $width,
 401                  $this->paddingChar,
 402                  $this->padType
 403              )
 404          ));
 405      }
 406   
 407      /**
 408       * Gets number of columns for this table.
 409       *
 410       * @return int
 411       */
 412      private function getNumberOfColumns()
 413      {
 414          if (null !== $this->numberOfColumns) {
 415              return $this->numberOfColumns;
 416          }
 417   
 418          $columns = array(0);
 419          $columns[] = count($this->headers);
 420          foreach ($this->rows as $row) {
 421              $columns[] = count($row);
 422          }
 423   
 424          return $this->numberOfColumns = max($columns);
 425      }
 426   
 427      /**
 428       * Gets column width.
 429       *
 430       * @param int     $column
 431       *
 432       * @return int
 433       */
 434      private function getColumnWidth($column)
 435      {
 436          if (isset($this->columnWidths[$column])) {
 437              return $this->columnWidths[$column];
 438          }
 439   
 440          $lengths = array(0);
 441          $lengths[] = $this->getCellWidth($this->headers, $column);
 442          foreach ($this->rows as $row) {
 443              $lengths[] = $this->getCellWidth($row, $column);
 444          }
 445   
 446          return $this->columnWidths[$column] = max($lengths) + 2;
 447      }
 448   
 449      /**
 450       * Gets cell width.
 451       *
 452       * @param array   $row
 453       * @param int     $column
 454       *
 455       * @return int
 456       */
 457      private function getCellWidth(array $row, $column)
 458      {
 459          return isset($row[$column]) ? $this->computeLengthWithoutDecoration($row[$column]) : 0;
 460      }
 461   
 462      /**
 463       * Called after rendering to cleanup cache data.
 464       */
 465      private function cleanup()
 466      {
 467          $this->columnWidths = array();
 468          $this->numberOfColumns = null;
 469      }
 470   
 471      private function computeLengthWithoutDecoration($string)
 472      {
 473          $formatter = $this->output->getFormatter();
 474          $isDecorated = $formatter->isDecorated();
 475          $formatter->setDecorated(false);
 476   
 477          $string = $formatter->format($string);
 478          $formatter->setDecorated($isDecorated);
 479   
 480          return $this->strlen($string);
 481      }
 482   
 483      /**
 484       * {@inheritdoc}
 485       */
 486      public function getName()
 487      {
 488          return 'table';
 489      }
 490  }
 491