tab-text
Version:
Make the textarea support Tab indentation.
153 lines (152 loc) • 3.66 kB
JavaScript
function T(e, t) {
(t == null || t > e.length) && (t = e.length);
for (var n = 0, r = Array(t); n < t; n++)
r[n] = e[n];
return r;
}
function b(e, t) {
var n = typeof Symbol < "u" && e[Symbol.iterator] || e["@@iterator"];
if (!n) {
if (Array.isArray(e) || (n = D(e)) || t && e && typeof e.length == "number") {
n && (e = n);
var r = 0, a = function() {
};
return {
s: a,
n: function() {
return r >= e.length ? {
done: !0
} : {
done: !1,
value: e[r++]
};
},
e: function(u) {
throw u;
},
f: a
};
}
throw new TypeError(`Invalid attempt to iterate non-iterable instance.
In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`);
}
var o, l = !0, i = !1;
return {
s: function() {
n = n.call(e);
},
n: function() {
var u = n.next();
return l = u.done, u;
},
e: function(u) {
i = !0, o = u;
},
f: function() {
try {
l || n.return == null || n.return();
} finally {
if (i)
throw o;
}
}
};
}
function D(e, t) {
if (e) {
if (typeof e == "string")
return T(e, t);
var n = {}.toString.call(e).slice(8, -1);
return n === "Object" && e.constructor && (n = e.constructor.name), n === "Map" || n === "Set" ? Array.from(e) : n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n) ? T(e, t) : void 0;
}
}
var S = " ";
const O = {
setTabValue: K,
useTab: L,
onKeyDown: E
};
function K(e) {
S = e;
}
function L(e) {
var t = typeof e == "string" ? document.querySelector(e) : e;
if (!t)
throw new Error("Target not exist");
if (t.tagName !== "TEXTAREA")
throw new Error("Only support textarea");
t.addEventListener("keydown", E);
}
function E(e) {
C(this, e, S);
}
function C(e, t, n) {
var r = n.length;
if (t.code === "Tab") {
t.preventDefault();
var a = w(e), o = a.startLineIndex, l = a.start, i = a.end, u = a.lineText.split(`
`);
if (t.shiftKey) {
var h = !0, s = b(u), g;
try {
for (s.s(); !(g = s.n()).done; ) {
var f = g.value;
f.startsWith(n) ? (e.selectionStart = o, e.selectionEnd = o + r, document.execCommand("delete", !1), h && f.startsWith(n + n) && (l -= r), i -= r, o += f.length - r + 1) : o += f.length + 1, h = !1;
}
} catch (d) {
s.e(d);
} finally {
s.f();
}
e.selectionStart = l, e.selectionEnd = i;
return;
}
if (u.length === 1) {
y(n);
return;
}
l += r;
var c = b(u), m;
try {
for (c.s(); !(m = c.n()).done; ) {
var A = m.value;
e.selectionStart = e.selectionEnd = o, y(n), o += r + A.length + 1, i += r;
}
} catch (d) {
c.e(d);
} finally {
c.f();
}
e.selectionStart = l, e.selectionEnd = i;
} else if (t.code === "Enter" && !t.ctrlKey) {
for (var I = w(e), x = I.lineText.split(`
`)[0], p = `
`, v = 0; x.substring(v, v + r) === n; )
p += n, v += r;
v > 0 && (y(p), t.preventDefault());
}
}
function y(e) {
e && document.execCommand("insertText", !1, e);
}
function w(e) {
var t = e.selectionStart, n = e.selectionEnd, r = "", a = e.value;
r = a.substring(t, n);
var o = a.substring(0, t), l = o.lastIndexOf(`
`), i = l + 1;
return {
start: t,
end: n,
text: r,
lineText: a.substring(i, n),
line: r.split(`
`).length,
startLineIndex: i
};
}
export {
O as default,
E as onKeyDown,
K as setTabValue,
L as useTab
};