diff --git a/README-ru.md b/README-ru.md index c8ad9f4..27117fc 100644 --- a/README-ru.md +++ b/README-ru.md @@ -63,7 +63,7 @@ inflectName('Базанов Иосиф Валерьянович') => array(6) { 'dative' => 'Базанову Иосифу Валерьяновичу', 'accusative' => 'Базанова Иосифа Валерьяновича', 'ablative' => 'Базановым Иосифом Валерьяновичем', - 'prepositional' => 'о Базанове Иосифе Валерьяновиче' + 'prepositional' => 'Базанове Иосифе Валерьяновиче' } ``` @@ -111,7 +111,7 @@ FirstNamesInflection::getCases($user_name) => array(6) { "dative" => "Ивану", "accusative" => "Ивана", "ablative" => "Иваном", - "prepositional" => "об Иване" + "prepositional" => "Иване" } ``` @@ -129,7 +129,7 @@ MiddleNamesInflection::getCases($user_name) => array(6) { "dative" => "Сергеевичу", "accusative" => "Сергеевича", "ablative" => "Сергеевичем", - "prepositional" => "о Сергеевиче" + "prepositional" => "Сергеевиче" } ``` @@ -149,7 +149,7 @@ LastNamesInflection::getCases($user_last_name) => array(6) { "dative" => "Иванову", "accusative" => "Иванова", "ablative" => "Ивановым", - "prepositional" => "об Иванове" + "prepositional" => "Иванове" } ``` @@ -161,6 +161,12 @@ LastNamesInflection::getCases($user_last_name) => array(6) { - `string getCase($name, $case)` - склоняет имя и возвращает результат.`$case` - это одна из констант `morphos\Cases` или `morphos\Russian\Cases`. - `array getCases($word)` - склоняет имя во всех падежах и возвращает результат в виде массива. +Что склоняется: +- название города с приставкой или без - `Москва`, `город Санкт-Петербург` +- название области: `Ростовская область` +- название края: `Краснодарский край` +- страны: `Россия`, `Франция`, `Украина` + _Пример_ ```php @@ -174,7 +180,7 @@ GeographicalNamesInflection::getCases('Саратов') => array(6) { "dative" => "Саратову", "accusative" => "Саратов", "ablative" => "Саратовом", - "prepositional" => "о Саратове" + "prepositional" => "Саратове" } ``` @@ -203,7 +209,7 @@ NounDeclension::getCases('линейка') => array(6) { "dative" => "линейке", "accusative" => "линейку", "ablative" => "линейкой", - "prepositional" => "о линейке" + "prepositional" => "линейке" } ``` @@ -231,7 +237,7 @@ NounPluralization::getCases('поле') => array(6) { "dative" => "полям", "accusative" => "поля", "ablative" => "полями", - "prepositional" => "о полях" + "prepositional" => "полях" } $count = 10; @@ -269,7 +275,7 @@ CardinalNumeralGenerator::getCases($number) => array(6) { "dative" => "четырем тысячам тремстам пятидесяти одному", "accusative" => "четыре тысячи триста пятьдесят один", "ablative" => "четырьмя тысячами тремястами пятьюдесятью одним", - "prepositional" => "о четырех тысячах трехстах пятидесяти одном" + "prepositional" => "четырех тысячах трехстах пятидесяти одном" } ``` @@ -294,7 +300,7 @@ OrdinalNumeralGenerator::getCases($number) => array(6) { "dative" => "шестьдесят семь тысяч девятьсот сорок пятому", "accusative" => "шестьдесят семь тысяч девятьсот сорок пятый", "ablative" => "шестьдесят семь тысяч девятьсот сорок пятым", - "prepositional" => "о шестьдесят семь тысяч девятьсот сорок пятом" + "prepositional" => "шестьдесят семь тысяч девятьсот сорок пятом" } ``` @@ -372,8 +378,21 @@ TimeSpeller::spellInterval(new DateInterval('P5YT2M'), TimeSpeller::DIRECTION | * `about($word)` - добавляет предлог `о`, `об` или `обо` в зависимости от того, с каких букв начинается слово. * `verb($verb, $gender)` - изменяет окончание глагола в прошедшем времени в зависимости от рода. +### Предлоги + +Чтобы добавить предлог `о` или `об` в зависимости от того, с чего начинается следующее слово, используйте метод `about()`: +```php +use morphos\Russian\FirstNamesInflection; +use morphos\Russian\RussianLanguage; + +RussianLanguage::about('Иване') => 'об Иване' +// или комбинируйте с другими функциями склонения +$name = 'Андрей'; +RussianLanguage::about(FirstNamesInflection::getCase($name, 'п')) => 'об Андрее' +``` + ### Окончание глаголов - + Глаголы в прошедшем времени в русском языке имеют признак рода. Чтобы упростить подбор правильной формы глаголы используйте функцию: ```php diff --git a/src/BaseInflection.php b/src/BaseInflection.php index 4099e5f..1fb6b21 100644 --- a/src/BaseInflection.php +++ b/src/BaseInflection.php @@ -14,22 +14,4 @@ public static function getCases($name) public static function getCase($name, $case) { } - - /** - * Составляет один массив с падежами из нескольких массивов падежей разных слов - * @param array $words Двумерный массив слов и их падежей - * @param string $delimiter Разделитель между падежами слов - * @return array Одномерный массив падежей - */ - public static function composeCasesFromWords(array $words, $delimiter = ' ') { - $cases = []; - foreach (CasesHelper::getAllCases() as $case) { - $composed_case = []; - foreach ($words as $wordCases) { - $composed_case[] = $wordCases[$case]; - } - $cases[$case] = implode($delimiter, $composed_case); - } - return $cases; - } } diff --git a/src/CasesHelper.php b/src/CasesHelper.php index b0872ad..375f13f 100644 --- a/src/CasesHelper.php +++ b/src/CasesHelper.php @@ -53,4 +53,22 @@ public static function getAllCases() Cases::PREPOSITIONAL, ]; } + + /** + * Составляет один массив с падежами из нескольких массивов падежей разных слов + * @param array $words Двумерный массив слов и их падежей + * @param string $delimiter Разделитель между падежами слов + * @return array Одномерный массив падежей + */ + public static function composeCasesFromWords(array $words, $delimiter = ' ') { + $cases = []; + foreach (CasesHelper::getAllCases() as $case) { + $composed_case = []; + foreach ($words as $wordCases) { + $composed_case[] = $wordCases[$case]; + } + $cases[$case] = implode($delimiter, $composed_case); + } + return $cases; + } } diff --git a/src/Russian/CardinalNumeralGenerator.php b/src/Russian/CardinalNumeralGenerator.php index 0b439ef..08b5189 100644 --- a/src/Russian/CardinalNumeralGenerator.php +++ b/src/Russian/CardinalNumeralGenerator.php @@ -66,7 +66,7 @@ class CardinalNumeralGenerator extends NumeralGenerator implements Cases self::DAT => 'одному', self::VINIT => 'один', self::TVORIT => 'одним', - self::PREDLOJ => 'об одном', + self::PREDLOJ => 'одном', ), self::FEMALE => array( self::IMENIT => 'одна', @@ -74,7 +74,7 @@ class CardinalNumeralGenerator extends NumeralGenerator implements Cases self::DAT => 'одной', self::VINIT => 'одну', self::TVORIT => 'одной', - self::PREDLOJ => 'об одной', + self::PREDLOJ => 'одной', ), self::NEUTER => array( self::IMENIT => 'одно', @@ -82,7 +82,7 @@ class CardinalNumeralGenerator extends NumeralGenerator implements Cases self::DAT => 'одному', self::VINIT => 'одно', self::TVORIT => 'одним', - self::PREDLOJ => 'об одном', + self::PREDLOJ => 'одном', ), ), 'два' => array( @@ -92,7 +92,7 @@ class CardinalNumeralGenerator extends NumeralGenerator implements Cases self::DAT => 'двум', self::VINIT => 'два', self::TVORIT => 'двумя', - self::PREDLOJ => 'о двух', + self::PREDLOJ => 'двух', ), self::FEMALE => array( self::IMENIT => 'две', @@ -100,7 +100,7 @@ class CardinalNumeralGenerator extends NumeralGenerator implements Cases self::DAT => 'двум', self::VINIT => 'две', self::TVORIT => 'двумя', - self::PREDLOJ => 'о двух', + self::PREDLOJ => 'двух', ), self::NEUTER => array( self::IMENIT => 'два', @@ -108,7 +108,7 @@ class CardinalNumeralGenerator extends NumeralGenerator implements Cases self::DAT => 'двум', self::VINIT => 'два', self::TVORIT => 'двумя', - self::PREDLOJ => 'о двух', + self::PREDLOJ => 'двух', ), ), 'три' => array( @@ -117,7 +117,7 @@ class CardinalNumeralGenerator extends NumeralGenerator implements Cases self::DAT => 'трем', self::VINIT => 'три', self::TVORIT => 'тремя', - self::PREDLOJ => 'о трех', + self::PREDLOJ => 'трех', ), 'четыре' => array( self::IMENIT => 'четыре', @@ -125,7 +125,7 @@ class CardinalNumeralGenerator extends NumeralGenerator implements Cases self::DAT => 'четырем', self::VINIT => 'четыре', self::TVORIT => 'четырьмя', - self::PREDLOJ => 'о четырех', + self::PREDLOJ => 'четырех', ), 'двести' => array( self::IMENIT => 'двести', @@ -133,7 +133,7 @@ class CardinalNumeralGenerator extends NumeralGenerator implements Cases self::DAT => 'двумстам', self::VINIT => 'двести', self::TVORIT => 'двумястами', - self::PREDLOJ => 'о двухстах', + self::PREDLOJ => 'двухстах', ), 'восемьсот' => array( self::IMENIT => 'восемьсот', @@ -141,7 +141,7 @@ class CardinalNumeralGenerator extends NumeralGenerator implements Cases self::DAT => 'восьмистам', self::VINIT => 'восемьсот', self::TVORIT => 'восьмистами', - self::PREDLOJ => 'о восьмистах', + self::PREDLOJ => 'восьмистах', ), 'тысяча' => array( self::IMENIT => 'тысяча', @@ -149,7 +149,7 @@ class CardinalNumeralGenerator extends NumeralGenerator implements Cases self::DAT => 'тысячам', self::VINIT => 'тысяч', self::TVORIT => 'тысячей', - self::PREDLOJ => 'о тысячах', + self::PREDLOJ => 'тысячах', ), ); @@ -172,7 +172,7 @@ public static function getCases($number, $gender = self::MALE) self::DAT => $prefix.'и', self::VINIT => $word, self::TVORIT => $prefix.'ью', - self::PREDLOJ => self::choosePrepositionByFirstLetter($prefix, 'об', 'о').' '.$prefix.'и', + self::PREDLOJ => $prefix.'и', ); } elseif (in_array($number, array(40, 90, 100))) { $prefix = $number == 40 ? $word : S::slice($word, 0, -1); @@ -182,7 +182,7 @@ public static function getCases($number, $gender = self::MALE) self::DAT => $prefix.'а', self::VINIT => $word, self::TVORIT => $prefix.'а', - self::PREDLOJ => self::choosePrepositionByFirstLetter($prefix, 'об', 'о').' '.$prefix.'а', + self::PREDLOJ => $prefix.'а', ); } elseif (($number >= 50 && $number <= 80)) { $prefix = S::slice($word, 0, -6); @@ -192,7 +192,7 @@ public static function getCases($number, $gender = self::MALE) self::DAT => $prefix.'идесяти', self::VINIT => $prefix.'ьдесят', self::TVORIT => $prefix.'ьюдесятью', - self::PREDLOJ => self::choosePrepositionByFirstLetter($word, 'об', 'о').' '.$prefix.'идесяти', + self::PREDLOJ => $prefix.'идесяти', ); } elseif (in_array($number, array(300, 400))) { $prefix = S::slice($word, 0, -4); @@ -202,7 +202,7 @@ public static function getCases($number, $gender = self::MALE) self::DAT => $prefix.'емстам', self::VINIT => $word, self::TVORIT => $prefix.($number == 300 ? 'е' : 'ь').'мястами', - self::PREDLOJ => self::choosePrepositionByFirstLetter($word, 'об', 'о').' '.$prefix.'ехстах', + self::PREDLOJ => $prefix.'ехстах', ); } elseif ($number >= 500 && $number <= 900) { $prefix = S::slice($word, 0, -4); @@ -212,7 +212,7 @@ public static function getCases($number, $gender = self::MALE) self::DAT => $prefix.'истам', self::VINIT => $word, self::TVORIT => $prefix.'ьюстами', - self::PREDLOJ => self::choosePrepositionByFirstLetter($word, 'об', 'о').' '.$prefix.'истах', + self::PREDLOJ => $prefix.'истах', ); } elseif (isset(self::$exponents[$number])) { return NounDeclension::getCases($word, false); @@ -224,7 +224,7 @@ public static function getCases($number, $gender = self::MALE) self::DAT => 'нолю', self::VINIT => 'ноль', self::TVORIT => 'нолём', - self::PREDLOJ => 'о ноле', + self::PREDLOJ => 'ноле', ); } // compound numeral @@ -270,9 +270,6 @@ public static function getCases($number, $gender = self::MALE) foreach (array(self::IMENIT, self::RODIT, self::DAT, self::VINIT, self::TVORIT, self::PREDLOJ) as $case) { $result[$case] = array(); foreach ($parts as $partN => $part) { - if ($case == self::PREDLOJ && $partN > 0) { - list(, $part[$case]) = explode(' ', $part[$case], 2); - } $result[$case][] = $part[$case]; } $result[$case] = implode(' ', $result[$case]); diff --git a/src/Russian/FirstNamesInflection.php b/src/Russian/FirstNamesInflection.php index 60a2161..e916831 100644 --- a/src/Russian/FirstNamesInflection.php +++ b/src/Russian/FirstNamesInflection.php @@ -18,7 +18,7 @@ class FirstNamesInflection extends \morphos\NamesInflection implements Cases self::DAT => 'Льву', self::VINIT => 'Льва', self::TVORIT => 'Львом', - self::PREDLOJ => 'о Льве', + self::PREDLOJ => 'Льве', ), 'павел' => array( self::IMENIT => 'Павел', @@ -26,7 +26,7 @@ class FirstNamesInflection extends \morphos\NamesInflection implements Cases self::DAT => 'Павлу', self::VINIT => 'Павла', self::TVORIT => 'Павлом', - self::PREDLOJ => 'о Павле', + self::PREDLOJ => 'Павле', ) ); @@ -446,7 +446,7 @@ public static function getCases($name, $gender = null) self::DAT => $prefix.'и', self::VINIT => $prefix.'ю', self::TVORIT => $prefix.'ей', - self::PREDLOJ => self::choosePrepositionByFirstLetter($prefix, 'об', 'о').' '.$prefix.'и', + self::PREDLOJ => $prefix.'и', ); } elseif (S::slice($name, -1) == 'я') { $prefix = S::name(S::slice($name, 0, -1)); @@ -456,7 +456,7 @@ public static function getCases($name, $gender = null) self::DAT => $prefix.'е', self::VINIT => $prefix.'ю', self::TVORIT => $prefix.'ей', - self::PREDLOJ => self::choosePrepositionByFirstLetter($prefix, 'об', 'о').' '.$prefix.'е', + self::PREDLOJ => $prefix.'е', ); } @@ -474,7 +474,7 @@ public static function getCases($name, $gender = null) } $name = S::name($name); - return array_fill_keys(array(self::IMENIT, self::RODIT, self::DAT, self::VINIT, self::TVORIT), $name) + array(self::PREDLOJ => self::choosePrepositionByFirstLetter($name, 'об', 'о').' '.$name); + return array_fill_keys(array(self::IMENIT, self::RODIT, self::DAT, self::VINIT, self::TVORIT, self::PREDLOJ), $name); } protected static function getCasesMan($name) @@ -493,7 +493,7 @@ protected static function getCasesMan($name) self::DAT => $prefix.'у', self::VINIT => $prefix.'а', self::TVORIT => RussianLanguage::isHissingConsonant(S::slice($name, -1)) || S::slice($name, -1) == 'ц' ? $prefix.'ем' : $prefix.'ом', - self::PREDLOJ => self::choosePrepositionByFirstLetter($prefix, 'об', 'о').' '.$prefix.'е', + self::PREDLOJ => $prefix.'е', ); } elseif (S::slice($name, -1) == 'ь' && self::isConsonant(S::slice($name, -2, -1))) { // soft consonant $prefix = S::name(S::slice($name, 0, -1)); @@ -503,7 +503,7 @@ protected static function getCasesMan($name) self::DAT => $prefix.'ю', self::VINIT => $prefix.'я', self::TVORIT => $prefix.'ем', - self::PREDLOJ => self::choosePrepositionByFirstLetter($prefix, 'об', 'о').' '.$prefix.'е', + self::PREDLOJ => $prefix.'е', ); } elseif (in_array(S::slice($name, -2), array('ай', 'ей', 'ой', 'уй', 'яй', 'юй', 'ий'))) { $prefix = S::name(S::slice($name, 0, -1)); @@ -514,7 +514,7 @@ protected static function getCasesMan($name) self::DAT => $prefix.'ю', self::VINIT => $prefix.'я', self::TVORIT => $prefix.'ем', - self::PREDLOJ => self::choosePrepositionByFirstLetter($prefix, 'об', 'о').' '.$prefix.$postfix, + self::PREDLOJ => $prefix.$postfix, ); } elseif (S::slice($name, -1) == 'а' && self::isConsonant($before = S::slice($name, -2, -1)) && !in_array($before, array(/*'г', 'к', 'х', */'ц'))) { $prefix = S::name(S::slice($name, 0, -1)); @@ -525,7 +525,7 @@ protected static function getCasesMan($name) self::DAT => $prefix.'е', self::VINIT => $prefix.'у', self::TVORIT => $prefix.'ой', - self::PREDLOJ => self::choosePrepositionByFirstLetter($prefix, 'об', 'о').' '.$prefix.'е', + self::PREDLOJ => $prefix.'е', ); } elseif (S::slice($name, -2) == 'ло' || S::slice($name, -2) == 'ко') { $prefix = S::name(S::slice($name, 0, -1)); @@ -536,7 +536,7 @@ protected static function getCasesMan($name) self::DAT => $prefix.'е', self::VINIT => $prefix.'у', self::TVORIT => $prefix.'ой', - self::PREDLOJ => self::choosePrepositionByFirstLetter($prefix, 'об', 'о').' '.$prefix.'е', + self::PREDLOJ => $prefix.'е', ); } @@ -555,7 +555,7 @@ protected static function getCasesWoman($name) self::DAT => $prefix.'е', self::VINIT => $prefix.'у', self::TVORIT => $prefix.'ой', - self::PREDLOJ => self::choosePrepositionByFirstLetter($prefix, 'об', 'о').' '.$prefix.'е', + self::PREDLOJ => $prefix.'е', ); } else { return array( @@ -564,7 +564,7 @@ protected static function getCasesWoman($name) self::DAT => $prefix.'е', self::VINIT => $prefix.'у', self::TVORIT => $prefix.'ей', - self::PREDLOJ => self::choosePrepositionByFirstLetter($prefix, 'об', 'о').' '.$prefix.'е', + self::PREDLOJ => $prefix.'е', ); } } elseif (S::slice($name, -1) == 'ь' && self::isConsonant(S::slice($name, -2, -1))) { @@ -575,7 +575,7 @@ protected static function getCasesWoman($name) self::DAT => $prefix.'и', self::VINIT => $prefix.'ь', self::TVORIT => $prefix.'ью', - self::PREDLOJ => self::choosePrepositionByFirstLetter($prefix, 'об', 'о').' '.$prefix.'и', + self::PREDLOJ => $prefix.'и', ); } elseif (RussianLanguage::isHissingConsonant(S::slice($name, -1))) { $prefix = S::name($name); @@ -585,7 +585,7 @@ protected static function getCasesWoman($name) self::DAT => $prefix.'и', self::VINIT => $prefix, self::TVORIT => $prefix.'ью', - self::PREDLOJ => self::choosePrepositionByFirstLetter($prefix, 'об', 'о').' '.$prefix.'и', + self::PREDLOJ => $prefix.'и', ); } return null; diff --git a/src/Russian/GeographicalNamesInflection.php b/src/Russian/GeographicalNamesInflection.php index 462b985..b0aa12b 100644 --- a/src/Russian/GeographicalNamesInflection.php +++ b/src/Russian/GeographicalNamesInflection.php @@ -34,6 +34,11 @@ public static function isMutable($name) return static::isMutable(S::slice($name, 0, -5)); } + // N область + if (S::slice($name, -8) == ' область') { + return true; + } + // город N if (S::slice($name, 0, 6) == 'город ') { return true; @@ -53,37 +58,30 @@ public static function getCases($name) // N край if (S::slice($name, -5) == ' край') { return self::composeCasesFromWords([static::getCases(S::slice($name, 0, -5)), NounDeclension::getCases('край')]); + } + // N область + if (S::slice($name, -8) == ' область') { + return self::composeCasesFromWords([static::getCases(S::slice($name, 0, -8)), NounDeclension::getCases('область')]); } // город N if (S::slice($name, 0, 6) == 'город ') { return self::composeCasesFromWords([ NounDeclension::getCases('город'), - array_combine(self::getAllCases(), array_fill(0, 6, S::slice($name, -6))) + array_fill_keys(self::getAllCases(), S::name(S::slice($name, -6))) ]); } - // check for name of two words + // check for name of few words if (strpos($name, ' ') !== false) { $parts = explode(' ', $name); $cases = array(); $result = array(); foreach ($parts as $i => $part) { $result[$i] = static::getCases($part); - if ($i > 0) { - $result[$i][self::PREDLOJ] = substr(strstr($result[$i][self::PREDLOJ], ' '), 1); - } } - - $cases = array(); - foreach (array(self::IMENIT, self::RODIT, self::DAT, self::VINIT, self::TVORIT, self::PREDLOJ) as $case) { - foreach ($parts as $i => $part) { - $cases[$case][] = $result[$i][$case]; - } - $cases[$case] = implode(' ', $cases[$case]); - } - return $cases; + return self::composeCasesFromWords($result); } if (!in_array($name, self::$abbreviations)) { @@ -96,7 +94,18 @@ public static function getCases($name) self::DAT => $prefix.(self::isVelarConsonant(S::slice($name, -3, -2)) ? 'ому' : 'ему'), self::VINIT => $prefix.'ий', self::TVORIT => $prefix.'им', - self::PREDLOJ => self::choosePrepositionByFirstLetter($prefix, 'об', 'о').' '.$prefix.(self::chooseEndingBySonority($prefix, 'ем', 'ом')), + self::PREDLOJ => $prefix.(self::chooseEndingBySonority($prefix, 'ем', 'ом')), + ); + } else if (S::slice($name, -2) == 'ая') { + // Ростовская + $prefix = S::name(S::slice($name, 0, -2)); + return array( + self::IMENIT => $prefix.'ая', + self::RODIT => $prefix.'ой', + self::DAT => $prefix.'ой', + self::VINIT => $prefix.'ую', + self::TVORIT => $prefix.'ой', + self::PREDLOJ => $prefix.'ой', ); } else if (S::slice($name, -2) == 'ый') { // Грозный, Благодарный @@ -107,7 +116,7 @@ public static function getCases($name) self::DAT => $prefix.'ому', self::VINIT => $prefix.'ый', self::TVORIT => $prefix.'ым', - self::PREDLOJ => self::choosePrepositionByFirstLetter($prefix, 'об', 'о').' '.$prefix.'ом', + self::PREDLOJ => $prefix.'ом', ); } elseif (S::slice($name, -1) == 'а') { // Москва, Рига @@ -118,7 +127,7 @@ public static function getCases($name) self::DAT => $prefix.'е', self::VINIT => $prefix.'у', self::TVORIT => $prefix.'ой', - self::PREDLOJ => self::choosePrepositionByFirstLetter($prefix, 'об', 'о').' '.$prefix.'е', + self::PREDLOJ => $prefix.'е', ); } elseif (S::slice($name, -1) == 'я') { // Азия @@ -129,7 +138,7 @@ public static function getCases($name) self::DAT => $prefix.'и', self::VINIT => $prefix.'ю', self::TVORIT => $prefix.'ей', - self::PREDLOJ => self::choosePrepositionByFirstLetter($prefix, 'об', 'о').' '.$prefix.'и', + self::PREDLOJ => $prefix.'и', ); } elseif (S::slice($name, -1) == 'й') { // Ишимбай @@ -140,7 +149,7 @@ public static function getCases($name) self::DAT => $prefix.'ю', self::VINIT => $prefix.'й', self::TVORIT => $prefix.'ем', - self::PREDLOJ => self::choosePrepositionByFirstLetter($prefix, 'об', 'о').' '.$prefix.'е', + self::PREDLOJ => $prefix.'е', ); } elseif (self::isConsonant(S::slice($name, -1)) && S::slice($name, -2) != 'ов') { // Париж, Валаам, Киев @@ -151,7 +160,7 @@ public static function getCases($name) self::DAT => $prefix.'у', self::VINIT => $prefix, self::TVORIT => $prefix.(self::isVelarConsonant(S::slice($name, -2, -1)) ? 'ем' : 'ом'), - self::PREDLOJ => self::choosePrepositionByFirstLetter($prefix, 'об', 'о').' '.$prefix.'е', + self::PREDLOJ => $prefix.'е', ); } elseif (S::slice($name, -2) == 'ль') { // Ставрополь, Ярославль @@ -162,7 +171,7 @@ public static function getCases($name) self::DAT => $prefix.'ю', self::VINIT => $prefix.'ь', self::TVORIT => $prefix.'ем', - self::PREDLOJ => self::choosePrepositionByFirstLetter($prefix, 'об', 'о').' '.$prefix.'е', + self::PREDLOJ => $prefix.'е', ); } elseif (S::slice($name, -2) == 'рь') { // Тверь @@ -173,7 +182,7 @@ public static function getCases($name) self::DAT => $prefix.'и', self::VINIT => $prefix.'ь', self::TVORIT => $prefix.'ью', - self::PREDLOJ => self::choosePrepositionByFirstLetter($prefix, 'об', 'о').' '.$prefix.'и', + self::PREDLOJ => $prefix.'и', ); } elseif (S::slice($name, -2) == 'ки') { // Березники, Ессентуки @@ -184,7 +193,7 @@ public static function getCases($name) self::DAT => $prefix.'ам', self::VINIT => $prefix.'и', self::TVORIT => $prefix.'ами', - self::PREDLOJ => self::choosePrepositionByFirstLetter($prefix, 'об', 'о').' '.$prefix.'ах', + self::PREDLOJ => $prefix.'ах', ); } elseif (S::slice($name, -2) == 'мь') { // Пермь, Кемь @@ -195,7 +204,7 @@ public static function getCases($name) self::DAT => $prefix.'и', self::VINIT => $prefix.'ь', self::TVORIT => $prefix.'ью', - self::PREDLOJ => self::choosePrepositionByFirstLetter($prefix, 'об', 'о').' '.$prefix.'и', + self::PREDLOJ => $prefix.'и', ); } elseif (S::slice($name, -2) == 'нь') { // Рязань, Назрань @@ -206,7 +215,7 @@ public static function getCases($name) self::DAT => $prefix.'и', self::VINIT => $prefix.'ь', self::TVORIT => $prefix.'ью', - self::PREDLOJ => self::choosePrepositionByFirstLetter($prefix, 'об', 'о').' '.$prefix.'и', + self::PREDLOJ => $prefix.'и', ); } else if (S::slice($name, -2) == 'ые') { // Набережные @@ -217,7 +226,7 @@ public static function getCases($name) self::DAT => $prefix.'м', self::VINIT => $prefix.'е', self::TVORIT => $prefix.'ми', - self::PREDLOJ => self::choosePrepositionByFirstLetter($prefix, 'об', 'о').' '.$prefix.'х', + self::PREDLOJ => $prefix.'х', ); } else if (S::slice($name, -2) == 'ны') { // Челны @@ -228,7 +237,7 @@ public static function getCases($name) self::DAT => $prefix.'ам', self::VINIT => $prefix.'ы', self::TVORIT => $prefix.'ами', - self::PREDLOJ => self::choosePrepositionByFirstLetter($prefix, 'об', 'о').' '.$prefix.'ах', + self::PREDLOJ => $prefix.'ах', ); } @@ -248,14 +257,14 @@ public static function getCases($name) self::DAT => $prefix.'у', self::VINIT => S::name($name), self::TVORIT => $prefix.'ым', - self::PREDLOJ => self::choosePrepositionByFirstLetter($prefix, 'об', 'о').' '.$prefix.'е', + self::PREDLOJ => $prefix.'е', ); } } // if no rules matches or name is immutable $name = in_array($name, self::$abbreviations) ? S::upper($name) : S::name($name); - return array_fill_keys(array(self::IMENIT, self::RODIT, self::DAT, self::VINIT, self::TVORIT), $name) + array(self::PREDLOJ => self::choosePrepositionByFirstLetter($name, 'об', 'о').' '.$name); + return array_fill_keys(array(self::IMENIT, self::RODIT, self::DAT, self::VINIT, self::TVORIT, self::PREDLOJ), $name); } public static function getCase($name, $case) diff --git a/src/Russian/LastNamesInflection.php b/src/Russian/LastNamesInflection.php index a4a98d1..e5e6204 100644 --- a/src/Russian/LastNamesInflection.php +++ b/src/Russian/LastNamesInflection.php @@ -92,18 +92,10 @@ public static function getCases($name, $gender = null) $parts = explode('-', $name); $cases = []; foreach ($parts as $i => $part) { - $part_cases = static::getCases($part, $gender); - foreach ($part_cases as $case => $part_case) { - if ($case == self::PREDLOJ && $i > 0) - list(, $cases[$case][]) = explode(' ', $part_case); - else - $cases[$case][] = $part_case; - } + $parts[$i] = static::getCases($part, $gender); } - foreach ($cases as $i => $case) - $cases[$i] = implode('-', $case); - return $cases; + return self::composeCasesFromWords($parts, '-'); } if ($gender == self::MALE) { @@ -115,7 +107,7 @@ public static function getCases($name, $gender = null) self::DAT => $prefix.'у', self::VINIT => $prefix.'а', self::TVORIT => $prefix.'ым', - self::PREDLOJ => self::choosePrepositionByFirstLetter($prefix, 'об', 'о').' '.$prefix.'е' + self::PREDLOJ => $prefix.'е' ); } elseif (in_array(S::slice($name, -4), array('ский', 'ской', 'цкий', 'цкой'))) { $prefix = S::name(S::slice($name, 0, -2)); @@ -125,7 +117,7 @@ public static function getCases($name, $gender = null) self::DAT => $prefix.'ому', self::VINIT => $prefix.'ого', self::TVORIT => $prefix.'им', - self::PREDLOJ => self::choosePrepositionByFirstLetter($prefix, 'об', 'о').' '.$prefix.'ом' + self::PREDLOJ => $prefix.'ом' ); // Верхний / Убогий / Толстой // Верхнего / Убогого / Толстого @@ -140,7 +132,7 @@ public static function getCases($name, $gender = null) self::DAT => $prefix.'ому', self::VINIT => $prefix.'ого', self::TVORIT => $prefix.'ым', - self::PREDLOJ => self::choosePrepositionByFirstLetter($prefix, 'об', 'о').' '.$prefix.'ом' + self::PREDLOJ => $prefix.'ом' ); } @@ -153,7 +145,7 @@ public static function getCases($name, $gender = null) self::DAT => $prefix.'ой', self::VINIT => $prefix.'у', self::TVORIT => $prefix.'ой', - self::PREDLOJ => self::choosePrepositionByFirstLetter($prefix, 'об', 'о').' '.$prefix.'ой' + self::PREDLOJ => $prefix.'ой' ); } @@ -165,7 +157,7 @@ public static function getCases($name, $gender = null) self::DAT => $prefix.'ой', self::VINIT => $prefix.'ую', self::TVORIT => $prefix.'ой', - self::PREDLOJ => self::choosePrepositionByFirstLetter($prefix, 'об', 'о').' '.$prefix.'ой' + self::PREDLOJ => $prefix.'ой' ); } } @@ -178,7 +170,7 @@ public static function getCases($name, $gender = null) self::DAT => $prefix.'е', self::VINIT => $prefix.'ю', self::TVORIT => $prefix.'ей', - self::PREDLOJ => self::choosePrepositionByFirstLetter($prefix, 'об', 'о').' '.$prefix.'е' + self::PREDLOJ => $prefix.'е' ); } elseif (S::slice($name, -1) == 'а') { $prefix = S::name(S::slice($name, 0, -1)); @@ -188,7 +180,7 @@ public static function getCases($name, $gender = null) self::DAT => $prefix.'е', self::VINIT => $prefix.'у', self::TVORIT => $prefix.'ой', - self::PREDLOJ => self::choosePrepositionByFirstLetter($prefix, 'об', 'о').' '.$prefix.'е' + self::PREDLOJ => $prefix.'е' ); } elseif (self::isConsonant(S::slice($name, -1)) && S::slice($name, -2) != 'ых') { $prefix = S::name($name); @@ -198,7 +190,7 @@ public static function getCases($name, $gender = null) self::DAT => $prefix.'у', self::VINIT => $prefix.'а', self::TVORIT => $prefix.'ом', - self::PREDLOJ => self::choosePrepositionByFirstLetter($prefix, 'об', 'о').' '.$prefix.'е' + self::PREDLOJ => $prefix.'е' ); } elseif (S::slice($name, -1) == 'ь' && $gender == self::MALE) { $prefix = S::name(S::slice($name, 0, -1)); @@ -208,12 +200,12 @@ public static function getCases($name, $gender = null) self::DAT => $prefix.'ю', self::VINIT => $prefix.'я', self::TVORIT => $prefix.'ем', - self::PREDLOJ => self::choosePrepositionByFirstLetter($prefix, 'об', 'о').' '.$prefix.'е' + self::PREDLOJ => $prefix.'е' ); } $name = S::name($name); - return array_fill_keys(array(self::IMENIT, self::RODIT, self::DAT, self::VINIT, self::TVORIT), $name) + array(self::PREDLOJ => self::choosePrepositionByFirstLetter($name, 'об', 'о').' '.$name); + return array_fill_keys(array(self::IMENIT, self::RODIT, self::DAT, self::VINIT, self::TVORIT, self::PREDLOJ), $name); } public static function getCase($name, $case, $gender = null) diff --git a/src/Russian/MiddleNamesInflection.php b/src/Russian/MiddleNamesInflection.php index d367b21..72bb10f 100644 --- a/src/Russian/MiddleNamesInflection.php +++ b/src/Russian/MiddleNamesInflection.php @@ -51,7 +51,7 @@ public static function getCases($name, $gender = null) Cases::DAT => $name.'у', Cases::VINIT => $name.'а', Cases::TVORIT => $name.'ем', - Cases::PREDLOJ => self::choosePrepositionByFirstLetter($name, 'об', 'о').' '.$name.'е', + Cases::PREDLOJ => $name.'е', ); } elseif (S::slice($name, -2) == 'на') { $prefix = S::name(S::slice($name, 0, -1)); @@ -61,7 +61,7 @@ public static function getCases($name, $gender = null) Cases::DAT => $prefix.'е', Cases::VINIT => $prefix.'у', Cases::TVORIT => $prefix.'ой', - Cases::PREDLOJ => self::choosePrepositionByFirstLetter($prefix, 'об', 'о').' '.$prefix.'е', + Cases::PREDLOJ => $prefix.'е', ); } diff --git a/src/Russian/NounDeclension.php b/src/Russian/NounDeclension.php index 9d33645..e096db8 100644 --- a/src/Russian/NounDeclension.php +++ b/src/Russian/NounDeclension.php @@ -30,8 +30,8 @@ class NounDeclension extends \morphos\BaseInflection implements Cases, Gender 'имя', 'племя', 'семя', - 'путь' => array('путь', 'пути', 'пути', 'путь', 'путем', 'о пути'), - 'дитя' => array('дитя', 'дитяти', 'дитяти', 'дитя', 'дитятей', 'о дитяти') + 'путь' => array('путь', 'пути', 'пути', 'путь', 'путем', 'пути'), + 'дитя' => array('дитя', 'дитяти', 'дитяти', 'дитя', 'дитятей', 'дитяти') ); protected static $masculineWithSoft = array( @@ -127,7 +127,7 @@ public static function getCases($word, $animateness = false) self::DAT => $word, self::VINIT => $word, self::TVORIT => $word, - self::PREDLOJ => self::choosePrepositionByFirstLetter($word, 'об', 'о').' '.$word, + self::PREDLOJ => $word, ); } elseif (isset(self::$abnormalExceptions[$word])) { return array_combine(array(self::IMENIT, self::RODIT, self::DAT, self::VINIT, self::TVORIT, self::PREDLOJ), self::$abnormalExceptions[$word]); @@ -139,7 +139,7 @@ public static function getCases($word, $animateness = false) self::DAT => $prefix.'ени', self::VINIT => $word, self::TVORIT => $prefix.'енем', - self::PREDLOJ => self::choosePrepositionByFirstLetter($prefix, 'об', 'о').' '.$prefix.'ени', + self::PREDLOJ => $prefix.'ени', ); } @@ -185,7 +185,7 @@ public static function declinateFirstDeclension($word) // $forms[Cases::TVORIT] = $prefix.'ой'; # http://morpher.ru/Russian/Spelling.aspx#sibilant // PREDLOJ the same as DAT - $forms[Cases::PREDLOJ] = self::choosePrepositionByFirstLetter($forms[Cases::DAT], 'об', 'о').' '.$forms[Cases::DAT]; + $forms[Cases::PREDLOJ] = $forms[Cases::DAT]; return $forms; } @@ -229,7 +229,7 @@ public static function declinateSecondDeclension($word, $animateness = false) // PREDLOJ $forms[Cases::PREDLOJ] = self::getPredCaseOf12Declensions($word, $last, $prefix); - $forms[Cases::PREDLOJ] = self::choosePrepositionByFirstLetter($forms[Cases::PREDLOJ], 'об', 'о').' '.$forms[Cases::PREDLOJ]; + $forms[Cases::PREDLOJ] = $forms[Cases::PREDLOJ]; return $forms; } @@ -244,7 +244,7 @@ public static function declinateThirdDeclension($word) Cases::DAT => $prefix.'и', Cases::VINIT => $word, Cases::TVORIT => $prefix.'ью', - Cases::PREDLOJ => self::choosePrepositionByFirstLetter($prefix, 'об', 'о').' '.$prefix.'и', + Cases::PREDLOJ => $prefix.'и', ); } @@ -265,7 +265,7 @@ public static function declinateAdjective($word, $animateness) Cases::DAT => $prefix.'ому', Cases::VINIT => $word, Cases::TVORIT => $prefix.'ым', - Cases::PREDLOJ => self::choosePrepositionByFirstLetter($prefix, 'об', 'о').' '.$prefix.'ом', + Cases::PREDLOJ => $prefix.'ом', ); case 'ий': @@ -275,7 +275,7 @@ public static function declinateAdjective($word, $animateness) Cases::DAT => $prefix.'ему', Cases::VINIT => $prefix.'его', Cases::TVORIT => $prefix.'им', - Cases::PREDLOJ => self::choosePrepositionByFirstLetter($prefix, 'об', 'о').' '.$prefix.'ем', + Cases::PREDLOJ => $prefix.'ем', ); // Neuter adjectives @@ -288,7 +288,7 @@ public static function declinateAdjective($word, $animateness) Cases::DAT => $prefix.'му', Cases::VINIT => $word, Cases::TVORIT => S::slice($word, 0, -2).(S::slice($word, -2, -1) == 'о' ? 'ы' : 'и').'м', - Cases::PREDLOJ => self::choosePrepositionByFirstLetter($prefix, 'об', 'о').' '.$prefix.'м', + Cases::PREDLOJ => $prefix.'м', ); // Female adjectives @@ -300,7 +300,7 @@ public static function declinateAdjective($word, $animateness) Cases::DAT => $prefix.$ending, Cases::VINIT => $prefix.'ую', Cases::TVORIT => $prefix.$ending, - Cases::PREDLOJ => self::choosePrepositionByFirstLetter($prefix, 'об', 'о').' '.$prefix.$ending, + Cases::PREDLOJ => $prefix.$ending, ); } } diff --git a/src/Russian/NounPluralization.php b/src/Russian/NounPluralization.php index 0ef200a..3ed5f95 100644 --- a/src/Russian/NounPluralization.php +++ b/src/Russian/NounPluralization.php @@ -98,7 +98,7 @@ public static function getCases($word, $animateness = false) self::DAT => $word, self::VINIT => $word, self::TVORIT => $word, - self::PREDLOJ => self::choosePrepositionByFirstLetter($word, 'об', 'о').' '.$word, + self::PREDLOJ => $word, ); } @@ -189,7 +189,7 @@ protected static function declinateSubstative($word, $animateness) // PREDLOJ $forms[Cases::PREDLOJ] = self::chooseVowelAfterConsonant($last, $soft_last && S::slice($word, -2, -1) != 'ч', $prefix.'ях', $prefix.'ах'); - $forms[Cases::PREDLOJ] = self::choosePrepositionByFirstLetter($forms[Cases::PREDLOJ], 'об', 'о').' '.$forms[Cases::PREDLOJ]; + $forms[Cases::PREDLOJ] = $forms[Cases::PREDLOJ]; return $forms; } @@ -206,7 +206,7 @@ protected static function declinateAdjective($word, $animateness) Cases::DAT => $prefix.$vowel.'м', Cases::VINIT => $prefix.$vowel.($animateness ? 'х' : 'е'), Cases::TVORIT => $prefix.$vowel.'ми', - Cases::PREDLOJ => self::choosePrepositionByFirstLetter($prefix, 'об', 'о').' '.$prefix.$vowel.'х', + Cases::PREDLOJ => $prefix.$vowel.'х', ); } } diff --git a/src/Russian/OrdinalNumeralGenerator.php b/src/Russian/OrdinalNumeralGenerator.php index 10c699e..e097684 100644 --- a/src/Russian/OrdinalNumeralGenerator.php +++ b/src/Russian/OrdinalNumeralGenerator.php @@ -110,7 +110,7 @@ public static function getCases($number, $gender = self::MALE) self::DAT => $prefix.($gender == self::FEMALE ? 'ьей' : 'ьему'), self::VINIT => $prefix.($gender == self::FEMALE ? 'ью' : 'ьего'), self::TVORIT => $prefix.($gender == self::FEMALE ? 'ьей' : 'ьим'), - self::PREDLOJ => self::choosePrepositionByFirstLetter($prefix, 'об', 'о').' '.$prefix.($gender == self::FEMALE ? 'ьей' : 'ьем'), + self::PREDLOJ => $prefix.($gender == self::FEMALE ? 'ьей' : 'ьем'), ); } else { switch ($gender) { @@ -122,7 +122,7 @@ public static function getCases($number, $gender = self::MALE) self::DAT => $prefix.'ому', self::VINIT => $word, self::TVORIT => $prefix.'ым', - self::PREDLOJ => self::choosePrepositionByFirstLetter($prefix, 'об', 'о').' '.$prefix.'ом', + self::PREDLOJ => $prefix.'ом', ); case self::FEMALE: @@ -133,7 +133,7 @@ public static function getCases($number, $gender = self::MALE) self::DAT => $prefix.'ой', self::VINIT => $prefix.'ую', self::TVORIT => $prefix.'ой', - self::PREDLOJ => self::choosePrepositionByFirstLetter($prefix, 'об', 'о').' '.$prefix.'ой', + self::PREDLOJ => $prefix.'ой', ); case self::NEUTER: @@ -144,7 +144,7 @@ public static function getCases($number, $gender = self::MALE) self::DAT => $prefix.'ому', self::VINIT => $prefix.'ое', self::TVORIT => $prefix.'ым', - self::PREDLOJ => self::choosePrepositionByFirstLetter($prefix, 'об', 'о').' '.$prefix.'ом', + self::PREDLOJ => $prefix.'ом', ); } } @@ -169,12 +169,7 @@ public static function getCases($number, $gender = self::MALE) } $ordinal_part = self::getCases($word_number, $gender); foreach ($ordinal_part as $case => $ordinal_word) { - if ($case == self::PREDLOJ) { - list(, $ordinal_part[$case]) = explode(' ', $ordinal_part[$case]); - $ordinal_part[$case] = self::choosePrepositionByFirstLetter($ordinal_prefix, 'об', 'о').' '.$ordinal_prefix.$ordinal_part[$case]; - } else { - $ordinal_part[$case] = $ordinal_prefix.$ordinal_part[$case]; - } + $ordinal_part[$case] = $ordinal_prefix.$ordinal_part[$case]; } break; @@ -217,12 +212,7 @@ public static function getCases($number, $gender = self::MALE) // make one array with cases and delete 'o/об' prepositional from all parts except the last one foreach (array(self::IMENIT, self::RODIT, self::DAT, self::VINIT, self::TVORIT, self::PREDLOJ) as $case) { - if ($case == self::PREDLOJ) { - list(, $ordinal_part[$case]) = explode(' ', $ordinal_part[$case]); - $result[$case] = self::choosePrepositionByFirstLetter($cardinal_part, 'об', 'о').' '.$cardinal_part.' '.$ordinal_part[$case]; - } else { - $result[$case] = $cardinal_part.' '.$ordinal_part[$case]; - } + $result[$case] = $cardinal_part.' '.$ordinal_part[$case]; } } else { $result = $ordinal_part; diff --git a/src/Russian/RussianLanguage.php b/src/Russian/RussianLanguage.php index 7484982..01b741e 100644 --- a/src/Russian/RussianLanguage.php +++ b/src/Russian/RussianLanguage.php @@ -6,9 +6,9 @@ trait RussianLanguage { - /** - * @var array Все гласные - */ + /** + * @var array Все гласные + */ public static $vowels = array( 'а', 'е', @@ -73,38 +73,38 @@ trait RussianLanguage /** * Проверка гласной */ - public static function isVowel($char) - { - return in_array($char, self::$vowels); - } - - /** - * Проверка согласной - */ - public static function isConsonant($char) - { - return in_array($char, self::$consonants); - } - - /** - * Проверка звонкости согласной - */ - public static function isSonorousConsonant($char) - { - return in_array($char, self::$sonorousConsonants); - } - - /** - * Проверка глухости согласной - */ - public static function isDeafConsonant($char) - { - return in_array($char, self::$deafConsonants); - } - - /** - * Щипящая ли согласная - */ + public static function isVowel($char) + { + return in_array($char, self::$vowels); + } + + /** + * Проверка согласной + */ + public static function isConsonant($char) + { + return in_array($char, self::$consonants); + } + + /** + * Проверка звонкости согласной + */ + public static function isSonorousConsonant($char) + { + return in_array($char, self::$sonorousConsonants); + } + + /** + * Проверка глухости согласной + */ + public static function isDeafConsonant($char) + { + return in_array($char, self::$deafConsonants); + } + + /** + * Щипящая ли согласная + */ public static function isHissingConsonant($consonant) { return in_array(S::lower($consonant), array('ж', 'ш', 'ч', 'щ')); @@ -171,82 +171,81 @@ public static function chooseVowelAfterConsonant($last, $soft_last, $after_soft, } } - /** - * @param string $verb Verb to modify if gender is female - * @param string $gender If not `m`, verb will be modified - * @return string Correct verb - */ - public static function verb($verb, $gender) - { - $verb = S::lower($verb); - // возвратный глагол - if (S::slice($verb, -2) == 'ся') { - return ($gender == Gender::MALE ? $verb : mb_substr($verb, 0, -2).'ась'); - } - - // обычный глагол - return ($gender == Gender::MALE ? $verb : $verb.'а'); - } - - /** - * Add 'в' or 'во' prepositional before the word - * @param string $word - * @return string - */ - public static function in($word) - { - $normalized = trim(S::lower($word)); - if (in_array(S::slice($normalized, 0, 1), ['в', 'ф'])) - return 'во '.$word; - return 'в '.$word; - } - - /** - * Add 'с' or 'со' prepositional before the word - * @param string $word - * @return string - */ - public static function with($word) - { - $normalized = trim(S::lower($word)); - if (in_array(S::slice($normalized, 0, 1), ['c', 'з', 'ш', 'ж']) && static::isConsonant(S::slice($normalized, 1, 2)) || S::slice($normalized, 0, 1) == 'щ') - return 'со '.$word; - return 'с '.$word; - } - - /** - * Add 'о' or 'об' or 'обо' prepositional before the word - * @param string $word - * @return string - */ - public static function about($word) - { - $normalized = trim(S::lower($word)); - if (static::isVowel(S::slice($normalized, 0, 1)) && !in_array(S::slice($normalized, 0, 1), ['е', 'ё', 'ю', 'я'])) - return 'об '.$word; - - if (in_array(S::slice($normalized, 0, 3), ['все', 'всё', 'всю', 'что', 'мне'])) - return 'обо '.$word; - - return 'о '.$word; - } - - /** - * Выбирает первое или второе окончание в зависимости от звонкости/глухости в конце слова. - * @param string $word Слово (или префикс), на основе звонкости которого нужно выбрать окончание - * @param string $ifSonorous Окончание, если слово оканчивается на звонкую согласную - * @param string $ifDead Окончание, если слово оканчивается на глухую согласную - * @return string Первое или второе окончание - */ - public static function chooseEndingBySonority($word, $ifSononous, $ifDeaf) - { - $last = S::slice($word, -1); - var_dump($last); - if (self::isSonorousConsonant($last)) - return $ifSononous; - if (self::isDeafConsonant($last)) - return $ifDeaf; - - throw new \Exception('Not implemented'); - } + /** + * @param string $verb Verb to modify if gender is female + * @param string $gender If not `m`, verb will be modified + * @return string Correct verb + */ + public static function verb($verb, $gender) + { + $verb = S::lower($verb); + // возвратный глагол + if (S::slice($verb, -2) == 'ся') { + return ($gender == Gender::MALE ? $verb : mb_substr($verb, 0, -2).'ась'); + } + + // обычный глагол + return ($gender == Gender::MALE ? $verb : $verb.'а'); + } + + /** + * Add 'в' or 'во' prepositional before the word + * @param string $word + * @return string + */ + public static function in($word) + { + $normalized = trim(S::lower($word)); + if (in_array(S::slice($normalized, 0, 1), ['в', 'ф'])) + return 'во '.$word; + return 'в '.$word; + } + + /** + * Add 'с' or 'со' prepositional before the word + * @param string $word + * @return string + */ + public static function with($word) + { + $normalized = trim(S::lower($word)); + if (in_array(S::slice($normalized, 0, 1), ['c', 'з', 'ш', 'ж']) && static::isConsonant(S::slice($normalized, 1, 2)) || S::slice($normalized, 0, 1) == 'щ') + return 'со '.$word; + return 'с '.$word; + } + + /** + * Add 'о' or 'об' or 'обо' prepositional before the word + * @param string $word + * @return string + */ + public static function about($word) + { + $normalized = trim(S::lower($word)); + if (static::isVowel(S::slice($normalized, 0, 1)) && !in_array(S::slice($normalized, 0, 1), ['е', 'ё', 'ю', 'я'])) + return 'об '.$word; + + if (in_array(S::slice($normalized, 0, 3), ['все', 'всё', 'всю', 'что', 'мне'])) + return 'обо '.$word; + + return 'о '.$word; + } + + /** + * Выбирает первое или второе окончание в зависимости от звонкости/глухости в конце слова. + * @param string $word Слово (или префикс), на основе звонкости которого нужно выбрать окончание + * @param string $ifSonorous Окончание, если слово оканчивается на звонкую согласную + * @param string $ifDead Окончание, если слово оканчивается на глухую согласную + * @return string Первое или второе окончание + */ + public static function chooseEndingBySonority($word, $ifSononous, $ifDeaf) + { + $last = S::slice($word, -1); + if (self::isSonorousConsonant($last)) + return $ifSononous; + if (self::isDeafConsonant($last)) + return $ifDeaf; + + throw new \Exception('Not implemented'); + } } diff --git a/src/Russian/functions.php b/src/Russian/functions.php index 90867f1..65ad220 100644 --- a/src/Russian/functions.php +++ b/src/Russian/functions.php @@ -36,37 +36,19 @@ function inflectName($fullname, $case = null, $gender = null) $name[1] = FirstNamesInflection::getCases($name[1], $gender); $name[2] = MiddleNamesInflection::getCases($name[2], $gender); } - foreach (array(Cases::IMENIT, Cases::RODIT, Cases::DAT, Cases::VINIT, Cases::TVORIT, Cases::PREDLOJ) as $case) { - foreach ($name as $partNum => $namePart) { - if ($case == Cases::PREDLOJ && $partNum > 0) { - list(, $namePart[$case]) = explode(' ', $namePart[$case]); - } - $result[$case][] = $namePart[$case]; - } - $result[$case] = implode(' ', $result[$case]); - } - return $result; + return CasesHelper::composeCasesFromWords($name); } else { $case = CasesHelper::canonizeCase($case); if (count($name) == 2) { $name[0] = LastNamesInflection::getCase($name[0], $case, $gender); $name[1] = FirstNamesInflection::getCase($name[1], $case, $gender); - if ($case == Cases::PREDLOJ) { - list(, $name[1]) = explode(' ', $name[1]); - } } elseif (count($name) == 3) { $name[0] = LastNamesInflection::getCase($name[0], $case, $gender); $name[1] = FirstNamesInflection::getCase($name[1], $case, $gender); - if ($case == Cases::PREDLOJ) { - list(, $name[1]) = explode(' ', $name[1]); - } $name[2] = MiddleNamesInflection::getCase($name[2], $case, $gender); - if ($case == Cases::PREDLOJ) { - list(, $name[2]) = explode(' ', $name[2]); - } } + return implode(' ', $name); } - return implode(' ', $name); } /** diff --git a/tests/Russian/CardinalNumeralTest.php b/tests/Russian/CardinalNumeralTest.php index 8f188dc..03b13b6 100644 --- a/tests/Russian/CardinalNumeralTest.php +++ b/tests/Russian/CardinalNumeralTest.php @@ -27,20 +27,20 @@ public function testGetCases($number, $gender, $case, $case2, $case3, $case4, $c public function numbersProvider() { return array( - array(1, NumeralGenerator::MALE, 'один', 'одного', 'одному', 'один', 'одним', 'об одном'), - array(1, NumeralGenerator::FEMALE, 'одна', 'одной', 'одной', 'одну', 'одной', 'об одной'), - array(201, NumeralGenerator::MALE, 'двести один', 'двухсот одного', 'двумстам одному', 'двести один', 'двумястами одним', 'о двухстах одном'), - array(344, NumeralGenerator::MALE, 'триста сорок четыре', 'трехсот сорока четырех', 'тремстам сорока четырем', 'триста сорок четыре', 'тремястами сорока четырьмя', 'о трехстах сорока четырех'), - array(1007, NumeralGenerator::MALE, 'одна тысяча семь', 'одной тысячи семи', 'одной тысяче семи', 'одну тысячу семь', 'одной тысячей семью', 'об одной тысяче семи'), - array(3651, NumeralGenerator::MALE, 'три тысячи шестьсот пятьдесят один', 'трех тысяч шестисот пятидесяти одного', 'трем тысячам шестистам пятидесяти одному', 'три тысячи шестьсот пятьдесят один', 'тремя тысячами шестьюстами пятьюдесятью одним', 'о трех тысячах шестистах пятидесяти одном'), - array(9999, NumeralGenerator::MALE, 'девять тысяч девятьсот девяносто девять', 'девяти тысяч девятисот девяноста девяти', 'девяти тысячам девятистам девяноста девяти', 'девять тысяч девятьсот девяносто девять', 'девятью тысячами девятьюстами девяноста девятью', 'о девяти тысячах девятистах девяноста девяти'), + array(1, NumeralGenerator::MALE, 'один', 'одного', 'одному', 'один', 'одним', 'одном'), + array(1, NumeralGenerator::FEMALE, 'одна', 'одной', 'одной', 'одну', 'одной', 'одной'), + array(201, NumeralGenerator::MALE, 'двести один', 'двухсот одного', 'двумстам одному', 'двести один', 'двумястами одним', 'двухстах одном'), + array(344, NumeralGenerator::MALE, 'триста сорок четыре', 'трехсот сорока четырех', 'тремстам сорока четырем', 'триста сорок четыре', 'тремястами сорока четырьмя', 'трехстах сорока четырех'), + array(1007, NumeralGenerator::MALE, 'одна тысяча семь', 'одной тысячи семи', 'одной тысяче семи', 'одну тысячу семь', 'одной тысячей семью', 'одной тысяче семи'), + array(3651, NumeralGenerator::MALE, 'три тысячи шестьсот пятьдесят один', 'трех тысяч шестисот пятидесяти одного', 'трем тысячам шестистам пятидесяти одному', 'три тысячи шестьсот пятьдесят один', 'тремя тысячами шестьюстами пятьюдесятью одним', 'трех тысячах шестистах пятидесяти одном'), + array(9999, NumeralGenerator::MALE, 'девять тысяч девятьсот девяносто девять', 'девяти тысяч девятисот девяноста девяти', 'девяти тысячам девятистам девяноста девяти', 'девять тысяч девятьсот девяносто девять', 'девятью тысячами девятьюстами девяноста девятью', 'девяти тысячах девятистах девяноста девяти'), array(1234567890, NumeralGenerator::MALE, 'один миллиард двести тридцать четыре миллиона пятьсот шестьдесят семь тысяч восемьсот девяносто', 'одного миллиарда двухсот тридцати четырех миллионов пятисот шестидесяти семи тысяч восьмисот девяноста', 'одному миллиарду двумстам тридцати четырем миллионам пятистам шестидесяти семи тысячам восьмистам девяноста', 'один миллиард двести тридцать четыре миллиона пятьсот шестьдесят семь тысяч восемьсот девяносто', 'одним миллиардом двумястами тридцатью четырьмя миллионами пятьюстами шестьюдесятью семью тысячами восьмистами девяноста', - 'об одном миллиарде двухстах тридцати четырех миллионах пятистах шестидесяти семи тысячах восьмистах девяноста', + 'одном миллиарде двухстах тридцати четырех миллионах пятистах шестидесяти семи тысячах восьмистах девяноста', ), ); } diff --git a/tests/Russian/FirstNamesInflecionTest.php b/tests/Russian/FirstNamesInflecionTest.php index 0d1d3dd..c3b53be 100644 --- a/tests/Russian/FirstNamesInflecionTest.php +++ b/tests/Russian/FirstNamesInflecionTest.php @@ -73,89 +73,89 @@ public function testInflectionForWomen($name, $name2, $name3, $name4, $name5, $n public function menNamesProvider() { return array( - array('Иван', 'Ивана', 'Ивану', 'Ивана', 'Иваном', 'об Иване'), - array('Святослав', 'Святослава', 'Святославу', 'Святослава', 'Святославом', 'о Святославе'), - array('Тимур', 'Тимура', 'Тимуру', 'Тимура', 'Тимуром', 'о Тимуре'), - array('Рем', 'Рема', 'Рему', 'Рема', 'Ремом', 'о Реме'), - array('Казбич', 'Казбича', 'Казбичу', 'Казбича', 'Казбичем', 'о Казбиче'), - array('Игорь', 'Игоря', 'Игорю', 'Игоря', 'Игорем', 'об Игоре'), - array('Виль', 'Виля', 'Вилю', 'Виля', 'Вилем', 'о Виле'), - array('Рауль', 'Рауля', 'Раулю', 'Рауля', 'Раулем', 'о Рауле'), - array('Шамиль', 'Шамиля', 'Шамилю', 'Шамиля', 'Шамилем', 'о Шамиле'), - array('Петрусь', 'Петруся', 'Петрусю', 'Петруся', 'Петрусем', 'о Петрусе'), - array('Абай', 'Абая', 'Абаю', 'Абая', 'Абаем', 'об Абае'), - array('Федяй', 'Федяя', 'Федяю', 'Федяя', 'Федяем', 'о Федяе'), - array('Андрей', 'Андрея', 'Андрею', 'Андрея', 'Андреем', 'об Андрее'), - array('Гарей', 'Гарея', 'Гарею', 'Гарея', 'Гареем', 'о Гарее'), - array('Джансуй', 'Джансуя', 'Джансую', 'Джансуя', 'Джансуем', 'о Джансуе'), - array('Ной', 'Ноя', 'Ною', 'Ноя', 'Ноем', 'о Ное'), - array('Дмитрий', 'Дмитрия', 'Дмитрию', 'Дмитрия', 'Дмитрием', 'о Дмитрии'), - array('Гордий', 'Гордия', 'Гордию', 'Гордия', 'Гордием', 'о Гордии'), - array('Пий', 'Пия', 'Пию', 'Пия', 'Пием', 'о Пии'), - array('Геннадий', 'Геннадия', 'Геннадию', 'Геннадия', 'Геннадием', 'о Геннадии'), - array('Хаджибий', 'Хаджибия', 'Хаджибию', 'Хаджибия', 'Хаджибием', 'о Хаджибии'), - array('Никита', 'Никиты', 'Никите', 'Никиту', 'Никитой', 'о Никите'), - array('Данила', 'Данилы', 'Даниле', 'Данилу', 'Данилой', 'о Даниле'), - array('Эйса', 'Эйсы', 'Эйсе', 'Эйсу', 'Эйсой', 'об Эйсе'), - array('Кузьма', 'Кузьмы', 'Кузьме', 'Кузьму', 'Кузьмой', 'о Кузьме'), - array('Мустафа', 'Мустафы', 'Мустафе', 'Мустафу', 'Мустафой', 'о Мустафе'), - array('Байхужа', 'Байхужи', 'Байхуже', 'Байхужу', 'Байхужой', 'о Байхуже'), - array('Хасанша', 'Хасанши', 'Хасанше', 'Хасаншу', 'Хасаншой', 'о Хасанше'), - array('Карча', 'Карчи', 'Карче', 'Карчу', 'Карчой', 'о Карче'), - array('Гыкга', 'Гыкги', 'Гыкге', 'Гыкгу', 'Гыкгой', 'о Гыкге'), - array('Бетикка', 'Бетикки', 'Бетикке', 'Бетикку', 'Бетиккой', 'о Бетикке'), - array('Анания', 'Анании', 'Анании', 'Ананию', 'Ананией', 'об Анании'), - array('Неемия', 'Неемии', 'Неемии', 'Неемию', 'Неемией', 'о Неемии'), - array('Малахия', 'Малахии', 'Малахии', 'Малахию', 'Малахией', 'о Малахии'), - array('Осия', 'Осии', 'Осии', 'Осию', 'Осией', 'об Осии'), - array('Иеремия', 'Иеремии', 'Иеремии', 'Иеремию', 'Иеремией', 'об Иеремии'), - array('Илия', 'Илии', 'Илии', 'Илию', 'Илией', 'об Илии'), - array('Данило', 'Данилы', 'Даниле', 'Данилу', 'Данилой', 'о Даниле'), - array('Иванко', 'Иванки', 'Иванке', 'Иванку', 'Иванкой', 'об Иванке'), - array('Слава', 'Славы', 'Славе', 'Славу', 'Славой', 'о Славе'), - array('Сергей', 'Сергея', 'Сергею', 'Сергея', 'Сергеем', 'о Сергее'), - array('Илья', 'Ильи', 'Илье', 'Илью', 'Ильей', 'об Илье'), - array('Санек', 'Санька', 'Саньку', 'Санька', 'Саньком', 'о Саньке'), - array('Витёк', 'Витька', 'Витьку', 'Витька', 'Витьком', 'о Витьке'), + array('Иван', 'Ивана', 'Ивану', 'Ивана', 'Иваном', 'Иване'), + array('Святослав', 'Святослава', 'Святославу', 'Святослава', 'Святославом', 'Святославе'), + array('Тимур', 'Тимура', 'Тимуру', 'Тимура', 'Тимуром', 'Тимуре'), + array('Рем', 'Рема', 'Рему', 'Рема', 'Ремом', 'Реме'), + array('Казбич', 'Казбича', 'Казбичу', 'Казбича', 'Казбичем', 'Казбиче'), + array('Игорь', 'Игоря', 'Игорю', 'Игоря', 'Игорем', 'Игоре'), + array('Виль', 'Виля', 'Вилю', 'Виля', 'Вилем', 'Виле'), + array('Рауль', 'Рауля', 'Раулю', 'Рауля', 'Раулем', 'Рауле'), + array('Шамиль', 'Шамиля', 'Шамилю', 'Шамиля', 'Шамилем', 'Шамиле'), + array('Петрусь', 'Петруся', 'Петрусю', 'Петруся', 'Петрусем', 'Петрусе'), + array('Абай', 'Абая', 'Абаю', 'Абая', 'Абаем', 'Абае'), + array('Федяй', 'Федяя', 'Федяю', 'Федяя', 'Федяем', 'Федяе'), + array('Андрей', 'Андрея', 'Андрею', 'Андрея', 'Андреем', 'Андрее'), + array('Гарей', 'Гарея', 'Гарею', 'Гарея', 'Гареем', 'Гарее'), + array('Джансуй', 'Джансуя', 'Джансую', 'Джансуя', 'Джансуем', 'Джансуе'), + array('Ной', 'Ноя', 'Ною', 'Ноя', 'Ноем', 'Ное'), + array('Дмитрий', 'Дмитрия', 'Дмитрию', 'Дмитрия', 'Дмитрием', 'Дмитрии'), + array('Гордий', 'Гордия', 'Гордию', 'Гордия', 'Гордием', 'Гордии'), + array('Пий', 'Пия', 'Пию', 'Пия', 'Пием', 'Пии'), + array('Геннадий', 'Геннадия', 'Геннадию', 'Геннадия', 'Геннадием', 'Геннадии'), + array('Хаджибий', 'Хаджибия', 'Хаджибию', 'Хаджибия', 'Хаджибием', 'Хаджибии'), + array('Никита', 'Никиты', 'Никите', 'Никиту', 'Никитой', 'Никите'), + array('Данила', 'Данилы', 'Даниле', 'Данилу', 'Данилой', 'Даниле'), + array('Эйса', 'Эйсы', 'Эйсе', 'Эйсу', 'Эйсой', 'Эйсе'), + array('Кузьма', 'Кузьмы', 'Кузьме', 'Кузьму', 'Кузьмой', 'Кузьме'), + array('Мустафа', 'Мустафы', 'Мустафе', 'Мустафу', 'Мустафой', 'Мустафе'), + array('Байхужа', 'Байхужи', 'Байхуже', 'Байхужу', 'Байхужой', 'Байхуже'), + array('Хасанша', 'Хасанши', 'Хасанше', 'Хасаншу', 'Хасаншой', 'Хасанше'), + array('Карча', 'Карчи', 'Карче', 'Карчу', 'Карчой', 'Карче'), + array('Гыкга', 'Гыкги', 'Гыкге', 'Гыкгу', 'Гыкгой', 'Гыкге'), + array('Бетикка', 'Бетикки', 'Бетикке', 'Бетикку', 'Бетиккой', 'Бетикке'), + array('Анания', 'Анании', 'Анании', 'Ананию', 'Ананией', 'Анании'), + array('Неемия', 'Неемии', 'Неемии', 'Неемию', 'Неемией', 'Неемии'), + array('Малахия', 'Малахии', 'Малахии', 'Малахию', 'Малахией', 'Малахии'), + array('Осия', 'Осии', 'Осии', 'Осию', 'Осией', 'Осии'), + array('Иеремия', 'Иеремии', 'Иеремии', 'Иеремию', 'Иеремией', 'Иеремии'), + array('Илия', 'Илии', 'Илии', 'Илию', 'Илией', 'Илии'), + array('Данило', 'Данилы', 'Даниле', 'Данилу', 'Данилой', 'Даниле'), + array('Иванко', 'Иванки', 'Иванке', 'Иванку', 'Иванкой', 'Иванке'), + array('Слава', 'Славы', 'Славе', 'Славу', 'Славой', 'Славе'), + array('Сергей', 'Сергея', 'Сергею', 'Сергея', 'Сергеем', 'Сергее'), + array('Илья', 'Ильи', 'Илье', 'Илью', 'Ильей', 'Илье'), + array('Санек', 'Санька', 'Саньку', 'Санька', 'Саньком', 'Саньке'), + array('Витёк', 'Витька', 'Витьку', 'Витька', 'Витьком', 'Витьке'), ); } public function womenNamesProvider() { return array( - array('Анна', 'Анны', 'Анне', 'Анну', 'Анной', 'об Анне'), - array('Эра', 'Эры', 'Эре', 'Эру', 'Эрой', 'об Эре'), - array('Асма', 'Асмы', 'Асме', 'Асму', 'Асмой', 'об Асме'), - array('Хафиза', 'Хафизы', 'Хафизе', 'Хафизу', 'Хафизой', 'о Хафизе'), - array('Ольга', 'Ольги', 'Ольге', 'Ольгу', 'Ольгой', 'об Ольге'), - array('Моника', 'Моники', 'Монике', 'Монику', 'Моникой', 'о Монике'), - array('Голиндуха', 'Голиндухи', 'Голиндухе', 'Голиндуху', 'Голиндухой', 'о Голиндухе'), - array('Снежа', 'Снежи', 'Снеже', 'Снежу', 'Снежой', 'о Снеже'), - array('Гайша', 'Гайши', 'Гайше', 'Гайшу', 'Гайшой', 'о Гайше'), - array('Милица', 'Милицы', 'Милице', 'Милицу', 'Милицей', 'о Милице'), - array('Ляуца', 'Ляуцы', 'Ляуце', 'Ляуцу', 'Ляуцей', 'о Ляуце'), - array('Куаца', 'Куацы', 'Куаце', 'Куацу', 'Куацей', 'о Куаце'), - array('Олеся', 'Олеси', 'Олесе', 'Олесю', 'Олесей', 'об Олесе'), - array('Дарья', 'Дарьи', 'Дарье', 'Дарью', 'Дарьей', 'о Дарье'), - array('Майя', 'Майи', 'Майе', 'Майю', 'Майей', 'о Майе'), - array('Моя', 'Мои', 'Мое', 'Мою', 'Моей', 'о Мое'), - array('Пелагея', 'Пелагеи', 'Пелагее', 'Пелагею', 'Пелагеей', 'о Пелагее'), - array('Марция', 'Марции', 'Марции', 'Марцию', 'Марцией', 'о Марции'), - array('Наталия', 'Наталии', 'Наталии', 'Наталию', 'Наталией', 'о Наталии'), - array('Армения', 'Армении', 'Армении', 'Армению', 'Арменией', 'об Армении'), - array('Лия', 'Лии', 'Лии', 'Лию', 'Лией', 'о Лии'), - array('Ия', 'Ии', 'Ии', 'Ию', 'Ией', 'об Ии'), - array('Любовь', 'Любови', 'Любови', 'Любовь', 'Любовью', 'о Любови'), - array('Эсфирь', 'Эсфири', 'Эсфири', 'Эсфирь', 'Эсфирью', 'об Эсфири'), - array('Нинель', 'Нинели', 'Нинели', 'Нинель', 'Нинелью', 'о Нинели'), - array('Айгюль', 'Айгюли', 'Айгюли', 'Айгюль', 'Айгюлью', 'об Айгюли'), - array('Вартануш', 'Вартануши', 'Вартануши', 'Вартануш', 'Вартанушью', 'о Вартануши'), - array('Катиш', 'Катиши', 'Катиши', 'Катиш', 'Катишью', 'о Катиши'), - array('Хуж', 'Хужи', 'Хужи', 'Хуж', 'Хужью', 'о Хужи'), - array('Гуащ', 'Гуащи', 'Гуащи', 'Гуащ', 'Гуащью', 'о Гуащи'), - array('Карач', 'Карачи', 'Карачи', 'Карач', 'Карачью', 'о Карачи'), - array('Мария', 'Марии', 'Марии', 'Марию', 'Марией', 'о Марии'), - array('Дарья', 'Дарьи', 'Дарье', 'Дарью', 'Дарьей', 'о Дарье') + array('Анна', 'Анны', 'Анне', 'Анну', 'Анной', 'Анне'), + array('Эра', 'Эры', 'Эре', 'Эру', 'Эрой', 'Эре'), + array('Асма', 'Асмы', 'Асме', 'Асму', 'Асмой', 'Асме'), + array('Хафиза', 'Хафизы', 'Хафизе', 'Хафизу', 'Хафизой', 'Хафизе'), + array('Ольга', 'Ольги', 'Ольге', 'Ольгу', 'Ольгой', 'Ольге'), + array('Моника', 'Моники', 'Монике', 'Монику', 'Моникой', 'Монике'), + array('Голиндуха', 'Голиндухи', 'Голиндухе', 'Голиндуху', 'Голиндухой', 'Голиндухе'), + array('Снежа', 'Снежи', 'Снеже', 'Снежу', 'Снежой', 'Снеже'), + array('Гайша', 'Гайши', 'Гайше', 'Гайшу', 'Гайшой', 'Гайше'), + array('Милица', 'Милицы', 'Милице', 'Милицу', 'Милицей', 'Милице'), + array('Ляуца', 'Ляуцы', 'Ляуце', 'Ляуцу', 'Ляуцей', 'Ляуце'), + array('Куаца', 'Куацы', 'Куаце', 'Куацу', 'Куацей', 'Куаце'), + array('Олеся', 'Олеси', 'Олесе', 'Олесю', 'Олесей', 'Олесе'), + array('Дарья', 'Дарьи', 'Дарье', 'Дарью', 'Дарьей', 'Дарье'), + array('Майя', 'Майи', 'Майе', 'Майю', 'Майей', 'Майе'), + array('Моя', 'Мои', 'Мое', 'Мою', 'Моей', 'Мое'), + array('Пелагея', 'Пелагеи', 'Пелагее', 'Пелагею', 'Пелагеей', 'Пелагее'), + array('Марция', 'Марции', 'Марции', 'Марцию', 'Марцией', 'Марции'), + array('Наталия', 'Наталии', 'Наталии', 'Наталию', 'Наталией', 'Наталии'), + array('Армения', 'Армении', 'Армении', 'Армению', 'Арменией', 'Армении'), + array('Лия', 'Лии', 'Лии', 'Лию', 'Лией', 'Лии'), + array('Ия', 'Ии', 'Ии', 'Ию', 'Ией', 'Ии'), + array('Любовь', 'Любови', 'Любови', 'Любовь', 'Любовью', 'Любови'), + array('Эсфирь', 'Эсфири', 'Эсфири', 'Эсфирь', 'Эсфирью', 'Эсфири'), + array('Нинель', 'Нинели', 'Нинели', 'Нинель', 'Нинелью', 'Нинели'), + array('Айгюль', 'Айгюли', 'Айгюли', 'Айгюль', 'Айгюлью', 'Айгюли'), + array('Вартануш', 'Вартануши', 'Вартануши', 'Вартануш', 'Вартанушью', 'Вартануши'), + array('Катиш', 'Катиши', 'Катиши', 'Катиш', 'Катишью', 'Катиши'), + array('Хуж', 'Хужи', 'Хужи', 'Хуж', 'Хужью', 'Хужи'), + array('Гуащ', 'Гуащи', 'Гуащи', 'Гуащ', 'Гуащью', 'Гуащи'), + array('Карач', 'Карачи', 'Карачи', 'Карач', 'Карачью', 'Карачи'), + array('Мария', 'Марии', 'Марии', 'Марию', 'Марией', 'Марии'), + array('Дарья', 'Дарьи', 'Дарье', 'Дарью', 'Дарьей', 'Дарье') ); } diff --git a/tests/Russian/FunctionsTest.php b/tests/Russian/FunctionsTest.php index a844378..e31e445 100644 --- a/tests/Russian/FunctionsTest.php +++ b/tests/Russian/FunctionsTest.php @@ -29,15 +29,15 @@ public function namesProvider() { return [ - ['Янаев Осип Андреевич', Gender::MALE, 'Янаева Осипа Андреевича', 'Янаеву Осипу Андреевичу', 'Янаева Осипа Андреевича', 'Янаевым Осипом Андреевичем', 'о Янаеве Осипе Андреевиче'], - ['Молодыха Лариса Трофимовна', Gender::FEMALE, 'Молодыхи Ларисы Трофимовны', 'Молодыхе Ларисе Трофимовне', 'Молодыху Ларису Трофимовну', 'Молодыхой Ларисой Трофимовной', 'о Молодыхе Ларисе Трофимовне'], - ['Вергун Илья Захарович', Gender::MALE, 'Вергуна Ильи Захаровича', 'Вергуну Илье Захаровичу', 'Вергуна Илью Захаровича', 'Вергуном Ильей Захаровичем', 'о Вергуне Илье Захаровиче'], - ['Горюнова Таисия Романовна', Gender::FEMALE, 'Горюновой Таисии Романовны', 'Горюновой Таисии Романовне', 'Горюнову Таисию Романовну', 'Горюновой Таисией Романовной', 'о Горюновой Таисии Романовне'], - ['Путинцева Антонина Карповна', Gender::FEMALE, 'Путинцевой Антонины Карповны', 'Путинцевой Антонине Карповне', 'Путинцеву Антонину Карповну', 'Путинцевой Антониной Карповной', 'о Путинцевой Антонине Карповне'], + ['Янаев Осип Андреевич', Gender::MALE, 'Янаева Осипа Андреевича', 'Янаеву Осипу Андреевичу', 'Янаева Осипа Андреевича', 'Янаевым Осипом Андреевичем', 'Янаеве Осипе Андреевиче'], + ['Молодыха Лариса Трофимовна', Gender::FEMALE, 'Молодыхи Ларисы Трофимовны', 'Молодыхе Ларисе Трофимовне', 'Молодыху Ларису Трофимовну', 'Молодыхой Ларисой Трофимовной', 'Молодыхе Ларисе Трофимовне'], + ['Вергун Илья Захарович', Gender::MALE, 'Вергуна Ильи Захаровича', 'Вергуну Илье Захаровичу', 'Вергуна Илью Захаровича', 'Вергуном Ильей Захаровичем', 'Вергуне Илье Захаровиче'], + ['Горюнова Таисия Романовна', Gender::FEMALE, 'Горюновой Таисии Романовны', 'Горюновой Таисии Романовне', 'Горюнову Таисию Романовну', 'Горюновой Таисией Романовной', 'Горюновой Таисии Романовне'], + ['Путинцева Антонина Карповна', Gender::FEMALE, 'Путинцевой Антонины Карповны', 'Путинцевой Антонине Карповне', 'Путинцеву Антонину Карповну', 'Путинцевой Антониной Карповной', 'Путинцевой Антонине Карповне'], // foreign names - ['Андерсен Ганс Христиан', Gender::MALE, 'Андерсена Ганса Христиана', 'Андерсену Гансу Христиану', 'Андерсена Ганса Христиана', 'Андерсеном Гансом Христианом', 'об Андерсене Гансе Христиане'], - ['Милн Алан Александр', Gender::MALE, 'Милна Алана Александра', 'Милну Алану Александру', 'Милна Алана Александра', 'Милном Аланом Александром', 'о Милне Алане Александре'], + ['Андерсен Ганс Христиан', Gender::MALE, 'Андерсена Ганса Христиана', 'Андерсену Гансу Христиану', 'Андерсена Ганса Христиана', 'Андерсеном Гансом Христианом', 'Андерсене Гансе Христиане'], + ['Милн Алан Александр', Gender::MALE, 'Милна Алана Александра', 'Милну Алану Александру', 'Милна Алана Александра', 'Милном Аланом Александром', 'Милне Алане Александре'], ]; } diff --git a/tests/Russian/GeographicalNamesInflectionTest.php b/tests/Russian/GeographicalNamesInflectionTest.php index 1109344..3812ea7 100644 --- a/tests/Russian/GeographicalNamesInflectionTest.php +++ b/tests/Russian/GeographicalNamesInflectionTest.php @@ -26,32 +26,41 @@ public function testInflection($word, $case2, $case3, $case4, $case5, $case6) public function wordsProvider() { return array( - ['Москва', 'Москвы', 'Москве', 'Москву', 'Москвой', 'о Москве'], - ['Киев', 'Киева', 'Киеву', 'Киев', 'Киевом', 'о Киеве'], - ['Ишимбай', 'Ишимбая', 'Ишимбаю', 'Ишимбай', 'Ишимбаем', 'об Ишимбае'], - ['Африка', 'Африки', 'Африке', 'Африку', 'Африкой', 'об Африке'], - ['Уругвай', 'Уругвая', 'Уругваю', 'Уругвай', 'Уругваем', 'об Уругвае'], - ['Европа', 'Европы', 'Европе', 'Европу', 'Европой', 'о Европе'], - ['Азия', 'Азии', 'Азии', 'Азию', 'Азией', 'об Азии'], - ['Рига', 'Риги', 'Риге', 'Ригу', 'Ригой', 'о Риге'], - ['Волга', 'Волги', 'Волге', 'Волгу', 'Волгой', 'о Волге'], - ['Ставрополь', 'Ставрополя', 'Ставрополю', 'Ставрополь', 'Ставрополем', 'о Ставрополе'], - ['Тверь', 'Твери', 'Твери', 'Тверь', 'Тверью', 'о Твери'], - ['Ессентуки', 'Ессентуков', 'Ессентукам', 'Ессентуки', 'Ессентуками', 'о Ессентуках'], - ['Пермь', 'Перми', 'Перми', 'Пермь', 'Пермью', 'о Перми'], - ['Рязань', 'Рязани', 'Рязани', 'Рязань', 'Рязанью', 'о Рязани'], - ['Осташков', 'Осташкова', 'Осташкову', 'Осташков', 'Осташковым', 'об Осташкове'], - ['Грозный', 'Грозного', 'Грозному', 'Грозный', 'Грозным', 'о Грозном'], - ['Благодарный', 'Благодарного', 'Благодарному', 'Благодарный', 'Благодарным', 'о Благодарном'], + ['Москва', 'Москвы', 'Москве', 'Москву', 'Москвой', 'Москве'], + ['Киев', 'Киева', 'Киеву', 'Киев', 'Киевом', 'Киеве'], + ['Ишимбай', 'Ишимбая', 'Ишимбаю', 'Ишимбай', 'Ишимбаем', 'Ишимбае'], + ['Африка', 'Африки', 'Африке', 'Африку', 'Африкой', 'Африке'], + ['Уругвай', 'Уругвая', 'Уругваю', 'Уругвай', 'Уругваем', 'Уругвае'], + ['Европа', 'Европы', 'Европе', 'Европу', 'Европой', 'Европе'], + ['Азия', 'Азии', 'Азии', 'Азию', 'Азией', 'Азии'], + ['Рига', 'Риги', 'Риге', 'Ригу', 'Ригой', 'Риге'], + ['Волга', 'Волги', 'Волге', 'Волгу', 'Волгой', 'Волге'], + ['Ставрополь', 'Ставрополя', 'Ставрополю', 'Ставрополь', 'Ставрополем', 'Ставрополе'], + ['Тверь', 'Твери', 'Твери', 'Тверь', 'Тверью', 'Твери'], + ['Ессентуки', 'Ессентуков', 'Ессентукам', 'Ессентуки', 'Ессентуками', 'Ессентуках'], + ['Пермь', 'Перми', 'Перми', 'Пермь', 'Пермью', 'Перми'], + ['Рязань', 'Рязани', 'Рязани', 'Рязань', 'Рязанью', 'Рязани'], + ['Осташков', 'Осташкова', 'Осташкову', 'Осташков', 'Осташковым', 'Осташкове'], + ['Грозный', 'Грозного', 'Грозному', 'Грозный', 'Грозным', 'Грозном'], + ['Благодарный', 'Благодарного', 'Благодарному', 'Благодарный', 'Благодарным', 'Благодарном'], // сложные названия - ['Санкт-Петербург', 'Санкт-Петербурга', 'Санкт-Петербургу', 'Санкт-Петербург', 'Санкт-Петербургом', 'о Санкт-Петербурге'], - ['Нижний Новгород', 'Нижнего Новгорода', 'Нижнему Новгороду', 'Нижний Новгород', 'Нижним Новгородом', 'о Нижнем Новгороде'], - ['Набережные Челны', 'Набережных Челнов', 'Набережным Челнам', 'Набережные Челны', 'Набережными Челнами', 'о Набережных Челнах'], + ['Санкт-Петербург', 'Санкт-Петербурга', 'Санкт-Петербургу', 'Санкт-Петербург', 'Санкт-Петербургом', 'Санкт-Петербурге'], + ['Нижний Новгород', 'Нижнего Новгорода', 'Нижнему Новгороду', 'Нижний Новгород', 'Нижним Новгородом', 'Нижнем Новгороде'], + ['Набережные Челны', 'Набережных Челнов', 'Набережным Челнам', 'Набережные Челны', 'Набережными Челнами', 'Набережных Челнах'], + + // N край + ['Краснодарский край', 'Краснодарского края', 'Краснодарскому краю', 'Краснодарский край', 'Краснодарским краем', 'Краснодарском крае'], + + // N область + ['Ростовская область', 'Ростовской области', 'Ростовской области', 'Ростовскую область', 'Ростовской областью', 'Ростовской области'], + + // город N + ['город Москва', 'города Москва', 'городу Москва', 'город Москва', 'городом Москва', 'городе Москва'], // неизменяемые названия - ['США', 'США', 'США', 'США', 'США', 'о США'], - ['ОАЭ', 'ОАЭ', 'ОАЭ', 'ОАЭ', 'ОАЭ', 'об ОАЭ'], + ['США', 'США', 'США', 'США', 'США', 'США'], + ['ОАЭ', 'ОАЭ', 'ОАЭ', 'ОАЭ', 'ОАЭ', 'ОАЭ'], ); } diff --git a/tests/Russian/LastNamesInflectionTest.php b/tests/Russian/LastNamesInflectionTest.php index a6de898..0294d41 100644 --- a/tests/Russian/LastNamesInflectionTest.php +++ b/tests/Russian/LastNamesInflectionTest.php @@ -47,30 +47,30 @@ public function testDetectGender($name, $gender) public function lastNamesProvider() { return [ - ['Смирнов', NamesInflection::MALE, 'Смирнова', 'Смирнову', 'Смирнова', 'Смирновым', 'о Смирнове'], - ['Кромской', NamesInflection::MALE, 'Кромского', 'Кромскому', 'Кромского', 'Кромским', 'о Кромском'], - ['Ус', NamesInflection::MALE, 'Уса', 'Усу', 'Уса', 'Усом', 'об Усе'], - ['Кузьмич', NamesInflection::MALE, 'Кузьмича', 'Кузьмичу', 'Кузьмича', 'Кузьмичом', 'о Кузьмиче'], - ['Берг', NamesInflection::MALE, 'Берга', 'Бергу', 'Берга', 'Бергом', 'о Берге'], - ['Медведь', NamesInflection::MALE, 'Медведя', 'Медведю', 'Медведя', 'Медведем', 'о Медведе'], - ['Суздаль', NamesInflection::MALE, 'Суздаля', 'Суздалю', 'Суздаля', 'Суздалем', 'о Суздале'], - ['Тронь', NamesInflection::MALE, 'Троня', 'Троню', 'Троня', 'Тронем', 'о Троне'], - ['Толстой', NamesInflection::MALE, 'Толстого', 'Толстому', 'Толстого', 'Толстым', 'о Толстом'], - ['Стальной', NamesInflection::MALE, 'Стального', 'Стальному', 'Стального', 'Стальным', 'о Стальном'], - ['Жареный', NamesInflection::MALE, 'Жареного', 'Жареному', 'Жареного', 'Жареным', 'о Жареном'], + ['Смирнов', NamesInflection::MALE, 'Смирнова', 'Смирнову', 'Смирнова', 'Смирновым', 'Смирнове'], + ['Кромской', NamesInflection::MALE, 'Кромского', 'Кромскому', 'Кромского', 'Кромским', 'Кромском'], + ['Ус', NamesInflection::MALE, 'Уса', 'Усу', 'Уса', 'Усом', 'Усе'], + ['Кузьмич', NamesInflection::MALE, 'Кузьмича', 'Кузьмичу', 'Кузьмича', 'Кузьмичом', 'Кузьмиче'], + ['Берг', NamesInflection::MALE, 'Берга', 'Бергу', 'Берга', 'Бергом', 'Берге'], + ['Медведь', NamesInflection::MALE, 'Медведя', 'Медведю', 'Медведя', 'Медведем', 'Медведе'], + ['Суздаль', NamesInflection::MALE, 'Суздаля', 'Суздалю', 'Суздаля', 'Суздалем', 'Суздале'], + ['Тронь', NamesInflection::MALE, 'Троня', 'Троню', 'Троня', 'Тронем', 'Троне'], + ['Толстой', NamesInflection::MALE, 'Толстого', 'Толстому', 'Толстого', 'Толстым', 'Толстом'], + ['Стальной', NamesInflection::MALE, 'Стального', 'Стальному', 'Стального', 'Стальным', 'Стальном'], + ['Жареный', NamesInflection::MALE, 'Жареного', 'Жареному', 'Жареного', 'Жареным', 'Жареном'], - ['Смирнова', NamesInflection::FEMALE, 'Смирновой', 'Смирновой', 'Смирнову', 'Смирновой', 'о Смирновой'], - ['Кромская', NamesInflection::FEMALE, 'Кромской', 'Кромской', 'Кромскую', 'Кромской', 'о Кромской'], - ['Закипная', NamesInflection::FEMALE, 'Закипной', 'Закипной', 'Закипную', 'Закипной', 'о Закипной'], - ['Зима', NamesInflection::FEMALE, 'Зимы', 'Зиме', 'Зиму', 'Зимой', 'о Зиме'], - ['Зоя', NamesInflection::FEMALE, 'Зои', 'Зое', 'Зою', 'Зоей', 'о Зое'], - ['Молодыха', NamesInflection::FEMALE, 'Молодыхи', 'Молодыхе', 'Молодыху', 'Молодыхой', 'о Молодыхе'], - ['Стальная', NamesInflection::FEMALE, 'Стальной', 'Стальной', 'Стальную', 'Стальной', 'о Стальной'], + ['Смирнова', NamesInflection::FEMALE, 'Смирновой', 'Смирновой', 'Смирнову', 'Смирновой', 'Смирновой'], + ['Кромская', NamesInflection::FEMALE, 'Кромской', 'Кромской', 'Кромскую', 'Кромской', 'Кромской'], + ['Закипная', NamesInflection::FEMALE, 'Закипной', 'Закипной', 'Закипную', 'Закипной', 'Закипной'], + ['Зима', NamesInflection::FEMALE, 'Зимы', 'Зиме', 'Зиму', 'Зимой', 'Зиме'], + ['Зоя', NamesInflection::FEMALE, 'Зои', 'Зое', 'Зою', 'Зоей', 'Зое'], + ['Молодыха', NamesInflection::FEMALE, 'Молодыхи', 'Молодыхе', 'Молодыху', 'Молодыхой', 'Молодыхе'], + ['Стальная', NamesInflection::FEMALE, 'Стальной', 'Стальной', 'Стальную', 'Стальной', 'Стальной'], // foreign names - ['Мартен-Люган', NamesInflection::MALE, 'Мартена-Люгана', 'Мартену-Люгану', 'Мартена-Люгана', 'Мартеном-Люганом', 'о Мартене-Люгане'], - ['Копусов-Долинин', NamesInflection::MALE, 'Копусова-Долинина', 'Копусову-Долинину', 'Копусова-Долинина', 'Копусовым-Долининым', 'о Копусове-Долинине'], - ['Кучера-Бози', NamesInflection::MALE, 'Кучеры-Бози', 'Кучере-Бози', 'Кучеру-Бози', 'Кучерой-Бози', 'о Кучере-Бози'], + ['Мартен-Люган', NamesInflection::MALE, 'Мартена-Люгана', 'Мартену-Люгану', 'Мартена-Люгана', 'Мартеном-Люганом', 'Мартене-Люгане'], + ['Копусов-Долинин', NamesInflection::MALE, 'Копусова-Долинина', 'Копусову-Долинину', 'Копусова-Долинина', 'Копусовым-Долининым', 'Копусове-Долинине'], + ['Кучера-Бози', NamesInflection::MALE, 'Кучеры-Бози', 'Кучере-Бози', 'Кучеру-Бози', 'Кучерой-Бози', 'Кучере-Бози'], ]; } diff --git a/tests/Russian/MiddleNamesInflectionTest.php b/tests/Russian/MiddleNamesInflectionTest.php index bb41b91..37b221d 100644 --- a/tests/Russian/MiddleNamesInflectionTest.php +++ b/tests/Russian/MiddleNamesInflectionTest.php @@ -36,10 +36,10 @@ public function testDetectGender($name, $gender) public function middleNamesProvider() { return array( - array('Владимирович', NamesInflection::MALE, 'Владимировича', 'Владимировичу', 'Владимировича', 'Владимировичем', 'о Владимировиче'), - array('Валерьянович', NamesInflection::MALE, 'Валерьяновича', 'Валерьяновичу', 'Валерьяновича', 'Валерьяновичем', 'о Валерьяновиче'), - array('Богдановна', NamesInflection::FEMALE, 'Богдановны', 'Богдановне', 'Богдановну', 'Богдановной', 'о Богдановне'), - array('Сергеевна', NamesInflection::FEMALE, 'Сергеевны', 'Сергеевне', 'Сергеевну', 'Сергеевной', 'о Сергеевне'), + array('Владимирович', NamesInflection::MALE, 'Владимировича', 'Владимировичу', 'Владимировича', 'Владимировичем', 'Владимировиче'), + array('Валерьянович', NamesInflection::MALE, 'Валерьяновича', 'Валерьяновичу', 'Валерьяновича', 'Валерьяновичем', 'Валерьяновиче'), + array('Богдановна', NamesInflection::FEMALE, 'Богдановны', 'Богдановне', 'Богдановну', 'Богдановной', 'Богдановне'), + array('Сергеевна', NamesInflection::FEMALE, 'Сергеевны', 'Сергеевне', 'Сергеевну', 'Сергеевной', 'Сергеевне'), ); } diff --git a/tests/Russian/NounDeclensionTest.php b/tests/Russian/NounDeclensionTest.php index c435828..3c81d58 100644 --- a/tests/Russian/NounDeclensionTest.php +++ b/tests/Russian/NounDeclensionTest.php @@ -35,61 +35,61 @@ public function wordsProvider() // 2 - Мужской рода с нулевым или окончанием [о, е], // 2 - Среднего рода с окончанием [о, е]. // 3 - Женский род на мягкий и щипящий согласный. - array('молния', false, 1, array('молния', 'молнии', 'молние', 'молнию', 'молнией', 'о молние')), - array('папа', true, 1, array('папа', 'папы', 'папе', 'папу', 'папой', 'о папе')), - array('слава', false, 1, array('слава', 'славы', 'славе', 'славу', 'славой', 'о славе')), - array('пустыня', false, 1, array('пустыня', 'пустыни', 'пустыне', 'пустыню', 'пустыней', 'о пустыне')), - array('вилка', false, 1, array('вилка', 'вилки', 'вилке', 'вилку', 'вилкой', 'о вилке')), - array('тысяча', false, 1, array('тысяча', 'тысячи', 'тысяче', 'тысячу', 'тысячей', 'о тысяче')), - array('копейка', false, 1, array('копейка', 'копейки', 'копейке', 'копейку', 'копейкой', 'о копейке')), - array('батарейка', false, 1, array('батарейка', 'батарейки', 'батарейке', 'батарейку', 'батарейкой', 'о батарейке')), - array('гривна', false, 1, array('гривна', 'гривны', 'гривне', 'гривну', 'гривной', 'о гривне')), + array('молния', false, 1, array('молния', 'молнии', 'молние', 'молнию', 'молнией', 'молние')), + array('папа', true, 1, array('папа', 'папы', 'папе', 'папу', 'папой', 'папе')), + array('слава', false, 1, array('слава', 'славы', 'славе', 'славу', 'славой', 'славе')), + array('пустыня', false, 1, array('пустыня', 'пустыни', 'пустыне', 'пустыню', 'пустыней', 'пустыне')), + array('вилка', false, 1, array('вилка', 'вилки', 'вилке', 'вилку', 'вилкой', 'вилке')), + array('тысяча', false, 1, array('тысяча', 'тысячи', 'тысяче', 'тысячу', 'тысячей', 'тысяче')), + array('копейка', false, 1, array('копейка', 'копейки', 'копейке', 'копейку', 'копейкой', 'копейке')), + array('батарейка', false, 1, array('батарейка', 'батарейки', 'батарейке', 'батарейку', 'батарейкой', 'батарейке')), + array('гривна', false, 1, array('гривна', 'гривны', 'гривне', 'гривну', 'гривной', 'гривне')), - array('дом', false, 2, array('дом', 'дома', 'дому', 'дом', 'домом', 'о доме')), - array('поле', false, 2, array('поле', 'поля', 'полю', 'поле', 'полем', 'о поле')), - array('кирпич', false, 2, array('кирпич', 'кирпича', 'кирпичу', 'кирпич', 'кирпичем', 'о кирпиче')), - array('гений', true, 2, array('гений', 'гения', 'гению', 'гения', 'гением', 'о гении')), - array('ястреб', true, 2, array('ястреб', 'ястреба', 'ястребу', 'ястреба', 'ястребом', 'о ястребе')), - array('склон', false, 2, array('склон', 'склона', 'склону', 'склон', 'склоном', 'о склоне')), - array('сообщение', false, 2, array('сообщение', 'сообщения', 'сообщению', 'сообщение', 'сообщением', 'о сообщении')), - array('общение', false, 2, array('общение', 'общения', 'общению', 'общение', 'общением', 'об общении')), - array('воскрешение', false, 2, array('воскрешение', 'воскрешения', 'воскрешению', 'воскрешение', 'воскрешением', 'о воскрешении')), - array('доллар', false, 2, array('доллар', 'доллара', 'доллару', 'доллар', 'долларом', 'о долларе')), - array('евро', false, 2, array('евро', 'евро', 'евро', 'евро', 'евро', 'о евро')), - array('фунт', false, 2, array('фунт', 'фунта', 'фунту', 'фунт', 'фунтом', 'о фунте')), - array('человек', true, 2, array('человек', 'человека', 'человеку', 'человека', 'человеком', 'о человеке')), - array('год', false, 2, array('год', 'года', 'году', 'год', 'годом', 'о годе')), - array('месяц', false, 2, array('месяц', 'месяца', 'месяцу', 'месяц', 'месяцем', 'о месяце')), - array('бремя', false, 2, array('бремя', 'бремени', 'бремени', 'бремя', 'бременем', 'о бремени')), - array('дитя', false, 2, array('дитя', 'дитяти', 'дитяти', 'дитя', 'дитятей', 'о дитяти')), - array('путь', false, 2, array('путь', 'пути', 'пути', 'путь', 'путем', 'о пути')), + array('дом', false, 2, array('дом', 'дома', 'дому', 'дом', 'домом', 'доме')), + array('поле', false, 2, array('поле', 'поля', 'полю', 'поле', 'полем', 'поле')), + array('кирпич', false, 2, array('кирпич', 'кирпича', 'кирпичу', 'кирпич', 'кирпичем', 'кирпиче')), + array('гений', true, 2, array('гений', 'гения', 'гению', 'гения', 'гением', 'гении')), + array('ястреб', true, 2, array('ястреб', 'ястреба', 'ястребу', 'ястреба', 'ястребом', 'ястребе')), + array('склон', false, 2, array('склон', 'склона', 'склону', 'склон', 'склоном', 'склоне')), + array('сообщение', false, 2, array('сообщение', 'сообщения', 'сообщению', 'сообщение', 'сообщением', 'сообщении')), + array('общение', false, 2, array('общение', 'общения', 'общению', 'общение', 'общением', 'общении')), + array('воскрешение', false, 2, array('воскрешение', 'воскрешения', 'воскрешению', 'воскрешение', 'воскрешением', 'воскрешении')), + array('доллар', false, 2, array('доллар', 'доллара', 'доллару', 'доллар', 'долларом', 'долларе')), + array('евро', false, 2, array('евро', 'евро', 'евро', 'евро', 'евро', 'евро')), + array('фунт', false, 2, array('фунт', 'фунта', 'фунту', 'фунт', 'фунтом', 'фунте')), + array('человек', true, 2, array('человек', 'человека', 'человеку', 'человека', 'человеком', 'человеке')), + array('год', false, 2, array('год', 'года', 'году', 'год', 'годом', 'годе')), + array('месяц', false, 2, array('месяц', 'месяца', 'месяцу', 'месяц', 'месяцем', 'месяце')), + array('бремя', false, 2, array('бремя', 'бремени', 'бремени', 'бремя', 'бременем', 'бремени')), + array('дитя', false, 2, array('дитя', 'дитяти', 'дитяти', 'дитя', 'дитятей', 'дитяти')), + array('путь', false, 2, array('путь', 'пути', 'пути', 'путь', 'путем', 'пути')), // сущ мужского рода с мягким окончанием - array('гвоздь', false, 2, array('гвоздь', 'гвоздя', 'гвоздю', 'гвоздь', 'гвоздем', 'о гвозде')), - array('день', false, 2, array('день', 'дня', 'дню', 'день', 'днем', 'о дне')), - array('камень', false, 2, array('камень', 'камня', 'камню', 'камень', 'камнем', 'о камне')), - array('рубль', false, 2, array('рубль', 'рубля', 'рублю', 'рубль', 'рублем', 'о рубле')), + array('гвоздь', false, 2, array('гвоздь', 'гвоздя', 'гвоздю', 'гвоздь', 'гвоздем', 'гвозде')), + array('день', false, 2, array('день', 'дня', 'дню', 'день', 'днем', 'дне')), + array('камень', false, 2, array('камень', 'камня', 'камню', 'камень', 'камнем', 'камне')), + array('рубль', false, 2, array('рубль', 'рубля', 'рублю', 'рубль', 'рублем', 'рубле')), // увеличительная форма - array('волчище', true, 2, array('волчище', 'волчища', 'волчищу', 'волчище', 'волчищем', 'о волчище')), - array('полотнище', false, 2, array('полотнище', 'полотнища', 'полотнищу', 'полотнище', 'полотнищем', 'о полотнище')), + array('волчище', true, 2, array('волчище', 'волчища', 'волчищу', 'волчище', 'волчищем', 'волчище')), + array('полотнище', false, 2, array('полотнище', 'полотнища', 'полотнищу', 'полотнище', 'полотнищем', 'полотнище')), // уменьшительная форма - array('волчок', false, 2, array('волчок', 'волчка', 'волчку', 'волчок', 'волчком', 'о волчке')), - array('котёнок', true, 2, array('котёнок', 'котёнка', 'котёнку', 'котёнка', 'котёнком', 'о котёнке')), - array('станок', false, 2, array('станок', 'станка', 'станку', 'станок', 'станком', 'о станке')), + array('волчок', false, 2, array('волчок', 'волчка', 'волчку', 'волчок', 'волчком', 'волчке')), + array('котёнок', true, 2, array('котёнок', 'котёнка', 'котёнку', 'котёнка', 'котёнком', 'котёнке')), + array('станок', false, 2, array('станок', 'станка', 'станку', 'станок', 'станком', 'станке')), // Адъективное склонение (от прилагательных и причастий) // мужской род - array('выходной', false, null, array('выходной', 'выходного', 'выходному', 'выходной', 'выходным', 'о выходном')), - array('двугривенный', false, null, array('двугривенный', 'двугривенного', 'двугривенному', 'двугривенный', 'двугривенным', 'о двугривенном')), - array('рабочий', false, null, array('рабочий', 'рабочего', 'рабочему', 'рабочего', 'рабочим', 'о рабочем')), + array('выходной', false, null, array('выходной', 'выходного', 'выходному', 'выходной', 'выходным', 'выходном')), + array('двугривенный', false, null, array('двугривенный', 'двугривенного', 'двугривенному', 'двугривенный', 'двугривенным', 'двугривенном')), + array('рабочий', false, null, array('рабочий', 'рабочего', 'рабочему', 'рабочего', 'рабочим', 'рабочем')), // средний род - array('животное', true, null, array('животное', 'животного', 'животному', 'животное', 'животным', 'о животном')), - array('подлежащее', false, null, array('подлежащее', 'подлежащего', 'подлежащему', 'подлежащее', 'подлежащим', 'о подлежащем')), + array('животное', true, null, array('животное', 'животного', 'животному', 'животное', 'животным', 'животном')), + array('подлежащее', false, null, array('подлежащее', 'подлежащего', 'подлежащему', 'подлежащее', 'подлежащим', 'подлежащем')), // женский род - array('запятая', false, null, array('запятая', 'запятой', 'запятой', 'запятую', 'запятой', 'о запятой')), - array('горничная', true, null, array('горничная', 'горничной', 'горничной', 'горничную', 'горничной', 'о горничной')), - array('заведующая', true, null, array('заведующая', 'заведующей', 'заведующей', 'заведующую', 'заведующей', 'о заведующей')), + array('запятая', false, null, array('запятая', 'запятой', 'запятой', 'запятую', 'запятой', 'запятой')), + array('горничная', true, null, array('горничная', 'горничной', 'горничной', 'горничную', 'горничной', 'горничной')), + array('заведующая', true, null, array('заведующая', 'заведующей', 'заведующей', 'заведующую', 'заведующей', 'заведующей')), - array('ночь', false, 3, array('ночь', 'ночи', 'ночи', 'ночь', 'ночью', 'о ночи')), - array('новость', false, 3, array('новость', 'новости', 'новости', 'новость', 'новостью', 'о новости')), + array('ночь', false, 3, array('ночь', 'ночи', 'ночи', 'ночь', 'ночью', 'ночи')), + array('новость', false, 3, array('новость', 'новости', 'новости', 'новость', 'новостью', 'новости')), ); } diff --git a/tests/Russian/NounPluralizationTest.php b/tests/Russian/NounPluralizationTest.php index d0e5464..37747bc 100644 --- a/tests/Russian/NounPluralizationTest.php +++ b/tests/Russian/NounPluralizationTest.php @@ -63,42 +63,42 @@ public function testPluralInflection($word, $animateness, $inflected) public function pluralWordsProvider() { return array( - array('дом', false, array('дома', 'домов', 'домам', 'дома', 'домами', 'о домах')), - array('склон', false, array('склоны', 'склонов', 'склонам', 'склоны', 'склонами', 'о склонах')), - array('поле', false, array('поля', 'полей', 'полям', 'поля', 'полями', 'о полях')), - array('ночь', false, array('ночи', 'ночей', 'ночам', 'ночи', 'ночами', 'о ночах')), - array('кирпич', false, array('кирпичи', 'кирпичей', 'кирпичам', 'кирпичи', 'кирпичами', 'о кирпичах')), - array('гвоздь', false, array('гвоздя', 'гвоздей', 'гвоздям', 'гвоздя', 'гвоздями', 'о гвоздях')), - array('гений', true, array('гения', 'гениев', 'гениям', 'гениев', 'гениями', 'о гениях')), - array('молния', false, array('молния', 'молний', 'молниям', 'молния', 'молниями', 'о молниях')), - array('тысяча', false, array('тысячи', 'тысяч', 'тысячам', 'тысячи', 'тысячами', 'о тысячах')), - array('сообщение', false, array('сообщения', 'сообщений', 'сообщениям', 'сообщения', 'сообщениями', 'о сообщениях')), - array('халат', false, array('халаты', 'халатов', 'халатам', 'халаты', 'халатами', 'о халатах')), - array('прожектор', false, array('прожекторы', 'прожекторов', 'прожекторам', 'прожекторы', 'прожекторами', 'о прожекторах')), + array('дом', false, array('дома', 'домов', 'домам', 'дома', 'домами', 'домах')), + array('склон', false, array('склоны', 'склонов', 'склонам', 'склоны', 'склонами', 'склонах')), + array('поле', false, array('поля', 'полей', 'полям', 'поля', 'полями', 'полях')), + array('ночь', false, array('ночи', 'ночей', 'ночам', 'ночи', 'ночами', 'ночах')), + array('кирпич', false, array('кирпичи', 'кирпичей', 'кирпичам', 'кирпичи', 'кирпичами', 'кирпичах')), + array('гвоздь', false, array('гвоздя', 'гвоздей', 'гвоздям', 'гвоздя', 'гвоздями', 'гвоздях')), + array('гений', true, array('гения', 'гениев', 'гениям', 'гениев', 'гениями', 'гениях')), + array('молния', false, array('молния', 'молний', 'молниям', 'молния', 'молниями', 'молниях')), + array('тысяча', false, array('тысячи', 'тысяч', 'тысячам', 'тысячи', 'тысячами', 'тысячах')), + array('сообщение', false, array('сообщения', 'сообщений', 'сообщениям', 'сообщения', 'сообщениями', 'сообщениях')), + array('халат', false, array('халаты', 'халатов', 'халатам', 'халаты', 'халатами', 'халатах')), + array('прожектор', false, array('прожекторы', 'прожекторов', 'прожекторам', 'прожекторы', 'прожекторами', 'прожекторах')), - array('копейка', false, array('копейки', 'копеек', 'копейкам', 'копейки', 'копейками', 'о копейках')), - array('батарейка', false, array('батарейки', 'батареек', 'батарейкам', 'батарейки', 'батарейками', 'о батарейках')), - array('письмо', false, array('письма', 'писем', 'письмам', 'письма', 'письмами', 'о письмах')), - array('песец', true, array('песцы', 'песцов', 'песцам', 'песцов', 'песцами', 'о песцах')), - array('пятно', false, array('пятна', 'пятен', 'пятнам', 'пятна', 'пятнами', 'о пятнах')), - array('волчище', false, array('волчища', 'волчищ', 'волчищам', 'волчища', 'волчищами', 'о волчищах')), - array('год', false, array('года', 'годов', 'годам', 'года', 'годами', 'о годах')), - array('месяц', false, array('месяцы', 'месяцев', 'месяцам', 'месяцы', 'месяцами', 'о месяцах')), - array('новость', false, array('новости', 'новостей', 'новостям', 'новости', 'новостями', 'о новостях')), - array('тень', false, array('тени', 'теней', 'теням', 'тени', 'тенями', 'о тенях')), + array('копейка', false, array('копейки', 'копеек', 'копейкам', 'копейки', 'копейками', 'копейках')), + array('батарейка', false, array('батарейки', 'батареек', 'батарейкам', 'батарейки', 'батарейками', 'батарейках')), + array('письмо', false, array('письма', 'писем', 'письмам', 'письма', 'письмами', 'письмах')), + array('песец', true, array('песцы', 'песцов', 'песцам', 'песцов', 'песцами', 'песцах')), + array('пятно', false, array('пятна', 'пятен', 'пятнам', 'пятна', 'пятнами', 'пятнах')), + array('волчище', false, array('волчища', 'волчищ', 'волчищам', 'волчища', 'волчищами', 'волчищах')), + array('год', false, array('года', 'годов', 'годам', 'года', 'годами', 'годах')), + array('месяц', false, array('месяцы', 'месяцев', 'месяцам', 'месяцы', 'месяцами', 'месяцах')), + array('новость', false, array('новости', 'новостей', 'новостям', 'новости', 'новостями', 'новостях')), + array('тень', false, array('тени', 'теней', 'теням', 'тени', 'тенями', 'тенях')), // Адъективное склонение // мужской род - array('выходной', false, array('выходные', 'выходных', 'выходным', 'выходные', 'выходными', 'о выходных')), - array('двугривенный', false, array('двугривенные', 'двугривенных', 'двугривенным', 'двугривенные', 'двугривенными', 'о двугривенных')), - array('рабочий', true, array('рабочие', 'рабочих', 'рабочим', 'рабочих', 'рабочими', 'о рабочих')), + array('выходной', false, array('выходные', 'выходных', 'выходным', 'выходные', 'выходными', 'выходных')), + array('двугривенный', false, array('двугривенные', 'двугривенных', 'двугривенным', 'двугривенные', 'двугривенными', 'двугривенных')), + array('рабочий', true, array('рабочие', 'рабочих', 'рабочим', 'рабочих', 'рабочими', 'рабочих')), // средний род - array('животное', true, array('животные', 'животных', 'животным', 'животных', 'животными', 'о животных')), - array('подлежащее', false, array('подлежащие', 'подлежащих', 'подлежащим', 'подлежащие', 'подлежащими', 'о подлежащих')), + array('животное', true, array('животные', 'животных', 'животным', 'животных', 'животными', 'животных')), + array('подлежащее', false, array('подлежащие', 'подлежащих', 'подлежащим', 'подлежащие', 'подлежащими', 'подлежащих')), // женский род - array('запятая', false, array('запятые', 'запятых', 'запятым', 'запятые', 'запятыми', 'о запятых')), - array('горничная', true, array('горничные', 'горничных', 'горничным', 'горничных', 'горничными', 'о горничных')), - array('заведующая', true, array('заведующие', 'заведующих', 'заведующим', 'заведующих', 'заведующими', 'о заведующих')), + array('запятая', false, array('запятые', 'запятых', 'запятым', 'запятые', 'запятыми', 'запятых')), + array('горничная', true, array('горничные', 'горничных', 'горничным', 'горничных', 'горничными', 'горничных')), + array('заведующая', true, array('заведующие', 'заведующих', 'заведующим', 'заведующих', 'заведующими', 'заведующих')), ); } } diff --git a/tests/Russian/OrdinalNumeralTest.php b/tests/Russian/OrdinalNumeralTest.php index 8176020..8f13924 100644 --- a/tests/Russian/OrdinalNumeralTest.php +++ b/tests/Russian/OrdinalNumeralTest.php @@ -27,30 +27,30 @@ public function testGetCases($number, $gender, $case, $case2, $case3, $case4, $c public function numbersProvider() { return array( - array(1, NumeralGenerator::MALE, 'первый', 'первого', 'первому', 'первый', 'первым', 'о первом'), - array(1, NumeralGenerator::FEMALE, 'первая', 'первой', 'первой', 'первую', 'первой', 'о первой'), - array(3, NumeralGenerator::MALE, 'третий', 'третьего', 'третьему', 'третьего', 'третьим', 'о третьем'), - array(13, NumeralGenerator::MALE, 'тринадцатый', 'тринадцатого', 'тринадцатому', 'тринадцатый', 'тринадцатым', 'о тринадцатом'), - array(20, NumeralGenerator::NEUTER, 'двадцатое', 'двадцатого', 'двадцатому', 'двадцатое', 'двадцатым', 'о двадцатом'), - array(113, NumeralGenerator::MALE, 'сто тринадцатый', 'сто тринадцатого', 'сто тринадцатому', 'сто тринадцатый', 'сто тринадцатым', 'о сто тринадцатом'), - array(201, NumeralGenerator::MALE, 'двести первый', 'двести первого', 'двести первому', 'двести первый', 'двести первым', 'о двести первом'), - array(344, NumeralGenerator::MALE, 'триста сорок четвертый', 'триста сорок четвертого', 'триста сорок четвертому', 'триста сорок четвертый', 'триста сорок четвертым', 'о триста сорок четвертом'), - array(1007, NumeralGenerator::MALE, 'тысяча седьмой', 'тысяча седьмого', 'тысяча седьмому', 'тысяча седьмой', 'тысяча седьмым', 'о тысяча седьмом'), - array(1013, NumeralGenerator::MALE, 'тысяча тринадцатый', 'тысяча тринадцатого', 'тысяча тринадцатому', 'тысяча тринадцатый', 'тысяча тринадцатым', 'о тысяча тринадцатом'), - array(3651, NumeralGenerator::MALE, 'три тысячи шестьсот пятьдесят первый', 'три тысячи шестьсот пятьдесят первого', 'три тысячи шестьсот пятьдесят первому', 'три тысячи шестьсот пятьдесят первый', 'три тысячи шестьсот пятьдесят первым', 'о три тысячи шестьсот пятьдесят первом'), - array(9999, NumeralGenerator::MALE, 'девять тысяч девятьсот девяносто девятый', 'девять тысяч девятьсот девяносто девятого', 'девять тысяч девятьсот девяносто девятому', 'девять тысяч девятьсот девяносто девятый', 'девять тысяч девятьсот девяносто девятым', 'о девять тысяч девятьсот девяносто девятом'), - array(27013, NumeralGenerator::MALE, 'двадцать семь тысяч тринадцатый', 'двадцать семь тысяч тринадцатого', 'двадцать семь тысяч тринадцатому', 'двадцать семь тысяч тринадцатый', 'двадцать семь тысяч тринадцатым', 'о двадцать семь тысяч тринадцатом'), + array(1, NumeralGenerator::MALE, 'первый', 'первого', 'первому', 'первый', 'первым', 'первом'), + array(1, NumeralGenerator::FEMALE, 'первая', 'первой', 'первой', 'первую', 'первой', 'первой'), + array(3, NumeralGenerator::MALE, 'третий', 'третьего', 'третьему', 'третьего', 'третьим', 'третьем'), + array(13, NumeralGenerator::MALE, 'тринадцатый', 'тринадцатого', 'тринадцатому', 'тринадцатый', 'тринадцатым', 'тринадцатом'), + array(20, NumeralGenerator::NEUTER, 'двадцатое', 'двадцатого', 'двадцатому', 'двадцатое', 'двадцатым', 'двадцатом'), + array(113, NumeralGenerator::MALE, 'сто тринадцатый', 'сто тринадцатого', 'сто тринадцатому', 'сто тринадцатый', 'сто тринадцатым', 'сто тринадцатом'), + array(201, NumeralGenerator::MALE, 'двести первый', 'двести первого', 'двести первому', 'двести первый', 'двести первым', 'двести первом'), + array(344, NumeralGenerator::MALE, 'триста сорок четвертый', 'триста сорок четвертого', 'триста сорок четвертому', 'триста сорок четвертый', 'триста сорок четвертым', 'триста сорок четвертом'), + array(1007, NumeralGenerator::MALE, 'тысяча седьмой', 'тысяча седьмого', 'тысяча седьмому', 'тысяча седьмой', 'тысяча седьмым', 'тысяча седьмом'), + array(1013, NumeralGenerator::MALE, 'тысяча тринадцатый', 'тысяча тринадцатого', 'тысяча тринадцатому', 'тысяча тринадцатый', 'тысяча тринадцатым', 'тысяча тринадцатом'), + array(3651, NumeralGenerator::MALE, 'три тысячи шестьсот пятьдесят первый', 'три тысячи шестьсот пятьдесят первого', 'три тысячи шестьсот пятьдесят первому', 'три тысячи шестьсот пятьдесят первый', 'три тысячи шестьсот пятьдесят первым', 'три тысячи шестьсот пятьдесят первом'), + array(9999, NumeralGenerator::MALE, 'девять тысяч девятьсот девяносто девятый', 'девять тысяч девятьсот девяносто девятого', 'девять тысяч девятьсот девяносто девятому', 'девять тысяч девятьсот девяносто девятый', 'девять тысяч девятьсот девяносто девятым', 'девять тысяч девятьсот девяносто девятом'), + array(27013, NumeralGenerator::MALE, 'двадцать семь тысяч тринадцатый', 'двадцать семь тысяч тринадцатого', 'двадцать семь тысяч тринадцатому', 'двадцать семь тысяч тринадцатый', 'двадцать семь тысяч тринадцатым', 'двадцать семь тысяч тринадцатом'), array(1234567890, NumeralGenerator::MALE, 'один миллиард двести тридцать четыре миллиона пятьсот шестьдесят семь тысяч восемьсот девяностый', 'один миллиард двести тридцать четыре миллиона пятьсот шестьдесят семь тысяч восемьсот девяностого', 'один миллиард двести тридцать четыре миллиона пятьсот шестьдесят семь тысяч восемьсот девяностому', 'один миллиард двести тридцать четыре миллиона пятьсот шестьдесят семь тысяч восемьсот девяностый', 'один миллиард двести тридцать четыре миллиона пятьсот шестьдесят семь тысяч восемьсот девяностым', - 'об один миллиард двести тридцать четыре миллиона пятьсот шестьдесят семь тысяч восемьсот девяностом', + 'один миллиард двести тридцать четыре миллиона пятьсот шестьдесят семь тысяч восемьсот девяностом', ), - array(1000, NumeralGenerator::MALE, 'тысячный', 'тысячного', 'тысячному', 'тысячный', 'тысячным', 'о тысячном'), - array(1000000000, NumeralGenerator::MALE, 'миллиардный', 'миллиардного', 'миллиардному', 'миллиардный', 'миллиардным', 'о миллиардном'), - array(1000000090, NumeralGenerator::MALE, 'миллиард девяностый', 'миллиард девяностого', 'миллиард девяностому', 'миллиард девяностый', 'миллиард девяностым', 'о миллиард девяностом'), + array(1000, NumeralGenerator::MALE, 'тысячный', 'тысячного', 'тысячному', 'тысячный', 'тысячным', 'тысячном'), + array(1000000000, NumeralGenerator::MALE, 'миллиардный', 'миллиардного', 'миллиардному', 'миллиардный', 'миллиардным', 'миллиардном'), + array(1000000090, NumeralGenerator::MALE, 'миллиард девяностый', 'миллиард девяностого', 'миллиард девяностому', 'миллиард девяностый', 'миллиард девяностым', 'миллиард девяностом'), ); }