strlenWithoutDecoration() public static method

public static strlenWithoutDecoration ( Symfony\Component\Console\Formatter\OutputFormatterInterface $formatter, $string )
$formatter Symfony\Component\Console\Formatter\OutputFormatterInterface
Beispiel #1
0
 /**
  * Formats a message as a block of text.
  *
  * @param string|array $messages The message to write in the block
  * @param string|null $type The block type (added in [] on first line)
  * @param string|null $style The style to apply to the whole block
  * @param string $prefix The prefix for the block
  * @param bool $padding Whether to add vertical padding
  */
 public function block($messages, $type = null, $style = null, $prefix = ' ', $padding = false)
 {
     $this->autoPrependBlock();
     $messages = is_array($messages) ? array_values($messages) : array($messages);
     $lines = array();
     // add type
     if (null !== $type) {
         $messages[0] = sprintf('[%s] %s', $type, $messages[0]);
     }
     // wrap and add newlines for each element
     foreach ($messages as $key => $message) {
         $message = OutputFormatter::escape($message);
         $lines = array_merge($lines, explode(PHP_EOL, wordwrap($message, $this->lineLength - Helper::strlen($prefix), PHP_EOL, true)));
         if (count($messages) > 1 && $key < count($messages) - 1) {
             $lines[] = '';
         }
     }
     if ($padding && $this->isDecorated()) {
         array_unshift($lines, '');
         $lines[] = '';
     }
     foreach ($lines as &$line) {
         $line = sprintf('%s%s', $prefix, $line);
         $line .= str_repeat(' ', $this->lineLength - Helper::strlenWithoutDecoration($this->getFormatter(), $line));
         if ($style) {
             $line = sprintf('<%s>%s</>', $style, $line);
         }
     }
     $this->writeln($lines);
     $this->newLine();
 }
Beispiel #2
0
 /**
  * Renders the title block to output.
  */
 public function render()
 {
     $this->output->writeln('');
     $lineLength = $this->getTerminalWidth();
     $lines = explode(PHP_EOL, wordwrap($this->message, $lineLength - (strlen($this->blockStyles[$this->style]['prefix']) + 3), PHP_EOL, true));
     array_unshift($lines, ' ');
     array_push($lines, ' ');
     foreach ($lines as $i => $line) {
         $prefix = str_repeat(' ', strlen($this->blockStyles[$this->style]['prefix']));
         if ($i === 1) {
             $prefix = $this->blockStyles[$this->style]['prefix'];
         }
         $line = sprintf(' %s %s', $prefix, $line);
         $this->output->writeln(sprintf('<%s>%s%s</>', $this->blockStyles[$this->style]['style'], $line, str_repeat(' ', $lineLength - Helper::strlenWithoutDecoration($this->output->getFormatter(), $line))));
     }
     $this->output->writeln('');
 }
Beispiel #3
0
 /**
  * Gets cell width.
  *
  * @param array $row
  * @param int   $column
  *
  * @return int
  */
 private function getCellWidth(array $row, $column)
 {
     return isset($row[$column]) ? Helper::strlenWithoutDecoration($this->output->getFormatter(), $row[$column]) : 0;
 }
Beispiel #4
0
 /**
  * Overwrites a previous message to the output.
  *
  * @param string $message The message
  */
 private function overwrite($message)
 {
     // append whitespace to match the line's length
     if (null !== $this->lastMessagesLength) {
         if ($this->lastMessagesLength > Helper::strlenWithoutDecoration($this->output->getFormatter(), $message)) {
             $message = str_pad($message, $this->lastMessagesLength, " ", STR_PAD_RIGHT);
         }
     }
     if ($this->output->isDecorated()) {
         $this->output->write("\r");
         $this->output->write($message);
     } else {
         $this->output->writeln($message);
     }
     $this->lastMessagesLength = 0;
     $len = Helper::strlenWithoutDecoration($this->output->getFormatter(), $message);
     if ($len > $this->lastMessagesLength) {
         $this->lastMessagesLength = $len;
     }
 }
