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.
		
		
		
		
		
			
		
			
				
					49 lines
				
				1.1 KiB
			
		
		
			
		
	
	
					49 lines
				
				1.1 KiB
			| 
								 
											3 years ago
										 
									 | 
							
								'use strict'
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								var parse = require('ret')
							 | 
						||
| 
								 | 
							
								var types = parse.types
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								module.exports = function (re, opts) {
							 | 
						||
| 
								 | 
							
								  if (!opts) opts = {}
							 | 
						||
| 
								 | 
							
								  var replimit = opts.limit === undefined ? 25 : opts.limit
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  if (isRegExp(re)) re = re.source
							 | 
						||
| 
								 | 
							
								  else if (typeof re !== 'string') re = String(re)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  try { re = parse(re) } catch (err) { return false }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  var reps = 0
							 | 
						||
| 
								 | 
							
								  return (function walk (node, starHeight) {
							 | 
						||
| 
								 | 
							
								    var i
							 | 
						||
| 
								 | 
							
								    var ok
							 | 
						||
| 
								 | 
							
								    var len
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    if (node.type === types.REPETITION) {
							 | 
						||
| 
								 | 
							
								      starHeight++
							 | 
						||
| 
								 | 
							
								      reps++
							 | 
						||
| 
								 | 
							
								      if (starHeight > 1) return false
							 | 
						||
| 
								 | 
							
								      if (reps > replimit) return false
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    if (node.options) {
							 | 
						||
| 
								 | 
							
								      for (i = 0, len = node.options.length; i < len; i++) {
							 | 
						||
| 
								 | 
							
								        ok = walk({ stack: node.options[i] }, starHeight)
							 | 
						||
| 
								 | 
							
								        if (!ok) return false
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    var stack = node.stack || (node.value && node.value.stack)
							 | 
						||
| 
								 | 
							
								    if (!stack) return true
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    for (i = 0; i < stack.length; i++) {
							 | 
						||
| 
								 | 
							
								      ok = walk(stack[i], starHeight)
							 | 
						||
| 
								 | 
							
								      if (!ok) return false
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    return true
							 | 
						||
| 
								 | 
							
								  })(re, 0)
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function isRegExp (x) {
							 | 
						||
| 
								 | 
							
								  return {}.toString.call(x) === '[object RegExp]'
							 | 
						||
| 
								 | 
							
								}
							 |