7 var compilers = require('./lib/compilers');
8 var parsers = require('./lib/parsers');
14 var debug = require('debug')('expand-brackets');
15 var extend = require('extend-shallow');
16 var Snapdragon = require('snapdragon');
17 var toRegex = require('to-regex');
20 * Parses the given POSIX character class `pattern` and returns a
21 * string that can be used for creating regular expressions for matching.
23 * @param {String} `pattern`
24 * @param {Object} `options`
29 function brackets(pattern, options) {
30 debug('initializing from <%s>', __filename);
31 var res = brackets.create(pattern, options);
36 * Takes an array of strings and a POSIX character class pattern, and returns a new
37 * array with only the strings that matched the pattern.
40 * var brackets = require('expand-brackets');
41 * console.log(brackets.match(['1', 'a', 'ab'], '[[:alpha:]]'));
44 * console.log(brackets.match(['1', 'a', 'ab'], '[[:alpha:]]+'));
47 * @param {Array} `arr` Array of strings to match
48 * @param {String} `pattern` POSIX character class pattern(s)
49 * @param {Object} `options`
54 brackets.match = function(arr, pattern, options) {
56 var opts = extend({}, options);
57 var isMatch = brackets.matcher(pattern, opts);
69 if (res.length === 0) {
70 if (opts.failglob === true) {
71 throw new Error('no matches found for "' + pattern + '"');
74 if (opts.nonull === true || opts.nullglob === true) {
75 return [pattern.split('\\').join('')];
82 * Returns true if the specified `string` matches the given
86 * var brackets = require('expand-brackets');
88 * console.log(brackets.isMatch('a.a', '[[:alpha:]].[[:alpha:]]'));
90 * console.log(brackets.isMatch('1.2', '[[:alpha:]].[[:alpha:]]'));
93 * @param {String} `string` String to match
94 * @param {String} `pattern` Poxis pattern
95 * @param {String} `options`
100 brackets.isMatch = function(str, pattern, options) {
101 return brackets.matcher(pattern, options)(str);
105 * Takes a POSIX character class pattern and returns a matcher function. The returned
106 * function takes the string to match as its only argument.
109 * var brackets = require('expand-brackets');
110 * var isMatch = brackets.matcher('[[:lower:]].[[:upper:]]');
112 * console.log(isMatch('a.a'));
114 * console.log(isMatch('a.A'));
117 * @param {String} `pattern` Poxis pattern
118 * @param {String} `options`
123 brackets.matcher = function(pattern, options) {
124 var re = brackets.makeRe(pattern, options);
125 return function(str) {
131 * Create a regular expression from the given `pattern`.
134 * var brackets = require('expand-brackets');
135 * var re = brackets.makeRe('[[:alpha:]]');
137 * //=> /^(?:[a-zA-Z])$/
139 * @param {String} `pattern` The pattern to convert to regex.
140 * @param {Object} `options`
145 brackets.makeRe = function(pattern, options) {
146 var res = brackets.create(pattern, options);
147 var opts = extend({strictErrors: false}, options);
148 return toRegex(res.output, opts);
152 * Parses the given POSIX character class `pattern` and returns an object
153 * with the compiled `output` and optional source `map`.
156 * var brackets = require('expand-brackets');
157 * console.log(brackets('[[:alpha:]]'));
158 * // { options: { source: 'string' },
159 * // input: '[[:alpha:]]',
162 * // { eos: [Function],
163 * // noop: [Function],
164 * // bos: [Function],
165 * // not: [Function],
166 * // escape: [Function],
167 * // text: [Function],
168 * // posix: [Function],
169 * // bracket: [Function],
170 * // 'bracket.open': [Function],
171 * // 'bracket.inner': [Function],
172 * // 'bracket.literal': [Function],
173 * // 'bracket.close': [Function] },
174 * // output: '[a-zA-Z]',
178 * // nodes: [ [Object], [Object], [Object] ] },
179 * // parsingErrors: [] }
181 * @param {String} `pattern`
182 * @param {Object} `options`
187 brackets.create = function(pattern, options) {
188 var snapdragon = (options && options.snapdragon) || new Snapdragon(options);
189 compilers(snapdragon);
192 var ast = snapdragon.parse(pattern, options);
194 var res = snapdragon.compile(ast, options);
200 * Expose `brackets` constructor, parsers and compilers
203 brackets.compilers = compilers;
204 brackets.parsers = parsers;
211 module.exports = brackets;