[0.4] Рефакторинг правил склониния украинского языка

This commit is contained in:
Andriy Chaika 2011-07-05 14:32:28 +03:00
parent f1063e9bf4
commit ea0a210769
8 changed files with 2060 additions and 2990 deletions

View File

@ -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

View File

@ -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;
}

View File

@ -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()
{

View File

@ -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

View File

@ -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);

View File

@ -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();
?>