UNPKG

3.12 kBJavaScriptView Raw
1/*!
2 * expand-brackets <https://github.com/jonschlinkert/expand-brackets>
3 *
4 * Copyright (c) 2015 Jon Schlinkert.
5 * Licensed under the MIT license.
6 */
7
8'use strict';
9
10/**
11 * POSIX character classes
12 */
13
14var POSIX = {
15 alnum: 'a-zA-Z0-9',
16 alpha: 'a-zA-Z',
17 blank: ' \\s\\t',
18 cntrl: '\\x00-\\x1F\\x7F',
19 digit: '0-9',
20 graph: '\\x21-\\x7E',
21 lower: 'a-z',
22 print: '\\x20-\\x7E',
23 punct: '!"#$%&\'()\\*+,-./:;<=>?@[\\]^_`{|}~',
24 space: ' \\s\\t\\r\\n\\v\\f',
25 upper: 'A-Z',
26 word: 'A-Za-z0-9_',
27 xdigit: 'A-Fa-f0-9',
28};
29
30/**
31 * Expose `brackets`
32 */
33
34module.exports = brackets;
35
36function brackets(str) {
37 var negated = false;
38
39 if (str.indexOf('[^') !== -1) {
40 negated = true;
41 str = str.split('[^').join('[');
42 }
43 if (str.indexOf('[!') !== -1) {
44 negated = true;
45 str = str.split('[!').join('[');
46 }
47
48 var a = str.split('[');
49 var b = str.split(']');
50 var imbalanced = a.length !== b.length;
51
52 var parts = str.split(/(?::\]\[:|\[?\[:|:\]\]?)/);
53 var len = parts.length, i = 0;
54 var end = '', beg = '';
55 var res = [];
56
57 while (len--) {
58 var inner = parts[i++];
59 if (inner === '^[!' || inner === '[!') {
60 inner = '';
61 negated = true;
62 }
63
64 var prefix = negated ? '^' : '';
65 var ch = POSIX[inner];
66
67 if (ch) {
68 res.push('[' + prefix + ch + ']');
69 } else if (inner) {
70 if (/^\[?\w-\w\]?$/.test(inner)) {
71 if (i === parts.length) {
72 res.push('[' + prefix + inner);
73 } else if (i === 1) {
74 res.push(prefix + inner + ']');
75 } else {
76 res.push(prefix + inner);
77 }
78 } else {
79 if (i === 1) {
80 beg += inner;
81 } else if (i === parts.length) {
82 end += inner;
83 } else {
84 res.push('[' + prefix + inner + ']');
85 }
86 }
87 }
88 }
89
90 var result = res.join('|');
91 var len = res.length || 1;
92 if (len > 1) {
93 result = '(?:' + result + ')';
94 len = 1;
95 }
96 if (beg) {
97 len++;
98 if (beg.charAt(0) === '[') {
99 if (imbalanced) {
100 beg = '\\[' + beg.slice(1);
101 } else {
102 beg += ']';
103 }
104 }
105 result = beg + result;
106 }
107 if (end) {
108 len++;
109 if (end.slice(-1) === ']') {
110 if (imbalanced) {
111 end = end.slice(0, end.length - 1) + '\\]';
112 } else {
113 end = '[' + end;
114 }
115 }
116 result += end;
117 }
118
119 if (len > 1) {
120 result = result.split('][').join(']|[');
121 if (result.indexOf('|') !== -1 && !/\(\?/.test(result)) {
122 result = '(?:' + result + ')';
123 }
124 }
125
126 result = result.replace(/\[+=|=\]+/g, '\\b');
127 return result;
128}
129
130brackets.makeRe = function (pattern) {
131 try {
132 return new RegExp(brackets(pattern));
133 } catch (err) {}
134};
135
136brackets.isMatch = function (str, pattern) {
137 try {
138 return brackets.makeRe(pattern).test(str);
139 } catch (err) {
140 return false;
141 }
142};
143
144brackets.match = function (arr, pattern) {
145 var len = arr.length, i = 0;
146 var res = arr.slice();
147
148 var re = brackets.makeRe(pattern);
149 while (i < len) {
150 var ele = arr[i++];
151 if (!re.test(ele)) {
152 continue;
153 }
154 res.splice(i, 1);
155 }
156 return res;
157};