tasslihorec sfaxoistadet bintestcss PKN\TrrNorwegianBokmal/Rules.phpnu[getFlippedSubstitutions() ); } public static function getPluralRuleset(): Ruleset { return new Ruleset( new Transformations(...Inflectible::getPlural()), new Patterns(...Uninflected::getPlural()), new Substitutions(...Inflectible::getIrregular()) ); } } PKN\{<NorwegianBokmal/Inflectible.phpnu[regular = $regular; $this->uninflected = $uninflected; $this->irregular = $irregular; } public function getRegular(): Transformations { return $this->regular; } public function getUninflected(): Patterns { return $this->uninflected; } public function getIrregular(): Substitutions { return $this->irregular; } } PKN\m\\Substitutions.phpnu[substitutions[$substitution->getFrom()->getWord()] = $substitution; } } public function getFlippedSubstitutions(): Substitutions { $substitutions = []; foreach ($this->substitutions as $substitution) { $substitutions[] = new Substitution( $substitution->getTo(), $substitution->getFrom() ); } return new Substitutions(...$substitutions); } public function inflect(string $word): string { $lowerWord = strtolower($word); if (isset($this->substitutions[$lowerWord])) { $firstLetterUppercase = $lowerWord[0] !== $word[0]; $toWord = $this->substitutions[$lowerWord]->getTo()->getWord(); if ($firstLetterUppercase) { return strtoupper($toWord[0]) . substr($toWord, 1); } return $toWord; } return $word; } } PKN\a_ Pattern.phpnu[pattern = $pattern; if (isset($this->pattern[0]) && $this->pattern[0] === '/') { $this->regex = $this->pattern; } else { $this->regex = '/' . $this->pattern . '/i'; } } public function getPattern(): string { return $this->pattern; } public function getRegex(): string { return $this->regex; } public function matches(string $word): bool { return preg_match($this->getRegex(), $word) === 1; } } PKN\Substitution.phpnu[from = $from; $this->to = $to; } public function getFrom(): Word { return $this->from; } public function getTo(): Word { return $this->to; } } PKN\j?jjSpanish/Rules.phpnu[getFlippedSubstitutions() ); } public static function getPluralRuleset(): Ruleset { return new Ruleset( new Transformations(...Inflectible::getPlural()), new Patterns(...Uninflected::getPlural()), new Substitutions(...Inflectible::getIrregular()) ); } } PKN\͕99Spanish/Inflectible.phpnu[getFlippedSubstitutions() ); } public static function getPluralRuleset(): Ruleset { return new Ruleset( new Transformations(...Inflectible::getPlural()), new Patterns(...Uninflected::getPlural()), new Substitutions(...Inflectible::getIrregular()) ); } } PKN\ԟ..English/Inflectible.phpnu[getFlippedSubstitutions() ); } public static function getPluralRuleset(): Ruleset { return new Ruleset( new Transformations(...Inflectible::getPlural()), new Patterns(...Uninflected::getPlural()), new Substitutions(...Inflectible::getIrregular()) ); } } PKN\,zRZZFrench/Inflectible.phpnu[getFlippedSubstitutions() ); } public static function getPluralRuleset(): Ruleset { return new Ruleset( new Transformations(...Inflectible::getPlural()), new Patterns(...Uninflected::getPlural()), new Substitutions(...Inflectible::getIrregular()) ); } } PKN\:[FEsperanto/Inflectible.phpnu[pattern = $pattern; $this->replacement = $replacement; } public function getPattern(): Pattern { return $this->pattern; } public function getReplacement(): string { return $this->replacement; } public function inflect(string $word): string { return (string) preg_replace($this->pattern->getRegex(), $this->replacement, $word); } } PKN\!<ۘmmPortuguese/Rules.phpnu[getFlippedSubstitutions() ); } public static function getPluralRuleset(): Ruleset { return new Ruleset( new Transformations(...Inflectible::getPlural()), new Patterns(...Uninflected::getPlural()), new Substitutions(...Inflectible::getIrregular()) ); } } PKN\@YoPortuguese/Inflectible.phpnu[getFlippedSubstitutions() ); } public static function getPluralRuleset(): Ruleset { return new Ruleset( new Transformations(...Inflectible::getPlural()), new Patterns(...Uninflected::getPlural()), new Substitutions(...Inflectible::getIrregular()) ); } } PKN\JTurkish/Inflectible.phpnu[YεggTurkish/Uninflected.phpnu[getPattern(); }, $patterns); $this->regex = '/^(?:' . implode('|', $patterns) . ')$/i'; } public function matches(string $word): bool { return preg_match($this->regex, $word, $regs) === 1; } } PKN\h%ASTransformations.phpnu[transformations = $transformations; } public function inflect(string $word): string { foreach ($this->transformations as $transformation) { if ($transformation->getPattern()->matches($word)) { return $transformation->inflect($word); } } return $word; } } PKN\^jjItalian/Rules.phpnu[getFlippedSubstitutions() ); } public static function getPluralRuleset(): Ruleset { return new Ruleset( new Transformations(...Inflectible::getPlural()), new Patterns(...Uninflected::getPlural()), new Substitutions(...Inflectible::getIrregular()) ); } } PKN\$+ ! !Italian/Inflectible.phpnu[ */ public static function getSingular(): iterable { // Reverse of -sce → -scia (fasce → fascia) yield new Transformation(new Pattern('([aeiou])sce$'), '\\1scia'); // Reverse of -cie → -cia (farmacia → farmacie) yield new Transformation(new Pattern('cie$'), 'cia'); // Reverse of -gie → -gia (bugia → bugie) yield new Transformation(new Pattern('gie$'), 'gia'); // Reverse of -ce → -cia (arance → arancia) yield new Transformation(new Pattern('([^aeiou])ce$'), '\1cia'); // Reverse of -ge → -gia (valige → valigia) yield new Transformation(new Pattern('([^aeiou])ge$'), '\1gia'); // Reverse of -chi → -co (bachi → baco) yield new Transformation(new Pattern('([bcdfghjklmnpqrstvwxyz][aeiou])chi$'), '\1co'); // Reverse of -ghi → -go (laghi → lago) yield new Transformation(new Pattern('([bcdfghjklmnpqrstvwxyz][aeiou])ghi$'), '\1go'); // Reverse of -ci → -co (medici → medico) yield new Transformation(new Pattern('([aeiou][bcdfghjklmnpqrstvwxyz])ci$'), '\1co'); // Reverse of -gi → -go (psicologi → psicologo) yield new Transformation(new Pattern('([aeiou][bcdfghjklmnpqrstvwxyz])gi$'), '\1go'); // Reverse of -i → -io (zii → zio, negozi → negozio) // This is more complex due to Italian's stress patterns, but we'll handle the basic case yield new Transformation(new Pattern('([^aeiou])i$'), '\1io'); // Handle words that end with -i but should go to -co/-go (amici → amico, not amice) yield new Transformation(new Pattern('([^aeiou])ci$'), '\1co'); yield new Transformation(new Pattern('([^aeiou])gi$'), '\1go'); // Reverse of -a → -e yield new Transformation(new Pattern('e$'), 'a'); // Reverse of -e → -i yield new Transformation(new Pattern('i$'), 'e'); // Reverse of -o → -i yield new Transformation(new Pattern('i$'), 'o'); } /** @return iterable */ public static function getPlural(): iterable { // Words ending in -scia without stress on 'i' become -sce (e.g. fascia → fasce) yield new Transformation(new Pattern('([aeiou])scia$'), '\\1sce'); // Words ending in -cia/gia with stress on 'i' keep the 'i' in plural yield new Transformation(new Pattern('cia$'), 'cie'); // e.g. farmacia → farmacie yield new Transformation(new Pattern('gia$'), 'gie'); // e.g. bugia → bugie // Words ending in -cia/gia without stress on 'i' lose the 'i' in plural yield new Transformation(new Pattern('([^aeiou])cia$'), '\\1ce'); // e.g. arancia → arance yield new Transformation(new Pattern('([^aeiou])gia$'), '\\1ge'); // e.g. valigia → valige // Words ending in -co/-go with stress on 'o' become -chi/-ghi yield new Transformation(new Pattern('([bcdfghjklmnpqrstvwxyz][aeiou])co$'), '\\1chi'); // e.g. baco → bachi yield new Transformation(new Pattern('([bcdfghjklmnpqrstvwxyz][aeiou])go$'), '\\1ghi'); // e.g. lago → laghi // Words ending in -co/-go with stress on the penultimate syllable become -ci/-gi yield new Transformation(new Pattern('([aeiou][bcdfghjklmnpqrstvwxyz])co$'), '\\1ci'); // e.g. medico → medici yield new Transformation(new Pattern('([aeiou][bcdfghjklmnpqrstvwxyz])go$'), '\\1gi'); // e.g. psicologo → psicologi // Words ending in -io with stress on 'i' keep the 'i' in plural yield new Transformation(new Pattern('([^aeiou])io$'), '\\1i'); // e.g. zio → zii // Words ending in -io with stress on 'o' lose the 'i' in plural yield new Transformation(new Pattern('([aeiou])io$'), '\\1i'); // e.g. negozio → negozi // Standard ending rules yield new Transformation(new Pattern('a$'), 'e'); // -a → -e yield new Transformation(new Pattern('e$'), 'i'); // -e → -i yield new Transformation(new Pattern('o$'), 'i'); // -o → -i } /** @return iterable */ public static function getIrregular(): iterable { // Irregular substitutions (singular => plural) $irregulars = [ 'ala' => 'ali', 'albergo' => 'alberghi', 'amica' => 'amiche', 'amico' => 'amici', 'ampio' => 'ampi', 'arancia' => 'arance', 'arma' => 'armi', 'asparago' => 'asparagi', 'banca' => 'banche', 'belga' => 'belgi', 'braccio' => 'braccia', 'budello' => 'budella', 'bue' => 'buoi', 'caccia' => 'cacce', 'calcagno' => 'calcagna', 'camicia' => 'camicie', 'cane' => 'cani', 'capitale' => 'capitali', 'carcere' => 'carceri', 'casa' => 'case', 'cavaliere' => 'cavalieri', 'centinaio' => 'centinaia', 'cerchio' => 'cerchia', 'cervello' => 'cervella', 'chiave' => 'chiavi', 'chirurgo' => 'chirurgi', 'ciglio' => 'ciglia', 'città' => 'città', 'corno' => 'corna', 'corpo' => 'corpi', 'crisi' => 'crisi', 'dente' => 'denti', 'dio' => 'dei', 'dito' => 'dita', 'dottore' => 'dottori', 'fiore' => 'fiori', 'fratello' => 'fratelli', 'fuoco' => 'fuochi', 'gamba' => 'gambe', 'ginocchio' => 'ginocchia', 'gioco' => 'giochi', 'giornale' => 'giornali', 'giraffa' => 'giraffe', 'labbro' => 'labbra', 'lenzuolo' => 'lenzuola', 'libro' => 'libri', 'madre' => 'madri', 'maestro' => 'maestri', 'magico' => 'magici', 'mago' => 'maghi', 'maniaco' => 'maniaci', 'manico' => 'manici', 'mano' => 'mani', 'medico' => 'medici', 'membro' => 'membri', 'metropoli' => 'metropoli', 'migliaio' => 'migliaia', 'miglio' => 'miglia', 'mille' => 'mila', 'mio' => 'miei', 'moglie' => 'mogli', 'mosaico' => 'mosaici', 'muro' => 'muri', 'nemico' => 'nemici', 'nome' => 'nomi', 'occhio' => 'occhi', 'orecchio' => 'orecchi', 'osso' => 'ossa', 'paio' => 'paia', 'pane' => 'pani', 'papa' => 'papi', 'pasta' => 'paste', 'penna' => 'penne', 'pesce' => 'pesci', 'piede' => 'piedi', 'pittore' => 'pittori', 'poeta' => 'poeti', 'porco' => 'porci', 'porto' => 'porti', 'problema' => 'problemi', 'ragazzo' => 'ragazzi', 're' => 're', 'rene' => 'reni', 'riso' => 'risa', 'rosa' => 'rosa', 'sale' => 'sali', 'sarto' => 'sarti', 'scuola' => 'scuole', 'serie' => 'serie', 'serramento' => 'serramenta', 'sorella' => 'sorelle', 'specie' => 'specie', 'staio' => 'staia', 'stazione' => 'stazioni', 'strido' => 'strida', 'strillo' => 'strilla', 'studio' => 'studi', 'suo' => 'suoi', 'superficie' => 'superfici', 'tavolo' => 'tavoli', 'tempio' => 'templi', 'treno' => 'treni', 'tuo' => 'tuoi', 'uomo' => 'uomini', 'uovo' => 'uova', 'urlo' => 'urla', 'valigia' => 'valigie', 'vestigio' => 'vestigia', 'vino' => 'vini', 'viola' => 'viola', 'zio' => 'zii', ]; foreach ($irregulars as $singular => $plural) { yield new Substitution(new Word($singular), new Word($plural)); } } } PKN\eҷItalian/Uninflected.phpnu[ */ public static function getSingular(): iterable { yield from self::getDefault(); } /** @return iterable */ public static function getPlural(): iterable { yield from self::getDefault(); } /** @return iterable */ private static function getDefault(): iterable { // Invariable words (same form in singular and plural) $invariables = [ 'alpaca', 'auto', 'bar', 'blu', 'boia', 'boomerang', 'brindisi', 'campus', 'computer', 'crisi', 'crocevia', 'dopocena', 'film', 'foto', 'fuchsia', 'gnu', 'gorilla', 'gru', 'iguana', 'kamikaze', 'karaoke', 'koala', 'lama', 'menu', 'metropoli', 'moto', 'opossum', 'panda', 'quiz', 'radio', 're', 'scacciapensieri', 'serie', 'smartphone', 'sosia', 'sottoscala', 'specie', 'sport', 'tablet', 'taxi', 'vaglia', 'virtù', 'virus', 'yogurt', 'foto', 'fuchsia', ]; foreach ($invariables as $word) { yield new Pattern($word); } } } PKN\ɷ#Italian/InflectorFactory.phpnu[word = $word; } public function getWord(): string { return $this->word; } } PKN\TrrNorwegianBokmal/Rules.phpnu[PKN\{<NorwegianBokmal/Inflectible.phpnu[PKN\ٮdddNorwegianBokmal/Uninflected.phpnu[PKN\;0$l NorwegianBokmal/InflectorFactory.phpnu[PKN\fP    Ruleset.phpnu[PKN\m\\Substitutions.phpnu[PKN\a_ vPattern.phpnu[PKN\Substitution.phpnu[PKN\j?jjSpanish/Rules.phpnu[PKN\͕99sSpanish/Inflectible.phpnu[PKN\@Ogg%Spanish/Uninflected.phpnu[PKN\[(Spanish/InflectorFactory.phpnu[PKN\Djj*English/Rules.phpnu[PKN\ԟ..e.English/Inflectible.phpnu[PKN\&'O]English/Uninflected.phpnu[PKN\Y?%wEnglish/InflectorFactory.phpnu[PKN\ldii>yFrench/Rules.phpnu[PKN\,zRZZ|French/Inflectible.phpnu[PKN\#WWFrench/Uninflected.phpnu[PKN\~2$French/InflectorFactory.phpnu[PKN\ņ8All;Esperanto/Rules.phpnu[PKN\:[FEsperanto/Inflectible.phpnu[PKN\izEsperanto/Uninflected.phpnu[PKN\q#rEsperanto/InflectorFactory.phpnu[PKN\'Transformation.phpnu[PKN\!<ۘmmPortuguese/Rules.phpnu[PKN\@YoPortuguese/Inflectible.phpnu[PKN\n*Portuguese/Uninflected.phpnu[PKN\3Portuguese/InflectorFactory.phpnu[PKN\ڃjj Turkish/Rules.phpnu[PKN\JTurkish/Inflectible.phpnu[PKN\>YεggTurkish/Uninflected.phpnu[PKN\ Turkish/InflectorFactory.phpnu[PKN\$4#ZZ Patterns.phpnu[PKN\h%ASHTransformations.phpnu[PKN\^jjItalian/Rules.phpnu[PKN\$+ ! !Italian/Inflectible.phpnu[PKN\eҷItalian/Uninflected.phpnu[PKN\ɷ# Italian/InflectorFactory.phpnu[PKN\KHW&&&Word.phpnu[PK((x