Some checks failed
Build & Deploy / 🔍 Prepare (push) Successful in 20s
Build & Deploy / 🧪 QA (push) Failing after 34s
Build & Deploy / 🏗️ Build (push) Has started running
Build & Deploy / 🚀 Deploy (push) Has been cancelled
Build & Deploy / 🧪 Smoke Test (push) Has been cancelled
Build & Deploy / ⚡ Lighthouse (push) Has been cancelled
Build & Deploy / 🔔 Notify (push) Has been cancelled
45 lines
1.2 KiB
Plaintext
45 lines
1.2 KiB
Plaintext
import { invariant } from "./utils.js";
|
|
export function UnicodeExtensionComponents(extension) {
|
|
invariant(extension === extension.toLowerCase(), "Expected extension to be lowercase");
|
|
invariant(extension.slice(0, 3) === "-u-", "Expected extension to be a Unicode locale extension");
|
|
const attributes = [];
|
|
const keywords = [];
|
|
let keyword;
|
|
let size = extension.length;
|
|
let k = 3;
|
|
while (k < size) {
|
|
let e = extension.indexOf("-", k);
|
|
let len;
|
|
if (e === -1) {
|
|
len = size - k;
|
|
} else {
|
|
len = e - k;
|
|
}
|
|
let subtag = extension.slice(k, k + len);
|
|
invariant(len >= 2, "Expected a subtag to have at least 2 characters");
|
|
if (keyword === undefined && len != 2) {
|
|
if (attributes.indexOf(subtag) === -1) {
|
|
attributes.push(subtag);
|
|
}
|
|
} else if (len === 2) {
|
|
keyword = {
|
|
key: subtag,
|
|
value: ""
|
|
};
|
|
if (keywords.find((k) => k.key === keyword?.key) === undefined) {
|
|
keywords.push(keyword);
|
|
}
|
|
} else if (keyword?.value === "") {
|
|
keyword.value = subtag;
|
|
} else {
|
|
invariant(keyword !== undefined, "Expected keyword to be defined");
|
|
keyword.value += "-" + subtag;
|
|
}
|
|
k += len + 1;
|
|
}
|
|
return {
|
|
attributes,
|
|
keywords
|
|
};
|
|
}
|