You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					135 lines
				
				5.1 KiB
			
		
		
			
		
	
	
					135 lines
				
				5.1 KiB
			| 
								 
											3 years ago
										 
									 | 
							
								'use strict';
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								var isRegExp = require('./_is-regexp');
							 | 
						||
| 
								 | 
							
								var anObject = require('./_an-object');
							 | 
						||
| 
								 | 
							
								var speciesConstructor = require('./_species-constructor');
							 | 
						||
| 
								 | 
							
								var advanceStringIndex = require('./_advance-string-index');
							 | 
						||
| 
								 | 
							
								var toLength = require('./_to-length');
							 | 
						||
| 
								 | 
							
								var callRegExpExec = require('./_regexp-exec-abstract');
							 | 
						||
| 
								 | 
							
								var regexpExec = require('./_regexp-exec');
							 | 
						||
| 
								 | 
							
								var fails = require('./_fails');
							 | 
						||
| 
								 | 
							
								var $min = Math.min;
							 | 
						||
| 
								 | 
							
								var $push = [].push;
							 | 
						||
| 
								 | 
							
								var $SPLIT = 'split';
							 | 
						||
| 
								 | 
							
								var LENGTH = 'length';
							 | 
						||
| 
								 | 
							
								var LAST_INDEX = 'lastIndex';
							 | 
						||
| 
								 | 
							
								var MAX_UINT32 = 0xffffffff;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// babel-minify transpiles RegExp('x', 'y') -> /x/y and it causes SyntaxError
							 | 
						||
| 
								 | 
							
								var SUPPORTS_Y = !fails(function () { RegExp(MAX_UINT32, 'y'); });
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// @@split logic
							 | 
						||
