compilers.js
1 'use strict'; 2 3 var nanomatch = require('nanomatch'); 4 var extglob = require('extglob'); 5 6 module.exports = function(snapdragon) { 7 var compilers = snapdragon.compiler.compilers; 8 var opts = snapdragon.options; 9 10 // register nanomatch compilers 11 snapdragon.use(nanomatch.compilers); 12 13 // get references to some specific nanomatch compilers before they 14 // are overridden by the extglob and/or custom compilers 15 var escape = compilers.escape; 16 var qmark = compilers.qmark; 17 var slash = compilers.slash; 18 var star = compilers.star; 19 var text = compilers.text; 20 var plus = compilers.plus; 21 var dot = compilers.dot; 22 23 // register extglob compilers or escape exglobs if disabled 24 if (opts.extglob === false || opts.noext === true) { 25 snapdragon.compiler.use(escapeExtglobs); 26 } else { 27 snapdragon.use(extglob.compilers); 28 } 29 30 snapdragon.use(function() { 31 this.options.star = this.options.star || function(/*node*/) { 32 return '[^\\\\/]*?'; 33 }; 34 }); 35 36 // custom micromatch compilers 37 snapdragon.compiler 38 39 // reset referenced compiler 40 .set('dot', dot) 41 .set('escape', escape) 42 .set('plus', plus) 43 .set('slash', slash) 44 .set('qmark', qmark) 45 .set('star', star) 46 .set('text', text); 47 }; 48 49 function escapeExtglobs(compiler) { 50 compiler.set('paren', function(node) { 51 var val = ''; 52 visit(node, function(tok) { 53 if (tok.val) val += (/^\W/.test(tok.val) ? '\\' : '') + tok.val; 54 }); 55 return this.emit(val, node); 56 }); 57 58 /** 59 * Visit `node` with the given `fn` 60 */ 61 62 function visit(node, fn) { 63 return node.nodes ? mapVisit(node.nodes, fn) : fn(node); 64 } 65 66 /** 67 * Map visit over array of `nodes`. 68 */ 69 70 function mapVisit(nodes, fn) { 71 var len = nodes.length; 72 var idx = -1; 73 while (++idx < len) { 74 visit(nodes[idx], fn); 75 } 76 } 77 }