@realsee/dnalogel
Version:
385 lines (384 loc) • 10.6 kB
JavaScript
const j = typeof navigator != "undefined" ? navigator.userAgent.toLowerCase().indexOf("firefox") > 0 : !1;
function A(e, t, s, n) {
e.addEventListener ? e.addEventListener(t, s, n) : e.attachEvent && e.attachEvent("on".concat(t), s);
}
function E(e, t, s, n) {
e.removeEventListener ? e.removeEventListener(t, s, n) : e.detachEvent && e.detachEvent("on".concat(t), s);
}
function B(e, t) {
const s = t.slice(0, t.length - 1);
for (let n = 0; n < s.length; n++)
s[n] = e[s[n].toLowerCase()];
return s;
}
function D(e) {
typeof e != "string" && (e = ""), e = e.replace(/\s/g, "");
const t = e.split(",");
let s = t.lastIndexOf("");
for (; s >= 0; )
t[s - 1] += ",", t.splice(s, 1), s = t.lastIndexOf("");
return t;
}
function H(e, t) {
const s = e.length >= t.length ? e : t, n = e.length >= t.length ? t : e;
let i = !0;
for (let r = 0; r < s.length; r++)
n.indexOf(s[r]) === -1 && (i = !1);
return i;
}
const x = {
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,
/// https://w3c.github.io/uievents/#events-keyboard-key-location
arrowup: 38,
arrowdown: 40,
arrowleft: 37,
arrowright: 39,
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,
"-": j ? 173 : 189,
"=": j ? 61 : 187,
";": j ? 59 : 186,
"'": 222,
"{": 219,
"}": 221,
"[": 219,
"]": 221,
"\\": 220
}, y = {
// shiftKey
"⇧": 16,
shift: 16,
// altKey
"⌥": 18,
alt: 18,
option: 18,
// ctrlKey
"⌃": 17,
ctrl: 17,
control: 17,
// metaKey
"⌘": 91,
cmd: 91,
meta: 91,
command: 91
}, b = {
16: "shiftKey",
18: "altKey",
17: "ctrlKey",
91: "metaKey",
shiftKey: 16,
ctrlKey: 17,
altKey: 18,
metaKey: 91
}, a = {
16: !1,
18: !1,
17: !1,
91: !1
}, c = {};
for (let e = 1; e < 20; e++)
x["f".concat(e)] = 111 + e;
let f = [], L = null, z = "all";
const w = /* @__PURE__ */ new Map(), O = (e) => x[e.toLowerCase()] || y[e.toLowerCase()] || e.toUpperCase().charCodeAt(0), I = (e) => Object.keys(x).find((t) => x[t] === e), R = (e) => Object.keys(y).find((t) => y[t] === e);
function F(e) {
z = e || "all";
}
function _() {
return z || "all";
}
function V() {
return f.slice(0);
}
function X() {
return f.map((e) => I(e) || R(e) || String.fromCharCode(e));
}
function q() {
const e = [];
return Object.keys(c).forEach((t) => {
c[t].forEach((s) => {
let {
key: n,
scope: i,
mods: r,
shortcut: l
} = s;
e.push({
scope: i,
shortcut: l,
mods: r,
keys: n.split("+").map((o) => O(o))
});
});
}), e;
}
function J(e) {
const t = e.target || e.srcElement, {
tagName: s
} = t;
let n = !0;
const i = s === "INPUT" && !["checkbox", "radio", "range", "button", "file", "reset", "submit", "color"].includes(t.type);
return (t.isContentEditable || (i || s === "TEXTAREA" || s === "SELECT") && !t.readOnly) && (n = !1), n;
}
function Q(e) {
return typeof e == "string" && (e = O(e)), f.indexOf(e) !== -1;
}
function W(e, t) {
let s, n;
e || (e = _());
for (const i in c)
if (Object.prototype.hasOwnProperty.call(c, i))
for (s = c[i], n = 0; n < s.length; )
s[n].scope === e ? s.splice(n, 1).forEach((l) => {
let {
element: o
} = l;
return S(o);
}) : n++;
_() === e && F(t || "all");
}
function Y(e) {
let t = e.keyCode || e.which || e.charCode;
e.key && e.key.toLowerCase() === "capslock" && (t = O(e.key));
const s = f.indexOf(t);
if (s >= 0 && f.splice(s, 1), e.key && e.key.toLowerCase() === "meta" && f.splice(0, f.length), (t === 93 || t === 224) && (t = 91), t in a) {
a[t] = !1;
for (const n in y)
y[n] === t && (k[n] = !1);
}
}
function G(e) {
if (typeof e == "undefined")
Object.keys(c).forEach((i) => {
Array.isArray(c[i]) && c[i].forEach((r) => C(r)), delete c[i];
}), S(null);
else if (Array.isArray(e))
e.forEach((i) => {
i.key && C(i);
});
else if (typeof e == "object")
e.key && C(e);
else if (typeof e == "string") {
for (var t = arguments.length, s = new Array(t > 1 ? t - 1 : 0), n = 1; n < t; n++)
s[n - 1] = arguments[n];
let [i, r] = s;
typeof i == "function" && (r = i, i = ""), C({
key: e,
scope: i,
method: r,
splitKey: "+"
});
}
}
const C = (e) => {
let {
key: t,
scope: s,
method: n,
splitKey: i = "+"
} = e;
D(t).forEach((l) => {
const o = l.split(i), u = o.length, h = o[u - 1], g = h === "*" ? "*" : O(h);
if (!c[g])
return;
s || (s = _());
const p = u > 1 ? B(y, o) : [], m = [];
c[g] = c[g].filter((d) => {
const K = (n ? d.method === n : !0) && d.scope === s && H(d.mods, p);
return K && m.push(d.element), !K;
}), m.forEach((d) => S(d));
});
};
function T(e, t, s, n) {
if (t.element !== n)
return;
let i;
if (t.scope === s || t.scope === "all") {
i = t.mods.length > 0;
for (const r in a)
Object.prototype.hasOwnProperty.call(a, r) && (!a[r] && t.mods.indexOf(+r) > -1 || a[r] && t.mods.indexOf(+r) === -1) && (i = !1);
(t.mods.length === 0 && !a[16] && !a[18] && !a[17] && !a[91] || i || t.shortcut === "*") && (t.keys = [], t.keys = t.keys.concat(f), 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 s = c["*"];
let n = e.keyCode || e.which || e.charCode;
if (e.key && e.key.toLowerCase() === "capslock" || !k.filter.call(this, e))
return;
if ((n === 93 || n === 224) && (n = 91), f.indexOf(n) === -1 && n !== 229 && f.push(n), ["metaKey", "ctrlKey", "altKey", "shiftKey"].forEach((o) => {
const u = b[o];
e[o] && f.indexOf(u) === -1 ? f.push(u) : !e[o] && f.indexOf(u) > -1 ? f.splice(f.indexOf(u), 1) : o === "metaKey" && e[o] && (f = f.filter((h) => h in b || h === n));
}), n in a) {
a[n] = !0;
for (const o in y)
if (Object.prototype.hasOwnProperty.call(y, o)) {
const u = b[y[o]];
k[o] = e[u];
}
if (!s)
return;
}
for (const o in a)
Object.prototype.hasOwnProperty.call(a, o) && (a[o] = e[b[o]]);
e.getModifierState && !(e.altKey && !e.ctrlKey) && e.getModifierState("AltGraph") && (f.indexOf(17) === -1 && f.push(17), f.indexOf(18) === -1 && f.push(18), a[17] = !0, a[18] = !0);
const i = _();
if (s)
for (let o = 0; o < s.length; o++)
s[o].scope === i && (e.type === "keydown" && s[o].keydown || e.type === "keyup" && s[o].keyup) && T(e, s[o], i, t);
if (!(n in c))
return;
const r = c[n], l = r.length;
for (let o = 0; o < l; o++)
if ((e.type === "keydown" && r[o].keydown || e.type === "keyup" && r[o].keyup) && r[o].key) {
const u = r[o], {
splitKey: h
} = u, g = u.key.split(h), p = [];
for (let m = 0; m < g.length; m++)
p.push(O(g[m]));
p.sort().join("") === f.sort().join("") && T(e, u, i, t);
}
}
function k(e, t, s) {
f = [];
const n = D(e);
let i = [], r = "all", l = document, o = 0, u = !1, h = !0, g = "+", p = !1, m = !1;
for (s === void 0 && typeof t == "function" && (s = t), Object.prototype.toString.call(t) === "[object Object]" && (t.scope && (r = t.scope), t.element && (l = t.element), t.keyup && (u = t.keyup), t.keydown !== void 0 && (h = t.keydown), t.capture !== void 0 && (p = t.capture), typeof t.splitKey == "string" && (g = t.splitKey), t.single === !0 && (m = !0)), typeof t == "string" && (r = t), m && G(e, r); o < n.length; o++)
e = n[o].split(g), i = [], e.length > 1 && (i = B(y, e)), e = e[e.length - 1], e = e === "*" ? "*" : O(e), e in c || (c[e] = []), c[e].push({
keyup: u,
keydown: h,
scope: r,
mods: i,
shortcut: n[o],
method: s,
key: n[o],
splitKey: g,
element: l
});
if (typeof l != "undefined" && window) {
if (!w.has(l)) {
const d = function() {
let K = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : window.event;
return U(K, l);
}, M = function() {
let K = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : window.event;
U(K, l), Y(K);
};
w.set(l, {
keydownListener: d,
keyupListenr: M,
capture: p
}), A(l, "keydown", d, p), A(l, "keyup", M, p);
}
if (!L) {
const d = () => {
f = [];
};
L = {
listener: d,
capture: p
}, A(window, "focus", d, p);
}
}
}
function Z(e) {
let t = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : "all";
Object.keys(c).forEach((s) => {
c[s].filter((i) => i.scope === t && i.shortcut === e).forEach((i) => {
i && i.method && i.method();
});
});
}
function S(e) {
const t = Object.values(c).flat();
if (t.findIndex((n) => {
let {
element: i
} = n;
return i === e;
}) < 0) {
const {
keydownListener: n,
keyupListenr: i,
capture: r
} = w.get(e) || {};
n && i && (E(e, "keyup", i, r), E(e, "keydown", n, r), w.delete(e));
}
if ((t.length <= 0 || w.size <= 0) && (Object.keys(w).forEach((i) => {
const {
keydownListener: r,
keyupListenr: l,
capture: o
} = w.get(i) || {};
r && l && (E(i, "keyup", l, o), E(i, "keydown", r, o), w.delete(i));
}), w.clear(), Object.keys(c).forEach((i) => delete c[i]), L)) {
const {
listener: i,
capture: r
} = L;
E(window, "focus", i, r), L = null;
}
}
const P = {
getPressedKeyString: X,
setScope: F,
getScope: _,
deleteScope: W,
getPressedKeyCodes: V,
getAllKeyCodes: q,
isPressed: Q,
filter: J,
trigger: Z,
unbind: G,
keyMap: x,
modifier: y,
modifierMap: b
};
for (const e in P)
Object.prototype.hasOwnProperty.call(P, e) && (k[e] = P[e]);
if (typeof window != "undefined") {
const e = window.hotkeys;
k.noConflict = (t) => (t && window.hotkeys === k && (window.hotkeys = e), k), window.hotkeys = k;
}
export {
k as hotkeys
};