|
|
/*! * split-string <https://github.com/jonschlinkert/split-string>
* * Copyright (c) 2015-2017, Jon Schlinkert. * Released under the MIT License. */
'use strict';
var extend = require('extend-shallow');
module.exports = function(str, options, fn) { if (typeof str !== 'string') { throw new TypeError('expected a string'); }
if (typeof options === 'function') { fn = options; options = null; }
// allow separator to be defined as a string
if (typeof options === 'string') { options = { sep: options }; }
var opts = extend({sep: '.'}, options); var quotes = opts.quotes || ['"', "'", '`']; var brackets;
if (opts.brackets === true) { brackets = { '<': '>', '(': ')', '[': ']', '{': '}' }; } else if (opts.brackets) { brackets = opts.brackets; }
var tokens = []; var stack = []; var arr = ['']; var sep = opts.sep; var len = str.length; var idx = -1; var closeIdx;
function expected() { if (brackets && stack.length) { return brackets[stack[stack.length - 1]]; } }
while (++idx < len) { var ch = str[idx]; var next = str[idx + 1]; var tok = { val: ch, idx: idx, arr: arr, str: str }; tokens.push(tok);
if (ch === '\\') { tok.val = keepEscaping(opts, str, idx) === true ? (ch + next) : next; tok.escaped = true; if (typeof fn === 'function') { fn(tok); } arr[arr.length - 1] += tok.val; idx++; continue; }
if (brackets && brackets[ch]) { stack.push(ch); var e = expected(); var i = idx + 1;
if (str.indexOf(e, i + 1) !== -1) { while (stack.length && i < len) { var s = str[++i]; if (s === '\\') { s++; continue; }
if (quotes.indexOf(s) !== -1) { i = getClosingQuote(str, s, i + 1); continue; }
e = expected(); if (stack.length && str.indexOf(e, i + 1) === -1) { break; }
if (brackets[s]) { stack.push(s); continue; }
if (e === s) { stack.pop(); } } }
closeIdx = i; if (closeIdx === -1) { arr[arr.length - 1] += ch; continue; }
ch = str.slice(idx, closeIdx + 1); tok.val = ch; tok.idx = idx = closeIdx; }
if (quotes.indexOf(ch) !== -1) { closeIdx = getClosingQuote(str, ch, idx + 1); if (closeIdx === -1) { arr[arr.length - 1] += ch; continue; }
if (keepQuotes(ch, opts) === true) { ch = str.slice(idx, closeIdx + 1); } else { ch = str.slice(idx + 1, closeIdx); }
tok.val = ch; tok.idx = idx = closeIdx; }
if (typeof fn === 'function') { fn(tok, tokens); ch = tok.val; idx = tok.idx; }
if (tok.val === sep && tok.split !== false) { arr.push(''); continue; }
arr[arr.length - 1] += tok.val; }
return arr; };
function getClosingQuote(str, ch, i, brackets) { var idx = str.indexOf(ch, i); if (str.charAt(idx - 1) === '\\') { return getClosingQuote(str, ch, idx + 1); } return idx; }
function keepQuotes(ch, opts) { if (opts.keepDoubleQuotes === true && ch === '"') return true; if (opts.keepSingleQuotes === true && ch === "'") return true; return opts.keepQuotes; }
function keepEscaping(opts, str, idx) { if (typeof opts.keepEscaping === 'function') { return opts.keepEscaping(str, idx); } return opts.keepEscaping === true || str[idx + 1] === '\\'; }
|