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