[6a3a178] | 1 | 'use strict';
|
---|
| 2 |
|
---|
| 3 | var regex = require('regex-not');
|
---|
| 4 | var Cache = require('fragment-cache');
|
---|
| 5 |
|
---|
| 6 | /**
|
---|
| 7 | * Utils
|
---|
| 8 | */
|
---|
| 9 |
|
---|
| 10 | var utils = module.exports;
|
---|
| 11 | var cache = utils.cache = new Cache();
|
---|
| 12 |
|
---|
| 13 | /**
|
---|
| 14 | * Cast `val` to an array
|
---|
| 15 | * @return {Array}
|
---|
| 16 | */
|
---|
| 17 |
|
---|
| 18 | utils.arrayify = function(val) {
|
---|
| 19 | if (!Array.isArray(val)) {
|
---|
| 20 | return [val];
|
---|
| 21 | }
|
---|
| 22 | return val;
|
---|
| 23 | };
|
---|
| 24 |
|
---|
| 25 | /**
|
---|
| 26 | * Memoize a generated regex or function
|
---|
| 27 | */
|
---|
| 28 |
|
---|
| 29 | utils.memoize = function(type, pattern, options, fn) {
|
---|
| 30 | var key = utils.createKey(type + pattern, options);
|
---|
| 31 |
|
---|
| 32 | if (cache.has(type, key)) {
|
---|
| 33 | return cache.get(type, key);
|
---|
| 34 | }
|
---|
| 35 |
|
---|
| 36 | var val = fn(pattern, options);
|
---|
| 37 | if (options && options.cache === false) {
|
---|
| 38 | return val;
|
---|
| 39 | }
|
---|
| 40 |
|
---|
| 41 | cache.set(type, key, val);
|
---|
| 42 | return val;
|
---|
| 43 | };
|
---|
| 44 |
|
---|
| 45 | /**
|
---|
| 46 | * Create the key to use for memoization. The key is generated
|
---|
| 47 | * by iterating over the options and concatenating key-value pairs
|
---|
| 48 | * to the pattern string.
|
---|
| 49 | */
|
---|
| 50 |
|
---|
| 51 | utils.createKey = function(pattern, options) {
|
---|
| 52 | var key = pattern;
|
---|
| 53 | if (typeof options === 'undefined') {
|
---|
| 54 | return key;
|
---|
| 55 | }
|
---|
| 56 | for (var prop in options) {
|
---|
| 57 | key += ';' + prop + '=' + String(options[prop]);
|
---|
| 58 | }
|
---|
| 59 | return key;
|
---|
| 60 | };
|
---|
| 61 |
|
---|
| 62 | /**
|
---|
| 63 | * Create the regex to use for matching text
|
---|
| 64 | */
|
---|
| 65 |
|
---|
| 66 | utils.createRegex = function(str) {
|
---|
| 67 | var opts = {contains: true, strictClose: false};
|
---|
| 68 | return regex(str, opts);
|
---|
| 69 | };
|
---|