@realsee/dnalogel
Version:
373 lines (372 loc) • 10.3 kB
JavaScript
const M = typeof navigator != "undefined" ? navigator.userAgent.toLowerCase().indexOf("firefox") > 0 : !1;
function j(e, t, i, n) {
e.addEventListener ? e.addEventListener(t, i, n) : e.attachEvent && e.attachEvent("on".concat(t), i);
}
function O(e, t, i, n) {
e.removeEventListener ? e.removeEventListener(t, i, n) : e.detachEvent && e.detachEvent("on".concat(t), i);
}
function B(e, t) {
const i = t.slice(0, t.length - 1);
for (let n = 0; n < i.length; n++)
i[n] = e[i[n].toLowerCase()];
return i;
}
function D(e) {
typeof e != "string" && (e = ""), e = e.replace(/\s/g, "");
const t = e.split(",");
let i = t.lastIndexOf("");
for (; i >= 0; )
t[i - 1] += ",", t.splice(i, 1), i = t.lastIndexOf("");
return t;
}
function H(e, t) {
const i = e.length >= t.length ? e : t, n = e.length >= t.length ? t : e;
let s = !0;
for (let f = 0; f < i.length; f++)
n.indexOf(i[f]) === -1 && (s = !1);
return s;
}
const b = {
backspace: 8,
"⌫": 8,
tab: 9,
clear: 12,
enter: 13,
"↩": 13,
return: 13,
esc: 27,
escape: 27,
space: 32,
left: 37,
up: 38,
right: 39,
down: 40,
del: 46,
delete: 46,
ins: 45,
insert: 45,
home: 36,
end: 35,
pageup: 33,
pagedown: 34,
capslock: 20,
num_0: 96,
num_1: 97,
num_2: 98,
num_3: 99,
num_4: 100,
num_5: 101,
num_6: 102,
num_7: 103,
num_8: 104,
num_9: 105,
num_multiply: 106,
num_add: 107,
num_enter: 108,
num_subtract: 109,
num_decimal: 110,
num_divide: 111,
"⇪": 20,
",": 188,
".": 190,
"/": 191,
"`": 192,
"-": M ? 173 : 189,
"=": M ? 61 : 187,
";": M ? 59 : 186,
"'": 222,
"[": 219,
"]": 221,
"\\": 220
}, h = {
// shiftKey
"⇧": 16,
shift: 16,
// altKey
"⌥": 18,
alt: 18,
option: 18,
// ctrlKey
"⌃": 17,
ctrl: 17,
control: 17,
// metaKey
"⌘": 91,
cmd: 91,
command: 91
}, P = {
16: "shiftKey",
18: "altKey",
17: "ctrlKey",
91: "metaKey",
shiftKey: 16,
ctrlKey: 17,
altKey: 18,
metaKey: 91
}, u = {
16: !1,
18: !1,
17: !1,
91: !1
}, c = {};
for (let e = 1; e < 20; e++)
b["f".concat(e)] = 111 + e;
let r = [], E = null, z = "all";
const m = /* @__PURE__ */ new Map(), L = (e) => b[e.toLowerCase()] || h[e.toLowerCase()] || e.toUpperCase().charCodeAt(0), I = (e) => Object.keys(b).find((t) => b[t] === e), R = (e) => Object.keys(h).find((t) => h[t] === e);
function F(e) {
z = e || "all";
}
function x() {
return z || "all";
}
function V() {
return r.slice(0);
}
function X() {
return r.map((e) => I(e) || R(e) || String.fromCharCode(e));
}
function q() {
const e = [];
return Object.keys(c).forEach((t) => {
c[t].forEach((i) => {
let {
key: n,
scope: s,
mods: f,
shortcut: l
} = i;
e.push({
scope: s,
shortcut: l,
mods: f,
keys: n.split("+").map((o) => L(o))
});
});
}), e;
}
function J(e) {
const t = e.target || e.srcElement, {
tagName: i
} = t;
let n = !0;
const s = i === "INPUT" && !["checkbox", "radio", "range", "button", "file", "reset", "submit", "color"].includes(t.type);
return (t.isContentEditable || (s || i === "TEXTAREA" || i === "SELECT") && !t.readOnly) && (n = !1), n;
}
function Q(e) {
return typeof e == "string" && (e = L(e)), r.indexOf(e) !== -1;
}
function W(e, t) {
let i, n;
e || (e = x());
for (const s in c)
if (Object.prototype.hasOwnProperty.call(c, s))
for (i = c[s], n = 0; n < i.length; )
i[n].scope === e ? i.splice(n, 1).forEach((l) => {
let {
element: o
} = l;
return S(o);
}) : n++;
x() === e && F(t || "all");
}
function Y(e) {
let t = e.keyCode || e.which || e.charCode;
const i = r.indexOf(t);
if (i >= 0 && r.splice(i, 1), e.key && e.key.toLowerCase() === "meta" && r.splice(0, r.length), (t === 93 || t === 224) && (t = 91), t in u) {
u[t] = !1;
for (const n in h)
h[n] === t && (w[n] = !1);
}
}
function G(e) {
if (typeof e == "undefined")
Object.keys(c).forEach((s) => {
Array.isArray(c[s]) && c[s].forEach((f) => _(f)), delete c[s];
}), S(null);
else if (Array.isArray(e))
e.forEach((s) => {
s.key && _(s);
});
else if (typeof e == "object")
e.key && _(e);
else if (typeof e == "string") {
for (var t = arguments.length, i = new Array(t > 1 ? t - 1 : 0), n = 1; n < t; n++)
i[n - 1] = arguments[n];
let [s, f] = i;
typeof s == "function" && (f = s, s = ""), _({
key: e,
scope: s,
method: f,
splitKey: "+"
});
}
}
const _ = (e) => {
let {
key: t,
scope: i,
method: n,
splitKey: s = "+"
} = e;
D(t).forEach((l) => {
const o = l.split(s), a = o.length, K = o[a - 1], y = K === "*" ? "*" : L(K);
if (!c[y])
return;
i || (i = x());
const p = a > 1 ? B(h, o) : [], g = [];
c[y] = c[y].filter((d) => {
const k = (n ? d.method === n : !0) && d.scope === i && H(d.mods, p);
return k && g.push(d.element), !k;
}), g.forEach((d) => S(d));
});
};
function T(e, t, i, n) {
if (t.element !== n)
return;
let s;
if (t.scope === i || t.scope === "all") {
s = t.mods.length > 0;
for (const f in u)
Object.prototype.hasOwnProperty.call(u, f) && (!u[f] && t.mods.indexOf(+f) > -1 || u[f] && t.mods.indexOf(+f) === -1) && (s = !1);
(t.mods.length === 0 && !u[16] && !u[18] && !u[17] && !u[91] || s || t.shortcut === "*") && (t.keys = [], t.keys = t.keys.concat(r), t.method(e, t) === !1 && (e.preventDefault ? e.preventDefault() : e.returnValue = !1, e.stopPropagation && e.stopPropagation(), e.cancelBubble && (e.cancelBubble = !0)));
}
}
function U(e, t) {
const i = c["*"];
let n = e.keyCode || e.which || e.charCode;
if (!w.filter.call(this, e))
return;
if ((n === 93 || n === 224) && (n = 91), r.indexOf(n) === -1 && n !== 229 && r.push(n), ["ctrlKey", "altKey", "shiftKey", "metaKey"].forEach((o) => {
const a = P[o];
e[o] && r.indexOf(a) === -1 ? r.push(a) : !e[o] && r.indexOf(a) > -1 ? r.splice(r.indexOf(a), 1) : o === "metaKey" && e[o] && r.length === 3 && (e.ctrlKey || e.shiftKey || e.altKey || (r = r.slice(r.indexOf(a))));
}), n in u) {
u[n] = !0;
for (const o in h)
h[o] === n && (w[o] = !0);
if (!i)
return;
}
for (const o in u)
Object.prototype.hasOwnProperty.call(u, o) && (u[o] = e[P[o]]);
e.getModifierState && !(e.altKey && !e.ctrlKey) && e.getModifierState("AltGraph") && (r.indexOf(17) === -1 && r.push(17), r.indexOf(18) === -1 && r.push(18), u[17] = !0, u[18] = !0);
const s = x();
if (i)
for (let o = 0; o < i.length; o++)
i[o].scope === s && (e.type === "keydown" && i[o].keydown || e.type === "keyup" && i[o].keyup) && T(e, i[o], s, t);
if (!(n in c))
return;
const f = c[n], l = f.length;
for (let o = 0; o < l; o++)
if ((e.type === "keydown" && f[o].keydown || e.type === "keyup" && f[o].keyup) && f[o].key) {
const a = f[o], {
splitKey: K
} = a, y = a.key.split(K), p = [];
for (let g = 0; g < y.length; g++)
p.push(L(y[g]));
p.sort().join("") === r.sort().join("") && T(e, a, s, t);
}
}
function w(e, t, i) {
r = [];
const n = D(e);
let s = [], f = "all", l = document, o = 0, a = !1, K = !0, y = "+", p = !1, g = !1;
for (i === void 0 && typeof t == "function" && (i = t), Object.prototype.toString.call(t) === "[object Object]" && (t.scope && (f = t.scope), t.element && (l = t.element), t.keyup && (a = t.keyup), t.keydown !== void 0 && (K = t.keydown), t.capture !== void 0 && (p = t.capture), typeof t.splitKey == "string" && (y = t.splitKey), t.single === !0 && (g = !0)), typeof t == "string" && (f = t), g && G(e, f); o < n.length; o++)
e = n[o].split(y), s = [], e.length > 1 && (s = B(h, e)), e = e[e.length - 1], e = e === "*" ? "*" : L(e), e in c || (c[e] = []), c[e].push({
keyup: a,
keydown: K,
scope: f,
mods: s,
shortcut: n[o],
method: i,
key: n[o],
splitKey: y,
element: l
});
if (typeof l != "undefined" && window) {
if (!m.has(l)) {
const d = function() {
let k = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : window.event;
return U(k, l);
}, C = function() {
let k = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : window.event;
U(k, l), Y(k);
};
m.set(l, {
keydownListener: d,
keyupListenr: C,
capture: p
}), j(l, "keydown", d, p), j(l, "keyup", C, p);
}
if (!E) {
const d = () => {
r = [];
};
E = {
listener: d,
capture: p
}, j(window, "focus", d, p);
}
}
}
function Z(e) {
let t = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : "all";
Object.keys(c).forEach((i) => {
c[i].filter((s) => s.scope === t && s.shortcut === e).forEach((s) => {
s && s.method && s.method();
});
});
}
function S(e) {
const t = Object.values(c).flat();
if (t.findIndex((n) => {
let {
element: s
} = n;
return s === e;
}) < 0) {
const {
keydownListener: n,
keyupListenr: s,
capture: f
} = m.get(e) || {};
n && s && (O(e, "keyup", s, f), O(e, "keydown", n, f), m.delete(e));
}
if ((t.length <= 0 || m.size <= 0) && (Object.keys(m).forEach((s) => {
const {
keydownListener: f,
keyupListenr: l,
capture: o
} = m.get(s) || {};
f && l && (O(s, "keyup", l, o), O(s, "keydown", f, o), m.delete(s));
}), m.clear(), Object.keys(c).forEach((s) => delete c[s]), E)) {
const {
listener: s,
capture: f
} = E;
O(window, "focus", s, f), E = null;
}
}
const A = {
getPressedKeyString: X,
setScope: F,
getScope: x,
deleteScope: W,
getPressedKeyCodes: V,
getAllKeyCodes: q,
isPressed: Q,
filter: J,
trigger: Z,
unbind: G,
keyMap: b,
modifier: h,
modifierMap: P
};
for (const e in A)
Object.prototype.hasOwnProperty.call(A, e) && (w[e] = A[e]);
if (typeof window != "undefined") {
const e = window.hotkeys;
w.noConflict = (t) => (t && window.hotkeys === w && (window.hotkeys = e), w), window.hotkeys = w;
}
export {
w as hotkeys
};