/
hei
/
larp-dictionary
Обзор
Документация
Войти
/
hei
/
larp-dictionary
Код
Запросы
0
Задачи
Пакеты
1
Релизы
0
CI/CD
Аналитика
Безопасность
master
src/main/resources/script/tiny-mde.js
1 260 строк
73 KB
hei
Визуальный редактор
04 янв 2025, 17:53
04 янв 2025, 17:53
06a78b9
Код
Авторство
О чём код?
!function (e, t) { "object" == typeof exports && "undefined" != typeof module ? t(exports) : "function" == typeof define && define.amd ? define(["exports"], t) : t((e = "undefined" != typeof globalThis ? globalThis : e || self).TinyMDE = {}) }(this, (function (e) { "use strict"; const t = { blockquote: '<svg height="18" width="18"><rect width="5" height="5" x="3" y="4" ry="1"/><rect ry="1" y="4" x="10" height="5" width="5"/><path d="M8 6.999v3c0 1-1 3-1 3s-.331 1-1.331 1h-1c-1 0-.669-1-.669-1s1-2 1-3v-3zm7 0v3c0 1-1 3-1 3s-.331 1-1.331 1h-1c-1 0-.669-1-.669-1s1-2 1-3v-3z"/></svg>', bold: '<svg height="18" width="18"><path d="M4 2a1 1 0 00-1 1v12a1 1 0 001 1h6c4 0 5-2 5-4 0-1.322-.434-2.636-1.885-3.381C13.772 7.885 14 6.945 14 6c0-2-1-4-5-4zm1 2h4c1.668 0 2.32.393 2.6.672.28.279.4.662.4 1.328s-.12 1.057-.4 1.338c-.275.274-1.014.646-2.6.662H5zm5 6c1.666.005 2.318.388 2.596.666.277.278.404.667.404 1.334s-.127 1.06-.404 1.338c-.278.278-.93.66-2.596.662l-4.992.004L5 10z"/></svg>', clear_formatting: '<svg height="18" width="18"><path d="M11.03 1a1 1 0 00-.74.3l-9 9a1 1 0 000 1.4l4 4A1 1 0 006 16h2a1 1 0 00.7-.3l8-8a1 1 0 000-1.4l-5-5a1 1 0 00-.67-.3zM8.7 5.7l3.58 3.6L7.6 14H6.4l-3-3 5.3-5.3z"/><rect ry=".8" rx=".8" y="14" x="16" height="2" width="2"/><rect width="2" height="2" x="13" y="14" rx=".8" ry=".8"/><rect ry=".8" rx=".8" y="14" x="10" height="2" width="2"/></svg>', code: '<svg height="18" width="18"><path d="M13.5 2.994a.5.5 0 00-.5.5.5.5 0 000 .034V4.53a5.993 5.993 0 00-7.451-.445A6 6 0 1012.45 13.9a5.99 5.99 0 001.346-1.334.5.5 0 00.096-.101.5.5 0 00-.12-.698.5.5 0 00-.697.12l-.004-.005a5 5 0 01-1.197 1.2 5 5 0 111.215-6.965.5.5 0 00.697.12.5.5 0 00.211-.44V4.745H14V3.493a.5.5 0 00-.5-.5z"/></svg>', h1: '<svg height="18" width="18"><path d="M3 2s0-1 1-1h1c1 0 1 1 1 1v6h6V2s0-1 1-1h1c1 0 1 1 1 1v14s0 1-1 1h-1c-1 0-1-1-1-1v-6H6v6s0 1-1 1H4c-1 0-1-1-1-1z"/></svg>', h2: '<svg height="18" width="18"><path d="M4 2s0-1 1-1 1 1 1 1v6c1-1 2-1 4-1 3 0 4 2 4 4v5s0 1-1 1-1-1-1-1v-5c0-1.094-1-2-2-2-2 0-3 0-4 2v5s0 1-1 1-1-1-1-1z"/></svg>', hr: '<svg height="18" width="18"><rect ry="1" y="8" height="2" width="18" style="font-variation-settings:normal;marker:none"/></svg>', image: '<svg height="18" width="18"><path d="M1 2v14h16V2H1zm2 2h12v7l-3-3-4 4-2-2-3 3V4z"/><circle r="1.5" cy="6.5" cx="5.5"/></svg>', italic: '<svg height="18" width="18"><path d="M9 2a1 1 0 000 2L7 14a1 1 0 100 2h2a1 1 0 000-2l2-10a1 1 0 100-2z"/></svg>', link: '<svg height="18" width="18"><path d="M9.07 5.18a3.9 3.9 0 00-1.52.43C6.31 6.22 5.3 7.29 4.3 8.29c-1 1-2.07 2.02-2.68 3.26-.31.62-.5 1.33-.41 2.07.09.75.48 1.47 1.1 2.09.61.61 1.33 1 2.08 1.1.74.09 1.45-.1 2.07-.42 1.24-.61 2.26-1.68 3.26-2.68.46-.47.94-.94 1.39-1.44l-.43.26c-.68.34-1.49.56-2.36.46-.2-.03-.4-.08-.6-.14-.79.76-1.55 1.45-2.16 1.76-.38.19-.67.24-.92.21-.26-.03-.54-.14-.92-.53-.39-.38-.5-.66-.53-.91-.03-.26.02-.55.21-.93.39-.76 1.32-1.74 2.32-2.74 1-1 1.98-1.93 2.74-2.32.38-.19.67-.24.93-.21.25.03.53.14.91.53.39.38.5.66.53.92v.06l1.12-1.06.44-.47c-.18-.3-.4-.6-.67-.87-.62-.61-1.34-1-2.09-1.1a3.08 3.08 0 00-.55-.01z"/><path d="M13.07.86a3.9 3.9 0 00-1.52.43c-1.24.62-2.26 1.69-3.26 2.69-.46.47-.94.94-1.39 1.43.15-.08.28-.18.43-.25a4.4 4.4 0 012.36-.46c.2.02.4.07.6.14.79-.77 1.55-1.46 2.16-1.76.38-.19.67-.25.93-.21.25.03.53.14.91.52.39.38.5.66.53.92.03.26-.02.55-.21.93-.39.76-1.32 1.74-2.32 2.74-1 1-1.98 1.93-2.74 2.31-.38.2-.67.25-.93.22-.25-.04-.53-.15-.91-.53-.39-.38-.5-.66-.53-.92V9c-.36.33-.73.67-1.12 1.06l-.43.46c.17.3.4.6.66.87.62.62 1.34 1 2.08 1.1.75.1 1.46-.1 2.08-.41 1.24-.62 2.26-1.69 3.26-2.69s2.07-2.02 2.68-3.26c.31-.62.5-1.32.41-2.07a3.63 3.63 0 00-1.1-2.08c-.61-.62-1.33-1-2.07-1.1a3.08 3.08 0 00-.56-.02z"/></svg>', ol: '<svg height="18" width="18"><path d="M1.5 7a.5.5 0 100 1h1a.5.5 0 01.5.5c0 .164-.08.31-.14.355l-1.655 1.25A.492.492 0 001 10.5a.5.5 0 00.5.5h2a.5.5 0 000-1H3l.398-.299A1.5 1.5 0 002.5 7z"/><path d="M1.5 12c-.667 0-.667 1 0 1h1.25c.333 0 .333.5 0 .5H2.5c-.667 0-.667 1 0 1h.25c.333 0 .333.5 0 .5H1.5c-.667 0-.667 1 0 1h1c.398 0 .78-.131 1.06-.365.282-.235.44-.554.44-.885a1.121 1.121 0 00-.303-.75c.191-.204.3-.47.303-.75 0-.332-.158-.651-.44-.885-.3-.241-.675-.37-1.06-.365z"/><rect y="13" x="6" height="2" width="12" ry="1"/><rect ry="1" width="12" height="2" x="6" y="8"/><rect y="3" x="6" height="2" width="12" ry="1"/><path d="M1.5 2a.5.5 0 100 1H2v2h-.5a.5.5 0 100 1h2a.5.5 0 100-1H3V2.5c0-.277-.223-.5-.5-.5z"/></svg>', strikethrough: '<svg width="18" height="18"><path d="M10 2C6 2 4 4 4 6c0 .338.08.672.193 1h2.34C6.113 6.629 6 6.295 6 6c0-.334.117-.725.691-1.154C7.265 4.416 8.331 4 10 4h3a1 1 0 000-2zm1.477 9c.413.368.523.706.523 1 0 .334-.127.712-.701 1.143-.575.43-1.632.85-3.299.857l-1.006.007V14H5a1 1 0 000 2h3c4 0 6-2 6-4 0-.338-.081-.672-.195-1z"/><rect ry="1" y="8" x="1" height="2" width="16"/></svg>', ul: '<svg height="18" width="18"><circle cx="2" cy="9" r="2"/><circle cy="4" cx="2" r="2"/><rect y="3" x="6" height="2" width="12" ry="1"/><circle cx="2" cy="14" r="2"/><rect ry="1" width="12" height="2" x="6" y="8"/><rect y="13" x="6" height="2" width="12" ry="1"/></svg>' }, n = /(Mac|iPhone|iPod|iPad)/i.test("undefined" != typeof navigator ? navigator.platform : ""), s = { bold: {name: "bold", action: "bold", innerHTML: t.bold, title: "Bold", hotkey: "Mod-B"}, italic: {name: "italic", action: "italic", innerHTML: t.italic, title: "Italic", hotkey: "Mod-I"}, strikethrough: { name: "strikethrough", action: "strikethrough", innerHTML: t.strikethrough, title: "Strikethrough", hotkey: "Mod2-Shift-5" }, code: {name: "code", action: "code", innerHTML: t.code, title: "Format as code"}, h1: {name: "h1", action: "h1", innerHTML: t.h1, title: "Level 1 heading", hotkey: "Mod-Shift-1"}, h2: {name: "h2", action: "h2", innerHTML: t.h2, title: "Level 2 heading", hotkey: "Mod-Shift-2"}, ul: {name: "ul", action: "ul", innerHTML: t.ul, title: "Bulleted list"}, ol: {name: "ol", action: "ol", innerHTML: t.ol, title: "Numbered list"}, blockquote: { name: "blockquote", action: "blockquote", innerHTML: t.blockquote, title: "Quote", hotkey: "Mod2-Shift-Q" }, insertLink: { name: "insertLink", action: e => { e.isInlineFormattingAllowed() && e.wrapSelection("[", "]()") }, enabled: (e, t, n) => !e.isInlineFormattingAllowed(t, n) && null, innerHTML: t.link, title: "Insert link", hotkey: "Mod-K" }, insertImage: { name: "insertImage", action: e => { e.isInlineFormattingAllowed() && e.wrapSelection("![", "]()") }, enabled: (e, t, n) => !e.isInlineFormattingAllowed(t, n) && null, innerHTML: t.image, title: "Insert image", hotkey: "Mod2-Shift-I" }, hr: { name: "hr", action: e => e.paste("\n***\n"), enabled: () => !1, innerHTML: t.hr, title: "Insert horizontal line", hotkey: "Mod2-Shift-L" } }; var i = "undefined" != typeof globalThis ? globalThis : "undefined" != typeof window ? window : "undefined" != typeof global ? global : "undefined" != typeof self ? self : {}, r = function (e) { return e && e.Math === Math && e }, a = r("object" == typeof globalThis && globalThis) || r("object" == typeof window && window) || r("object" == typeof self && self) || r("object" == typeof i && i) || function () { return this }() || i || Function("return this")(), l = function (e) { try { return !!e() } catch (e) { return !0 } }, o = !l((function () { return 7 !== Object.defineProperty({}, 1, { get: function () { return 7 } })[1] })), u = {}, c = { get exports() { return u }, set exports(e) { u = e } }, h = !l((function () { var e = function () { }.bind(); return "function" != typeof e || e.hasOwnProperty("prototype") })), p = h, d = Function.prototype, g = d.call, m = p && d.bind.bind(g, g), f = p ? m : function (e) { return function () { return g.apply(e, arguments) } }, M = "object" == typeof document && document.all, T = {all: M, IS_HTMLDDA: void 0 === M && void 0 !== M}, D = T.all, F = T.IS_HTMLDDA ? function (e) { return "function" == typeof e || e === D } : function (e) { return "function" == typeof e }, y = function (e) { return null == e }, C = y, k = TypeError, E = function (e) { if (C(e)) throw new k("Can't call method on " + e); return e }, b = Object, $ = function (e) { return b(E(e)) }, A = f({}.hasOwnProperty), w = Object.hasOwn || function (e, t) { return A($(e), t) }, v = o, x = w, S = Function.prototype, L = v && Object.getOwnPropertyDescriptor, B = x(S, "name"), N = { EXISTS: B, PROPER: B && "something" === function () { }.name, CONFIGURABLE: B && (!v || v && L(S, "name").configurable) }, H = a, _ = Object.defineProperty, I = function (e, t) { try { _(H, e, {value: t, configurable: !0, writable: !0}) } catch (n) { H[e] = t } return t }, O = "__core-js_shared__", P = a[O] || I(O, {}), j = F, z = P, R = f(Function.toString); j(z.inspectSource) || (z.inspectSource = function (e) { return R(e) }); var q, V, Z = z.inspectSource, K = F, U = a.WeakMap, W = K(U) && /native code/.test(String(U)), X = F, G = T.all, Q = T.IS_HTMLDDA ? function (e) { return "object" == typeof e ? null !== e : X(e) || e === G } : function (e) { return "object" == typeof e ? null !== e : X(e) }, J = {}, Y = Q, ee = a.document, te = Y(ee) && Y(ee.createElement), ne = function (e) { return te ? ee.createElement(e) : {} }, se = !o && !l((function () { return 7 !== Object.defineProperty(ne("div"), "a", { get: function () { return 7 } }).a })), ie = o && l((function () { return 42 !== Object.defineProperty((function () { }), "prototype", {value: 42, writable: !1}).prototype })), re = Q, ae = String, le = TypeError, oe = function (e) { if (re(e)) return e; throw new le(ae(e) + " is not an object") }, ue = h, ce = Function.prototype.call, he = ue ? ce.bind(ce) : function () { return ce.apply(ce, arguments) }, pe = a, de = F, ge = f({}.isPrototypeOf), me = a, fe = "undefined" != typeof navigator && String(navigator.userAgent) || "", Me = me.process, Te = me.Deno, De = Me && Me.versions || Te && Te.version, Fe = De && De.v8; Fe && (V = (q = Fe.split("."))[0] > 0 && q[0] < 4 ? 1 : +(q[0] + q[1])), !V && fe && (!(q = fe.match(/Edge\/(\d+)/)) || q[1] >= 74) && (q = fe.match(/Chrome\/(\d+)/)) && (V = +q[1]); var ye = V, Ce = l, ke = a.String, Ee = !!Object.getOwnPropertySymbols && !Ce((function () { var e = Symbol("symbol detection"); return !ke(e) || !(Object(e) instanceof Symbol) || !Symbol.sham && ye && ye < 41 })), be = Ee && !Symbol.sham && "symbol" == typeof Symbol.iterator, $e = function (e, t) { return arguments.length < 2 ? (n = pe[e], de(n) ? n : void 0) : pe[e] && pe[e][t]; var n }, Ae = F, we = ge, ve = Object, xe = be ? function (e) { return "symbol" == typeof e } : function (e) { var t = $e("Symbol"); return Ae(t) && we(t.prototype, ve(e)) }, Se = String, Le = F, Be = function (e) { try { return Se(e) } catch (e) { return "Object" } }, Ne = TypeError, He = function (e) { if (Le(e)) return e; throw new Ne(Be(e) + " is not a function") }, _e = y, Ie = he, Oe = F, Pe = Q, je = TypeError, ze = {}, Re = P; ({ get exports() { return ze }, set exports(e) { ze = e } }.exports = function (e, t) { return Re[e] || (Re[e] = void 0 !== t ? t : {}) })("versions", []).push({ version: "3.33.0", mode: "global", copyright: "© 2014-2023 Denis Pushkarev (zloirock.ru)", license: "https://github.com/zloirock/core-js/blob/v3.33.0/LICENSE", source: "https://github.com/zloirock/core-js" }); var qe = f, Ve = 0, Ze = Math.random(), Ke = qe(1..toString), Ue = function (e) { return "Symbol(" + (void 0 === e ? "" : e) + ")_" + Ke(++Ve + Ze, 36) }, We = ze, Xe = w, Ge = Ue, Qe = Ee, Je = be, Ye = a.Symbol, et = We("wks"), tt = Je ? Ye.for || Ye : Ye && Ye.withoutSetter || Ge, nt = he, st = Q, it = xe, rt = function (e, t) { var n = e[t]; return _e(n) ? void 0 : He(n) }, at = function (e, t) { var n, s; if ("string" === t && Oe(n = e.toString) && !Pe(s = Ie(n, e))) return s; if (Oe(n = e.valueOf) && !Pe(s = Ie(n, e))) return s; if ("string" !== t && Oe(n = e.toString) && !Pe(s = Ie(n, e))) return s; throw new je("Can't convert object to primitive value") }, lt = TypeError, ot = function (e) { return Xe(et, e) || (et[e] = Qe && Xe(Ye, e) ? Ye[e] : tt("Symbol." + e)), et[e] }("toPrimitive"), ut = function (e, t) { if (!st(e) || it(e)) return e; var n, s = rt(e, ot); if (s) { if (void 0 === t && (t = "default"), n = nt(s, e, t), !st(n) || it(n)) return n; throw new lt("Can't convert object to primitive value") } return void 0 === t && (t = "number"), at(e, t) }, ct = xe, ht = o, pt = se, dt = ie, gt = oe, mt = function (e) { var t = ut(e, "string"); return ct(t) ? t : t + "" }, ft = TypeError, Mt = Object.defineProperty, Tt = Object.getOwnPropertyDescriptor, Dt = "enumerable", Ft = "configurable", yt = "writable"; J.f = ht ? dt ? function (e, t, n) { if (gt(e), t = mt(t), gt(n), "function" == typeof e && "prototype" === t && "value" in n && yt in n && !n[yt]) { var s = Tt(e, t); s && s[yt] && (e[t] = n.value, n = { configurable: Ft in n ? n[Ft] : s[Ft], enumerable: Dt in n ? n[Dt] : s[Dt], writable: !1 }) } return Mt(e, t, n) } : Mt : function (e, t, n) { if (gt(e), t = mt(t), gt(n), pt) try { return Mt(e, t, n) } catch (e) { } if ("get" in n || "set" in n) throw new ft("Accessors not supported"); return "value" in n && (e[t] = n.value), e }; var Ct, kt, Et, bt = J, $t = function (e, t) { return {enumerable: !(1 & e), configurable: !(2 & e), writable: !(4 & e), value: t} }, At = o ? function (e, t, n) { return bt.f(e, t, $t(1, n)) } : function (e, t, n) { return e[t] = n, e }, wt = Ue, vt = ze("keys"), xt = W, St = a, Lt = Q, Bt = At, Nt = w, Ht = P, _t = function (e) { return vt[e] || (vt[e] = wt(e)) }, It = "Object already initialized", Ot = St.TypeError, Pt = St.WeakMap; if (xt || Ht.state) { var jt = Ht.state || (Ht.state = new Pt); jt.get = jt.get, jt.has = jt.has, jt.set = jt.set, Ct = function (e, t) { if (jt.has(e)) throw new Ot(It); return t.facade = e, jt.set(e, t), t }, kt = function (e) { return jt.get(e) || {} }, Et = function (e) { return jt.has(e) } } else { var zt = _t("state"); Ct = function (e, t) { if (Nt(e, zt)) throw new Ot(It); return t.facade = e, Bt(e, zt, t), t }, kt = function (e) { return Nt(e, zt) ? e[zt] : {} }, Et = function (e) { return Nt(e, zt) } } var Rt = { set: Ct, get: kt, has: Et, enforce: function (e) { return Et(e) ? kt(e) : Ct(e, {}) }, getterFor: function (e) { return function (t) { var n; if (!Lt(t) || (n = kt(t)).type !== e) throw new Ot("Incompatible receiver, " + e + " required"); return n } } }, qt = f, Vt = l, Zt = F, Kt = w, Ut = o, Wt = N.CONFIGURABLE, Xt = Z, Gt = Rt.enforce, Qt = Rt.get, Jt = String, Yt = Object.defineProperty, en = qt("".slice), tn = qt("".replace), nn = qt([].join), sn = Ut && !Vt((function () { return 8 !== Yt((function () { }), "length", {value: 8}).length })), rn = String(String).split("String"), an = c.exports = function (e, t, n) { "Symbol(" === en(Jt(t), 0, 7) && (t = "[" + tn(Jt(t), /^Symbol\(([^)]*)\)/, "$1") + "]"), n && n.getter && (t = "get " + t), n && n.setter && (t = "set " + t), (!Kt(e, "name") || Wt && e.name !== t) && (Ut ? Yt(e, "name", { value: t, configurable: !0 }) : e.name = t), sn && n && Kt(n, "arity") && e.length !== n.arity && Yt(e, "length", {value: n.arity}); try { n && Kt(n, "constructor") && n.constructor ? Ut && Yt(e, "prototype", {writable: !1}) : e.prototype && (e.prototype = void 0) } catch (e) { } var s = Gt(e); return Kt(s, "source") || (s.source = nn(rn, "string" == typeof t ? t : "")), e }; Function.prototype.toString = an((function () { return Zt(this) && Qt(this).source || Xt(this) }), "toString"); var ln = u, on = J, un = oe, cn = o, hn = function (e, t, n) { return n.get && ln(n.get, t, {getter: !0}), n.set && ln(n.set, t, {setter: !0}), on.f(e, t, n) }, pn = function () { var e = un(this), t = ""; return e.hasIndices && (t += "d"), e.global && (t += "g"), e.ignoreCase && (t += "i"), e.multiline && (t += "m"), e.dotAll && (t += "s"), e.unicode && (t += "u"), e.unicodeSets && (t += "v"), e.sticky && (t += "y"), t }, dn = l, gn = a.RegExp, mn = gn.prototype; cn && dn((function () { var e = !0; try { gn(".", "d") } catch (t) { e = !1 } var t = {}, n = "", s = e ? "dgimsy" : "gimsy", i = function (e, s) { Object.defineProperty(t, e, { get: function () { return n += s, !0 } }) }, r = {dotAll: "s", global: "g", ignoreCase: "i", multiline: "m", sticky: "y"}; for (var a in e && (r.hasIndices = "d"), r) i(a, r[a]); return Object.getOwnPropertyDescriptor(mn, "flags").get.call(t) !== s || n !== s })) && hn(mn, "flags", {configurable: !0, get: pn}); const fn = { ASCIIPunctuation: /[!"#$%&'()*+,\-./:;<=>?@[\]^_`{|}~\\]/, NotTriggerChar: /[^`_*[\]()<>!~]/, Scheme: /[A-Za-z][A-Za-z0-9+.-]{1,31}/, Email: /[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*/, HTMLOpenTag: /<HTMLTagName(?:HTMLAttribute)*\s*\/?>/, HTMLCloseTag: /<\/HTMLTagName\s*>/, HTMLTagName: /[A-Za-z][A-Za-z0-9-]*/, HTMLComment: /<!--(?:[^>-]|(?:[^>-](?:[^-]|-[^-])*[^-]))-->/, HTMLPI: /<\?(?:|.|(?:[^?]|\?[^>])*)\?>/, HTMLDeclaration: /<![A-Z]+\s[^>]*>/, HTMLCDATA: /<!\[CDATA\[.*?\]\]>/, HTMLAttribute: /\s+[A-Za-z_:][A-Za-z0-9_.:-]*(?:HTMLAttValue)?/, HTMLAttValue: /\s*=\s*(?:(?:'[^']*')|(?:"[^"]*")|(?:[^\s"'=<>`]+))/, KnownTag: /address|article|aside|base|basefont|blockquote|body|caption|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption|figure|footer|form|frame|frameset|h1|h2|h3|h4|h5|h6|head|header|hr|html|iframe|legend|li|link|main|menu|menuitem|nav|noframes|ol|optgroup|option|p|param|section|source|summary|table|tbody|td|tfoot|th|thead|title|tr|track|ul/ }, Mn = new RegExp(/^(?:[!"#$%&'()*+,\-./:;<=>?@[\]\\^_`{|}~\xA1\xA7\xAB\xB6\xB7\xBB\xBF\u037E\u0387\u055A-\u055F\u0589\u058A\u05BE\u05C0\u05C3\u05C6\u05F3\u05F4\u0609\u060A\u060C\u060D\u061B\u061E\u061F\u066A-\u066D\u06D4\u0700-\u070D\u07F7-\u07F9\u0830-\u083E\u085E\u0964\u0965\u0970\u0AF0\u0DF4\u0E4F\u0E5A\u0E5B\u0F04-\u0F12\u0F14\u0F3A-\u0F3D\u0F85\u0FD0-\u0FD4\u0FD9\u0FDA\u104A-\u104F\u10FB\u1360-\u1368\u1400\u166D\u166E\u169B\u169C\u16EB-\u16ED\u1735\u1736\u17D4-\u17D6\u17D8-\u17DA\u1800-\u180A\u1944\u1945\u1A1E\u1A1F\u1AA0-\u1AA6\u1AA8-\u1AAD\u1B5A-\u1B60\u1BFC-\u1BFF\u1C3B-\u1C3F\u1C7E\u1C7F\u1CC0-\u1CC7\u1CD3\u2010-\u2027\u2030-\u2043\u2045-\u2051\u2053-\u205E\u207D\u207E\u208D\u208E\u2308-\u230B\u2329\u232A\u2768-\u2775\u27C5\u27C6\u27E6-\u27EF\u2983-\u2998\u29D8-\u29DB\u29FC\u29FD\u2CF9-\u2CFC\u2CFE\u2CFF\u2D70\u2E00-\u2E2E\u2E30-\u2E42\u3001-\u3003\u3008-\u3011\u3014-\u301F\u3030\u303D\u30A0\u30FB\uA4FE\uA4FF\uA60D-\uA60F\uA673\uA67E\uA6F2-\uA6F7\uA874-\uA877\uA8CE\uA8CF\uA8F8-\uA8FA\uA8FC\uA92E\uA92F\uA95F\uA9C1-\uA9CD\uA9DE\uA9DF\uAA5C-\uAA5F\uAADE\uAADF\uAAF0\uAAF1\uABEB\uFD3E\uFD3F\uFE10-\uFE19\uFE30-\uFE52\uFE54-\uFE61\uFE63\uFE68\uFE6A\uFE6B\uFF01-\uFF03\uFF05-\uFF0A\uFF0C-\uFF0F\uFF1A\uFF1B\uFF1F\uFF20\uFF3B-\uFF3D\uFF3F\uFF5B\uFF5D\uFF5F-\uFF65]|\uD800[\uDD00-\uDD02\uDF9F\uDFD0]|\uD801\uDD6F|\uD802[\uDC57\uDD1F\uDD3F\uDE50-\uDE58\uDE7F\uDEF0-\uDEF6\uDF39-\uDF3F\uDF99-\uDF9C]|\uD804[\uDC47-\uDC4D\uDCBB\uDCBC\uDCBE-\uDCC1\uDD40-\uDD43\uDD74\uDD75\uDDC5-\uDDC9\uDDCD\uDDDB\uDDDD-\uDDDF\uDE38-\uDE3D\uDEA9]|\uD805[\uDCC6\uDDC1-\uDDD7\uDE41-\uDE43\uDF3C-\uDF3E]|\uD809[\uDC70-\uDC74]|\uD81A[\uDE6E\uDE6F\uDEF5\uDF37-\uDF3B\uDF44]|\uD82F\uDC9F|\uD836[\uDE87-\uDE8B])/), Tn = new RegExp(/(?:[!"#$%&'()*+,\-./:;<=>?@[\]\\^_`{|}~\xA1\xA7\xAB\xB6\xB7\xBB\xBF\u037E\u0387\u055A-\u055F\u0589\u058A\u05BE\u05C0\u05C3\u05C6\u05F3\u05F4\u0609\u060A\u060C\u060D\u061B\u061E\u061F\u066A-\u066D\u06D4\u0700-\u070D\u07F7-\u07F9\u0830-\u083E\u085E\u0964\u0965\u0970\u0AF0\u0DF4\u0E4F\u0E5A\u0E5B\u0F04-\u0F12\u0F14\u0F3A-\u0F3D\u0F85\u0FD0-\u0FD4\u0FD9\u0FDA\u104A-\u104F\u10FB\u1360-\u1368\u1400\u166D\u166E\u169B\u169C\u16EB-\u16ED\u1735\u1736\u17D4-\u17D6\u17D8-\u17DA\u1800-\u180A\u1944\u1945\u1A1E\u1A1F\u1AA0-\u1AA6\u1AA8-\u1AAD\u1B5A-\u1B60\u1BFC-\u1BFF\u1C3B-\u1C3F\u1C7E\u1C7F\u1CC0-\u1CC7\u1CD3\u2010-\u2027\u2030-\u2043\u2045-\u2051\u2053-\u205E\u207D\u207E\u208D\u208E\u2308-\u230B\u2329\u232A\u2768-\u2775\u27C5\u27C6\u27E6-\u27EF\u2983-\u2998\u29D8-\u29DB\u29FC\u29FD\u2CF9-\u2CFC\u2CFE\u2CFF\u2D70\u2E00-\u2E2E\u2E30-\u2E42\u3001-\u3003\u3008-\u3011\u3014-\u301F\u3030\u303D\u30A0\u30FB\uA4FE\uA4FF\uA60D-\uA60F\uA673\uA67E\uA6F2-\uA6F7\uA874-\uA877\uA8CE\uA8CF\uA8F8-\uA8FA\uA8FC\uA92E\uA92F\uA95F\uA9C1-\uA9CD\uA9DE\uA9DF\uAA5C-\uAA5F\uAADE\uAADF\uAAF0\uAAF1\uABEB\uFD3E\uFD3F\uFE10-\uFE19\uFE30-\uFE52\uFE54-\uFE61\uFE63\uFE68\uFE6A\uFE6B\uFF01-\uFF03\uFF05-\uFF0A\uFF0C-\uFF0F\uFF1A\uFF1B\uFF1F\uFF20\uFF3B-\uFF3D\uFF3F\uFF5B\uFF5D\uFF5F-\uFF65]|\uD800[\uDD00-\uDD02\uDF9F\uDFD0]|\uD801\uDD6F|\uD802[\uDC57\uDD1F\uDD3F\uDE50-\uDE58\uDE7F\uDEF0-\uDEF6\uDF39-\uDF3F\uDF99-\uDF9C]|\uD804[\uDC47-\uDC4D\uDCBB\uDCBC\uDCBE-\uDCC1\uDD40-\uDD43\uDD74\uDD75\uDDC5-\uDDC9\uDDCD\uDDDB\uDDDD-\uDDDF\uDE38-\uDE3D\uDEA9]|\uD805[\uDCC6\uDDC1-\uDDD7\uDE41-\uDE43\uDF3C-\uDF3E]|\uD809[\uDC70-\uDC74]|\uD81A[\uDE6E\uDE6F\uDEF5\uDF37-\uDF3B\uDF44]|\uD82F\uDC9F|\uD836[\uDE87-\uDE8B])$/), Dn = { TMH1: { regexp: /^( {0,3}#\s)(.*?)((?:\s+#+\s*)?)$/, replacement: '<span class="TMMark TMMark_TMH1">$1</span>$$2<span class="TMMark TMMark_TMH1">$3</span>' }, TMH2: { regexp: /^( {0,3}##\s)(.*?)((?:\s+#+\s*)?)$/, replacement: '<span class="TMMark TMMark_TMH2">$1</span>$$2<span class="TMMark TMMark_TMH2">$3</span>' }, TMH3: { regexp: /^( {0,3}###\s)(.*?)((?:\s+#+\s*)?)$/, replacement: '<span class="TMMark TMMark_TMH3">$1</span>$$2<span class="TMMark TMMark_TMH3">$3</span>' }, TMH4: { regexp: /^( {0,3}####\s)(.*?)((?:\s+#+\s*)?)$/, replacement: '<span class="TMMark TMMark_TMH4">$1</span>$$2<span class="TMMark TMMark_TMH4">$3</span>' }, TMH5: { regexp: /^( {0,3}#####\s)(.*?)((?:\s+#+\s*)?)$/, replacement: '<span class="TMMark TMMark_TMH5">$1</span>$$2<span class="TMMark TMMark_TMH5">$3</span>' }, TMH6: { regexp: /^( {0,3}######\s)(.*?)((?:\s+#+\s*)?)$/, replacement: '<span class="TMMark TMMark_TMH6">$1</span>$$2<span class="TMMark TMMark_TMH6">$3</span>' }, TMBlockquote: { regexp: /^( {0,3}>[ ]?)(.*)$/, replacement: '<span class="TMMark TMMark_TMBlockquote">$1</span>$$2' }, TMCodeFenceBacktickOpen: { regexp: /^( {0,3}(?<seq>````*)\s*)([^`]*?)(\s*)$/, replacement: '<span class="TMMark TMMark_TMCodeFenceBacktick">$1</span><span class="TMInfoString">$3</span>$4' }, TMCodeFenceTildeOpen: { regexp: /^( {0,3}(?<seq>~~~~*)\s*)(.*?)(\s*)$/, replacement: '<span class="TMMark TMMark_TMCodeFenceTilde">$1</span><span class="TMInfoString">$3</span>$4' }, TMCodeFenceBacktickClose: { regexp: /^( {0,3}(?<seq>````*))(\s*)$/, replacement: '<span class="TMMark TMMark_TMCodeFenceBacktick">$1</span>$3' }, TMCodeFenceTildeClose: { regexp: /^( {0,3}(?<seq>~~~~*))(\s*)$/, replacement: '<span class="TMMark TMMark_TMCodeFenceTilde">$1</span>$3' }, TMBlankLine: {regexp: /^([ \t]*)$/, replacement: "$0"}, TMSetextH1Marker: { regexp: /^ {0,3}=+\s*$/, replacement: '<span class="TMMark TMMark_TMSetextH1Marker">$0</span>' }, TMSetextH2Marker: { regexp: /^ {0,3}-+\s*$/, replacement: '<span class="TMMark TMMark_TMSetextH1Marker">$0</span>' }, TMHR: { regexp: /^( {0,3}(\*[ \t]*\*[ \t]*\*[ \t*]*)|(-[ \t]*-[ \t]*-[ \t-]*)|(_[ \t]*_[ \t]*_[ \t_]*))$/, replacement: '<span class="TMMark TMMark_TMHR">$0</span>' }, TMUL: {regexp: /^( {0,3}[+*-] {1,4})(.*)$/, replacement: '<span class="TMMark TMMark_TMUL">$1</span>$$2'}, TMOL: { regexp: /^( {0,3}\d{1,9}[.)] {1,4})(.*)$/, replacement: '<span class="TMMark TMMark_TMOL">$1</span>$$2' }, TMIndentedCode: { regexp: /^( {4}|\t)(.*)$/, replacement: '<span class="TMMark TMMark_TMIndentedCode">$1</span>$2' }, TMLinkReferenceDefinition: { regexp: /^( {0,3}\[\s*)([^\s\]](?:[^\]]|\\\])*?)(\s*\]:\s*)((?:[^\s<>]+)|(?:<(?:[^<>\\]|\\.)*>))?(\s*)((?:\((?:[^()\\]|\\.)*\))|(?:"(?:[^"\\]|\\.)*")|(?:'(?:[^'\\]|\\.)*'))?(\s*)$/, replacement: '<span class="TMMark TMMark_TMLinkReferenceDefinition">$1</span><span class="TMLinkLabel TMLinkLabel_Definition">$2</span><span class="TMMark TMMark_TMLinkReferenceDefinition">$3</span><span class="TMLinkDestination">$4</span>$5<span class="TMLinkTitle">$6</span>$7', labelPlaceholder: 2 } }; var Fn = [{ start: /^ {0,3}<(?:script|pre|style)(?:\s|>|$)/i, end: /(?:<\/script>|<\/pre>|<\/style>)/i, paraInterrupt: !0 }, {start: /^ {0,3}<!--/, end: /-->/, paraInterrupt: !0}, { start: /^ {0,3}<\?/, end: /\?>/, paraInterrupt: !0 }, {start: /^ {0,3}<![A-Z]/, end: />/, paraInterrupt: !0}, { start: /^ {0,3}<!\[CDATA\[/, end: /\]\]>/, paraInterrupt: !0 }, { start: /^ {0,3}(?:<|<\/)(?:KnownTag)(?:\s|>|\/>|$)/i, end: !1, paraInterrupt: !0 }, {start: /^ {0,3}(?:HTMLOpenTag|HTMLCloseTag)\s*$/, end: !1, paraInterrupt: !1}], yn = { escape: { regexp: /^\\(ASCIIPunctuation)/, replacement: '<span class="TMMark TMMark_TMEscape">\\</span>$1' }, code: { regexp: /^(`+)((?:[^`])|(?:[^`].*?[^`]))(\1)/, replacement: '<span class="TMMark TMMark_TMCode">$1</span><code class="TMCode">$2</code><span class="TMMark TMMark_TMCode">$3</span>' }, autolink: { regexp: /^<((?:Scheme:[^\s<>]*)|(?:Email))>/, replacement: '<span class="TMMark TMMark_TMAutolink"><</span><span class="TMAutolink">$1</span><span class="TMMark TMMark_TMAutolink">></span>' }, html: { regexp: /^((?:HTMLOpenTag)|(?:HTMLCloseTag)|(?:HTMLComment)|(?:HTMLPI)|(?:HTMLDeclaration)|(?:HTMLCDATA))/, replacement: '<span class="TMHTML">$1</span>' }, linkOpen: {regexp: /^\[/, replacement: ""}, imageOpen: {regexp: /^!\[/, replacement: ""}, linkLabel: {regexp: /^(\[\s*)([^\]]*?)(\s*\])/, replacement: "", labelPlaceholder: 2}, default: {regexp: /^(.|(?:NotTriggerChar+))/, replacement: "$1"} }; const Cn = new RegExp(Object.keys(fn).join("|")), kn = [...Object.keys(yn)]; for (let e of kn) { let t = yn[e].regexp.source; for (; t.match(Cn);) t = t.replace(Cn, (e => fn[e].source)); yn[e].regexp = new RegExp(t, yn[e].regexp.flags) } for (let e of Fn) { let t = e.start.source; for (; t.match(Cn);) t = t.replace(Cn, (e => fn[e].source)); e.start = new RegExp(t, e.start.flags) } function En(e) { return (e || "").replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">") } const bn = { bold: { type: "inline", className: "TMStrong", set: {pre: "**", post: "**"}, unset: {prePattern: /(?:\*\*|__)$/, postPattern: /^(?:\*\*|__)/} }, italic: { type: "inline", className: "TMEm", set: {pre: "*", post: "*"}, unset: {prePattern: /(?:\*|_)$/, postPattern: /^(?:\*|_)/} }, code: { type: "inline", className: "TMCode", set: {pre: "`", post: "`"}, unset: {prePattern: /`+$/, postPattern: /^`+/} }, strikethrough: { type: "inline", className: "TMStrikethrough", set: {pre: "~~", post: "~~"}, unset: {prePattern: /~~$/, postPattern: /^~~/} }, h1: { type: "line", className: "TMH1", set: {pattern: /^( {0,3}(?:(?:#+|[0-9]{1,9}[).]|[>\-*+])\s+)?)(.*)$/, replacement: "# $2"}, unset: {pattern: /^( {0,3}#\s+)(.*?)((?:\s+#+\s*)?)$/, replacement: "$2"} }, h2: { type: "line", className: "TMH2", set: {pattern: /^( {0,3}(?:(?:#+|[0-9]{1,9}[).]|[>\-*+])\s+)?)(.*)$/, replacement: "## $2"}, unset: {pattern: /^( {0,3}##\s+)(.*?)((?:\s+#+\s*)?)$/, replacement: "$2"} }, h3: { type: "line", className: "TMH3", set: {pattern: /^( {0,3}(?:(?:#+|[0-9]{1,9}[).]|[>\-*+])\s+)?)(.*)$/, replacement: "### $2"}, unset: {pattern: /^( {0,3}###\s+)(.*?)((?:\s+#+\s*)?)$/, replacement: "$2"} }, h4: { type: "line", className: "TMH4", set: {pattern: /^( {0,3}(?:(?:#+|[0-9]{1,9}[).]|[>\-*+])\s+)?)(.*)$/, replacement: "#### $2"}, unset: {pattern: /^( {0,3}####\s+)(.*?)((?:\s+#+\s*)?)$/, replacement: "$2"} }, h5: { type: "line", className: "TMH5", set: {pattern: /^( {0,3}(?:(?:#+|[0-9]{1,9}[).]|[>\-*+])\s+)?)(.*)$/, replacement: "##### $2"}, unset: {pattern: /^( {0,3}#####\s+)(.*?)((?:\s+#+\s*)?)$/, replacement: "$2"} }, h6: { type: "line", className: "TMH6", set: {pattern: /^( {0,3}(?:(?:#+|[0-9]{1,9}[).]|[>\-*+])\s+)?)(.*)$/, replacement: "###### $2"}, unset: {pattern: /^( {0,3}######\s+)(.*?)((?:\s+#+\s*)?)$/, replacement: "$2"} }, ul: { type: "line", className: "TMUL", set: {pattern: /^( {0,3}(?:(?:#+|[0-9]{1,9}[).]|[>\-*+])\s+)?)(.*)$/, replacement: "- $2"}, unset: {pattern: /^( {0,3}[+*-] {1,4})(.*)$/, replacement: "$2"} }, ol: { type: "line", className: "TMOL", set: {pattern: /^( {0,3}(?:(?:#+|[0-9]{1,9}[).]|[>\-*+])\s+)?)(.*)$/, replacement: "$#. $2"}, unset: {pattern: /^( {0,3}\d{1,9}[.)] {1,4})(.*)$/, replacement: "$2"} }, blockquote: { type: "line", className: "TMBlockquote", set: {pattern: /^( {0,3}(?:(?:#+|[0-9]{1,9}[).]|[>\-*+])\s+)?)(.*)$/, replacement: "> $2"}, unset: {pattern: /^( {0,3}>[ ]?)(.*)$/, replacement: "$2"} } }; e.CommandBar = class { constructor(e) { this.e = null, this.editor = null, this.commands = [], this.buttons = {}, this.state = {}, this.hotkeys = []; let t = e.element; t && !t.tagName && (t = document.getElementById(e.element)), t || (t = document.body), this.createCommandBarElement(t, e.commands || ["bold", "italic", "strikethrough", "|", "code", "|", "h1", "h2", "|", "ul", "ol", "|", "blockquote", "hr", "|", "insertLink", "insertImage"]), document.addEventListener("keydown", (e => this.handleKeydown(e))), e.editor && this.setEditor(e.editor) } createCommandBarElement(e, t) { this.e = document.createElement("div"), this.e.className = "TMCommandBar"; for (let e of t) if ("|" == e) { let e = document.createElement("div"); e.className = "TMCommandDivider", this.e.appendChild(e) } else { let t; if ("string" == typeof e) { if (!s[e]) continue; t = e, this.commands[t] = s[t] } else { if ("object" != typeof e || !e.name) continue; t = e.name, this.commands[t] = {}, s[t] && Object.assign(this.commands[t], s[t]), Object.assign(this.commands[t], e) } let i = this.commands[t].title || t; if (this.commands[t].hotkey) { const e = this.commands[t].hotkey.split("-"); let s = [], r = []; for (let t = 0; t < e.length - 1; t++) switch (e[t]) { case"Ctrl": s.push("ctrlKey"), r.push("Ctrl"); break; case"Cmd": s.push("metaKey"), r.push("⌘"); break; case"Alt": s.push("altKey"), r.push("Alt"); break; case"Option": s.push("altKey"), r.push("⌥"); break; case"Win": s.push("metaKey"), r.push("⊞ Win"); break; case"Shift": s.push("shiftKey"), r.push("⇧"); break; case"Mod": n ? (s.push("metaKey"), r.push("⌘")) : (s.push("ctrlKey"), r.push("Ctrl")); break; case"Mod2": s.push("altKey"), n ? r.push("⌥") : r.push("Alt") } r.push(e[e.length - 1]); let a = {modifiers: s, command: t}; e[e.length - 1].match(/^[0-9]$/) ? a.code = `Digit${e[e.length - 1]}` : a.key = e[e.length - 1].toLowerCase(), this.hotkeys.push(a), i = i.concat(` (${r.join("+")})`) } this.buttons[t] = document.createElement("div"), this.buttons[t].className = "TMCommandButton TMCommandButton_Disabled", this.buttons[t].title = i, this.buttons[t].innerHTML = this.commands[t].innerHTML, this.buttons[t].addEventListener("mousedown", (e => this.handleClick(t, e))), this.e.appendChild(this.buttons[t]) } e.appendChild(this.e) } handleClick(e, t) { this.editor && (t.preventDefault(), "string" == typeof this.commands[e].action ? !1 === this.state[e] ? this.editor.setCommandState(e, !0) : this.editor.setCommandState(e, !1) : "function" == typeof this.commands[e].action && this.commands[e].action(this.editor)) } setEditor(e) { this.editor = e, e.addEventListener("selection", (e => this.handleSelection(e))) } handleSelection(e) { if (e.commandState) for (let t in this.commands) void 0 === e.commandState[t] ? this.commands[t].enabled ? this.state[t] = this.commands[t].enabled(this.editor, e.focus, e.anchor) : this.state[t] = !e.focus && null : this.state[t] = e.commandState[t], !0 === this.state[t] ? this.buttons[t].className = "TMCommandButton TMCommandButton_Active" : !1 === this.state[t] ? this.buttons[t].className = "TMCommandButton TMCommandButton_Inactive" : this.buttons[t].className = "TMCommandButton TMCommandButton_Disabled" } handleKeydown(e) { e:for (let t of this.hotkeys) if (t.key && e.key.toLowerCase() == t.key || t.code && e.code == t.code) { for (let n of t.modifiers) if (!e[n]) continue e; return void this.handleClick(t.command, e) } } }, e.Editor = class { constructor() { let e = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : {}; this.e = null, this.textarea = null, this.lines = [], this.lineElements = [], this.lineTypes = [], this.lineCaptures = [], this.lineReplacements = [], this.linkLabels = [], this.lineDirty = [], this.lastCommandState = null, this.listeners = { change: [], selection: [], drop: [] }; let t = e.element; this.textarea = e.textarea, this.textarea && (this.textarea.tagName || (this.textarea = document.getElementById(this.textarea)), t || (t = this.textarea)), t && !t.tagName && (t = document.getElementById(e.element)), t || (t = document.getElementsByTagName("body")[0]), "TEXTAREA" == t.tagName && (this.textarea = t, t = this.textarea.parentNode), this.textarea && (this.textarea.style.display = "none"), this.createEditorElement(t, e), this.setContent("string" == typeof e.content ? e.content : this.textarea ? this.textarea.value : "# Hello TinyMDE!\nEdit **here**") } createEditorElement(e, t) { t && void 0 !== t.editor ? t.editor.tagName ? this.e = t.editor : this.e = document.getElementById(t.editor) : this.e = document.createElement("div"), this.e.classList.add("TinyMDE"), this.e.contentEditable = !0, this.e.style.whiteSpace = "pre-wrap", this.e.style.webkitUserModify = "read-write-plaintext-only", void 0 === t.editor && (this.textarea && this.textarea.parentNode == e && this.textarea.nextSibling ? e.insertBefore(this.e, this.textarea.nextSibling) : e.appendChild(this.e)), this.e.addEventListener("input", (e => this.handleInputEvent(e))), this.e.addEventListener("compositionend", (e => this.handleInputEvent(e))), document.addEventListener("selectionchange", (e => this.handleSelectionChangeEvent(e))), this.e.addEventListener("paste", (e => this.handlePaste(e))), this.e.addEventListener("drop", (e => this.handleDrop(e))), this.lineElements = this.e.childNodes } setContent(e) { for (; this.e.firstChild;) this.e.removeChild(this.e.firstChild); this.lines = e.split(/(?:\r\n|\r|\n)/), this.lineDirty = []; for (let e = 0; e < this.lines.length; e++) { let e = document.createElement("div"); this.e.appendChild(e), this.lineDirty.push(!0) } this.lineTypes = new Array(this.lines.length), this.updateFormatting(), this.fireChange() } getContent() { return this.lines.join("\n") } updateFormatting() { this.updateLineTypes(), this.updateLinkLabels(), this.applyLineTypes() } updateLinkLabels() { this.linkLabels = []; for (let e = 0; e < this.lines.length; e++) "TMLinkReferenceDefinition" == this.lineTypes[e] && this.linkLabels.push(this.lineCaptures[e][Dn.TMLinkReferenceDefinition.labelPlaceholder]) } replace(e, t) { return e.replace(/(\${1,2})([0-9])/g, ((e, n, s) => "$" == n ? En(t[s]) : `<span class="TMInlineFormatted">${this.processInlineStyles(t[s])}</span>`)) } applyLineTypes() { for (let e = 0; e < this.lines.length; e++) { if (this.lineDirty[e]) { let t = this.replace(this.lineReplacements[e], this.lineCaptures[e]); this.lineElements[e].className = this.lineTypes[e], this.lineElements[e].removeAttribute("style"), this.lineElements[e].innerHTML = "" == t ? "<br />" : t } this.lineElements[e].dataset.lineNum = e } } updateLineTypes() { let e = !1, t = 0, n = !1; for (let s = 0; s < this.lines.length; s++) { let i = "TMPara", r = [this.lines[s]], a = "$$0"; if ("TMCodeFenceBacktickOpen" == e) { let n = Dn.TMCodeFenceBacktickClose.regexp.exec(this.lines[s]); n && n.groups.seq.length >= t ? (i = "TMCodeFenceBacktickClose", a = Dn.TMCodeFenceBacktickClose.replacement, r = n, e = !1) : (i = "TMFencedCodeBacktick", a = '<span class="TMFencedCode">$0<br /></span>', r = [this.lines[s]]) } else if ("TMCodeFenceTildeOpen" == e) { let n = Dn.TMCodeFenceTildeClose.regexp.exec(this.lines[s]); n && n.groups.seq.length >= t ? (i = "TMCodeFenceTildeClose", a = Dn.TMCodeFenceTildeClose.replacement, r = n, e = !1) : (i = "TMFencedCodeTilde", a = '<span class="TMFencedCode">$0<br /></span>', r = [this.lines[s]]) } if ("TMPara" == i && !1 === n) for (let e of Fn) if (this.lines[s].match(e.start) && (e.paraInterrupt || 0 == s || "TMPara" != this.lineTypes[s - 1] && "TMUL" != this.lineTypes[s - 1] && "TMOL" != this.lineTypes[s - 1] && "TMBlockquote" != this.lineTypes[s - 1])) { n = e; break } if (!1 !== n && (i = "TMHTMLBlock", a = '<span class="TMHTMLContent">$0<br /></span>', r = [this.lines[s]], n.end ? this.lines[s].match(n.end) && (n = !1) : (s == this.lines.length - 1 || this.lines[s + 1].match(Dn.TMBlankLine.regexp)) && (n = !1)), "TMPara" == i) for (let e in Dn) if (Dn[e].regexp) { let t = Dn[e].regexp.exec(this.lines[s]); if (t) { i = e, a = Dn[e].replacement, r = t; break } } if ("TMCodeFenceBacktickOpen" != i && "TMCodeFenceTildeOpen" != i || (e = i, t = r.groups.seq.length), "TMIndentedCode" != i && "TMLinkReferenceDefinition" != i || !(s > 0) || "TMPara" != this.lineTypes[s - 1] && "TMUL" != this.lineTypes[s - 1] && "TMOL" != this.lineTypes[s - 1] && "TMBlockquote" != this.lineTypes[s - 1] || (i = "TMPara", r = [this.lines[s]], a = "$$0"), "TMSetextH2Marker" == i) { let e = Dn.TMUL.regexp.exec(this.lines[s]); e && (i = "TMUL", a = Dn.TMUL.replacement, r = e) } if ("TMSetextH1Marker" == i || "TMSetextH2Marker" == i) if (0 == s || "TMPara" != this.lineTypes[s - 1]) { let e = Dn.TMHR.regexp.exec(this.lines[s]); e ? (i = "TMHR", r = e, a = Dn.TMHR.replacement) : (i = "TMPara", r = [this.lines[s]], a = "$$0") } else { let e = s - 1; const t = "TMSetextH1Marker" == i ? "TMSetextH1" : "TMSetextH2"; do { this.lineTypes[t] != t && (this.lineTypes[e] = t, this.lineDirty[t] = !0), this.lineReplacements[e] = "$$0", this.lineCaptures[e] = [this.lines[e]], e-- } while (e >= 0 && "TMPara" == this.lineTypes[e]) } this.lineTypes[s] != i && (this.lineTypes[s] = i, this.lineDirty[s] = !0), this.lineReplacements[s] = a, this.lineCaptures[s] = r } } updateLineContentsAndFormatting() { this.clearDirtyFlag(), this.updateLineContents(), this.updateFormatting() } parseLinkOrImage(e, t) { let n = t ? 2 : 1, s = e.substr(0, n), i = t ? "TMImage" : "TMLink", r = n, a = 1, l = !1, o = !1, u = [], c = []; e:for (; r < e.length && !1 === l;) { let s = e.substr(r); for (let e of ["escape", "code", "autolink", "html"]) { let t = yn[e].regexp.exec(s); if (t) { r += t[0].length; continue e } } if (s.match(yn.imageOpen.regexp)) a++, r += 2; else if (s.match(yn.linkOpen.regexp)) { if (a++, !t && this.parseLinkOrImage(s, !1)) return !1; r += 1 } else s.match(/^\]/) && (a--, 0 == a) ? (l = e.substr(n, r - n), r++) : r++ } if (!1 === l) return !1; let h = r < e.length ? e.substr(r, 1) : ""; if ("[" == h) { let t = e.substr(r), n = yn.linkLabel.regexp.exec(t); if (!n) return !1; r += n[0].length, u.push(n[1], n[2], n[3]), o = n[yn.linkLabel.labelPlaceholder] ? n[yn.linkLabel.labelPlaceholder] : l.trim() } else if ("(" != h) o = l.trim(); else { r++; let t = 1; for (; r < e.length && t > 0;) { let n = e.substr(r), s = /^\s+/.exec(n); if (s) { switch (c.length) { case 0: case 1: c.push(s[0]); break; case 2: if (c[0].match(/</)) c[1] = c[1].concat(s[0]); else { if (1 != t) return !1; c.push(""), c.push(s[0]) } break; case 3: c.push(s[0]); break; case 4: return !1; case 5: c.push(""); case 6: c[5] = c[5].concat(s[0]); break; case 7: c[6] = c[6].concat(s[0]); break; default: return !1 } r += s[0].length } else if (s = yn.escape.regexp.exec(n), s) { switch (c.length) { case 0: c.push(""); case 1: c.push(s[0]); break; case 2: c[1] = c[1].concat(s[0]); break; case 3: case 4: return !1; case 5: c.push(""); case 6: c[5] = c[5].concat(s[0]); break; default: return !1 } r += s[0].length } else if (c.length < 2 && n.match(/^</)) 0 == c.length && c.push(""), c[0] = c[0].concat("<"), r++; else if (1 != c.length && 2 != c.length || !n.match(/^>/)) if (s = /^["']/.exec(n), !s || 0 != c.length && 1 != c.length && 4 != c.length) if (!s || 5 != c.length && 6 != c.length || c[4] != s[0]) if (n.match(/^\(/)) { switch (c.length) { case 0: c.push(""); case 1: c.push(""); case 2: c[1] = c[1].concat("("), c[0].match(/<$/) || t++; break; case 3: c.push(""); case 4: c.push("("); break; case 5: c.push(""); case 6: if ("(" == c[4]) return !1; c[5] = c[5].concat("("); break; default: return !1 } r++ } else if (n.match(/^\)/)) { if (c.length <= 2) { for (; c.length < 2;) c.push(""); c[0].match(/<$/) || t--, t > 0 && (c[1] = c[1].concat(")")) } else 5 == c.length || 6 == c.length ? "(" == c[4] ? (5 == c.length && c.push(""), c.push(")")) : 5 == c.length ? c.push(")") : c[5] = c[5].concat(")") : t--; if (0 == t) for (; c.length < 7;) c.push(""); r++ } else { if (s = /^./.exec(n), !s) throw "Infinite loop"; switch (c.length) { case 0: c.push(""); case 1: c.push(s[0]); break; case 2: c[1] = c[1].concat(s[0]); break; case 3: case 4: return !1; case 5: c.push(""); case 6: c[5] = c[5].concat(s[0]); break; default: return !1 } r += s[0].length } else 5 == c.length && c.push(""), c.push(s[0]), r++; else { for (; c.length < 4;) c.push(""); c.push(s[0]), r++ } else 1 == c.length && c.push(""), c.push(">"), r++ } if (t > 0) return !1 } if (!1 !== o) { let e = !1; for (let t of this.linkLabels) if (t == o) { e = !0; break } let t = e ? "TMLinkLabel TMLinkLabel_Valid" : "TMLinkLabel TMLinkLabel_Invalid", n = `<span class="TMMark TMMark_${i}">${s}</span><span class="${i} ${u.length < 3 || !u[1] ? t : ""}">${this.processInlineStyles(l)}</span><span class="TMMark TMMark_${i}">]</span>`; return u.length >= 3 && (n = n.concat(`<span class="TMMark TMMark_${i}">${u[0]}</span>`, `<span class="${t}">${u[1]}</span>`, `<span class="TMMark TMMark_${i}">${u[2]}</span>`)), { output: n, charCount: r } } if (c) { for (; c.length < 7;) c.push(""); return { output: `<span class="TMMark TMMark_${i}">${s}</span><span class="${i}">${this.processInlineStyles(l)}</span><span class="TMMark TMMark_${i}">](${c[0]}</span><span class="${i}Destination">${c[1]}</span><span class="TMMark TMMark_${i}">${c[2]}${c[3]}${c[4]}</span><span class="${i}Title">${c[5]}</span><span class="TMMark TMMark_${i}">${c[6]})</span>`, charCount: r } } return !1 } processInlineStyles(e) { let t = "", n = [], s = 0, i = e; e:for (; i;) { for (let e of ["escape", "code", "autolink", "html"]) { let n = yn[e].regexp.exec(i); if (n) { i = i.substr(n[0].length), s += n[0].length, t += yn[e].replacement.replace(/\$([1-9])/g, ((e, t) => En(n[t]))); continue e } } let r = i.match(yn.linkOpen.regexp), a = i.match(yn.imageOpen.regexp); if (a || r) { let e = this.parseLinkOrImage(i, a); if (e) { t = `${t}${e.output}`, i = i.substr(e.charCount), s += e.charCount; continue e } } let l = /(^\*+)|(^_+)/.exec(i); if (l) { let r = l[0].length; const a = l[0], o = l[0][0]; i = i.substr(l[0].length); const u = s > 0 ? e.substr(0, s) : " ", c = s + l[0].length < e.length ? i : " ", h = c.match(Mn), p = u.match(Tn), d = c.match(/^\s/), g = u.match(/\s$/); let m = !(d || h && !g && !p), f = !(g || p && !d && !h); if ("_" == o && m && f && (m = p, f = h), f) { let e = n.length - 1; for (; r && e >= 0;) if (n[e].delimiter == o) { for (; e < n.length - 1;) { const e = n.pop(); t = `${e.output}${e.delimString.substr(0, e.count)}${t}` } if (r >= 2 && n[e].count >= 2 ? (t = `<span class="TMMark">${o}${o}</span><strong class="TMStrong">${t}</strong><span class="TMMark">${o}${o}</span>`, r -= 2, n[e].count -= 2) : (t = `<span class="TMMark">${o}</span><em class="TMEm">${t}</em><span class="TMMark">${o}</span>`, r -= 1, n[e].count -= 1), 0 == n[e].count) { t = `${n.pop().output}${t}`, e-- } } else e-- } r && m && (n.push({ delimiter: o, delimString: a, count: r, output: t }), t = "", r = 0), r && (t = `${t}${a.substr(0, r)}`), s += l[0].length } else if (l = /^~~/.exec(i), l) { let e = !1, r = n.length - 1; for (; !e && r >= 0;) if ("~" == n[r].delimiter) { for (; r < n.length - 1;) { const e = n.pop(); t = `${e.output}${e.delimString.substr(0, e.count)}${t}` } t = `<span class="TMMark">~~</span><del class="TMStrikethrough">${t}</del><span class="TMMark">~~</span>`, t = `${n.pop().output}${t}`, e = !0 } else r--; e || (n.push({ delimiter: "~", delimString: "~~", count: 2, output: t }), t = ""), s += l[0].length, i = i.substr(l[0].length) } else { if (l = yn.default.regexp.exec(i), !l) throw "Infinite loop!"; i = i.substr(l[0].length), s += l[0].length, t += yn.default.replacement.replace(/\$([1-9])/g, ((e, t) => En(l[t]))) } } for (; n.length;) { const e = n.pop(); t = `${e.output}${e.delimString.substr(0, e.count)}${t}` } return t } clearDirtyFlag() { this.lineDirty = new Array(this.lines.length); for (let e = 0; e < this.lineDirty.length; e++) this.lineDirty[e] = !1 } updateLineContents() { let e = this.e.childElementCount - this.lines.length; if (e) { let t = 0; for (; t <= this.lines.length && t <= this.lineElements.length && this.lineElements[t] && this.lines[t] == this.lineElements[t].textContent && this.lineTypes[t] == this.lineElements[t].className;) t++; let n = -1; for (; -n < this.lines.length && -n < this.lineElements.length && this.lines[this.lines.length + n] == this.lineElements[this.lineElements.length + n].textContent && this.lineTypes[this.lines.length + n] == this.lineElements[this.lineElements.length + n].className;) n--; let s = this.lines.length + n + 1 - t; s < -e && (s = -e), s < 0 && (s = 0); let i = []; for (let n = 0; n < s + e; n++) i.push(this.lineElements[t + n].textContent); this.spliceLines(t, s, i, !1) } else for (let e = 0; e < this.lineElements.length; e++) { let t = this.lineElements[e], n = t.textContent; this.lines[e] === n && this.lineTypes[e] === t.className || (this.lines[e] = n, this.lineTypes[e] = t.className, this.lineDirty[e] = !0) } } processNewParagraph(e) { if (!e) return; this.updateLineContents(); let t = !1, n = e.col > 0 ? e.row : e.row - 1; switch (this.lineTypes[n]) { case"TMUL": t = "TMUL"; break; case"TMOL": t = "TMOL"; break; case"TMIndentedCode": t = "TMIndentedCode" } let s = this.lines[e.row].replace(/\n\n$/, "\n").split(/(?:\r\n|\n|\r)/); if (s.length > 1 && (this.spliceLines(e.row, 1, s, !0), e.row++, e.col = 0), t) { let n = Dn[t].regexp.exec(this.lines[e.row - 1]); n && (n[2] ? ("TMOL" == t && (n[1] = n[1].replace(/\d{1,9}/, (e => parseInt(e[0]) + 1))), this.lines[e.row] = `${n[1]}${this.lines[e.row]}`, this.lineDirty[e.row] = !0, e.col = n[1].length) : (this.lines[e.row - 1] = "", this.lineDirty[e.row - 1] = !0)) } this.updateFormatting() } getSelection() { let e = arguments.length > 0 && void 0 !== arguments[0] && arguments[0]; const t = window.getSelection(); let n = e ? t.anchorNode : t.focusNode; if (!n) return null; let s = e ? t.anchorOffset : t.focusOffset; if (n == this.e) return s < this.lines.length ? {row: s, col: 0} : { row: s - 1, col: this.lines[s - 1].length }; let i = this.computeColumn(n, s); if (null === i) return null; let r = n; for (; r.parentElement != this.e;) r = r.parentElement; let a = 0; if (!r.dataset || !r.dataset.lineNum || r.previousSibling && r.previousSibling.dataset.lineNum == r.dataset.lineNum) for (; r.previousSibling;) a++, r = r.previousSibling; else a = parseInt(r.dataset.lineNum); return {row: a, col: i, node: n} } computeColumn(e, t) { let n, s = e; for (; s && s.parentNode != this.e;) s = s.parentNode; if (null == s) return null; for (e.nodeType === Node.TEXT_NODE || 0 === t ? (n = t, s = e) : t > 0 && (s = e.childNodes[t - 1], n = s.textContent.length); s.parentNode != this.e;) s.previousSibling ? (s = s.previousSibling, n += s.textContent.length) : s = s.parentNode; return n } computeNodeAndOffset(e, t) { let n = arguments.length > 2 && void 0 !== arguments[2] && arguments[2]; e >= this.lineElements.length && (e = this.lineElements.length - 1, t = this.lines[e].length), t > this.lines[e].length && (t = this.lines[e].length); const s = this.lineElements[e]; let i = s.firstChild, r = !1, a = {node: s.firstChild ? s.firstChild : s, offset: 0}; for (; i != s;) { if (!r && i.nodeType === Node.TEXT_NODE) if (i.nodeValue.length >= t) { if (!n || i.nodeValue.length != t) return {node: i, offset: t}; a = {node: i, offset: t}, t = 0 } else t -= i.nodeValue.length; !r && i.firstChild ? i = i.firstChild : i.nextSibling ? (r = !1, i = i.nextSibling) : (r = !0, i = i.parentNode) } return a } setSelection(e) { let t = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : null; if (!e) return; let n = document.createRange(), { node: s, offset: i } = this.computeNodeAndOffset(e.row, e.col, t && t.row == e.row && t.col > e.col), r = null, a = null; if (t && (t.row != e.row || t.col != e.col)) { let {node: n, offset: s} = this.computeNodeAndOffset(t.row, t.col, e.row == t.row && e.col > t.col); r = n, a = s } r ? n.setStart(r, a) : n.setStart(s, i), n.setEnd(s, i); let l = window.getSelection(); l.removeAllRanges(), l.addRange(n) } handleInputEvent(e) { if ("insertCompositionText" == e.inputType) return; let t = this.getSelection(); "insertParagraph" != e.inputType && "insertLineBreak" != e.inputType || !t ? (this.e.firstChild ? this.fixNodeHierarchy() : this.e.innerHTML = '<div class="TMBlankLine"><br></div>', this.updateLineContentsAndFormatting()) : (this.clearDirtyFlag(), this.processNewParagraph(t)), t && this.setSelection(t), this.fireChange() } fixNodeHierarchy() { const e = Array.from(this.e.childNodes), t = function (e) { const t = e.parentElement, n = e.nextSibling; t.removeChild(e); for (var s = arguments.length, i = new Array(s > 1 ? s - 1 : 0), r = 1; r < s; r++) i[r - 1] = arguments[r]; i.forEach((e => n ? t.insertBefore(e, n) : t.appendChild(e))) }; e.forEach((e => { if (e.nodeType !== Node.ELEMENT_NODE || "DIV" !== e.tagName) { const n = document.createElement("div"); t(e, n), n.appendChild(e) } else if (0 == e.childNodes.length) e.appendChild(document.createElement("br")); else { const n = Array.from(e.childNodes); if (n.some((e => e.nodeType === Node.ELEMENT_NODE && "DIV" === e.tagName))) return t(e, n) } })) } handleDrop(e) { e.preventDefault(), this.fireDrop(e.dataTransfer) } handleSelectionChangeEvent() { this.fireSelection() } spliceLines(e) { let t = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : 0, n = arguments.length > 2 && void 0 !== arguments[2] ? arguments[2] : [], s = !(arguments.length > 3 && void 0 !== arguments[3]) || arguments[3]; if (s) for (let n = 0; n < t; n++) this.e.removeChild(this.e.childNodes[e]); let i = [], r = []; for (let t = 0; t < n.length; t++) i.push(""), r.push(!0), s && (this.e.childNodes[e] ? this.e.insertBefore(document.createElement("div"), this.e.childNodes[e]) : this.e.appendChild(document.createElement("div"))); this.lines.splice(e, t, ...n), this.lineTypes.splice(e, t, ...i), this.lineDirty.splice(e, t, ...r) } handlePaste(e) { e.preventDefault(); let t = (e.originalEvent || e).clipboardData.getData("text/plain"); this.paste(t) } paste(e) { let t, n, s = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : null, i = arguments.length > 2 && void 0 !== arguments[2] ? arguments[2] : null; s || (s = this.getSelection(!0)), i || (i = this.getSelection(!1)), i || (i = { row: this.lines.length - 1, col: this.lines[this.lines.length - 1].length }), s || (s = i), s.row < i.row || s.row == i.row && s.col <= i.col ? (t = s, n = i) : (t = i, n = s); let r = e.split(/(?:\r\n|\r|\n)/), a = this.lines[t.row].substr(0, t.col), l = this.lines[n.row].substr(n.col); r[0] = a.concat(r[0]); let o = r[r.length - 1].length; r[r.length - 1] = r[r.length - 1].concat(l), this.spliceLines(t.row, 1 + n.row - t.row, r), i.row = t.row + r.length - 1, i.col = o, this.updateFormatting(), this.setSelection(i), this.fireChange() } computeCommonAncestor(e, t) { if (!e || !t) return null; if (e == t) return e; const n = e => { let t = []; for (; e;) t.unshift(e), e = e.parentNode; return t }, s = n(e), i = n(t); if (s[0] != i[0]) return null; let r; for (r = 0; s[r] == i[r]; r++) ; return s[r - 1] } computeEnclosingMarkupNode(e, t, n) { let s = null; if (!e) return null; if (t) { if (e.row != t.row) return null; s = this.computeCommonAncestor(e.node, t.node) } else s = e.node; if (!s) return null; for (; s != this.e;) { if (s.className && s.className.includes(n)) return s; s = s.parentNode } return null } getCommandState() { let e, t, n = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : null, s = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : null, i = {}; if (n || (n = this.getSelection(!1)), s || (s = this.getSelection(!0)), !n) { for (let e in bn) i[e] = null; return i } s || (s = n), s.row < n.row || s.row == n.row && s.col < n.col ? (e = s, t = n) : (e = n, t = s), t.row > e.row && 0 == t.col && (t.row--, t.col = this.lines[t.row].length); for (let r in bn) if ("inline" == bn[r].type && (n && n.row == s.row && this.isInlineFormattingAllowed(n, s) ? i[r] = !!this.computeEnclosingMarkupNode(n, s, bn[r].className) || n.col == s.col && !!this.lines[n.row].substr(0, n.col).match(bn[r].unset.prePattern) && !!this.lines[n.row].substr(n.col).match(bn[r].unset.postPattern) : i[r] = null), "line" == bn[r].type) if (n) { let n = this.lineTypes[e.row] == bn[r].className; for (let s = e.row; s <= t.row; s++) if (this.lineTypes[s] == bn[r].className != n) { n = null; break } i[r] = n } else i[r] = null; return i } setCommandState(e, t) { if ("inline" == bn[e].type) { let t = this.getSelection(!0), n = this.getSelection(!1); if (t || (t = n), !t) return; if (t.row != n.row) return; if (!this.isInlineFormattingAllowed(n, t)) return; let s = this.computeEnclosingMarkupNode(n, t, bn[e].className); if (this.clearDirtyFlag(), s) { this.lineDirty[n.row] = !0; const i = this.computeColumn(s, 0), r = s.textContent.length, a = this.lines[n.row].substr(0, i).replace(bn[e].unset.prePattern, ""), l = this.lines[n.row].substr(i, r), o = this.lines[n.row].substr(i + r).replace(bn[e].unset.postPattern, ""); this.lines[n.row] = a.concat(l, o), t.col = a.length, n.col = t.col + r, this.updateFormatting(), this.setSelection(n, t), this.fireChange() } else if (n.col == t.col && this.lines[n.row].substr(0, n.col).match(bn[e].unset.prePattern) && this.lines[n.row].substr(n.col).match(bn[e].unset.postPattern)) { this.lineDirty[n.row] = !0; const s = this.lines[n.row].substr(0, n.col).replace(bn[e].unset.prePattern, ""), i = this.lines[n.row].substr(n.col).replace(bn[e].unset.postPattern, ""); this.lines[n.row] = s.concat(i), n.col = t.col = s.length, this.updateFormatting(), this.setSelection(n, t), this.fireChange() } else { let {startCol: s, endCol: i} = n.col < t.col ? {startCol: n.col, endCol: t.col} : { startCol: t.col, endCol: n.col }, r = this.lines[n.row].substr(s, i - s).match(/^(?<leading>\s*).*\S(?<trailing>\s*)$/); r && (s += r.groups.leading.length, i -= r.groups.trailing.length), n.col = s, t.col = i, this.wrapSelection(bn[e].set.pre, bn[e].set.post, n, t), this.fireChange() } } else if ("line" == bn[e].type) { let n = this.getSelection(!0), s = this.getSelection(!1); if (n || (n = s), !s) return; this.clearDirtyFlag(); let i = n.row > s.row ? s : n, r = n.row > s.row ? n : s; r.row > i.row && 0 == r.col && r.row--; for (let n = i.row; n <= r.row; n++) t && this.lineTypes[n] != bn[e].className && (this.lines[n] = this.lines[n].replace(bn[e].set.pattern, bn[e].set.replacement.replace("$#", n - i.row + 1)), this.lineDirty[n] = !0), t || this.lineTypes[n] != bn[e].className || (this.lines[n] = this.lines[n].replace(bn[e].unset.pattern, bn[e].unset.replacement), this.lineDirty[n] = !0); this.updateFormatting(), this.setSelection({row: r.row, col: this.lines[r.row].length}, { row: i.row, col: 0 }), this.fireChange() } } isInlineFormattingAllowed() { const e = window.getSelection(); if (!e || !e.focusNode || !e.anchorNode) return !1; if (e.isCollapsed && 3 == e.focusNode.nodeType && e.focusOffset == e.focusNode.nodeValue.length) { let t; for (t = e.focusNode; t && null == t.nextSibling; t = t.parentNode) ; if (t && t.nextSibling.className && t.nextSibling.className.includes("TMInlineFormatted")) return !0 } let t = this.computeCommonAncestor(e.focusNode, e.anchorNode); if (!t) return !1; for (; t && t != this.e;) { if (t.className && "function" == typeof t.className.includes && (t.className.includes("TMInlineFormatted") || t.className.includes("TMBlankLine"))) return !0; t = t.parentNode } return !1 } wrapSelection(e, t) { let n = arguments.length > 2 && void 0 !== arguments[2] ? arguments[2] : null, s = arguments.length > 3 && void 0 !== arguments[3] ? arguments[3] : null; if (n || (n = this.getSelection(!1)), s || (s = this.getSelection(!0)), !n || !s || n.row != s.row) return; this.lineDirty[n.row] = !0; const i = n.col < s.col ? n.col : s.col, r = n.col < s.col ? s.col : n.col, a = this.lines[n.row].substr(0, i).concat(e), l = r == i ? "" : this.lines[n.row].substr(i, r - i), o = t.concat(this.lines[n.row].substr(r)); this.lines[n.row] = a.concat(l, o), s.col = a.length, n.col = s.col + l.length, this.updateFormatting(), this.setSelection(n, s) } toggleCommandState(e) { this.lastCommandState || (this.lastCommandState = this.getCommandState()), this.setCommandState(e, !this.lastCommandState[e]) } fireChange() { if (!this.textarea && !this.listeners.change.length) return; const e = this.getContent(); this.textarea && (this.textarea.value = e); for (let t of this.listeners.change) t({content: e, linesDirty: this.linesDirty}) } fireSelection() { if (this.listeners.selection && this.listeners.selection.length) { let e = this.getSelection(!1), t = this.getSelection(!0), n = this.getCommandState(e, t); this.lastCommandState ? Object.assign(this.lastCommandState, n) : this.lastCommandState = Object.assign({}, n); for (let n of this.listeners.selection) n({focus: e, anchor: t, commandState: this.lastCommandState}) } } fireDrop(e) { for (let t of this.listeners.drop) t({dataTransfer: e}) } addEventListener(e, t) { e.match(/^(?:change|input)$/i) && this.listeners.change.push(t), e.match(/^(?:selection|selectionchange)$/i) && this.listeners.selection.push(t), e.match(/^(?:drop)$/i) && this.listeners.drop.push(t) } } }));