shevchenko
Version:
JavaScript library for declension of Ukrainian anthroponyms
55 lines (52 loc) • 2.17 kB
JavaScript
/**
* @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 };