Beispiel #5
0
 private static function initPlaceholderFormatters()
 {
     return array('bar' => function (ProgressBar $bar, OutputInterface $output) {
         $completeBars = floor($bar->getMaxSteps() > 0 ? $bar->getProgressPercent() * $bar->getBarWidth() : $bar->getProgress() % $bar->getBarWidth());
         $display = str_repeat($bar->getBarCharacter(), $completeBars);
         if ($completeBars < $bar->getBarWidth()) {
             $emptyBars = $bar->getBarWidth() - $completeBars - Helper::strlenWithoutDecoration($output->getFormatter(), $bar->getProgressCharacter());
             $display .= $bar->getProgressCharacter() . str_repeat($bar->getEmptyBarCharacter(), $emptyBars);
         }
         return $display;
     }, 'elapsed' => function (ProgressBar $bar) {
         return Helper::formatTime(time() - $bar->getStartTime());
     }, 'remaining' => function (ProgressBar $bar) {
         if (!$bar->getMaxSteps()) {
             throw new LogicException('Unable to display the remaining time if the maximum number of steps is not set.');
         }
         if (!$bar->getProgress()) {
             $remaining = 0;
         } else {
             $remaining = round((time() - $bar->getStartTime()) / $bar->getProgress() * ($bar->getMaxSteps() - $bar->getProgress()));
         }
         return Helper::formatTime($remaining);
     }, 'estimated' => function (ProgressBar $bar) {
         if (!$bar->getMaxSteps()) {
             throw new LogicException('Unable to display the estimated time if the maximum number of steps is not set.');
         }
         if (!$bar->getProgress()) {
             $estimated = 0;
         } else {
             $estimated = round((time() - $bar->getStartTime()) / $bar->getProgress() * $bar->getMaxSteps());
         }
         return Helper::formatTime($estimated);
     }, 'memory' => function (ProgressBar $bar) {
         return Helper::formatMemory(memory_get_usage(true));
     }, 'current' => function (ProgressBar $bar) {
         return str_pad($bar->getProgress(), $bar->getStepWidth(), ' ', STR_PAD_LEFT);
     }, 'max' => function (ProgressBar $bar) {
         return $bar->getMaxSteps();
     }, 'percent' => function (ProgressBar $bar) {
         return floor($bar->getProgressPercent() * 100);
     });
 }
 /**
  * {@inheritdoc}
  */
 public function subSection($message)
 {
     $this->writeln(array(sprintf('<comment>%s</comment>', $message), sprintf('<comment>%s</comment>', str_repeat('.', Helper::strlenWithoutDecoration($this->getFormatter(), $message)))));
     $this->newLine();
 }
Beispiel #7
0
 /**
  * @return string
  */
 private function buildLine()
 {
     $regex = "{%([a-z\\-_]+)(?:\\:([^%]+))?%}i";
     $callback = function ($matches) {
         if ($formatter = $this::getPlaceholderFormatterDefinition($matches[1])) {
             $text = call_user_func($formatter, $this, $this->output);
         } elseif (isset($this->messages[$matches[1]])) {
             $text = $this->messages[$matches[1]];
         } else {
             return $matches[0];
         }
         if (isset($matches[2])) {
             $text = sprintf('%' . $matches[2], $text);
         }
         return $text;
     };
     $line = preg_replace_callback($regex, $callback, $this->format);
     $lineLength = Helper::strlenWithoutDecoration($this->output->getFormatter(), $line);
     $terminalWidth = $this->terminal->getWidth();
     if ($lineLength <= $terminalWidth) {
         return $line;
     }
     $this->setBarWidth($this->barWidth - $lineLength + $terminalWidth);
     return preg_replace_callback($regex, $callback, $this->format);
 }
 /**
  * Overwrites a previous message to the output.
  *
  * @param string $message The message
  */
 private function overwrite($message)
 {
     $lines = explode("\n", $message);
     // append whitespace to match the line's length
     if (null !== $this->lastMessagesLength) {
         foreach ($lines as $i => $line) {
             if ($this->lastMessagesLength > Helper::strlenWithoutDecoration($this->output->getFormatter(), $line)) {
                 $lines[$i] = str_pad($line, $this->lastMessagesLength, " ", STR_PAD_RIGHT);
             }
         }
     }
     if ($this->overwrite) {
         // move back to the beginning of the progress bar before redrawing it
         $this->output->write("\r");
     } elseif ($this->step > 0) {
         // move to new line
         $this->output->writeln('');
     }
     if ($this->formatLineCount) {
         $this->output->write(sprintf("[%dA", $this->formatLineCount));
     }
     $this->output->write(implode("\n", $lines));
     $this->lastMessagesLength = 0;
     foreach ($lines as $line) {
         $len = Helper::strlenWithoutDecoration($this->output->getFormatter(), $line);
         if ($len > $this->lastMessagesLength) {
             $this->lastMessagesLength = $len;
         }
     }
 }
 /**
  * @param string $message
  */
 public function subSection($message)
 {
     $padLength = $this->lineLength - Helper::strlenWithoutDecoration($this->getFormatter(), $message) - 6;
     $padLeft = round($padLength / 2);
     $padRight = $padLength - $padLeft;
     $this->autoPrependBlock();
     $this->writeln([sprintf('<bg=yellow;fg=black> %s[ %s ]%s </>', str_repeat(' ', $padLeft), $message, str_repeat(' ', $padRight))]);
     $this->newLine();
 }
