70 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			70 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| 'use strict';
 | |
| 
 | |
| var regex = require('regex-not');
 | |
| var Cache = require('fragment-cache');
 | |
| 
 | |
| /**
 | |
|  * Utils
 | |
|  */
 | |
| 
 | |
| var utils = module.exports;
 | |
| var cache = utils.cache = new Cache();
 | |
| 
 | |
| /**
 | |
|  * Cast `val` to an array
 | |
|  * @return {Array}
 | |
|  */
 | |
| 
 | |
| utils.arrayify = function(val) {
 | |
|   if (!Array.isArray(val)) {
 | |
|     return [val];
 | |
|   }
 | |
|   return val;
 | |
| };
 | |
| 
 | |
| /**
 | |
|  * Memoize a generated regex or function
 | |
|  */
 | |
| 
 | |
| utils.memoize = function(type, pattern, options, fn) {
 | |
|   var key = utils.createKey(type + pattern, options);
 | |
| 
 | |
|   if (cache.has(type, key)) {
 | |
|     return cache.get(type, key);
 | |
|   }
 | |
| 
 | |
|   var val = fn(pattern, options);
 | |
|   if (options && options.cache === false) {
 | |
|     return val;
 | |
|   }
 | |
| 
 | |
|   cache.set(type, key, val);
 | |
|   return val;
 | |
| };
 | |
| 
 | |
| /**
 | |
|  * Create the key to use for memoization. The key is generated
 | |
|  * by iterating over the options and concatenating key-value pairs
 | |
|  * to the pattern string.
 | |
|  */
 | |
| 
 | |
| utils.createKey = function(pattern, options) {
 | |
|   var key = pattern;
 | |
|   if (typeof options === 'undefined') {
 | |
|     return key;
 | |
|   }
 | |
|   for (var prop in options) {
 | |
|     key += ';' + prop + '=' + String(options[prop]);
 | |
|   }
 | |
|   return key;
 | |
| };
 | |
| 
 | |
| /**
 | |
|  * Create the regex to use for matching text
 | |
|  */
 | |
| 
 | |
| utils.createRegex = function(str) {
 | |
|   var opts = {contains: true, strictClose: false};
 | |
|   return regex(str, opts);
 | |
| };
 |