From a6be9c814ef2cb89923123a1d9c765802f721ba0 Mon Sep 17 00:00:00 2001 From: wapmorgan Date: Fri, 3 Feb 2017 01:01:28 +0300 Subject: [PATCH] Add check for masculine words with soft sign at the end --- src/Russian/GeneralDeclension.php | 24 +++++++++++++++++++++++- tests/Russian/GeneralDeclensionTest.php | 7 ++++--- 2 files changed, 27 insertions(+), 4 deletions(-) diff --git a/src/Russian/GeneralDeclension.php b/src/Russian/GeneralDeclension.php index e0a2503..2e94496 100644 --- a/src/Russian/GeneralDeclension.php +++ b/src/Russian/GeneralDeclension.php @@ -29,6 +29,28 @@ class GeneralDeclension extends \morphos\GeneralDeclension implements Cases { 'семя', ); + static protected $masculineWithSoft = array( + 'камень', + 'олень', + 'конь', + 'ячмень', + 'путь', + 'парень', + 'зверь', + 'шкворень', + 'пень', + 'пельмень', + 'тюлень', + 'выхухоль', + 'табель', + 'рояль', + 'шампунь', + 'конь', + 'лось', + 'гвоздь', + 'медведь', + ); + public function hasForms($word, $animateness = false) { $word = lower($word); if (in_array(slice($word, -1), array('у', 'и', 'е', 'о', 'ю'))) @@ -39,7 +61,7 @@ public function hasForms($word, $animateness = false) { static public function getDeclension($word) { $word = lower($word); $last = slice($word, -1); - if (self::isConsonant($last) || in_array($last, ['о', 'е', 'ё']) || ($last == 'ь' && self::isConsonant(slice($word, -2, -1)) && !RussianLanguage::isHissingConsonant(slice($word, -2, -1)))) { + if (self::isConsonant($last) || in_array($last, ['о', 'е', 'ё']) || ($last == 'ь' && self::isConsonant(slice($word, -2, -1)) && !RussianLanguage::isHissingConsonant(slice($word, -2, -1)) && in_array($word, self::$masculineWithSoft))) { return 1; } else if (in_array($last, ['а', 'я']) && slice($word, -2) != 'мя') { return 2; diff --git a/tests/Russian/GeneralDeclensionTest.php b/tests/Russian/GeneralDeclensionTest.php index 8d2f9d3..9ac7093 100644 --- a/tests/Russian/GeneralDeclensionTest.php +++ b/tests/Russian/GeneralDeclensionTest.php @@ -29,15 +29,16 @@ public function wordsProvider() { return array( array('дом', false, 1, array('дом', 'дома', 'дому', 'дом', 'домом', 'о доме')), array('поле', false, 1, array('поле', 'поля', 'полю', 'поле', 'полем', 'о поле')), - // array('ночь', false, 2, array('ночь', 'ночи', 'ночи', 'ночь', 'ночью', 'о ночи')), - // array('кирпич', false, 1, array('кирпич', 'кирпича', 'кирпичу', 'кирпич', 'кирпичем', 'о кирпиче')), + array('кирпич', false, 1, array('кирпич', 'кирпича', 'кирпичу', 'кирпич', 'кирпичем', 'о кирпиче')), array('гвоздь', false, 1, array('гвоздь', 'гвоздя', 'гвоздю', 'гвоздь', 'гвоздем', 'о гвозде')), array('гений', true, 1, array('гений', 'гения', 'гению', 'гения', 'гением', 'о гении')), + array('ястреб', true, 1, array('ястреб', 'ястреба', 'ястребу', 'ястреба', 'ястребом', 'о ястребе')), array('молния', false, 2, array('молния', 'молнии', 'молние', 'молнию', 'молнией', 'о молние')), array('папа', true, 2, array('папа', 'папы', 'папе', 'папу', 'папой', 'о папе')), - array('ястреб', true, 1, array('ястреб', 'ястреба', 'ястребу', 'ястреба', 'ястребом', 'о ястребе')), array('слава', false, 2, array('слава', 'славы', 'славе', 'славу', 'славой', 'о славе')), array('пустыня', false, 2, array('пустыня', 'пустыни', 'пустыне', 'пустыню', 'пустыней', 'о пустыне')), + array('ночь', false, 3, array('ночь', 'ночи', 'ночи', 'ночь', 'ночью', 'о ночи')), + array('новость', false, 3, array('новость', 'новости', 'новости', 'новость', 'новостью', 'о новости')), ); }