( codepoints: number[] | undefined, )
| 2 | |
| 3 | /** Convert codepoints into a CSS `unicode-range` string. */ |
| 4 | export const codepointsToRangeString = ( |
| 5 | codepoints: number[] | undefined, |
| 6 | ): string => { |
| 7 | if (!codepoints || codepoints.length === 0) { |
| 8 | return ''; |
| 9 | } |
| 10 | |
| 11 | const sorted = Array.from(new Set(codepoints)).sort((a, b) => a - b); |
| 12 | const ranges: (number | [number, number])[] = []; |
| 13 | |
| 14 | let rangeStart = sorted[0] as number; |
| 15 | for (let i = 1; i <= sorted.length; i++) { |
| 16 | const current = sorted[i]; |
| 17 | const prev = sorted[i - 1] as number; |
| 18 | |
| 19 | if (current !== prev + 1) { |
| 20 | if (rangeStart === prev) { |
| 21 | ranges.push(rangeStart); |
| 22 | } else { |
| 23 | ranges.push([rangeStart, prev]); |
| 24 | } |
| 25 | rangeStart = current as number; |
| 26 | } |
| 27 | } |
| 28 | |
| 29 | return formatUnicodeRanges(ranges).join(', ').toUpperCase(); |
| 30 | }; |
no outgoing calls
no test coverage detected