| | |
| | | return parts; |
| | | } |
| | | |
| | | function expandTop(str) { |
| | | function expandTop(str, options) { |
| | | if (!str) |
| | | return []; |
| | | |
| | | options = options || {}; |
| | | var max = options.max == null ? Infinity : options.max; |
| | | |
| | | // I don't know why Bash 4.3 does this, but it does. |
| | | // Anything starting with {} will have the first two bytes preserved |
| | |
| | | str = '\\{\\}' + str.substr(2); |
| | | } |
| | | |
| | | return expand(escapeBraces(str), true).map(unescapeBraces); |
| | | return expand(escapeBraces(str), max, true).map(unescapeBraces); |
| | | } |
| | | |
| | | function identity(e) { |
| | |
| | | return i >= y; |
| | | } |
| | | |
| | | function expand(str, isTop) { |
| | | function expand(str, max, isTop) { |
| | | var expansions = []; |
| | | |
| | | var m = balanced('{', '}', str); |
| | |
| | | // {a},b} |
| | | if (m.post.match(/,(?!,).*\}/)) { |
| | | str = m.pre + '{' + m.body + escClose + m.post; |
| | | return expand(str); |
| | | return expand(str, max, true); |
| | | } |
| | | return [str]; |
| | | } |
| | |
| | | n = parseCommaParts(m.body); |
| | | if (n.length === 1) { |
| | | // x{{a,b}}y ==> x{a}y x{b}y |
| | | n = expand(n[0], false).map(embrace); |
| | | n = expand(n[0], max, false).map(embrace); |
| | | if (n.length === 1) { |
| | | var post = m.post.length |
| | | ? expand(m.post, false) |
| | | ? expand(m.post, max, false) |
| | | : ['']; |
| | | return post.map(function(p) { |
| | | return m.pre + n[0] + p; |
| | |
| | | // no need to expand pre, since it is guaranteed to be free of brace-sets |
| | | var pre = m.pre; |
| | | var post = m.post.length |
| | | ? expand(m.post, false) |
| | | ? expand(m.post, max, false) |
| | | : ['']; |
| | | |
| | | var N; |
| | |
| | | var y = numeric(n[1]); |
| | | var width = Math.max(n[0].length, n[1].length) |
| | | var incr = n.length == 3 |
| | | ? Math.abs(numeric(n[2])) |
| | | ? Math.max(Math.abs(numeric(n[2])), 1) |
| | | : 1; |
| | | var test = lte; |
| | | var reverse = y < x; |
| | |
| | | N.push(c); |
| | | } |
| | | } else { |
| | | N = concatMap(n, function(el) { return expand(el, false) }); |
| | | N = concatMap(n, function(el) { return expand(el, max, false) }); |
| | | } |
| | | |
| | | for (var j = 0; j < N.length; j++) { |
| | | for (var k = 0; k < post.length; k++) { |
| | | for (var k = 0; k < post.length && expansions.length < max; k++) { |
| | | var expansion = pre + N[j] + post[k]; |
| | | if (!isTop || isSequence || expansion) |
| | | expansions.push(expansion); |
| | |
| | | |
| | | return expansions; |
| | | } |
| | | |