Skip to content

Commit

Permalink
Add immutable nouns
Browse files Browse the repository at this point in the history
  • Loading branch information
wapmorgan committed Feb 4, 2017
1 parent cc2a70a commit 2edf1d8
Show file tree
Hide file tree
Showing 3 changed files with 41 additions and 2 deletions.
17 changes: 15 additions & 2 deletions src/Russian/GeneralDeclension.php
Original file line number Diff line number Diff line change
Expand Up @@ -53,9 +53,13 @@ class GeneralDeclension extends \morphos\GeneralDeclension implements Cases {
'рубль',
);

static protected $immutableWords = array(
'евро',
);

public function hasForms($word, $animateness = false) {
$word = lower($word);
if (in_array(slice($word, -1), array('у', 'и', 'е', 'о', 'ю')))
if (in_array(slice($word, -1), array('у', 'и', 'е', 'о', 'ю')) || in_array($word, self::$immutableWords))
return false;
return true;
}
Expand All @@ -75,7 +79,16 @@ static public function getDeclension($word) {
public function getForms($word, $animateness = false) {
$word = lower($word);

if (isset($this->abnormalExceptions[$word])) {
if (in_array($word, self::$immutableWords)) {
return array(
self::IMENIT => $word,
self::RODIT => $word,
self::DAT => $word,
self::VINIT => $word,
self::TVORIT => $word,
self::PREDLOJ => $this->choosePrepositionByFirstLetter($word, 'об', 'о').' '.$word,
);
} else if (isset($this->abnormalExceptions[$word])) {
$prefix = slice($word, -1);
return array(
self::IMENIT => $word,
Expand Down
15 changes: 15 additions & 0 deletions src/Russian/Plurality.php
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,10 @@ class Plurality extends \morphos\Plurality implements Cases {
'море',
);

static protected $immutableWords = array(
'евро',
);

static public function pluralize($word, $count, $animateness = false) {
static $dec, $plu;
if ($dec === null) $dec = new GeneralDeclension();
Expand Down Expand Up @@ -52,6 +56,17 @@ public function getForms($word, $animateness = false) {
$prefix = slice($word, 0, -1);
$last = slice($word, -1);

if (in_array($word, self::$immutableWords)) {
return array(
self::IMENIT => $word,
self::RODIT => $word,
self::DAT => $word,
self::VINIT => $word,
self::TVORIT => $word,
self::PREDLOJ => $this->choosePrepositionByFirstLetter($word, 'об', 'о').' '.$word,
);
}

if (($declension = GeneralDeclension::getDeclension($word)) == GeneralDeclension::FIRST_DECLENSION) {
$soft_last = $last == 'й' || (in_array($last, ['ь', 'е', 'ё', 'ю', 'я']) && (self::isConsonant(slice($word, -2, -1)) || slice($word, -2, -1) == 'и'));
$prefix = GeneralDeclension::getPrefixOfFirstDeclension($word, $last);
Expand Down
11 changes: 11 additions & 0 deletions tests/Russian/GeneralDeclensionTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,10 @@ public function testDeclenation($word, $animateness, $declension, $declenated) {

public function wordsProvider() {
return array(
// 1 - Мужской рода с нулевым или окончанием [о, е],
// 1 - Среднего рода с окончанием [о, е].
// 2 - Женский, мужской род с окончанием [а, я].
// 3 - Женский род на мягкий и щипящий согласный.
array('дом', false, 1, array('дом', 'дома', 'дому', 'дом', 'домом', 'о доме')),
array('поле', false, 1, array('поле', 'поля', 'полю', 'поле', 'полем', 'о поле')),
array('кирпич', false, 1, array('кирпич', 'кирпича', 'кирпичу', 'кирпич', 'кирпичем', 'о кирпиче')),
Expand All @@ -38,6 +42,11 @@ public function wordsProvider() {
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('папа', true, 2, array('папа', 'папы', 'папе', 'папу', 'папой', 'о папе')),
array('слава', false, 2, array('слава', 'славы', 'славе', 'славу', 'славой', 'о славе')),
Expand All @@ -46,6 +55,8 @@ public function wordsProvider() {
array('тысяча', false, 2, array('тысяча', 'тысячи', 'тысяче', 'тысячу', 'тысячей', 'о тысяче')),
array('копейка', false, 2, array('копейка', 'копейки', 'копейке', 'копейку', 'копейкой', 'о копейке')),
array('батарейка', false, 2, array('батарейка', 'батарейки', 'батарейке', 'батарейку', 'батарейкой', 'о батарейке')),
array('гривна', false, 2, array('гривна', 'гривны', 'гривне', 'гривну', 'гривной', 'о гривне')),

array('ночь', false, 3, array('ночь', 'ночи', 'ночи', 'ночь', 'ночью', 'о ночи')),
array('новость', false, 3, array('новость', 'новости', 'новости', 'новость', 'новостью', 'о новости')),
);
Expand Down

0 comments on commit 2edf1d8

Please sign in to comment.