Completed
Branch symfony-console (0fa491)
by Kacper
03:12
created

LanguagesCommand::execute()   B

Complexity

Conditions 5
Paths 2

Size

Total Lines 20
Code Lines 12

Duplication

Lines 0
Ratio 0 %

Importance

Changes 2
Bugs 0 Features 1
Metric Value
cc 5
eloc 12
c 2
b 0
f 1
nc 2
nop 2
dl 0
loc 20
rs 8.8571
1
<?php
2
/**
3
 * Highlighter
4
 *
5
 * Copyright (C) 2016, Some right reserved.
6
 *
7
 * @author Kacper "Kadet" Donat <[email protected]>
8
 *
9
 * Contact with author:
10
 * Xmpp: [email protected]
11
 * E-mail: [email protected]
12
 *
13
 * From Kadet with love.
14
 */
15
16
namespace Kadet\Highlighter\bin\Commands;
17
18
19
use Kadet\Highlighter\KeyLighter;
20
use Symfony\Component\Console\Command\Command;
21
use Symfony\Component\Console\Helper\Table;
22
use Symfony\Component\Console\Input\InputArgument;
23
use Symfony\Component\Console\Input\InputInterface;
24
use Symfony\Component\Console\Input\InputOption;
25
use Symfony\Component\Console\Output\OutputInterface;
26
27
class LanguagesCommand extends Command
28
{
29
    protected $types = ['name', 'mime', 'filename'];
30
    protected $formatters = [];
31
32
    protected function configure()
33
    {
34
        $this->setName('languages')
35
            ->addArgument('by', InputArgument::OPTIONAL, 'Alias type, one of '.implode(', ', array_map(function($f) { return "<info>{$f}</info>"; }, $this->types)), 'name')
36
            ->addOption('no-group', 'g', InputOption::VALUE_NONE, 'Do not group languages by type')
37
            ->addOption('classes', 'c', InputOption::VALUE_NONE, 'Return fully qualified class names instead of identifiers')
38
            ->addOption('headerless', 'l', InputOption::VALUE_NONE, 'Output table without headers, useful for parsing')
39
            ->setDescription('Lists available languages')
40
        ;
41
    }
42
43
    protected function execute(InputInterface $input, OutputInterface $output)
44
    {
45
        $languages = KeyLighter::get()->registeredLanguages($input->getArgument('by'), $input->getOption('classes'));
46
47
        $table = new Table($output);
48
49
        if(!$input->getOption('headerless')) {
50
            $table->setHeaders([ucfirst($input->getArgument('by')), $input->getOption('classes') ? 'Class name' : 'Language']);
51
        }
52
53
        $table->setRows(array_map(function($language) {
54
            return [
55
                implode(', ', array_map(function ($f) { return "<comment>{$f}</comment>"; }, $language['aliases'])),
56
                $language['class']
57
            ];
58
        }, $input->getOption('no-group') ? $this->processNonGrouped($languages) : $this->processGrouped($languages)));
59
60
        $table->setStyle($input->getOption('headerless') ? 'compact' : 'borderless');
61
        $table->render();
62
    }
63
64
    protected function processGrouped($languages) {
65
        $result = [];
66
        foreach($languages as $alias => $class) {
67
            if(!isset($result[$class])) {
68
                $result[$class] = ['aliases' => [], 'class' => $class];
69
            }
70
71
            $result[$class]['aliases'][] = $alias;
72
        }
73
74
        return $result;
75
    }
76
77
    protected function processNonGrouped($languages) {
78
        $result = [];
79
        foreach($languages as $alias => $class) {
80
            $result[] = ['aliases' => [$alias], 'class' => $class];
81
        }
82
83
        return $result;
84
    }
85
}
86