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
						
					
					
				| /**
 | |
|  * 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};
 | |
|   });
 | |
| };
 |