UNPKG

mui-language-picker

Version:
134 lines (133 loc) 5.17 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.bcp47Find = exports.bcp47Index = exports.bcp47Parse = exports.bcp47Match = void 0; var langTags_1 = require("./langTags"); // https://tools.ietf.org/html/bcp47 page 4 var lgPat = /^([a-z]{2,3}(-[a-z]{3}){0,3})(-[A-Z][a-z]{3})?(-[A-Z]{2}|-[0-9]{3})?(-[0-9a-z]{5,8}|-[0-9][0-9a-zA-Z]{3})*(-([0-9A-WY-Za-wy-z]-[0-9A-Za-z]{2,8}|fonipa))*(-[xX]-[0-9a-zA-Z]{1,8})*$/; function bcp47Match(code) { var result = lgPat.test(code); if (result) return result; return /en-GB-oed|i-ami|i-bnn|i-default|i-enochian|i-hak|i-klingon|i-lux|i-mingo|i-navajo|i-pwn|i-tao|i-tay|i-tsu|sgn-BE-FR|sgn-BE-NL|sgn-CH-DE/.test(code); } exports.bcp47Match = bcp47Match; var multi = function (pat, input) { var result = Array(); var index = 0; while (true) { var puItem = pat.exec(input.slice(index)); if (!puItem) break; result.push(puItem[1]); index += puItem.index + puItem[1].length; } return result; }; function bcp47Parse(code) { var match = lgPat.exec(code); // console.log(match); var language = match ? match[1] : null; var extlang = match && match[2] ? match[2].slice(1) : null; var script = match && match[3] ? match[3].slice(1) : null; var region = match && match[4] ? match[4].slice(1) : null; var variant = match && match[5] ? match[5].slice(1) : null; var extension = match && match[6] ? match[6].slice(1) : null; var privateUse = multi(/-[xX]-([0-9a-zA-Z]{1,8})/, code); var irregular = !match && bcp47Match(code) ? code : null; return { language: language, script: script, region: region, variant: variant, extension: extension, privateUse: privateUse, irregular: irregular, extlang: extlang, }; } exports.bcp47Parse = bcp47Parse; var tagLen = function (i) { var tag = langTags_1.langTags[i]; return tag.full ? tag.full.length + tag.tag.length : tag.tag.length; }; function bcp47Index(code) { var _a; if (!bcp47Match(code)) return null; var exact = Array(); langTags_1.langTags.forEach(function (lt, i) { if (lt.tag === code) exact.push(i); }); if (exact.length === 1) return exact; var inAll = Array(); langTags_1.langTags.forEach(function (lt, i) { if (lt.iso639_3 === code) { inAll.push(i); } else { if (lt.tags && lt.tags.filter(function (ltTag) { return ltTag === code; }).length > 0) inAll.push(i); } }); if (inAll.length === 1) return inAll; if (inAll.length > 0) return inAll.sort(function (i, j) { return (langTags_1.langTags[i].name < langTags_1.langTags[j].name ? -1 : 1); }); var part = Array(); langTags_1.langTags.forEach(function (lt, i) { if (lt.full && lt.full === code.slice(0, lt.full.length)) { part.push(i); } else { if (lt.tag === code.slice(0, lt.tag.length)) part.push(i); } }); if (part.length === 0) { var parse = bcp47Parse(code); if (!parse.extlang) return part; var parts = (_a = parse.language) === null || _a === void 0 ? void 0 : _a.split('-'); var isValid_1 = true; parts === null || parts === void 0 ? void 0 : parts.forEach(function (pt, j) { var codeFound = false; var ptLen = pt.length; langTags_1.langTags.forEach(function (lt, i) { if (j === 0 && lt.tag.slice(0, ptLen) === pt) { codeFound = true; } else if (lt.tag === pt) { codeFound = true; if (!part.includes(i)) part.push(i); } }); if (!codeFound) isValid_1 = false; }); if (!isValid_1) return []; return part.sort(function (i, j) { return (tagLen(i) < tagLen(j) ? -1 : 1); }); } var spart = part.sort(function (i, j) { return (tagLen(i) < tagLen(j) ? 1 : -1); }); if (spart.length <= 1) return part; var long = tagLen(spart[0]); var longList = part .filter(function (ll) { return tagLen(ll) === long; }) .sort(function (i, j) { return (langTags_1.langTags[i].name < langTags_1.langTags[j].name ? -1 : 1); }); return longList; } exports.bcp47Index = bcp47Index; function bcp47Find(code) { var _a; var result = (_a = bcp47Index(code)) === null || _a === void 0 ? void 0 : _a.map(function (i) { return langTags_1.langTags[i]; }).sort(function (i, j) { return (i.tag < j.tag ? -1 : 1); }); if ((result === null || result === void 0 ? void 0 : result.length) === 0) return null; if ((result === null || result === void 0 ? void 0 : result.length) === 1) return result[0]; return result; } exports.bcp47Find = bcp47Find;