froala-editor
Version:
A beautiful Javascript WYSIWYG HTML rich text editor. High performance and modern design make it easy to use for developers and loved by users.
7 lines (6 loc) • 5.21 kB
JavaScript
/*!
* froala_editor v2.8.3 (https://www.froala.com/wysiwyg-editor)
* License https://froala.com/wysiwyg-editor/terms/
* Copyright 2014-2018 Froala Labs
*/
!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(require("jquery")):"function"==typeof define&&define.amd?define(["jquery"],t):t(e.jQuery)}(this,function(e){"use strict";var s=(e=e&&e.hasOwnProperty("default")?e["default"]:e).FE;s.PLUGINS.lists=function(g){var d=g.$;function c(e){return'<span class="fr-open-'+e.toLowerCase()+'"></span>'}function m(e){return'<span class="fr-close-'+e.toLowerCase()+'"></span>'}function a(e,t){!function(e,t){for(var n=[],a=0;a<e.length;a++){var r=e[a].parentNode;"LI"==e[a].tagName&&r.tagName!=t&&n.indexOf(r)<0&&n.push(r)}for(a=n.length-1;0<=a;a--){var i=d(n[a]);i.replaceWith("<"+t.toLowerCase()+" "+g.node.attributes(i.get(0))+">"+i.html()+"</"+t.toLowerCase()+">")}}(e,t);var n,a=g.html.defaultTag(),r=null;e.length&&(n="rtl"==g.opts.direction||"rtl"==d(e[0]).css("direction")?"margin-right":"margin-left");for(var i=0;i<e.length;i++)if("LI"!=e[i].tagName){var l=g.helpers.getPX(d(e[i]).css(n))||0;(e[i].style.marginLeft=null)===r&&(r=l);var s=0<r?"<"+t+' style="'+n+": "+r+'px;">':"<"+t+">",o="</"+t+">";for(l-=r;0<l/g.opts.indentMargin;)s+="<"+t+">",o+=o,l-=g.opts.indentMargin;a&&e[i].tagName.toLowerCase()==a?d(e[i]).replaceWith(s+"<li"+g.node.attributes(e[i])+">"+d(e[i]).html()+"</li>"+o):e[i].outerHTML=s+"<li>"+e[i].outerHTML+"</li>"+o}g.clean.lists()}function r(e){var t,n;for(t=e.length-1;0<=t;t--)for(n=t-1;0<=n;n--)if(d(e[n]).find(e[t]).length||e[n]==e[t]){e.splice(t,1);break}var a=[];for(t=0;t<e.length;t++){var r=d(e[t]),i=e[t].parentNode,l=r.attr("class");if(r.before(m(i.tagName)),"LI"==i.parentNode.tagName)r.before(m("LI")),r.after(c("LI"));else{var s="";l&&(s+=' class="'+l+'"');var o="rtl"==g.opts.direction||"rtl"==r.css("direction")?"margin-right":"margin-left";g.helpers.getPX(d(i).css(o))&&0<=(d(i).attr("style")||"").indexOf(o+":")&&(s+=' style="'+o+":"+g.helpers.getPX(d(i).css(o))+'px;"'),g.html.defaultTag()&&0===r.find(g.html.blockTagsQuery()).length&&r.html("<"+g.html.defaultTag()+s+">"+r.html()+"</"+g.html.defaultTag()+">"),g.node.isEmpty(r.get(0),!0)||0!==r.find(g.html.blockTagsQuery()).length||r.append("<br>"),r.append(c("LI")),r.prepend(m("LI"))}r.after(c(i.tagName)),"LI"==i.parentNode.tagName&&(i=i.parentNode.parentNode),a.indexOf(i)<0&&a.push(i)}for(t=0;t<a.length;t++){var f=d(a[t]),p=f.html();p=(p=p.replace(/<span class="fr-close-([a-z]*)"><\/span>/g,"</$1>")).replace(/<span class="fr-open-([a-z]*)"><\/span>/g,"<$1>"),f.replaceWith(g.node.openTagString(f.get(0))+p+g.node.closeTagString(f.get(0)))}g.$el.find("li:empty").remove(),g.$el.find("ul:empty, ol:empty").remove(),g.clean.lists(),g.html.wrap()}function i(e){g.selection.save();for(var t=0;t<e.length;t++){var n=e[t].previousSibling;if(n){var a=d(e[t]).find("> ul, > ol").last().get(0);if(a){var r=d("<li>");d(a).prepend(r);for(var i=g.node.contents(e[t])[0];i&&!g.node.isList(i);){var l=i.nextSibling;r.append(i),i=l}d(n).append(d(a)),d(e[t]).remove()}else{var s=d(n).find("> ul, > ol").last().get(0);if(s)d(s).append(d(e[t]));else{var o=d("<"+e[t].parentNode.tagName+">");d(n).append(o),o.append(d(e[t]))}}}}g.clean.lists(),g.selection.restore()}function l(e){g.selection.save(),r(e),g.selection.restore()}function e(e){if("indent"==e||"outdent"==e){for(var t=!1,n=g.selection.blocks(),a=[],r=0;r<n.length;r++)"LI"==n[r].tagName?(t=!0,a.push(n[r])):"LI"==n[r].parentNode.tagName&&(t=!0,a.push(n[r].parentNode));t&&("indent"==e?i(a):l(a))}}return{_init:function(){g.events.on("commands.after",e),g.events.on("keydown",function(e){if(e.which==s.KEYCODE.TAB){for(var t=g.selection.blocks(),n=[],a=0;a<t.length;a++)"LI"==t[a].tagName?n.push(t[a]):"LI"==t[a].parentNode.tagName&&n.push(t[a].parentNode);if(1<n.length||n.length&&(g.selection.info(n[0]).atStart||g.node.isEmpty(n[0])))return e.preventDefault(),e.stopPropagation(),e.shiftKey?l(n):i(n),!1}},!0)},format:function(e){g.selection.save(),g.html.wrap(!0,!0,!0,!0),g.selection.restore();for(var t=g.selection.blocks(),n=0;n<t.length;n++)"LI"!=t[n].tagName&&"LI"==t[n].parentNode.tagName&&(t[n]=t[n].parentNode);g.selection.save(),function(e,t){for(var n=!0,a=0;a<e.length;a++){if("LI"!=e[a].tagName)return!1;e[a].parentNode.tagName!=t&&(n=!1)}return n}(t,e)?r(t):a(t,e),g.html.unwrap(),g.selection.restore()},refresh:function(e,t){var n=d(g.selection.element());if(n.get(0)!=g.el){var a=n.get(0);(a="LI"!=a.tagName&&a.firstElementChild&&"LI"!=a.firstElementChild.tagName?n.parents("li").get(0):"LI"==a.tagName||a.firstElementChild?a.firstElementChild&&"LI"==a.firstElementChild.tagName?n.get(0).firstChild:n.get(0):n.parents("li").get(0))&&a.parentNode.tagName==t&&g.el.contains(a.parentNode)&&e.addClass("fr-active")}}}},s.RegisterCommand("formatUL",{title:"Unordered List",refresh:function(e){this.lists.refresh(e,"UL")},callback:function(){this.lists.format("UL")},plugin:"lists"}),s.RegisterCommand("formatOL",{title:"Ordered List",refresh:function(e){this.lists.refresh(e,"OL")},callback:function(){this.lists.format("OL")},plugin:"lists"}),s.DefineIcon("formatUL",{NAME:"list-ul"}),s.DefineIcon("formatOL",{NAME:"list-ol"})});