44 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			44 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| 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) {
 | |
|         if (node.type === types.REPETITION) {
 | |
|             starHeight ++;
 | |
|             reps ++;
 | |
|             if (starHeight > 1) return false;
 | |
|             if (reps > replimit) return false;
 | |
|         }
 | |
|         
 | |
|         if (node.options) {
 | |
|             for (var i = 0, len = node.options.length; i < len; i++) {
 | |
|                 var 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 (var i = 0; i < stack.length; i++) {
 | |
|             var ok = walk(stack[i], starHeight);
 | |
|             if (!ok) return false;
 | |
|         }
 | |
|         
 | |
|         return true;
 | |
|     })(re, 0);
 | |
| };
 | |
| 
 | |
| function isRegExp (x) {
 | |
|     return {}.toString.call(x) === '[object RegExp]';
 | |
| }
 |