Beispiel #1
0
 /**
  * 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);
             }
         }
     }
     // move back to the beginning of the progress bar before redrawing it
     $this->output->write("\r");
     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;
         }
     }
 }
Beispiel #2
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->getColumnWidth($column);
     // str_pad won't work properly with multi-byte strings, we need to fix the padding
     if (function_exists('mb_strlen') && false !== ($encoding = mb_detect_encoding($cell))) {
         $width += strlen($cell) - mb_strlen($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 #3
0
 /**
  * Writes content to output.
  *
  * @param string  $content
  * @param bool    $decorated
  */
 protected function write($content, $decorated = false)
 {
     $this->output->write($content, false, $decorated ? OutputInterface::OUTPUT_NORMAL : OutputInterface::OUTPUT_RAW);
 }
Beispiel #4
0
 /**
  * Autocompletes a question.
  *
  * @param OutputInterface $output
  * @param Question $question
  *
  * @return string
  */
 private function autocomplete(OutputInterface $output, Question $question, $inputStream)
 {
     $autocomplete = $question->getAutocompleterValues();
     $ret = '';
     $i = 0;
     $ofs = -1;
     $matches = $autocomplete;
     $numMatches = count($matches);
     $sttyMode = shell_exec('stty -g');
     // Disable icanon (so we can fread each keypress) and echo (we'll do echoing here instead)
     shell_exec('stty -icanon -echo');
     // Add highlighted text style
     $output->getFormatter()->setStyle('hl', new OutputFormatterStyle('black', 'white'));
     // Read a keypress
     while (!feof($inputStream)) {
         $c = fread($inputStream, 1);
         // Backspace Character
         if ("" === $c) {
             if (0 === $numMatches && 0 !== $i) {
                 $i--;
                 // Move cursor backwards
                 $output->write("");
             }
             if ($i === 0) {
                 $ofs = -1;
                 $matches = $autocomplete;
                 $numMatches = count($matches);
             } else {
                 $numMatches = 0;
             }
             // Pop the last character off the end of our string
             $ret = substr($ret, 0, $i);
         } elseif ("" === $c) {
             // Did we read an escape sequence?
             $c .= fread($inputStream, 2);
             // A = Up Arrow. B = Down Arrow
             if (isset($c[2]) && ('A' === $c[2] || 'B' === $c[2])) {
                 if ('A' === $c[2] && -1 === $ofs) {
                     $ofs = 0;
                 }
                 if (0 === $numMatches) {
                     continue;
                 }
                 $ofs += 'A' === $c[2] ? -1 : 1;
                 $ofs = ($numMatches + $ofs) % $numMatches;
             }
         } elseif (ord($c) < 32) {
             if ("\t" === $c || "\n" === $c) {
                 if ($numMatches > 0 && -1 !== $ofs) {
                     $ret = $matches[$ofs];
                     // Echo out remaining chars for current match
                     $output->write(substr($ret, $i));
                     $i = strlen($ret);
                 }
                 if ("\n" === $c) {
                     $output->write($c);
                     break;
                 }
                 $numMatches = 0;
             }
             continue;
         } else {
             $output->write($c);
             $ret .= $c;
             $i++;
             $numMatches = 0;
             $ofs = 0;
             foreach ($autocomplete as $value) {
                 // If typed characters match the beginning chunk of value (e.g. [AcmeDe]moBundle)
                 if (0 === strpos($value, $ret) && $i !== strlen($value)) {
                     $matches[$numMatches++] = $value;
                 }
             }
         }
         // Erase characters from cursor to end of line
         $output->write("");
         if ($numMatches > 0 && -1 !== $ofs) {
             // Save cursor position
             $output->write("7");
             // Write highlighted text
             $output->write('<hl>' . substr($matches[$ofs], $i) . '</hl>');
             // Restore cursor position
             $output->write("8");
         }
     }
     // Reset stty so it behaves normally again
     shell_exec(sprintf('stty %s', $sttyMode));
     return $ret;
 }
Beispiel #5
0
 /**
  * Overwrites a previous message to the output.
  *
  * @param OutputInterface $output   An Output instance
  * @param string          $message  The message
  */
 private function overwrite(OutputInterface $output, $message)
 {
     $length = $this->strlen($message);
     // append whitespace to match the last line's length
     if (null !== $this->lastMessagesLength && $this->lastMessagesLength > $length) {
         $message = str_pad($message, $this->lastMessagesLength, " ", STR_PAD_RIGHT);
     }
     // carriage return
     $output->write("\r");
     $output->write($message);
     $this->lastMessagesLength = $this->strlen($message);
 }
Beispiel #6
0
 /**
  * Asks a question to the user, the response is hidden
  *
  * @param OutputInterface $output   An Output instance
  * @param string|array    $question The question
  * @param bool            $fallback In case the response can not be hidden, whether to fallback on non-hidden question or not
  *
  * @return string         The answer
  *
  * @throws \RuntimeException In case the fallback is deactivated and the response can not be hidden
  */
 public function askHiddenResponse(OutputInterface $output, $question, $fallback = true)
 {
     if (defined('PHP_WINDOWS_VERSION_BUILD')) {
         $exe = __DIR__ . '/../Resources/bin/hiddeninput.exe';
         // handle code running from a phar
         if ('phar:' === substr(__FILE__, 0, 5)) {
             $tmpExe = sys_get_temp_dir() . '/hiddeninput.exe';
             copy($exe, $tmpExe);
             $exe = $tmpExe;
         }
         $output->write($question);
         $value = rtrim(shell_exec($exe));
         $output->writeln('');
         if (isset($tmpExe)) {
             unlink($tmpExe);
         }
         return $value;
     }
     if ($this->hasSttyAvailable()) {
         $output->write($question);
         $sttyMode = shell_exec('stty -g');
         shell_exec('stty -echo');
         $value = fgets($this->inputStream ?: STDIN, 4096);
         shell_exec(sprintf('stty %s', $sttyMode));
         if (false === $value) {
             throw new \RuntimeException('Aborted');
         }
         $value = trim($value);
         $output->writeln('');
         return $value;
     }
     if (false !== ($shell = $this->getShell())) {
         $output->write($question);
         $readCmd = $shell === 'csh' ? 'set mypassword = $<' : 'read -r mypassword';
         $command = sprintf("/usr/bin/env %s -c 'stty -echo; %s; stty echo; echo \$mypassword'", $shell, $readCmd);
         $value = rtrim(shell_exec($command));
         $output->writeln('');
         return $value;
     }
     if ($fallback) {
         return $this->ask($output, $question);
     }
     throw new \RuntimeException('Unable to hide the response');
 }
Beispiel #7
0
 /**
  * Wraps a Process callback to add debugging output.
  *
  * @param OutputInterface $output   An OutputInterface interface
  * @param Process         $process  The Process
  * @param callable|null   $callback A PHP callable
  *
  * @return callable
  */
 public function wrapCallback(OutputInterface $output, Process $process, $callback = null)
 {
     $formatter = $this->getHelperSet()->get('debug_formatter');
     $that = $this;
     return function ($type, $buffer) use($output, $process, $callback, $formatter, $that) {
         $output->write($formatter->progress(spl_object_hash($process), $that->escapeString($buffer), Process::ERR === $type));
         if (null !== $callback) {
             call_user_func($callback, $type, $buffer);
         }
     };
 }