@firestitch/froala
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.
3 lines (2 loc) • 18.4 kB
JavaScript
!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(A){"use strict";A=A&&A.hasOwnProperty("default")?A.default:A,Object.assign(A.POPUP_TEMPLATES,{"link.edit":"[_BUTTONS_]","link.insert":"[_BUTTONS_][_INPUT_LAYER_]"}),Object.assign(A.DEFAULTS,{linkEditButtons:["linkOpen","linkStyle","linkEdit","linkRemove"],linkInsertButtons:["linkBack","|","linkList"],linkAttributes:{},linkAutoPrefix:"http://",linkStyles:{"fr-green":"Green","fr-strong":"Thick"},linkMultipleStyles:!0,linkConvertEmailAddress:!0,linkAlwaysBlank:!1,linkAlwaysNoFollow:!1,linkNoOpener:!0,linkNoReferrer:!0,linkList:[{text:"Froala",href:"https://froala.com",target:"_blank"},{text:"Google",href:"https://google.com",target:"_blank"},{displayText:"Facebook",href:"https://facebook.com"}],linkText:!0}),A.PLUGINS.link=function(v){var b=v.$;function E(){var t=v.image?v.image.get():null;if(t||!v.$wp)return"A"==v.el.tagName?v.el:t&&t.get(0).parentNode&&"A"==t.get(0).parentNode.tagName?t.get(0).parentNode:void 0;t=v.selection.ranges(0).commonAncestorContainer;try{t&&(t.contains&&t.contains(v.el)||!v.el.contains(t)||v.el==t)&&(t=null)}catch(e){t=null}if(t&&"A"===t.tagName)return t;var t=v.selection.element(),n=v.selection.endElement();"A"==t.tagName||v.node.isElement(t)||(t=b(t).parentsUntil(v.$el,"a").first().get(0)),"A"==n.tagName||v.node.isElement(n)||(n=b(n).parentsUntil(v.$el,"a").first().get(0));try{n&&(n.contains&&n.contains(v.el)||!v.el.contains(n)||v.el==n)&&(n=null)}catch(e){n=null}try{t&&(t.contains&&t.contains(v.el)||!v.el.contains(t)||v.el==t)&&(t=null)}catch(e){t=null}return!n||n!=t||"A"!=n.tagName||(v.browser.msie||v.helpers.isMobile())&&(v.selection.info(t).atEnd||v.selection.info(t).atStart)?null:t}function y(){var e,t,n=v.image?v.image.get():null,i=[];if(n)"A"==n.get(0).parentNode.tagName&&i.push(n.get(0).parentNode);else if(v.win.getSelection){var r=v.win.getSelection();if(r.getRangeAt&&r.rangeCount)for(var a=v.doc.createRange(),l=0;l<r.rangeCount;++l)if((t=(t=(e=r.getRangeAt(l)).commonAncestorContainer)&&1!=t.nodeType?t.parentNode:t)&&"a"==t.nodeName.toLowerCase())i.push(t);else for(var s=t.getElementsByTagName("a"),o=0;o<s.length;++o)a.selectNodeContents(s[o]),a.compareBoundaryPoints(e.END_TO_START,e)<1&&-1<a.compareBoundaryPoints(e.START_TO_END,e)&&i.push(s[o])}else if(v.doc.selection&&"Control"!=v.doc.selection.type)if("a"==(t=(e=v.doc.selection.createRange()).parentElement()).nodeName.toLowerCase())i.push(t);else{s=t.getElementsByTagName("a"),a=v.doc.body.createTextRange();for(var p=0;p<s.length;++p)a.moveToElementText(s[p]),-1<a.compareEndPoints("StartToEnd",e)&&a.compareEndPoints("EndToStart",e)<1&&i.push(s[p])}return i}function C(n){if(v.core.hasFocus()){if(i(),n&&"keyup"===n.type&&(n.altKey||n.which==A.KEYCODE.ALT))return!0;setTimeout(function(){if(!n||1==n.which||"mouseup"!=n.type){var e=E(),t=v.image?v.image.get():null;if(e&&!t){if(v.image){var t=v.node.contents(e);if(1==t.length&&"IMG"==t[0].tagName)return 0===(t=v.selection.ranges(0)).startOffset&&0===t.endOffset?b(e).before(A.INVISIBLE_SPACE+A.MARKERS):b(e).after(A.INVISIBLE_SPACE+A.MARKERS),v.selection.restore(),!1}n&&n.stopPropagation(),function t(e){var n=v.popups.get("link.edit");n=n||function(){var e="",e=(1<=v.opts.linkEditButtons.length&&("A"==v.el.tagName&&0<=v.opts.linkEditButtons.indexOf("linkRemove")&&v.opts.linkEditButtons.splice(v.opts.linkEditButtons.indexOf("linkRemove"),1),e='<div class="fr-buttons">'.concat(v.button.buildList(v.opts.linkEditButtons),"</div>")),{buttons:e}),e=v.popups.create("link.edit",e);return v.$wp&&v.events.$on(v.$wp,"scroll.link-edit",function(){E()&&v.popups.isVisible("link.edit")&&t(E())}),e}();n=b(e);v.popups.isVisible("link.edit")||v.popups.refresh("link.edit"),v.popups.setContainer("link.edit",v.$sc);var e=n.offset().left+n.outerWidth()/2,i=n.offset().top+n.outerHeight();v.popups.show("link.edit",e,i,n.outerHeight(),!0)}(e)}}},v.helpers.isIOS()?100:0)}}function i(){v.popups.hide("link.edit")}function a(){var e=v.popups.get("link.insert"),t=E();if(t){for(var n,i=b(t),r=e.find('input.fr-link-attr[type="text"]'),a=e.find('input.fr-link-attr[type="checkbox"]'),l=0;l<r.length;l++)(n=b(r[l])).val(i.attr(n.attr("name")||""));for(a.attr("checked",!1),l=0;l<a.length;l++)n=b(a[l]),i.attr(n.attr("name"))==n.data("checked")&&n.attr("checked",!0);e.find('input.fr-link-attr[type="text"][name="text"]').val(i.text())}else e.find('input.fr-link-attr[type="text"]').val(""),e.find('input.fr-link-attr[type="checkbox"]').attr("checked",!1),e.find('input.fr-link-attr[type="text"][name="text"]').val(v.selection.text());e.find("input.fr-link-attr").trigger("change"),v.image&&v.image.get()?e.find('.fr-link-attr[name="text"]').parent().hide():e.find('.fr-link-attr[name="text"]').parent().show()}function r(e){if(e)return v.popups.onRefresh("link.insert",a),!0;var t,n,e="",i=(1<=v.opts.linkInsertButtons.length&&(e='<div class="fr-buttons fr-tabs">'.concat(v.button.buildList(v.opts.linkInsertButtons),"</div>")),""),r=0,i='<div class="fr-link-insert-layer fr-layer fr-active" id="fr-link-insert-layer-'.concat(v.id,'">');for(t in i+='<div class="fr-input-line"><input id="fr-link-insert-layer-url-'.concat(v.id,'" name="href" type="text" class="fr-link-attr" placeholder="').concat(v.language.translate("URL"),'" tabIndex="').concat(++r,'"></div>'),v.opts.linkText&&(i+='<div class="fr-input-line"><input id="fr-link-insert-layer-text-'.concat(v.id,'" name="text" type="text" class="fr-link-attr" placeholder="').concat(v.language.translate("Text"),'" tabIndex="').concat(++r,'"></div>')),v.opts.linkAttributes)v.opts.linkAttributes.hasOwnProperty(t)&&(n=v.opts.linkAttributes[t],i+='<div class="fr-input-line"><input name="'.concat(t,'" type="text" class="fr-link-attr" placeholder="').concat(v.language.translate(n),'" tabIndex="').concat(++r,'"></div>'));v.opts.linkAlwaysBlank||(i+='<div class="fr-checkbox-line"><span class="fr-checkbox"><input name="target" class="fr-link-attr" data-checked="_blank" type="checkbox" id="fr-link-target-'.concat(v.id,'" tabIndex="').concat(++r,'"><span>').concat('<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="10" height="10" viewBox="0 0 32 32"><path d="M27 4l-15 15-7-7-5 5 12 12 20-20z" fill="#FFF"></path></svg>','</span></span><label id="fr-label-target-').concat(v.id,'">').concat(v.language.translate("Open in new tab"),"</label></div>"));e={buttons:e,input_layer:i+='<div class="fr-action-buttons"><button class="fr-command fr-submit" role="button" data-cmd="linkInsert" href="#" tabIndex="'.concat(++r,'" type="button">').concat(v.language.translate("Insert"),"</button></div></div>")},e=v.popups.create("link.insert",e);return v.$wp&&v.events.$on(v.$wp,"scroll.link-insert",function(){v.image&&v.image.get()&&v.popups.isVisible("link.insert")&&s(),v.popups.isVisible("link.insert")&&l()}),e}function o(e,t,n){if(v.opts.trackChangesEnabled){if(v.edit.on(),v.events.focus(!0),v.undo.saveStep(),v.markers.insert(),v.html.wrap(),!v.$el.find(".fr-marker").length)return void v.popups.hide("link.insert");v.markers.remove()}if(!1===v.events.trigger("link.beforeInsert",[e,t,n=void 0===n?{}:n]))return!1;var i=v.image?v.image.get():null,r=(i||"A"==v.el.tagName?"A"==v.el.tagName&&v.$el.focus():(v.selection.restore(),v.popups.hide("link.insert")),e);if(v.opts.linkConvertEmailAddress&&v.helpers.isEmail(e)&&!/^mailto:.*/i.test(e)&&(e="mailto:".concat(e)),""===v.opts.linkAutoPrefix||new RegExp("^("+A.LinkProtocols.join("|")+"):.","i").test(e)||/^data:image.*/i.test(e)||/^(https?:|ftps?:|file:|)\/\//i.test(e)||/^([A-Za-z]:(\\){1,2}|[A-Za-z]:((\\){1,2}[^\\]+)+)(\\)?$/i.test(e)||["/","{","[","#","(","."].indexOf((e||"")[0])<0&&(e=v.opts.linkAutoPrefix+e),e=v.helpers.sanitizeURL(e),v.opts.linkAlwaysBlank&&(n.target="_blank"),v.opts.linkAlwaysNoFollow&&(n.rel="nofollow"),v.helpers.isEmail(r)&&(n.target=null,n.rel=null),"_blank"==n.target?(v.opts.linkNoOpener&&(n.rel?n.rel+=" noopener":n.rel="noopener"),v.opts.linkNoReferrer&&(n.rel?n.rel+=" noreferrer":n.rel="noreferrer")):null==n.target&&(n.rel?n.rel=n.rel.replace(/noopener/,"").replace(/noreferrer/,""):n.rel=null),t=t||"",e===v.opts.linkAutoPrefix)return v.popups.get("link.insert").find('input[name="href"]').addClass("fr-error"),v.events.trigger("link.bad",[r]),!1;var a,l=E();if(l){if((a=b(l)).attr("href",e),0<t.length&&a.text()!=t&&!i){v.opts.trackChangesEnabled&&((l=b(a.get(0).outerHTML)).insertBefore(a.parent()),l=v.track_changes.wrapLinkInTracking(l,v.track_changes.getPendingChanges().length-1),l=v.track_changes.wrapInDelete(l),a.parent().append(l));for(var s=a.get(0);1===s.childNodes.length&&s.childNodes[0].nodeType==Node.ELEMENT_NODE;)s=s.childNodes[0];b(s).text(t)}for(var o in i||a.prepend(A.START_MARKER).append(A.END_MARKER),n)n[o]?a.attr(o,n[o]):a.removeAttr(o);i||v.selection.restore()}else{if(i)i.wrap('<a href="'.concat(e,'"></a>')),v.image.hasCaption()&&i.parent().append(i.parents(".fr-img-caption").find(".fr-inner"));else{v.format.remove("a");if(v.selection.isCollapsed())t=0===t.length?r:t,v.html.insert('<a href="'.concat(e,'">').concat(A.START_MARKER).concat(t.replace(/&/g,"&").replace(/</,"<",">",">")).concat(A.END_MARKER,"</a>")),v.selection.restore();else if(0<t.length&&t!=v.selection.text().replace(/\n/g,""))v.selection.remove(),v.html.insert('<a href="'.concat(e,'">').concat(A.START_MARKER).concat(t.replace(/&/g,"&")).concat(A.END_MARKER,"</a>")),v.selection.restore();else{if(!v.selection.isCollapsed()){v.selection.save();for(var p=v.$el.find(".fr-marker").addClass("fr-unprocessed").toArray();p.length;){var c=b(p.pop()),f=(c.removeClass("fr-unprocessed"),v.node.deepestParent(c.get(0)));if(f){for(var d=c.get(0),u="",k="";d=d.parentNode,v.node.isBlock(d)||(u+=v.node.closeTagString(d),k=v.node.openTagString(d)+k),d!=f;);var g=v.node.openTagString(c.get(0))+c.html()+v.node.closeTagString(c.get(0));c.replaceWith('<span id="fr-break"></span>');c=(c=(c=f.outerHTML).replace(/<span id="fr-break"><\/span>/g,u+g+k)).replace(k+u,"");f.outerHTML=c}p=v.$el.find(".fr-marker.fr-unprocessed").toArray()}v.html.cleanEmptyTags(),v.selection.restore()}v.format.apply("a",{href:e})}}for(var h=y(),m=0;m<h.length;m++)(a=b(h[m])).attr(n),a.removeAttr("_moz_dirty");1==h.length&&v.$wp&&!i&&(b(h[0]).prepend(A.START_MARKER).append(A.END_MARKER),v.selection.restore())}i?((l=v.popups.get("link.insert"))&&l.find("input:focus").blur(),v.image.edit(i)):C()}function l(){i();var e,t,n=E();n&&(v.popups.get("link.insert")||r(),v.popups.isVisible("link.insert")||(v.popups.refresh("link.insert"),v.selection.save(),v.helpers.isMobile()&&(v.events.disableBlur(),v.$el.blur(),v.events.enableBlur())),v.popups.setContainer("link.insert",v.$sc),e=(n=(v.image?v.image.get():null)||b(n)).offset().left+n.outerWidth()/2,t=n.offset().top+n.outerHeight(),v.popups.show("link.insert",e,t,n.outerHeight(),!0))}function s(){var e,t,n,i=v.image?v.image.getEl():null;i&&(e=v.popups.get("link.insert"),t=i.outerWidth()/2,v.image.hasCaption()&&(i=i.find(".fr-img-wrap"),b(i))&&b(i).find("img")&&(t=b(i).find("img").outerWidth()/2),e=e||r(),a(),v.popups.setContainer("link.insert",v.$sc),e=i.offset().left+t,t=i.offset().top+i.outerHeight(),n=i.outerHeight(),v.opts.iframe&&v.image.hasCaption()&&b(i)&&b(i).find("img")&&(n=b(i).find("img").outerHeight()),v.popups.show("link.insert",e,t,n,!0))}return{_init:function(){v.events.on("keyup",function(e){e.which!=A.KEYCODE.ESC&&C(e)}),v.events.on("window.mouseup",C),v.events.$on(v.$el,"click","a",function(e){v.edit.isDisabled()&&e.preventDefault()}),v.helpers.isMobile()&&v.events.$on(v.$doc,"selectionchange",C),r(!0),"A"==v.el.tagName&&v.$el.addClass("fr-view"),v.events.on("toolbar.esc",function(){if(v.popups.isVisible("link.edit"))return v.events.disableBlur(),v.events.focus(),!1},!0)},remove:function(){var e,t=E(),n=v.image?v.image.get():null;if(!1===v.events.trigger("link.beforeRemove",[t]))return!1;n&&t?v.image.hasCaption()?(n.addClass("img-link-caption"),b(t).replaceWith(b(t).html()),e=document.querySelectorAll("img.img-link-caption"),v.image.edit(b(e[0])),b(e[0]).removeClass("img-link-caption")):(n.unwrap(),v.image.edit(n)):t&&(v.selection.save(),b(t).replaceWith(b(t).html()),v.selection.restore(),i())},showInsertPopup:function(){var e,t,n=v.$tb.find('.fr-command[data-cmd="insertLink"]'),i=v.popups.get("link.insert");(i=i||r()).hasClass("fr-active")||(v.popups.refresh("link.insert"),v.popups.setContainer("link.insert",v.$tb||v.$sc),n.isVisible()?(e=(t=v.button.getPosition(n)).left,t=t.top,v.popups.show("link.insert",e,t,n.outerHeight())):(v.position.forSelection(i),v.popups.show("link.insert")))},usePredefined:function(e){var t,n,i=v.opts.linkList[e],e=v.popups.get("link.insert"),r=e.find('input.fr-link-attr[type="text"]'),a=e.find('input.fr-link-attr[type="checkbox"]');for(i.rel&&(e.rel=i.rel),n=0;n<r.length;n++)i[(t=b(r[n])).attr("name")]?(t.val(i[t.attr("name")]),t.toggleClass("fr-not-empty",!0)):"text"!=t.attr("name")&&t.val("");for(n=0;n<a.length;n++)(t=b(a[n])).attr("checked",t.data("checked")==i[t.attr("name")]);v.accessibility.focusPopup(e)},insertCallback:function(){for(var e,t=v.popups.get("link.insert"),n=t.find('input.fr-link-attr[type="text"]'),i=t.find('input.fr-link-attr[type="checkbox"]'),r=(n.filter('[name="href"]').val()||"").trim(),a=v.opts.linkText?n.filter('[name="text"]').val():"",l={},s=0;s<n.length;s++)e=b(n[s]),["href","text"].indexOf(e.attr("name"))<0&&(l[e.attr("name")]=e.val());for(s=0;s<i.length;s++)(e=b(i[s])).is(":checked")?l[e.attr("name")]=e.data("checked"):l[e.attr("name")]=e.data("unchecked")||null;t.rel&&(l.rel=t.rel);t=v.helpers.scrollTop();o(r,a,l),b(v.o_win).scrollTop(t)},insert:o,update:l,get:E,allSelected:y,back:function(){v.image&&v.image.get()?v.image.back():(v.events.disableBlur(),v.selection.restore(),v.events.enableBlur(),E()&&v.$wp?(v.selection.restore(),i(),C()):"A"==v.el.tagName?(v.$el.focus(),C()):(v.popups.hide("link.insert"),v.toolbar.showInline()))},imageLink:s,applyStyle:function(e,t,n){void 0===n&&(n=v.opts.linkMultipleStyles),void 0===t&&(t=v.opts.linkStyles);var i=E();if(!i)return!1;n||((n=Object.keys(t)).splice(n.indexOf(e),1),b(i).removeClass(n.join(" "))),b(i).toggleClass(e),C()}}},A.DefineIcon("insertLink",{NAME:"link",SVG_KEY:"insertLink"}),A.RegisterShortcut(A.KEYCODE.K,"insertLink",null,"K"),A.RegisterCommand("insertLink",{title:"Insert Link",undo:!1,focus:!0,refreshOnCallback:!1,popup:!0,callback:function(){this.popups.isVisible("link.insert")?(this.$el.find(".fr-marker").length&&(this.events.disableBlur(),this.selection.restore()),this.popups.hide("link.insert")):this.link.showInsertPopup()},plugin:"link"}),A.DefineIcon("linkOpen",{NAME:"external-link",FA5NAME:"external-link-alt",SVG_KEY:"openLink"}),A.RegisterCommand("linkOpen",{title:"Open Link",undo:!1,refresh:function(e){this.link.get()?e.removeClass("fr-hidden"):e.addClass("fr-hidden")},callback:function(){var e=this.link.get();e&&(-1!==e.href.indexOf("mailto:")?this.o_win.open(e.href).close():(e.target||(e.target="_self"),this.browser.msie||this.browser.edge?this.o_win.open(e.href,e.target):this.o_win.open(e.href,e.target,"noopener")),this.popups.hide("link.edit"))},plugin:"link"}),A.DefineIcon("linkEdit",{NAME:"edit",SVG_KEY:"edit"}),A.RegisterCommand("linkEdit",{title:"Edit Link",undo:!1,refreshAfterCallback:!1,popup:!0,callback:function(){this.link.update()},refresh:function(e){this.link.get()?e.removeClass("fr-hidden"):e.addClass("fr-hidden")},plugin:"link"}),A.DefineIcon("linkRemove",{NAME:"unlink",SVG_KEY:"unlink"}),A.RegisterCommand("linkRemove",{title:"Unlink",callback:function(){this.link.remove()},refresh:function(e){this.link.get()?e.removeClass("fr-hidden"):e.addClass("fr-hidden")},plugin:"link"}),A.DefineIcon("linkBack",{NAME:"arrow-left",SVG_KEY:"back"}),A.RegisterCommand("linkBack",{title:"Back",undo:!1,focus:!1,back:!0,refreshAfterCallback:!1,callback:function(){this.link.back()},refresh:function(e){var t=this.link.get()&&this.doc.hasFocus();this.image&&this.image.get()||t||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"))},plugin:"link"}),A.DefineIcon("linkList",{NAME:"search",SVG_KEY:"search"}),A.RegisterCommand("linkList",{title:"Choose Link",type:"dropdown",focus:!1,undo:!1,refreshAfterCallback:!1,html:function(){for(var e='<ul class="fr-dropdown-list" role="presentation">',t=this.opts.linkList,n=0;n<t.length;n++)e+='<li role="presentation"><a class="fr-command" tabIndex="-1" role="option" data-cmd="linkList" data-param1="'.concat(n,'">').concat(t[n].displayText||t[n].text,"</a></li>");return e+"</ul>"},callback:function(e,t){this.link.usePredefined(t)},plugin:"link"}),A.RegisterCommand("linkInsert",{focus:!1,refreshAfterCallback:!1,callback:function(){this.link.insertCallback()},refresh:function(e){this.link.get()?e.text(this.language.translate("Update")):e.text(this.language.translate("Insert"))},plugin:"link"}),A.DefineIcon("imageLink",{NAME:"link",SVG_KEY:"insertLink"}),A.RegisterCommand("imageLink",{title:"Insert Link",undo:!1,focus:!1,popup:!0,callback:function(){this.link.imageLink()},refresh:function(e){var t;this.link.get()?((t=e.prev()).hasClass("fr-separator")&&t.removeClass("fr-hidden"),e.addClass("fr-hidden")):((t=e.prev()).hasClass("fr-separator")&&t.addClass("fr-hidden"),e.removeClass("fr-hidden"))},plugin:"link"}),A.DefineIcon("linkStyle",{NAME:"magic",SVG_KEY:"linkStyles"}),A.RegisterCommand("linkStyle",{title:"Style",type:"dropdown",html:function(){var e,t='<ul class="fr-dropdown-list" role="presentation">',n=this.opts.linkStyles;for(e in n)n.hasOwnProperty(e)&&(t+='<li role="presentation"><a class="fr-command" tabIndex="-1" role="option" data-cmd="linkStyle" data-param1="'.concat(e,'">').concat(this.language.translate(n[e]),"</a></li>"));return t+"</ul>"},callback:function(e,t){this.link.applyStyle(t)},refreshOnShow:function(e,t){var n,i=this.$,r=this.link.get();r&&(n=i(r),t.find(".fr-command").each(function(){var e=i(this).data("param1"),e=n.hasClass(e);i(this).toggleClass("fr-active",e).attr("aria-selected",e)}))},refresh:function(e){this.link.get()?e.removeClass("fr-hidden"):e.addClass("fr-hidden")},plugin:"link"})});
//# sourceMappingURL=link.min.min.js.map