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