2 namespace Drush\Commands\help;
4 use Consolidation\OutputFormatters\FormatterManager;
5 use Consolidation\OutputFormatters\Formatters\FormatterInterface;
6 use Consolidation\OutputFormatters\Options\FormatterOptions;
7 use Consolidation\OutputFormatters\StructuredData\RowsOfFields;
9 use Symfony\Component\Console\Output\OutputInterface;
12 * Format an array into CLI help string.
14 class HelpCLIFormatter implements FormatterInterface
20 public function write(OutputInterface $output, $data, FormatterOptions $options)
22 $formatterManager = new FormatterManager();
24 $output->writeln($data['description']);
25 if (array_key_exists('help', $data) && $data['help'] != $data['description']) {
27 $output->writeln($data['help']);
30 if (array_key_exists('examples', $data)) {
32 $output->writeln('<comment>Examples:</comment>');
33 foreach ($data['examples'] as $example) {
34 $rows[] = [' ' . $example['usage'], $example['description']];
36 $formatterManager->write($output, 'table', new RowsOfFields($rows), $options);
39 if (array_key_exists('arguments', $data)) {
42 $output->writeln('<comment>Arguments:</comment>');
43 foreach ($data['arguments'] as $argument) {
44 $formatted = $this->formatArgumentName($argument);
45 $description = $argument['description'];
46 // @todo No argument default in Helpdocument
47 // if ($argument['default']) {
48 // $description .= ' [default: ' . $argument->getDefault() . ']';
50 $rows[] = [' ' . $formatted, $description];
52 $formatterManager->write($output, 'table', new RowsOfFields($rows), $options);
55 $this->cleanOptions($data);
56 if (!empty($data['options'])) {
59 $output->writeln('<comment>Options:</comment>');
60 foreach ($data['options'] as $option) {
61 if (substr($option['name'], 0, 8) !== '--notify' && substr($option['name'], 0, 5) !== '--xh-' && substr($option['name'], 0, 11) !== '--druplicon') {
62 $rows[] = [$this->formatOptionKeys($option), $this->formatOptionDescription($option)];
65 $formatterManager->write($output, 'table', new RowsOfFields($rows), $options);
68 if (array_key_exists('topics', $data)) {
71 $output->writeln('<comment>Topics:</comment>');
72 foreach ($data['topics'] as $topic) {
73 $topic_command = Drush::getApplication()->find($topic);
74 $rows[] = [' drush topic ' . $topic, $topic_command->getDescription()];
76 $formatterManager->write($output, 'table', new RowsOfFields($rows), $options);
79 // @todo Fix this variability in key name upstream.
80 if (array_key_exists('aliases', $data) ? $data['aliases'] : (array_key_exists('alias', $data) ? [$data['alias']] : [])) {
82 $output->writeln('<comment>Aliases:</comment> ' . implode(', ', $data['aliases']));
87 * @param array $option
90 public static function formatOptionKeys($option)
92 // Remove leading dashes.
93 $option['name'] = substr($option['name'], 2);
96 if ($option['accept_value']) {
97 $value = '='.strtoupper($option['name']);
99 if (!$option['is_value_required']) {
100 $value = '['.$value.']';
106 $option['shortcut'] ? sprintf('-%s, ', $option['shortcut']) : ' ',
107 sprintf('--%s%s', $option['name'], $value)
112 public static function formatOptionDescription($option)
114 $defaults = array_key_exists('defaults', $option) ? ' [default: "' . implode(' ', $option['defaults']) . '"]' : '';
115 return $option['description'] . $defaults;
118 public function formatArgumentName($argument)
120 $element = $argument['name'];
121 if (!$argument['is_required']) {
122 $element = '['.$element.']';
123 } elseif ($argument['is_array']) {
124 $element = $element.' ('.$element.')';
127 if ($argument['is_array']) {
134 protected function cleanOptions(&$data)
136 if (array_key_exists('options', $data)) {
137 foreach ($data['options'] as $key => $option) {
138 if (substr($option['name'], 0, 8) == '--notify' || substr($option['name'], 0, 5) == '--xh-' || substr($option['name'], 0, 11) == '--druplicon') {
139 unset($data['options'][$key]);