UNPKG

name-case-lib-port

Version:

Port of NameCaseLib for PHP. Склонение ФИО русского и украинского языков

796 lines (684 loc) 40.1 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); var _NCLNameCaseCore2 = require('./NCL/NCLNameCaseCore.js'); var _NCLNameCaseCore3 = _interopRequireDefault(_NCLNameCaseCore2); var _NCLNameCaseWord = require('./NCL/NCLNameCaseWord.js'); var _NCLNameCaseWord2 = _interopRequireDefault(_NCLNameCaseWord); var _NCLStr = require('./NCL/NCLStr.js'); var _NCLStr2 = _interopRequireDefault(_NCLStr); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } /** * @license Dual licensed under the MIT or GPL Version 2 licenses. * @package NameCaseLib */ var math_min = require('locutus/php/math/min'); var math_max = require('locutus/php/math/max'); /** * <b>NCL NameCase Ukranian Language</b> * * Украинские правила склонений ФИО. * Правила определения пола человека по ФИО для украинского языка * Система разделения фамилий имен и отчеств для украинского языка * * @author Андрей Чайка <bymer3@gmail.com> * @version 0.4.1 * @package NameCaseLib */ var NCLNameCaseUa = function (_NCLNameCaseCore) { _inherits(NCLNameCaseUa, _NCLNameCaseCore); function NCLNameCaseUa() { _classCallCheck(this, NCLNameCaseUa); /** * Версия языкового файла * @var string */ var _this = _possibleConstructorReturn(this, (NCLNameCaseUa.__proto__ || Object.getPrototypeOf(NCLNameCaseUa)).call(this)); _this._languageBuild = '11071222'; /** * Количество падежей в языке * @var int */ _this.CaseCount = 7; /** * Список гласных украинского языка * @var string */ _this.vowels = 'аеиоуіїєюя'; /** * Список согласных украинского языка * @var string */ _this.consonant = "бвгджзйклмнпрстфхцчшщ"; /** * Українські шиплячі приголосні * @var string */ _this.shyplyachi = "жчшщ"; /** * Українські нешиплячі приголосні * @var string */ _this.neshyplyachi = "бвгдзклмнпрстфхц"; /** * Українські завжди м’які звуки * @var string */ _this.myaki = 'ьюяєї'; /** * Українські губні звуки * @var string */ _this.gubni = 'мвпбф'; return _this; } /** * Чергування українських приголосних * Чергування г к х —» з ц с * @param string $letter літера, яку необхідно перевірити на чергування * @return string літера, де вже відбулося чергування */ _createClass(NCLNameCaseUa, [{ key: 'inverseGKH', value: function inverseGKH(letter) { switch (letter) { case 'г': return 'з'; case 'к': return 'ц'; case 'х': return 'с'; } return letter; } /** * Перевіряє чи символ є апострофом чи не є * @param string(1) $char симпол для перевірки * @return bool true якщо символ є апострофом */ }, { key: 'isApostrof', value: function isApostrof(char) { if (this.in(char, ' ' + this.consonant + this.vowels)) { return false; } return true; } /** * Чергування українських приголосних * Чергування г к —» ж ч * @param string $letter літера, яку необхідно перевірити на чергування * @return string літера, де вже відбулося чергування */ }, { key: 'inverse2', value: function inverse2(letter) { switch (letter) { case 'к': return 'ч'; case 'г': return 'ж'; } return letter; } /** * <b>Визначення групи для іменників 2-ї відміни</b> * 1 - тверда * 2 - мішана * 3 - м’яка * * <b>Правило:</b> * - Іменники з основою на твердий нешиплячий належать до твердої групи: * береза, дорога, Дніпро, шлях, віз, село, яблуко. * - Іменники з основою на твердий шиплячий належать до мішаної групи: * пожеж-а, пущ-а, тиш-а, алич-а, вуж, кущ, плющ, ключ, плече, прізвище. * - Іменники з основою на будь-який м'який чи пом'якше­ний належать до м'якої групи: * земля [земл'а], зоря [зор'а], армія [арм'ійа], сім'я [с'імйа], серпень, фахівець, * трамвай, су­зір'я [суз'ірйа], насіння [насін'н'а], узвишшя Іузвиш'ш'а * @param string $word іменник, групу якого необхідно визначити * @return int номер групи іменника */ }, { key: 'detect2Group', value: function detect2Group(word) { var osnova = word; var stack = []; //Ріжемо слово поки не зустрінемо приголосний і записуемо в стек всі голосні які зустріли while (this.in(_NCLStr2.default.substr(osnova, -1, 1), this.vowels + 'ь')) { stack.push(_NCLStr2.default.substr(osnova, -1, 1)); osnova = _NCLStr2.default.substr(osnova, 0, _NCLStr2.default.strlen(osnova) - 1); } var stacksize = stack.length; var Last = 'Z'; //нульове закінчення if (stacksize) { Last = stack[stack.length - 1]; } var osnovaEnd = _NCLStr2.default.substr(osnova, -1, 1); if (this.in(osnovaEnd, this.neshyplyachi) && !this.in(Last, this.myaki)) { return 1; } else if (this.in(osnovaEnd, this.shyplyachi) && !this.in(Last, this.myaki)) { return 2; } else { return 3; } } /** * Шукаємо в слові <var>$word</var> перше входження літери з переліку <var>$vowels</var> з кінця * @param string $word слово, якому необхідно знайти голосні * @param string $vowels перелік літер, які треба знайти * @return string(1) перша з кінця літера з переліку <var>$vowels</var> */ }, { key: 'FirstLastVowel', value: function FirstLastVowel(word, vowels) { var length = _NCLStr2.default.strlen(word); for (var i = length - 1; i > 0; i--) { var char = _NCLStr2.default.substr(word, i, 1); if (this.in(char, vowels)) { return char; } } } /** * Пошук основи іменника <var>$word</var> * <b>Основа слова</b> - це частина слова (як правило незмінна), яка вказує на його лексичне значення. * @param string $word слово, в якому необхідно знати основу * @return string основа іменника <var>$word</var> */ }, { key: 'getOsnova', value: function getOsnova(word) { var osnova = word; //Ріжемо слово поки не зустрінемо приголосний while (this.in(_NCLStr2.default.substr(osnova, -1, 1), this.vowels + 'ь')) { osnova = _NCLStr2.default.substr(osnova, 0, _NCLStr2.default.strlen(osnova) - 1); } return osnova; } /** * Українські чоловічі та жіночі імена, що в називному відмінку однини закінчуються на -а (-я), * відмінються як відповідні іменники І відміни. * <ul> * <li>Примітка 1. Кінцеві приголосні основи г, к, х у жіночих іменах * у давальному та місцевому відмінках однини перед закінченням -і * змінюються на з, ц, с: Ольга - Ользі, Палажка - Палажці, Солоха - Солосі.</li> * <li>Примітка 2. У жіночих іменах типу Одарка, Параска в родовому відмінку множини * в кінці основи між приголосними з'являється звук о: Одарок, Парасок. </li> * </ul> * @return boolean true - якщо було задіяно правило з переліку, false - якщо правило не знайдено */ }, { key: 'manRule1', value: function manRule1() { //Предпоследний символ var BeforeLast = this.Last(2, 1); var invBeforeLast = this.inverseGKH(BeforeLast); //Останні літера або а if (this.Last(1) == 'а') { this.wordForms(this.workingWord, [BeforeLast + 'и', invBeforeLast + 'і', BeforeLast + 'у', BeforeLast + 'ою', invBeforeLast + 'і', BeforeLast + 'о'], 2); this.Rule(101); return true; } //Остання літера я else if (this.Last(1) == 'я') { //Перед останньою літерою стоїть я if (BeforeLast == 'і') { this.wordForms(this.workingWord, ['ї', 'ї', 'ю', 'єю', 'ї', 'є'], 1); this.Rule(102); return true; } else { this.wordForms(this.workingWord, [BeforeLast + 'і', invBeforeLast + 'і', BeforeLast + 'ю', BeforeLast + 'ею', invBeforeLast + 'і', BeforeLast + 'е'], 2); this.Rule(103); return true; } } return false; } /** * Імена, що в називному відмінку закінчуються на -р, у родовому мають закінчення -а: * Віктор - Віктора, Макар - Макара, але: Ігор - Ігоря, Лазар - Лазаря. * @return boolean true - якщо було задіяно правило з переліку, false - якщо правило не знайдено */ }, { key: 'manRule2', value: function manRule2() { if (this.Last(1) == 'р') { if (this.inNames(this.workingWord, ['Ігор', 'Лазар'])) { this.wordForms(this.workingWord, ['я', 'еві', 'я', 'ем', 'еві', 'е']); this.Rule(201); return true; } else { var osnova = this.workingWord; if (_NCLStr2.default.substr(osnova, -2, 1) == 'і') { osnova = _NCLStr2.default.substr(osnova, 0, _NCLStr2.default.strlen(osnova) - 2) + 'о' + _NCLStr2.default.substr(osnova, -1, 1); } this.wordForms(osnova, ['а', 'ові', 'а', 'ом', 'ові', 'е']); this.Rule(202); return true; } } return false; } /** * Українські чоловічі імена, що в називному відмінку однини закінчуються на приголосний та -о, * відмінюються як відповідні іменники ІІ відміни. * @return boolean true - якщо було задіяно правило з переліку, false - якщо правило не знайдено */ }, { key: 'manRule3', value: function manRule3() { //Предпоследний символ var BeforeLast = this.Last(2, 1); if (this.in(this.Last(1), this.consonant + 'оь')) { var group = this.detect2Group(this.workingWord); var osnova = this.getOsnova(this.workingWord); //В іменах типу Антін, Нестір, Нечипір, Прокіп, Сидір, Тиміш, Федір голосний і виступає тільки в //називному відмінку, у непрямих - о: Антона, Антонові //Чергування і -» о всередині var osLast = _NCLStr2.default.substr(osnova, -1, 1); var invOsLast = this.inverse2(osLast); if (osLast != 'й' && _NCLStr2.default.substr(osnova, -2, 1) == 'і' && !this.in(_NCLStr2.default.substr(_NCLStr2.default.strtolower(osnova), -4, 4), ['світ', 'цвіт']) && !this.inNames(this.workingWord, 'Гліб') && !this.in(this.Last(2), ['ік', 'іч'])) { osnova = _NCLStr2.default.substr(osnova, 0, _NCLStr2.default.strlen(osnova) - 2) + 'о' + _NCLStr2.default.substr(osnova, -1, 1); } //Випадання букви е при відмінюванні слів типу Орел if (_NCLStr2.default.substr(osnova, 0, 1) == 'о' && this.FirstLastVowel(osnova, this.vowels + 'гк') == 'е' && this.Last(2) != 'сь') { var delim = _NCLStr2.default.strrpos(osnova, 'е'); osnova = _NCLStr2.default.substr(osnova, 0, delim) + _NCLStr2.default.substr(osnova, delim + 1, _NCLStr2.default.strlen(osnova) - delim); } if (group == 1) { //Тверда група //Слова що закінчуються на ок if (this.Last(2) == 'ок' && this.Last(3) != 'оок') { this.wordForms(this.workingWord, ['ка', 'кові', 'ка', 'ком', 'кові', 'че'], 2); this.Rule(301); return true; } //Російські прізвища на ов, ев, єв else if (this.in(this.Last(2), ['ов', 'ев', 'єв']) && !this.inNames(this.workingWord, ['Лев', 'Остромов'])) { this.wordForms(osnova, [osLast + 'а', osLast + 'у', osLast + 'а', osLast + 'им', osLast + 'у', invOsLast + 'е'], 1); this.Rule(302); return true; } //Російські прізвища на ін else if (this.in(this.Last(2), ['ін'])) { this.wordForms(this.workingWord, ['а', 'у', 'а', 'ом', 'у', 'е']); this.Rule(303); return true; } else { this.wordForms(osnova, [osLast + 'а', osLast + 'ові', osLast + 'а', osLast + 'ом', osLast + 'ові', invOsLast + 'е'], 1); this.Rule(304); return true; } } if (group == 2) { //Мішана група this.wordForms(osnova, ['а', 'еві', 'а', 'ем', 'еві', 'е']); this.Rule(305); return true; } if (group == 3) { //М’яка група //Соловей if (this.Last(2) == 'ей' && this.in(this.Last(3, 1), this.gubni)) { osnova = _NCLStr2.default.substr(this.workingWord, 0, _NCLStr2.default.strlen(this.workingWord) - 2) + '’'; this.wordForms(osnova, ['я', 'єві', 'я', 'єм', 'єві', 'ю']); this.Rule(306); return true; } else if (this.Last(1) == 'й' || BeforeLast == 'і') { this.wordForms(this.workingWord, ['я', 'єві', 'я', 'єм', 'єві', 'ю'], 1); this.Rule(307); return true; } //Швець else if (this.workingWord == 'швець') { this.wordForms(this.workingWord, ['евця', 'евцеві', 'евця', 'евцем', 'евцеві', 'евцю'], 4); this.Rule(308); return true; } //Слова що закінчуються на ець else if (this.Last(3) == 'ець') { this.wordForms(this.workingWord, ['ця', 'цеві', 'ця', 'цем', 'цеві', 'цю'], 3); this.Rule(309); return true; } //Слова що закінчуються на єць яць else if (this.in(this.Last(3), ['єць', 'яць'])) { this.wordForms(this.workingWord, ['йця', 'йцеві', 'йця', 'йцем', 'йцеві', 'йцю'], 3); this.Rule(310); return true; } else { this.wordForms(osnova, ['я', 'еві', 'я', 'ем', 'еві', 'ю']); this.Rule(311); return true; } } } return false; } /** * Якщо слово закінчується на і, то відмінюємо як множину * @return boolean true - якщо було задіяно правило з переліку, false - якщо правило не знайдено */ }, { key: 'manRule4', value: function manRule4() { if (this.Last(1) == 'і') { this.wordForms(this.workingWord, ['их', 'им', 'их', 'ими', 'их', 'і'], 1); this.Rule(4); return true; } return false; } /** * Якщо слово закінчується на ий або ой * @return boolean true - якщо було задіяно правило з переліку, false - якщо правило не знайдено */ }, { key: 'manRule5', value: function manRule5() { if (this.in(this.Last(2), ['ий', 'ой'])) { this.wordForms(this.workingWord, ['ого', 'ому', 'ого', 'им', 'ому', 'ий'], 2); this.Rule(5); return true; } return false; } /** * Українські чоловічі та жіночі імена, що в називному відмінку однини закінчуються на -а (-я), * відмінються як відповідні іменники І відміни. * - Примітка 1. Кінцеві приголосні основи г, к, х у жіночих іменах * у давальному та місцевому відмінках однини перед закінченням -і * змінюються на з, ц, с: Ольга - Ользі, Палажка - Палажці, Солоха - Солосі. * - Примітка 2. У жіночих іменах типу Одарка, Параска в родовому відмінку множини * в кінці основи між приголосними з'являється звук о: Одарок, Парасок * @return boolean true - якщо було задіяно правило з переліку, false - якщо правило не знайдено */ }, { key: 'womanRule1', value: function womanRule1() { //Предпоследний символ var BeforeLast = this.Last(2, 1); var invBeforeLast = this.inverseGKH(BeforeLast); //Якщо закінчується на ніга -» нога if (this.Last(4) == 'ніга') { var osnova = _NCLStr2.default.substr(this.workingWord, 0, _NCLStr2.default.strlen(this.workingWord) - 3) + 'о'; this.wordForms(osnova, ['ги', 'зі', 'гу', 'гою', 'зі', 'го']); this.Rule(101); return true; } //Останні літера або а else if (this.Last(1) == 'а') { this.wordForms(this.workingWord, [BeforeLast + 'и', invBeforeLast + 'і', BeforeLast + 'у', BeforeLast + 'ою', invBeforeLast + 'і', BeforeLast + 'о'], 2); this.Rule(102); return true; } //Остання літера я else if (this.Last(1) == 'я') { if (this.in(BeforeLast, this.vowels) || this.isApostrof(BeforeLast)) { this.wordForms(this.workingWord, ['ї', 'ї', 'ю', 'єю', 'ї', 'є'], 1); this.Rule(103); return true; } else { this.wordForms(this.workingWord, [BeforeLast + 'і', invBeforeLast + 'і', BeforeLast + 'ю', BeforeLast + 'ею', invBeforeLast + 'і', BeforeLast + 'е'], 2); this.Rule(104); return true; } } return false; } /** * Українські жіночі імена, що в називному відмінку однини закінчуються на приголосний, * відмінюються як відповідні іменники ІІІ відміни * @return boolean true - якщо було задіяно правило з переліку, false - якщо правило не знайдено */ }, { key: 'womanRule2', value: function womanRule2() { if (this.in(this.Last(1), this.consonant + 'ь')) { var osnova = this.getOsnova(this.workingWord); var apostrof = ''; var duplicate = ''; var osLast = _NCLStr2.default.substr(osnova, -1, 1); var osBeforeLast = _NCLStr2.default.substr(osnova, -2, 1); //Чи треба ставити апостроф if (this.in(osLast, 'мвпбф') && this.in(osBeforeLast, this.vowels)) { apostrof = '’'; } //Чи треба подвоювати if (this.in(osLast, 'дтзсцлн')) { duplicate = osLast; } //Відмінюємо if (this.Last(1) == 'ь') { this.wordForms(osnova, ['і', 'і', 'ь', duplicate + apostrof + 'ю', 'і', 'е']); this.Rule(201); return true; } else { this.wordForms(osnova, ['і', 'і', '', duplicate + apostrof + 'ю', 'і', 'е']); this.Rule(202); return true; } } return false; } /** * Якщо слово на ськ або це російське прізвище * @return boolean true - якщо було задіяно правило з переліку, false - якщо правило не знайдено */ }, { key: 'womanRule3', value: function womanRule3() { //Предпоследний символ var BeforeLast = this.Last(2, 1); //Донская if (this.Last(2) == 'ая') { this.wordForms(this.workingWord, ['ої', 'ій', 'ую', 'ою', 'ій', 'ая'], 2); this.Rule(301); return true; } //Ті що на ськ if (this.Last(1) == 'а' && (this.in(this.Last(2, 1), 'чнв') || this.in(this.Last(3, 2), ['ьк']))) { this.wordForms(this.workingWord, [BeforeLast + 'ої', BeforeLast + 'ій', BeforeLast + 'у', BeforeLast + 'ою', BeforeLast + 'ій', BeforeLast + 'о'], 2); this.Rule(302); return true; } return false; } /** * Функція намагається застосувати ланцюг правил для чоловічих імен * @return boolean true - якщо було задіяно правило з переліку, false - якщо правило не знайдено */ }, { key: 'manFirstName', value: function manFirstName() { return this.RulesChain('man', [1, 2, 3]); } /** * Функція намагається застосувати ланцюг правил для жіночих імен * @return boolean true - якщо було задіяно правило з переліку, false - якщо правило не знайдено */ }, { key: 'womanFirstName', value: function womanFirstName() { return this.RulesChain('woman', [1, 2]); } /** * Функція намагається застосувати ланцюг правил для чоловічих прізвищ * @return boolean true - якщо було задіяно правило з переліку, false - якщо правило не знайдено */ }, { key: 'manSecondName', value: function manSecondName() { return this.RulesChain('man', [5, 1, 2, 3, 4]); } /** * Функція намагається застосувати ланцюг правил для жіночих прізвищ * @return boolean true - якщо було задіяно правило з переліку, false - якщо правило не знайдено */ }, { key: 'womanSecondName', value: function womanSecondName() { return this.RulesChain('woman', [3, 1]); } /** * Фунція відмінює чоловічі по-батькові * @return boolean true - якщо слово успішно змінене, false - якщо невдалося провідміняти слово */ }, { key: 'manFatherName', value: function manFatherName() { if (this.in(this.Last(2), ['ич', 'іч'])) { this.wordForms(this.workingWord, ['а', 'у', 'а', 'ем', 'у', 'у']); return true; } return false; } /** * Фунція відмінює жіночі по-батькові * @return boolean true - якщо слово успішно змінене, false - якщо невдалося провідміняти слово */ }, { key: 'womanFatherName', value: function womanFatherName() { if (this.in(this.Last(3), ['вна'])) { this.wordForms(this.workingWord, ['и', 'і', 'у', 'ою', 'і', 'о'], 1); return true; } return false; } /** * Визначення статі, за правилами імені * @param NCLNameCaseWord $word об’єкт класу зі словом, для якого необхідно визначити стать */ }, { key: 'GenderByFirstName', value: function GenderByFirstName( /*NCLNameCaseWord*/word) { if (!(word instanceof _NCLNameCaseWord2.default)) throw new Exception("word should be of class NCLNameCaseWord"); this.setWorkingWord(word.getWord()); var man = 0; //Мужчина var woman = 0; //Женщина //Попробуем выжать максимум из имени //Если имя заканчивается на й, то скорее всего мужчина if (this.Last(1) == 'й') { man += 0.9; } if (this.inNames(this.workingWord, ['Петро', 'Микола'])) { man += 30; } if (this.in(this.Last(2), ['он', 'ов', 'ав', 'ам', 'ол', 'ан', 'рд', 'мп', 'ко', 'ло'])) { man += 0.5; } if (this.in(this.Last(3), ['бов', 'нка', 'яра', 'ила', 'опа'])) { woman += 0.5; } if (this.in(this.Last(1), this.consonant)) { man += 0.01; } if (this.Last(1) == 'ь') { man += 0.02; } if (this.in(this.Last(2), ['дь'])) { woman += 0.1; } if (this.in(this.Last(3), ['ель', 'бов'])) { woman += 0.4; } word.setGender(man, woman); } /** * Визначення статі, за правилами прізвища * @param NCLNameCaseWord $word об’єкт класу зі словом, для якого необхідно визначити стать */ }, { key: 'GenderBySecondName', value: function GenderBySecondName( /*NCLNameCaseWord*/word) { if (!(word instanceof _NCLNameCaseWord2.default)) throw new Exception("word should be of class NCLNameCaseWord"); this.setWorkingWord(word.getWord()); var man = 0; //Мужчина var woman = 0; //Женщина if (this.in(this.Last(2), ['ов', 'ин', 'ев', 'єв', 'ін', 'їн', 'ий', 'їв', 'ів', 'ой', 'ей'])) { man += 0.4; } if (this.in(this.Last(3), ['ова', 'ина', 'ева', 'єва', 'іна', 'мін'])) { woman += 0.4; } if (this.in(this.Last(2), ['ая'])) { woman += 0.4; } word.setGender(man, woman); } /** * Визначення статі, за правилами по-батькові * @param NCLNameCaseWord $word об’єкт класу зі словом, для якого необхідно визначити стать */ }, { key: 'GenderByFatherName', value: function GenderByFatherName( /*NCLNameCaseWord*/word) { if (!(word instanceof _NCLNameCaseWord2.default)) throw new Exception("word should be of class NCLNameCaseWord"); this.setWorkingWord(word.getWord()); if (this.Last(2) == 'ич') { word.setGender(10, 0); // мужчина } if (this.Last(2) == 'на') { word.setGender(0, 12); // женщина } } /** * Ідентифікує слово визначаючи чи це ім’я, чи це прізвище, чи це побатькові * - <b>N</b> - ім’я * - <b>S</b> - прізвище * - <b>F</b> - по-батькові * @param NCLNameCaseWord $word об’єкт класу зі словом, яке необхідно ідентифікувати */ }, { key: 'detectNamePart', value: function detectNamePart( /*NCLNameCaseWord*/word) { if (!(word instanceof _NCLNameCaseWord2.default)) throw new Exception("word should be of class NCLNameCaseWord"); var namepart = word.getWord(); this.setWorkingWord(namepart); //Считаем вероятность var first = 0; var second = 0; var father = 0; //если смахивает на отчество if (this.in(this.Last(3), ['вна', 'чна', 'ліч']) || this.in(this.Last(4), ['ьмич', 'ович'])) { father += 3; } //Похоже на имя if (this.in(this.Last(3), ['тин' /* {endings_sirname3} */]) || this.in(this.Last(4), ['ьмич', 'юбов', 'івна', 'явка', 'орив', 'кіян' /* {endings_sirname4} */])) { first += 0.5; } //Исключения if (this.inNames(namepart, ['Лев', 'Гаїна', 'Афіна', 'Антоніна', 'Ангеліна', 'Альвіна', 'Альбіна', 'Аліна', 'Павло', 'Олесь', 'Микола', 'Мая', 'Англеліна', 'Елькін', 'Мерлін'])) { first += 10; } //похоже на фамилию if (this.in(this.Last(2), ['ов', 'ін', 'ев', 'єв', 'ий', 'ин', 'ой', 'ко', 'ук', 'як', 'ца', 'их', 'ик', 'ун', 'ок', 'ша', 'ая', 'га', 'єк', 'аш', 'ив', 'юк', 'ус', 'це', 'ак', 'бр', 'яр', 'іл', 'ів', 'ич', 'сь', 'ей', 'нс', 'яс', 'ер', 'ай', 'ян', 'ах', 'ць', 'ющ', 'іс', 'ач', 'уб', 'ох', 'юх', 'ут', 'ча', 'ул', 'вк', 'зь', 'уц', 'їн', 'де', 'уз', 'юр', 'ік', 'іч', 'ро' /* {endings_name2} */])) { second += 0.4; } if (this.in(this.Last(3), ['ова', 'ева', 'єва', 'тих', 'рик', 'вач', 'аха', 'шен', 'мей', 'арь', 'вка', 'шир', 'бан', 'чий', 'іна', 'їна', 'ька', 'ань', 'ива', 'аль', 'ура', 'ран', 'ало', 'ола', 'кур', 'оба', 'оль', 'нта', 'зій', 'ґан', 'іло', 'шта', 'юпа', 'рна', 'бла', 'еїн', 'има', 'мар', 'кар', 'оха', 'чур', 'ниш', 'ета', 'тна', 'зур', 'нір', 'йма', 'орж', 'рба', 'іла', 'лас', 'дід', 'роз', 'аба', 'чан', 'ган' /* {endings_name3} */])) { second += 0.4; } if (this.in(this.Last(4), ['ьник', 'нчук', 'тник', 'кирь', 'ский', 'шена', 'шина', 'вина', 'нина', 'гана', 'гана', 'хній', 'зюба', 'орош', 'орон', 'сило', 'руба', 'лест', 'мара', 'обка', 'рока', 'сика', 'одна', 'нчар', 'вата', 'ндар', 'грій' /* {endings_name4} */])) { second += 0.4; } if (this.Last(1) == 'і') { second += 0.2; } var max = math_max([first, second, father]); if (first == max) { word.setNamePart('N'); } else if (second == max) { word.setNamePart('S'); } else { word.setNamePart('F'); } } }]); return NCLNameCaseUa; }(_NCLNameCaseCore3.default); exports.default = NCLNameCaseUa;