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; | ||
|  |     } | ||
|  |   ]; | ||
|  | }); |