Beispiel #10
0
 /**
  * Gets cell width.
  *
  * @param array $row
  * @param int   $column
  *
  * @return int
  */
 private function getCellWidth(array $row, $column)
 {
     $cellWidth = 0;
     if (isset($row[$column])) {
         $cell = $row[$column];
         $cellWidth = Helper::strlenWithoutDecoration($this->output->getFormatter(), $cell);
     }
     $columnWidth = isset($this->columnWidths[$column]) ? $this->columnWidths[$column] : 0;
     return max($cellWidth, $columnWidth);
 }
Beispiel #11
0
 /**
  * Formats a message as a block of text.
  *
  * @param string|array $messages The message to write in the block
  * @param string|null  $type     The block type (added in [] on first line)
  * @param string|null  $style    The style to apply to the whole block
  * @param string       $prefix   The prefix for the block
  * @param bool         $padding  Whether to add vertical padding
  */
 public function block($messages, $type = null, $style = null, $prefix = ' ', $padding = false)
 {
     $this->autoPrependBlock();
     $messages = is_array($messages) ? array_values($messages) : array($messages);
     $indentLength = 0;
     $lines = array();
     if (null !== $type) {
         $typePrefix = sprintf('[%s] ', $type);
         $indentLength = strlen($typePrefix);
         $lineIndentation = str_repeat(' ', $indentLength);
     }
     // wrap and add newlines for each element
     foreach ($messages as $key => $message) {
         $message = OutputFormatter::escape($message);
         $lines = array_merge($lines, explode(PHP_EOL, wordwrap($message, $this->lineLength - Helper::strlen($prefix) - $indentLength, PHP_EOL, true)));
         // prefix each line with a number of spaces equivalent to the type length
         if (null !== $type) {
             foreach ($lines as &$line) {
                 $line = $lineIndentation === substr($line, 0, $indentLength) ? $line : $lineIndentation . $line;
             }
         }
         if (count($messages) > 1 && $key < count($messages) - 1) {
             $lines[] = '';
         }
     }
     if (null !== $type) {
         $lines[0] = substr_replace($lines[0], $typePrefix, 0, $indentLength);
     }
     if ($padding && $this->isDecorated()) {
         array_unshift($lines, '');
         $lines[] = '';
     }
     foreach ($lines as &$line) {
         $line = sprintf('%s%s', $prefix, $line);
         $line .= str_repeat(' ', $this->lineLength - Helper::strlenWithoutDecoration($this->getFormatter(), $line));
         if ($style) {
             $line = sprintf('<%s>%s</>', $style, $line);
         }
     }
     $this->writeln($lines);
     $this->newLine();
 }
 /**
  * Renders table cell with padding.
  *
  * @param array  $row
  * @param int    $column
  * @param string $cellFormat
  */
 private function renderCell(array $row, $column, $cellFormat)
 {
     $cell = isset($row[$column]) ? $row[$column] : '';
     $width = $this->getColumnWidth($column);
     // str_pad won't work properly with multi-byte strings, we need to fix the padding
     if (function_exists('mb_strwidth') && false !== ($encoding = mb_detect_encoding($cell))) {
         $width += strlen($cell) - mb_strwidth($cell, $encoding);
     }
     $width += Helper::strlen($cell) - Helper::strlenWithoutDecoration($this->output->getFormatter(), $cell);
     $content = sprintf($this->style->getCellRowContentFormat(), $cell);
     $this->output->write(sprintf($cellFormat, str_pad($content, $width, $this->style->getPaddingChar(), $this->style->getPadType())));
 }
Beispiel #13
0
 /**
  * Renders the title to output.
  */
 public function render()
 {
     $this->output->writeln(array('', sprintf('<title>%s</>', $this->message), sprintf('<title>%s</>', str_repeat('=', Helper::strlenWithoutDecoration($this->output->getFormatter(), $this->message))), ''));
 }
