[0.4] Измениние ядра библиотеки

This commit is contained in:
Andriy Chaika 2011-07-05 16:01:19 +03:00
parent ea0a210769
commit a0765b9fd8
7 changed files with 294 additions and 192 deletions

View File

@ -10,7 +10,7 @@
* @version 0.1.2 05.05.2011
*
*/
require_once dirname(__FILE__) . '/NCL.NameCase.core.php';
require_once dirname(__FILE__) . '/NCL/NCLNameCaseCore.php';
class NCLNameCaseRu extends NCLNameCaseCore implements NCLNameCaseInterface
{

View File

@ -10,7 +10,7 @@
* @version 0.4 05.07.2011
*
*/
require_once dirname(__FILE__) . '/NCL.NameCase.core.php';
require_once dirname(__FILE__) . '/NCL/NCLNameCaseCore.php';
class NCLNameCaseUa extends NCLNameCaseCore implements NCLNameCaseInterface
{
@ -96,10 +96,10 @@ class NCLNameCaseUa extends NCLNameCaseCore implements NCLNameCaseInterface
$osnova = $word;
$stack = array();
//Ріжемо слово поки не зустрінемо приголосний і записуемо в стек всі голосні які зустріли
while ($this->in($this->substr($osnova, -1, 1), $this->vowels . 'ь'))
while ($this->in(NCLStr::substr($osnova, -1, 1), $this->vowels . 'ь'))
{
$stack[] = $this->substr($osnova, -1, 1);
$osnova = $this->substr($osnova, 0, $this->strlen($osnova) - 1);
$stack[] = NCLStr::substr($osnova, -1, 1);
$osnova = NCLStr::substr($osnova, 0, NCLStr::strlen($osnova) - 1);
}
$stacksize = count($stack);
$Last = 'Z'; //нульове закінчення
@ -108,7 +108,7 @@ class NCLNameCaseUa extends NCLNameCaseCore implements NCLNameCaseInterface
$Last = $stack[count($stack) - 1];
}
$osnovaEnd = $this->substr($osnova, -1, 1);
$osnovaEnd = NCLStr::substr($osnova, -1, 1);
if ($this->in($osnovaEnd, $this->neshyplyachi) and !$this->in($Last, $this->myaki))
{
return 1;
@ -131,10 +131,10 @@ class NCLNameCaseUa extends NCLNameCaseCore implements NCLNameCaseInterface
private function FirstLastVowel($word, $vowels)
{
$length = $this->strlen($word);
$length = NCLStr::strlen($word);
for ($i = $length - 1; $i > 0; $i--)
{
$char = $this->substr($word, $i, 1);
$char = NCLStr::substr($word, $i, 1);
if ($this->in($char, $vowels))
{
return $char;
@ -152,9 +152,9 @@ class NCLNameCaseUa extends NCLNameCaseCore implements NCLNameCaseInterface
{
$osnova = $word;
//Ріжемо слово поки не зустрінемо приголосний
while ($this->in($this->substr($osnova, -1, 1), $this->vowels . 'ь'))
while ($this->in(NCLStr::substr($osnova, -1, 1), $this->vowels . 'ь'))
{
$osnova = $this->substr($osnova, 0, $this->strlen($osnova) - 1);
$osnova = NCLStr::substr($osnova, 0, NCLStr::strlen($osnova) - 1);
}
return $osnova;
}
@ -219,9 +219,9 @@ class NCLNameCaseUa extends NCLNameCaseCore implements NCLNameCaseInterface
else
{
$osnova = $this->workingWord;
if ($this->substr($osnova, -2, 1) == 'і')
if (NCLStr::substr($osnova, -2, 1) == 'і')
{
$osnova = $this->substr($osnova, 0, $this->strlen($osnova) - 2) . 'о' . $this->substr($osnova, -1, 1);
$osnova = NCLStr::substr($osnova, 0, NCLStr::strlen($osnova) - 2) . 'о' . NCLStr::substr($osnova, -1, 1);
}
$this->wordForms($osnova, array('а', 'ові', 'а', 'ом', 'ові', 'е'));
$this->Rule(202);
@ -248,18 +248,18 @@ class NCLNameCaseUa extends NCLNameCaseCore implements NCLNameCaseInterface
//В іменах типу Антін, Нестір, Нечипір, Прокіп, Сидір, Тиміш, Федір голосний і виступає тільки в
//називному відмінку, у непрямих - о: Антона, Антонові
//Чергування іо всередині
$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, 'Гліб'))
$osLast = NCLStr::substr($osnova, -1, 1);
if ($osLast != 'й' and NCLStr::substr($osnova, -2, 1) == 'і' and !$this->in(NCLStr::substr(NCLStr::strtolower($osnova), -4, 4), array('світ', 'цвіт')) and !$this->inNames($this->workingWord, 'Гліб'))
{
$osnova = $this->substr($osnova, 0, $this->strlen($osnova) - 2) . 'о' . $this->substr($osnova, -1, 1);
$osnova = NCLStr::substr($osnova, 0, NCLStr::strlen($osnova) - 2) . 'о' . NCLStr::substr($osnova, -1, 1);
}
//Випадання букви е при відмінюванні слів типу Орел
if ($this->substr($osnova, 0, 1) == 'О' and $this->FirstLastVowel($osnova, $this->vowels . 'гк') == 'е' and $this->Last(2) != 'сь')
if (NCLStr::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);
$delim = NCLStr::strrpos($osnova, 'е');
$osnova = NCLStr::substr($osnova, 0, $delim) . NCLStr::substr($osnova, $delim + 1, NCLStr::strlen($osnova) - $delim);
}
@ -307,7 +307,7 @@ class NCLNameCaseUa extends NCLNameCaseCore implements NCLNameCaseInterface
//Соловей
if ($this->Last(2) == 'ей' and $this->in($this->Last(3, 1), $this->gubni))
{
$osnova = $this->substr($this->workingWord, 0, $this->strlen($this->workingWord) - 2) . '';
$osnova = NCLStr::substr($this->workingWord, 0, NCLStr::strlen($this->workingWord) - 2) . '';
$this->wordForms($osnova, array('я', 'єві', 'я', 'єм', 'єві', 'ю'));
$this->Rule(303);
return true;
@ -391,7 +391,7 @@ class NCLNameCaseUa extends NCLNameCaseCore implements NCLNameCaseInterface
//Якщо закінчується на ніга -» нога
if ($this->Last(4) == 'ніга')
{
$osnova = $this->substr($this->workingWord, 0, $this->strlen($this->workingWord) - 3) . 'о';
$osnova = NCLStr::substr($this->workingWord, 0, NCLStr::strlen($this->workingWord) - 3) . 'о';
$this->wordForms($osnova, array('ги', 'зі', 'гу', 'гою', 'зі', 'го'));
$this->Rule(101);
return true;
@ -436,8 +436,8 @@ class NCLNameCaseUa extends NCLNameCaseCore implements NCLNameCaseInterface
$osnova = $this->getOsnova($this->firstName);
$apostrof = '';
$duplicate = '';
$osLast = $this->substr($osnova, -1, 1);
$osBeforeLast = $this->substr($osnova, -2, 1);
$osLast = NCLStr::substr($osnova, -1, 1);
$osBeforeLast = NCLStr::substr($osnova, -2, 1);
//Чи треба ставити апостроф
if ($this->in($osLast, 'мвпбф') and ($this->in($osBeforeLast, $this->vowels)))
@ -739,10 +739,7 @@ class NCLNameCaseUa extends NCLNameCaseCore implements NCLNameCaseInterface
protected function detectNamePart($namepart)
{
$LastSymbol = mb_substr($namepart, -1, 1, 'utf-8');
$LastTwo = mb_substr($namepart, -2, 2, 'utf-8');
$LastThree = mb_substr($namepart, -3, 3, 'utf-8');
$LastFour = mb_substr($namepart, -4, 4, 'utf-8');
$this->setWorkingWord($namepart);
//Считаем вероятность
$first = 0;
@ -750,35 +747,35 @@ class NCLNameCaseUa extends NCLNameCaseCore implements NCLNameCaseInterface
$father = 0;
//если смахивает на отчество
if (in_array($LastThree, array('вна', 'чна', 'ліч')) or in_array($LastFour, array('ьмич', 'ович')))
if ($this->in($this->Last(3), array('вна', 'чна', 'ліч')) or $this->in($this->Last(4), array('ьмич', 'ович')))
{
$father+=3;
}
//Похоже на имя
if (in_array($LastThree, array('тин' /* {endings_sirname3} */)) or in_array($LastFour, array('ьмич', 'юбов', 'івна', 'явка', 'орив', 'кіян' /* {endings_sirname4} */)))
if ($this->in($this->Last(3), array('тин' /* {endings_sirname3} */)) or $this->in($this->Last(4), array('ьмич', 'юбов', 'івна', 'явка', 'орив', 'кіян' /* {endings_sirname4} */)))
{
$first+=0.5;
}
//Исключения
if (in_array($namepart, array('Лев', 'Гаїна', 'Афіна', 'Антоніна', 'Ангеліна', 'Альвіна', 'Альбіна', 'Аліна', 'Павло', 'Олесь')))
if ($this->inNames($namepart, array('Лев', 'Гаїна', 'Афіна', 'Антоніна', 'Ангеліна', 'Альвіна', 'Альбіна', 'Аліна', 'Павло', 'Олесь')))
{
$first+=10;
}
//похоже на фамилию
if (in_array($LastTwo, array('ов', 'ін', 'ев', 'єв', 'ий', 'ин', 'ой', 'ко', 'ук', 'як', 'ца', 'их', 'ик', 'ун', 'ок', 'ша', 'ая', 'га', 'єк', 'аш', 'ив', 'юк', 'ус', 'це', 'ак', 'бр', 'яр', 'іл', 'ів', 'ич', 'сь', 'ей', 'нс', 'яс', 'ер', 'ай', 'ян', 'ах', 'ць', 'ющ', 'іс', 'ач', 'уб', 'ох', 'юх', 'ут', 'ча', 'ул', 'вк', 'зь', 'уц', 'їн' /* {endings_name2} */)))
if ($this->in($this->Last(2), array('ов', 'ін', 'ев', 'єв', 'ий', 'ин', 'ой', 'ко', 'ук', 'як', 'ца', 'их', 'ик', 'ун', 'ок', 'ша', 'ая', 'га', 'єк', 'аш', 'ив', 'юк', 'ус', 'це', 'ак', 'бр', 'яр', 'іл', 'ів', 'ич', 'сь', 'ей', 'нс', 'яс', 'ер', 'ай', 'ян', 'ах', 'ць', 'ющ', 'іс', 'ач', 'уб', 'ох', 'юх', 'ут', 'ча', 'ул', 'вк', 'зь', 'уц', 'їн' /* {endings_name2} */)))
{
$second+=0.4;
}
if (in_array($LastThree, array('ова', 'ева', 'єва', 'тих', 'рик', 'вач', 'аха', 'шен', 'мей', 'арь', 'вка', 'шир', 'бан', 'чий', 'іна', 'їна', 'ька', 'ань', 'ива', 'аль', 'ура', 'ран', 'ало', 'ола', 'кур', 'оба', 'оль', 'нта', 'зій', 'ґан', 'іло', 'шта', 'юпа', 'рна', 'бла', 'еїн', 'има', 'мар', 'кар', 'оха', 'чур', 'ниш', 'ета', 'тна', 'зур', 'нір', 'йма', 'орж', 'рба', 'іла', 'лас', 'дід', 'роз', 'аба', 'лест', 'мара', 'обка', 'рока', 'сика', 'одна', 'нчар', 'вата', 'ндар', 'грій' /* {endings_name3} */)))
if ($this->in($this->Last(3), array('ова', 'ева', 'єва', 'тих', 'рик', 'вач', 'аха', 'шен', 'мей', 'арь', 'вка', 'шир', 'бан', 'чий', 'іна', 'їна', 'ька', 'ань', 'ива', 'аль', 'ура', 'ран', 'ало', 'ола', 'кур', 'оба', 'оль', 'нта', 'зій', 'ґан', 'іло', 'шта', 'юпа', 'рна', 'бла', 'еїн', 'има', 'мар', 'кар', 'оха', 'чур', 'ниш', 'ета', 'тна', 'зур', 'нір', 'йма', 'орж', 'рба', 'іла', 'лас', 'дід', 'роз', 'аба', 'лест', 'мара', 'обка', 'рока', 'сика', 'одна', 'нчар', 'вата', 'ндар', 'грій' /* {endings_name3} */)))
{
$second+=0.4;
}
if (in_array($LastFour, array('ьник', 'нчук', 'тник', 'кирь', 'ский', 'шена', 'шина', 'вина', 'нина', 'гана', 'гана', 'хній', 'зюба', 'орош', 'орон', 'сило', 'руба' /* {endings_name4} */)))
if ($this->in($this->Last(4), array('ьник', 'нчук', 'тник', 'кирь', 'ский', 'шена', 'шина', 'вина', 'нина', 'гана', 'гана', 'хній', 'зюба', 'орош', 'орон', 'сило', 'руба' /* {endings_name4} */)))
{
$second+=0.4;
}

39
Library/NCL/NCL.php Normal file
View File

@ -0,0 +1,39 @@
<?php
/**
* Description of NCL
*
* @author seagull
*/
class NCL
{
/**
* @static integer
*/
static $MAN = 1;
/**
* @static integer
*/
static $WOMAN = 2;
/**
* @static integer
* Падежи
*/
static $IMENITLN = 0;
static $RODITLN = 1;
static $DATELN = 2;
static $VINITELN = 3;
static $TVORITELN = 4;
static $PREDLOGN = 5;
static $UaNazyvnyi = 0;
static $UaRodovyi = 1;
static $UaDavalnyi = 2;
static $UaZnahidnyi = 3;
static $UaOrudnyi = 4;
static $UaMiszevyi = 5;
static $UaKlychnyi = 6;
}
?>

View File

@ -1,99 +1,24 @@
<?php
/*
* NCL NameCase Core
*
* Клас, которые содержит базовые функции склонения по падежам.
*
* @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
*
*/
interface NCLNameCaseInterface
if(!defined('NCL_DIR'))
{
public function setFirstName($firstname="");
public function setSecondName($secondname="");
public function setFatherName($fathername="");
public function setGender($gender=0);
public function setFullName($secondName="", $firstName="", $fatherName="");
public function setName($firstname="");
public function setLastName($secondname="");
public function setSirname($secondname="");
public function genderAutoDetect();
public function splitFullName($fullname);
public function getFirstNameCase($number=null);
public function getSecondNameCase($number=null);
public function getFatherNameCase($number=null);
public function qFirstName($firstName, $CaseNumber=null, $gender=0);
public function qSecondName($secondName, $CaseNumber=null, $gender=0);
public function qFatherName($fatherName, $CaseNumber=null, $gender=0);
public function getFormattedArray($format);
public function getFormatted($caseNum=0, $format="S N F");
public function qFullName($secondName="", $firstName="", $fatherName="", $gender=0, $caseNum=0, $format="S N F");
public function getFirstNameRule();
public function getSecondNameRule();
public function q($fullname, $caseNum=null, $gender=null);
define('NCL_DIR', dirname(__FILE__));
}
class NCL
{
/*
* @static integer
*/
static $MAN = 1;
/*
* @static integer
*/
static $WOMAN = 2;
/*
* @static integer
* Падежи
*/
static $IMENITLN = 0;
static $RODITLN = 1;
static $DATELN = 2;
static $VINITELN = 3;
static $TVORITELN = 4;
static $PREDLOGN = 5;
static $UaNazyvnyi = 0;
static $UaRodovyi = 1;
static $UaDavalnyi = 2;
static $UaZnahidnyi = 3;
static $UaOrudnyi = 4;
static $UaMiszevyi = 5;
static $UaKlychnyi = 6;
}
require_once NCL_DIR . '/NCL.php';
require_once NCL_DIR . '/NCLStr.php';
require_once NCL_DIR . '/NCLNameCaseInterface.php';
require_once NCL_DIR . '/NCLNameCaseWord.php';
class NCLNameCaseCore extends NCL
{
/*
/**
* Список всех слов
* @var array
*/
protected $words = array();
/** DEPRECATED
* Имя для склонения
* @var string
*/
@ -101,21 +26,21 @@ class NCLNameCaseCore extends NCL
protected $firstName = "";
/*
/** DEPRECATED
* Фамилия для склонения
* @var string
*/
protected $secondName = "";
/*
/** DEPRECATED
* Отчество для склонения
* @var string
*/
protected $fatherName = "";
/*
/**
* @var integer
* Пол человека
* <li>0 - не известно</li>
@ -124,20 +49,20 @@ class NCLNameCaseCore extends NCL
*/
protected $gender = 0;
/*
/** DEPRECATED
* @var array()
* Результат склонения имени
*/
protected $firstResult = array();
/*
/** DEPRECATED
* @var array()
* Результат склонения фамилии
*/
protected $secondResult = array();
/*
/** DEPRECATED
* @var array()
* Результат склонения отчества
*/
@ -149,27 +74,19 @@ class NCLNameCaseCore extends NCL
*/
protected $error = "";
/*
/** DEPRECATED
* @var integer
* Номер правила по которому склоняется имя
*/
protected $frule = "";
/*
/** DEPRECATED
* @var integer
* Номер правила по которому не склоняется фамилия
*/
protected $srule = "";
/*
* Кодировка библиотеки
* @var string
*/
protected $charset = 'utf-8';
/*
* Слово с которым работаем сейчас
* @var string
@ -209,55 +126,9 @@ class NCLNameCaseCore extends NCL
{
$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);
}
/*
* Установить текущее слово
*/
@ -292,7 +163,7 @@ class NCLNameCaseCore extends NCL
//Проверяем кеш
if (!isset($this->workindLastCache[$length][$stopAfter]))
{
$this->workindLastCache[$length][$stopAfter] = $this->substr($this->workingWord, -$length, $cut);
$this->workindLastCache[$length][$stopAfter] = NCLStr::substr($this->workingWord, -$length, $cut);
}
return $this->workindLastCache[$length][$stopAfter];
}
@ -361,7 +232,7 @@ class NCLNameCaseCore extends NCL
}
else
{
if (!$letter or $this->strpos($string, $letter) === false)
if (!$letter or NCLStr::strpos($string, $letter) === false)
{
return false;
}
@ -387,7 +258,7 @@ class NCLNameCaseCore extends NCL
foreach ($names as $name)
{
if ($this->strtolower($nameNeedle) == $this->strtolower($name))
if (NCLStr::strtolower($nameNeedle) == NCLStr::strtolower($name))
{
return true;
}
@ -410,7 +281,7 @@ class NCLNameCaseCore extends NCL
//Создаем массив с именительный падежом
$result = array($word);
//Убираем в окончание лишние буквы
$word = $this->substr($word, 0, $this->strlen($word) - $replaceLast);
$word = NCLStr::substr($word, 0, NCLStr::strlen($word) - $replaceLast);
//Добавляем окончания
for ($padegIndex = 1; $padegIndex < $this->CaseCount; $padegIndex++)
@ -489,7 +360,7 @@ class NCLNameCaseCore extends NCL
* Установка пола
*
* @param $gender
* - null - не определено
* - 0 - не определено
* - NCL::$MAN - мужчина
* - NCL::$WOMAN - женщина
* @return void
@ -1070,4 +941,4 @@ class NCLNameCaseCore extends NCL
}
?>
?>

View File

@ -0,0 +1,55 @@
<?php
/**
*
* @author seagull
*/
interface NCLNameCaseInterface
{
public function setFirstName($firstname="");
public function setSecondName($secondname="");
public function setFatherName($fathername="");
public function setGender($gender=0);
public function setFullName($secondName="", $firstName="", $fatherName="");
public function setName($firstname="");
public function setLastName($secondname="");
public function setSirname($secondname="");
public function genderAutoDetect();
public function splitFullName($fullname);
public function getFirstNameCase($number=null);
public function getSecondNameCase($number=null);
public function getFatherNameCase($number=null);
public function qFirstName($firstName, $CaseNumber=null, $gender=0);
public function qSecondName($secondName, $CaseNumber=null, $gender=0);
public function qFatherName($fatherName, $CaseNumber=null, $gender=0);
public function getFormattedArray($format);
public function getFormatted($caseNum=0, $format="S N F");
public function qFullName($secondName="", $firstName="", $fatherName="", $gender=0, $caseNum=0, $format="S N F");
public function getFirstNameRule();
public function getSecondNameRule();
public function q($fullname, $caseNum=null, $gender=null);
}
?>

View File

@ -0,0 +1,47 @@
<?php
/**
* Description of NCL
*
* @author seagull
*/
class NCLNameCaseWord
{
/**
* Тип текущей записи (Фамилия/Имя/Отчество)
* @var string
*/
private $namePart = null;
/**
* Вероятность, что мужчина
* @var int
*/
private $genderMan = 0;
/**
* Вероятность, что женщина
* @var int
*/
private $genderWoman = 0;
private $letterMask = '';
/**
* @var NCLNameCaseCore $core
*/
private $core;
/**
* Создать запись из слова
* @param string $word
* @param NCLNameCaseCore $core
*/
public function __construct($word, $core)
{
$this->core = $core;
}
}
?>

93
Library/NCL/NCLStr.php Normal file
View File

@ -0,0 +1,93 @@
<?php
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
/**
* Description of NCLStr
*
* @author seagull
*/
class NCLStr
{
static $charset = 'utf-8';
/*
* Обертка для substr
*/
static function substr($str, $start, $length=null)
{
return mb_substr($str, $start, $length, NCLStr::$charset);
}
/*
* Обертка для strpos
*/
static function strpos($haystack, $needle, $offset = 0)
{
return mb_strpos($haystack, $needle, $offset, NCLStr::$charset);
}
/*
* Обертка для strlen
*/
static function strlen($str)
{
return mb_strlen($str, NCLStr::$charset);
}
/*
* Обертка для strtolower
*/
static function strtolower($str)
{
return mb_strtolower($str, NCLStr::$charset);
}
static function strtoupper($str)
{
return mb_strtoupper($str, NCLStr::$charset);
}
/**
* Обертка для strrpos
* @param type $haystack
* @param type $needle
* @param type $offset
* @return type
*/
static function strrpos($haystack, $needle, $offset=null)
{
return mb_strrpos($haystack, $needle, $offset, NCLStr::$charset);
}
static function isLowerCase($phrase)
{
return ($phrase == NCLStr::strtolower($phrase));
}
static function splitLetters($phrase)
{
$resultArr = array();
$stop = NCLStr::strlen($phrase);
for ($idx = 0; $idx < $stop; $idx++)
{
$resultArr[] = NCLStr::substr($phrase, $idx, 1);
}
return $resultArr;
}
static function explode($pattern, $string)
{
return mb_split($pattern, $string);
}
}
?>