plural-rules
Version:
Evaluates plural rules, so that localization libraries can choose the right plural form.
1 lines • 7.09 kB
Source Map (JSON)
{"version":3,"file":"code.cjs","sources":["../src/data-indexer.js","../src/code.js"],"sourcesContent":["// 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","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"],"names":[],"mappings":"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"}