nhb-toolbox
Version:
A versatile collection of smart, efficient, and reusable utility functions, classes and types for everyday development needs.
145 lines (144 loc) • 5.34 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.verbalizer = exports.Verbalizer = void 0;
const primitives_1 = require("../guards/primitives");
const rules_1 = require("./rules");
class Verbalizer {
#baseRules = [];
#pastRules = [];
#participleRules = [];
#irregularVerbs = {};
#reverseIrregular = {};
constructor() {
this.#loadRules();
}
#loadRules() {
rules_1.irregularVerbs.forEach(([base, past, pastParticiple]) => {
this.addIrregular(base, past, pastParticiple);
});
rules_1.baseRules.forEach(([rule, replacement]) => {
this.addBaseRule(rule, replacement);
});
rules_1.pastRules.forEach(([rule, replacement]) => {
this.addPastRule(rule, replacement);
});
rules_1.pastParticipleRules.forEach(([rule, replacement]) => {
this.addParticipleRule(rule, replacement);
});
}
#restoreCase(original, transformed) {
original = original?.trim();
if (original === transformed)
return transformed;
if (original === original.toLowerCase())
return transformed.toLowerCase();
if (original === original.toUpperCase())
return transformed.toUpperCase();
if (original[0] === original[0].toUpperCase() &&
original.slice(1) === original.slice(1).toLowerCase()) {
return transformed.charAt(0).toUpperCase() + transformed.slice(1).toLowerCase();
}
let result = '';
for (let i = 0; i < transformed.length; i++) {
const origChar = original[i];
if (origChar &&
origChar === origChar.toUpperCase() &&
origChar !== origChar.toLowerCase()) {
result += transformed[i].toUpperCase();
}
else {
result += transformed[i].toLowerCase();
}
}
return result;
}
#applyBaseRule(verb) {
return this.#applyRules(verb, this.#baseRules);
}
#applyRules(verb, rules) {
if (!(0, primitives_1.isNonEmptyString)(verb))
return '';
for (let i = 0; i < rules.length; i++) {
const [rule, replacement] = rules[i];
if (rule.test(verb)) {
return verb.replace(rule, replacement);
}
}
return verb;
}
#findIrregularEntry(verb) {
const base = this.#irregularVerbs[verb] ? verb : this.#reverseIrregular[verb];
return base ? this.#irregularVerbs[base] : undefined;
}
addBaseRule(rule, replacement) {
this.#baseRules.push([rule, replacement]);
}
addPastRule(rule, replacement) {
this.#pastRules.push([rule, replacement]);
}
addParticipleRule(rule, replacement) {
this.#participleRules.push([rule, replacement]);
}
addIrregular(base, past, participle) {
const baseLower = base?.toLowerCase();
const pastLower = past?.toLowerCase();
const participleLower = participle?.toLowerCase();
this.#irregularVerbs[baseLower] = {
base: baseLower,
past: pastLower,
participle: participleLower,
};
this.#reverseIrregular[pastLower] = baseLower;
this.#reverseIrregular[participleLower] = baseLower;
}
toPast(verb) {
if (!(0, primitives_1.isNonEmptyString)(verb))
return '';
const lower = verb?.trim()?.toLowerCase();
const irregularEntry = this.#findIrregularEntry(lower);
if (irregularEntry) {
return this.#restoreCase(verb, irregularEntry.past);
}
return this.#restoreCase(verb, this.#applyRules(this.#applyBaseRule(lower), this.#pastRules));
}
toParticiple(verb) {
if (!(0, primitives_1.isNonEmptyString)(verb))
return '';
const lower = verb?.trim()?.toLowerCase();
const irregularEntry = this.#findIrregularEntry(lower);
if (irregularEntry) {
return this.#restoreCase(verb, irregularEntry.participle);
}
return this.#restoreCase(verb, this.#applyRules(this.#applyBaseRule(lower), this.#participleRules));
}
toBase(verb) {
if (!(0, primitives_1.isNonEmptyString)(verb))
return '';
const lower = verb?.trim()?.toLowerCase();
const irregularEntry = this.#findIrregularEntry(lower);
if (irregularEntry) {
return this.#restoreCase(verb, irregularEntry.base);
}
return this.#restoreCase(verb, this.#applyBaseRule(lower));
}
isPast(verb) {
if (!(0, primitives_1.isNonEmptyString)(verb))
return false;
const lower = verb?.trim()?.toLowerCase();
return this.toPast(lower) === lower;
}
isParticiple(verb) {
if (!(0, primitives_1.isNonEmptyString)(verb))
return false;
const lower = verb?.trim()?.toLowerCase();
return this.toParticiple(lower) === lower;
}
isBase(verb) {
if (!(0, primitives_1.isNonEmptyString)(verb))
return false;
const lower = verb?.trim()?.toLowerCase();
return this.toBase(lower) === lower;
}
}
exports.Verbalizer = Verbalizer;
exports.verbalizer = new Verbalizer();