78 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			78 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| '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);
 | |
|     }
 | |
|   }
 | |
| }
 |