Skip to content

Commit

Permalink
Add check for masculine words with soft sign at the end
Browse files Browse the repository at this point in the history
  • Loading branch information
wapmorgan committed Feb 2, 2017
1 parent a1b1bb7 commit a6be9c8
Show file tree
Hide file tree
Showing 2 changed files with 27 additions and 4 deletions.
24 changes: 23 additions & 1 deletion src/Russian/GeneralDeclension.php
Original file line number Diff line number Diff line change
Expand Up @@ -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('у', 'и', 'е', 'о', 'ю')))
Expand All @@ -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;
Expand Down
7 changes: 4 additions & 3 deletions tests/Russian/GeneralDeclensionTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -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('новость', 'новости', 'новости', 'новость', 'новостью', 'о новости')),
);
}

Expand Down

0 comments on commit a6be9c8

Please sign in to comment.