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) • 6.92 kB
JavaScript
/*!
* froala_editor v5.1.0 (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(b){"use strict";Object.assign(b.DEFAULTS,{lineBreakerTags:["table","hr","form","dl","span.fr-video",".fr-embedly","img"],lineBreakerOffset:15,lineBreakerHorizontalOffset:10}),b.PLUGINS.lineBreaker=function(s){var l,t,f,p=s.$;function c(e,t){var n,a;if(null==e)o=(r=t.parent()).offset().top,n=(n=t.offset().top)-Math.min((n-o)/2,s.opts.lineBreakerOffset);else if(null==t)(o=(r=e.parent()).offset().top+r.outerHeight())<(i=e.offset().top+e.outerHeight())&&(o=(r=p(r).parent()).offset().top+r.outerHeight()),n=i+Math.min(Math.abs(o-i)/2,s.opts.lineBreakerOffset);else{var r=e.parent(),o=e.offset().top+e.height(),i=t.offset().top;if(i<o)return;n=(o+i)/2}o=r.outerWidth(),i=r.offset().left,s.opts.iframe&&(r=s.helpers.getPX(s.$wp.find(".fr-iframe").css("padding-top")),a=s.helpers.getPX(s.$wp.find(".fr-iframe").css("padding-left")),i+=s.$iframe.offset().left-s.helpers.scrollLeft()+a,n+=s.$iframe.offset().top-s.helpers.scrollTop()+r),s.$box.append(l),l.css("top",n-s.win.pageYOffset),l.css("left",i-s.win.pageXOffset),l.css("width",o),l.data("tag1",e),l.data("tag2",t),l.addClass("fr-visible").data("instance",s)}function g(e){if(e){var t=p(e);if(0===s.$el.find(t).length)return null;if(e.nodeType!=Node.TEXT_NODE&&t.is(s.opts.lineBreakerTags.join(",")))return t;if(0<t.parents(s.opts.lineBreakerTags.join(",")).length)return e=t.parents(s.opts.lineBreakerTags.join(",")).get(0),0!==s.$el.find(p(e)).length&&p(e).is(s.opts.lineBreakerTags.join(","))?p(e):null}return null}function o(e,t){e=s.doc.elementFromPoint(e,t);return e&&!p(e).closest(".fr-line-breaker").length&&!s.node.isElement(e)&&e!=s.$wp.get(0)&&function(e){if("undefined"!=typeof e.inFroalaWrapper)return e.inFroalaWrapper;for(var t=e;e.parentNode&&e.parentNode!==s.$wp.get(0);)e=e.parentNode;return t.inFroalaWrapper=e.parentNode==s.$wp.get(0),t.inFroalaWrapper}(e)?e:null}function u(e,t,n){for(var a=n,r=null;a<=s.opts.lineBreakerOffset&&!r;)r=(r=o(e,t-a))||o(e,t+a),a+=n;return r}function d(e,t,n){for(var a=null,r=100;!a&&e>s.$box.offset().left&&e<s.$box.offset().left+s.$box.outerWidth()&&0<r;)a=(a=o(e,t))||u(e,t,5),"left"==n?e-=s.opts.lineBreakerHorizontalOffset:e+=s.opts.lineBreakerHorizontalOffset,r-=s.opts.lineBreakerHorizontalOffset;return a}function n(e){var t=f=null,n=s.doc.elementFromPoint(e.pageX-s.win.pageXOffset,e.pageY-s.win.pageYOffset);if(t=n&&("HTML"==n.tagName||"BODY"==n.tagName||s.node.isElement(n)||0<=(n.getAttribute("class")||"").indexOf("fr-line-breaker"))?g(u(e.pageX-s.win.pageXOffset,e.pageY-s.win.pageYOffset,1)||d(e.pageX-s.win.pageXOffset-s.opts.lineBreakerHorizontalOffset,e.pageY-s.win.pageYOffset,"left")||d(e.pageX-s.win.pageXOffset+s.opts.lineBreakerHorizontalOffset,e.pageY-s.win.pageYOffset,"right")):g(n)){var a,n=t,t=e.pageY,e=n.offset().top,r=n.offset().top+n.outerHeight();if(Math.abs(r-t)<=s.opts.lineBreakerOffset||Math.abs(t-e)<=s.opts.lineBreakerOffset)if(Math.abs(r-t)<Math.abs(t-e)){var o,i=null;for((o=n.get(0)).nextSibling&&(i=o.nextSibling.offsetParent?o.nextSibling:null);i&&i.nodeType==Node.TEXT_NODE&&0===i.textContent.length;)i=i.nextSibling;if(!i)return void c(n,null);if(a=g(i))return void c(n,a)}else{if(!(o=n.get(0)).previousSibling)return void c(null,n);if(a=g(o.previousSibling))return void c(a,n)}l.removeClass("fr-visible").removeData("instance")}else s.core.sameInstance(l)&&l.removeClass("fr-visible").removeData("instance")}function e(e){return!(l.hasClass("fr-visible")&&!s.core.sameInstance(l))&&(s.popups.areVisible()||s.el.querySelector(".fr-selected-cell")?(l.removeClass("fr-visible"),!0):void(!1!==t||s.edit.isDisabled()||(f&&clearTimeout(f),f=setTimeout(n,30,e))))}function a(){f&&clearTimeout(f),l&&l.hasClass("fr-visible")&&l.removeClass("fr-visible").removeData("instance")}var r=function r(){t=!0,a()},i=function i(){t=!1};function m(e){e.preventDefault();var t,n,a,e=l.data("instance")||s,r=(l.removeClass("fr-visible").removeData("instance"),l.data("tag1")),o=l.data("tag2"),i=s.html.defaultTag();null==r?s.opts.keepTextFormatOnTable&&o.children().get(0)!=undefined&&"TBODY"==o.children().get(0).tagName?(n=null!=(a=null!=(t=o.find("span"))[t.length-1]?t[t.length-1].getAttribute("style"):null)?"<"+t[t.length-1].nodeName.toLowerCase()+' style="'+a+'">':"<"+o.parent().get(0).nodeName.toLowerCase()+">",a=null!=a?"</"+t[t.length-1].nodeName.toLowerCase()+">":"</"+o.parent().get(0).nodeName.toLowerCase()+">",i?o.before("<".concat(i,">").concat(n).concat(b.MARKERS,"<br>").concat(a,"</").concat(i,">")):o.before("".concat(n).concat(b.MARKERS,"<br>").concat(a))):i&&"TD"!=o.parent().get(0).tagName&&0===o.parents(i).length?o.before("<".concat(i,">").concat(b.MARKERS,"<br></").concat(i,">")):o.before("".concat(b.MARKERS,"<br>")):s.opts.keepTextFormatOnTable&&r.children().get(0)!=undefined&&"TBODY"==r.children().get(0).tagName?(a=null!=(n=null!=(t=r.find("span"))[t.length-1]?t[t.length-1].getAttribute("style"):null)?"<"+t[t.length-1].nodeName.toLowerCase()+' style="'+n+'">':"<"+r.parent().get(0).nodeName.toLowerCase()+">",o=null!=n?"</"+t[t.length-1].nodeName.toLowerCase()+">":"</"+r.parent().get(0).nodeName.toLowerCase()+">",i?r.after("<".concat(i,">").concat(a).concat(b.MARKERS,"<br>").concat(o,"</").concat(i,">")):r.after("".concat(a).concat(b.MARKERS,"<br>").concat(o))):i&&"TD"!=r.parent().get(0).tagName&&0===r.parents(i).length?r.after("<".concat(i,">").concat(b.MARKERS,"<br></").concat(i,">")):r.after("".concat(b.MARKERS,"<br>")),e.selection.restore(),s.undo.saveStep(),s.toolbar.enable()}return{_init:function(){if(!s.$wp)return!1;s.shared.$line_breaker||(s.shared.$line_breaker=p(document.createElement("div")).attr("class","fr-line-breaker").html('<a class="fr-floating-btn" role="button" tabIndex="-1" title="'.concat(s.language.translate("Break"),'"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><rect x="17" y="7" width="2" height="8"/><rect x="10" y="13" width="7" height="2"/><path d="M10.000,10.000 L10.000,18.013 L5.000,14.031 L10.000,10.000 Z"/></svg></a>'))),l=s.shared.$line_breaker,s.events.on("shared.destroy",function(){l.html("").removeData().remove(),l=null},!0),s.events.on("destroy",function(){l.removeData("instance").removeClass("fr-visible"),p("body").first().append(l),clearTimeout(f)},!0),s.events.$on(l,"mousemove",function(e){e.stopPropagation()},!0),s.events.bindClick(l,"a",m),t=!1,s.events.$on(s.$win,"mousemove",e),s.events.$on(p(s.win),"scroll",a),s.events.on("popups.show.table.edit",a),s.events.on("commands.after",a),s.events.$on(p(s.win),"mousedown",r),s.events.$on(p(s.win),"mouseup",i)}}}});