( chunks: string[] | string )
| 51 | } |
| 52 | |
| 53 | export function parseUnicodeLanguageId( |
| 54 | chunks: string[] | string |
| 55 | ): UnicodeLanguageId { |
| 56 | if (typeof chunks === 'string') { |
| 57 | chunks = chunks.split(SEPARATOR) |
| 58 | } |
| 59 | const lang = chunks.shift() |
| 60 | if (!lang) { |
| 61 | throw new RangeError('Missing unicode_language_subtag') |
| 62 | } |
| 63 | if (lang === 'root') { |
| 64 | return {lang: 'root', variants: []} |
| 65 | } |
| 66 | // unicode_language_subtag |
| 67 | if (!isUnicodeLanguageSubtag(lang)) { |
| 68 | throw new RangeError('Malformed unicode_language_subtag') |
| 69 | } |
| 70 | let script |
| 71 | // unicode_script_subtag |
| 72 | if (chunks.length && isUnicodeScriptSubtag(chunks[0])) { |
| 73 | script = chunks.shift() |
| 74 | } |
| 75 | let region |
| 76 | // unicode_region_subtag |
| 77 | if (chunks.length && isUnicodeRegionSubtag(chunks[0])) { |
| 78 | region = chunks.shift() |
| 79 | } |
| 80 | const variants: Record<string, any> = {} |
| 81 | while (chunks.length && isUnicodeVariantSubtag(chunks[0])) { |
| 82 | const variant: string = chunks.shift()! |
| 83 | if (variant in variants) { |
| 84 | throw new RangeError(`Duplicate variant "${variant}"`) |
| 85 | } |
| 86 | variants[variant] = 1 |
| 87 | } |
| 88 | return { |
| 89 | lang, |
| 90 | script, |
| 91 | region, |
| 92 | variants: Object.keys(variants), |
| 93 | } |
| 94 | } |
| 95 | |
| 96 | function parseUnicodeExtension(chunks: string[]): UnicodeExtension { |
| 97 | const keywords = [] |
no test coverage detected