3 var brackets = require('expand-brackets');
4 var define = require('define-property');
5 var utils = require('./utils');
8 * Characters to use in text regex (we want to "not" match
9 * characters that are matched by other parsers)
12 var TEXT_REGEX = '([!@*?+]?\\(|\\)|[*?.+\\\\]|\\[:?(?=.*\\])|:?\\])+';
13 var not = utils.createRegex(TEXT_REGEX);
19 function parsers(extglob) {
20 extglob.state = extglob.state || {};
23 * Use `expand-brackets` parsers
26 extglob.use(brackets.parsers);
27 extglob.parser.sets.paren = extglob.parser.sets.paren || [];
34 .capture('paren.open', function() {
35 var parsed = this.parsed;
36 var pos = this.position();
37 var m = this.match(/^([!@*?+])?\(/);
40 var prev = this.prev();
56 // if nested negation extglobs, just cancel them out to simplify
57 if (prefix === '!' && prev.type === 'paren' && prev.prefix === '!') {
62 define(node, 'rest', this.input);
63 define(node, 'parsed', parsed);
64 define(node, 'parent', prev);
65 define(open, 'parent', node);
67 this.push('paren', node);
68 prev.nodes.push(node);
75 .capture('paren.close', function() {
76 var parsed = this.parsed;
77 var pos = this.position();
78 var m = this.match(/^\)/);
81 var parent = this.pop('paren');
89 if (!this.isType(parent, 'paren')) {
90 if (this.options.strict) {
91 throw new Error('missing opening paren: "("');
97 node.prefix = parent.prefix;
98 parent.nodes.push(node);
99 define(node, 'parent', parent);
106 .capture('escape', function() {
107 var pos = this.position();
108 var m = this.match(/^\\(.)/);
119 * Question marks: "?"
122 .capture('qmark', function() {
123 var parsed = this.parsed;
124 var pos = this.position();
125 var m = this.match(/^\?+(?!\()/);
127 extglob.state.metachar = true;
140 .capture('star', /^\*(?!\()/)
141 .capture('plus', /^\+(?!\()/)
142 .capture('dot', /^\./)
143 .capture('text', not);
147 * Expose text regex string
150 module.exports.TEXT_REGEX = TEXT_REGEX;
156 module.exports = parsers;