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.
		
		
		
		
		
			
		
			
				
					
					
						
							83 lines
						
					
					
						
							2.0 KiB
						
					
					
				
			
		
		
	
	
							83 lines
						
					
					
						
							2.0 KiB
						
					
					
				'use strict'; | 
						|
 | 
						|
var extglob = require('extglob'); | 
						|
var nanomatch = require('nanomatch'); | 
						|
var regexNot = require('regex-not'); | 
						|
var toRegex = require('to-regex'); | 
						|
var not; | 
						|
 | 
						|
/** | 
						|
 * Characters to use in negation regex (we want to "not" match | 
						|
 * characters that are matched by other parsers) | 
						|
 */ | 
						|
 | 
						|
var TEXT = '([!@*?+]?\\(|\\)|\\[:?(?=.*?:?\\])|:?\\]|[*+?!^$.\\\\/])+'; | 
						|
var createNotRegex = function(opts) { | 
						|
  return not || (not = textRegex(TEXT)); | 
						|
}; | 
						|
 | 
						|
/** | 
						|
 * Parsers | 
						|
 */ | 
						|
 | 
						|
module.exports = function(snapdragon) { | 
						|
  var parsers = snapdragon.parser.parsers; | 
						|
 | 
						|
  // register nanomatch parsers | 
						|
  snapdragon.use(nanomatch.parsers); | 
						|
 | 
						|
  // get references to some specific nanomatch parsers before they | 
						|
  // are overridden by the extglob and/or parsers | 
						|
  var escape = parsers.escape; | 
						|
  var slash = parsers.slash; | 
						|
  var qmark = parsers.qmark; | 
						|
  var plus = parsers.plus; | 
						|
  var star = parsers.star; | 
						|
  var dot = parsers.dot; | 
						|
 | 
						|
  // register extglob parsers | 
						|
  snapdragon.use(extglob.parsers); | 
						|
 | 
						|
  // custom micromatch parsers | 
						|
  snapdragon.parser | 
						|
    .use(function() { | 
						|
      // override "notRegex" created in nanomatch parser | 
						|
      this.notRegex = /^\!+(?!\()/; | 
						|
    }) | 
						|
    // reset the referenced parsers | 
						|
    .capture('escape', escape) | 
						|
    .capture('slash', slash) | 
						|
    .capture('qmark', qmark) | 
						|
    .capture('star', star) | 
						|
    .capture('plus', plus) | 
						|
    .capture('dot', dot) | 
						|
 | 
						|
    /** | 
						|
     * Override `text` parser | 
						|
     */ | 
						|
 | 
						|
    .capture('text', function() { | 
						|
      if (this.isInside('bracket')) return; | 
						|
      var pos = this.position(); | 
						|
      var m = this.match(createNotRegex(this.options)); | 
						|
      if (!m || !m[0]) return; | 
						|
 | 
						|
      // escape regex boundary characters and simple brackets | 
						|
      var val = m[0].replace(/([[\]^$])/g, '\\$1'); | 
						|
 | 
						|
      return pos({ | 
						|
        type: 'text', | 
						|
        val: val | 
						|
      }); | 
						|
    }); | 
						|
}; | 
						|
 | 
						|
/** | 
						|
 * Create text regex | 
						|
 */ | 
						|
 | 
						|
function textRegex(pattern) { | 
						|
  var notStr = regexNot.create(pattern, {contains: true, strictClose: false}); | 
						|
  var prefix = '(?:[\\^]|\\\\|'; | 
						|
  return toRegex(prefix + notStr + ')', {strictClose: false}); | 
						|
}
 | 
						|
 |