You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							78 lines
						
					
					
						
							1.7 KiB
						
					
					
				
			
		
		
	
	
							78 lines
						
					
					
						
							1.7 KiB
						
					
					
				'use strict'; | 
						|
 | 
						|
/** | 
						|
 * Module dependencies | 
						|
 */ | 
						|
 | 
						|
var Snapdragon = require('snapdragon'); | 
						|
var define = require('define-property'); | 
						|
var extend = require('extend-shallow'); | 
						|
 | 
						|
/** | 
						|
 * Local dependencies | 
						|
 */ | 
						|
 | 
						|
var compilers = require('./compilers'); | 
						|
var parsers = require('./parsers'); | 
						|
 | 
						|
/** | 
						|
 * Customize Snapdragon parser and renderer | 
						|
 */ | 
						|
 | 
						|
function Extglob(options) { | 
						|
  this.options = extend({source: 'extglob'}, options); | 
						|
  this.snapdragon = this.options.snapdragon || new Snapdragon(this.options); | 
						|
  this.snapdragon.patterns = this.snapdragon.patterns || {}; | 
						|
  this.compiler = this.snapdragon.compiler; | 
						|
  this.parser = this.snapdragon.parser; | 
						|
 | 
						|
  compilers(this.snapdragon); | 
						|
  parsers(this.snapdragon); | 
						|
 | 
						|
  /** | 
						|
   * Override Snapdragon `.parse` method | 
						|
   */ | 
						|
 | 
						|
  define(this.snapdragon, 'parse', function(str, options) { | 
						|
    var parsed = Snapdragon.prototype.parse.apply(this, arguments); | 
						|
    parsed.input = str; | 
						|
 | 
						|
    // escape unmatched brace/bracket/parens | 
						|
    var last = this.parser.stack.pop(); | 
						|
    if (last && this.options.strict !== true) { | 
						|
      var node = last.nodes[0]; | 
						|
      node.val = '\\' + node.val; | 
						|
      var sibling = node.parent.nodes[1]; | 
						|
      if (sibling.type === 'star') { | 
						|
        sibling.loose = true; | 
						|
      } | 
						|
    } | 
						|
 | 
						|
    // add non-enumerable parser reference | 
						|
    define(parsed, 'parser', this.parser); | 
						|
    return parsed; | 
						|
  }); | 
						|
 | 
						|
  /** | 
						|
   * Decorate `.parse` method | 
						|
   */ | 
						|
 | 
						|
  define(this, 'parse', function(ast, options) { | 
						|
    return this.snapdragon.parse.apply(this.snapdragon, arguments); | 
						|
  }); | 
						|
 | 
						|
  /** | 
						|
   * Decorate `.compile` method | 
						|
   */ | 
						|
 | 
						|
  define(this, 'compile', function(ast, options) { | 
						|
    return this.snapdragon.compile.apply(this.snapdragon, arguments); | 
						|
  }); | 
						|
 | 
						|
} | 
						|
 | 
						|
/** | 
						|
 * Expose `Extglob` | 
						|
 */ | 
						|
 | 
						|
module.exports = Extglob;
 | 
						|
 |