48 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			JavaScript
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			48 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			JavaScript
		
	
	
		
			Executable File
		
	
	
	
	
| /**
 | |
|  * 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
 | |
|  */ "use strict";
 | |
| Object.defineProperty(exports, "__esModule", {
 | |
|     value: true
 | |
| });
 | |
| Object.defineProperty(exports, "splitAtTopLevelOnly", {
 | |
|     enumerable: true,
 | |
|     get: function() {
 | |
|         return splitAtTopLevelOnly;
 | |
|     }
 | |
| });
 | |
| 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;
 | |
|             }
 | |
|         }
 | |
|         isEscaped = isEscaped ? false : char === "\\";
 | |
|         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;
 | |
| }
 |