Completed
Pull Request — master (#97)
by Jonathan
02:39
created

Substitutions::getFlippedSubstitutions()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 12

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 7
CRAP Score 2

Importance

Changes 0
Metric Value
dl 0
loc 12
ccs 7
cts 7
cp 1
rs 9.8666
c 0
b 0
f 0
cc 2
nc 2
nop 0
crap 2
1
<?php
2
3
declare(strict_types=1);
4
5
namespace Doctrine\Inflector\Rules;
6
7
use Doctrine\Inflector\WordInflector;
8
use function array_keys;
9
use function implode;
10
use function preg_match;
11
use function strtolower;
12
use function substr;
13
14
class Substitutions implements WordInflector
15
{
16
    /** @var Substitution[] */
17
    private $substitutions;
18
19
    /** @var string */
20
    private $regex;
21
22 524
    public function __construct(Substitution ...$substitutions)
23
    {
24 524
        foreach ($substitutions as $substitution) {
25 524
            $this->substitutions[$substitution->getFrom()->getWord()] = $substitution;
26
        }
27
28 524
        $this->regex = '(?:' . implode('|', array_keys($this->substitutions)) . ')';
29 524
    }
30
31 523
    public function getFlippedSubstitutions() : Substitutions
32
    {
33 523
        $substitutions = [];
34
35 523
        foreach ($this->substitutions as $substitution) {
36 523
            $substitutions[] = new Substitution(
37 523
                $substitution->getTo(),
38 523
                $substitution->getFrom()
39
            );
40
        }
41
42 523
        return new Substitutions(...$substitutions);
43
    }
44
45
46 265
    public function inflect(string $word) : string
47
    {
48 265
        if (preg_match('/(.*)\\b(' . $this->regex . ')$/i', $word, $regs) === 1) {
49 104
            return $regs[1] . $word[0] . substr($this->substitutions[strtolower($regs[2])]->getTo()->getWord(), 1);
50
        }
51
52 161
        return $word;
53
    }
54
}
55