Skip to content

Commit

Permalink
Merge pull request #21 from VitalyArt/master
Browse files Browse the repository at this point in the history
Fix #17
  • Loading branch information
wapmorgan authored Nov 17, 2017
2 parents 9802c17 + 5bd4406 commit e4e1f7e
Show file tree
Hide file tree
Showing 2 changed files with 20 additions and 25 deletions.
44 changes: 19 additions & 25 deletions src/Russian/GeographicalNamesInflection.php
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,11 @@ class GeographicalNamesInflection extends \morphos\BaseInflection implements Cas
'юар',
);

protected static $delimiters = array(
' ',
'-на-'
);

/**
* Проверяет, склоняемо ли название
* @param string $name Название
Expand Down Expand Up @@ -83,37 +88,26 @@ public static function getCases($name)
]);
}

// Сложное название города из нескольких слов через пробел.
// Нижний Новгород, Набережные Челны
if (strpos($name, ' ') !== false) {
$parts = explode(' ', $name);
$result = array();
foreach ($parts as $i => $part) {
$result[$i] = static::getCases($part);
foreach (self::$delimiters as $delimiter) {
if (strpos($name, $delimiter) !== false) {
$parts = explode($delimiter, $name);
$result = array();
foreach ($parts as $i => $part) {
$result[$i] = static::getCases($part);
}
return self::composeCasesFromWords($result, $delimiter);
}
return self::composeCasesFromWords($result);
}

// Сложное название города из нескольких слов через тире.
// Ростов-на-Дону, Переславль-Залесский
if (strpos($name, '-') !== false) {
// грязный хак, но подобных случаев как с Ростовом-на-Дону нету
if ($name == 'ростов-на-дону') {
return [
self::IMENIT => 'Ростов-на-Дону',
self::RODIT => 'Ростова-на-Дону',
self::DAT => 'Ростову-на-Дону',
self::VINIT => 'Ростов-на-Дону',
self::TVORIT => 'Ростовом-на-Дону',
self::PREDLOJ => 'Ростове-на-Дону'
];
} else {
$parts = explode('-', $name);
$result = array(
array_fill_keys([self::IMENIT, self::RODIT, self::DAT, self::VINIT, self::TVORIT, self::PREDLOJ], S::name($parts[0])),
);
for ($i = 1, $total_parts = count($parts); $i < $total_parts; $i++)
$result[] = static::getCases($parts[$i]); // вторая часть, склоняемая
$parts = explode('-', $name);
$result = array(
array_fill_keys([self::IMENIT, self::RODIT, self::DAT, self::VINIT, self::TVORIT, self::PREDLOJ], S::name($parts[0])),
);
for ($i = 1, $total_parts = count($parts); $i < $total_parts; $i++) {
$result[] = static::getCases($parts[$i]); // вторая часть, склоняемая
}
return self::composeCasesFromWords($result, '-');
}
Expand Down
1 change: 1 addition & 0 deletions tests/Russian/GeographicalNamesInflectionTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,7 @@ public function wordsProvider()

// сложные названия
['Санкт-Петербург', 'Санкт-Петербурга', 'Санкт-Петербургу', 'Санкт-Петербург', 'Санкт-Петербургом', 'Санкт-Петербурге'],
['Ростов-на-Дону', 'Ростова-на-Дону', 'Ростову-на-Дону', 'Ростов-на-Дону', 'Ростовом-на-Дону', 'Ростове-на-Дону'],
['Нижний Новгород', 'Нижнего Новгорода', 'Нижнему Новгороду', 'Нижний Новгород', 'Нижним Новгородом', 'Нижнем Новгороде'],
['Набережные Челны', 'Набережных Челнов', 'Набережным Челнам', 'Набережные Челны', 'Набережными Челнами', 'Набережных Челнах'],
['Ростов-на-Дону', 'Ростова-на-Дону', 'Ростову-на-Дону', 'Ростов-на-Дону', 'Ростовом-на-Дону', 'Ростове-на-Дону'],
Expand Down

0 comments on commit e4e1f7e

Please sign in to comment.