split.js 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  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 level = 0;
  13. var cursor = 0;
  14. var lastStart = 0;
  15. var len = value.length;
  16. var tokens = [];
  17. while (cursor < len) {
  18. if (value[cursor] == openLevel) {
  19. level++;
  20. } else if (value[cursor] == closeLevel) {
  21. level--;
  22. }
  23. if (level === 0 && cursor > 0 && cursor + 1 < len && (withRegex ? separator.test(value[cursor]) : value[cursor] == separator)) {
  24. tokens.push(value.substring(lastStart, cursor + (includeSeparator ? 1 : 0)));
  25. lastStart = cursor + 1;
  26. if (firstOnly && tokens.length == 1) {
  27. break;
  28. }
  29. }
  30. cursor++;
  31. }
  32. if (lastStart < cursor + 1) {
  33. var lastValue = value.substring(lastStart);
  34. var lastCharacter = lastValue[lastValue.length - 1];
  35. if (!includeSeparator && (withRegex ? separator.test(lastCharacter) : lastCharacter == separator))
  36. lastValue = lastValue.substring(0, lastValue.length - 1);
  37. tokens.push(lastValue);
  38. }
  39. return tokens;
  40. }
  41. module.exports = split;