123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178 |
- 'use strict';
- var isExtglob = require('is-extglob');
- var re, cache = {};
- module.exports = extglob;
- function extglob(str, opts) {
- opts = opts || {};
- var o = {}, i = 0;
-
-
- str = str.replace(/!\(([^\w*()])/g, '$1!(');
-
- str = str.replace(/([*\/])\.!\([*]\)/g, function (m, ch) {
- if (ch === '/') {
- return escape('\\/[^.]+');
- }
- return escape('[^.]+');
- });
-
-
- var key = str
- + String(!!opts.regex)
- + String(!!opts.contains)
- + String(!!opts.escape);
- if (cache.hasOwnProperty(key)) {
- return cache[key];
- }
- if (!(re instanceof RegExp)) {
- re = regex();
- }
- opts.negate = false;
- var m;
- while (m = re.exec(str)) {
- var prefix = m[1];
- var inner = m[3];
- if (prefix === '!') {
- opts.negate = true;
- }
- var id = '__EXTGLOB_' + (i++) + '__';
-
- o[id] = wrap(inner, prefix, opts.escape);
- str = str.split(m[0]).join(id);
- }
- var keys = Object.keys(o);
- var len = keys.length;
-
-
-
- while (len--) {
- var prop = keys[len];
- str = str.split(prop).join(o[prop]);
- }
- var result = opts.regex
- ? toRegex(str, opts.contains, opts.negate)
- : str;
- result = result.split('.').join('\\.');
-
- return (cache[key] = result);
- }
- function wrap(inner, prefix, esc) {
- if (esc) inner = escape(inner);
- switch (prefix) {
- case '!':
- return '(?!' + inner + ')[^/]' + (esc ? '%%%~' : '*?');
- case '@':
- return '(?:' + inner + ')';
- case '+':
- return '(?:' + inner + ')+';
- case '*':
- return '(?:' + inner + ')' + (esc ? '%%' : '*')
- case '?':
- return '(?:' + inner + '|)';
- default:
- return inner;
- }
- }
- function escape(str) {
- str = str.split('*').join('[^/]%%%~');
- str = str.split('.').join('\\.');
- return str;
- }
- function regex() {
- return /(\\?[@?!+*$]\\?)(\(([^()]*?)\))/;
- }
- function negate(str) {
- return '(?!^' + str + ').*$';
- }
- function toRegex(pattern, contains, isNegated) {
- var prefix = contains ? '^' : '';
- var after = contains ? '$' : '';
- pattern = ('(?:' + pattern + ')' + after);
- if (isNegated) {
- pattern = prefix + negate(pattern);
- }
- return new RegExp(prefix + pattern);
- }
|