aboutsummaryrefslogtreecommitdiff
path: root/node_modules/micromatch/lib/parsers.js
diff options
context:
space:
mode:
Diffstat (limited to 'node_modules/micromatch/lib/parsers.js')
-rw-r--r--node_modules/micromatch/lib/parsers.js83
1 files changed, 83 insertions, 0 deletions
diff --git a/node_modules/micromatch/lib/parsers.js b/node_modules/micromatch/lib/parsers.js
new file mode 100644
index 0000000..f80498c
--- /dev/null
+++ b/node_modules/micromatch/lib/parsers.js
@@ -0,0 +1,83 @@
+'use strict';
+
+var extglob = require('extglob');
+var nanomatch = require('nanomatch');
+var regexNot = require('regex-not');
+var toRegex = require('to-regex');
+var not;
+
+/**
+ * Characters to use in negation regex (we want to "not" match
+ * characters that are matched by other parsers)
+ */
+
+var TEXT = '([!@*?+]?\\(|\\)|\\[:?(?=.*?:?\\])|:?\\]|[*+?!^$.\\\\/])+';
+var createNotRegex = function(opts) {
+ return not || (not = textRegex(TEXT));
+};
+
+/**
+ * Parsers
+ */
+
+module.exports = function(snapdragon) {
+ var parsers = snapdragon.parser.parsers;
+
+ // register nanomatch parsers
+ snapdragon.use(nanomatch.parsers);
+
+ // get references to some specific nanomatch parsers before they
+ // are overridden by the extglob and/or parsers
+ var escape = parsers.escape;
+ var slash = parsers.slash;
+ var qmark = parsers.qmark;
+ var plus = parsers.plus;
+ var star = parsers.star;
+ var dot = parsers.dot;
+
+ // register extglob parsers
+ snapdragon.use(extglob.parsers);
+
+ // custom micromatch parsers
+ snapdragon.parser
+ .use(function() {
+ // override "notRegex" created in nanomatch parser
+ this.notRegex = /^\!+(?!\()/;
+ })
+ // reset the referenced parsers
+ .capture('escape', escape)
+ .capture('slash', slash)
+ .capture('qmark', qmark)
+ .capture('star', star)
+ .capture('plus', plus)
+ .capture('dot', dot)
+
+ /**
+ * Override `text` parser
+ */
+
+ .capture('text', function() {
+ if (this.isInside('bracket')) return;
+ var pos = this.position();
+ var m = this.match(createNotRegex(this.options));
+ if (!m || !m[0]) return;
+
+ // escape regex boundary characters and simple brackets
+ var val = m[0].replace(/([[\]^$])/g, '\\$1');
+
+ return pos({
+ type: 'text',
+ val: val
+ });
+ });
+};
+
+/**
+ * Create text regex
+ */
+
+function textRegex(pattern) {
+ var notStr = regexNot.create(pattern, {contains: true, strictClose: false});
+ var prefix = '(?:[\\^]|\\\\|';
+ return toRegex(prefix + notStr + ')', {strictClose: false});
+}