split.js 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. function split(value, separator, includeSeparator, openLevel, closeLevel, firstOnly) {
  2. var withRegex = typeof separator != 'string';
  3. var hasSeparator = withRegex ?
  4. separator.test(value) :
  5. value.indexOf(separator);
  6. if (!hasSeparator)
  7. return [value];
  8. openLevel = openLevel || '(';
  9. closeLevel = closeLevel || ')';
  10. if (value.indexOf(openLevel) == -1 && !includeSeparator && !firstOnly)
  11. return value.split(separator);
  12. var BACKSLASH = '\\';
  13. var isEscaped = false;
  14. var wasEscaped = false;
  15. var level = 0;
  16. var cursor = 0;
  17. var lastStart = 0;
  18. var len = value.length;
  19. var tokens = [];
  20. while (cursor < len) {
  21. isEscaped = value[cursor] == BACKSLASH;
  22. if (wasEscaped) {
  23. // no-op
  24. } else
  25. if (value[cursor] == openLevel) {
  26. level++;
  27. } else if (value[cursor] == closeLevel) {
  28. level--;
  29. }
  30. if (!wasEscaped && level === 0 && cursor > 0 && cursor + 1 < len && (withRegex ? separator.test(value[cursor]) : value[cursor] == separator)) {
  31. tokens.push(value.substring(lastStart, cursor + (includeSeparator ? 1 : 0)));
  32. lastStart = cursor + 1;
  33. if (firstOnly && tokens.length == 1) {
  34. break;
  35. }
  36. }
  37. wasEscaped = isEscaped;
  38. cursor++;
  39. }
  40. if (lastStart < cursor + 1) {
  41. var lastValue = value.substring(lastStart);
  42. var lastCharacter = lastValue[lastValue.length - 1];
  43. if (!includeSeparator && (withRegex ? separator.test(lastCharacter) : lastCharacter == separator))
  44. lastValue = lastValue.substring(0, lastValue.length - 1);
  45. tokens.push(lastValue);
  46. }
  47. return tokens;
  48. }
  49. module.exports = split;