UNPKG

shevchenko

Version:

JavaScript library for declension of Ukrainian anthroponyms

55 lines (52 loc) 2.17 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} */ import '../language/alphabet.js'; import '../language/word-class.js'; import { isMonosyllable } from '../language/linguistics.js'; import '../language/grammatical-case.js'; import { GrammaticalGender } from '../language/grammatical-gender.js'; import { NameInflector } from './name-inflector.js'; const UNCERTAIN_FEMININE_FAMILY_NAME_PATTERN = /[ая]$/i; const UNCERTAIN_MASCULINE_FAMILY_NAME_PATTERN = /(ой|ий|ій|их)$/i; class FamilyNameInflector extends NameInflector { constructor(wordInflector, familyNameClassifier) { super(); this.wordInflector = wordInflector; this.familyNameClassifier = familyNameClassifier; } /** * @inheritdoc */ async inflectNamePart(familyName, gender, grammaticalCase, isLastWord) { if (!isLastWord && 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.FEMININE && UNCERTAIN_FEMININE_FAMILY_NAME_PATTERN.test(familyName)) || (gender === GrammaticalGender.MASCULINE && UNCERTAIN_MASCULINE_FAMILY_NAME_PATTERN.test(familyName))); } } export { FamilyNameInflector };