| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162 | function split(value, separator, includeSeparator, openLevel, closeLevel, firstOnly) {  var withRegex = typeof separator != 'string';  var hasSeparator = withRegex ?    separator.test(value) :    value.indexOf(separator);  if (!hasSeparator)    return [value];  openLevel = openLevel || '(';  closeLevel = closeLevel || ')';  if (value.indexOf(openLevel) == -1 && !includeSeparator && !firstOnly)    return value.split(separator);  var BACKSLASH = '\\';  var isEscaped = false;  var wasEscaped = false;  var level = 0;  var cursor = 0;  var lastStart = 0;  var len = value.length;  var tokens = [];  while (cursor < len) {    isEscaped = value[cursor] == BACKSLASH;    if (wasEscaped) {      // no-op    } else    if (value[cursor] == openLevel) {      level++;    } else if (value[cursor] == closeLevel) {      level--;    }    if (!wasEscaped && level === 0 && cursor > 0 && cursor + 1 < len && (withRegex ? separator.test(value[cursor]) : value[cursor] == separator)) {      tokens.push(value.substring(lastStart, cursor + (includeSeparator ? 1 : 0)));      lastStart = cursor + 1;      if (firstOnly && tokens.length == 1) {        break;      }    }    wasEscaped = isEscaped;    cursor++;  }  if (lastStart < cursor + 1) {    var lastValue = value.substring(lastStart);    var lastCharacter = lastValue[lastValue.length - 1];    if (!includeSeparator && (withRegex ? separator.test(lastCharacter) : lastCharacter == separator))      lastValue = lastValue.substring(0, lastValue.length - 1);    tokens.push(lastValue);  }  return tokens;}module.exports = split;
 |