Chris@0: Usage:', Chris@0: ' ' . $this->getSynopsis(), Chris@0: '', Chris@0: ); Chris@0: Chris@0: if ($this->getAliases()) { Chris@0: $messages[] = $this->aliasesAsText(); Chris@0: } Chris@0: Chris@0: if ($this->getArguments()) { Chris@0: $messages[] = $this->argumentsAsText(); Chris@0: } Chris@0: Chris@0: if ($this->getOptions()) { Chris@0: $messages[] = $this->optionsAsText(); Chris@0: } Chris@0: Chris@0: if ($help = $this->getProcessedHelp()) { Chris@0: $messages[] = 'Help:'; Chris@0: $messages[] = ' ' . str_replace("\n", "\n ", $help) . "\n"; Chris@0: } Chris@0: Chris@0: return implode("\n", $messages); Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: private function getArguments() Chris@0: { Chris@0: $hidden = $this->getHiddenArguments(); Chris@0: Chris@0: return array_filter($this->getNativeDefinition()->getArguments(), function ($argument) use ($hidden) { Chris@0: return !in_array($argument->getName(), $hidden); Chris@0: }); Chris@0: } Chris@0: Chris@0: /** Chris@0: * These arguments will be excluded from help output. Chris@0: * Chris@0: * @return array Chris@0: */ Chris@0: protected function getHiddenArguments() Chris@0: { Chris@0: return array('command'); Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: private function getOptions() Chris@0: { Chris@0: $hidden = $this->getHiddenOptions(); Chris@0: Chris@0: return array_filter($this->getNativeDefinition()->getOptions(), function ($option) use ($hidden) { Chris@0: return !in_array($option->getName(), $hidden); Chris@0: }); Chris@0: } Chris@0: Chris@0: /** Chris@0: * These options will be excluded from help output. Chris@0: * Chris@0: * @return array Chris@0: */ Chris@0: protected function getHiddenOptions() Chris@0: { Chris@0: return array('verbose'); Chris@0: } Chris@0: Chris@0: /** Chris@0: * Format command aliases as text.. Chris@0: * Chris@0: * @return string Chris@0: */ Chris@0: private function aliasesAsText() Chris@0: { Chris@0: return 'Aliases: ' . implode(', ', $this->getAliases()) . '' . PHP_EOL; Chris@0: } Chris@0: Chris@0: /** Chris@0: * Format command arguments as text. Chris@0: * Chris@0: * @return string Chris@0: */ Chris@0: private function argumentsAsText() Chris@0: { Chris@0: $max = $this->getMaxWidth(); Chris@0: $messages = array(); Chris@0: Chris@0: $arguments = $this->getArguments(); Chris@0: if (!empty($arguments)) { Chris@0: $messages[] = 'Arguments:'; Chris@0: foreach ($arguments as $argument) { Chris@0: if (null !== $argument->getDefault() && (!is_array($argument->getDefault()) || count($argument->getDefault()))) { Chris@0: $default = sprintf(' (default: %s)', $this->formatDefaultValue($argument->getDefault())); Chris@0: } else { Chris@0: $default = ''; Chris@0: } Chris@0: Chris@0: $description = str_replace("\n", "\n" . str_pad('', $max + 2, ' '), $argument->getDescription()); Chris@0: Chris@0: $messages[] = sprintf(" %-${max}s %s%s", $argument->getName(), $description, $default); Chris@0: } Chris@0: Chris@0: $messages[] = ''; Chris@0: } Chris@0: Chris@0: return implode(PHP_EOL, $messages); Chris@0: } Chris@0: Chris@0: /** Chris@0: * Format options as text. Chris@0: * Chris@0: * @return string Chris@0: */ Chris@0: private function optionsAsText() Chris@0: { Chris@0: $max = $this->getMaxWidth(); Chris@0: $messages = array(); Chris@0: Chris@0: $options = $this->getOptions(); Chris@0: if ($options) { Chris@0: $messages[] = 'Options:'; Chris@0: Chris@0: foreach ($options as $option) { Chris@0: if ($option->acceptValue() && null !== $option->getDefault() && (!is_array($option->getDefault()) || count($option->getDefault()))) { Chris@0: $default = sprintf(' (default: %s)', $this->formatDefaultValue($option->getDefault())); Chris@0: } else { Chris@0: $default = ''; Chris@0: } Chris@0: Chris@0: $multiple = $option->isArray() ? ' (multiple values allowed)' : ''; Chris@0: $description = str_replace("\n", "\n" . str_pad('', $max + 2, ' '), $option->getDescription()); Chris@0: Chris@0: $optionMax = $max - strlen($option->getName()) - 2; Chris@0: $messages[] = sprintf( Chris@0: " %s %-${optionMax}s%s%s%s", Chris@0: '--' . $option->getName(), Chris@0: $option->getShortcut() ? sprintf('(-%s) ', $option->getShortcut()) : '', Chris@0: $description, Chris@0: $default, Chris@0: $multiple Chris@0: ); Chris@0: } Chris@0: Chris@0: $messages[] = ''; Chris@0: } Chris@0: Chris@0: return implode(PHP_EOL, $messages); Chris@0: } Chris@0: Chris@0: /** Chris@0: * Calculate the maximum padding width for a set of lines. Chris@0: * Chris@0: * @return int Chris@0: */ Chris@0: private function getMaxWidth() Chris@0: { Chris@0: $max = 0; Chris@0: Chris@0: foreach ($this->getOptions() as $option) { Chris@0: $nameLength = strlen($option->getName()) + 2; Chris@0: if ($option->getShortcut()) { Chris@0: $nameLength += strlen($option->getShortcut()) + 3; Chris@0: } Chris@0: Chris@0: $max = max($max, $nameLength); Chris@0: } Chris@0: Chris@0: foreach ($this->getArguments() as $argument) { Chris@0: $max = max($max, strlen($argument->getName())); Chris@0: } Chris@0: Chris@0: return ++$max; Chris@0: } Chris@0: Chris@0: /** Chris@0: * Format an option default as text. Chris@0: * Chris@0: * @param mixed $default Chris@0: * Chris@0: * @return string Chris@0: */ Chris@0: private function formatDefaultValue($default) Chris@0: { Chris@0: if (is_array($default) && $default === array_values($default)) { Chris@0: return sprintf("array('%s')", implode("', '", $default)); Chris@0: } Chris@0: Chris@0: return str_replace("\n", '', var_export($default, true)); Chris@0: } Chris@0: Chris@0: /** Chris@0: * Get a Table instance. Chris@0: * Chris@0: * Falls back to legacy TableHelper. Chris@0: * Chris@0: * @return Table|TableHelper Chris@0: */ Chris@0: protected function getTable(OutputInterface $output) Chris@0: { Chris@0: if (!class_exists('Symfony\Component\Console\Helper\Table')) { Chris@0: return $this->getTableHelper(); Chris@0: } Chris@0: Chris@0: $style = new TableStyle(); Chris@0: $style Chris@0: ->setVerticalBorderChar(' ') Chris@0: ->setHorizontalBorderChar('') Chris@0: ->setCrossingChar(''); Chris@0: Chris@0: $table = new Table($output); Chris@0: Chris@0: return $table Chris@0: ->setRows(array()) Chris@0: ->setStyle($style); Chris@0: } Chris@0: Chris@0: /** Chris@0: * Legacy fallback for getTable. Chris@0: * Chris@0: * @return TableHelper Chris@0: */ Chris@0: protected function getTableHelper() Chris@0: { Chris@0: $table = $this->getApplication()->getHelperSet()->get('table'); Chris@0: Chris@0: return $table Chris@0: ->setRows(array()) Chris@0: ->setLayout(TableHelper::LAYOUT_BORDERLESS) Chris@0: ->setHorizontalBorderChar('') Chris@0: ->setCrossingChar(''); Chris@0: } Chris@0: }