UNPKG

@technobuddha/library

Version:
437 lines 20 kB
import { matchCase } from "./match-case.js"; import { empty, space } from "./unicode.js"; /** * Return the plural version of the input string * @param input - The word to pluralize * @param quantity - The quantity to prepend to the word. If omitted nothing is prepended. If quantity is one the singular form is returned. * @param include - If true and quantity is supplied, the quantity is prepended to the output. * @returns The plural form of the input, or if a quantity is supplied - the quantity and the singular/plural form of the input (whichever is appropriate) * @example * ```typescript * plural('cat'); // cats * plural('mouse', 1); // mouse * plural('mouse', 2); // mice * plural('dog', 1, true); // 1 dog * plural('dog', 2, true); // 2 dogs * ``` * @group String * @category Parts of Speech */ export function plural(input, quantity, include = false) { if (quantity === 1 || quantity === -1) { return include ? quantity.toString() + space + input : input; } let lc = input.toLocaleLowerCase(); let suffix = empty; let prefix = empty; let result = null; for (const p of database.prefixes) { if (lc.startsWith(p)) { prefix = p; lc = lc.slice(p.length); break; } } for (const s of database.suffixes) { if (lc.endsWith(s)) { suffix = s; lc = lc.slice(0, Math.max(0, lc.length - s.length)); break; } } if (database.uncountableWords.includes(lc)) { result = matchCase(prefix + lc + suffix, input); } if (!result && lc in database.irregulars) { result = matchCase(prefix + database.irregulars[lc] + suffix, input); } if (!result) { for (const v of database.uncountableRules) { if (v.test(lc)) { result = matchCase(prefix + lc + suffix, input); break; } } } if (!result) { for (const v of database.rules) { if (v[0].test(lc)) { result = matchCase(prefix + lc.replace(v[0], v[1]) + suffix, input); break; } } } result ??= matchCase(`${prefix}${lc}s${suffix}`, input); return include && quantity != null ? `${quantity}${space}${result}` : result; } const database = { rules: [ // cspell:disable [/(stig|sto|dog|sche|anathe)ma$/iu, '$1mata'], [/(alumn|alg|antenn|ecclesi|faun|formul|larv|nebul|vertebr)a$/iu, '$1ae'], [/child$/iu, 'children'], [/(giraf|sa)fe$/iu, '$1fes'], [/fe$/iu, 'ves'], [/(l|m)ouse$/iu, '$1ice'], [/goose$/iu, 'geese'], [/zampone$/iu, 'zamponi'], [/ff$/iu, 'ffs'], [/(belie|brie|che|chie|cle|gul|i|proo|roo)f$/iu, '$1fs'], [/(its|her|him|them)self$/iu, 'themselves'], [/f$/iu, 'ves'], [/tooth$/iu, 'teeth'], [/(epo|matriar|patriar|stoma)ch$/iu, '$1chs'], [/([sc])h$/iu, '$1hes'], [/(aqua)rium$/iu, '$1ira'], [/(seraph|cherub)im$/iu, '$1im'], [/(memorand|millenni|ov|quor|strat|symposi)um$/iu, '$1a'], [ /(addend|agend|automat|bacteri|curricul|dat|desiderat|endotheli|errat|extrem|fusari|medi)um$/iu, '$1a', ], [/(m|wom)an/iu, '$1en'], [/(criteri|hedr|heli|phenomen|prolegomen|organ)on$/iu, '$1a'], [/person$/iu, 'people'], [ /(alt|armadill|boler|bong|bronc|cell|dynam|embarg|hal|hell|gazeb|gyr|jumb|kil|lim)o$/iu, '$1os', ], [ /(maestr|metr|mosquit|octav|pian|piccol|pint|phot|ponch|sil|sombrer|sopran|stere|stilett)o$/iu, '$1os', ], [/(temp|tornad|tors|tw|volcan)o$/iu, '$1os'], [/([^aeiou])o$/iu, '$1oes'], [/(gen|visc)us$/iu, '$1era'], [ /(alumn|bacill|cirr|cact|foc|fung|hippopotam|loc|nucle|octop|radi|pegas|stimul|strat|syllab|termin|uter)us$/iu, '$1i', ], [ /(ax|analys|antithes|bas|cris|diagnos|ellips|emphas|hypothes|neuros|oas|paralys|synthes|synops|test|thes)is$/iu, '$1es', ], [/(ephemer)is$/iu, '$1ides'], [/(bu|ga)s$/iu, '$1sses'], [/(corp)us$/iu, '$1ora'], [/s$/iu, 'ses'], [/foot$/iu, 'feet'], [/(b|bur|chat|tabl)eau$/iu, '$1eaux'], [/(whisk)ey$/iu, '$1ies'], [/([^aeiou]|qu)y$/iu, '$1ies'], [/(append|matr)ix$/iu, '$1ices'], [/(cod|ind|mur|vert)ex$/iu, '$1ices'], [/(ap)ex$/iu, '$1ices'], [/x$/iu, 'xes'], [/(fez|qui)z$/iu, '$1zzes'], [/z$/iu, 'zes'], ], uncountableRules: [ /(adult|child)hood$/iu, /craft$/iu, /deer$/iu, /fish$/iu, /measles$/iu, /pox$/iu, /sheep$/iu, /wood$/iu, /ographuy$/iu, /itis$/iu, /ology$/iu, /[hw]ealth$/iu, /bage$/iu, /llows$/iu, /ment$/iu, /friut$/iu, /(?<!func)tion$/iu, /work$/iu, /ing$/iu, /ism$/iu, /tics$/iu, /moose$/iu, /trout$/iu, ], // cspell:enable uncountableWords: [ 'abroad', 'acoustics', 'advice', 'aid', 'air', 'alcohol', 'alms', 'alpenglow', 'aluminum', 'ammo', 'anger', 'anime', 'applause', 'Operations', 'art', 'athletics', 'audio', 'awareness', 'barracks', 'bad', 'bakeware', 'beyond', 'bifocals', 'binoculars', 'bison', 'blood', 'bloomers', 'blouse', 'boots', 'bourgeois', 'bowling', 'bricklaying', 'butter', 'calculus', 'cappuccino', 'caribou', 'carp', 'cash', 'casino', 'castanets', 'cattle', 'celeriac', 'chafe', 'chalk', 'chaos', 'chassis', 'chess', 'children', 'chino', 'clippers', 'cod', 'commerce', 'concrete', 'corps', 'courage', 'deadness', 'debris', 'deer', 'diabetes', 'dirt', 'disco', 'doldrums', 'dungarees', 'economics', 'egg', 'electricity', 'elk', 'energy', 'ethics', 'expertise', 'fauna', 'faux pas', 'fedelini', 'fibre', 'fiberglass', 'flesh', 'flounder', 'forestry', 'fun', 'furniture', 'gain', 'glass', 'glasses', 'golf', 'graffiti', 'gratitude', 'grief', 'grouse', 'guidance', 'guilt', 'haddock', 'happiness', 'hardware', 'hair', 'halibut', 'headquarters', 'helium', 'helo', 'help', 'herpes', 'high jinks', 'homework', 'housework', 'humidity', 'humour', 'hypochondria', 'hypothermia', 'ides', 'ikebana', 'importance', 'impudence', 'incandescence', 'indigence', 'innocence', 'insignia', 'jeans', 'jodhpur', 'judo', 'justice', 'karate', 'kendo', 'knickers', 'knowledge', 'kudos', 'labour', 'laughter', 'leisure', 'legal', 'literature', 'livestock', 'loneliness', 'lycra', 'lye', 'macaroni', 'machinery', 'mackerel', 'macrame', 'magic', 'mail', 'manga', 'mambo', 'mankind', 'math', 'means', 'media', 'methane', 'mews', 'might', 'most', 'mud', 'mullet', 'multimedia', 'music', 'neon', 'news', 'nitrogen', 'normal', 'oatmeal', 'obedience', 'opium', 'osmosis', 'outback', 'oxygen', 'pants', 'pantology', 'pantyhose', 'passion', 'patience', 'peace', 'penicillin', 'permafrost', 'physics', 'pike', 'plankton', 'platinum', 'plenty', 'pliers', 'police', 'polo', 'premises', 'propane', 'prose', 'pseudoscience', 'pyjamas', 'quicksand', 'radio', 'random', 'rain', 'rendezvous', 'reinscription', 'relief', 'research', 'rice', 'salmon', 'septicaemia', 'school', 'schoolchild', 'scissors', 'series', 'sewage', 'shambles', 'shorts', 'shrimp', 'sick', 'smithereens', 'smog', 'soccer', 'software', 'soot', 'soy', 'species', 'squid', 'staff', 'stamina', 'stupid', 'subconscious', 'subsidence', 'sugar', 'sunglasses', 'sunshine', 'sushi', 'suspenders', 'sweats', 'sweet', 'sweets', 'swine', 'temporariness', 'terracotta', 'tennis', 'thanks', 'them', 'tights', 'timpani', 'titanium', 'tongs', 'tonight', 'tortellini', 'traffic', 'trigonometry', 'trousers', 'tuna', 'tweezers', 'underclothes', 'underneath', 'underpants', 'underwear', 'veal', 'vermicelli', 'video', 'vinyl', 'virus', 'violence', 'viscose', 'warmth', 'weedkiller', 'welfare', 'wheat', 'whitebait', 'wildebeest', 'wildlife', 'worth', 'yoga', 'you', 'young', ], irregulars: { i: 'we', me: 'us', he: 'they', she: 'they', is: 'are', was: 'were', has: 'have', this: 'these', that: 'those', die: 'dice', ox: 'oxen', }, suffixes: ['-up', '-out', '-in-law', '-in-trade'], prefixes: ['anti-', 'bi-', 'co-', 'semi-', 'mal-', 'ex-', 'sub-', 'dis-', 'non-', 'un-', 'over-'], }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1cmFsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3BsdXJhbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDNUMsT0FBTyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFFNUM7Ozs7Ozs7Ozs7Ozs7Ozs7R0FnQkc7QUFDSCxNQUFNLFVBQVUsTUFBTSxDQUFDLEtBQWEsRUFBRSxRQUFpQixFQUFFLE9BQU8sR0FBRyxLQUFLO0lBQ3RFLElBQUksUUFBUSxLQUFLLENBQUMsSUFBSSxRQUFRLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUN0QyxPQUFPLE9BQU8sQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxHQUFHLEtBQUssR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztJQUMvRCxDQUFDO0lBRUQsSUFBSSxFQUFFLEdBQUcsS0FBSyxDQUFDLGlCQUFpQixFQUFFLENBQUM7SUFDbkMsSUFBSSxNQUFNLEdBQUcsS0FBSyxDQUFDO0lBQ25CLElBQUksTUFBTSxHQUFHLEtBQUssQ0FBQztJQUNuQixJQUFJLE1BQU0sR0FBRyxJQUFxQixDQUFDO0lBRW5DLEtBQUssTUFBTSxDQUFDLElBQUksUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ2xDLElBQUksRUFBRSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ3JCLE1BQU0sR0FBRyxDQUFDLENBQUM7WUFDWCxFQUFFLEdBQUcsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDeEIsTUFBTTtRQUNSLENBQUM7SUFDSCxDQUFDO0lBRUQsS0FBSyxNQUFNLENBQUMsSUFBSSxRQUFRLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDbEMsSUFBSSxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FB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