From 190d7e157a153069d485f6c3b84ad1a308e3a126 Mon Sep 17 00:00:00 2001 From: wapmorgan Date: Sat, 18 Nov 2017 01:11:37 +0300 Subject: [PATCH] Fix geo russian names --- src/Russian/GeographicalNamesInflection.php | 9 +++++++-- tests/Russian/GeographicalNamesInflectionTest.php | 3 ++- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/src/Russian/GeographicalNamesInflection.php b/src/Russian/GeographicalNamesInflection.php index 1c6e9c8..ab8581c 100644 --- a/src/Russian/GeographicalNamesInflection.php +++ b/src/Russian/GeographicalNamesInflection.php @@ -22,6 +22,10 @@ class GeographicalNamesInflection extends \morphos\BaseInflection implements Cas '-на-' ); + protected static $ovAbnormalExceptions = [ + 'осташков', + ]; + /** * Проверяет, склоняемо ли название * @param string $name Название @@ -88,6 +92,7 @@ public static function getCases($name) ]); } + // Сложное название через пробел или через '-на-' foreach (self::$delimiters as $delimiter) { if (strpos($name, $delimiter) !== false) { $parts = explode($delimiter, $name); @@ -100,7 +105,7 @@ public static function getCases($name) } // Сложное название города из нескольких слов через тире. - // Ростов-на-Дону, Переславль-Залесский + // Ростов-на-Дону, Переславль-Залесский и т.д. if (strpos($name, '-') !== false) { $parts = explode('-', $name); $result = array( @@ -179,7 +184,7 @@ public static function getCases($name) self::TVORIT => $prefix.'ем', self::PREDLOJ => $prefix.'е', ); - } elseif (self::isConsonant(S::slice($name, -1)) && S::slice($name, -2) != 'ов') { + } elseif (self::isConsonant(S::slice($name, -1)) && !in_array($name, self::$ovAbnormalExceptions)) { // Париж, Валаам, Киев $prefix = S::name($name); return array( diff --git a/tests/Russian/GeographicalNamesInflectionTest.php b/tests/Russian/GeographicalNamesInflectionTest.php index b6da4f0..86816fc 100644 --- a/tests/Russian/GeographicalNamesInflectionTest.php +++ b/tests/Russian/GeographicalNamesInflectionTest.php @@ -43,13 +43,14 @@ public function wordsProvider() ['Осташков', 'Осташкова', 'Осташкову', 'Осташков', 'Осташковым', 'Осташкове'], ['Грозный', 'Грозного', 'Грозному', 'Грозный', 'Грозным', 'Грозном'], ['Благодарный', 'Благодарного', 'Благодарному', 'Благодарный', 'Благодарным', 'Благодарном'], + ['Псков', 'Пскова', 'Пскову', 'Псков', 'Псковом', 'Пскове'], + ['Киров', 'Кирова', 'Кирову', 'Киров', 'Кировом', 'Кирове'], // сложные названия ['Санкт-Петербург', 'Санкт-Петербурга', 'Санкт-Петербургу', 'Санкт-Петербург', 'Санкт-Петербургом', 'Санкт-Петербурге'], ['Ростов-на-Дону', 'Ростова-на-Дону', 'Ростову-на-Дону', 'Ростов-на-Дону', 'Ростовом-на-Дону', 'Ростове-на-Дону'], ['Нижний Новгород', 'Нижнего Новгорода', 'Нижнему Новгороду', 'Нижний Новгород', 'Нижним Новгородом', 'Нижнем Новгороде'], ['Набережные Челны', 'Набережных Челнов', 'Набережным Челнам', 'Набережные Челны', 'Набережными Челнами', 'Набережных Челнах'], - ['Ростов-на-Дону', 'Ростова-на-Дону', 'Ростову-на-Дону', 'Ростов-на-Дону', 'Ростовом-на-Дону', 'Ростове-на-Дону'], // N край ['Краснодарский край', 'Краснодарского края', 'Краснодарскому краю', 'Краснодарский край', 'Краснодарским краем', 'Краснодарском крае'],