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