|
|
- '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});
- }
|