mirror of
https://github.com/fastmail/Squire.git
synced 2024-12-22 15:23:29 -05:00
fe0dfdf6c4
This is a massive refactor to port Squire to TypeScript, fix a bunch of small bugs and modernise our tooling. The development was done on an internal repository, so apologies to anyone following externally for the commit dump; updates from here should come as real commits again. Co-authored-by: Joe Woods <woods@fastmailteam.com>
12 lines
50 KiB
JavaScript
12 lines
50 KiB
JavaScript
var ot=()=>!0,C=class{root;currentNode;nodeType;filter;constructor(n,e,t){this.root=n,this.currentNode=n,this.nodeType=e,this.filter=t||ot}isAcceptableNode(n){let e=n.nodeType;return!!((e===Node.ELEMENT_NODE?1:e===Node.TEXT_NODE?4:0)&this.nodeType)&&this.filter(n)}nextNode(){let n=this.root,e=this.currentNode,t;for(;;){for(t=e.firstChild;!t&&e&&e!==n;)t=e.nextSibling,t||(e=e.parentNode);if(!t)return null;if(this.isAcceptableNode(t))return this.currentNode=t,t;e=t}}previousNode(){let n=this.root,e=this.currentNode,t;for(;;){if(e===n)return null;if(t=e.previousSibling,t)for(;e=t.lastChild;)t=e;else t=e.parentNode;if(!t)return null;if(this.isAcceptableNode(t))return this.currentNode=t,t;e=t}}previousPONode(){let n=this.root,e=this.currentNode,t;for(;;){for(t=e.lastChild;!t&&e&&e!==n;)t=e.previousSibling,t||(e=e.parentNode);if(!t)return null;if(this.isAcceptableNode(t))return this.currentNode=t,t;e=t}}};var W="\u200B",V=navigator.userAgent,ce=/Mac OS X/.test(V),de=/Windows NT/.test(V),Ce=/iP(?:ad|hone|od)/.test(V)||ce&&!!navigator.maxTouchPoints,Me=/Android/.test(V),Fe=/Gecko\//.test(V),se=/Edge\//.test(V),st=!se&&/WebKit\//.test(V),k=ce||Ce?"Meta-":"Ctrl-",re=st,He="onbeforeinput"in document&&"inputType"in new InputEvent("input"),w=/[^ \t\r\n]/;var at=/^(?:#text|A(?:BBR|CRONYM)?|B(?:R|D[IO])?|C(?:ITE|ODE)|D(?:ATA|EL|FN)|EM|FONT|HR|I(?:FRAME|MG|NPUT|NS)?|KBD|Q|R(?:P|T|UBY)|S(?:AMP|MALL|PAN|TR(?:IKE|ONG)|U[BP])?|TIME|U|VAR|WBR)$/,ct=new Set(["BR","HR","IFRAME","IMG","INPUT"]),dt=0,_e=1,Pe=2,Ue=3,fe=new WeakMap,qe=()=>{fe=new WeakMap},I=i=>ct.has(i.nodeName),xe=i=>{switch(i.nodeType){case 3:return _e;case 1:case 11:if(fe.has(i))return fe.get(i);break;default:return dt}let n;return Array.from(i.childNodes).every(N)?at.test(i.nodeName)?n=_e:n=Pe:n=Ue,fe.set(i,n),n},N=i=>xe(i)===_e,H=i=>xe(i)===Pe,j=i=>xe(i)===Ue;var m=(i,n,e)=>{let t=document.createElement(i);if(n instanceof Array&&(e=n,n=null),n)for(let o in n){let s=n[o];s!==void 0&&t.setAttribute(o,s)}return e&&e.forEach(o=>t.appendChild(o)),t},ve=(i,n)=>I(i)||i.nodeType!==n.nodeType||i.nodeName!==n.nodeName?!1:i instanceof HTMLElement&&n instanceof HTMLElement?i.nodeName!=="A"&&i.className===n.className&&i.style.cssText===n.style.cssText:!0,ue=(i,n,e)=>{if(i.nodeName!==n)return!1;for(let t in e)if(!("getAttribute"in i)||i.getAttribute(t)!==e[t])return!1;return!0},g=(i,n,e,t)=>{for(;i&&i!==n;){if(ue(i,e,t))return i;i=i.parentNode}return null},he=(i,n)=>{let e=i.childNodes;for(;n&&i instanceof Element;)i=e[n-1],e=i.childNodes,n=e.length;return i},Le=(i,n)=>{let e=i;if(e instanceof Element){let t=e.childNodes;if(n<t.length)e=t[n];else{for(;e&&!e.nextSibling;)e=e.parentNode;e&&(e=e.nextSibling)}}return e},O=i=>i instanceof Element||i instanceof DocumentFragment?i.childNodes.length:i instanceof CharacterData?i.length:0,S=i=>{let n=document.createDocumentFragment(),e=i.firstChild;for(;e;)n.appendChild(e),e=i.firstChild;return n},E=i=>{let n=i.parentNode;return n&&n.removeChild(i),i},y=(i,n)=>{let e=i.parentNode;e&&e.replaceChild(n,i)};var ft=i=>i instanceof Element?i.nodeName==="BR":w.test(i.data),Y=(i,n)=>{let e=i.parentNode;for(;N(e);)e=e.parentNode;let t=new C(e,5,ft);return t.currentNode=i,!!t.nextNode()||n&&!t.previousNode()},me=(i,n)=>{let e=new C(i,4),t,o;for(;t=e.nextNode();)for(;(o=t.data.indexOf(W))>-1&&(!n||t.parentNode!==n);)if(t.length===1){let s=t,r=s.parentNode;for(;r&&(r.removeChild(s),e.currentNode=r,!(!N(r)||O(r)));)s=r,r=s.parentNode;break}else t.deleteData(o,1)};var ut=0,ht=1,mt=2,pt=3,K=(i,n,e)=>{let t=document.createRange();if(t.selectNode(n),e){let o=i.compareBoundaryPoints(pt,t)>-1,s=i.compareBoundaryPoints(ht,t)<1;return!o&&!s}else{let o=i.compareBoundaryPoints(ut,t)<1,s=i.compareBoundaryPoints(mt,t)>-1;return o&&s}},x=i=>{let{startContainer:n,startOffset:e,endContainer:t,endOffset:o}=i;for(;!(n instanceof Text);){let s=n.childNodes[e];if(!s||I(s)){e&&(s=n.childNodes[e-1],s instanceof Text&&(n=s,e=s.data.length));break}n=s,e=0}if(o)for(;!(t instanceof Text);){let s=t.childNodes[o-1];if(!s||I(s)){if(s&&s.nodeName==="BR"&&!Y(s,!1)){o-=1;continue}break}t=s,o=O(t)}else for(;!(t instanceof Text);){let s=t.firstChild;if(!s||I(s))break;t=s}i.setStart(n,e),i.setEnd(t,o)},P=(i,n,e,t)=>{let o=i.startContainer,s=i.startOffset,r=i.endContainer,l=i.endOffset,a;for(n||(n=i.commonAncestorContainer),e||(e=n);!s&&o!==n&&o!==t;)a=o.parentNode,s=Array.from(a.childNodes).indexOf(o),o=a;for(;!(r===e||r===t||(r.nodeType!==3&&r.childNodes[l]&&r.childNodes[l].nodeName==="BR"&&!Y(r.childNodes[l],!1)&&(l+=1),l!==O(r)));)a=r.parentNode,l=Array.from(a.childNodes).indexOf(r)+1,r=a;i.setStart(o,s),i.setEnd(r,l)},Re=(i,n,e)=>{let t=g(i.endContainer,e,n);if(t&&(t=t.parentNode)){let o=i.cloneRange();P(o,t,t,e),o.endContainer===t&&(i.setStart(o.endContainer,o.endOffset),i.setEnd(o.endContainer,o.endOffset))}return i};var _=i=>{let n=null;if(i instanceof Text)return i;if(N(i)){let e=i.firstChild;if(re)for(;e&&e instanceof Text&&!e.data;)i.removeChild(e),e=i.firstChild;e||(re?n=document.createTextNode(W):n=document.createTextNode(""))}else if(i instanceof Element&&!i.querySelector("BR")){n=m("BR");let e=i,t;for(;(t=e.lastElementChild)&&!N(t);)e=t}if(n)try{i.appendChild(n)}catch{}return i},B=(i,n)=>{let e=i.childNodes,t=null;for(let o=0,s=e.length;o<s;o+=1){let r=e[o],l=r.nodeName==="BR";!l&&N(r)?(t||(t=m("DIV")),t.appendChild(r),o-=1,s-=1):(l||t)&&(t||(t=m("DIV")),_(t),l?i.replaceChild(t,r):(i.insertBefore(t,r),o+=1,s+=1),t=null),j(r)&&B(r,n)}return t&&i.appendChild(_(t)),i},A=(i,n,e,t)=>{if(i instanceof Text&&i!==e){if(typeof n!="number")throw new Error("Offset must be a number to split text node!");if(!i.parentNode)throw new Error("Cannot split text node with no parent!");return A(i.parentNode,i.splitText(n),e,t)}let o=typeof n=="number"?n<i.childNodes.length?i.childNodes[n]:null:n,s=i.parentNode;if(!s||i===e||!(i instanceof Element))return o;let r=i.cloneNode(!1);for(;o;){let l=o.nextSibling;r.appendChild(o),o=l}return i instanceof HTMLOListElement&&g(i,t,"BLOCKQUOTE")&&(r.start=(+i.start||1)+i.childNodes.length-1),_(i),_(r),s.insertBefore(r,i.nextSibling),A(s,r,e,t)},We=(i,n)=>{let e=i.childNodes,t=e.length,o=[];for(;t--;){let s=e[t],r=t?e[t-1]:null;if(r&&N(s)&&ve(s,r))n.startContainer===s&&(n.startContainer=r,n.startOffset+=O(r)),n.endContainer===s&&(n.endContainer=r,n.endOffset+=O(r)),n.startContainer===i&&(n.startOffset>t?n.startOffset-=1:n.startOffset===t&&(n.startContainer=r,n.startOffset=O(r))),n.endContainer===i&&(n.endOffset>t?n.endOffset-=1:n.endOffset===t&&(n.endContainer=r,n.endOffset=O(r))),E(s),s instanceof Text?r.appendData(s.data):o.push(S(s));else if(s instanceof Element){let l;for(;l=o.pop();)s.appendChild(l);We(s,n)}}},J=(i,n)=>{let e=i instanceof Text?i.parentNode:i;if(e instanceof Element){let t={startContainer:n.startContainer,startOffset:n.startOffset,endContainer:n.endContainer,endOffset:n.endOffset};We(e,t),n.setStart(t.startContainer,t.startOffset),n.setEnd(t.endContainer,t.endOffset)}},$=(i,n,e,t)=>{let o=n,s,r;for(;(s=o.parentNode)&&s!==t&&s instanceof Element&&s.childNodes.length===1;)o=s;E(o),r=i.childNodes.length;let l=i.lastChild;l&&l.nodeName==="BR"&&(i.removeChild(l),r-=1),i.appendChild(S(n)),e.setStart(i,r),e.collapse(!0),J(i,e)},M=(i,n)=>{let e=i.previousSibling,t=i.firstChild,o=i.nodeName==="LI";if(!(o&&(!t||!/^[OU]L$/.test(t.nodeName)))){if(e&&ve(e,i)){if(!j(e))if(o){let r=m("DIV");r.appendChild(S(e)),e.appendChild(r)}else return;E(i);let s=!j(i);e.appendChild(S(i)),s&&B(e,n),t&&M(t,n)}else if(o){let s=m("DIV");i.insertBefore(s,t),_(s)}}};var Ke={"font-weight":{regexp:/^bold|^700/i,replace(){return m("B")}},"font-style":{regexp:/^italic/i,replace(){return m("I")}},"font-family":{regexp:w,replace(i,n){return m("SPAN",{class:i.fontFamily,style:"font-family:"+n})}},"font-size":{regexp:w,replace(i,n){return m("SPAN",{class:i.fontSize,style:"font-size:"+n})}},"text-decoration":{regexp:/^underline/i,replace(){return m("U")}}},Nt=(i,n,e)=>{let t=i.style,o,s;for(let r in Ke){let l=Ke[r],a=t.getPropertyValue(r);if(a&&l.regexp.test(a)){let d=l.replace(e.classNames,a);if(d.nodeName===i.nodeName&&d.className===i.className)continue;s||(s=d),o&&o.appendChild(d),o=d,i.style.setProperty(r,a)}}return s&&o&&(o.appendChild(S(i)),i.appendChild(s)),o||i},pe=i=>(n,e)=>{let t=m(i),o=n.attributes;for(let s=0,r=o.length;s<r;s+=1){let l=o[s];t.setAttribute(l.name,l.value)}return e.replaceChild(t,n),t.appendChild(S(n)),t},gt={1:"10",2:"13",3:"16",4:"18",5:"24",6:"32",7:"48"},St={STRONG:pe("B"),EM:pe("I"),INS:pe("U"),STRIKE:pe("S"),SPAN:Nt,FONT:(i,n,e)=>{let t=i,o=t.face,s=t.size,r=t.color,l=e.classNames,a,d,c,f,u;return o&&(a=m("SPAN",{class:l.fontFamily,style:"font-family:"+o}),u=a,f=a),s&&(d=m("SPAN",{class:l.fontSize,style:"font-size:"+gt[s]+"px"}),u||(u=d),f&&f.appendChild(d),f=d),r&&/^#?([\dA-F]{3}){1,2}$/i.test(r)&&(r.charAt(0)!=="#"&&(r="#"+r),c=m("SPAN",{class:l.color,style:"color:"+r}),u||(u=c),f&&f.appendChild(c),f=c),(!u||!f)&&(u=f=m("SPAN")),n.replaceChild(u,t),f.appendChild(S(t)),f},TT:(i,n,e)=>{let t=m("SPAN",{class:e.classNames.fontFamily,style:'font-family:menlo,consolas,"courier new",monospace'});return n.replaceChild(t,i),t.appendChild(S(i)),t}},Et=/^(?:A(?:DDRESS|RTICLE|SIDE|UDIO)|BLOCKQUOTE|CAPTION|D(?:[DLT]|IV)|F(?:IGURE|IGCAPTION|OOTER)|H[1-6]|HEADER|L(?:ABEL|EGEND|I)|O(?:L|UTPUT)|P(?:RE)?|SECTION|T(?:ABLE|BODY|D|FOOT|H|HEAD|R)|COL(?:GROUP)?|UL)$/,Tt=/^(?:HEAD|META|STYLE)/,Ne=(i,n,e)=>{let t=i.childNodes,o=i;for(;N(o);)o=o.parentNode;let s=new C(o,5);for(let r=0,l=t.length;r<l;r+=1){let a=t[r],d=a.nodeName,c=St[d];if(a instanceof HTMLElement){let f=a.childNodes.length;if(c)a=c(a,i,n);else if(Tt.test(d)){i.removeChild(a),r-=1,l-=1;continue}else if(!Et.test(d)&&!N(a)){r-=1,l+=f-1,i.replaceChild(S(a),a);continue}f&&Ne(a,n,e||d==="PRE")}else{if(a instanceof Text){let f=a.data,u=!w.test(f.charAt(0)),p=!w.test(f.charAt(f.length-1));if(e||!u&&!p)continue;if(u){s.currentNode=a;let h;for(;(h=s.previousPONode())&&!(h.nodeName==="IMG"||h instanceof Text&&w.test(h.data));)if(!N(h)){h=null;break}f=f.replace(/^[ \t\r\n]+/g,h?" ":"")}if(p){s.currentNode=a;let h;for(;(h=s.nextNode())&&!(h.nodeName==="IMG"||h instanceof Text&&w.test(h.data));)if(!N(h)){h=null;break}f=f.replace(/[ \t\r\n]+$/g,h?" ":"")}if(f){a.data=f;continue}}i.removeChild(a),r-=1,l-=1}}return i},ge=i=>{let n=i.childNodes,e=n.length;for(;e--;){let t=n[e];t instanceof Element&&!I(t)?(ge(t),N(t)&&!t.firstChild&&i.removeChild(t)):t instanceof Text&&!t.data&&i.removeChild(t)}},ee=(i,n,e)=>{let t=i.querySelectorAll("BR"),o=[],s=t.length;for(let r=0;r<s;r+=1)o[r]=Y(t[r],e);for(;s--;){let r=t[s],l=r.parentNode;l&&(o[s]?N(l)||B(l,n):E(r))}},Oe=i=>i.split("&").join("&").split("<").join("<").split(">").join(">").split('"').join(""");var le=(i,n)=>{let e=new C(n,1,H);return e.currentNode=i,e},z=(i,n)=>{let e=le(i,n).previousNode();return e!==n?e:null},U=(i,n)=>{let e=le(i,n).nextNode();return e!==n?e:null},ae=i=>!i.textContent&&!i.querySelector("IMG");var L=(i,n)=>{let e=i.startContainer,t;if(N(e))t=z(e,n);else if(e!==n&&e instanceof HTMLElement&&H(e))t=e;else{let o=he(e,i.startOffset);t=U(o,n)}return t&&K(i,t,!0)?t:null},G=(i,n)=>{let e=i.endContainer,t;if(N(e))t=z(e,n);else if(e!==n&&e instanceof HTMLElement&&H(e))t=e;else{let o=Le(e,i.endOffset);if(!o||!n.contains(o)){o=n;let s;for(;s=o.lastChild;)o=s}t=z(o,n)}return t&&K(i,t,!0)?t:null},ze=i=>i instanceof Text?w.test(i.data):i.nodeName==="IMG",Q=(i,n)=>{let e=i.startContainer,t=i.startOffset,o;if(e instanceof Text){if(t)return!1;o=e}else if(o=Le(e,t),o&&!n.contains(o)&&(o=null),!o&&(o=he(e,t),o instanceof Text&&o.length))return!1;let s=L(i,n);if(!s)return!1;let r=new C(s,5,ze);return r.currentNode=o,!r.previousNode()},ie=(i,n)=>{let e=i.endContainer,t=i.endOffset,o;if(e instanceof Text){let l=e.data.length;if(l&&t<l)return!1;o=e}else o=he(e,t);let s=G(i,n);if(!s)return!1;let r=new C(s,5,ze);return r.currentNode=o,!r.nextNode()},ke=(i,n)=>{let e=L(i,n),t=G(i,n),o;e&&t&&(o=e.parentNode,i.setStart(o,Array.from(o.childNodes).indexOf(e)),o=t.parentNode,i.setEnd(o,Array.from(o.childNodes).indexOf(t)+1))};function X(i,n,e,t){let o=document.createRange();return o.setStart(i,n),e&&typeof t=="number"?o.setEnd(e,t):o.setEnd(i,n),o}var Z=(i,n)=>{let{startContainer:e,startOffset:t,endContainer:o,endOffset:s}=i,r;if(e instanceof Text){let a=e.parentNode;if(r=a.childNodes,t===e.length)t=Array.from(r).indexOf(e)+1,i.collapsed&&(o=a,s=t);else{if(t){let d=e.splitText(t);o===e?(s-=t,o=d):o===a&&(s+=1),e=d}t=Array.from(r).indexOf(e)}e=a}else r=e.childNodes;let l=r.length;t===l?e.appendChild(n):e.insertBefore(n,r[t]),e===o&&(s+=r.length-l),i.setStart(e,t),i.setEnd(o,s)},ye=(i,n,e)=>{let t=document.createDocumentFragment();if(i.collapsed)return t;n||(n=i.commonAncestorContainer),n instanceof Text&&(n=n.parentNode);let o=i.startContainer,s=i.startOffset,r=A(i.endContainer,i.endOffset,n,e),l=0,a=A(o,s,n,e);for(;a&&a!==r;){let d=a.nextSibling;t.appendChild(a),a=d}return o instanceof Text&&r instanceof Text&&(o.appendData(r.data),E(r),r=o,l=s),i.setStart(o,s),r?i.setEnd(r,l):i.setEnd(n,n.childNodes.length),_(n),t},Ge=(i,n,e)=>{i.currentNode=e;let t;for(;t=i[n]();){if(t instanceof Text||I(t))return t;if(!N(t))return null}return null},F=(i,n)=>{let e=L(i,n),t=G(i,n),o=e!==t;e&&t&&(x(i),P(i,e,t,n));let s=ye(i,null,n);x(i),o&&(t=G(i,n),e&&t&&e!==t&&$(e,t,i,n)),e&&_(e);let r=n.firstChild;(!r||r.nodeName==="BR")&&(_(n),n.firstChild&&i.selectNodeContents(n.firstChild)),i.collapse(!0);let l=i.startContainer,a=i.startOffset,d=new C(n,5),c=l,f=a;(!(c instanceof Text)||f===c.data.length)&&(c=Ge(d,"nextNode",c),f=0);let u=l,p=a-1;(!(u instanceof Text)||p===-1)&&(u=Ge(d,"previousPONode",c||(l instanceof Text?l:l.childNodes[a]||l)),u instanceof Text&&(p=u.data.length));let h=null,T=0;return c instanceof Text&&c.data.charAt(f)===" "&&Q(i,n)?(h=c,T=f):u instanceof Text&&u.data.charAt(p)===" "&&(c instanceof Text&&c.data.charAt(f)===" "||ie(i,n))&&(h=u,T=p),h&&h.replaceData(T,1,"\xA0"),i.setStart(l,a),i.collapse(!0),s},Ze=(i,n,e)=>{let t=n.firstChild&&N(n.firstChild),o;for(B(n,e),o=n;o=U(o,e);)_(o);i.collapsed||F(i,e),x(i),i.collapse(!1);let s=g(i.endContainer,e,"BLOCKQUOTE")||e,r=L(i,e),l=null,a=U(n,n),d=!t&&!!r&&ae(r);if(r&&a&&!d&&!g(a,n,"PRE")&&!g(a,n,"TABLE")){P(i,r,r,e),i.collapse(!0);let c=i.endContainer,f=i.endOffset;if(ee(r,e,!1),N(c)){let u=A(c,f,z(c,e)||e,e);c=u.parentNode,f=Array.from(c.childNodes).indexOf(u)}if(f!==O(c))for(l=document.createDocumentFragment();o=c.childNodes[f];)l.appendChild(o);$(c,a,i,e),f=Array.from(c.parentNode.childNodes).indexOf(c)+1,c=c.parentNode,i.setEnd(c,f)}if(O(n)){d&&r&&(i.setEndBefore(r),i.collapse(!1),E(r)),P(i,s,s,e);let c=A(i.endContainer,i.endOffset,s,e),f=c?c.previousSibling:s.lastChild;s.insertBefore(n,c),c?i.setEndBefore(c):i.setEnd(s,O(s)),r=G(i,e),x(i);let u=i.endContainer,p=i.endOffset;c&&j(c)&&M(c,e),c=f&&f.nextSibling,c&&j(c)&&M(c,e),i.setEnd(u,p)}if(l&&r){let c=i.cloneRange();$(r,l,c,e),i.setEnd(c.endContainer,c.endOffset)}x(i)};var Be=Array.prototype.indexOf,_t=(i,n,e,t,o,s)=>{let r=i.clipboardData,l=document.body,a=m("DIV"),d,c;n.childNodes.length===1&&n.childNodes[0]instanceof Text?(c=n.childNodes[0].data.replace(/ /g," "),s=!0):(a.appendChild(n),d=a.innerHTML,t&&(d=t(d))),c!==void 0||(o&&d!==void 0?c=o(d):(ee(a,e,!0),a.setAttribute("style","position:fixed;overflow:hidden;bottom:100%;right:100%;"),l.appendChild(a),c=a.innerText||a.textContent,c=c.replace(/ /g," "),l.removeChild(a))),de&&(c=c.replace(/\r?\n/g,`\r
|
||
`)),!s&&d&&c!==d&&r.setData("text/html",d),r.setData("text/plain",c),i.preventDefault()},je=(i,n,e,t,o,s,r)=>{if(!se&&i.clipboardData){let l=L(n,e),a=G(n,e),d=e;l===a&&l?.contains(n.commonAncestorContainer)&&(d=l);let c;t?c=F(n,e):(n=n.cloneRange(),x(n),P(n,d,d,e),c=n.cloneContents());let f=n.commonAncestorContainer;for(f instanceof Text&&(f=f.parentNode);f&&f!==d;){let u=f.cloneNode(!1);u.appendChild(c),c=u,f=f.parentNode}return _t(i,c,e,o,s,r),!0}return!1},Qe=function(i){let n=this.getSelection(),e=this._root;if(n.collapsed){i.preventDefault();return}this.saveUndoState(n),je(i,n,e,!0,this._config.willCutCopy,null,!1)||setTimeout(()=>{try{this._ensureBottomLine()}catch(o){this._config.didError(o)}},0),this.setSelection(n)},Xe=function(i){je(i,this.getSelection(),this._root,!1,this._config.willCutCopy,null,!1)},De=function(i){this._isShiftDown=i.shiftKey},$e=function(i){let n=i.clipboardData,e=n?.items,t=this._isShiftDown,o=!1,s=!1,r=null,l=null;if(e){let b=e.length;for(;b--;){let R=e[b],D=R.type;D==="text/html"?l=R:D==="text/plain"||D==="text/uri-list"?r=R:D==="text/rtf"?o=!0:/^image\/.*/.test(D)&&(s=!0)}if(s&&!(o&&l)){i.preventDefault(),this.fireEvent("pasteImage",{clipboardData:n});return}if(!se){i.preventDefault(),l&&(!t||!r)?l.getAsString(R=>{this.insertHTML(R,!0)}):r&&r.getAsString(R=>{let D=!1,we=this.getSelection();if(!we.collapsed&&w.test(we.toString())){let Ie=this.linkRegExp.exec(R);D=!!Ie&&Ie[0].length===R.length}D?this.makeLink(R):this.insertPlainText(R,!0)});return}}let a=n?.types;if(!se&&a&&(Be.call(a,"text/html")>-1||!Fe&&Be.call(a,"text/plain")>-1&&Be.call(a,"text/rtf")<0)){i.preventDefault();let b;!t&&(b=n.getData("text/html"))?this.insertHTML(b,!0):((b=n.getData("text/plain"))||(b=n.getData("text/uri-list")))&&this.insertPlainText(b,!0);return}let d=document.body,c=this.getSelection(),f=c.startContainer,u=c.startOffset,p=c.endContainer,h=c.endOffset,T=m("DIV",{contenteditable:"true",style:"position:fixed; overflow:hidden; top:0; right:100%; width:1px; height:1px;"});d.appendChild(T),c.selectNodeContents(T),this.setSelection(c),setTimeout(()=>{try{let b="",R=T,D;for(;T=R;)R=T.nextSibling,E(T),D=T.firstChild,D&&D===T.lastChild&&D instanceof HTMLDivElement&&(T=D),b+=T.innerHTML;this.setSelection(X(f,u,p,h)),b&&this.insertHTML(b,!0)}catch(b){this._config.didError(b)}},0)},Ve=function(i){if(!i.dataTransfer)return;let n=i.dataTransfer.types,e=n.length,t=!1,o=!1;for(;e--;)switch(n[e]){case"text/plain":t=!0;break;case"text/html":o=!0;break;default:return}(o||t&&this.saveUndoState)&&this.saveUndoState()};var Ae=(i,n,e)=>{n.preventDefault(),i.splitBlock(n.shiftKey,e)};var te=(i,n)=>{try{n||(n=i.getSelection());let e=n.startContainer;e instanceof Text&&(e=e.parentNode);let t=e;for(;N(t)&&(!t.textContent||t.textContent===W);)e=t,t=e.parentNode;e!==t&&(n.setStart(t,Array.from(t.childNodes).indexOf(e)),n.collapse(!0),t.removeChild(e),H(t)||(t=z(t,i._root)||i._root),_(t),x(n)),e===i._root&&(e=e.firstChild)&&e.nodeName==="BR"&&E(e),i._ensureBottomLine(),i.setSelection(n),i._updatePath(n,!0)}catch(e){i._config.didError(e)}},Se=(i,n)=>{let e;for(;(e=i.parentNode)&&!(e===n||e.isContentEditable);)i=e;E(i)},Ee=(i,n,e)=>{if(g(n,i._root,"A"))return;let t=n.data||"",o=Math.max(t.lastIndexOf(" ",e-1),t.lastIndexOf("\xA0",e-1))+1,s=t.slice(o,e),r=i.linkRegExp.exec(s);if(r){let l=i.getSelection();i._docWasChanged(),i._recordUndoState(l),i._getRangeAndRemoveBookmark(l);let a=o+r.index,d=a+r[0].length;a&&(n=n.splitText(a));let c=i._config.tagAttributes.a,f=m("A",Object.assign({href:r[1]?/^(?:ht|f)tps?:/i.test(r[1])?r[1]:"http://"+r[1]:"mailto:"+r[0]},c));f.textContent=t.slice(a,d),n.parentNode.insertBefore(f,n);let u=l.startOffset;if(n.data=t.slice(d),l.startContainer===n){let p=u-d;l.setStart(n,p),l.setEnd(n,p)}i.setSelection(l)}};var Ye=(i,n,e)=>{let t=i._root;if(i._removeZWS(),i.saveUndoState(e),!e.collapsed)n.preventDefault(),F(e,t),te(i,e);else if(Q(e,t)){n.preventDefault();let o=L(e,t);if(!o)return;let s=o;B(s.parentNode,t);let r=z(s,t);if(r){if(!r.isContentEditable){Se(r,t);return}for($(r,s,e,t),s=r.parentNode;s!==t&&!s.nextSibling;)s=s.parentNode;s!==t&&(s=s.nextSibling)&&M(s,t),i.setSelection(e)}else if(s){if(g(s,t,"UL")||g(s,t,"OL")){i.decreaseListLevel(e);return}else if(g(s,t,"BLOCKQUOTE")){i.removeQuote(e);return}i.setSelection(e),i._updatePath(e,!0)}}else i.setSelection(e),setTimeout(()=>{te(i)},0)};var Je=(i,n,e)=>{let t=i._root,o,s,r,l,a,d;if(i._removeZWS(),i.saveUndoState(e),!e.collapsed)n.preventDefault(),F(e,t),te(i,e);else if(ie(e,t)){if(n.preventDefault(),o=L(e,t),!o)return;if(B(o.parentNode,t),s=U(o,t),s){if(!s.isContentEditable){Se(s,t);return}for($(o,s,e,t),s=o.parentNode;s!==t&&!s.nextSibling;)s=s.parentNode;s!==t&&(s=s.nextSibling)&&M(s,t),i.setSelection(e),i._updatePath(e,!0)}}else{if(r=e.cloneRange(),P(e,t,t,t),l=e.endContainer,a=e.endOffset,l instanceof Element&&(d=l.childNodes[a],d&&d.nodeName==="IMG")){n.preventDefault(),E(d),x(e),te(i,e);return}i.setSelection(r),setTimeout(()=>{te(i)},0)}};var et=(i,n,e)=>{let t=i._root;if(i._removeZWS(),e.collapsed&&Q(e,t)){let o=L(e,t),s;for(;s=o.parentNode;){if(s.nodeName==="UL"||s.nodeName==="OL"){n.preventDefault(),i.increaseListLevel(e);break}o=s}}},tt=(i,n,e)=>{let t=i._root;if(i._removeZWS(),e.collapsed&&Q(e,t)){let o=e.startContainer;(g(o,t,"UL")||g(o,t,"OL"))&&(n.preventDefault(),i.decreaseListLevel(e))}};var nt=(i,n,e)=>{let t,o=i._root;if(i._recordUndoState(e),i._getRangeAndRemoveBookmark(e),e.collapsed||(F(e,o),i._ensureBottomLine(),i.setSelection(e),i._updatePath(e,!0)),t=e.endContainer,e.endOffset===O(t))do if(t.nodeName==="A"){e.setStartAfter(t);break}while(!t.nextSibling&&(t=t.parentNode)&&t!==o);if(i._config.addLinks){let s=e.cloneRange();x(s);let r=s.startContainer,l=s.startOffset;setTimeout(()=>{Ee(i,r,l)},0)}i.setSelection(e)};var bt={8:"Backspace",9:"Tab",13:"Enter",27:"Escape",32:"Space",33:"PageUp",34:"PageDown",37:"ArrowLeft",38:"ArrowUp",39:"ArrowRight",40:"ArrowDown",46:"Delete",191:"/",219:"[",220:"\\",221:"]"},it=function(i){let n=i.keyCode,e=bt[n],t="",o=this.getSelection();i.defaultPrevented||(e||(e=String.fromCharCode(n).toLowerCase(),/^[A-Za-z0-9]$/.test(e)||(e="")),111<n&&n<124&&(e="F"+(n-111)),e!=="Backspace"&&e!=="Delete"&&(i.altKey&&(t+="Alt-"),i.ctrlKey&&(t+="Ctrl-"),i.metaKey&&(t+="Meta-"),i.shiftKey&&(t+="Shift-")),de&&i.shiftKey&&e==="Delete"&&(t+="Shift-"),e=t+e,this._keyHandlers[e]?this._keyHandlers[e](this,i,o):!o.collapsed&&!i.isComposing&&!i.ctrlKey&&!i.metaKey&&(i.key||e).length===1&&(this.saveUndoState(o),F(o,this._root),this._ensureBottomLine(),this.setSelection(o),this._updatePath(o,!0)))},v={Backspace:Ye,Delete:Je,Tab:et,"Shift-Tab":tt,Space:nt,ArrowLeft(i){i._removeZWS()},ArrowRight(i){i._removeZWS()}};He||(v.Enter=Ae,v["Shift-Enter"]=Ae);!ce&&!Ce&&(v.PageUp=i=>{i.moveCursorToStart()},v.PageDown=i=>{i.moveCursorToEnd()});var oe=(i,n)=>(n=n||null,(e,t)=>{t.preventDefault();let o=e.getSelection();e.hasFormat(i,null,o)?e.changeFormat(null,{tag:i},o):e.changeFormat({tag:i},n,o)});v[k+"b"]=oe("B");v[k+"i"]=oe("I");v[k+"u"]=oe("U");v[k+"Shift-7"]=oe("S");v[k+"Shift-5"]=oe("SUB",{tag:"SUP"});v[k+"Shift-6"]=oe("SUP",{tag:"SUB"});v[k+"Shift-8"]=(i,n)=>{n.preventDefault();let e=i.getPath();/(?:^|>)UL/.test(e)?i.removeList():i.makeUnorderedList()};v[k+"Shift-9"]=(i,n)=>{n.preventDefault();let e=i.getPath();/(?:^|>)OL/.test(e)?i.removeList():i.makeOrderedList()};v[k+"["]=(i,n)=>{n.preventDefault();let e=i.getPath();/(?:^|>)BLOCKQUOTE/.test(e)||!/(?:^|>)[OU]L/.test(e)?i.decreaseQuoteLevel():i.decreaseListLevel()};v[k+"]"]=(i,n)=>{n.preventDefault();let e=i.getPath();/(?:^|>)BLOCKQUOTE/.test(e)||!/(?:^|>)[OU]L/.test(e)?i.increaseQuoteLevel():i.increaseListLevel()};v[k+"d"]=(i,n)=>{n.preventDefault(),i.toggleCode()};v[k+"z"]=(i,n)=>{n.preventDefault(),i.undo()};v[k+"y"]=v[k+"Shift-z"]=(i,n)=>{n.preventDefault(),i.redo()};var Te=class{_root;_config;_isFocused;_lastSelection;_willRestoreSelection;_mayHaveZWS;_lastAnchorNode;_lastFocusNode;_path;_events;_undoIndex;_undoStack;_undoStackLength;_isInUndoState;_ignoreChange;_ignoreAllChanges;_isShiftDown;_keyHandlers;_mutation;constructor(n,e){this._root=n,this._config=this._makeConfig(e),this._isFocused=!1,this._lastSelection=X(n,0),this._willRestoreSelection=!1,this._mayHaveZWS=!1,this._lastAnchorNode=null,this._lastFocusNode=null,this._path="",this._events=new Map,this._undoIndex=-1,this._undoStack=[],this._undoStackLength=0,this._isInUndoState=!1,this._ignoreChange=!1,this._ignoreAllChanges=!1,this.addEventListener("selectionchange",this._updatePathOnEvent),this.addEventListener("blur",this._enableRestoreSelection),this.addEventListener("mousedown",this._disableRestoreSelection),this.addEventListener("touchstart",this._disableRestoreSelection),this.addEventListener("focus",this._restoreSelection),this._isShiftDown=!1,this.addEventListener("cut",Qe),this.addEventListener("copy",Xe),this.addEventListener("paste",$e),this.addEventListener("drop",Ve),this.addEventListener("keydown",De),this.addEventListener("keyup",De),this.addEventListener("keydown",it),this._keyHandlers=Object.create(v);let t=new MutationObserver(()=>this._docWasChanged());t.observe(n,{childList:!0,attributes:!0,characterData:!0,subtree:!0}),this._mutation=t,n.setAttribute("contenteditable","true");try{document.execCommand("enableObjectResizing",!1,"false"),document.execCommand("enableInlineTableEditing",!1,"false")}catch{}this.addEventListener("beforeinput",this._beforeInput),this.setHTML("")}destroy(){this._events.forEach((n,e)=>{this.removeEventListener(e)}),this._mutation.disconnect(),this._undoIndex=-1,this._undoStack=[],this._undoStackLength=0}_makeConfig(n){let e={blockTag:"DIV",blockAttributes:null,tagAttributes:{},classNames:{color:"color",fontFamily:"font",fontSize:"size",highlight:"highlight"},undo:{documentSizeThreshold:-1,undoLimit:-1},addLinks:!0,willCutCopy:null,sanitizeToDOMFragment:t=>{let o=DOMPurify.sanitize(t,{ALLOW_UNKNOWN_PROTOCOLS:!0,WHOLE_DOCUMENT:!1,RETURN_DOM:!0,RETURN_DOM_FRAGMENT:!0,FORCE_BODY:!1});return o?document.importNode(o,!0):document.createDocumentFragment()},didError:t=>console.log(t)};return n&&(Object.assign(e,n),e.blockTag=e.blockTag.toUpperCase()),e}setKeyHandler(n,e){return this._keyHandlers[n]=e,this}_beforeInput(n){switch(n.inputType){case"insertText":Me&&n.data&&n.data.includes(`
|
||
`)&&n.preventDefault();break;case"insertLineBreak":n.preventDefault(),this.splitBlock(!0);break;case"insertParagraph":n.preventDefault(),this.splitBlock(!1);break;case"insertOrderedList":n.preventDefault(),this.makeOrderedList();break;case"insertUnoderedList":n.preventDefault(),this.makeUnorderedList();break;case"historyUndo":n.preventDefault(),this.undo();break;case"historyRedo":n.preventDefault(),this.redo();break;case"formatBold":n.preventDefault(),this.bold();break;case"formaItalic":n.preventDefault(),this.italic();break;case"formatUnderline":n.preventDefault(),this.underline();break;case"formatStrikeThrough":n.preventDefault(),this.strikethrough();break;case"formatSuperscript":n.preventDefault(),this.superscript();break;case"formatSubscript":n.preventDefault(),this.subscript();break;case"formatJustifyFull":case"formatJustifyCenter":case"formatJustifyRight":case"formatJustifyLeft":{n.preventDefault();let e=n.inputType.slice(13).toLowerCase();e==="full"&&(e="justify"),this.setTextAlignment(e);break}case"formatRemove":n.preventDefault(),this.removeAllFormatting();break;case"formatSetBlockTextDirection":{n.preventDefault();let e=n.data;e==="null"&&(e=null),this.setTextDirection(e);break}case"formatBackColor":n.preventDefault(),this.setHighlightColor(n.data);break;case"formatFontColor":n.preventDefault(),this.setTextColor(n.data);break;case"formatFontName":n.preventDefault(),this.setFontFace(n.data);break}}handleEvent(n){this.fireEvent(n.type,n)}fireEvent(n,e){let t=this._events.get(n);if(/^(?:focus|blur)/.test(n)){let o=this._root===document.activeElement;if(n==="focus"){if(!o||this._isFocused)return this;this._isFocused=!0}else{if(o||!this._isFocused)return this;this._isFocused=!1}}if(t){let o=e instanceof Event?e:new CustomEvent(n,{detail:e});t=t.slice();for(let s of t)try{"handleEvent"in s?s.handleEvent(o):s.call(this,o)}catch(r){this._config.didError(r)}}return this}customEvents=new Set(["pathChange","select","input","pasteImage","undoStateChange"]);addEventListener(n,e){let t=this._events.get(n),o=this._root;return t||(t=[],this._events.set(n,t),this.customEvents.has(n)||(n==="selectionchange"&&(o=document),o.addEventListener(n,this,!0))),t.push(e),this}removeEventListener(n,e){let t=this._events.get(n),o=this._root;if(t){if(e){let s=t.length;for(;s--;)t[s]===e&&t.splice(s,1)}else t.length=0;t.length||(this._events.delete(n),this.customEvents.has(n)||(n==="selectionchange"&&(o=document),o.removeEventListener(n,this,!0)))}return this}focus(){return this._root.focus({preventScroll:!0}),this}blur(){return this._root.blur(),this}_enableRestoreSelection(){this._willRestoreSelection=!0}_disableRestoreSelection(){this._willRestoreSelection=!1}_restoreSelection(){this._willRestoreSelection&&this.setSelection(this._lastSelection)}_removeZWS(){this._mayHaveZWS&&(me(this._root),this._mayHaveZWS=!1)}startSelectionId="squire-selection-start";endSelectionId="squire-selection-end";_saveRangeToBookmark(n){let e=m("INPUT",{id:this.startSelectionId,type:"hidden"}),t=m("INPUT",{id:this.endSelectionId,type:"hidden"}),o;Z(n,e),n.collapse(!1),Z(n,t),e.compareDocumentPosition(t)&Node.DOCUMENT_POSITION_PRECEDING&&(e.id=this.endSelectionId,t.id=this.startSelectionId,o=e,e=t,t=o),n.setStartAfter(e),n.setEndBefore(t)}_getRangeAndRemoveBookmark(n){let e=this._root,t=e.querySelector("#"+this.startSelectionId),o=e.querySelector("#"+this.endSelectionId);if(t&&o){let s=t.parentNode,r=o.parentNode,l=Array.from(s.childNodes).indexOf(t),a=Array.from(r.childNodes).indexOf(o);s===r&&(a-=1),t.remove(),o.remove(),n||(n=document.createRange()),n.setStart(s,l),n.setEnd(r,a),J(s,n),s!==r&&J(r,n),n.collapsed&&(s=n.startContainer,s instanceof Text&&(r=s.childNodes[n.startOffset],(!r||!(r instanceof Text))&&(r=s.childNodes[n.startOffset-1]),r&&r instanceof Text&&(n.setStart(r,0),n.collapse(!0))))}return n||null}getSelection(){let n=window.getSelection(),e=this._root,t=null;if(this._isFocused&&n&&n.rangeCount){t=n.getRangeAt(0).cloneRange();let o=t.startContainer,s=t.endContainer;o&&I(o)&&t.setStartBefore(o),s&&I(s)&&t.setEndBefore(s)}return t&&e.contains(t.commonAncestorContainer)?this._lastSelection=t:(t=this._lastSelection,document.contains(t.commonAncestorContainer)||(t=null)),t||(t=X(e.firstElementChild||e,0)),t}setSelection(n){if(this._lastSelection=n,!this._isFocused)this._enableRestoreSelection();else{let e=window.getSelection();e&&e.setBaseAndExtent(n.startContainer,n.startOffset,n.endContainer,n.endOffset)}return this}_moveCursorTo(n){let e=this._root,t=X(e,n?0:e.childNodes.length);return x(t),this.setSelection(t),this}moveCursorToStart(){return this._moveCursorTo(!0)}moveCursorToEnd(){return this._moveCursorTo(!1)}getCursorPosition(){let n=this.getSelection(),e=n.getBoundingClientRect();if(e&&!e.top){this._ignoreChange=!0;let t=m("SPAN");t.textContent=W,Z(n,t),e=t.getBoundingClientRect();let o=t.parentNode;o.removeChild(t),J(o,n)}return e}getPath(){return this._path}_updatePathOnEvent(){this._isFocused&&this._updatePath(this.getSelection())}_updatePath(n,e){let t=n.startContainer,o=n.endContainer,s;(e||t!==this._lastAnchorNode||o!==this._lastFocusNode)&&(this._lastAnchorNode=t,this._lastFocusNode=o,s=t&&o?t===o?this._getPath(o):"(selection)":"",this._path!==s&&(this._path=s,this.fireEvent("pathChange",{path:s}))),this.fireEvent(n.collapsed?"cursor":"select",{range:n})}_getPath(n){let e=this._root,t=this._config,o="";if(n&&n!==e){let s=n.parentNode;if(o=s?this._getPath(s):"",n instanceof HTMLElement){let r=n.id,l=n.classList,a=Array.from(l).sort(),d=n.dir,c=t.classNames;o+=(o?">":"")+n.nodeName,r&&(o+="#"+r),a.length&&(o+=".",o+=a.join(".")),d&&(o+="[dir="+d+"]"),l.contains(c.highlight)&&(o+="[backgroundColor="+n.style.backgroundColor.replace(/ /g,"")+"]"),l.contains(c.color)&&(o+="[color="+n.style.color.replace(/ /g,"")+"]"),l.contains(c.fontFamily)&&(o+="[fontFamily="+n.style.fontFamily.replace(/ /g,"")+"]"),l.contains(c.fontSize)&&(o+="[fontSize="+n.style.fontSize+"]")}}return o}modifyDocument(n){let e=this._mutation;return e&&(e.takeRecords().length&&this._docWasChanged(),e.disconnect()),this._ignoreAllChanges=!0,n(),this._ignoreAllChanges=!1,e&&(e.observe(this._root,{childList:!0,attributes:!0,characterData:!0,subtree:!0}),this._ignoreChange=!1),this}_docWasChanged(){if(qe(),this._mayHaveZWS=!0,!this._ignoreAllChanges){if(this._ignoreChange){this._ignoreChange=!1;return}this._isInUndoState&&(this._isInUndoState=!1,this.fireEvent("undoStateChange",{canUndo:!0,canRedo:!1})),this.fireEvent("input")}}_recordUndoState(n,e){if(!this._isInUndoState||e){let t=this._undoIndex,o=this._undoStack,s=this._config.undo,r=s.documentSizeThreshold,l=s.undoLimit;e||(t+=1),t<this._undoStackLength&&(o.length=this._undoStackLength=t),n&&this._saveRangeToBookmark(n);let a=this._getRawHTML();r>-1&&a.length*2>r&&l>-1&&t>l&&(o.splice(0,t-l),t=l,this._undoStackLength=l),o[t]=a,this._undoIndex=t,this._undoStackLength+=1,this._isInUndoState=!0}return this}saveUndoState(n){return n||(n=this.getSelection()),this._recordUndoState(n,this._isInUndoState),this._getRangeAndRemoveBookmark(n),this}undo(){if(this._undoIndex!==0||!this._isInUndoState){this._recordUndoState(this.getSelection(),!1),this._undoIndex-=1,this._setRawHTML(this._undoStack[this._undoIndex]);let n=this._getRangeAndRemoveBookmark();n&&this.setSelection(n),this._isInUndoState=!0,this.fireEvent("undoStateChange",{canUndo:this._undoIndex!==0,canRedo:!0}),this.fireEvent("input")}return this}redo(){let n=this._undoIndex,e=this._undoStackLength;if(n+1<e&&this._isInUndoState){this._undoIndex+=1,this._setRawHTML(this._undoStack[this._undoIndex]);let t=this._getRangeAndRemoveBookmark();t&&this.setSelection(t),this.fireEvent("undoStateChange",{canUndo:!0,canRedo:n+2<e}),this.fireEvent("input")}return this}getRoot(){return this._root}_getRawHTML(){return this._root.innerHTML}_setRawHTML(n){let e=this._root;e.innerHTML=n;let t=e,o=t.firstChild;if(!o||o.nodeName==="BR"){let s=this.createDefaultBlock();o?t.replaceChild(s,o):t.appendChild(s)}else for(;t=U(t,e);)_(t);return this._ignoreChange=!0,this}getHTML(n){let e;n&&(e=this.getSelection(),this._saveRangeToBookmark(e));let t=this._getRawHTML().replace(/\u200B/g,"");return n&&this._getRangeAndRemoveBookmark(e),t}setHTML(n){let e=this._config.sanitizeToDOMFragment(n,this),t=this._root;Ne(e,this._config),ee(e,t,!1),B(e,t);let o=e,s=o.firstChild;if(!s||s.nodeName==="BR"){let l=this.createDefaultBlock();s?o.replaceChild(l,s):o.appendChild(l)}else for(;o=U(o,t);)_(o);for(this._ignoreChange=!0;s=t.lastChild;)t.removeChild(s);t.appendChild(e),this._undoIndex=-1,this._undoStack.length=0,this._undoStackLength=0,this._isInUndoState=!1;let r=this._getRangeAndRemoveBookmark()||X(t.firstElementChild||t,0);return this.saveUndoState(r),this.setSelection(r),this._updatePath(r,!0),this}insertHTML(n,e){let t=this._config,o=t.sanitizeToDOMFragment(n,this),s=this.getSelection();this.saveUndoState(s);try{let r=this._root;t.addLinks&&this.addDetectedLinks(o,o),Ne(o,this._config),ee(o,r,!1),ge(o),o.normalize();let l=o;for(;l=U(l,o);)_(l);let a=!0;if(e){let d=new CustomEvent("willPaste",{detail:{fragment:o}});this.fireEvent("willPaste",d),o=d.detail.fragment,a=!d.defaultPrevented}a&&(Ze(s,o,r),s.collapse(!1),Re(s,"A",r),this._ensureBottomLine()),this.setSelection(s),this._updatePath(s,!0),e&&this.focus()}catch(r){this._config.didError(r)}return this}insertElement(n,e){if(e||(e=this.getSelection()),e.collapse(!0),N(n))Z(e,n),e.setStartAfter(n);else{let t=this._root,o=L(e,t),s=o||t,r=null;for(;s!==t&&!s.nextSibling;)s=s.parentNode;if(s!==t){let a=s.parentNode;r=A(a,s.nextSibling,t,t)}o&&ae(o)&&E(o),t.insertBefore(n,r);let l=this.createDefaultBlock();t.insertBefore(l,r),e.setStart(l,0),e.setEnd(l,0),x(e)}return this.focus(),this.setSelection(e),this._updatePath(e),this}insertImage(n,e){let t=m("IMG",Object.assign({src:n},e));return this.insertElement(t),t}insertPlainText(n,e){let t=this.getSelection();if(t.collapsed&&g(t.startContainer,this._root,"PRE")){let c=t.startContainer,f=t.startOffset,u;if(!c||!(c instanceof Text)){let h=document.createTextNode("");c.insertBefore(h,c.childNodes[f]),u=h,f=0}else u=c;let p=!0;if(e){let h=new CustomEvent("willPaste",{detail:{text:n}});this.fireEvent("willPaste",h),n=h.detail.text,p=!h.defaultPrevented}return p&&(u.insertData(f,n),t.setStart(u,f+n.length),t.collapse(!0)),this.setSelection(t),this}let o=n.split(`
|
||
`),s=this._config,r=s.blockTag,l=s.blockAttributes,a="</"+r+">",d="<"+r;for(let c in l)d+=" "+c+'="'+Oe(l[c])+'"';d+=">";for(let c=0,f=o.length;c<f;c+=1){let u=o[c];u=Oe(u).replace(/ (?=(?: |$))/g," "),c&&(u=d+(u||"<BR>")+a),o[c]=u}return this.insertHTML(o.join(""),e)}getSelectedText(){let n=this.getSelection();if(n.collapsed)return"";let e=n.startContainer,t=n.endContainer,o=new C(n.commonAncestorContainer,5,d=>K(n,d,!0));o.currentNode=e;let s=e,r="",l=!1,a;for((!(s instanceof Element)&&!(s instanceof Text)||!o.filter(s))&&(s=o.nextNode());s;)s instanceof Text?(a=s.data,a&&/\S/.test(a)&&(s===t&&(a=a.slice(0,n.endOffset)),s===e&&(a=a.slice(n.startOffset)),r+=a,l=!0)):(s.nodeName==="BR"||l&&!N(s))&&(r+=`
|
||
`,l=!1),s=o.nextNode();return r}getFontInfo(n){let e={color:void 0,backgroundColor:void 0,fontFamily:void 0,fontSize:void 0};n||(n=this.getSelection());let t=0,o=n.commonAncestorContainer;if(n.collapsed||o instanceof Text)for(o instanceof Text&&(o=o.parentNode);t<4&&o;){let s=o.style;if(s){let r=s.color;!e.color&&r&&(e.color=r,t+=1);let l=s.backgroundColor;!e.backgroundColor&&l&&(e.backgroundColor=l,t+=1);let a=s.fontFamily;!e.fontFamily&&a&&(e.fontFamily=a,t+=1);let d=s.fontSize;!e.fontSize&&d&&(e.fontSize=d,t+=1)}o=o.parentNode}return e}hasFormat(n,e,t){n=n.toUpperCase(),e||(e={}),t||(t=this.getSelection()),!t.collapsed&&t.startContainer instanceof Text&&t.startOffset===t.startContainer.length&&t.startContainer.nextSibling&&t.setStartBefore(t.startContainer.nextSibling),!t.collapsed&&t.endContainer instanceof Text&&t.endOffset===0&&t.endContainer.previousSibling&&t.setEndAfter(t.endContainer.previousSibling);let o=this._root,s=t.commonAncestorContainer;if(g(s,o,n,e))return!0;if(s instanceof Text)return!1;let r=new C(s,4,d=>K(t,d,!0)),l=!1,a;for(;a=r.nextNode();){if(!g(a,o,n,e))return!1;l=!0}return l}changeFormat(n,e,t,o){return t||(t=this.getSelection()),this.saveUndoState(t),e&&(t=this._removeFormat(e.tag.toUpperCase(),e.attributes||{},t,o)),n&&(t=this._addFormat(n.tag.toUpperCase(),n.attributes||{},t)),this.setSelection(t),this._updatePath(t,!0),this.focus()}_addFormat(n,e,t){let o=this._root;if(t.collapsed){let s=_(m(n,e));Z(t,s);let r=s.firstChild||s,l=r instanceof Text?r.length:0;t.setStart(r,l),t.collapse(!0);let a=s;for(;N(a);)a=a.parentNode;me(a,s)}else{let s=new C(t.commonAncestorContainer,5,c=>(c instanceof Text||c.nodeName==="BR"||c.nodeName==="IMG")&&K(t,c,!0)),{startContainer:r,startOffset:l,endContainer:a,endOffset:d}=t;if(s.currentNode=r,!(r instanceof Element)&&!(r instanceof Text)||!s.filter(r)){let c=s.nextNode();if(!c)return t;r=c,l=0}do{let c=s.currentNode;if(!g(c,o,n,e)){c===a&&c.length>d&&c.splitText(d),c===r&&l&&(c=c.splitText(l),a===r?(a=c,d-=l):a===r.parentNode&&(d+=1),r=c,l=0);let u=m(n,e);y(c,u),u.appendChild(c)}}while(s.nextNode());t=X(r,l,a,d)}return t}_removeFormat(n,e,t,o){this._saveRangeToBookmark(t);let s;t.collapsed&&(re?s=document.createTextNode(W):s=document.createTextNode(""),Z(t,s));let r=t.commonAncestorContainer;for(;N(r);)r=r.parentNode;let l=t.startContainer,a=t.startOffset,d=t.endContainer,c=t.endOffset,f=[],u=(h,T)=>{if(K(t,h,!1))return;let b,R;if(!K(t,h,!0)){!(h instanceof HTMLInputElement)&&(!(h instanceof Text)||h.data)&&f.push([T,h]);return}if(h instanceof Text)h===d&&c!==h.length&&f.push([T,h.splitText(c)]),h===l&&a&&(h.splitText(a),f.push([T,h]));else for(b=h.firstChild;b;b=R)R=b.nextSibling,u(b,T)},p=Array.from(r.getElementsByTagName(n)).filter(h=>K(t,h,!0)&&ue(h,n,e));return o||p.forEach(h=>{u(h,h)}),f.forEach(([h,T])=>{h=h.cloneNode(!1),y(T,h),h.appendChild(T)}),p.forEach(h=>{y(h,S(h))}),this._getRangeAndRemoveBookmark(t),s&&t.collapse(!1),J(r,t),t}bold(){return this.changeFormat({tag:"B"})}removeBold(){return this.changeFormat(null,{tag:"B"})}italic(){return this.changeFormat({tag:"I"})}removeItalic(){return this.changeFormat(null,{tag:"I"})}underline(){return this.changeFormat({tag:"U"})}removeUnderline(){return this.changeFormat(null,{tag:"U"})}strikethrough(){return this.changeFormat({tag:"S"})}removeStrikethrough(){return this.changeFormat(null,{tag:"S"})}subscript(){return this.changeFormat({tag:"SUB"},{tag:"SUP"})}removeSubscript(){return this.changeFormat(null,{tag:"SUB"})}superscript(){return this.changeFormat({tag:"SUP"},{tag:"SUB"})}removeSuperscript(){return this.changeFormat(null,{tag:"SUP"})}makeLink(n,e){let t=this.getSelection();if(t.collapsed){let o=n.indexOf(":")+1;if(o)for(;n[o]==="/";)o+=1;Z(t,document.createTextNode(n.slice(o)))}return e=Object.assign({href:n},this._config.tagAttributes.a,e),this.changeFormat({tag:"A",attributes:e},{tag:"A"},t)}removeLink(){return this.changeFormat(null,{tag:"A"},this.getSelection(),!0)}linkRegExp=/\b(?:((?:(?:ht|f)tps?:\/\/|www\d{0,3}[.]|[a-z0-9][a-z0-9.\-]*[.][a-z]{2,}\/)(?:[^\s()<>]+|\([^\s()<>]+\))+(?:[^\s?&`!()\[\]{};:'".,<>«»“”‘’]|\([^\s()<>]+\)))|([\w\-.%+]+@(?:[\w\-]+\.)+[a-z]{2,}\b(?:[?][^&?\s]+=[^\s?&`!()\[\]{};:'".,<>«»“”‘’]+(?:&[^&?\s]+=[^\s?&`!()\[\]{};:'".,<>«»“”‘’]+)*)?))/i;addDetectedLinks(n,e){let t=new C(n,4,l=>!g(l,e||this._root,"A")),o=this.linkRegExp,s=this._config.tagAttributes.a,r;for(;r=t.nextNode();){let l=r.parentNode,a=r.data,d;for(;d=o.exec(a);){let c=d.index,f=c+d[0].length;c&&l.insertBefore(document.createTextNode(a.slice(0,c)),r);let u=m("A",Object.assign({href:d[1]?/^(?:ht|f)tps?:/i.test(d[1])?d[1]:"http://"+d[1]:"mailto:"+d[0]},s));u.textContent=a.slice(c,f),l.insertBefore(u,r),r.data=a=a.slice(f)}}return this}setFontFace(n){let e=this._config.classNames.fontFamily;return this.changeFormat(n?{tag:"SPAN",attributes:{class:e,style:"font-family: "+n+", sans-serif;"}}:null,{tag:"SPAN",attributes:{class:e}})}setFontSize(n){let e=this._config.classNames.fontSize;return this.changeFormat(n?{tag:"SPAN",attributes:{class:e,style:"font-size: "+(typeof n=="number"?n+"px":n)}}:null,{tag:"SPAN",attributes:{class:e}})}setTextColor(n){let e=this._config.classNames.color;return this.changeFormat(n?{tag:"SPAN",attributes:{class:e,style:"color:"+n}}:null,{tag:"SPAN",attributes:{class:e}})}setHighlightColor(n){let e=this._config.classNames.highlight;return this.changeFormat(n?{tag:"SPAN",attributes:{class:e,style:"background-color:"+n}}:null,{tag:"SPAN",attributes:{class:e}})}_ensureBottomLine(){let n=this._root,e=n.lastElementChild;(!e||e.nodeName!==this._config.blockTag||!H(e))&&n.appendChild(this.createDefaultBlock())}createDefaultBlock(n){let e=this._config;return _(m(e.blockTag,e.blockAttributes,n))}tagAfterSplit={DT:"DD",DD:"DT",LI:"LI",PRE:"PRE"};splitBlock(n,e){e||(e=this.getSelection());let t=this._root,o,s,r,l;if(this._recordUndoState(e),this._removeZWS(),this._getRangeAndRemoveBookmark(e),e.collapsed||F(e,t),this._config.addLinks){x(e);let u=e.startContainer,p=e.startOffset;setTimeout(()=>{Ee(this,u,p)},0)}if(o=L(e,t),o&&(s=g(o,t,"PRE"))){x(e),r=e.startContainer;let u=e.startOffset;return r instanceof Text||(r=document.createTextNode(""),s.insertBefore(r,s.firstChild)),!n&&r instanceof Text&&(r.data.charAt(u-1)===`
|
||
`||Q(e,t))&&(r.data.charAt(u)===`
|
||
`||ie(e,t))?(r.deleteData(u&&u-1,u?2:1),l=A(r,u&&u-1,t,t),r=l.previousSibling,r.textContent||E(r),r=this.createDefaultBlock(),l.parentNode.insertBefore(r,l),l.textContent||E(l),e.setStart(r,0)):(r.insertData(u,`
|
||
`),_(s),r.length===u+1?e.setStartAfter(r):e.setStart(r,u+1)),e.collapse(!0),this.setSelection(e),this._updatePath(e,!0),this._docWasChanged(),this}if(!o||n||/^T[HD]$/.test(o.nodeName))return Re(e,"A",t),Z(e,m("BR")),e.collapse(!1),this.setSelection(e),this._updatePath(e,!0),this;if((s=g(o,t,"LI"))&&(o=s),ae(o)){if(g(o,t,"UL")||g(o,t,"OL"))return this.decreaseListLevel(e),this;if(g(o,t,"BLOCKQUOTE"))return this.removeQuote(e),this}r=e.startContainer;let a=e.startOffset,d=this.tagAfterSplit[o.nodeName];l=A(r,a,o.parentNode,this._root);let c=this._config,f=null;for(d||(d=c.blockTag,f=c.blockAttributes),ue(l,d,f)||(o=m(d,f),l.dir&&(o.dir=l.dir),y(l,o),o.appendChild(S(l)),l=o),me(o),ge(o),_(o);l instanceof Element;){let u=l.firstChild,p;if(l.nodeName==="A"&&(!l.textContent||l.textContent===W)){u=document.createTextNode(""),y(l,u),l=u;break}for(;u&&u instanceof Text&&!u.data&&(p=u.nextSibling,!(!p||p.nodeName==="BR"));)E(u),u=p;if(!u||u.nodeName==="BR"||u instanceof Text)break;l=u}return e=X(l,0),this.setSelection(e),this._updatePath(e,!0),this}forEachBlock(n,e,t){t||(t=this.getSelection()),e&&this.saveUndoState(t);let o=this._root,s=L(t,o),r=G(t,o);if(s&&r)do if(n(s)||s===r)break;while(s=U(s,o));return e&&(this.setSelection(t),this._updatePath(t,!0)),this}modifyBlocks(n,e){e||(e=this.getSelection()),this._recordUndoState(e,this._isInUndoState);let t=this._root;ke(e,t),P(e,t,t,t);let o=ye(e,t,t);if(!e.collapsed){let s=e.endContainer;if(s===t)e.collapse(!1);else{for(;s.parentNode!==t;)s=s.parentNode;e.setStartBefore(s),e.collapse(!0)}}return Z(e,n.call(this,o)),e.endOffset<e.endContainer.childNodes.length&&M(e.endContainer.childNodes[e.endOffset],t),M(e.startContainer.childNodes[e.startOffset],t),this._getRangeAndRemoveBookmark(e),this.setSelection(e),this._updatePath(e,!0),this}setTextAlignment(n){return this.forEachBlock(e=>{let t=e.className.split(/\s+/).filter(o=>!!o&&!/^align/.test(o)).join(" ");n?(e.className=t+" align-"+n,e.style.textAlign=n):(e.className=t,e.style.textAlign="")},!0),this.focus()}setTextDirection(n){return this.forEachBlock(e=>{n?e.dir=n:e.removeAttribute("dir")},!0),this.focus()}_getListSelection(n,e){let t=n.commonAncestorContainer,o=n.startContainer,s=n.endContainer;for(;t&&t!==e&&!/^[OU]L$/.test(t.nodeName);)t=t.parentNode;if(!t||t===e)return null;for(o===t&&(o=o.childNodes[n.startOffset]),s===t&&(s=s.childNodes[n.endOffset]);o&&o.parentNode!==t;)o=o.parentNode;for(;s&&s.parentNode!==t;)s=s.parentNode;return[t,o,s]}increaseListLevel(n){n||(n=this.getSelection());let e=this._root,t=this._getListSelection(n,e);if(!t)return this.focus();let[o,s,r]=t;if(!s||s===o.firstChild)return this.focus();this._recordUndoState(n,this._isInUndoState);let l=o.nodeName,a=s.previousSibling,d,c;a.nodeName!==l&&(d=this._config.tagAttributes[l.toLowerCase()],a=m(l,d),o.insertBefore(a,s));do c=s===r?null:s.nextSibling,a.appendChild(s);while(s=c);return c=a.nextSibling,c&&M(c,e),this._getRangeAndRemoveBookmark(n),this.setSelection(n),this._updatePath(n,!0),this.focus()}decreaseListLevel(n){n||(n=this.getSelection());let e=this._root,t=this._getListSelection(n,e);if(!t)return this.focus();let[o,s,r]=t;s||(s=o.firstChild),r||(r=o.lastChild),this._recordUndoState(n,this._isInUndoState);let l,a=null;if(s){let d=o.parentNode;if(a=r.nextSibling?A(o,r.nextSibling,d,e):o.nextSibling,d!==e&&d.nodeName==="LI"){for(d=d.parentNode;a;)l=a.nextSibling,r.appendChild(a),a=l;a=o.parentNode.nextSibling}let c=!/^[OU]L$/.test(d.nodeName);do l=s===r?null:s.nextSibling,o.removeChild(s),c&&s.nodeName==="LI"&&(s=this.createDefaultBlock([S(s)])),d.insertBefore(s,a);while(s=l)}return o.firstChild||E(o),a&&M(a,e),this._getRangeAndRemoveBookmark(n),this.setSelection(n),this._updatePath(n,!0),this.focus()}_makeList(n,e){let t=le(n,this._root),o=this._config.tagAttributes,s=o[e.toLowerCase()],r=o.li,l;for(;l=t.nextNode();)if(l.parentNode instanceof HTMLLIElement&&(l=l.parentNode,t.currentNode=l.lastChild),l instanceof HTMLLIElement){l=l.parentNode;let a=l.nodeName;a!==e&&/^[OU]L$/.test(a)&&y(l,m(e,s,[S(l)]))}else{let a=m("LI",r);l.dir&&(a.dir=l.dir);let d=l.previousSibling;d&&d.nodeName===e?(d.appendChild(a),E(l)):y(l,m(e,s,[a])),a.appendChild(S(l)),t.currentNode=a}return n}makeUnorderedList(){return this.modifyBlocks(n=>this._makeList(n,"UL")),this.focus()}makeOrderedList(){return this.modifyBlocks(n=>this._makeList(n,"OL")),this.focus()}removeList(){return this.modifyBlocks(n=>{let e=n.querySelectorAll("UL, OL"),t=n.querySelectorAll("LI"),o=this._root;for(let s=0,r=e.length;s<r;s+=1){let l=e[s],a=S(l);B(a,o),y(l,a)}for(let s=0,r=t.length;s<r;s+=1){let l=t[s];H(l)?y(l,this.createDefaultBlock([S(l)])):(B(l,o),y(l,S(l)))}return n}),this.focus()}increaseQuoteLevel(n){return this.modifyBlocks(e=>m("BLOCKQUOTE",this._config.tagAttributes.blockquote,[e]),n),this.focus()}decreaseQuoteLevel(n){return this.modifyBlocks(e=>(Array.from(e.querySelectorAll("blockquote")).filter(t=>!g(t.parentNode,e,"BLOCKQUOTE")).forEach(t=>{y(t,S(t))}),e),n),this.focus()}removeQuote(n){return this.modifyBlocks(()=>this.createDefaultBlock([m("INPUT",{id:this.startSelectionId,type:"hidden"}),m("INPUT",{id:this.endSelectionId,type:"hidden"})]),n),this.focus()}code(){let n=this.getSelection();return n.collapsed||j(n.commonAncestorContainer)?(this.modifyBlocks(e=>{let t=this._root,o=document.createDocumentFragment(),s=le(e,t),r;for(;r=s.nextNode();){let a=r.querySelectorAll("BR"),d=[],c=a.length;for(let f=0;f<c;f+=1)d[f]=Y(a[f],!1);for(;c--;){let f=a[c];d[c]?y(f,document.createTextNode(`
|
||
`)):E(f)}for(a=r.querySelectorAll("CODE"),c=a.length;c--;)y(a[c],S(a[c]));o.childNodes.length&&o.appendChild(document.createTextNode(`
|
||
`)),o.appendChild(S(r))}let l=new C(o,4);for(;r=l.nextNode();)r.data=r.data.replace(/ /g," ");return o.normalize(),_(m("PRE",this._config.tagAttributes.pre,[o]))},n),this.focus()):this.changeFormat({tag:"CODE",attributes:this._config.tagAttributes.code},null,n),this}removeCode(){let n=this.getSelection(),e=n.commonAncestorContainer;return g(e,this._root,"PRE")?(this.modifyBlocks(o=>{let s=this._root,r=o.querySelectorAll("PRE"),l=r.length;for(;l--;){let a=r[l],d=new C(a,4),c;for(;c=d.nextNode();){let f=c.data;f=f.replace(/ (?= )/g,"\xA0");let u=document.createDocumentFragment(),p;for(;(p=f.indexOf(`
|
||
`))>-1;)u.appendChild(document.createTextNode(f.slice(0,p))),u.appendChild(m("BR")),f=f.slice(p+1);c.parentNode.insertBefore(u,c),c.data=f}B(a,s),y(a,S(a))}return o},n),this.focus()):this.changeFormat(null,{tag:"CODE"},n),this}toggleCode(){return this.hasFormat("PRE")||this.hasFormat("CODE")?this.removeCode():this.code(),this}_removeFormatting(n,e){for(let t=n.firstChild,o;t;t=o){if(o=t.nextSibling,N(t)){if(t instanceof Text||t.nodeName==="BR"||t.nodeName==="IMG"){e.appendChild(t);continue}}else if(H(t)){e.appendChild(this.createDefaultBlock([this._removeFormatting(t,document.createDocumentFragment())]));continue}this._removeFormatting(t,e)}return e}removeAllFormatting(n){if(n||(n=this.getSelection()),n.collapsed)return this;let e=this._root,t=n.commonAncestorContainer;for(;t&&!H(t);)t=t.parentNode;if(t||(ke(n,e),t=e),t instanceof Text)return this;this.saveUndoState(n),P(n,t,t,e);let o=n.startContainer,s=n.startOffset,r=n.endContainer,l=n.endOffset,a=document.createDocumentFragment(),d=document.createDocumentFragment(),c=A(r,l,t,e),f=A(o,s,t,e),u;for(;f!==c;)u=f.nextSibling,a.appendChild(f),f=u;if(this._removeFormatting(a,d),d.normalize(),f=d.firstChild,u=d.lastChild,f){t.insertBefore(d,c);let p=Array.from(t.childNodes);s=p.indexOf(f),l=u?p.indexOf(u)+1:0}else c&&(s=Array.from(t.childNodes).indexOf(c),l=s);return n.setStart(t,s),n.setEnd(t,l),J(t,n),x(n),this.setSelection(n),this._updatePath(n,!0),this.focus()}};var vi=Te;export{vi as default};
|
||
//# sourceMappingURL=squire.mjs.map
|