diff options
| author | Philipp Tanlak <philipp.tanlak@gmail.com> | 2025-11-24 20:54:57 +0100 |
|---|---|---|
| committer | Philipp Tanlak <philipp.tanlak@gmail.com> | 2025-11-24 20:57:48 +0100 |
| commit | b1e2c8fd5cb5dfa46bc440a12eafaf56cd844b1c (patch) | |
| tree | 49d360fd6cbc6a2754efe93524ac47ff0fbe0f7d /node_modules/tailwindcss/src/util/splitAtTopLevelOnly.js | |
Docs
Diffstat (limited to 'node_modules/tailwindcss/src/util/splitAtTopLevelOnly.js')
| -rw-r--r-- | node_modules/tailwindcss/src/util/splitAtTopLevelOnly.js | 52 |
1 files changed, 52 insertions, 0 deletions
diff --git a/node_modules/tailwindcss/src/util/splitAtTopLevelOnly.js b/node_modules/tailwindcss/src/util/splitAtTopLevelOnly.js new file mode 100644 index 0000000..a749c79 --- /dev/null +++ b/node_modules/tailwindcss/src/util/splitAtTopLevelOnly.js @@ -0,0 +1,52 @@ +/** + * This splits a string on a top-level character. + * + * Regex doesn't support recursion (at least not the JS-flavored version). + * So we have to use a tiny state machine to keep track of paren placement. + * + * Expected behavior using commas: + * var(--a, 0 0 1px rgb(0, 0, 0)), 0 0 1px rgb(0, 0, 0) + * ─┬─ ┬ ┬ ┬ + * x x x ╰──────── Split because top-level + * ╰──────────────┴──┴───────────── Ignored b/c inside >= 1 levels of parens + * + * @param {string} input + * @param {string} separator + */ +export function splitAtTopLevelOnly(input, separator) { + let stack = [] + let parts = [] + let lastPos = 0 + let isEscaped = false + + for (let idx = 0; idx < input.length; idx++) { + let char = input[idx] + + if (stack.length === 0 && char === separator[0] && !isEscaped) { + if (separator.length === 1 || input.slice(idx, idx + separator.length) === separator) { + parts.push(input.slice(lastPos, idx)) + lastPos = idx + separator.length + } + } + + if (isEscaped) { + isEscaped = false + } else if (char === '\\') { + isEscaped = true + } + + if (char === '(' || char === '[' || char === '{') { + stack.push(char) + } else if ( + (char === ')' && stack[stack.length - 1] === '(') || + (char === ']' && stack[stack.length - 1] === '[') || + (char === '}' && stack[stack.length - 1] === '{') + ) { + stack.pop() + } + } + + parts.push(input.slice(lastPos)) + + return parts +} |