CoastalCommitsPastes/server/node_modules/bcp47/lib/index.js
2022-03-06 16:46:59 -08:00

173 lines
No EOL
3.1 KiB
JavaScript

'use strict';
module.exports.parse = function (tag) {
var re = /^(?:(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)|(art-lojban|cel-gaulish|no-bok|no-nyn|zh-guoyu|zh-hakka|zh-min|zh-min-nan|zh-xiang))$|^((?:[a-z]{2,3}(?:(?:-[a-z]{3}){1,3})?)|[a-z]{4}|[a-z]{5,8})(?:-([a-z]{4}))?(?:-([a-z]{2}|\d{3}))?((?:-(?:[\da-z]{5,8}|\d[\da-z]{3}))*)?((?:-[\da-wy-z](?:-[\da-z]{2,8})+)*)?(-x(?:-[\da-z]{1,8})+)?$|^(x(?:-[\da-z]{1,8})+)$/i;
/*
/
^
(?:
(
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
) |
(
art-lojban | cel-gaulish | no-bok | no-nyn | zh-guoyu | zh-hakka |
zh-min | zh-min-nan | zh-xiang
)
)
$
|
^
(
(?:
[a-z]{2,3}
(?:
(?:
-[a-z]{3}
){1,3}
)?
) |
[a-z]{4} |
[a-z]{5,8}
)
(?:
-
(
[a-z]{4}
)
)?
(?:
-
(
[a-z]{2} |
\d{3}
)
)?
(
(?:
-
(?:
[\da-z]{5,8} |
\d[\da-z]{3}
)
)*
)?
(
(?:
-
[\da-wy-z]
(?:
-[\da-z]{2,8}
)+
)*
)?
(
-x
(?:
-[\da-z]{1,8}
)+
)?
$
|
^
(
x
(?:
-[\da-z]{1,8}
)+
)
$
/i
*/
var res = re.exec(tag);
if (!res) return null;
res.shift();
var t;
// langtag language
var language = null;
var extlang = [];
if (res[2]) {
t = res[2].split('-');
language = t.shift();
extlang = t;
}
// langtag variant
var variant = [];
if (res[5]) {
variant = res[5].split('-');
variant.shift();
}
// langtag extension
var extension = [];
if (res[6]) {
t = res[6].split('-');
t.shift();
var singleton;
var ext = [];
while (t.length) {
var e = t.shift();
if (e.length === 1) {
if (singleton) {
extension.push({
singleton: singleton,
extension: ext
});
singleton = e;
ext = [];
} else {
singleton = e;
}
} else {
ext.push(e);
}
}
extension.push({
singleton: singleton,
extension: ext
});
}
// langtag privateuse
var langtagPrivateuse = [];
if (res[7]) {
langtagPrivateuse = res[7].split('-');
langtagPrivateuse.shift();
langtagPrivateuse.shift();
}
// privateuse
var privateuse = [];
if (res[8]) {
privateuse = res[8].split('-');
privateuse.shift();
}
return {
langtag: {
language: {
language: language,
extlang: extlang
},
script: res[3] || null,
region: res[4] || null,
variant: variant,
extension: extension,
privateuse: langtagPrivateuse
},
privateuse: privateuse,
grandfathered: {
irregular: res[0] || null,
regular: res[1] || null
}
};
};