UNPKG

plural-rules

Version:

Evaluates plural rules, so that localization libraries can choose the right plural form.

1 lines 7.09 kB
{"version":3,"file":"code.mjs","sources":["../src/code.js","../src/data-indexer.js"],"sourcesContent":["import parsePluralRule from 'cldrpluralruleparser'\nimport { indexPluralForms, parsePluralForms } from './data-indexer.js'\n\nlet rules = []\nlet cardinals = {}\n\nfunction normalizeLocale (locale) {\n return locale.toLowerCase().replace('_', '-')\n}\n\nfunction getLanguage (locale) {\n const separator = locale.indexOf('-')\n return separator > 0 && locale.substr(0, separator)\n}\n\nfunction getPluralRulesForCardinals (locale) {\n locale = normalizeLocale(locale)\n let forms = cardinals[locale]\n let language\n if (forms === undefined) {\n language = getLanguage(locale)\n if (language) {\n forms = cardinals[language]\n }\n }\n if (forms === undefined) {\n throw new Error(`Unrecognised locale: \"${locale}\".`)\n } else if (typeof forms === 'string') {\n forms = parsePluralForms(forms)\n cardinals[language || locale] = forms\n }\n return forms\n}\n\nfunction getPluralFormForCardinal (locale, count) {\n const forms = typeof locale !== 'string'\n ? locale\n : getPluralRulesForCardinals(locale)\n for (const form in forms) {\n const rule = forms[form]\n if (parsePluralRule(rules[rule], count)) {\n return form\n }\n }\n}\n\nfunction setPluralFormsForCardinals (locale, forms) {\n locale = normalizeLocale(locale)\n cardinals[locale] = indexPluralForms(forms, rules)\n}\n\nfunction populatePluralData (data) {\n rules = data.rules\n cardinals = data.cardinals\n}\n\nlet supportedLocales\n\nfunction getSupportedLocales() {\n if (!supportedLocales) supportedLocales = Object.keys(cardinals)\n return supportedLocales\n}\n\nfunction getPluralFormsForLocale(locale) {\n const cardinal = cardinals[locale]\n if (cardinal === undefined) return\n return cardinal\n .split(',')\n .map(form => form.substring(0, form.indexOf(':')))\n}\n\nexport {\n getPluralRulesForCardinals, getPluralFormForCardinal,\n setPluralFormsForCardinals, populatePluralData,\n getSupportedLocales, getPluralFormsForLocale\n}\n","// Input string with the object serialized:\n// \"one:0,other:1\"\n// Output forms, names pointing to array indexes of their rules:\n// {\n// \"one\": 0,\n// \"other\": 1\n// }\nfunction parsePluralForms (serializedForms) {\n return serializedForms\n .split(',')\n .reduce((result, serializedForm) => {\n const parts = serializedForm.split(':')\n result[parts[0]] = +parts[1]\n return result\n }, {})\n}\n\n// Input forms with rules:\n// {\n// \"pluralRule-count-one\": \"i = 1 and v = 0 @integer 1\",\n// \"pluralRule-count-other\": \" @integer 0, 2~16, 100, 1000, 10000, 100000, 1000000, …\n// @decimal 0.0~1.5, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …\"\n// }\n// Output rules, an array of distinct strings:\n// [\n// \"i = 1 and v = 0 @integer 1\",\n// \" @integer 0, 2~16, 100, 1000, 10000, 100000, 1000000, …\n// @decimal 0.0~1.5, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …\",\n// ...\n// ]\n// Output forms, names pointing to array indexes of their rules:\n// {\n// \"one\": 0,\n// \"other\": 1\n// }\nfunction indexPluralForms (forms, rules) {\n // Iterate over all plural forms.\n return Object\n .keys(forms)\n .reduce((result, formName) => {\n // Refer to plural rules in the de-duplication array.\n let rule = forms[formName]\n if (typeof rule === 'string') {\n rule = rule\n .trim()\n .replace(/ {2}/g, ' ')\n let ruleIndex = rules.indexOf(rule)\n if (ruleIndex < 0) {\n ruleIndex = rules.length\n rules.push(rule)\n }\n rule = ruleIndex\n }\n // Cut off prefixes \"pluralRule-count- from plural forms.\n if (formName.length > 17) {\n formName = formName.substr(17)\n }\n result[formName] = rule\n return result\n }, {})\n}\n\nexport { indexPluralForms, parsePluralForms }\n"],"names":["supportedLocales","parsePluralForms","serializedForms","split","reduce","result","serializedForm","parts","indexPluralForms","forms","rules","Object","keys","formName","rule","trim","replace","ruleIndex","indexOf","length","push","substr","cardinals","normalizeLocale","locale","toLowerCase","getLanguage","separator","getPluralRulesForCardinals","language","undefined","Error","getPluralFormForCardinal","count","form","parsePluralRule","setPluralFormsForCardinals","populatePluralData","data","getSupportedLocales","getPluralFormsForLocale","cardinal","map","substring"],"mappings":"IAwDIA,qDCjDJ,SAASC,iBAAkBC,CAAe,CAAE,CAC1C,OAAOA,EACJC,KAAK,CAAC,KACNC,MAAM,CAAC,CAACC,EAAQC,IAAmB,CAClC,IAAMC,EAAQD,EAAeH,KAAK,CAAC,KAEnC,OADAE,CAAM,CAACE,CAAK,CAAC,EAAE,CAAC,CAAG,CAACA,CAAK,CAAC,EAAE,CACrBF,CACR,EAAE,GACP,CAoBA,SAASG,iBAAkBC,CAAK,CAAEC,CAAK,CAAE,CAEvC,OAAOC,OACJC,IAAI,CAACH,GACLL,MAAM,CAAC,CAACC,EAAQQ,IAAa,CAE5B,IAAIC,EAAOL,CAAK,CAACI,EAAS,CAC1B,GAAI,AAAgB,UAAhB,OAAOC,EAAmB,CAC5BA,EAAOA,EACJC,IAAI,GACJC,OAAO,CAAC,QAAS,KACpB,IAAIC,EAAYP,EAAMQ,OAAO,CAACJ,GAC1BG,EAAY,IACdA,EAAYP,EAAMS,MAAM,CACxBT,EAAMU,IAAI,CAACN,IAEbA,EAAOG,CACR,CAAA,AAMD,OAJIJ,EAASM,MAAM,CAAG,IACpBN,CAAAA,EAAWA,EAASQ,MAAM,CAAC,GAAE,EAE/BhB,CAAM,CAACQ,EAAS,CAAGC,EACZT,CACR,EAAE,GACP,CDzDA,IAAIK,MAAQ,EAAE,CACVY,UAAY,CAAE,EAElB,SAASC,gBAAiBC,CAAM,CAAE,CAChC,OAAOA,EAAOC,WAAW,GAAGT,OAAO,CAAC,IAAK,IAC3C,CAEA,SAASU,YAAaF,CAAM,CAAE,CAC5B,IAAMG,EAAYH,EAAON,OAAO,CAAC,KACjC,OAAOS,EAAY,GAAKH,EAAOH,MAAM,CAAC,EAAGM,EAC3C,CAEA,SAASC,2BAA4BJ,CAAM,CAAE,KAGvCK,EADJ,IAAIpB,EAAQa,SAAS,CADrBE,EAASD,gBAAgBC,GACI,CAQ7B,GANcM,KAAAA,IAAVrB,GACFoB,CAAAA,EAAWH,YAAYF,EAAM,GAE3Bf,CAAAA,EAAQa,SAAS,CAACO,EAAS,AAAD,EAG1BpB,AAAUqB,KAAAA,IAAVrB,EACF,MAAM,AAAIsB,MAAM,CAAC,sBAAsB,EAAEP,EAAO,EAAE,CAAC,CAAC,AAIrD,OAH2B,UAAjB,OAAOf,IAChBA,EAAQR,iBAAiBQ,GACzBa,SAAS,CAACO,GAAYL,EAAO,CAAGf,GAE3BA,CACT,CAEA,SAASuB,yBAA0BR,CAAM,CAAES,CAAK,CAAE,CAChD,IAAMxB,EAAQ,AAAkB,UAAlB,OAAOe,EACjBA,EACAI,2BAA2BJ,EAAO,CACtC,IAAK,IAAMU,KAAQzB,EAAO,CACxB,IAAMK,EAAOL,CAAK,CAACyB,EAAK,CACxB,GAAIC,EAAgBzB,KAAK,CAACI,EAAK,CAAEmB,GAC/B,OAAOC,CACR,AACF,CACH,CAEA,SAASE,2BAA4BZ,CAAM,CAAEf,CAAK,CAAE,CAElDa,SAAS,CADTE,EAASD,gBAAgBC,GACR,CAAGhB,iBAAiBC,EAAOC,MAC9C,CAEA,SAAS2B,mBAAoBC,CAAI,CAAE,CACjC5B,MAAQ4B,EAAK5B,KAAK,CAClBY,UAAYgB,EAAKhB,SAAS,AAC5B,CAIA,SAASiB,qBAAsB,CAE7B,OADKvC,kBAAkBA,CAAAA,iBAAmBW,OAAOC,IAAI,CAACU,UAAS,EACxDtB,gBACT,CAEA,SAASwC,wBAAwBhB,CAAM,CAAE,CACvC,IAAMiB,EAAWnB,SAAS,CAACE,EAAO,CAClC,GAAIiB,AAAaX,KAAAA,IAAbW,EACJ,OAAOA,EACJtC,KAAK,CAAC,KACNuC,GAAG,CAACR,GAAQA,EAAKS,SAAS,CAAC,EAAGT,EAAKhB,OAAO,CAAC,MAHZ,AAIpC"}AAE,SAAS,GAAG,IAAI,CAAC,UAAS;AAC5B,CAAC;AAED,IAAI,iBAAgB;AAEpB,SAAS,mBAAmB,GAAG;AAC/B,EAAE,IAAI,CAAC,gBAAgB,EAAE,gBAAgB,GAAG,MAAM,CAAC,IAAI,CAAC,SAAS,EAAC;AAClE,EAAE,OAAO,gBAAgB;AACzB,CAAC;AAED,SAAS,uBAAuB,CAAC,MAAM,EAAE;AACzC,EAAE,MAAM,QAAQ,GAAG,SAAS,CAAC,MAAM,EAAC;AACpC,EAAE,IAAI,QAAQ,KAAK,SAAS,EAAE,MAAM;AACpC,EAAE,OAAO,QAAQ;AACjB,KAAK,KAAK,CAAC,GAAG,CAAC;AACf,KAAK,GAAG,CAAC,IAAI,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC;AACtD;;;;"}