function getfugu_split(input) {
var i = 0, stack = [], parts = [], part = '';
while(i < input.length) {
var c = input[i]; i++; // get character
if (c == ' ' && stack.length == 0) {
parts.push(part.replace(/"/g, '\\\"')); // append part
part = ''; // reset part accumulator
continue;
}
if (c == '{' || c == '[') stack.push(c); // begin curly or square brace
else if (c == '}' && stack[stack.length-1] == '{') stack.pop(); // end curly brace
else if (c == ']' && stack[stack.length-1] == '[') stack.pop(); // end square brace
part += c; // append character to current part
}
if (part.length > 0) parts.push(part.replace(/"/g, '\\\"')); // append remaining part
return parts;
}
getfugu_split('foo bar["s 1"]{a:{b:["s 2", "s 3"]}, x:" [s 4] "} woo{c:y} [e:{" s [6]"}] [simple square bracket] {simple curly bracket}')
["foo", "bar[\"s 1\"]{a:{b:[\"s 2\", \"s 3\"]}, x:\" [s 4] \"}", "woo{c:y}", "[e:{\" s [6]\"}]", "[simple square bracket]", "{simple curly bracket}"]