mirror of
https://github.com/retailcrm/NameCaseLib.git
synced 2024-12-05 03:16:06 +03:00
[0.4] Рефакторинг правил склониния украинского языка
This commit is contained in:
parent
f1063e9bf4
commit
ea0a210769
@ -63,6 +63,7 @@ class NCL
|
||||
/*
|
||||
* @static integer
|
||||
*/
|
||||
|
||||
static $MAN = 1;
|
||||
|
||||
/*
|
||||
@ -80,7 +81,6 @@ class NCL
|
||||
static $VINITELN = 3;
|
||||
static $TVORITELN = 4;
|
||||
static $PREDLOGN = 5;
|
||||
|
||||
static $UaNazyvnyi = 0;
|
||||
static $UaRodovyi = 1;
|
||||
static $UaDavalnyi = 2;
|
||||
@ -88,6 +88,7 @@ class NCL
|
||||
static $UaOrudnyi = 4;
|
||||
static $UaMiszevyi = 5;
|
||||
static $UaKlychnyi = 6;
|
||||
|
||||
}
|
||||
|
||||
class NCLNameCaseCore extends NCL
|
||||
@ -122,8 +123,8 @@ class NCLNameCaseCore extends NCL
|
||||
* <li>2 - женщина</li>
|
||||
*/
|
||||
protected $gender = 0;
|
||||
|
||||
/*
|
||||
|
||||
/*
|
||||
* @var array()
|
||||
* Результат склонения имени
|
||||
*/
|
||||
@ -159,11 +160,161 @@ class NCLNameCaseCore extends NCL
|
||||
* Номер правила по которому не склоняется фамилия
|
||||
*/
|
||||
protected $srule = "";
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* Кодировка библиотеки
|
||||
* @var string
|
||||
*/
|
||||
protected $charset = 'utf-8';
|
||||
|
||||
|
||||
/*
|
||||
* Слово с которым работаем сейчас
|
||||
* @var string
|
||||
*/
|
||||
protected $workingWord = '';
|
||||
|
||||
/*
|
||||
* Кеш окончаний слова
|
||||
* @var array
|
||||
*/
|
||||
protected $workindLastCache = array();
|
||||
/**
|
||||
* Последние правило
|
||||
* @var int
|
||||
*/
|
||||
protected $lastRule = 0;
|
||||
/**
|
||||
* Просклоненое слово
|
||||
* @var array
|
||||
*/
|
||||
protected $lastResult = array();
|
||||
|
||||
/**
|
||||
* Сброс всех настроек
|
||||
*/
|
||||
protected function reset()
|
||||
{
|
||||
$this->lastRule = 0;
|
||||
$this->lastResult = array();
|
||||
}
|
||||
|
||||
/**
|
||||
* Установить номер парвила
|
||||
* @param int $index
|
||||
*/
|
||||
protected function Rule($index)
|
||||
{
|
||||
$this->lastRule = $index;
|
||||
}
|
||||
|
||||
/*
|
||||
* Обертка для substr
|
||||
*/
|
||||
|
||||
protected function substr($str, $start, $length=null)
|
||||
{
|
||||
return mb_substr($str, $start, $length, $this->charset);
|
||||
}
|
||||
|
||||
/*
|
||||
* Обертка для strpos
|
||||
*/
|
||||
|
||||
protected function strpos($haystack, $needle, $offset = 0)
|
||||
{
|
||||
return mb_strpos($haystack, $needle, $offset, $this->charset);
|
||||
}
|
||||
|
||||
/*
|
||||
* Обертка для strlen
|
||||
*/
|
||||
|
||||
protected function strlen($str)
|
||||
{
|
||||
return mb_strlen($str, $this->charset);
|
||||
}
|
||||
|
||||
/*
|
||||
* Обертка для strtolower
|
||||
*/
|
||||
|
||||
protected function strtolower($str)
|
||||
{
|
||||
return mb_strtolower($str, $this->charset);
|
||||
}
|
||||
|
||||
/**
|
||||
* Обертка для strrpos
|
||||
* @param type $haystack
|
||||
* @param type $needle
|
||||
* @param type $offset
|
||||
* @return type
|
||||
*/
|
||||
protected function strrpos($haystack, $needle, $offset=null)
|
||||
{
|
||||
return mb_strrpos($haystack, $needle, $offset, $this->charset);
|
||||
}
|
||||
|
||||
/*
|
||||
* Установить текущее слово
|
||||
*/
|
||||
|
||||
protected function setWorkingWord($word)
|
||||
{
|
||||
//Сбрасываем настройки
|
||||
$this->reset();
|
||||
//Ставим слово
|
||||
$this->workingWord = $word;
|
||||
//Чистим кеш
|
||||
$this->workindLastCache = array();
|
||||
}
|
||||
|
||||
/*
|
||||
* Если $stopAfter = 0, тогда вырезает $length последних букв
|
||||
* Если нет, тогда вырезает $stopAfter букв начиная от $length с конца
|
||||
*/
|
||||
|
||||
protected function Last($length=1, $stopAfter=0)
|
||||
{
|
||||
//Сколько букв нужно вырезать все или только часть
|
||||
if (!$stopAfter)
|
||||
{
|
||||
$cut = $length;
|
||||
}
|
||||
else
|
||||
{
|
||||
$cut = $stopAfter;
|
||||
}
|
||||
|
||||
//Проверяем кеш
|
||||
if (!isset($this->workindLastCache[$length][$stopAfter]))
|
||||
{
|
||||
$this->workindLastCache[$length][$stopAfter] = $this->substr($this->workingWord, -$length, $cut);
|
||||
}
|
||||
return $this->workindLastCache[$length][$stopAfter];
|
||||
}
|
||||
|
||||
/**
|
||||
* Выполняет над словом типа $gender (man / woman) в порядке указанов в $rulesArray
|
||||
* @param string $gender - мужские/женский правила
|
||||
* @param type $rulesArray - массив, порядок выполнения правил
|
||||
* @return boolean
|
||||
*/
|
||||
protected function RulesChain($gender, $rulesArray)
|
||||
{
|
||||
foreach($rulesArray as $ruleID)
|
||||
{
|
||||
$ruleMethod = $gender.'Rule'.$ruleID;
|
||||
if($this->$ruleMethod())
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
protected function makeFirstTheSame()
|
||||
{
|
||||
@ -203,26 +354,75 @@ class NCLNameCaseCore extends NCL
|
||||
|
||||
protected function in($letter, $string)
|
||||
{
|
||||
|
||||
if ($letter and mb_strpos($string, $letter) === false)
|
||||
//Если второй параметр массив
|
||||
if (is_array($string))
|
||||
{
|
||||
return false;
|
||||
return in_array($letter, $string);
|
||||
}
|
||||
else
|
||||
{
|
||||
return true;
|
||||
if (!$letter or $this->strpos($string, $letter) === false)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
else
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Функция проверяет, входит ли имя в перечень имен.
|
||||
*
|
||||
* @param string $nameNeedle - имя
|
||||
* @param string $names - перечень имен
|
||||
*/
|
||||
protected function inNames($nameNeedle, $names)
|
||||
{
|
||||
if (!is_array($names))
|
||||
{
|
||||
$names = array($names);
|
||||
}
|
||||
|
||||
foreach ($names as $name)
|
||||
{
|
||||
if ($this->strtolower($nameNeedle) == $this->strtolower($name))
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/*
|
||||
* Функция дополняет переданое слово нужными окончаниями.
|
||||
*
|
||||
* @param $word (string) - слово
|
||||
* @param $endings (array) - окончания
|
||||
* @param $replaceLast (boolean) - убрать последнюю букву
|
||||
* @param $replaceTwoLast (boolean) - убрать две последних буквы
|
||||
* @param $replaceLast (int) - сколько букв убрать
|
||||
*
|
||||
* @return boolean
|
||||
* @return (array)
|
||||
*/
|
||||
|
||||
protected function wordForms($word, $endings, $replaceLast=0)
|
||||
{
|
||||
//Создаем массив с именительный падежом
|
||||
$result = array($word);
|
||||
//Убираем в окончание лишние буквы
|
||||
$word = $this->substr($word, 0, $this->strlen($word) - $replaceLast);
|
||||
|
||||
//Добавляем окончания
|
||||
for ($padegIndex = 1; $padegIndex < $this->CaseCount; $padegIndex++)
|
||||
{
|
||||
$result[$padegIndex] = $word . $endings[$padegIndex - 1];
|
||||
}
|
||||
|
||||
$this->lastResult = $result;
|
||||
}
|
||||
|
||||
/*
|
||||
* DEPRECATED!!!
|
||||
*/
|
||||
|
||||
protected function padeg($word, $endings, $replaceLast=false, $replaceTwoLast=false)
|
||||
@ -239,7 +439,7 @@ class NCLNameCaseCore extends NCL
|
||||
$word = mb_substr($word, 0, mb_strlen($word, 'utf-8') - 1, 'utf-8');
|
||||
}
|
||||
$i = 0;
|
||||
for ($i == 0; $i < ($this->CaseCount-1); $i++)
|
||||
for ($i = 0; $i < ($this->CaseCount - 1); $i++)
|
||||
{
|
||||
$result[$i + 1] = $word . $endings[$i];
|
||||
}
|
||||
@ -392,28 +592,27 @@ class NCLNameCaseCore extends NCL
|
||||
{
|
||||
$found[$i][0] = $this->detectNamePart($list[$i]);
|
||||
$found[$i][1] = $list[$i];
|
||||
if ($found[$i][0]=='N')
|
||||
if ($found[$i][0] == 'N')
|
||||
{
|
||||
$this->firstName=$found[$i][1];
|
||||
$this->firstName = $found[$i][1];
|
||||
}
|
||||
elseif ($found[$i][0]=='S')
|
||||
elseif ($found[$i][0] == 'S')
|
||||
{
|
||||
$this->secondName=$found[$i][1];
|
||||
$this->secondName = $found[$i][1];
|
||||
}
|
||||
elseif ($found[$i][0]=='F')
|
||||
elseif ($found[$i][0] == 'F')
|
||||
{
|
||||
$this->fatherName=$found[$i][1];
|
||||
$this->fatherName = $found[$i][1];
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
$format = array();
|
||||
foreach ($found as $value)
|
||||
{
|
||||
$format[]=$value;
|
||||
$format[] = $value;
|
||||
}
|
||||
if (count($format)==1)
|
||||
if (count($format) == 1)
|
||||
{
|
||||
return $format[0][0];
|
||||
}
|
||||
@ -421,7 +620,6 @@ class NCLNameCaseCore extends NCL
|
||||
{
|
||||
return $format;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/*
|
||||
@ -443,7 +641,7 @@ class NCLNameCaseCore extends NCL
|
||||
{
|
||||
$result = $this->womanFirstName();
|
||||
}
|
||||
$this->firstResult[0]=$this->firstName;
|
||||
$this->firstResult[0] = $this->firstName;
|
||||
return $result;
|
||||
}
|
||||
else
|
||||
@ -472,7 +670,7 @@ class NCLNameCaseCore extends NCL
|
||||
{
|
||||
$result = $this->womanSecondName();
|
||||
}
|
||||
$this->secondResult[0]=$this->secondName;
|
||||
$this->secondResult[0] = $this->secondName;
|
||||
return $result;
|
||||
}
|
||||
else
|
||||
@ -501,7 +699,7 @@ class NCLNameCaseCore extends NCL
|
||||
{
|
||||
$result = $this->womanFatherName();
|
||||
}
|
||||
$this->fatherResult[0]=$this->fatherName;
|
||||
$this->fatherResult[0] = $this->fatherName;
|
||||
return $result;
|
||||
}
|
||||
else
|
||||
@ -523,7 +721,7 @@ class NCLNameCaseCore extends NCL
|
||||
{
|
||||
$this->FirstName();
|
||||
}
|
||||
if ($number < 0 or $number > ($this->CaseCount-1))
|
||||
if ($number < 0 or $number > ($this->CaseCount - 1))
|
||||
{
|
||||
$number = null;
|
||||
}
|
||||
@ -551,7 +749,7 @@ class NCLNameCaseCore extends NCL
|
||||
{
|
||||
$this->SecondName();
|
||||
}
|
||||
if ($number < 0 or $number > ($this->CaseCount-1))
|
||||
if ($number < 0 or $number > ($this->CaseCount - 1))
|
||||
{
|
||||
$number = null;
|
||||
}
|
||||
@ -579,7 +777,7 @@ class NCLNameCaseCore extends NCL
|
||||
{
|
||||
$this->FatherName();
|
||||
}
|
||||
if ($number < 0 or $number > ($this->CaseCount-1))
|
||||
if ($number < 0 or $number > ($this->CaseCount - 1))
|
||||
{
|
||||
$number = null;
|
||||
}
|
||||
@ -697,16 +895,16 @@ class NCLNameCaseCore extends NCL
|
||||
}
|
||||
return $result;
|
||||
}
|
||||
|
||||
|
||||
public function getFormattedArrayHard($format)
|
||||
{
|
||||
|
||||
|
||||
$result = array();
|
||||
$cases = array();
|
||||
foreach ($format as $value)
|
||||
{
|
||||
$symbol = $value[0];
|
||||
|
||||
|
||||
if ($symbol == 'S')
|
||||
{
|
||||
$this->setSecondName($value[1]);
|
||||
@ -720,7 +918,7 @@ class NCLNameCaseCore extends NCL
|
||||
elseif ($symbol == 'F')
|
||||
{
|
||||
$this->setFatherName($value[1]);
|
||||
$cases[] = array('F',$this->getFatherNameCase());
|
||||
$cases[] = array('F', $this->getFatherNameCase());
|
||||
}
|
||||
}
|
||||
|
||||
@ -732,47 +930,47 @@ class NCLNameCaseCore extends NCL
|
||||
$symbol = $value[0];
|
||||
if ($symbol == 'S')
|
||||
{
|
||||
$line.=$value[1][$curCase].' ';
|
||||
$line.=$value[1][$curCase] . ' ';
|
||||
}
|
||||
elseif ($symbol == 'N')
|
||||
{
|
||||
$line.=$value[1][$curCase].' ';
|
||||
$line.=$value[1][$curCase] . ' ';
|
||||
}
|
||||
elseif ($symbol == 'F')
|
||||
{
|
||||
$line.=$value[1][$curCase].' ';
|
||||
$line.=$value[1][$curCase] . ' ';
|
||||
}
|
||||
}
|
||||
$result[] = trim($line);
|
||||
}
|
||||
return $result;
|
||||
}
|
||||
|
||||
|
||||
public function getFormattedHard($caseNum=0, $format=array())
|
||||
{
|
||||
$result = "";
|
||||
foreach ($format as $value)
|
||||
$result = "";
|
||||
foreach ($format as $value)
|
||||
{
|
||||
$symbol = $value[0];
|
||||
if ($symbol == 'S')
|
||||
{
|
||||
$symbol = $value[0];
|
||||
if ($symbol == 'S')
|
||||
{
|
||||
$this->setSecondName($value[1]);
|
||||
$result.=$this->getSecondNameCase($caseNum).' ';
|
||||
}
|
||||
elseif ($symbol == 'N')
|
||||
{
|
||||
$this->setFirstName($value[1]);
|
||||
$result.=$this->getFirstNameCase($caseNum).' ';
|
||||
}
|
||||
elseif ($symbol == 'F')
|
||||
{
|
||||
$this->setFatherName($value[1]);
|
||||
$result.=$this->getFatherNameCase($caseNum).' ';
|
||||
}
|
||||
$this->setSecondName($value[1]);
|
||||
$result.=$this->getSecondNameCase($caseNum) . ' ';
|
||||
}
|
||||
return trim($result);
|
||||
elseif ($symbol == 'N')
|
||||
{
|
||||
$this->setFirstName($value[1]);
|
||||
$result.=$this->getFirstNameCase($caseNum) . ' ';
|
||||
}
|
||||
elseif ($symbol == 'F')
|
||||
{
|
||||
$this->setFatherName($value[1]);
|
||||
$result.=$this->getFatherNameCase($caseNum) . ' ';
|
||||
}
|
||||
}
|
||||
return trim($result);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Склоняет в падеж $caseNum, и форматирует по шаблону $format
|
||||
* Шаблон $format
|
||||
|
@ -1,13 +1,13 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
/**
|
||||
* NCL NameCase Ukranian Language
|
||||
*
|
||||
* Клас, которые позволяет склонять украинские Имена, Фамили Отчества по падежам.
|
||||
*
|
||||
* @license Dual licensed under the MIT or GPL Version 2 licenses.
|
||||
* @author Андрей Чайка http://seagull.net.ua/ bymer3@gmail.com
|
||||
* @version 0.1.2 05.05.2011
|
||||
* @version 0.4 05.07.2011
|
||||
*
|
||||
*/
|
||||
require_once dirname(__FILE__) . '/NCL.NameCase.core.php';
|
||||
@ -41,6 +41,9 @@ class NCLNameCaseUa extends NCLNameCaseCore implements NCLNameCaseInterface
|
||||
private $neshyplyachi = "бвгдзклмнпрстфхц";
|
||||
private $myaki = 'ьюяєї';
|
||||
private $gubni = 'мвпбф';
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* Чергування г к х —» з ц с
|
||||
*
|
||||
@ -93,10 +96,10 @@ class NCLNameCaseUa extends NCLNameCaseCore implements NCLNameCaseInterface
|
||||
$osnova = $word;
|
||||
$stack = array();
|
||||
//Ріжемо слово поки не зустрінемо приголосний і записуемо в стек всі голосні які зустріли
|
||||
while ($this->in(mb_substr($osnova, -1, 1, 'utf-8'), $this->vowels . 'ь'))
|
||||
while ($this->in($this->substr($osnova, -1, 1), $this->vowels . 'ь'))
|
||||
{
|
||||
$stack[] = mb_substr($osnova, -1, 1, 'utf-8');
|
||||
$osnova = mb_substr($osnova, 0, mb_strlen($osnova, 'utf-8') - 1, 'utf-8');
|
||||
$stack[] = $this->substr($osnova, -1, 1);
|
||||
$osnova = $this->substr($osnova, 0, $this->strlen($osnova) - 1);
|
||||
}
|
||||
$stacksize = count($stack);
|
||||
$Last = 'Z'; //нульове закінчення
|
||||
@ -105,7 +108,7 @@ class NCLNameCaseUa extends NCLNameCaseCore implements NCLNameCaseInterface
|
||||
$Last = $stack[count($stack) - 1];
|
||||
}
|
||||
|
||||
$osnovaEnd = mb_substr($osnova, -1, 1, 'utf-8');
|
||||
$osnovaEnd = $this->substr($osnova, -1, 1);
|
||||
if ($this->in($osnovaEnd, $this->neshyplyachi) and !$this->in($Last, $this->myaki))
|
||||
{
|
||||
return 1;
|
||||
@ -128,10 +131,10 @@ class NCLNameCaseUa extends NCLNameCaseCore implements NCLNameCaseInterface
|
||||
|
||||
private function FirstLastVowel($word, $vowels)
|
||||
{
|
||||
$length = mb_strlen($word, 'utf-8');
|
||||
$length = $this->strlen($word);
|
||||
for ($i = $length - 1; $i > 0; $i--)
|
||||
{
|
||||
$char = mb_substr($word, $i, 1, 'utf-8');
|
||||
$char = $this->substr($word, $i, 1);
|
||||
if ($this->in($char, $vowels))
|
||||
{
|
||||
return $char;
|
||||
@ -149,213 +152,384 @@ class NCLNameCaseUa extends NCLNameCaseCore implements NCLNameCaseInterface
|
||||
{
|
||||
$osnova = $word;
|
||||
//Ріжемо слово поки не зустрінемо приголосний
|
||||
while ($this->in(mb_substr($osnova, -1, 1, 'utf-8'), $this->vowels . 'ь'))
|
||||
while ($this->in($this->substr($osnova, -1, 1), $this->vowels . 'ь'))
|
||||
{
|
||||
$osnova = mb_substr($osnova, 0, mb_strlen($osnova, 'utf-8') - 1, 'utf-8');
|
||||
$osnova = $this->substr($osnova, 0, $this->strlen($osnova) - 1);
|
||||
}
|
||||
return $osnova;
|
||||
}
|
||||
|
||||
/*
|
||||
* Функция, которая склоняет имя записаное в $this->firstName, по правилам склонения мужских имен.
|
||||
*
|
||||
* @return boolean
|
||||
/**
|
||||
* Українські чоловічі та жіночі імена, що в називному відмінку однини закінчуються на -а (-я),
|
||||
* відмінються як відповідні іменники І відміни.
|
||||
* - Примітка 1. Кінцеві приголосні основи г, к, х у жіночих іменах
|
||||
* у давальному та місцевому відмінках однини перед закінченням -і
|
||||
* змінюються на з, ц, с: Ольга - Ользі, Палажка - Палажці, Солоха - Солосі.
|
||||
* - Примітка 2. У жіночих іменах типу Одарка, Параска в родовому відмінку множини
|
||||
* в кінці основи між приголосними з'являється звук о: Одарок, Парасок
|
||||
* @return boolean
|
||||
*/
|
||||
|
||||
protected function manFirstName()
|
||||
protected function manRule1()
|
||||
{
|
||||
/*
|
||||
Українські чоловічі та жіночі імена, що в називному відмінку однини закінчуються на -а (-я), відмінються як відповідні іменники І відміни
|
||||
Примітка 1. Кінцеві приголосні основи г, к, х у жіночих іменах у давальному та місцевому відмінках однини перед закінченням -і змінюються на з, ц, с: Ольга - Ользі, Палажка - Палажці, Солоха - Солосі.
|
||||
Примітка 2. У жіночих іменах типу Одарка, Параска в родовому відмінку множини в кінці основи між приголосними з'являється звук о: Одарок, Парасок */
|
||||
//Последний символ
|
||||
$LastSymbol = mb_substr($this->firstName, -1, 1, 'utf-8');
|
||||
//Предпоследний символ
|
||||
$BeforeLast = mb_substr($this->firstName, -2, 1, 'utf-8');
|
||||
//Останні літера або а або я
|
||||
if ($LastSymbol == 'а')
|
||||
$BeforeLast = $this->Last(2, 1);
|
||||
|
||||
//Останні літера або а
|
||||
if ($this->Last(1) == 'а')
|
||||
{
|
||||
$this->firstResult = $this->padeg($this->firstName, array($BeforeLast . 'и', $this->inverseGKH($BeforeLast) . 'і', $BeforeLast . 'у', $BeforeLast . 'ою', $this->inverseGKH($BeforeLast) . 'і', $BeforeLast . 'о'), false, true);
|
||||
$this->frule = 101;
|
||||
$this->wordForms($this->workingWord, array($BeforeLast . 'и', $this->inverseGKH($BeforeLast) . 'і', $BeforeLast . 'у', $BeforeLast . 'ою', $this->inverseGKH($BeforeLast) . 'і', $BeforeLast . 'о'), 2);
|
||||
$this->Rule(101);
|
||||
return true;
|
||||
}
|
||||
elseif ($LastSymbol == 'я')
|
||||
//Остання літера я
|
||||
elseif ($this->Last(1) == 'я')
|
||||
{
|
||||
//Перед останньою літерою стоїть я
|
||||
if ($BeforeLast == 'і')
|
||||
{
|
||||
$this->firstResult = $this->padeg($this->firstName, array('ї', 'ї', 'ю', 'єю', 'ї', 'є'), true);
|
||||
$this->frule = 103;
|
||||
$this->wordForms($this->workingWord, array('ї', 'ї', 'ю', 'єю', 'ї', 'є'), 1);
|
||||
$this->Rule(102);
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
$this->firstResult = $this->padeg($this->firstName, array($BeforeLast . 'і', $this->inverseGKH($BeforeLast) . 'і', $BeforeLast . 'ю', $BeforeLast . 'ею', $this->inverseGKH($BeforeLast) . 'і', $BeforeLast . 'е'), false, true);
|
||||
$this->frule = 102;
|
||||
$this->wordForms($this->workingWord, array($BeforeLast . 'і', $this->inverseGKH($BeforeLast) . 'і', $BeforeLast . 'ю', $BeforeLast . 'ею', $this->inverseGKH($BeforeLast) . 'і', $BeforeLast . 'е'), 2);
|
||||
$this->Rule(103);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
//Примітка 2. Імена, що в називному відмінку закінчуються на -р, у родовому мають закінчення -а: Віктор - Віктора, Макар - Макара, але: Ігор - Ігоря, Лазар - Лазаря.
|
||||
elseif ($LastSymbol == 'р')
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
if ($this->firstName == 'Ігор' or $this->firstName == 'Лазар')
|
||||
/**
|
||||
* Імена, що в називному відмінку закінчуються на -р, у родовому мають закінчення -а:
|
||||
* Віктор - Віктора, Макар - Макара, але: Ігор - Ігоря, Лазар - Лазаря.
|
||||
* @return boolean
|
||||
*/
|
||||
protected function manRule2()
|
||||
{
|
||||
if ($this->Last(1) == 'р')
|
||||
{
|
||||
if ($this->inNames($this->workingWord, array('Ігор', 'Лазар')))
|
||||
{
|
||||
$this->firstResult = $this->padeg($this->firstName, array('я', 'еві', 'я', 'ем', 'еві', 'е'));
|
||||
$this->frule = 201;
|
||||
$this->wordForms($this->workingWord, array('я', 'еві', 'я', 'ем', 'еві', 'е'));
|
||||
$this->Rule(201);
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
$osnova = $this->firstName;
|
||||
if (mb_substr($osnova, -2, 1, 'utf-8') == 'і')
|
||||
$osnova = $this->workingWord;
|
||||
if ($this->substr($osnova, -2, 1) == 'і')
|
||||
{
|
||||
$osnova = mb_substr($osnova, 0, mb_strlen($osnova, 'utf-8') - 2, 'utf-8') . 'о' . mb_substr($osnova, -1, 1, 'utf-8');
|
||||
$osnova = $this->substr($osnova, 0, $this->strlen($osnova) - 2) . 'о' . $this->substr($osnova, -1, 1);
|
||||
}
|
||||
$this->firstResult = $this->padeg($osnova, array('а', 'ові', 'а', 'ом', 'ові', 'е'));
|
||||
$this->frule = 202;
|
||||
$this->wordForms($osnova, array('а', 'ові', 'а', 'ом', 'ові', 'е'));
|
||||
$this->Rule(202);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
//2. Українські чоловічі імена, що в називному відмінку однини закінчуються на приголосний та -о , відмінюються як відповідні іменники ІІ відміни.
|
||||
elseif ($this->in($LastSymbol, $this->consonant . 'оь'))
|
||||
{
|
||||
$group = $this->detect2Group($this->firstName);
|
||||
$osnova = $this->getOsnova($this->firstName);
|
||||
//В іменах типу Антін, Нестір, Нечипір, Прокіп, Сидір, Тиміш, Федір голосний і виступає тільки в називному відмінку, у непрямих - о: Антона, Антонові
|
||||
//Чергування і -» о всередині
|
||||
$osLast = mb_substr($osnova, -1, 1, 'utf-8');
|
||||
if ($osLast != 'й' and mb_substr($osnova, -2, 1, 'utf-8') == 'і' and !in_array(mb_substr(mb_strtolower($osnova, 'utf-8'), -4, 4, 'utf-8'), array('світ', 'цвіт')) and !in_array($this->firstName, array('Гліб')))
|
||||
{
|
||||
$osnova = mb_substr($osnova, 0, mb_strlen($osnova, 'utf-8') - 2, 'utf-8') . 'о' . mb_substr($osnova, -1, 1, 'utf-8');
|
||||
}
|
||||
//Випадання букви е при відмінюванні слів типу Орел
|
||||
if (mb_substr($osnova, 0, 1, 'utf-8') == 'О' and $this->FirstLastVowel($osnova, $this->vowels . 'гк') == 'е' and $BeforeLast . $LastSymbol != 'сь')
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
$delim = mb_strrpos($osnova, 'е', null, 'utf-8');
|
||||
$osnova = mb_substr($osnova, 0, $delim, 'utf-8') . mb_substr($osnova, $delim + 1, mb_strlen($osnova, 'utf-8') - $delim, 'utf-8');
|
||||
/**
|
||||
* Українські чоловічі імена, що в називному відмінку однини закінчуються на приголосний та -о,
|
||||
* відмінюються як відповідні іменники ІІ відміни.
|
||||
* @return boolean
|
||||
*/
|
||||
protected function manRule3()
|
||||
{
|
||||
//Предпоследний символ
|
||||
$BeforeLast = $this->Last(2, 1);
|
||||
|
||||
if ($this->in($this->Last(1), $this->consonant . 'оь'))
|
||||
{
|
||||
$group = $this->detect2Group($this->workingWord);
|
||||
$osnova = $this->getOsnova($this->workingWord);
|
||||
//В іменах типу Антін, Нестір, Нечипір, Прокіп, Сидір, Тиміш, Федір голосний і виступає тільки в
|
||||
//називному відмінку, у непрямих - о: Антона, Антонові
|
||||
//Чергування і -» о всередині
|
||||
$osLast = $this->substr($osnova, -1, 1);
|
||||
if ($osLast != 'й' and $this->substr($osnova, -2, 1) == 'і' and !$this->in($this->substr($this->strtolower($osnova), -4, 4), array('світ', 'цвіт')) and !$this->inNames($this->workingWord, 'Гліб'))
|
||||
{
|
||||
$osnova = $this->substr($osnova, 0, $this->strlen($osnova) - 2) . 'о' . $this->substr($osnova, -1, 1);
|
||||
}
|
||||
|
||||
|
||||
//Випадання букви е при відмінюванні слів типу Орел
|
||||
if ($this->substr($osnova, 0, 1) == 'О' and $this->FirstLastVowel($osnova, $this->vowels . 'гк') == 'е' and $this->Last(2) != 'сь')
|
||||
{
|
||||
$delim = $this->strrpos($osnova, 'е');
|
||||
$osnova = $this->substr($osnova, 0, $delim) . $this->substr($osnova, $delim + 1, $this->strlen($osnova) - $delim);
|
||||
}
|
||||
|
||||
|
||||
if ($group == 1)
|
||||
{
|
||||
//Тверда група
|
||||
$this->firstResult = $this->padeg($osnova, array($osLast . 'а', $osLast . 'ові', $osLast . 'а', $osLast . 'ом', $osLast . 'ові', $this->inverse2($osLast) . 'е'), true);
|
||||
$this->frule = 301;
|
||||
return true;
|
||||
//Слова що закінчуються на ок
|
||||
if ($this->Last(2) == 'ок' and $this->Last(3) != 'оок')
|
||||
{
|
||||
$this->wordForms($this->workingWord, array('ка', 'кові', 'ка', 'ком', 'кові', 'че'), 2);
|
||||
$this->Rule(30101);
|
||||
return true;
|
||||
}
|
||||
//Російські прізвища на ов, ев, єв
|
||||
elseif ($this->in($this->Last(2), array('ов', 'ев', 'єв')) and !$this->inNames($this->workingWord, array('Лев', 'Остромов')))
|
||||
{
|
||||
$this->wordForms($osnova, array($osLast . 'а', $osLast . 'у', $osLast . 'а', $osLast . 'им', $osLast . 'у', $this->inverse2($osLast) . 'е'), 1);
|
||||
$this->Rule(30102);
|
||||
return true;
|
||||
}
|
||||
//Російські прізвища на ін
|
||||
elseif ($this->in($this->Last(2), array('ін')))
|
||||
{
|
||||
$this->wordForms($this->workingWord, array('а', 'у', 'а', 'ом', 'у', 'е'));
|
||||
$this->Rule(30103);
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
$this->wordForms($osnova, array($osLast . 'а', $osLast . 'ові', $osLast . 'а', $osLast . 'ом', $osLast . 'ові', $this->inverse2($osLast) . 'е'), 1);
|
||||
$this->Rule(301);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
if ($group == 2)
|
||||
{
|
||||
//Мішана група
|
||||
$this->firstResult = $this->padeg($osnova, array('а', 'еві', 'а', 'ем', 'еві', 'е'));
|
||||
$this->frule = 302;
|
||||
$this->wordForms($osnova, array('а', 'еві', 'а', 'ем', 'еві', 'е'));
|
||||
$this->Rule(302);
|
||||
return true;
|
||||
}
|
||||
if ($group == 3)
|
||||
{
|
||||
//М’яка група
|
||||
//Соловей
|
||||
if (mb_substr($this->firstName, -3, 2, 'utf-8') == 'ве')
|
||||
if ($this->Last(2) == 'ей' and $this->in($this->Last(3, 1), $this->gubni))
|
||||
{
|
||||
$osnova = mb_substr($this->firstName, 0, mb_strlen($this->firstName, 'utf-8') - 2, 'utf-8') . '`';
|
||||
$this->firstResult = $this->padeg($osnova, array('я', 'єві', 'я', 'єм', 'єві', 'ю'));
|
||||
$this->frule = 305;
|
||||
$osnova = $this->substr($this->workingWord, 0, $this->strlen($this->workingWord) - 2) . '’';
|
||||
$this->wordForms($osnova, array('я', 'єві', 'я', 'єм', 'єві', 'ю'));
|
||||
$this->Rule(303);
|
||||
return true;
|
||||
}
|
||||
elseif ($BeforeLast == 'і' or $LastSymbol == 'й')
|
||||
elseif ($this->Last(1) == 'й' or $BeforeLast == 'і')
|
||||
{
|
||||
$this->firstResult = $this->padeg($this->firstName, array('я', 'єві', 'я', 'єм', 'єві', 'ю'), true);
|
||||
$this->frule = 304;
|
||||
$this->wordForms($this->workingWord, array('я', 'єві', 'я', 'єм', 'єві', 'ю'), 1);
|
||||
$this->Rule(304);
|
||||
return true;
|
||||
}
|
||||
//Слова що закінчуються на ець
|
||||
elseif ($this->Last(3) == 'ець')
|
||||
{
|
||||
$this->wordForms($this->workingWord, array('ця', 'цеві', 'ця', 'цем', 'цеві', 'цю'), 3);
|
||||
$this->Rule(305);
|
||||
return true;
|
||||
}
|
||||
//Слова що закінчуються на єць яць
|
||||
elseif ($this->in($this->Last(3), array('єць', 'яць')))
|
||||
{
|
||||
$this->wordForms($this->workingWord, array('йця', 'йцеві', 'йця', 'йцем', 'йцеві', 'йцю'), 3);
|
||||
$this->Rule(306);
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
$this->firstResult = $this->padeg($osnova, array('я', 'еві', 'я', 'ем', 'еві', 'ю'));
|
||||
$this->frule = 303;
|
||||
$this->wordForms($osnova, array('я', 'еві', 'я', 'ем', 'еві', 'ю'));
|
||||
$this->Rule(305);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Якщо слово закінчується на і, то відмінюємо як множину
|
||||
* @return boolean
|
||||
*/
|
||||
protected function manRule4()
|
||||
{
|
||||
if ($this->Last(1) == 'і')
|
||||
{
|
||||
$this->wordForms($this->workingWord, array('их', 'им', 'их', 'ими', 'их', 'і'), 1);
|
||||
$this->Rule(4);
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Якщо слово закінчується на ий або ой
|
||||
* @return boolena
|
||||
*/
|
||||
protected function manRule5()
|
||||
{
|
||||
if ($this->in($this->Last(2), array('ий', 'ой')))
|
||||
{
|
||||
$this->wordForms($this->workingWord, array('ого', 'ому', 'ого', 'им', 'ому', 'ий'), 2);
|
||||
$this->Rule(5);
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Українські чоловічі та жіночі імена, що в називному відмінку однини закінчуються на -а (-я),
|
||||
* відмінються як відповідні іменники І відміни.
|
||||
* - Примітка 1. Кінцеві приголосні основи г, к, х у жіночих іменах
|
||||
* у давальному та місцевому відмінках однини перед закінченням -і
|
||||
* змінюються на з, ц, с: Ольга - Ользі, Палажка - Палажці, Солоха - Солосі.
|
||||
* - Примітка 2. У жіночих іменах типу Одарка, Параска в родовому відмінку множини
|
||||
* в кінці основи між приголосними з'являється звук о: Одарок, Парасок
|
||||
* @return boolean
|
||||
*/
|
||||
protected function womanRule1()
|
||||
{
|
||||
//Предпоследний символ
|
||||
$BeforeLast = $this->Last(2, 1);
|
||||
|
||||
//Якщо закінчується на ніга -» нога
|
||||
if ($this->Last(4) == 'ніга')
|
||||
{
|
||||
$osnova = $this->substr($this->workingWord, 0, $this->strlen($this->workingWord) - 3) . 'о';
|
||||
$this->wordForms($osnova, array('ги', 'зі', 'гу', 'гою', 'зі', 'го'));
|
||||
$this->Rule(101);
|
||||
return true;
|
||||
}
|
||||
|
||||
//Останні літера або а
|
||||
elseif ($this->Last(1) == 'а')
|
||||
{
|
||||
$this->wordForms($this->workingWord, array($BeforeLast . 'и', $this->inverseGKH($BeforeLast) . 'і', $BeforeLast . 'у', $BeforeLast . 'ою', $this->inverseGKH($BeforeLast) . 'і', $BeforeLast . 'о'), 2);
|
||||
$this->Rule(101);
|
||||
return true;
|
||||
}
|
||||
//Остання літера я
|
||||
elseif ($this->Last(1) == 'я')
|
||||
{
|
||||
|
||||
if ($this->in($BeforeLast, $this->vowels))
|
||||
{
|
||||
$this->wordForms($this->workingWord, array('ї', 'ї', 'ю', 'єю', 'ї', 'є'), 1);
|
||||
$this->Rule(103);
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
$this->wordForms($this->workingWord, array($BeforeLast . 'і', $this->inverseGKH($BeforeLast) . 'і', $BeforeLast . 'ю', $BeforeLast . 'ею', $this->inverseGKH($BeforeLast) . 'і', $BeforeLast . 'е'), 2);
|
||||
$this->Rule(102);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Українські жіночі імена, що в називному відмінку однини закінчуються на приголосний,
|
||||
* відмінюються як відповідні іменники ІІІ відміни
|
||||
* @return boolean
|
||||
*/
|
||||
protected function womanRule2()
|
||||
{
|
||||
if ($this->in($this->Last(1), $this->consonant . 'ь'))
|
||||
{
|
||||
$osnova = $this->getOsnova($this->firstName);
|
||||
$apostrof = '';
|
||||
$duplicate = '';
|
||||
$osLast = $this->substr($osnova, -1, 1);
|
||||
$osBeforeLast = $this->substr($osnova, -2, 1);
|
||||
|
||||
//Чи треба ставити апостроф
|
||||
if ($this->in($osLast, 'мвпбф') and ($this->in($osBeforeLast, $this->vowels)))
|
||||
{
|
||||
$apostrof = '’';
|
||||
}
|
||||
|
||||
//Чи треба подвоювати
|
||||
if ($this->in($osLast, 'дтзсцлн'))
|
||||
{
|
||||
$duplicate = $osLast;
|
||||
}
|
||||
|
||||
|
||||
//Відмінюємо
|
||||
if ($this->Last(1) == 'ь')
|
||||
{
|
||||
$this->wordForms($osnova, array('і', 'і', 'ь', $duplicate . $apostrof . 'ю', 'і', 'е'));
|
||||
$this->Rule(402);
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
$this->wordForms($osnova, array('і', 'і', '', $duplicate . $apostrof . 'ю', 'і', 'е'));
|
||||
$this->Rule(401);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Якщо слово на ськ або це російське прізвище
|
||||
* @return boolean
|
||||
*/
|
||||
protected function womanRule3()
|
||||
{
|
||||
//Предпоследний символ
|
||||
$BeforeLast = $this->Last(2, 1);
|
||||
|
||||
//Донская
|
||||
if ($this->Last(2) == 'ая')
|
||||
{
|
||||
$this->wordForms($this->workingWord, array('ої', 'ій', 'ую', 'ою', 'ій', 'ая'), 2);
|
||||
$this->Rule(301);
|
||||
return true;
|
||||
}
|
||||
|
||||
//Ті що на ськ
|
||||
if ($this->Last(1) == 'а' and ($this->in($this->Last(3, 2), array('ов', 'ев', 'єв', 'ив', 'ьк', 'тн', 'рн', 'ин'))))
|
||||
{
|
||||
$this->wordForms($this->workingWord, array($BeforeLast . 'ої', $BeforeLast . 'ій', $BeforeLast . 'у', $BeforeLast . 'ою', $BeforeLast . 'ій', $BeforeLast . 'о'), 2);
|
||||
$this->Rule(302);
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Функция, которая склоняет имя записаное в $this->firstName, по правилам склонения мужских имен.
|
||||
* @return boolean
|
||||
*/
|
||||
protected function manFirstName()
|
||||
{
|
||||
|
||||
$this->setWorkingWord($this->firstName);
|
||||
|
||||
if ($this->RulesChain('man', array(1, 2, 3)))
|
||||
{
|
||||
$this->frule = $this->lastRule;
|
||||
$this->firstResult = $this->lastResult;
|
||||
}
|
||||
else
|
||||
{
|
||||
$this->makeFirstTheSame();
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
/**
|
||||
* Функция, которая склоняет имя записаное в $this->firstName, по правилам склонения женских имен.
|
||||
*
|
||||
* @return boolean
|
||||
*/
|
||||
|
||||
protected function womanFirstName()
|
||||
{
|
||||
/*
|
||||
Українські чоловічі та жіночі імена, що в називному відмінку однини закінчуються на -а (-я), відмінються як відповідні іменники І відміни
|
||||
Примітка 1. Кінцеві приголосні основи г, к, х у жіночих іменах у давальному та місцевому відмінках однини перед закінченням -і змінюються на з, ц, с: Ольга - Ользі, Палажка - Палажці, Солоха - Солосі.
|
||||
Примітка 2. У жіночих іменах типу Одарка, Параска в родовому відмінку множини в кінці основи між приголосними з'являється звук о: Одарок, Парасок */
|
||||
//Последний символ
|
||||
$LastSymbol = mb_substr($this->firstName, -1, 1, 'utf-8');
|
||||
//Предпоследний символ
|
||||
$BeforeLast = mb_substr($this->firstName, -2, 1, 'utf-8');
|
||||
//Якщо закінчується на ніга -» нога
|
||||
if (mb_substr($this->firstName, -4, 4, 'utf-8') == 'ніга')
|
||||
$this->setWorkingWord($this->firstName);
|
||||
|
||||
if ($this->RulesChain('woman', array(1, 2)))
|
||||
{
|
||||
$osnova = mb_substr($this->firstName, 0, mb_strlen($this->firstName, 'utf-8') - 3, 'utf-8') . 'о';
|
||||
$this->firstResult = $this->padeg($osnova, array('ги', 'зі', 'гу', 'гою', 'зі', 'го'));
|
||||
$this->frule = 101;
|
||||
return true;
|
||||
}
|
||||
//Останні літера або а або я
|
||||
elseif ($LastSymbol == 'а')
|
||||
{
|
||||
$this->firstResult = $this->padeg($this->firstName, array($BeforeLast . 'и', $this->inverseGKH($BeforeLast) . 'і', $BeforeLast . 'у', $BeforeLast . 'ою', $this->inverseGKH($BeforeLast) . 'і', $BeforeLast . 'о'), false, true);
|
||||
$this->frule = 101;
|
||||
return true;
|
||||
}
|
||||
elseif ($LastSymbol == 'я')
|
||||
{
|
||||
if ($this->in($BeforeLast, $this->vowels))
|
||||
{
|
||||
$this->firstResult = $this->padeg($this->firstName, array('ї', 'ї', 'ю', 'єю', 'ї', 'є'), true);
|
||||
$this->frule = 103;
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
$this->firstResult = $this->padeg($this->firstName, array($BeforeLast . 'і', $this->inverseGKH($BeforeLast) . 'і', $BeforeLast . 'ю', $BeforeLast . 'ею', $this->inverseGKH($BeforeLast) . 'і', $BeforeLast . 'е'), false, true);
|
||||
$this->frule = 102;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
//2. Українські жіночі імена, що в називному відмінку однини закінчуються на приголосний, відмінюються як відповідні іменники ІІІ відміни
|
||||
elseif ($this->in($LastSymbol, $this->consonant . 'ь'))
|
||||
{
|
||||
$osnova = $this->getOsnova($this->firstName);
|
||||
$apostrof = '';
|
||||
$duplicate = '';
|
||||
$osLast = mb_substr($osnova, -1, 1, 'utf-8');
|
||||
$osBeforeLast = mb_substr($osnova, -2, 1, 'utf-8');
|
||||
//Чи треба ставити апостроф
|
||||
if ($this->in($osLast, 'мвпбф') and ($this->in($BeforeLast, $this->vowels)))
|
||||
{
|
||||
$apostrof = '`';
|
||||
}
|
||||
//Чи треба подвоювати
|
||||
if ($this->in($osLast, 'дтзсцлн'))
|
||||
{
|
||||
$duplicate = $osLast;
|
||||
}
|
||||
if ($LastSymbol == 'ь')
|
||||
{
|
||||
$this->firstResult = $this->padeg($osnova, array('і', 'і', 'ь', $duplicate . $apostrof . 'ю', 'і', 'е'));
|
||||
$this->frule = 402;
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
$this->firstResult = $this->padeg($osnova, array('і', 'і', '', $duplicate . $apostrof . 'ю', 'і', 'е'));
|
||||
$this->frule = 401;
|
||||
return true;
|
||||
}
|
||||
$this->frule = $this->lastRule;
|
||||
$this->firstResult = $this->lastResult;
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -371,166 +545,12 @@ class NCLNameCaseUa extends NCLNameCaseCore implements NCLNameCaseInterface
|
||||
|
||||
protected function manSecondName()
|
||||
{
|
||||
/*
|
||||
Українські чоловічі та жіночі імена, що в називному відмінку однини закінчуються на -а (-я), відмінються як відповідні іменники І відміни
|
||||
Примітка 1. Кінцеві приголосні основи г, к, х у жіночих іменах у давальному та місцевому відмінках однини перед закінченням -і змінюються на з, ц, с: Ольга - Ользі, Палажка - Палажці, Солоха - Солосі.
|
||||
Примітка 2. У жіночих іменах типу Одарка, Параска в родовому відмінку множини в кінці основи між приголосними з'являється звук о: Одарок, Парасок */
|
||||
//Последний символ
|
||||
$LastSymbol = mb_substr($this->secondName, -1, 1, 'utf-8');
|
||||
//Предпоследний символ
|
||||
$BeforeLast = mb_substr($this->secondName, -2, 1, 'utf-8');
|
||||
//Якщо закінчується на ий
|
||||
if ($BeforeLast . $LastSymbol == 'ий' or $BeforeLast . $LastSymbol == 'ой')
|
||||
{
|
||||
$this->secondResult = $this->padeg($this->secondName, array('ого', 'ому', 'ого', 'им', 'ому', 'ий'), true, true);
|
||||
$this->srule = 9;
|
||||
return true;
|
||||
}
|
||||
//Останні літера або а або я
|
||||
elseif ($LastSymbol == 'а')
|
||||
{
|
||||
$this->secondResult = $this->padeg($this->secondName, array($BeforeLast . 'и', $this->inverseGKH($BeforeLast) . 'і', $BeforeLast . 'у', $BeforeLast . 'ою', $this->inverseGKH($BeforeLast) . 'і', $BeforeLast . 'о'), false, true);
|
||||
$this->srule = 101;
|
||||
return true;
|
||||
}
|
||||
elseif ($LastSymbol == 'я')
|
||||
{
|
||||
if ($BeforeLast == 'і')
|
||||
{
|
||||
$this->secondResult = $this->padeg($this->secondName, array('ї', 'ї', 'ю', 'єю', 'ї', 'є'), true);
|
||||
$this->srule = 103;
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
$this->secondResult = $this->padeg($this->secondName, array($BeforeLast . 'і', $this->inverseGKH($BeforeLast) . 'і', $BeforeLast . 'ю', $BeforeLast . 'ею', $this->inverseGKH($BeforeLast) . 'і', $BeforeLast . 'е'), false, true);
|
||||
$this->srule = 102;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
//Примітка 2. Імена, що в називному відмінку закінчуються на -р, у родовому мають закінчення -а: Віктор - Віктора, Макар - Макара, але: Ігор - Ігоря, Лазар - Лазаря.
|
||||
elseif ($LastSymbol == 'р')
|
||||
{
|
||||
$this->setWorkingWord($this->secondName);
|
||||
|
||||
if ($this->secondName == 'Ігор' or $this->secondName == 'Лазар')
|
||||
{
|
||||
$this->secondResult = $this->padeg($this->secondName, array('я', 'еві', 'я', 'ем', 'еві', 'е'));
|
||||
$this->srule = 201;
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
$osnova = $this->secondName;
|
||||
if (mb_substr($osnova, -2, 1, 'utf-8') == 'і')
|
||||
{
|
||||
$osnova = mb_substr($osnova, 0, mb_strlen($osnova, 'utf-8') - 2, 'utf-8') . 'о' . mb_substr($osnova, -1, 1, 'utf-8');
|
||||
}
|
||||
$this->secondResult = $this->padeg($osnova, array('а', 'ові', 'а', 'ом', 'ові', 'е'));
|
||||
$this->srule = 202;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
//2. Українські чоловічі імена, що в називному відмінку однини закінчуються на приголосний та -о , відмінюються як відповідні іменники ІІ відміни.
|
||||
elseif ($this->in($LastSymbol, $this->consonant . 'оь'))
|
||||
if ($this->RulesChain('man', array(5, 1, 2, 3, 4)))
|
||||
{
|
||||
$group = $this->detect2Group($this->secondName);
|
||||
$osnova = $this->getOsnova($this->secondName);
|
||||
//В іменах типу Антін, Нестір, Нечипір, Прокіп, Сидір, Тиміш, Федір голосний і виступає тільки в називному відмінку, у непрямих - о: Антона, Антонові
|
||||
//Чергування і -» о всередині
|
||||
$osLast = mb_substr($osnova, -1, 1, 'utf-8');
|
||||
if ($osLast != 'й' and mb_substr($osnova, -2, 1, 'utf-8') == 'і' and !in_array(mb_substr(mb_strtolower($osnova, 'utf-8'), -4, 4, 'utf-8'), array('світ', 'цвіт')) and !in_array($this->secondName, array('Гліб')))
|
||||
{
|
||||
$osnova = mb_substr($osnova, 0, mb_strlen($osnova, 'utf-8') - 2, 'utf-8') . 'о' . mb_substr($osnova, -1, 1, 'utf-8');
|
||||
}
|
||||
//Випадання букви е при відмінюванні слів типу Орел
|
||||
if (mb_substr($osnova, 0, 1, 'utf-8') == 'О' and $this->FirstLastVowel($osnova, $this->vowels . 'гк') == 'е' and $BeforeLast . $LastSymbol != 'сь')
|
||||
{
|
||||
|
||||
$delim = mb_strrpos($osnova, 'е', null, 'utf-8');
|
||||
$osnova = mb_substr($osnova, 0, $delim, 'utf-8') . mb_substr($osnova, $delim + 1, mb_strlen($osnova, 'utf-8') - $delim, 'utf-8');
|
||||
}
|
||||
if ($group == 1)
|
||||
{
|
||||
//Слова що закінчуються на ок
|
||||
if (mb_substr($this->secondName, -2, 2, 'utf-8') == 'ок')
|
||||
{
|
||||
$this->secondResult = $this->padeg(mb_substr($this->secondName, 0, (mb_strlen($this->secondName, 'utf-8') - 2), 'utf-8'), array('ка', 'кові', 'ка', 'ком', 'кові', 'че'));
|
||||
$this->srule = 30101;
|
||||
return true;
|
||||
}
|
||||
//Російські прізвища на ов, ев, єв
|
||||
elseif (in_array(mb_substr($this->secondName, -2, 2, 'utf-8'), array('ов', 'ев', 'єв')))
|
||||
{
|
||||
$this->secondResult = $this->padeg($osnova, array($osLast . 'а', $osLast . 'у', $osLast . 'а', $osLast . 'им', $osLast . 'у', $this->inverse2($osLast) . 'е'), true);
|
||||
$this->srule = 30102;
|
||||
return true;
|
||||
}
|
||||
//Російські прізвища на ін
|
||||
elseif (in_array(mb_substr($this->secondName, -2, 2, 'utf-8'), array('ін')))
|
||||
{
|
||||
$this->secondResult = $this->padeg($this->secondName, array('а', 'у', 'а', 'ом', 'у', 'е'));
|
||||
$this->srule = 30103;
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
//Тверда група
|
||||
$this->secondResult = $this->padeg($osnova, array($osLast . 'а', $osLast . 'ові', $osLast . 'а', $osLast . 'ом', $osLast . 'ові', $this->inverse2($osLast) . 'е'), true);
|
||||
$this->srule = 301;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
if ($group == 2)
|
||||
{
|
||||
//Мішана група
|
||||
$this->secondResult = $this->padeg($osnova, array('а', 'еві', 'а', 'ем', 'еві', 'е'));
|
||||
$this->srule = 302;
|
||||
return true;
|
||||
}
|
||||
if ($group == 3)
|
||||
{
|
||||
//М’яка група
|
||||
//Соловей
|
||||
if (mb_substr($this->secondName, -2, 2, 'utf-8') == 'ей' and $this->in(mb_substr($this->secondName, -3, 1, 'utf-8'), $this->gubni))
|
||||
{
|
||||
$osnova = mb_substr($this->secondName, 0, mb_strlen($this->secondName, 'utf-8') - 2, 'utf-8') . '’';
|
||||
$this->secondResult = $this->padeg($osnova, array('я', 'єві', 'я', 'єм', 'єві', 'ю'));
|
||||
$this->srule = 305;
|
||||
return true;
|
||||
}
|
||||
elseif ($BeforeLast == 'і' or $LastSymbol == 'й')
|
||||
{
|
||||
$this->secondResult = $this->padeg($this->secondName, array('я', 'єві', 'я', 'єм', 'єві', 'ю'), true);
|
||||
$this->srule = 304;
|
||||
return true;
|
||||
}
|
||||
//Слова що закінчуються на ець
|
||||
elseif (mb_substr($this->secondName, -3, 3, 'utf-8') == 'ець')
|
||||
{
|
||||
$this->secondResult = $this->padeg(mb_substr($this->secondName, 0, (mb_strlen($this->secondName, 'utf-8') - 3), 'utf-8') . 'ц', array('я', 'еві', 'я', 'ем', 'еві', 'ю'));
|
||||
$this->srule = 305;
|
||||
return true;
|
||||
}
|
||||
//Слова що закінчуються на єць яць
|
||||
elseif (in_array(mb_substr($this->secondName, -3, 3, 'utf-8'), array('єць', 'яць')))
|
||||
{
|
||||
$this->secondResult = $this->padeg(mb_substr($this->secondName, 0, (mb_strlen($this->secondName, 'utf-8') - 3), 'utf-8') . 'йц', array('я', 'еві', 'я', 'ем', 'еві', 'ю'));
|
||||
$this->srule = 306;
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
$this->secondResult = $this->padeg($osnova, array('я', 'еві', 'я', 'ем', 'еві', 'ю'));
|
||||
$this->srule = 303;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
elseif ($LastSymbol == 'і')
|
||||
{
|
||||
$this->secondResult = $this->padeg($this->secondName, array('их', 'им', 'их', 'ими', 'их', 'і'), true);
|
||||
$this->srule = 4;
|
||||
return true;
|
||||
$this->srule = $this->lastRule;
|
||||
$this->secondResult = $this->lastResult;
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -546,59 +566,12 @@ class NCLNameCaseUa extends NCLNameCaseCore implements NCLNameCaseInterface
|
||||
|
||||
protected function womanSecondName()
|
||||
{
|
||||
/*
|
||||
Українські чоловічі та жіночі імена, що в називному відмінку однини закінчуються на -а (-я), відмінються як відповідні іменники І відміни
|
||||
Примітка 1. Кінцеві приголосні основи г, к, х у жіночих іменах у давальному та місцевому відмінках однини перед закінченням -і змінюються на з, ц, с: Ольга - Ользі, Палажка - Палажці, Солоха - Солосі.
|
||||
Примітка 2. У жіночих іменах типу Одарка, Параска в родовому відмінку множини в кінці основи між приголосними з'являється звук о: Одарок, Парасок */
|
||||
//Последний символ
|
||||
$LastSymbol = mb_substr($this->secondName, -1, 1, 'utf-8');
|
||||
//Предпоследний символ
|
||||
$BeforeLast = mb_substr($this->secondName, -2, 1, 'utf-8');
|
||||
$this->setWorkingWord($this->secondName);
|
||||
|
||||
//Якщо закінчується на ніга -» нога
|
||||
if (mb_substr($this->secondName, -4, 4, 'utf-8') == 'ніга')
|
||||
if ($this->RulesChain('woman', array(3, 1)))
|
||||
{
|
||||
$osnova = mb_substr($this->secondName, 0, mb_strlen($this->secondName, 'utf-8') - 3, 'utf-8') . 'о';
|
||||
$this->secondResult = $this->padeg($osnova, array('ги', 'зі', 'гу', 'гою', 'зі', 'го'));
|
||||
$this->srule = 10101;
|
||||
return true;
|
||||
}
|
||||
//Ті що на ськ
|
||||
elseif ($LastSymbol == 'а' and (in_array(mb_substr($this->secondName, -3, 2, 'utf-8'), array('ов', 'ев', 'єв', 'ив', 'ьк', 'тн', 'рн', 'ин'))))
|
||||
{
|
||||
$this->secondResult = $this->padeg($this->secondName, array($BeforeLast . 'ої', $BeforeLast . 'ій', $BeforeLast . 'у', $BeforeLast . 'ою', $BeforeLast . 'ій', $BeforeLast . 'о'), false, true);
|
||||
$this->srule = 10102;
|
||||
return true;
|
||||
}
|
||||
//Останні літера або а або я
|
||||
elseif ($LastSymbol == 'а')
|
||||
{
|
||||
$this->secondResult = $this->padeg($this->secondName, array($BeforeLast . 'и', $BeforeLast . 'і', $BeforeLast . 'у', $BeforeLast . 'ою', $BeforeLast . 'і', $BeforeLast . 'о'), false, true);
|
||||
|
||||
$this->srule = 101;
|
||||
return true;
|
||||
}
|
||||
elseif ($LastSymbol == 'я')
|
||||
{
|
||||
//Донская
|
||||
if ($BeforeLast == 'а')
|
||||
{
|
||||
$this->secondResult = $this->padeg($this->secondName, array('ої', 'ій', 'ую', 'ою', 'ій', 'ая'), true, true);
|
||||
$this->srule = 10301;
|
||||
return true;
|
||||
}
|
||||
elseif ($this->in($BeforeLast, $this->vowels))
|
||||
{
|
||||
$this->secondResult = $this->padeg($this->secondName, array('ї', 'ї', 'ю', 'єю', 'ї', 'є'), true);
|
||||
$this->srule = 103;
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
$this->secondResult = $this->padeg($this->secondName, array($BeforeLast . 'і', $this->inverseGKH($BeforeLast) . 'і', $BeforeLast . 'ю', $BeforeLast . 'ею', $this->inverseGKH($BeforeLast) . 'і', $BeforeLast . 'е'), false, true);
|
||||
$this->srule = 102;
|
||||
return true;
|
||||
}
|
||||
$this->srule = $this->lastRule;
|
||||
$this->secondResult = $this->lastResult;
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -614,10 +587,11 @@ class NCLNameCaseUa extends NCLNameCaseCore implements NCLNameCaseInterface
|
||||
|
||||
protected function manFatherName()
|
||||
{
|
||||
$ending = mb_substr($this->fatherName, -2, 2, 'utf-8');
|
||||
if ($ending == 'ич' or $ending == 'іч')
|
||||
$this->setWorkingWord($this->fatherName);
|
||||
if ($this->in($this->Last(2), array('ич', 'іч')))
|
||||
{
|
||||
$this->fatherResult = $this->padeg($this->fatherName, array('а', 'у', 'а', 'ем', 'у', 'у'), false, false);
|
||||
$this->wordForms($this->workingWord, array('а', 'у', 'а', 'ем', 'у', 'у'));
|
||||
$this->fatherResult = $this->lastResult;
|
||||
return true;
|
||||
}
|
||||
else
|
||||
@ -635,9 +609,11 @@ class NCLNameCaseUa extends NCLNameCaseCore implements NCLNameCaseInterface
|
||||
|
||||
protected function womanFatherName()
|
||||
{
|
||||
if (mb_substr($this->fatherName, -3, 3, 'utf-8') == 'вна')
|
||||
$this->setWorkingWord($this->fatherName);
|
||||
if ($this->in($this->Last(3), array('вна')))
|
||||
{
|
||||
$this->fatherResult = $this->padeg($this->fatherName, array('и', 'і', 'у', 'ою', 'і', 'о'), true, false);
|
||||
$this->wordForms($this->workingWord, array('и', 'і', 'у', 'ою', 'і', 'о'), 1);
|
||||
$this->fatherResult = $this->lastResult;
|
||||
return true;
|
||||
}
|
||||
else
|
||||
@ -780,7 +756,7 @@ class NCLNameCaseUa extends NCLNameCaseCore implements NCLNameCaseInterface
|
||||
}
|
||||
|
||||
//Похоже на имя
|
||||
if (in_array($LastThree, array('тин' /*{endings_sirname3}*/)) or in_array($LastFour, array('ьмич', 'юбов', 'івна', 'явка', 'орив', 'кіян' /*{endings_sirname4}*/)))
|
||||
if (in_array($LastThree, array('тин' /* {endings_sirname3} */)) or in_array($LastFour, array('ьмич', 'юбов', 'івна', 'явка', 'орив', 'кіян' /* {endings_sirname4} */)))
|
||||
{
|
||||
$first+=0.5;
|
||||
}
|
||||
@ -792,17 +768,17 @@ class NCLNameCaseUa extends NCLNameCaseCore implements NCLNameCaseInterface
|
||||
}
|
||||
|
||||
//похоже на фамилию
|
||||
if (in_array($LastTwo, array('ов', 'ін', 'ев', 'єв', 'ий', 'ин', 'ой', 'ко', 'ук', 'як', 'ца', 'их', 'ик', 'ун', 'ок', 'ша', 'ая', 'га', 'єк', 'аш', 'ив', 'юк', 'ус', 'це', 'ак', 'бр', 'яр', 'іл', 'ів', 'ич', 'сь', 'ей', 'нс', 'яс', 'ер', 'ай', 'ян', 'ах', 'ць', 'ющ', 'іс', 'ач', 'уб', 'ох', 'юх','ут','ча','ул','вк','зь', 'уц', 'їн' /*{endings_name2}*/)))
|
||||
if (in_array($LastTwo, array('ов', 'ін', 'ев', 'єв', 'ий', 'ин', 'ой', 'ко', 'ук', 'як', 'ца', 'их', 'ик', 'ун', 'ок', 'ша', 'ая', 'га', 'єк', 'аш', 'ив', 'юк', 'ус', 'це', 'ак', 'бр', 'яр', 'іл', 'ів', 'ич', 'сь', 'ей', 'нс', 'яс', 'ер', 'ай', 'ян', 'ах', 'ць', 'ющ', 'іс', 'ач', 'уб', 'ох', 'юх', 'ут', 'ча', 'ул', 'вк', 'зь', 'уц', 'їн' /* {endings_name2} */)))
|
||||
{
|
||||
$second+=0.4;
|
||||
}
|
||||
|
||||
if (in_array($LastThree, array('ова', 'ева', 'єва', 'тих', 'рик', 'вач', 'аха', 'шен', 'мей', 'арь', 'вка', 'шир', 'бан', 'чий', 'іна', 'їна', 'ька', 'ань', 'ива', 'аль','ура','ран','ало','ола','кур','оба','оль','нта','зій','ґан','іло','шта', 'юпа', 'рна', 'бла', 'еїн', 'има', 'мар', 'кар', 'оха', 'чур', 'ниш', 'ета', 'тна', 'зур', 'нір', 'йма', 'орж', 'рба', 'іла', 'лас', 'дід', 'роз', 'аба', 'лест', 'мара', 'обка', 'рока', 'сика', 'одна', 'нчар', 'вата', 'ндар', 'грій' /*{endings_name3}*/)))
|
||||
if (in_array($LastThree, array('ова', 'ева', 'єва', 'тих', 'рик', 'вач', 'аха', 'шен', 'мей', 'арь', 'вка', 'шир', 'бан', 'чий', 'іна', 'їна', 'ька', 'ань', 'ива', 'аль', 'ура', 'ран', 'ало', 'ола', 'кур', 'оба', 'оль', 'нта', 'зій', 'ґан', 'іло', 'шта', 'юпа', 'рна', 'бла', 'еїн', 'има', 'мар', 'кар', 'оха', 'чур', 'ниш', 'ета', 'тна', 'зур', 'нір', 'йма', 'орж', 'рба', 'іла', 'лас', 'дід', 'роз', 'аба', 'лест', 'мара', 'обка', 'рока', 'сика', 'одна', 'нчар', 'вата', 'ндар', 'грій' /* {endings_name3} */)))
|
||||
{
|
||||
$second+=0.4;
|
||||
}
|
||||
|
||||
if (in_array($LastFour, array('ьник', 'нчук', 'тник', 'кирь', 'ский', 'шена', 'шина', 'вина', 'нина', 'гана', 'гана', 'хній', 'зюба', 'орош', 'орон', 'сило', 'руба' /*{endings_name4}*/)))
|
||||
if (in_array($LastFour, array('ьник', 'нчук', 'тник', 'кирь', 'ский', 'шена', 'шина', 'вина', 'нина', 'гана', 'гана', 'хній', 'зюба', 'орош', 'орон', 'сило', 'руба' /* {endings_name4} */)))
|
||||
{
|
||||
$second+=0.4;
|
||||
}
|
||||
|
@ -2982,7 +2982,7 @@ class NCLNameCaseUaTest extends PHPUnit_Framework_TestCase
|
||||
$this->object->setFirstName('Соловей');
|
||||
$this->object->setGender(1);
|
||||
|
||||
$this->assertEquals(explode(',','Соловей,Солов`я,Солов`єві,Солов`я,Солов`єм,Солов`єві,Солов`ю'), $this->object->getFirstNameCase());
|
||||
$this->assertEquals(explode(',','Соловей,Солов’я,Солов’єві,Солов’я,Солов’єм,Солов’єві,Солов’ю'), $this->object->getFirstNameCase());
|
||||
}
|
||||
public function testNameMan422()
|
||||
{
|
||||
|
@ -1204,7 +1204,7 @@ class NCLNameCaseUaTest extends PHPUnit_Framework_TestCase
|
||||
$this->object->setFirstName('Любов');
|
||||
$this->object->setGender(2);
|
||||
|
||||
$this->assertEquals(explode(',','Любов,Любові,Любові,Любов,Любов`ю,Любові,Любове'), $this->object->getFirstNameCase());
|
||||
$this->assertEquals(explode(',','Любов,Любові,Любові,Любов,Любов’ю,Любові,Любове'), $this->object->getFirstNameCase());
|
||||
}
|
||||
public function testNameWoman168()
|
||||
{
|
||||
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -26,7 +26,7 @@ class TestGeneratorDB
|
||||
//$this->resultArr=file('Names/'.$gender.'_full_result.txt');
|
||||
$this->count = 0;
|
||||
$fnewname = $fname;
|
||||
if($fnewname=='Sirnames')
|
||||
if ($fnewname == 'Sirnames')
|
||||
{
|
||||
$fnewname = 'second';
|
||||
}
|
||||
@ -38,7 +38,7 @@ class TestGeneratorDB
|
||||
else
|
||||
{
|
||||
$this->gender = 2;
|
||||
$this->dbTable = 'girl' . strtolower($fnewname) ;
|
||||
$this->dbTable = 'girl' . strtolower($fnewname);
|
||||
}
|
||||
$this->resultArr = mysql_query("SELECT * FROM {$this->dbTable}");
|
||||
//foreach ($this->resultArr as $key=>$value)
|
||||
@ -53,8 +53,10 @@ class TestGeneratorDB
|
||||
$secondRes = array();
|
||||
$fatherRes = array();
|
||||
$secondRes = $fatherRes = $firstRes = explode('#', $row['nameCase']);
|
||||
|
||||
$this->generateTest($firstRes, $secondRes, $fatherRes);
|
||||
if ($row['nameCase'])
|
||||
{
|
||||
$this->generateTest($firstRes, $secondRes, $fatherRes);
|
||||
}
|
||||
}
|
||||
//}
|
||||
$res = str_replace('{% tests %}', $this->tests, $this->maintemplate);
|
||||
@ -66,9 +68,9 @@ class TestGeneratorDB
|
||||
{
|
||||
$tpl = $this->testtemplate;
|
||||
$tpl = str_replace('{% id %}', $this->count, $tpl);
|
||||
$tpl=str_replace('{% second %}', $secondRes[0], $tpl);
|
||||
$tpl = str_replace('{% second %}', $secondRes[0], $tpl);
|
||||
$tpl = str_replace('{% first %}', $firstRes[0], $tpl);
|
||||
$tpl=str_replace('{% father %}', $fatherRes[0], $tpl);
|
||||
$tpl = str_replace('{% father %}', $fatherRes[0], $tpl);
|
||||
$tpl = str_replace('{% gender %}', $this->gender, $tpl);
|
||||
$tpl = str_replace('{% firstOK %}', implode(',', $firstRes), $tpl);
|
||||
$tpl = str_replace('{% secondOK %}', implode(',', $secondRes), $tpl);
|
||||
|
@ -3,6 +3,6 @@
|
||||
header('Content-type: text/html; charset=utf-8');
|
||||
require '../Library/NCL.NameCase.ua.php';
|
||||
$ob = new NCLNameCaseUa;
|
||||
print_r($ob->qSecondName('Донськая',null,2));
|
||||
print_r($ob->qSecondName('Сорока',null,2));
|
||||
echo $ob->getSecondNameRule();
|
||||
?>
|
||||
|
Loading…
Reference in New Issue
Block a user