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) • 8.94 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(p){"use strict";Object.assign(p.POPUP_TEMPLATES,{"embedly.insert":"[_BUTTONS_][_URL_LAYER_]","embedly.edit":"[_BUTTONS_]"}),Object.assign(p.DEFAULTS,{embedlyKey:null,embedlyInsertButtons:["embedlyBack","|"],embedlyEditButtons:["embedlyRemove"],embedlyScriptPath:"https://cdn.embedly.com/widgets/platform.js"}),p.PLUGINS.embedly=function(r){var a,s,d=r.$;function t(e){r.events.on("html.processGet",l),e&&r.html._setHtml(r.$el,r.html.get()),r.events.$on(r.$el,"click touchend","div.fr-embedly",o),r.events.on("mousedown window.mousedown",m),r.events.on("window.touchmove",u),r.events.on("mouseup window.mouseup",b),r.events.on("commands.mousedown",function(e){0<e.parents(".fr-toolbar").length&&b()}),r.events.on("blur video.hideResizer commands.undo commands.redo element.dropped",function(){b(!0)}),r.events.on("element.beforeDrop",function(e){if(e.hasClass("fr-embedly"))return e.html(e.attr("data-original-embed")),e}),r.events.on("keydown",function(e){var t=e.which;return!a||t!=p.KEYCODE.BACKSPACE&&t!=p.KEYCODE.DELETE?a&&t==p.KEYCODE.ESC?(b(!0),e.preventDefault(),!1):a&&t!=p.KEYCODE.F10&&!r.keys.isBrowserAction(e)?(e.preventDefault(),!1):void 0:(e.preventDefault(),f(),!1)},!0),r.events.on("toolbar.esc",function(){if(a)return r.events.disableBlur(),r.events.focus(),!1},!0),r.events.on("toolbar.focusEditor",function(){if(a)return!1},!0),r.events.on("snapshot.after",function(e){var t=r.doc.createElement("div");t.innerHTML=e.html,l(t),e.html=t.innerHTML}),r.win.embedly&&(r.win.embedly("on","card.rendered",function(e){n(e)}),r.win.embedly("on","card.resize",function(e){n(e)})),i(!0)}function n(e){e=d(e);e.parents(".fr-embedly").attr("contenteditable",!1).attr("draggable",!0).addClass("fr-draggable").css("height",e.height()).addClass("fr-draggable"),r.opts.iframe&&r.size.syncIframe()}function o(e){a=d(this),s||(r.shared.$embedly_resizer?(s=r.shared.$embedly_resizer,r.shared.$embedly_overlay,r.events.on("destroy",function(){d("body").first().append(s)},!0)):(r.shared.$embedly_resizer=d(document.createElement("div")).attr("class","fr-embedly-resizer"),s=r.shared.$embedly_resizer,r.events.$on(s,"mousedown",function(e){e.stopPropagation()},!0)),r.events.on("shared.destroy",function(){s.html("").removeData().remove(),s=null},!0));(r.$wp||r.$sc).append(s),s.data("instance",r);var t=0,n=0,n=(r.opts.iframe&&(n=r.helpers.getPX(r.$wp.find(".fr-iframe").css("padding-top")),t=r.helpers.getPX(r.$wp.find(".fr-iframe").css("padding-left"))),s.css("top",(r.opts.iframe?a.offset().top+n-1+r.$iframe.position().top:a.offset().top-r.$wp.offset().top-1)+r.$wp.scrollTop()).css("left",(r.opts.iframe?a.offset().left+t-1:a.offset().left-r.$wp.offset().left-1)+r.$wp.scrollLeft()).css("width",a.outerWidth()).css("height",a.height()).addClass("fr-active"),r.popups.get("embedly.edit"));(n=n||function(){var e="";if(0<r.opts.embedlyEditButtons.length)return e={buttons:e+='<div class="fr-buttons">\n '.concat(r.button.buildList(r.opts.embedlyEditButtons),"\n </div>")},e=r.popups.create("embedly.edit",e),r.events.$on(r.$wp,"scroll.emebdly-edit",function(){var e;a&&r.popups.isVisible("embedly.edit")&&(r.events.disableBlur(),e=a,o.call(e.get(0)))}),e;return!1}())&&(r.popups.setContainer("embedly.edit",r.$sc),r.popups.refresh("embedly.edit"),n=a.offset().left+a.outerWidth()/2,t=a.offset().top+a.outerHeight(),r.popups.show("embedly.edit",n,t,a.outerHeight()))}function l(e){if(e&&r.node.hasClass(e,"fr-embedly"))e.innerHTML=e.getAttribute("data-original-embed"),e.removeAttribute("draggable"),e.removeAttribute("contenteditable"),e.setAttribute("class",(e.getAttribute("class")||"").replace("fr-draggable",""));else if(e&&e.nodeType==Node.ELEMENT_NODE)for(var t=e.querySelectorAll(".fr-embedly"),n=0;n<t.length;n++)l(t[n])}function i(e){var t;return e?(r.popups.onRefresh("embedly.insert",c),!0):(e="",0<r.opts.embedlyInsertButtons.length&&(e=(e+='<div class="fr-buttons fr-tabs">')+r.button.buildList(r.opts.embedlyInsertButtons)+"</div>"),t="",t='<div class="fr-embedly-layer fr-active fr-layer" id="fr-embedly-layer-'+r.id+'"><div class="fr-input-line"><input id="fr-embedly-layer-text-'+r.id+'" type="text" placeholder="'+r.language.translate("Paste in a URL to embed")+'" tabIndex="1" aria-required="true"></div><div class="fr-action-buttons"><button type="button" class="fr-command fr-submit" data-cmd="embedlyInsert" tabIndex="2" role="button">'+r.language.translate("Insert")+"</button></div></div>",r.popups.create("embedly.insert",{buttons:e,url_layer:t}))}function c(){r.popups.get("embedly.insert").find(".fr-embedly-layer input").val("").trigger("change")}function e(e){var t;e.length&&(e="<a href='"+e+"' data-card-branding='0' class='embedly-card'"+(r.opts.embedlyKey?" data-card-key='"+r.opts.embedlyKey+"'":"")+"></a>",r.opts.trackChangesEnabled?(r.edit.on(),r.events.focus(!0),r.selection.restore(),r.undo.saveStep(),r.markers.insert(),r.html.wrap(),t=r.$el.find(".fr-marker"),r.node.isLastSibling(t)&&t.parent().hasClass("fr-deletable")&&t.insertAfter(t.parent()),t.replaceWith('<div class="fr-embedly fr-draggable" draggable="true" contenteditable="false" data-original-embed="'+e+'">'+e+"</div>"),r.selection.clear()):r.html.insert('<div class="fr-embedly fr-draggable" draggable="true" contenteditable="false" data-original-embed="'+e+'">'+e+"</div>"),r.popups.hideAll())}function f(){var e,t,n,s;a&&!1!==r.events.trigger("embedly.beforeRemove",[a])&&(e=a,r.popups.hideAll(),b(!0),r.opts.trackChangesEnabled?(t=e.find(".embedly-card"),n="pending-".concat(r.id,"-").concat(r.track_changes.getPendingChanges().length),s=r.opts.showChangesEnabled?"fr-highlight-change":"",e.data("track-id",n),e.addClass(s),e.data("tracking","true"),e.data("tracking-deleted","true"),e.attr("contenteditable","false"),t.addClass("fr-tracking-deleted"),t.css("height","100%"),r.track_changes.pushChange(n)):(r.selection.setBefore(e.get(0))||r.selection.setAfter(e.get(0)),e.remove(),r.selection.restore(),r.html.fillEmptyBlocks(),r.undo.saveStep(),r.events.trigger("video.removed",[e])))}function b(e){a&&(r.shared.embedly_exit_flag||!0===e)&&(s.removeClass("fr-active"),r.toolbar.enable(),a.removeClass("fr-active"),a=null,u())}function m(){r.shared.embedly_exit_flag=!0}function u(){r.shared.embedly_exit_flag=!1}return r.shared.embedly_exit_flag=!1,{_init:function(){if(!r.$wp)return!1;var e;"undefined"!=typeof embedly?t(!0):r.shared.embedlyLoaded?r.shared.embedlyCallbacks.push(t):(r.shared.embedlyLoaded=!0,r.shared.embedlyCallbacks=[],r.shared.embedlyCallbacks.push(t),(e=r.doc.createElement("script")).type="text/javascript",e.src=r.opts.embedlyScriptPath,e.innerText="",e.onload=function(){if(r.shared.embedlyCallbacks)for(var e=0;e<r.shared.embedlyCallbacks.length;e++)r.shared.embedlyCallbacks[e]()},r.doc.getElementsByTagName("head")[0].appendChild(e))},showInsertPopup:function(){var e,t,n=r.$tb.find('.fr-command[data-cmd="embedly"]'),s=r.popups.get("embedly.insert");(s=s||i()).hasClass("fr-active")||(r.popups.refresh("embedly.insert"),r.popups.setContainer("embedly.insert",r.$tb),n.isVisible()?(t=(e=r.button.getPosition(n)).left,r.popups.show("embedly.insert",t,e.top,n.outerHeight())):(r.position.forSelection(s),r.popups.show("embedly.insert")))},insert:function(){e(r.popups.get("embedly.insert").find(".fr-embedly-layer input").val())},remove:f,get:function(){return a},add:e,back:function(){a?(r.events.disableBlur(),a.trigger("click")):(r.events.disableBlur(),r.selection.restore(),r.events.enableBlur(),r.popups.hide("embedly.insert"),r.toolbar.showInline())}}},p.DefineIcon("embedly",{NAME:"share-alt",SVG_KEY:"insertEmbed"}),p.RegisterCommand("embedly",{undo:!0,focus:!0,title:"Embed URL",popup:!0,callback:function(){this.popups.isVisible("embedly.insert")?(this.$el.find(".fr-marker").length&&(this.events.disableBlur(),this.selection.restore()),this.popups.hide("embedly.insert")):this.embedly.showInsertPopup()},plugin:"embedly"}),p.RegisterCommand("embedlyInsert",{undo:!0,focus:!0,callback:function(){this.embedly.insert()}}),p.DefineIcon("embedlyRemove",{NAME:"trash",SVG_KEY:"remove"}),p.RegisterCommand("embedlyRemove",{title:"Remove",undo:!1,callback:function(){this.embedly.remove()}}),p.DefineIcon("embedlyBack",{NAME:"arrow-left",SVG_KEY:"back"}),p.RegisterCommand("embedlyBack",{title:"Back",undo:!1,focus:!1,back:!0,callback:function(){this.embedly.back()},refresh:function(e){this.embedly.get()||this.opts.toolbarInline?(e.removeClass("fr-hidden"),e.next(".fr-separator").removeClass("fr-hidden")):(e.addClass("fr-hidden"),e.next(".fr-separator").addClass("fr-hidden"))}})});