(chars)
| 32 | * @returns {string} optimized character class content (without the brackets) |
| 33 | */ |
| 34 | const charsToCharClassContent = (chars) => { |
| 35 | if (chars.length === 0) return ""; |
| 36 | if (chars.length === 1) return quoteMetaInCharClass(chars[0]); |
| 37 | |
| 38 | // Sort by char code |
| 39 | const sorted = [...chars].sort((a, b) => a.charCodeAt(0) - b.charCodeAt(0)); |
| 40 | |
| 41 | /** @type {string[]} */ |
| 42 | const parts = []; |
| 43 | let rangeStart = sorted[0]; |
| 44 | let rangeEnd = sorted[0]; |
| 45 | |
| 46 | for (let i = 1; i < sorted.length; i++) { |
| 47 | const char = sorted[i]; |
| 48 | const prevCode = rangeEnd.charCodeAt(0); |
| 49 | const currCode = char.charCodeAt(0); |
| 50 | |
| 51 | if (currCode === prevCode + 1) { |
| 52 | // Extend the range |
| 53 | rangeEnd = char; |
| 54 | } else { |
| 55 | // Flush the current range |
| 56 | parts.push(formatRange(rangeStart, rangeEnd)); |
| 57 | rangeStart = char; |
| 58 | rangeEnd = char; |
| 59 | } |
| 60 | } |
| 61 | // Flush the last range |
| 62 | parts.push(formatRange(rangeStart, rangeEnd)); |
| 63 | |
| 64 | return parts.join(""); |
| 65 | }; |
| 66 | |
| 67 | /** |
| 68 | * Formats a range of characters for use in a character class |
no test coverage detected