Skip to content

Commit

Permalink
Update geo inflection. Fix #22
Browse files Browse the repository at this point in the history
  • Loading branch information
wapmorgan committed Jan 26, 2018
1 parent e996beb commit 523f8ad
Show file tree
Hide file tree
Showing 3 changed files with 34 additions and 3 deletions.
2 changes: 1 addition & 1 deletion README-ru.md
Expand Up @@ -162,7 +162,7 @@ LastNamesInflection::getCases($user_last_name) => array(6) {
- `array getCases($word)` - склоняет имя во всех падежах и возвращает результат в виде массива.

Что склоняется:
- название города с приставкой или без - `Москва`, `город Санкт-Петербург`
- название города, села с приставкой или без - `Москва`, `город Санкт-Петербург`, `село Привольное`
- название области: `Ростовская область`
- название края: `Краснодарский край`
- страны: `Россия`, `Франция`, `Украина`
Expand Down
29 changes: 27 additions & 2 deletions src/Russian/GeographicalNamesInflection.php
Expand Up @@ -26,6 +26,8 @@ class GeographicalNamesInflection extends \morphos\BaseInflection implements Cas
'осташков',
];



/**
* Проверяет, склоняемо ли название
* @param string $name Название
Expand Down Expand Up @@ -58,6 +60,11 @@ public static function isMutable($name)
return true;
}

// село N
if (S::slice($name, 0, 5) == 'село ') {
return true;
}

// ends with 'е' or 'о', but not with 'ово/ёво/ево/ино/ыно'
if (in_array(S::slice($name, -1), array('е', 'о')) && !in_array(S::slice($name, -3, -1), array('ов', 'ёв', 'ев', 'ин', 'ын'))) {
return false;
Expand Down Expand Up @@ -88,7 +95,15 @@ public static function getCases($name)
if (S::slice($name, 0, 6) == 'город ') {
return self::composeCasesFromWords([
NounDeclension::getCases('город'),
array_fill_keys(self::getAllCases(), S::name(S::slice($name, -6)))
array_fill_keys(self::getAllCases(), S::name(S::slice($name, 6)))
]);
}

// село N
if (S::slice($name, 0, 5) == 'село ') {
return self::composeCasesFromWords([
NounDeclension::getCases('село'),
array_fill_keys(self::getAllCases(), S::name(S::slice($name, 5)))
]);
}

Expand Down Expand Up @@ -222,7 +237,7 @@ public static function getCases($name)
$prefix = S::name(S::slice($name, 0, -1));
return array(
self::IMENIT => $prefix.'и',
self::RODIT => $prefix.'ов',
self::RODIT => $name == 'луки' ? $prefix : $prefix.'ов',
self::DAT => $prefix.'ам',
self::VINIT => $prefix.'и',
self::TVORIT => $prefix.'ами',
Expand Down Expand Up @@ -272,6 +287,16 @@ public static function getCases($name)
self::TVORIT => $prefix.'ами',
self::PREDLOJ => $prefix.'ах',
);
} else if ($name == 'великие') {
$prefix = 'Велики';
return array(
self::IMENIT => $prefix.'е',
self::RODIT => $prefix.'х',
self::DAT => $prefix.'м',
self::VINIT => $prefix.'е',
self::TVORIT => $prefix.'ми',
self::PREDLOJ => $prefix.'х',
);
}

$suffixes = array('ов', 'ёв', 'ев', 'ин', 'ын');
Expand Down
6 changes: 6 additions & 0 deletions tests/Russian/GeographicalNamesInflectionTest.php
Expand Up @@ -61,6 +61,12 @@ public function wordsProvider()
// город N
['город Москва', 'города Москва', 'городу Москва', 'город Москва', 'городом Москва', 'городе Москва'],

// село N
['село Привольное', 'села Привольное', 'селу Привольное', 'село Привольное', 'селом Привольное', 'селе Привольное'],

// исключения
['Великие Луки', 'Великих Лук', 'Великим Лукам', 'Великие Луки', 'Великими Луками', 'Великих Луках'],

// неизменяемые названия
['США', 'США', 'США', 'США', 'США', 'США'],
['ОАЭ', 'ОАЭ', 'ОАЭ', 'ОАЭ', 'ОАЭ', 'ОАЭ'],
Expand Down

0 comments on commit 523f8ad

Please sign in to comment.