froala-editor
Version:
The next generation Javascript WYSIWYG HTML rich text editor made by devs for devs. High performance and modern design make it easy to use for developers and loved by users.
7 lines (6 loc) • 14.3 kB
JavaScript
/*!
* froala_editor v5.0.1 (https://www.froala.com/wysiwyg-editor)
* License https://froala.com/wysiwyg-editor/terms/
* Copyright 2014-2026 Froala Labs
*/
!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(require("froala-editor")):"function"==typeof define&&define.amd?define(["froala-editor"],t):t(("undefined"!=typeof globalThis?globalThis:e||self).FroalaEditor)}(this,function(o){"use strict";function r(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n<t;n++)r[n]=e[n];return r}function k(e){return function(e){if(Array.isArray(e))return r(e)}(e)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||l(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function l(e,t){var n;if(e)return"string"==typeof e?r(e,t):"Map"===(n="Object"===(n={}.toString.call(e).slice(8,-1))&&e.constructor?e.constructor.name:n)||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?r(e,t):void 0}Object.assign(o.DEFAULTS,{listAdvancedTypes:!0}),o.PLUGINS.lists=function(C){var O=C.$;function g(e){return'<span class="fr-open-'.concat(e.toLowerCase(),'"></span>')}function m(e){return'<span class="fr-close-'.concat(e.toLowerCase(),'"></span>')}function i(e,t){for(var n=e,r=t,a=[],o=0;o<n.length;o++){var i=n[o].parentNode;"LI"==n[o].tagName&&i.tagName!=r&&a.indexOf(i)<0&&a.push(i)}for(var l=a.length-1;0<=l;l--){var s=O(a[l]);s.replaceWith("<".concat(r.toLowerCase()," ").concat(C.node.attributes(s.get(0)),">").concat(s.html(),"</").concat(r.toLowerCase(),">"))}var c,d=C.html.defaultTag(),f=null;e.length&&(c="rtl"==C.opts.direction||"rtl"==O(e[0]).css("direction")?"margin-right":"margin-left");for(var p=0;p<e.length;p++){var u=C.helpers.getPX(O(e[p]).css(c))||0,g=0<(f=(e[p].style.marginLeft=null)===f?u:f)?"<".concat(t,' style="').concat(c,": ").concat(f,'px ">'):"<".concat(t,">"),m="</".concat(t,">");if("TD"==e[p].tagName||"TH"==e[p].tagName)e[p].firstChild||O(e[p]).append("".concat(g,"<li>\u200b</li>").concat(m));else if("LI"!=e[p].tagName){for(u-=f;0<u/C.opts.indentMargin;)g+="</".concat(t,">"),m+=m,u-=C.opts.indentMargin;var h=function h(e){for(var t=1<arguments.length&&arguments[1]!==undefined?arguments[1]:"next",n="next"===t?e.nextSibling:e.previousSibling;n;){if(n.nodeType!==Node.ELEMENT_NODE||"SPAN"!==n.tagName||!n.classList.contains("fr-marker"))return!0;n="next"===t?n.nextSibling:n.previousSibling}return!1},N=O(e[p]),v=N.find("strong");if(d&&e[p].tagName.toLowerCase()==d){var y=C.node.attributes(e[p]);if(0<v.length&&C.node.blockParent(v[0])===N[0]){for(var L=v[0].previousSibling,b=v[0].nextSibling,S=!L&&!b,E=Array.from(N[0].childNodes).every(function(e){return e.nodeType===Node.ELEMENT_NODE&&("STRONG"===e.tagName||"BR"===e.tagName)||e.nodeType===Node.TEXT_NODE&&!e.nodeValue.trim()}),T=v.parent();T.is("u")||T.is("em");)T=T.parent();var E=S&&!T.is("span")||b&&"BR"===b.tagName&&!b.nextSibling||E,S=S&&T.is("span")&&!h(T[0],"next")&&!h(T[0],"prev"),w=L&&!h(v[0],"prev"),I=b&&!h(v[0],"next");(E||S||w&&I||w&&!b||I&&!L)&&(y.includes("style=")?y=y.replace(/style="([^"]*)"/,function(e,t){var n;return t.includes("font-weight:")?(n=t.replace(/font-weight:\s*[^;]+/,"font-weight: bold"),'style="'.concat(n,'"')):(n=t.trim().endsWith(";")?" ":"; ",'style="'.concat(t).concat(n,'font-weight: bold;"'))}):y+=' style="font-weight: bold;"',v.each(function(){this.replaceWith.apply(this,k(this.childNodes))}))}N.replaceWith("".concat(g,"<li").concat(y,">").concat(N[0].innerHTML,"</li>").concat(m))}else"STRONG"!==N.parent()[0].tagName||h(N[0],"next")||h(N[0],"prev")?1!=v.length||h(v[0],"next")||h(v[0],"prev")?N.wrap("".concat(g,"<li></li>").concat(m)):(v[0].outerHTML=v[0].innerHTML,N.wrap("".concat(g,'<li style="font-weight: bold;"></li>').concat(m))):(N.unwrap(),N.wrap("".concat(g,'<li style="font-weight: bold;"></li>').concat(m)))}}C.clean.lists()}function L(c){for(var e,t=[],d=c.length-1;0<=d;d--)for(e=d-1;0<=e;e--){if(O(c[e]).find(c[d]).length||c[e]==c[d]){O(c[d]).addClass("fr-removed-block-".concat(d)),t.push(d),c.splice(d,1);break}if(O(c[e]).contains(c[d])){O(c[e]).addClass("fr-removed-block-".concat(e)),t.push(e),c.splice(e,1);break}}var f=[],p=!1,u=function u(){var e,t,n,r,a,o=O(c[d]),i=c[d].parentNode,l=o.attr("class"),s=o.attr("style");o.is(":first-child")&&(p=!0,O(i.parentNode).removeAttr("start")),o.before(m(i.tagName)),"LI"==i.parentNode.tagName?(o.is(":last-child")&&(e=o.find("> ul, > ol").last()).length&&e.wrap("<".concat(i.tagName,">")),o.before(m("LI")),o.after(g("LI"))):"OL"==i.parentNode.tagName?p||(o.before(m("OL")),o.after(g("OL"))):"UL"==i.parentNode.tagName?p||(o.before(m("UL")),o.after(g("UL"))):(e="",n=t=!1,s&&(e+=s.trim().replace(/;?$/,";")),s="rtl"===C.opts.direction||"rtl"===o.css("direction")?"margin-right":"margin-left",(a=C.helpers.getPX(O(i).css(s)))&&(O(i).attr("style")||"").includes("".concat(s,":"))&&(e+="".concat(s,":").concat(a,"px;")),e=(e=(e=e.replace(/font-weight\s*:\s*bold\s*;?/i,function(){return t=!0,""})).replace(/font-style\s*:\s*italic\s*;?/i,function(){return n=!0,""})).trim().length?e.trim().replace(/;{2,}/g,";").replace(/;$/,"")+";":"",r=function r(e,t,n){e.prepend(g(n)),e.append(m(n)),t.each(function(){var e=O(this);e.before(m(n)),e.prepend(g(n)),e.append(m(n)),e.after(g(n))})},s=o.find(C.html.blockTagsQuery()),t&&r(o,s,"STRONG"),n&&r(o,s,"EM"),C.html.defaultTag()&&0===o.find(C.html.blockTagsQuery()).length&&((a=O(document.createElement(C.html.defaultTag()))).attr(e?{style:e}:null),l&&a.addClass(l),a.append(o.contents()),o[0].innerHTML=a[0].outerHTML),C.node.isEmpty(o.get(0),!0)||0!==o.find(C.html.blockTagsQuery()).length||("DIV"==i.parentNode.tagName&&C.html.defaultTag()?(o.prepend(g(C.html.defaultTag())),o.append(m(C.html.defaultTag()))):o.append("<br>")),o.append(g("LI")),o.prepend(m("LI"))),o.after(g(i.tagName)),"LI"==i.parentNode.tagName&&(i=i.parentNode.parentNode),f.indexOf(i)<0&&f.push(i)};for(d=0;d<c.length;d++)u();var r=function r(){var e=O(f[d]),t=e.html(),n=C.helpers.getPX(e.css("margin-left"))||0;t=(t=t.replace(/<span class="fr-open-([a-z]*)"><\/span>/g,function(e,t){return 0<n?"<".concat(t,' style="margin-left:').concat(n,'px;">'):"<".concat(t,">")})).replace(/<span class="fr-close-([a-z]*)"><\/span>/g,"</$1>"),e.replaceWith(C.node.openTagString(e.get(0))+t+C.node.closeTagString(e.get(0)))};for(d=0;d<f.length;d++)r();return C.$el.find("li").filter(function(){if(0<this.children.length)return!1;var e,t=function(e,t){var n,r,a,o,i="undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(i)return a=!(r=!0),{s:function(){i=i.call(e)},n:function(){var e=i.next();return r=e.done,e},e:function(e){a=!0,n=e},f:function(){try{r||null==i["return"]||i["return"]()}finally{if(a)throw n}}};if(Array.isArray(e)||(i=l(e))||t)return i&&(e=i),o=0,{s:t=function(){},n:function(){return o>=e.length?{done:!0}:{done:!1,value:e[o++]}},e:function(e){throw e},f:t};throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}(this.childNodes);try{for(t.s();!(e=t.n()).done;){var n=e.value;if(n.nodeType===Node.TEXT_NODE&&""!==n.textContent.trim())return!1}}catch(r){t.e(r)}finally{t.f()}return!0}).remove(),C.$el.find("ul:empty, ol:empty").remove(),C.$el.find("strong:empty, em:empty").remove(),C.clean.lists(),C.$el.find("ul:empty, ol:empty").remove(),C.html.wrap(),t}function b(e,t){var n=O(document.createElement("li"));if(e.childNodes.length)for(var r=e.childNodes[0].attributes,a=0;a<r.length;a++){var o=r[a];"style"===o.name&&(n[0].style.cssText+=o.value)}O(e).prepend(n),O(e).removeAttr("start");for(var i=C.node.contents(t)[0];i&&!C.node.isList(i);){var l=i.nextSibling;n.append(i),i=l}}function e(e){if("indent"==e||"outdent"==e){var t=!1,n=C.selection.blocks(!1,!0),r=[],a=n[0].previousSibling||n[0].parentElement;if("outdent"==e){if("UL"!=n[0].parentNode.tagName&&"UL"!=a.parentNode.tagName&&"OL"!=a.parentNode.tagName&&"LI"!=a.parentNode.tagName)return;if(!n[0].previousSibling&&"none"==a.parentNode.style.listStyleType){var o=a;for(C.selection.save();0<o.childNodes.length;)o.parentNode.parentNode.append(o.childNodes[0]);return C.clean.lists(),void C.selection.restore()}}else{if("UL"!=n[0].parentElement.tagName&&"OL"!=n[0].parentElement.tagName&&"LI"!=n[0].parentElement.tagName)return;if(C.node.isBlock(n[0])&&"LI"!==n[0].tagName&&0<O(n[0]).parentsUntil(C.$el,"LI").length&&(n[0]=n[0].parentElement,a=n[0].parentElement),!n[0].previousSibling||"LI"!=n[0].previousSibling.tagName){if(a&&["UL","OL"].includes(a.tagName)){var i=a,l=(C.selection.save(),"OL"==i.tagName?document.createElement("ol"):document.createElement("ul"));for(O(l).css("list-style-type",O(i).css("list-style-type"));0<i.childNodes.length;)l.append(i.childNodes[0]);a=O(document.createElement("li"));return a.css("list-style-type","none"),a.append(l),i.append(a.get(0)),C.clean.lists(),void C.selection.restore()}t=!0}}for(var s=0;s<n.length;s++)"LI"==n[s].tagName?(t=!0,r.push(n[s])):"LI"==n[s].parentNode.tagName&&r.indexOf(n[s].parentNode)<0&&(t=!0,r.push(n[s].parentNode));if(t){if("indent"==e){var c=r;C.selection.save();for(var d=!1,f=0;f<c.length;f++){var p,u,g,m=c[f].previousElementSibling;m&&"LI"==m.tagName&&!d?(p=O(c[f]).find("> ul, > ol").last().get(0))?(b(p,c[f]),O(m).append(O(p)),O(c[f]).remove()):((p=O(m).find("> ul, > ol").last().get(0))?O(p):(p=O("<".concat(c[f].parentNode.tagName,">")),O(m).append(p),p)).append(O(c[f])):!m||"OL"!=m.tagName&&"UL"!=m.tagName?(d=!0,"UL"!=(p=c[f].parentNode).tagName&&"OL"!=p.tagName||(g=O(c[f]).find("> ol, > ul"),u=null==c[f].previousSibling,g.length?(b(g=g.first().get(0),c[f]),u?O(p).prepend(O(g)):O(p).append(O(g)),O(c[f]).remove()):O(c[f]).wrap("<".concat(p.tagName,">")),u&&0<O(p).find("> li").length&&O(p).attr("start","2"))):(g=O(c[f]).find("> ol, > ul").first().get(0))?(b(g,c[f]),O(m).append(O(g).children()),O(c[f]).remove(),O(g).remove()):O(m).append(O(c[f]))}C.clean.lists()}else{var h,N=r;C.selection.save();do{h=L(N),N=[];for(var v=0;v<h.length;v++){var y=C.$el.find(".fr-removed-block-".concat(h[v])).first().get(0);O(y).removeClass("fr-removed-block-".concat(h[v])),""==O(y).attr("class")&&O(y).removeAttr("class"),N.push(y)}}while(0<h.length)}C.selection.restore()}}}return{_init:function(){C.events.on("commands.after",e),C.events.on("keydown",function(e){if(e.which==o.KEYCODE.TAB||(e.ctrlKey||e.metaKey)&&"]"===e.key){if(!e.shiftKey&&C.$tb.find('[data-cmd="indent"]').hasClass("fr-disabled"))return e.preventDefault(),e.stopPropagation(),!1;for(var t=C.selection.blocks(),n=[],r=0;r<t.length;r++)"LI"==t[r].tagName?n.push(t[r]):"LI"==t[r].parentNode.tagName&&n.push(t[r].parentNode);return 1<=n.length||n.length&&(C.selection.info(n[0]).atStart||C.node.isEmpty(n[0]))?(e.preventDefault(),e.stopPropagation(),e.shiftKey?C.commands.outdent():C.commands.indent(),!1):void 0}},!0),C.events.on("keydown",function(e){if(e.which==o.KEYCODE.ENTER&&!e.ctrlKey&&!e.metaKey){e=C.markers.insert();if(!e)return!0;var t=e.parentNode,n="STRONG"===t.tagName,r=t.parentNode,a="LI"===r.tagName;!n||!a||t.previousSibling||t.nextSibling&&(t.nextSibling,"BR"!==t.nextSibling.tagName||t.nextSibling.nextSibling)||(t.outerHTML=t.innerHTML,O(r).css("font-weight","bold")),O(e).remove()}})},format:function(e,t){var n,r=C.selection.blocks(!0),a=1<r.length&&r[r.length-1],o=C.selection.ranges();for(a&&a.firstChild&&o.length&&C.node.isEmpty(a)&&!o[0].endOffset&&o[0].setEndAfter(a.firstChild,1),C.html.syncInputs(),C.selection.save(),C.browser.safari&&C.helpers.getSafariVersion()<17&&(a=C.selection.ranges(),o)&&o[0].endContainer&&a&&a[0].endContainer&&!o[0].endContainer.isSameNode(a[0].endContainer)&&o[0].endContainer.previousSibling&&o[0].endContainer.previousSibling.isSameNode(a[0].endContainer)&&(a=O(a[0].endContainer).find('.fr-marker[data-type="false"]'),O(o[0].endContainer).append(a[0])),C.html.wrap(!0,!0,!0,!0),C.selection.restore(),r=C.selection.blocks(!0),n=0;n<r.length;n++)"LI"!=r[n].tagName&&"LI"==r[n].parentNode.tagName&&(r[n]=r[n].parentNode);if(C.selection.save(),!function(e,t){for(var n=!0,r=0;r<e.length;r++){if("LI"!=e[r].tagName)return;e[r].parentNode.tagName!=t&&(n=!1)}return n}(r=r.filter(function(e){return!O(e).closest(".fr-code-snippet").length}),e)?i(r,e):t||L(r),C.html.unwrap(),C.selection.restore(),t=t||"default"){for(r=C.selection.blocks(),n=0;n<r.length;n++)"LI"!=r[n].tagName&&"LI"==r[n].parentNode.tagName&&(r[n]=r[n].parentNode);for(n=0;n<r.length;n++)"LI"==r[n].tagName&&(O(r[n].parentNode).css("list-style-type","default"===t?"":t),0===(O(r[n].parentNode).attr("style")||"").length)&&O(r[n].parentNode).removeAttr("style")}},refresh:function(e,t){var n,r=O(C.selection.element());r.get(0)!=C.el&&(n=("LI"==(n=r.get(0)).tagName||!n.firstElementChild||"LI"==n.firstElementChild.tagName)&&("LI"==n.tagName||n.firstElementChild)?n.firstElementChild&&"LI"==n.firstElementChild.tagName?r.get(0).firstChild:r.get(0):r.parents("li").get(0))&&n.parentNode.tagName==t&&C.el.contains(n.parentNode)&&e.addClass("fr-active")}}},o.DefineIcon("formatOLSimple",{NAME:"list-ol",SVG_KEY:"orderedList"}),o.RegisterCommand("formatOLSimple",{title:"Ordered List",type:"button",options:{"default":"Default",circle:"Circle",disc:"Disc",square:"Square"},refresh:function(e){this.lists.refresh(e,"OL")},callback:function(e,t){this.lists.format("OL",t)},plugin:"lists"}),o.RegisterCommand("formatUL",{title:"Unordered List",type:"button",hasOptions:function(){return this.opts.listAdvancedTypes},options:{"default":"Default",circle:"Circle",disc:"Disc",square:"Square"},refresh:function(e){this.lists.refresh(e,"UL")},callback:function(e,t){this.lists.format("UL",t)},plugin:"lists"}),o.RegisterCommand("formatOL",{title:"Ordered List",hasOptions:function(){return this.opts.listAdvancedTypes},options:{"default":"Default","lower-alpha":"Lower Alpha","lower-greek":"Lower Greek","lower-roman":"Lower Roman","upper-alpha":"Upper Alpha","upper-roman":"Upper Roman"},refresh:function(e){this.lists.refresh(e,"OL")},callback:function(e,t){this.lists.format("OL",t)},plugin:"lists"}),o.DefineIcon("formatUL",{NAME:"list-ul",SVG_KEY:"unorderedList"}),o.DefineIcon("formatOL",{NAME:"list-ol",SVG_KEY:"orderedList"})});