CasesHelper::composeCasesFromWords()   A
last analyzed

Complexity

Conditions 4
Paths 6

Size

Total Lines 13

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 10
CRAP Score 4

Importance

Changes 0
Metric Value
cc 4
nc 6
nop 2
dl 0
loc 13
ccs 10
cts 10
cp 1
crap 4
rs 9.8333
c 0
b 0
f 0
1
<?php
2
namespace morphos;
3
4
use InvalidArgumentException;
5
6
trait CasesHelper
7
{
8
    /**
9
     * @param string $case
10
     * @return string
11
     * @throws InvalidArgumentException If passed case is invalid.
12
     */
13 6
    public static function canonizeCase($case)
14
    {
15 6
        $case = S::lower($case);
16
        switch ($case) {
17 6
            case Cases::NOMINATIVE:
18 6
            case 'nominativus':
19 5
            case 'n':
20 1
                return Cases::NOMINATIVE;
21
22 5
            case Cases::GENITIVE:
23 5
            case Cases::GENETIVE:
24 5
            case 'genetivus':
25 4
            case 'g':
26 1
                return Cases::GENITIVE;
27
28 4
            case Cases::DATIVE:
29 4
            case 'dativus':
30 3
            case 'd':
31 1
                return Cases::DATIVE;
32
33 3
            case Cases::ACCUSATIVE:
34
                return Cases::ACCUSATIVE;
35
36 3
            case Cases::ABLATIVE:
37 3
            case 'ablativus':
38 2
            case 'a':
39 1
                return Cases::ABLATIVE;
40
41 2
            case Cases::PREPOSITIONAL:
42 2
            case 'praepositionalis':
43 1
            case 'p':
44 1
                return Cases::PREPOSITIONAL;
45
46
            default:
47 1
                throw new InvalidArgumentException('Invalid case: '.$case);
48
        }
49
    }
50
51
    /**
52
     * @return string[]
53
     * @phpstan-return array<\morphos\Cases::*>
54
     */
55 25
    public static function getAllCases()
56
    {
57
        return [
58 25
            Cases::NOMINATIVE,
59
            Cases::GENITIVE,
60
            Cases::GENETIVE,
61
            Cases::DATIVE,
62
            Cases::ACCUSATIVE,
63
            Cases::ABLATIVE,
64
            Cases::PREPOSITIONAL,
65
        ];
66
    }
67
68
    /**
69
     * Составляет один массив с падежами из нескольких массивов падежей разных слов
70
     * @param array $words Двумерный массив слов и их падежей
71
     * @phpstan-param array<int, array<string, string>> $words
72
     * @param string $delimiter Разделитель между падежами слов
73
     * @return string[] Одномерный массив падежей
74
     * @phpstan-return array<string, string>
75
     */
76 25
    public static function composeCasesFromWords(array $words, $delimiter = ' ') {
77 25
        $cases = [];
78 25
        $all_cases = CasesHelper::getAllCases();
79 25
        if (count($words[0]) === 7) $all_cases[] = \morphos\Russian\Cases::LOCATIVE;
80 25
        foreach ($all_cases as $case) {
81 25
            $composed_case = [];
82 25
            foreach ($words as $wordCases) {
83 25
                $composed_case[] = $wordCases[$case];
84
            }
85 25
            $cases[$case] = implode($delimiter, $composed_case);
86
        }
87 25
        return $cases;
88
    }
89
}
90