UNPKG

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) 9.81 kB
/*! * 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,n){"object"==typeof exports&&"undefined"!=typeof module?n(require("froala-editor")):"function"==typeof define&&define.amd?define(["froala-editor"],n):n(("undefined"!=typeof globalThis?globalThis:e||self).FroalaEditor)}(this,function(v){"use strict";Object.assign(v.POPUP_TEMPLATES,{"editAnchor.popup":"[_BUTTONS_]","insertAnchor.popup":"[_BUTTONS_][_LINK_TO_ANCHOR_LAYER_]"}),Object.assign(v.DEFAULTS,{anchorEditButtons:["anchorEdit","anchorRemove"]}),v.PLUGINS.linkToAnchor=function(p){var r,d,f=p.$;function o(){var e=p.button.buildList(["closeAnchorInsert"]),e={buttons:'<div class="fr-buttons fr-link-to-anchor-header"><span>'.concat(p.language.translate("Insert Anchor"),'</span><span class="fr-align-right">').concat(e,"</span></div>"),link_to_anchor_layer:"\n <div class='fr-layer fr-active fr-link-to-anchor-layer' tabindex=\"-1\">\n <div class='fr-input-container'>\n <div class='fr-input-line fr-link-to-anchor-field'>\n <input type='text' id=\"fr-link-to-anchor-".concat(p.id,"\" placeholder='").concat(p.language.translate("Anchor Name"),"' tabIndex='1'>\n </div>\n <div class=\"fr-input-text\">").concat(p.language.translate("Enter the anchor name without space"),'</div>\n </div>\n\n <div class="fr-action-buttons">\n <button type="button" class="fr-command fr-submit" data-cmd="anchorInsert" tabIndex="2" role="button">').concat(p.language.translate("Insert"),"</button>\n </div>\n </div>\n ")};r=p.popups.create("insertAnchor.popup",e),p.events.$on(r,".fr-link-to-anchor-field input","input",function(){a(!1)}),p.events.on("popups.show.insertAnchor.popup",function(){r&&r.find(".fr-link-to-anchor-field input").trigger("focus")})}function u(e){if(!1===p.events.trigger("anchor.beforeRemove",[e]))return!1;e&&(p.selection.save(),f(e).remove(),p.selection.restore(),h())}function a(e){var n=r.find(".fr-link-to-anchor-field input, .fr-input-text");e?(n.addClass("fr-error-text"),n.focus()):(n.removeClass("fr-error-text"),r.find(".fr-input-text").text(p.language.translate("Enter the anchor name without space")))}function i(){var e=r.data("data-update-ancher");r.removeData("data-update-ancher"),p.popups.hide("insertAnchor.popup"),g(e)}function h(){p.$el.find(".fr-anchor").removeClass("fr-active"),d&&d.removeData("data-update-ancher"),p.popups.hide("editAnchor.popup")}function t(e){var n,t,r;e&&(d||(n=p.button.buildList(p.opts.anchorEditButtons),n={buttons:'<div class="fr-buttons fr-edit-anchor"><label class="fr-edit-anchor-label"></label><span class="fr-align-right">'.concat(n,"</span></div>")},d=p.popups.create("editAnchor.popup",n),p.events.on("popups.hide.editAnchor.popup",function(){p.$el.find(".fr-anchor").removeClass("fr-active fr-anchor-selected")}),p.events.on("commands.undo commands.redo",function(){g(p.$el.find('a[data-cmd="anchor"].fr-active').get(0)),p.$el.find(".fr-marker-helper").remove()})),(n=f(e)).addClass("fr-active"),d.find("label.fr-edit-anchor-label").text("#"+n.attr("name")),p.popups.isVisible("editAnchor.popup")||p.popups.refresh("editAnchor.popup"),p.popups.setContainer("editAnchor.popup",p.$sc),t=n.offset().left+n.outerWidth()/2,r=n.offset().top+n.outerHeight(),d.data("data-update-ancher",e),p.popups.show("editAnchor.popup",t,r,n.outerHeight(),!0))}function g(e){if(p.$el.find(".fr-anchor").removeClass("fr-active fr-anchor-selected"),!e)return!1;f(e).addClass("fr-active");var n=p.doc.createRange();p.selection.get().removeAllRanges(),n.selectNode(e),p.selection.get().addRange(n),t(e)}function e(e){var n=e.which,t=n===v.KEYCODE.DELETE,r=n===v.KEYCODE.BACKSPACE;if(e&&p.keys.isArrow(n)||r||t){var o=n===v.KEYCODE.ARROW_LEFT||r,a=n===v.KEYCODE.ARROW_RIGHT||t;if(d&&d.isVisible()&&!r&&!t)return c=d.data("data-update-ancher"),l=f(c),c?(i=c.nextSibling,c=c.previousSibling,void(a?i&&i.length&&i.nodeType!==Node.ELEMENT_NODE||(l.after(v.INVISIBLE_SPACE),l.attr("data-anchor-marker","after")):c&&c.length&&c.nodeType!==Node.ELEMENT_NODE||(l.before(v.INVISIBLE_SPACE),l.attr("data-anchor-marker","before")))):void 0;var i=p.selection.get();if(!i||!i.anchorNode)return;var s=i.anchorNode,c=i.anchorOffset;if(s.nodeType===Node.TEXT_NODE)if(o&&0===c)s=s.previousSibling;else{if(!a||c!==s.textContent.length)return;s=s.nextSibling}else s=r?(l=s.childNodes[c]||s.childNodes[c-1])&&l.previousElementSibling:n===v.KEYCODE.ARROW_LEFT?s.previousSibling:s.nextSibling;s&&s.nodeType===Node.ELEMENT_NODE&&s.classList.contains("fr-anchor")&&(r||t?u(s):setTimeout(function(){g(s)},30));var l,i=p.$el.find(".fr-anchor[data-anchor-marker]");i.length&&(o=i.attr("data-anchor-marker"),c=(a=i.get(0)).previousSibling,l=a.nextSibling,"before"===o&&c&&c.nodeType===Node.TEXT_NODE&&"\u200b"===c.textContent&&c.remove(),"after"===o&&l&&l.nodeType===Node.TEXT_NODE&&"\u200b"===l.textContent&&l.remove(),i.removeAttr("data-anchor-marker"))}p.keys.ctrlKey(e)&&n==v.KEYCODE.A&&h()}function n(){p.$el.find('a[data-cmd="anchor"]').addClass("fr-anchor")}return{_init:function(){p.$wp&&(p.events.$on(p.$doc,"selectionchange",function(){p.$el.find("a.fr-anchor").each(function(e,n){var t=f(n),r=d&&d.isVisible();!function(e){var n,t,r,o=(p.opts.iframe?p.iframe_document:p.doc).getSelection(),a=p.selection.element();if(o&&0!==o.rangeCount&&!p.selection.isCollapsed()&&!a.classList.contains("fr-view"))try{return"function"==typeof o.containsNode?o.containsNode(e,!0):"function"==typeof(n=o.getRangeAt(0)).intersectsNode?n.intersectsNode(e):(t=n.startContainer,r=n.endContainer,e.contains(t)||e.contains(r))}catch(i){}}(n)||r?t.removeClass("fr-anchor-selected"):t.addClass("fr-anchor-selected")})}),p.events.on("keydown",e),p.events.on("paste.after",n),p.events.bindClick(p.$el,".fr-anchor",function(e){e.preventDefault(),e.stopPropagation();e=e.currentTarget;return e&&g(e),!1}))},insert:function(){var e,n=r.find(".fr-link-to-anchor-field input").val(),t=r.data("data-update-ancher");if(!n.length||n.includes(" "))a(!0);else if(t&&(e=f(t)).attr("name")===n)i();else if(p.$el.find('[data-cmd="anchor"]').filter(function(e){return e.name===n}).length)r.find(".fr-input-text").text(p.language.translate("Anchor name already exists.")),a(!0);else{if(!1===p.events.trigger("anchor.beforeInsert",[t,n]))return!1;t?(e.attr("name",n),i()):(t=p.$el.find(".fr-marker-helper").get(0)||p.markers.insert(),e='<a name="'.concat(n,'" class="fr-anchor" data-cmd="anchor" contenteditable="false"></a>'),t&&(t.outerHTML=e,t=p.$el.find('a[name="'.concat(n,'"]')),r.data("data-update-ancher",t.get(0)),t[0].previousSibling||t.before(v.INVISIBLE_SPACE),t[0].nextSibling||t.after(v.INVISIBLE_SPACE),t.attr("data-anchor-marker","after"),i()))}},update:function(e){var n,t;h(),e&&(r||o(),r.data("data-update-ancher",e),p.popups.isVisible("insertAnchor.popup")||(p.popups.refresh("insertAnchor.popup"),p.selection.save(),p.helpers.isMobile()&&(p.events.disableBlur(),p.$el.blur(),p.events.enableBlur())),p.popups.setContainer("insertAnchor.popup",p.$sc),n=(e=f(e)).offset().left+e.outerWidth()/2,t=e.offset().top+e.outerHeight(),r.find(".fr-link-to-anchor-field input").val(e.attr("name")),p.popups.show("insertAnchor.popup",n,t,e.outerHeight(),!0))},remove:u,showPopup:function(){var e,n,t=p.$tb.find('.fr-command[data-cmd="insertAnchor"]');r||o(),r.hasClass("fr-active")||(p.selection.save(),p.popups.refresh("insertAnchor.popup"),p.popups.setContainer("insertAnchor.popup",p.$tb),r.find(".fr-link-to-anchor-field input").val(""),a(!1),p.$el.find(".fr-marker-helper").remove(),t.isVisible()?(e=(n=p.button.getPosition(t)).left,p.popups.show("insertAnchor.popup",e,n.top,t.outerHeight())):(p.position.forSelection(r),p.popups.show("insertAnchor.popup")),(e=p.$el.find(".fr-marker")).length&&((t=(n=e.first()).get(0).nextSibling)&&t.nodeType===Node.ELEMENT_NODE&&"COLGROUP"===t.tagName?((t=e.parents("table")).before(v.START_MARKER),t):(n.before(v.START_MARKER),e)).prev().removeClass("fr-marker").addClass("fr-marker-helper"))},closeAnchorInsert:i,focusOnAnchor:g}},v.RegisterShortcut(v.KEYCODE.D,"insertAnchor",null,"D"),v.DefineIcon("insertAnchor",{NAME:"bookmark",SVG_KEY:"bookmark",VIEWBOX:"-5 -4 26 26"}),v.RegisterCommand("insertAnchor",{title:"Insert Anchor",icon:"insertAnchor",plugin:"linkToAnchor",type:"button",undo:!0,focus:!0,popup:!0,showOnMobile:!0,refreshAfterCallback:!0,callback:function(){this.linkToAnchor.showPopup()}}),v.RegisterCommand("anchorInsert",{undo:!0,focus:!0,plugin:"linkToAnchor",callback:function(){this.linkToAnchor.insert()},refresh:function(e){var n=this.popups.get("insertAnchor.popup"),t=n.data("data-update-ancher"),n=n.find(".fr-link-to-anchor-header span").first();t?(e.text(this.language.translate("Update")),n.text(this.language.translate("Update Anchor"))):(e.text(this.language.translate("Insert")),n.text(this.language.translate("Insert Anchor")))}}),v.DefineIcon("closeAnchorInsert",{NAME:"cancel",SVG_KEY:"cancel"}),v.RegisterCommand("closeAnchorInsert",{title:"Cancel",undo:!1,focus:!1,plugin:"linkToAnchor",callback:function(){this.linkToAnchor.closeAnchorInsert()}}),v.DefineIcon("anchorEdit",{NAME:"edit",SVG_KEY:"edit"}),v.RegisterCommand("anchorEdit",{title:"Edit Anchor",undo:!0,popup:!0,plugin:"linkToAnchor",refreshAfterCallback:!1,callback:function(){var e=this.popups.get("editAnchor.popup");this.linkToAnchor.update(e.data("data-update-ancher"))}}),v.DefineIcon("anchorRemove",{NAME:"trash",SVG_KEY:"remove"}),v.RegisterCommand("anchorRemove",{title:"Delete",undo:!0,popup:!0,plugin:"linkToAnchor",refreshAfterCallback:!1,callback:function(){var e=this.popups.get("editAnchor.popup");this.linkToAnchor.remove(e.data("data-update-ancher"))}})});