|
|
- 'use strict';
-
- var nanomatch = require('nanomatch');
- var extglob = require('extglob');
-
- module.exports = function(snapdragon) {
- var compilers = snapdragon.compiler.compilers;
- var opts = snapdragon.options;
-
- // register nanomatch compilers
- snapdragon.use(nanomatch.compilers);
-
- // get references to some specific nanomatch compilers before they
- // are overridden by the extglob and/or custom compilers
- var escape = compilers.escape;
- var qmark = compilers.qmark;
- var slash = compilers.slash;
- var star = compilers.star;
- var text = compilers.text;
- var plus = compilers.plus;
- var dot = compilers.dot;
-
- // register extglob compilers or escape exglobs if disabled
- if (opts.extglob === false || opts.noext === true) {
- snapdragon.compiler.use(escapeExtglobs);
- } else {
- snapdragon.use(extglob.compilers);
- }
-
- snapdragon.use(function() {
- this.options.star = this.options.star || function(/*node*/) {
- return '[^\\\\/]*?';
- };
- });
-
- // custom micromatch compilers
- snapdragon.compiler
-
- // reset referenced compiler
- .set('dot', dot)
- .set('escape', escape)
- .set('plus', plus)
- .set('slash', slash)
- .set('qmark', qmark)
- .set('star', star)
- .set('text', text);
- };
-
- function escapeExtglobs(compiler) {
- compiler.set('paren', function(node) {
- var val = '';
- visit(node, function(tok) {
- if (tok.val) val += (/^\W/.test(tok.val) ? '\\' : '') + tok.val;
- });
- return this.emit(val, node);
- });
-
- /**
- * Visit `node` with the given `fn`
- */
-
- function visit(node, fn) {
- return node.nodes ? mapVisit(node.nodes, fn) : fn(node);
- }
-
- /**
- * Map visit over array of `nodes`.
- */
-
- function mapVisit(nodes, fn) {
- var len = nodes.length;
- var idx = -1;
- while (++idx < len) {
- visit(nodes[idx], fn);
- }
- }
- }
|