| 1 |  |  | <?php | 
            
                                                                                                            
                            
            
                                    
            
            
                | 2 |  |  |  | 
            
                                                                                                            
                            
            
                                    
            
            
                | 3 |  |  | declare(strict_types=1); | 
            
                                                                                                            
                            
            
                                    
            
            
                | 4 |  |  |  | 
            
                                                                                                            
                            
            
                                    
            
            
                | 5 |  |  | namespace Doctrine\Inflector\Rules; | 
            
                                                                                                            
                            
            
                                    
            
            
                | 6 |  |  |  | 
            
                                                                                                            
                            
            
                                    
            
            
                | 7 |  |  | use function array_map; | 
            
                                                                                                            
                            
            
                                    
            
            
                | 8 |  |  | use function implode; | 
            
                                                                                                            
                            
            
                                    
            
            
                | 9 |  |  | use function preg_match; | 
            
                                                                                                            
                            
            
                                    
            
            
                | 10 |  |  |  | 
            
                                                                                                            
                            
            
                                    
            
            
                | 11 |  |  | class Uninflected | 
            
                                                                                                            
                            
            
                                    
            
            
                | 12 |  |  | { | 
            
                                                                                                            
                            
            
                                    
            
            
                | 13 |  |  |     /** @var Word[] */ | 
            
                                                                                                            
                            
            
                                    
            
            
                | 14 |  |  |     private $words; | 
            
                                                                                                            
                            
            
                                    
            
            
                | 15 |  |  |  | 
            
                                                                                                            
                            
            
                                    
            
            
                | 16 |  |  |     /** @var string|null */ | 
            
                                                                                                            
                            
            
                                    
            
            
                | 17 |  |  |     private $regex; | 
            
                                                                                                            
                                                                
            
                                    
            
            
                | 18 |  |  |  | 
            
                                                                        
                            
            
                                    
            
            
                | 19 | 532 |  |     public function __construct(Word ...$words) | 
            
                                                                        
                            
            
                                    
            
            
                | 20 |  |  |     { | 
            
                                                                        
                            
            
                                    
            
            
                | 21 | 532 |  |         $this->words = $words; | 
            
                                                                                                            
                            
            
                                    
            
            
                | 22 | 532 |  |     } | 
            
                                                                                                            
                            
            
                                    
            
            
                | 23 |  |  |  | 
            
                                                                                                            
                            
            
                                    
            
            
                | 24 |  |  |     /** | 
            
                                                                                                            
                            
            
                                    
            
            
                | 25 |  |  |      * @return Word[] | 
            
                                                                                                            
                            
            
                                    
            
            
                | 26 |  |  |      */ | 
            
                                                                                                            
                            
            
                                    
            
            
                | 27 | 530 |  |     public static function getDefaultWords() : iterable | 
            
                                                                                                            
                            
            
                                    
            
            
                | 28 |  |  |     { | 
            
                                                                                                            
                            
            
                                    
            
            
                | 29 | 530 |  |         yield new Word('.*?media'); | 
            
                                                                                                            
                            
            
                                    
            
            
                | 30 | 530 |  |         yield new Word('Amoyese'); | 
            
                                                                                                            
                            
            
                                    
            
            
                | 31 | 530 |  |         yield new Word('audio'); | 
            
                                                                                                            
                            
            
                                    
            
            
                | 32 | 530 |  |         yield new Word('bison'); | 
            
                                                                                                            
                            
            
                                    
            
            
                | 33 | 530 |  |         yield new Word('Borghese'); | 
            
                                                                                                            
                            
            
                                    
            
            
                | 34 | 530 |  |         yield new Word('bream'); | 
            
                                                                                                            
                            
            
                                    
            
            
                | 35 | 530 |  |         yield new Word('breeches'); | 
            
                                                                                                            
                            
            
                                    
            
            
                | 36 | 530 |  |         yield new Word('britches'); | 
            
                                                                                                            
                            
            
                                    
            
            
                | 37 | 530 |  |         yield new Word('buffalo'); | 
            
                                                                                                            
                            
            
                                    
            
            
                | 38 | 530 |  |         yield new Word('cantus'); | 
            
                                                                                                            
                            
            
                                    
            
            
                | 39 | 530 |  |         yield new Word('carp'); | 
            
                                                                                                            
                            
            
                                    
            
            
                | 40 | 530 |  |         yield new Word('chassis'); | 
            
                                                                                                            
                            
            
                                    
            
            
                | 41 | 530 |  |         yield new Word('clippers'); | 
            
                                                                                                            
                            
            
                                    
            
            
                | 42 | 530 |  |         yield new Word('cod'); | 
            
                                                                                                            
                            
            
                                    
            
            
                | 43 | 530 |  |         yield new Word('coitus'); | 
            
                                                                                                            
                            
            
                                    
            
            
                | 44 | 530 |  |         yield new Word('compensation'); | 
            
                                                                                                            
                            
            
                                    
            
            
                | 45 | 530 |  |         yield new Word('Congoese'); | 
            
                                                                                                            
                            
            
                                    
            
            
                | 46 | 530 |  |         yield new Word('contretemps'); | 
            
                                                                                                            
                            
            
                                    
            
            
                | 47 | 530 |  |         yield new Word('coreopsis'); | 
            
                                                                                                            
                            
            
                                    
            
            
                | 48 | 530 |  |         yield new Word('corps'); | 
            
                                                                                                            
                            
            
                                    
            
            
                | 49 | 530 |  |         yield new Word('data'); | 
            
                                                                                                            
                            
            
                                    
            
            
                | 50 | 530 |  |         yield new Word('debris'); | 
            
                                                                                                            
                            
            
                                    
            
            
                | 51 | 530 |  |         yield new Word('deer'); | 
            
                                                                                                            
                            
            
                                    
            
            
                | 52 | 530 |  |         yield new Word('diabetes'); | 
            
                                                                                                            
                            
            
                                    
            
            
                | 53 | 530 |  |         yield new Word('djinn'); | 
            
                                                                                                            
                            
            
                                    
            
            
                | 54 | 530 |  |         yield new Word('education'); | 
            
                                                                                                            
                            
            
                                    
            
            
                | 55 | 530 |  |         yield new Word('eland'); | 
            
                                                                                                            
                            
            
                                    
            
            
                | 56 | 530 |  |         yield new Word('elk'); | 
            
                                                                                                            
                            
            
                                    
            
            
                | 57 | 530 |  |         yield new Word('emoji'); | 
            
                                                                                                            
                            
            
                                    
            
            
                | 58 | 530 |  |         yield new Word('equipment'); | 
            
                                                                                                            
                            
            
                                    
            
            
                | 59 | 530 |  |         yield new Word('evidence'); | 
            
                                                                                                            
                            
            
                                    
            
            
                | 60 | 530 |  |         yield new Word('Faroese'); | 
            
                                                                                                            
                            
            
                                    
            
            
                | 61 | 530 |  |         yield new Word('feedback'); | 
            
                                                                                                            
                            
            
                                    
            
            
                | 62 | 530 |  |         yield new Word('fish'); | 
            
                                                                                                            
                            
            
                                    
            
            
                | 63 | 530 |  |         yield new Word('flounder'); | 
            
                                                                                                            
                            
            
                                    
            
            
                | 64 | 530 |  |         yield new Word('Foochowese'); | 
            
                                                                                                            
                            
            
                                    
            
            
                | 65 | 530 |  |         yield new Word('Furniture'); | 
            
                                                                                                            
                            
            
                                    
            
            
                | 66 | 530 |  |         yield new Word('furniture'); | 
            
                                                                                                            
                            
            
                                    
            
            
                | 67 | 530 |  |         yield new Word('gallows'); | 
            
                                                                                                            
                            
            
                                    
            
            
                | 68 | 530 |  |         yield new Word('Genevese'); | 
            
                                                                                                            
                            
            
                                    
            
            
                | 69 | 530 |  |         yield new Word('Genoese'); | 
            
                                                                                                            
                            
            
                                    
            
            
                | 70 | 530 |  |         yield new Word('Gilbertese'); | 
            
                                                                                                            
                            
            
                                    
            
            
                | 71 | 530 |  |         yield new Word('gold'); | 
            
                                                                                                            
                            
            
                                    
            
            
                | 72 | 530 |  |         yield new Word('headquarters'); | 
            
                                                                                                            
                            
            
                                    
            
            
                | 73 | 530 |  |         yield new Word('herpes'); | 
            
                                                                                                            
                            
            
                                    
            
            
                | 74 | 530 |  |         yield new Word('hijinks'); | 
            
                                                                                                            
                            
            
                                    
            
            
                | 75 | 530 |  |         yield new Word('Hottentotese'); | 
            
                                                                                                            
                            
            
                                    
            
            
                | 76 | 530 |  |         yield new Word('information'); | 
            
                                                                                                            
                            
            
                                    
            
            
                | 77 | 530 |  |         yield new Word('innings'); | 
            
                                                                                                            
                            
            
                                    
            
            
                | 78 | 530 |  |         yield new Word('jackanapes'); | 
            
                                                                                                            
                            
            
                                    
            
            
                | 79 | 530 |  |         yield new Word('jedi'); | 
            
                                                                                                            
                            
            
                                    
            
            
                | 80 | 530 |  |         yield new Word('Kiplingese'); | 
            
                                                                                                            
                            
            
                                    
            
            
                | 81 | 530 |  |         yield new Word('knowledge'); | 
            
                                                                                                            
                            
            
                                    
            
            
                | 82 | 530 |  |         yield new Word('Kongoese'); | 
            
                                                                                                            
                            
            
                                    
            
            
                | 83 | 530 |  |         yield new Word('love'); | 
            
                                                                                                            
                            
            
                                    
            
            
                | 84 | 530 |  |         yield new Word('Lucchese'); | 
            
                                                                                                            
                            
            
                                    
            
            
                | 85 | 530 |  |         yield new Word('Luggage'); | 
            
                                                                                                            
                            
            
                                    
            
            
                | 86 | 530 |  |         yield new Word('mackerel'); | 
            
                                                                                                            
                            
            
                                    
            
            
                | 87 | 530 |  |         yield new Word('Maltese'); | 
            
                                                                                                            
                            
            
                                    
            
            
                | 88 | 530 |  |         yield new Word('metadata'); | 
            
                                                                                                            
                            
            
                                    
            
            
                | 89 | 530 |  |         yield new Word('mews'); | 
            
                                                                                                            
                            
            
                                    
            
            
                | 90 | 530 |  |         yield new Word('moose'); | 
            
                                                                                                            
                            
            
                                    
            
            
                | 91 | 530 |  |         yield new Word('mumps'); | 
            
                                                                                                            
                            
            
                                    
            
            
                | 92 | 530 |  |         yield new Word('Nankingese'); | 
            
                                                                                                            
                            
            
                                    
            
            
                | 93 | 530 |  |         yield new Word('news'); | 
            
                                                                                                            
                            
            
                                    
            
            
                | 94 | 530 |  |         yield new Word('nexus'); | 
            
                                                                                                            
                            
            
                                    
            
            
                | 95 | 530 |  |         yield new Word('Niasese'); | 
            
                                                                                                            
                            
            
                                    
            
            
                | 96 | 530 |  |         yield new Word('nutrition'); | 
            
                                                                                                            
                            
            
                                    
            
            
                | 97 | 530 |  |         yield new Word('offspring'); | 
            
                                                                                                            
                            
            
                                    
            
            
                | 98 | 530 |  |         yield new Word('Pekingese'); | 
            
                                                                                                            
                            
            
                                    
            
            
                | 99 | 530 |  |         yield new Word('Piedmontese'); | 
            
                                                                                                            
                            
            
                                    
            
            
                | 100 | 530 |  |         yield new Word('pincers'); | 
            
                                                                                                            
                            
            
                                    
            
            
                | 101 | 530 |  |         yield new Word('Pistoiese'); | 
            
                                                                                                            
                            
            
                                    
            
            
                | 102 | 530 |  |         yield new Word('plankton'); | 
            
                                                                                                            
                            
            
                                    
            
            
                | 103 | 530 |  |         yield new Word('pliers'); | 
            
                                                                                                            
                            
            
                                    
            
            
                | 104 | 530 |  |         yield new Word('pokemon'); | 
            
                                                                                                            
                            
            
                                    
            
            
                | 105 | 530 |  |         yield new Word('police'); | 
            
                                                                                                            
                            
            
                                    
            
            
                | 106 | 530 |  |         yield new Word('Portuguese'); | 
            
                                                                                                            
                            
            
                                    
            
            
                | 107 | 530 |  |         yield new Word('proceedings'); | 
            
                                                                                                            
                            
            
                                    
            
            
                | 108 | 530 |  |         yield new Word('rabies'); | 
            
                                                                                                            
                            
            
                                    
            
            
                | 109 | 530 |  |         yield new Word('rain'); | 
            
                                                                                                            
                            
            
                                    
            
            
                | 110 | 530 |  |         yield new Word('rhinoceros'); | 
            
                                                                                                            
                            
            
                                    
            
            
                | 111 | 530 |  |         yield new Word('rice'); | 
            
                                                                                                            
                            
            
                                    
            
            
                | 112 | 530 |  |         yield new Word('salmon'); | 
            
                                                                                                            
                            
            
                                    
            
            
                | 113 | 530 |  |         yield new Word('Sarawakese'); | 
            
                                                                                                            
                            
            
                                    
            
            
                | 114 | 530 |  |         yield new Word('scissors'); | 
            
                                                                                                            
                            
            
                                    
            
            
                | 115 | 530 |  |         yield new Word('sea[- ]bass'); | 
            
                                                                                                            
                            
            
                                    
            
            
                | 116 | 530 |  |         yield new Word('series'); | 
            
                                                                                                            
                            
            
                                    
            
            
                | 117 | 530 |  |         yield new Word('Shavese'); | 
            
                                                                                                            
                            
            
                                    
            
            
                | 118 | 530 |  |         yield new Word('shears'); | 
            
                                                                                                            
                            
            
                                    
            
            
                | 119 | 530 |  |         yield new Word('sheep'); | 
            
                                                                                                            
                            
            
                                    
            
            
                | 120 | 530 |  |         yield new Word('siemens'); | 
            
                                                                                                            
                            
            
                                    
            
            
                | 121 | 530 |  |         yield new Word('species'); | 
            
                                                                                                            
                            
            
                                    
            
            
                | 122 | 530 |  |         yield new Word('staff'); | 
            
                                                                                                            
                            
            
                                    
            
            
                | 123 | 530 |  |         yield new Word('swine'); | 
            
                                                                                                            
                            
            
                                    
            
            
                | 124 | 530 |  |         yield new Word('traffic'); | 
            
                                                                                                            
                            
            
                                    
            
            
                | 125 | 530 |  |         yield new Word('trousers'); | 
            
                                                                                                            
                            
            
                                    
            
            
                | 126 | 530 |  |         yield new Word('trout'); | 
            
                                                                                                            
                            
            
                                    
            
            
                | 127 | 530 |  |         yield new Word('tuna'); | 
            
                                                                                                            
                            
            
                                    
            
            
                | 128 | 530 |  |         yield new Word('us'); | 
            
                                                                                                            
                            
            
                                    
            
            
                | 129 | 530 |  |         yield new Word('Vermontese'); | 
            
                                                                                                            
                            
            
                                    
            
            
                | 130 | 530 |  |         yield new Word('Wenchowese'); | 
            
                                                                                                            
                            
            
                                    
            
            
                | 131 | 530 |  |         yield new Word('wheat'); | 
            
                                                                                                            
                            
            
                                    
            
            
                | 132 | 530 |  |         yield new Word('whiting'); | 
            
                                                                                                            
                            
            
                                    
            
            
                | 133 | 530 |  |         yield new Word('wildebeest'); | 
            
                                                                                                            
                            
            
                                    
            
            
                | 134 | 530 |  |         yield new Word('Yengeese'); | 
            
                                                                                                            
                            
            
                                    
            
            
                | 135 | 530 |  |     } | 
            
                                                                                                            
                            
            
                                    
            
            
                | 136 |  |  |  | 
            
                                                                                                            
                            
            
                                    
            
            
                | 137 |  |  |     /** | 
            
                                                                                                            
                            
            
                                    
            
            
                | 138 |  |  |      * @return Word[] | 
            
                                                                                                            
                            
            
                                    
            
            
                | 139 |  |  |      */ | 
            
                                                                                                            
                            
            
                                    
            
            
                | 140 | 530 |  |     public function getWords() : iterable | 
            
                                                                                                            
                            
            
                                    
            
            
                | 141 |  |  |     { | 
            
                                                                                                            
                            
            
                                    
            
            
                | 142 | 530 |  |         yield from $this->words; | 
            
                                                                                                            
                            
            
                                    
            
            
                | 143 | 530 |  |     } | 
            
                                                                                                            
                            
            
                                    
            
            
                | 144 |  |  |  | 
            
                                                                                                            
                            
            
                                    
            
            
                | 145 | 424 |  |     public function isUninflected(string $word) : bool | 
            
                                                                                                            
                            
            
                                    
            
            
                | 146 |  |  |     { | 
            
                                                                                                            
                            
            
                                    
            
            
                | 147 | 424 |  |         return preg_match('/^(' . $this->getRegex() . ')$/i', $word, $regs) === 1; | 
            
                                                                                                            
                            
            
                                    
            
            
                | 148 |  |  |     } | 
            
                                                                                                            
                            
            
                                    
            
            
                | 149 |  |  |  | 
            
                                                                                                            
                            
            
                                    
            
            
                | 150 | 424 |  |     private function getRegex() : string | 
            
                                                                                                            
                            
            
                                    
            
            
                | 151 |  |  |     { | 
            
                                                                                                            
                            
            
                                    
            
            
                | 152 | 424 |  |         if ($this->regex === null) { | 
            
                                                                                                            
                            
            
                                    
            
            
                | 153 |  |  |             $words = array_map(function (Word $word) { | 
            
                                                                                                            
                            
            
                                    
            
            
                | 154 | 424 |  |                 return $word->getWord(); | 
            
                                                                                                            
                            
            
                                    
            
            
                | 155 | 424 |  |             }, $this->words); | 
            
                                                                                                            
                            
            
                                    
            
            
                | 156 |  |  |  | 
            
                                                                                                            
                            
            
                                    
            
            
                | 157 | 424 |  |             $this->regex = '(?:' . implode('|', $words) . ')'; | 
            
                                                                                                            
                            
            
                                    
            
            
                | 158 |  |  |         } | 
            
                                                                                                            
                            
            
                                    
            
            
                | 159 |  |  |  | 
            
                                                                                                            
                            
            
                                    
            
            
                | 160 | 424 |  |         return $this->regex; | 
            
                                                                                                            
                            
            
                                    
            
            
                | 161 |  |  |     } | 
            
                                                                                                            
                                                                
            
                                    
            
            
                | 162 |  |  | } | 
            
                                                        
            
                                    
            
            
                | 163 |  |  |  |