Spaces:
Running
Running
File size: 2,728 Bytes
917af0c | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 | let enabledGlobal = true;
/** @type {Map<string, boolean>} */
const enabledAreas = new Map();
/** @type {Map<string, Map<string, any>>} */
const cache = new Map();
export function toggle_global(enabled) {
enabledGlobal = !!enabled;
}
export function toggle_area(area, enabled) {
enabledAreas.set(area, !!enabled);
}
export function has(area, key) {
if (!isEnabled(area)) return false;
const areaCache = cache.get(area);
if (!areaCache) return false;
return areaCache.has(key);
}
export function add(area, key, data) {
if (!isEnabled(area)) return;
let areaCache = cache.get(area);
if (!areaCache) {
areaCache = new Map();
cache.set(area, areaCache);
}
areaCache.set(key, data);
}
export function get(area, key, defaultValue = null) {
if (!isEnabled(area)) return defaultValue;
const areaCache = cache.get(area);
if (!areaCache) return defaultValue;
return areaCache.has(key) ? areaCache.get(key) : defaultValue;
}
export function remove(area, key) {
if (!isEnabled(area)) return;
const areaCache = cache.get(area);
if (!areaCache) return;
areaCache.delete(key);
}
export function clear(area) {
if (hasGlob(area)) {
const re = globToRegExp(area);
for (const k of cache.keys()) {
if (re.test(k)) cache.delete(k);
}
return;
}
cache.delete(area);
}
export function clear_all() {
cache.clear();
}
function isEnabled(area) {
if (!enabledGlobal) return false;
const v = enabledAreas.get(area);
return v === undefined ? true : v;
}
function hasGlob(pattern) {
return /[\*\?\[]/.test(pattern);
}
function escapeRegExpChar(ch) {
return /[\\^$.*+?()[\]{}|]/.test(ch) ? `\\${ch}` : ch;
}
function globToRegExp(glob) {
let out = "^";
for (let i = 0; i < glob.length; i++) {
const ch = glob[i];
if (ch === "*") {
out += ".*";
continue;
}
if (ch === "?") {
out += ".";
continue;
}
if (ch === "[") {
const end = glob.indexOf("]", i + 1);
if (end === -1) {
out += "\\[";
continue;
}
const content = glob.slice(i + 1, end);
let cls = "";
let j = 0;
if (content[0] === "!" || content[0] === "^") {
cls += "^";
j++;
}
for (; j < content.length; j++) {
const c = content[j];
if (c === "\\") {
cls += "\\\\";
continue;
}
if (c === "]") {
cls += "\\]";
continue;
}
if (c === "-") {
cls += "-";
continue;
}
cls += escapeRegExpChar(c);
}
out += `[${cls}]`;
i = end;
continue;
}
out += escapeRegExpChar(ch);
}
out += "$";
return new RegExp(out);
}
|