UNPKG

tab-text

Version:

Make the textarea support Tab indentation.

153 lines (152 loc) 3.66 kB
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 };