shevchenko
Version:
JavaScript library for declension of Ukrainian anthroponyms
53 lines (49 loc) • 2 kB
JavaScript
/**
* @file JavaScript library for declension of Ukrainian anthroponyms
* @module shevchenko
* @version 3.1.4
* @author Oleksandr Tolochko <shevchenko-js@tooleks.com>
* @license MIT
* @copyright 2017-2025 Oleksandr Tolochko <shevchenko-js@tooleks.com>
* @see {@link git+https://github.com/tooleks/shevchenko-js.git}
*/
;
var declensionRuleInflector = require('./declension-rule-inflector.js');
class WordInflector {
constructor(declensionRules) {
this.declensionRules = [...declensionRules].sort((firstRule, lastRule) => lastRule.priority - firstRule.priority);
}
async inflect(word, params) {
const [matchingRule] = await this.findMatchingRules(word, params);
if (matchingRule == null) {
return word;
}
return new declensionRuleInflector.DeclensionRuleInflector(matchingRule).inflect(word, params.grammaticalCase);
}
/**
* Finds matching declension rules for the given word.
*/
async findMatchingRules(word, params) {
const matchingRules = this.declensionRules
.filter((declensionRule) => {
return declensionRule.gender.includes(params.gender);
})
.filter((declensionRule) => {
return (!params.applicationType ||
declensionRule.applicationType.length === 0 ||
declensionRule.applicationType.includes(params.applicationType));
})
.filter((declensionRule) => {
return new RegExp(declensionRule.pattern.find, 'gi').test(word);
})
.filter((declensionRule) => {
return !params.wordClass || declensionRule.wordClass === params.wordClass;
})
.filter((declensionRule, index, declensionRules) => {
return (!params.customRuleFilter ||
params.customRuleFilter(declensionRule, index, declensionRules));
});
return matchingRules;
}
}
exports.WordInflector = WordInflector;