Beispiel #14
0
 private function createBlock($messages, $type = null, $style = null, $prefix = ' ', $padding = false, $escape = false)
 {
     $indentLength = 0;
     $prefixLength = Helper::strlenWithoutDecoration($this->getFormatter(), $prefix);
     $lines = array();
     if (null !== $type) {
         $type = sprintf('[%s] ', $type);
         $indentLength = strlen($type);
         $lineIndentation = str_repeat(' ', $indentLength);
     }
     // wrap and add newlines for each element
     foreach ($messages as $key => $message) {
         if ($escape) {
             $message = OutputFormatter::escape($message);
         }
         $lines = array_merge($lines, explode(PHP_EOL, wordwrap($message, $this->lineLength - $prefixLength - $indentLength, PHP_EOL, true)));
         if (count($messages) > 1 && $key < count($messages) - 1) {
             $lines[] = '';
         }
     }
     foreach ($lines as $i => &$line) {
         if (null !== $type) {
             $line = 0 === $i ? $type . $line : $lineIndentation . $line;
         }
         $line = $prefix . $line;
         $line .= str_repeat(' ', $this->lineLength - Helper::strlenWithoutDecoration($this->getFormatter(), $line));
         if ($style) {
             $line = sprintf('<%s>%s</>', $style, $line);
         }
     }
     if ($padding && $this->isDecorated()) {
         array_unshift($lines, '');
         $lines[] = '';
     }
     return $lines;
 }
Beispiel #15
0
 /**
  * Renders table cell with padding.
  *
  * @param array $row
  * @param int $column
  * @param string $cellFormat
  */
 private function renderCell(array $row, $column, $cellFormat)
 {
     $cell = isset($row[$column]) ? $row[$column] : '';
     $width = $this->columnWidths[$column];
     if ($cell instanceof TableCell && $cell->getColspan() > 1) {
         // add the width of the following columns(numbers of colspan).
         foreach (range($column + 1, $column + $cell->getColspan() - 1) as $nextColumn) {
             $width += $this->getColumnSeparatorWidth() + $this->columnWidths[$nextColumn];
         }
     }
     // str_pad won't work properly with multi-byte strings, we need to fix the padding
     if (false !== ($encoding = mb_detect_encoding($cell, null, true))) {
         $width += strlen($cell) - mb_strwidth($cell, $encoding);
     }
     $style = $this->getColumnStyle($column);
     if ($cell instanceof TableSeparator) {
         $this->output->write(sprintf($style->getBorderFormat(), str_repeat($style->getHorizontalBorderChar(), $width)));
     } else {
         $width += Helper::strlen($cell) - Helper::strlenWithoutDecoration($this->output->getFormatter(), $cell);
         $content = sprintf($style->getCellRowContentFormat(), $cell);
         $this->output->write(sprintf($cellFormat, str_pad($content, $width, $style->getPaddingChar(), $style->getPadType())));
     }
 }
Beispiel #16
0
 /**
  * Gets cell width.
  *
  * @param array $row
  * @param int   $column
  *
  * @return int
  */
 private function getCellWidth(array $row, $column)
 {
     if (isset($row[$column])) {
         $cell = $row[$column];
         $cellWidth = Helper::strlenWithoutDecoration($this->output->getFormatter(), $cell);
         if ($cell instanceof TableCell && $cell->getColspan() > 1) {
             // we assume that cell value will be across more than one column.
             $cellWidth = $cellWidth / $cell->getColspan();
         }
         return $cellWidth;
     }
     return 0;
 }
Beispiel #17
0
 /**
  * Gets cell width.
  *
  * @param array $row
  * @param int   $column
  *
  * @return int
  */
 private function getCellWidth(array $row, $column)
 {
     if (isset($row[$column])) {
         $cell = $row[$column];
         $cellWidth = Helper::strlenWithoutDecoration($this->output->getFormatter(), $cell);
         return $cellWidth;
     }
     return 0;
 }
 /**
  * Get the default width of a table cell (the length of its longest line).
  *
  * This is inspired by Table->getCellWidth(), but this also accounts for
  * multi-line cells.
  *
  * @param string|TableCell $cell
  *
  * @return float|int
  */
 private function getCellWidth($cell)
 {
     $lineWidths = [0];
     foreach (explode(PHP_EOL, $cell) as $line) {
         $lineWidths[] = Helper::strlenWithoutDecoration($this->outputCopy->getFormatter(), $line);
     }
     $cellWidth = max($lineWidths);
     if ($cell instanceof TableCell && $cell->getColspan() > 1) {
         $cellWidth /= $cell->getColspan();
     }
     return $cellWidth;
 }