UNPKG

shevchenko

Version:

JavaScript library for declension of Ukrainian anthroponyms

53 lines (49 loc) 2 kB
/** * @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} */ 'use strict'; 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;