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) • 10.4 kB
JavaScript
/*!
* froala_editor v4.5.2 (https://www.froala.com/wysiwyg-editor)
* License https://froala.com/wysiwyg-editor/terms/
* Copyright 2014-2025 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(e.FroalaEditor)}(this,function(o){"use strict";o=o&&o.hasOwnProperty("default")?o["default"]:o,Object.assign(o.DEFAULTS,{listAdvancedTypes:!0}),o.PLUGINS.lists=function(m){var g=m.$;function u(e){return'<span class="fr-open-'.concat(e.toLowerCase(),'"></span>')}function h(e){return'<span class="fr-close-'.concat(e.toLowerCase(),'"></span>')}function c(e,t){!function c(e,t){for(var a=[],n=0;n<e.length;n++){var r=e[n].parentNode;"LI"==e[n].tagName&&r.tagName!=t&&a.indexOf(r)<0&&a.push(r)}for(var o=a.length-1;0<=o;o--){var l=g(a[o]);l.replaceWith("<".concat(t.toLowerCase()," ").concat(m.node.attributes(l.get(0)),">").concat(l.html(),"</").concat(t.toLowerCase(),">"))}}(e,t);var a,n=m.html.defaultTag(),r=null;e.length&&(a="rtl"==m.opts.direction||"rtl"==g(e[0]).css("direction")?"margin-right":"margin-left");for(var o=0;o<e.length;o++)if("TD"!=e[o].tagName&&"TH"!=e[o].tagName&&"LI"!=e[o].tagName){var l=m.helpers.getPX(g(e[o]).css(a))||0;(e[o].style.marginLeft=null)===r&&(r=l);var i=0<r?"<".concat(t,' style="').concat(a,": ").concat(r,'px ">'):"<".concat(t,">"),s="</".concat(t,">");for(l-=r;0<l/m.opts.indentMargin;)i+="</".concat(t,">"),s+=s,l-=m.opts.indentMargin;n&&e[o].tagName.toLowerCase()==n?g(e[o]).replaceWith("".concat(i,"<li").concat(m.node.attributes(e[o]),">").concat(g(e[o]).html(),"</li>").concat(s)):g(e[o]).wrap("".concat(i,"<li></li>").concat(s))}m.clean.lists()}function d(e){var n,t,a=[];for(n=e.length-1;0<=n;n--)for(t=n-1;0<=t;t--){if(g(e[t]).find(e[n]).length||e[t]==e[n]){g(e[n]).addClass("fr-removed-block-".concat(n)),a.push(n),e.splice(n,1);break}if(g(e[t]).contains(e[n])){g(e[t]).addClass("fr-removed-block-".concat(t)),a.push(t),e.splice(t,1);break}}var r=[],o=!1;for(n=0;n<e.length;n++){var l=g(e[n]),i=e[n].parentNode,s=l.attr("class");if(l.is(":first-child")&&(o=!0,g(i.parentNode).removeAttr("start")),l.before(h(i.tagName)),"LI"==i.parentNode.tagName){if(l.is(":last-child")){var c=l.find("> ul, > ol").last();c.length&&c.wrap("<".concat(i.tagName,">"))}l.before(h("LI")),l.after(u("LI"))}else if("OL"==i.parentNode.tagName)o||(l.before(h("OL")),l.after(u("OL")));else if("UL"==i.parentNode.tagName)o||(l.before(h("UL")),l.after(u("UL")));else{var d="";s&&(d+=' class="'.concat(s,'"'));var p="rtl"==m.opts.direction||"rtl"==l.css("direction")?"margin-right":"margin-left";m.helpers.getPX(g(i).css(p))&&0<=(g(i).attr("style")||"").indexOf("".concat(p,":"))&&(d+=' style="'.concat(p,":").concat(m.helpers.getPX(g(i).css(p)),'px;"')),m.html.defaultTag()&&0===l.find(m.html.blockTagsQuery()).length&&l.wrapInner("<".concat(m.html.defaultTag()).concat(d,"></").concat(m.html.defaultTag(),">")),m.node.isEmpty(l.get(0),!0)||0!==l.find(m.html.blockTagsQuery()).length||("DIV"==i.parentNode.tagName&&m.html.defaultTag()?(l.prepend(u(m.html.defaultTag())),l.append(h(m.html.defaultTag()))):l.append("<br>")),l.append(u("LI")),l.prepend(h("LI"))}l.after(u(i.tagName)),"LI"==i.parentNode.tagName&&(i=i.parentNode.parentNode),r.indexOf(i)<0&&r.push(i)}var f=function f(){var e=g(r[n]),t=e.html(),a=m.helpers.getPX(e.css("margin-left"))||0;t=(t=t.replace(/<span class="fr-open-([a-z]*)"><\/span>/g,function(e,t){return 0<a?"<".concat(t,' style="margin-left:').concat(a,'px;">'):"<".concat(t,">")})).replace(/<span class="fr-close-([a-z]*)"><\/span>/g,"</$1>"),e.replaceWith(m.node.openTagString(e.get(0))+t+m.node.closeTagString(e.get(0)))};for(n=0;n<r.length;n++)f();return m.$el.find("li:empty").remove(),m.$el.find("ul:empty, ol:empty").remove(),m.clean.lists(),m.$el.find("ul:empty, ol:empty").remove(),m.html.wrap(),a}function N(e,t){var a=g(document.createElement("li"));if(e.childNodes.length)for(var n=e.childNodes[0].attributes,r=0;r<n.length;r++){var o=n[r];"style"===o.name&&(a[0].style.cssText+=o.value)}g(e).prepend(a),g(e).removeAttr("start");for(var l=m.node.contents(t)[0];l&&!m.node.isList(l);){var i=l.nextSibling;a.append(l),l=i}}function e(e){if("indent"==e||"outdent"==e){var t=!1,a=m.selection.blocks(!1,!0),n=[],r=a[0].previousSibling||a[0].parentElement;if("outdent"==e){if("UL"!=a[0].parentNode.tagName&&"UL"!=r.parentNode.tagName&&"OL"!=r.parentNode.tagName&&"LI"!=r.parentNode.tagName)return;if(!a[0].previousSibling&&"none"==r.parentNode.style.listStyleType)return void function l(e){for(m.selection.save();0<e.childNodes.length;)e.parentNode.parentNode.append(e.childNodes[0]);m.clean.lists(),m.selection.restore()}(r)}else{if("UL"!=a[0].parentElement.tagName&&"OL"!=a[0].parentElement.tagName&&"LI"!=a[0].parentElement.tagName)return;if(m.node.isBlock(a[0])&&"LI"!==a[0].tagName&&0<g(a[0]).parentsUntil(m.$el,"LI").length&&(a[0]=a[0].parentElement,r=a[0].parentElement),!a[0].previousSibling||"LI"!=a[0].previousSibling.tagName){if(r&&["UL","OL"].includes(r.tagName))return void function i(e){m.selection.save();var t="OL"==e.tagName?document.createElement("ol"):document.createElement("ul");for(g(t).css("list-style-type",g(e).css("list-style-type"));0<e.childNodes.length;)t.append(e.childNodes[0]);var a=g(document.createElement("li"));a.css("list-style-type","none"),a.append(t),e.append(a.get(0)),m.clean.lists(),m.selection.restore()}(r);t=!0}}for(var o=0;o<a.length;o++)"LI"==a[o].tagName?(t=!0,n.push(a[o])):"LI"==a[o].parentNode.tagName&&n.indexOf(a[o].parentNode)<0&&(t=!0,n.push(a[o].parentNode));t&&("indent"==e?function f(e){m.selection.save();for(var t=!1,a=0;a<e.length;a++){var n=e[a].previousSibling;if(n&&"LI"==n.tagName&&!t){var r=g(e[a]).find("> ul, > ol").last().get(0);if(r)N(r,e[a]),g(n).append(g(r)),g(e[a]).remove();else{var o=g(n).find("> ul, > ol").last().get(0);if(o)g(o).append(g(e[a]));else{var l=g("<".concat(e[a].parentNode.tagName,">"));g(n).append(l),l.append(g(e[a]))}}}else if(!n||"OL"!=n.tagName&&"UL"!=n.tagName){var i=e[a].parentNode;if(t=!0,"UL"==i.tagName||"OL"==i.tagName){var s=g(e[a]).find("> ol, > ul"),c=null==e[a].previousSibling;if(s.length){var d=s.first().get(0);N(d,e[a]),c?g(i).prepend(g(d)):g(i).append(g(d)),g(e[a]).remove()}else g(e[a]).wrap("<".concat(i.tagName,">"));c&&0<g(i).find("> li").length&&g(i).attr("start","2")}}else{var p=g(e[a]).find("> ol, > ul").first().get(0);p?(N(p,e[a]),g(n).append(g(p).children()),g(e[a]).remove(),g(p).remove()):g(n).append(g(e[a]))}}m.clean.lists(),m.selection.restore()}(n):function s(e){m.selection.save();var t=[];do{t=d(e),e=[];for(var a=0;a<t.length;a++){var n=m.$el.find(".fr-removed-block-".concat(t[a])).first().get(0);g(n).removeClass("fr-removed-block-".concat(t[a])),""==g(n).attr("class")&&g(n).removeAttr("class"),e.push(n)}}while(0<t.length);m.selection.restore()}(n))}}return{_init:function t(){m.events.on("commands.after",e),m.events.on("keydown",function(e){if(e.which==o.KEYCODE.TAB||(e.ctrlKey||e.metaKey)&&"]"===e.key){if(!e.shiftKey&&m.$tb.find('[data-cmd="indent"]').hasClass("fr-disabled"))return e.preventDefault(),e.stopPropagation(),!1;for(var t=m.selection.blocks(),a=[],n=0;n<t.length;n++)"LI"==t[n].tagName?a.push(t[n]):"LI"==t[n].parentNode.tagName&&a.push(t[n].parentNode);if(1<=a.length||a.length&&(m.selection.info(a[0]).atStart||m.node.isEmpty(a[0])))return e.preventDefault(),e.stopPropagation(),e.shiftKey?m.commands.outdent():m.commands.indent(),!1}},!0)},format:function p(e,t){var a,n,r=1<(n=m.selection.blocks(!0)).length&&n[n.length-1],o=m.selection.ranges();if(r&&o.length&&m.node.isEmpty(r)&&!o[0].endOffset&&o[0].setEndAfter(r.firstChild,1),m.html.syncInputs(),m.selection.save(),m.browser.safari&&m.helpers.getSafariVersion()<17){var l=m.selection.ranges();if(o&&o[0].endContainer&&l&&l[0].endContainer&&!o[0].endContainer.isSameNode(l[0].endContainer)&&o[0].endContainer.previousSibling&&o[0].endContainer.previousSibling.isSameNode(l[0].endContainer)){var i=g(l[0].endContainer).find('.fr-marker[data-type="false"]');g(o[0].endContainer).append(i[0])}}for(m.html.wrap(!0,!0,!0,!0),m.selection.restore(),n=m.selection.blocks(!0),a=0;a<n.length;a++)"LI"!=n[a].tagName&&"LI"==n[a].parentNode.tagName&&(n[a]=n[a].parentNode);if(m.selection.save(),function s(e,t){for(var a=!0,n=0;n<e.length;n++){if("LI"!=e[n].tagName)return!1;e[n].parentNode.tagName!=t&&(a=!1)}return a}(n,e)?t||d(n):c(n,e),m.html.unwrap(),m.selection.restore(),t=t||"default"){for(n=m.selection.blocks(),a=0;a<n.length;a++)"LI"!=n[a].tagName&&"LI"==n[a].parentNode.tagName&&(n[a]=n[a].parentNode);for(a=0;a<n.length;a++)"LI"==n[a].tagName&&(g(n[a].parentNode).css("list-style-type","default"===t?"":t),0===(g(n[a].parentNode).attr("style")||"").length&&g(n[a].parentNode).removeAttr("style"))}},refresh:function r(e,t){var a=g(m.selection.element());if(a.get(0)!=m.el){var n=a.get(0);(n="LI"!=n.tagName&&n.firstElementChild&&"LI"!=n.firstElementChild.tagName?a.parents("li").get(0):"LI"==n.tagName||n.firstElementChild?n.firstElementChild&&"LI"==n.firstElementChild.tagName?a.get(0).firstChild:a.get(0):a.parents("li").get(0))&&n.parentNode.tagName==t&&m.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"})});