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