| 
								 | 
							
								require('./_fix-re-wks')('split', 2, function (defined, SPLIT, $split, maybeCallNative) {
							 | 
						||
| 
								 | 
							
								  var internalSplit;
							 | 
						||
| 
								 | 
							
								  if (
							 | 
						||
| 
								 | 
							
								    'abbc'[$SPLIT](/(b)*/)[1] == 'c' ||
							 | 
						||
| 
								 | 
							
								    'test'[$SPLIT](/(?:)/, -1)[LENGTH] != 4 ||
							 | 
						||
| 
								 | 
							
								    'ab'[$SPLIT](/(?:ab)*/)[LENGTH] != 2 ||
							 | 
						||
| 
								 | 
							
								    '.'[$SPLIT](/(.?)(.?)/)[LENGTH] != 4 ||
							 | 
						||
| 
								 | 
							
								    '.'[$SPLIT](/()()/)[LENGTH] > 1 ||
							 | 
						||
| 
								 | 
							
								    ''[$SPLIT](/.?/)[LENGTH]
							 | 
						||
| 
								 | 
							
								  ) {
							 | 
						||
| 
								 | 
							
								    // based on es5-shim implementation, need to rework it
							 | 
						||
| 
								 | 
							
								    internalSplit = function (separator, limit) {
							 | 
						||
| 
								 | 
							
								      var string = String(this);
							 | 
						||
| 
								 | 
							
								      if (separator === undefined && limit === 0) return [];
							 | 
						||
| 
								 | 
							
								      // If `separator` is not a regex, use native split
							 | 
						||
| 
								 | 
							
								      if (!isRegExp(separator)) return $split.call(string, separator, limit);
							 | 
						||
| 
								 | 
							
								      var output = [];
							 | 
						||
| 
								 | 
							
								      var flags = (separator.ignoreCase ? 'i' : '') +
							 | 
						||
| 
								 | 
							
								                  (separator.multiline ? 'm' : '') +
							 | 
						||
| 
								 | 
							
								                  (separator.unicode ? 'u' : '') +
							 | 
						||
| 
								 | 
							
								                  (separator.sticky ? 'y' : '');
							 | 
						||
| 
								 | 
							
								      var lastLastIndex = 0;
							 | 
						||
| 
								 | 
							
								      var splitLimit = limit === undefined ? MAX_UINT32 : limit >>> 0;
							 | 
						||
| 
								 | 
							
								      // Make `global` and avoid `lastIndex` issues by working with a copy
							 | 
						||
| 
								 | 
							
								      var separatorCopy = new RegExp(separator.source, flags + 'g');
							 | 
						||
| 
								 | 
							
								      var match, lastIndex, lastLength;
							 | 
						||
| 
								 | 
							
								      while (match = regexpExec.call(separatorCopy, string)) {
							 | 
						||
| 
								 | 
							
								        lastIndex = separatorCopy[LAST_INDEX];
							 | 
						||
| 
								 | 
							
								        if (lastIndex > lastLastIndex) {
							 | 
						||
| 
								 | 
							
								          output.push(string.slice(lastLastIndex, match.index));
							 | 
						||
| 
								 | 
							
								          if (match[LENGTH] > 1 && match.index < string[LENGTH]) $push.apply(output, match.slice(1));
							 | 
						||
| 
								 | 
							
								          lastLength = match[0][LENGTH];
							 | 
						||
| 
								 | 
							
								          lastLastIndex = lastIndex;
							 | 
						||
| 
								 | 
							
								          if (output[LENGTH] >= splitLimit) break;
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        if (separatorCopy[LAST_INDEX] === match.index) separatorCopy[LAST_INDEX]++; // Avoid an infinite loop
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								      if (lastLastIndex === string[LENGTH]) {
							 | 
						||
| 
								 | 
							
								        if (lastLength || !separatorCopy.test('')) output.push('');
							 | 
						||
| 
								 | 
							
								      } else output.push(string.slice(lastLastIndex));
							 | 
						||
| 
								 | 
							
								      return output[LENGTH] > splitLimit ? output.slice(0, splitLimit) : output;
							 | 
						||
| 
								 | 
							
								    };
							 | 
						||
| 
								 | 
							
								  // Chakra, V8
							 | 
						||
| 
								 | 
							
								  } else if ('0'[$SPLIT](undefined, 0)[LENGTH]) {
							 | 
						||
| 
								 | 
							
								    internalSplit = function (separator, limit) {
							 | 
						||
| 
								 | 
							
								      return separator === undefined && limit === 0 ? [] : $split.call(this, separator, limit);
							 | 
						||
| 
								 | 
							
								    };
							 | 
						||
| 
								 | 
							
								  } else {
							 | 
						||
| 
								 | 
							
								    internalSplit = $split;
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  return [
							 | 
						||
| 
								 | 
							
								    // `String.prototype.split` method
							 | 
						||
| 
								 | 
							
								    // https://tc39.github.io/ecma262/#sec-string.prototype.split
							 | 
						||
| 
								 | 
							
								    function split(separator, limit) {
							 | 
						||
| 
								 | 
							
								      var O = defined(this);
							 | 
						||
| 
								 | 
							
								      var splitter = separator == undefined ? undefined : separator[SPLIT];
							 | 
						||
| 
								 | 
							
								      return splitter !== undefined
							 | 
						||
| 
								 | 
							
								        ? splitter.call(separator, O, limit)
							 | 
						||
| 
								 | 
							
								        : internalSplit.call(String(O), separator, limit);
							 | 
						||
| 
								 | 
							
								    },
							 | 
						||
| 
								 | 
							
								    // `RegExp.prototype[@@split]` method
							 | 
						||
| 
								 | 
							
								    // https://tc39.github.io/ecma262/#sec-regexp.prototype-@@split
							 | 
						||
| 
								 | 
							
								    //
							 | 
						||
| 
								 | 
							
								    // NOTE: This cannot be properly polyfilled in engines that don't support
							 | 
						||
| 
								 | 
							
								    // the 'y' flag.
							 | 
						||
| 
								 | 
							
								    function (regexp, limit) {
							 | 
						||
| 
								 | 
							
								      var res = maybeCallNative(internalSplit, regexp, this, limit, internalSplit !== $split);
							 | 
						||
| 
								 | 
							
								      if (res.done) return res.value;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      var rx = anObject(regexp);
							 | 
						||
| 
								 | 
							
								      var S = String(this);
							 | 
						||
| 
								 | 
							
								      var C = speciesConstructor(rx, RegExp);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      var unicodeMatching = rx.unicode;
							 | 
						||
| 
								 | 
							
								      var flags = (rx.ignoreCase ? 'i' : '') +
							 | 
						||
| 
								 | 
							
								                  (rx.multiline ? 'm' : '') +
							 | 
						||
| 
								 | 
							
								                  (rx.unicode ? 'u' : '') +
							 | 
						||
| 
								 | 
							
								                  (SUPPORTS_Y ? 'y' : 'g');
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      // ^(? + rx + ) is needed, in combination with some S slicing, to
							 | 
						||
| 
								 | 
							
								      // simulate the 'y' flag.
							 | 
						||
| 
								 | 
							
								      var splitter = new C(SUPPORTS_Y ? rx : '^(?:' + rx.source + ')', flags);
							 | 
						||
| 
								 | 
							
								      var lim = limit === undefined ? MAX_UINT32 : limit >>> 0;
							 | 
						||
| 
								 | 
							
								      if (lim === 0) return [];
							 | 
						||
| 
								 | 
							
								      if (S.length === 0) return callRegExpExec(splitter, S) === null ? [S] : [];
							 | 
						||
| 
								 | 
							
								      var p = 0;
							 | 
						||
| 
								 | 
							
								      var q = 0;
							 | 
						||
| 
								 | 
							
								      var A = [];
							 | 
						||
| 
								 | 
							
								      while (q < S.length) {
							 | 
						||
| 
								 | 
							
								        splitter.lastIndex = SUPPORTS_Y ? q : 0;
							 | 
						||
| 
								 | 
							
								        var z = callRegExpExec(splitter, SUPPORTS_Y ? S : S.slice(q));
							 | 
						||
| 
								 | 
							
								        var e;
							 | 
						||
| 
								 | 
							
								        if (
							 | 
						||
| 
								 | 
							
								          z === null ||
							 | 
						||
| 
								 | 
							
								          (e = $min(toLength(splitter.lastIndex + (SUPPORTS_Y ? 0 : q)), S.length)) === p
							 | 
						||
| 
								 | 
							
								        ) {
							 | 
						||
| 
								 | 
							
								          q = advanceStringIndex(S, q, unicodeMatching);
							 | 
						||
| 
								 | 
							
								        } else {
							 | 
						||
| 
								 | 
							
								          A.push(S.slice(p, q));
							 | 
						||
| 
								 | 
							
								          if (A.length === lim) return A;
							 | 
						||
| 
								 | 
							
								          for (var i = 1; i <= z.length - 1; i++) {
							 | 
						||
| 
								 | 
							
								            A.push(z[i]);
							 | 
						||
| 
								 | 
							
								            if (A.length === lim) return A;
							 | 
						||
| 
								 | 
							
								          }
							 | 
						||
| 
								 | 
							
								          q = p = e;
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								      A.push(S.slice(p));
							 | 
						||
| 
								 | 
							
								      return A;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  ];
							 | 
						||
| 
								 | 
							
								});
							 |