UNPKG

shevchenko

Version:

JavaScript library for declension of Ukrainian anthroponyms

57 lines (53 loc) 2.26 kB
/** * @file JavaScript library for declension of Ukrainian anthroponyms * @module shevchenko * @version 3.2.2 * @author Oleksandr Tolochko <shevchenko-js@tooleks.com> * @license MIT * @copyright 2017-2026 Oleksandr Tolochko <shevchenko-js@tooleks.com> * @see {@link git+https://github.com/tooleks/shevchenko-js.git} */ 'use strict'; require('../language/alphabet.js'); require('../language/word-class.js'); var linguistics = require('../language/linguistics.js'); require('../language/grammatical-case.js'); var grammaticalGender = require('../language/grammatical-gender.js'); var nameInflector = require('./name-inflector.js'); const UNCERTAIN_FEMININE_FAMILY_NAME_PATTERN = /[ая]$/i; const UNCERTAIN_MASCULINE_FAMILY_NAME_PATTERN = /(ой|ий|ій|их)$/i; class FamilyNameInflector extends nameInflector.NameInflector { constructor(wordInflector, familyNameClassifier) { super(); this.wordInflector = wordInflector; this.familyNameClassifier = familyNameClassifier; } /** * @inheritdoc */ async inflectNamePart(familyName, gender, grammaticalCase, isLastWord) { if (!isLastWord && linguistics.isMonosyllable(familyName)) { return familyName; } let familyNameClass = null; if (this.isUncertainFamilyNameClass(familyName, gender)) { familyNameClass = await this.familyNameClassifier.classify(familyName); } return this.wordInflector.inflect(familyName, { grammaticalCase: grammaticalCase, gender: gender, wordClass: familyNameClass === null || familyNameClass === void 0 ? void 0 : familyNameClass.wordClass, applicationType: 'familyName', }); } /** * Determines whether a given family name could be both a noun or adjective word class. */ isUncertainFamilyNameClass(familyName, gender) { return ((gender === grammaticalGender.GrammaticalGender.FEMININE && UNCERTAIN_FEMININE_FAMILY_NAME_PATTERN.test(familyName)) || (gender === grammaticalGender.GrammaticalGender.MASCULINE && UNCERTAIN_MASCULINE_FAMILY_NAME_PATTERN.test(familyName))); } } exports.FamilyNameInflector = FamilyNameInflector;