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.
		
		
		
		
		
			
		
			
				
					69 lines
				
				1.6 KiB
			
		
		
			
		
	
	
					69 lines
				
				1.6 KiB
			| 
											3 years ago
										 | /** | ||
|  |  * Obliterator Split Function | ||
|  |  * =========================== | ||
|  |  * | ||
|  |  * Function returning an iterator over the pieces of a regex split. | ||
|  |  */ | ||
|  | var Iterator = require('./iterator.js'); | ||
|  | 
 | ||
|  | /** | ||
|  |  * Function used to make the given pattern global. | ||
|  |  * | ||
|  |  * @param  {RegExp} pattern - Regular expression to make global. | ||
|  |  * @return {RegExp} | ||
|  |  */ | ||
|  | function makeGlobal(pattern) { | ||
|  |   var flags = 'g'; | ||
|  | 
 | ||
|  |   if (pattern.multiline) flags += 'm'; | ||
|  |   if (pattern.ignoreCase) flags += 'i'; | ||
|  |   if (pattern.sticky) flags += 'y'; | ||
|  |   if (pattern.unicode) flags += 'u'; | ||
|  | 
 | ||
|  |   return new RegExp(pattern.source, flags); | ||
|  | } | ||
|  | 
 | ||
|  | /** | ||
|  |  * Split. | ||
|  |  * | ||
|  |  * @param  {RegExp}   pattern - Regular expression to use. | ||
|  |  * @param  {string}   string  - Target string. | ||
|  |  * @return {Iterator} | ||
|  |  */ | ||
|  | module.exports = function split(pattern, string) { | ||
|  |   if (!(pattern instanceof RegExp)) | ||
|  |     throw new Error( | ||
|  |       'obliterator/split: invalid pattern. Expecting a regular expression.' | ||
|  |     ); | ||
|  | 
 | ||
|  |   if (typeof string !== 'string') | ||
|  |     throw new Error('obliterator/split: invalid target. Expecting a string.'); | ||
|  | 
 | ||
|  |   // NOTE: cloning the pattern has a performance cost but side effects for not
 | ||
|  |   // doing so might be worse.
 | ||
|  |   pattern = makeGlobal(pattern); | ||
|  | 
 | ||
|  |   var consumed = false, | ||
|  |     current = 0; | ||
|  | 
 | ||
|  |   return new Iterator(function () { | ||
|  |     if (consumed) return {done: true}; | ||
|  | 
 | ||
|  |     var match = pattern.exec(string), | ||
|  |       value, | ||
|  |       length; | ||
|  | 
 | ||
|  |     if (match) { | ||
|  |       length = match.index + match[0].length; | ||
|  | 
 | ||
|  |       value = string.slice(current, match.index); | ||
|  |       current = length; | ||
|  |     } else { | ||
|  |       consumed = true; | ||
|  |       value = string.slice(current); | ||
|  |     } | ||
|  | 
 | ||
|  |     return {value: value, done: false}; | ||
|  |   }); | ||
|  | }; |