UNPKG

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
"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();