use Symfony\Component\Console\Exception\InvalidArgumentException;
use Symfony\Component\Console\Exception\RuntimeException;
+use Symfony\Component\Console\Formatter\OutputFormatter;
+use Symfony\Component\Console\Formatter\OutputFormatterStyle;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Input\StreamableInputInterface;
use Symfony\Component\Console\Output\ConsoleOutputInterface;
use Symfony\Component\Console\Output\OutputInterface;
-use Symfony\Component\Console\Formatter\OutputFormatterStyle;
-use Symfony\Component\Console\Question\Question;
use Symfony\Component\Console\Question\ChoiceQuestion;
+use Symfony\Component\Console\Question\Question;
/**
* The QuestionHelper class provides helpers to interact with the user.
/**
* Asks a question to the user.
*
- * @param InputInterface $input An InputInterface instance
- * @param OutputInterface $output An OutputInterface instance
- * @param Question $question The question to ask
- *
* @return mixed The user answer
*
* @throws RuntimeException If there is no data to read in the input stream
}
if (!$input->isInteractive()) {
- return $question->getDefault();
+ $default = $question->getDefault();
+
+ if (null !== $default && $question instanceof ChoiceQuestion) {
+ $choices = $question->getChoices();
+
+ if (!$question->isMultiselect()) {
+ return isset($choices[$default]) ? $choices[$default] : $default;
+ }
+
+ $default = explode(',', $default);
+ foreach ($default as $k => $v) {
+ $v = trim($v);
+ $default[$k] = isset($choices[$v]) ? $choices[$v] : $v;
+ }
+ }
+
+ return $default;
}
if ($input instanceof StreamableInputInterface && $stream = $input->getStream()) {
*/
public function setInputStream($stream)
{
- @trigger_error(sprintf('The %s() method is deprecated since version 3.2 and will be removed in 4.0. Use %s::setStream() instead.', __METHOD__, StreamableInputInterface::class), E_USER_DEPRECATED);
+ @trigger_error(sprintf('The %s() method is deprecated since Symfony 3.2 and will be removed in 4.0. Use %s::setStream() instead.', __METHOD__, StreamableInputInterface::class), E_USER_DEPRECATED);
- if (!is_resource($stream)) {
+ if (!\is_resource($stream)) {
throw new InvalidArgumentException('Input stream must be a valid resource.');
}
*/
public function getInputStream()
{
- if (0 === func_num_args() || func_get_arg(0)) {
- @trigger_error(sprintf('The %s() method is deprecated since version 3.2 and will be removed in 4.0. Use %s::getStream() instead.', __METHOD__, StreamableInputInterface::class), E_USER_DEPRECATED);
+ if (0 === \func_num_args() || func_get_arg(0)) {
+ @trigger_error(sprintf('The %s() method is deprecated since Symfony 3.2 and will be removed in 4.0. Use %s::getStream() instead.', __METHOD__, StreamableInputInterface::class), E_USER_DEPRECATED);
}
return $this->inputStream;
return 'question';
}
+ /**
+ * Prevents usage of stty.
+ */
+ public static function disableStty()
+ {
+ self::$stty = false;
+ }
+
/**
* Asks the question to the user.
*
- * @param OutputInterface $output
- * @param Question $question
- *
- * @return bool|mixed|null|string
+ * @return bool|mixed|string|null
*
* @throws RuntimeException In case the fallback is deactivated and the response cannot be hidden
*/
$ret = trim($ret);
}
} else {
- $ret = trim($this->autocomplete($output, $question, $inputStream));
+ $ret = trim($this->autocomplete($output, $question, $inputStream, \is_array($autocomplete) ? $autocomplete : iterator_to_array($autocomplete, false)));
}
- $ret = strlen($ret) > 0 ? $ret : $question->getDefault();
+ $ret = \strlen($ret) > 0 ? $ret : $question->getDefault();
if ($normalizer = $question->getNormalizer()) {
return $normalizer($ret);
/**
* Outputs the question prompt.
- *
- * @param OutputInterface $output
- * @param Question $question
*/
protected function writePrompt(OutputInterface $output, Question $question)
{
/**
* Outputs an error message.
- *
- * @param OutputInterface $output
- * @param \Exception $error
*/
protected function writeError(OutputInterface $output, \Exception $error)
{
* @param OutputInterface $output
* @param Question $question
* @param resource $inputStream
+ * @param array $autocomplete
*
* @return string
*/
- private function autocomplete(OutputInterface $output, Question $question, $inputStream)
+ private function autocomplete(OutputInterface $output, Question $question, $inputStream, array $autocomplete)
{
- $autocomplete = $question->getAutocompleterValues();
$ret = '';
$i = 0;
$ofs = -1;
$matches = $autocomplete;
- $numMatches = count($matches);
+ $numMatches = \count($matches);
$sttyMode = shell_exec('stty -g');
$output->write("\033[1D");
}
- if ($i === 0) {
+ if (0 === $i) {
$ofs = -1;
$matches = $autocomplete;
- $numMatches = count($matches);
+ $numMatches = \count($matches);
} else {
$numMatches = 0;
}
$ofs += ('A' === $c[2]) ? -1 : 1;
$ofs = ($numMatches + $ofs) % $numMatches;
}
- } elseif (ord($c) < 32) {
+ } 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);
+ $i = \strlen($ret);
}
if ("\n" === $c) {
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)) {
+ if (0 === strpos($value, $ret)) {
$matches[$numMatches++] = $value;
}
}
// Save cursor position
$output->write("\0337");
// Write highlighted text
- $output->write('<hl>'.substr($matches[$ofs], $i).'</hl>');
+ $output->write('<hl>'.OutputFormatter::escapeTrailingBackslash(substr($matches[$ofs], $i)).'</hl>');
// Restore cursor position
$output->write("\0338");
}
*/
private function getHiddenResponse(OutputInterface $output, $inputStream)
{
- if ('\\' === DIRECTORY_SEPARATOR) {
+ if ('\\' === \DIRECTORY_SEPARATOR) {
$exe = __DIR__.'/../Resources/bin/hiddeninput.exe';
// handle code running from a phar
}
if (false !== $shell = $this->getShell()) {
- $readCmd = $shell === 'csh' ? 'set mypassword = $<' : 'read -r mypassword';
+ $readCmd = 'csh' === $shell ? '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('');
}
try {
- return call_user_func($question->getValidator(), $interviewer());
+ return \call_user_func($question->getValidator(), $interviewer());
} catch (RuntimeException $e) {
throw $e;
} catch (\Exception $error) {
exec('stty 2>&1', $output, $exitcode);
- return self::$stty = $exitcode === 0;
+ return self::$stty = 0 === $exitcode;
}
}