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) 3.27 kB
/*! * 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(f){"use strict";Object.assign(f.DEFAULTS,{charCounterMax:-1,charCounterCount:!0}),f.PLUGINS.charCounter=function(l){var t,d,r=l.$;function e(e){var t=l.opts.charCounterMax;if(!(t<0)){var n=d();if("keydown"===e.type){if(n<t)return!0;var r=e.which;if(!l.keys.ctrlKey(e)&&l.keys.isCharacter(r)||r===f.KEYCODE.IME)return e.preventDefault(),e.stopPropagation(),l.events.trigger("charCounter.exceeded"),!1}r=e.originalEvent&&e.originalEvent.inputType||"";if(!/delete|historyUndo|historyRedo/.test(r)){if("beforeinput"===e.type){r=e.data||e.originalEvent&&e.originalEvent.data||e.originalEvent&&e.originalEvent.dataTransfer&&e.originalEvent.dataTransfer.getData("text")||"",r=n-l.win.getSelection().toString().length+r.length;if(t-n<=0||t<r)return e.preventDefault(),e.stopPropagation(),l.events.trigger("charCounter.exceeded"),!1}if("input"===e.type&&t<n){l.selection.save();for(var o,r=l.el,a=t,i="",s=document.createTreeWalker(r,NodeFilter.SHOW_TEXT,null,!1),c=!0;(o=s.nextNode())&&i.length<a;){var u=a-i.length;if(o.textContent.length>u){o.textContent=o.textContent.slice(0,u),c=!1;break}i+=o.textContent}for(c&&(o=s.previousNode());o=s.nextNode();)o.textContent="";l.selection.restore()}}}return!0}function n(e){return l.opts.charCounterMax<0||r("<div>").html(e).text().length+d()<=l.opts.charCounterMax?e:(l.events.trigger("charCounter.exceeded"),"")}function o(e,t,n){return l.opts.charCounterMax<0||(e.includes('<span class="fr-emoticon')||e.includes('<i class="fa ')?!(d()>=l.opts.charCounterMax&&(l.events.trigger("charCounter.exceeded"),1)):r("<div>").html(e).text().length+d()<=l.opts.charCounterMax||(l.events.trigger("charCounter.exceeded"),!1))}function a(){var e;l.opts.charCounterCount&&(e=d()+(0<l.opts.charCounterMax?"/"+l.opts.charCounterMax:""),t.text("".concat(l.language.translate("Characters")," : ").concat(e)),l.opts.toolbarBottom&&t.css("margin-bottom",l.$tb.outerHeight(!0)),0<=(e=l.$wp.get(0).offsetWidth-l.$wp.get(0).clientWidth))&&("rtl"==l.opts.direction?t.css("margin-left",e):t.css("margin-right",e))}return{_init:function(){return!!l.$wp&&!!l.opts.charCounterCount&&((t=r(document.createElement("span")).attr("class","fr-counter")).css("bottom",l.$wp.css("border-bottom-width")),(l.$second_tb||l.$wp).append(t),l.events.on("keydown beforeinput input",e,!0),l.events.on("paste.afterCleanup",n),l.events.on("keyup contentChanged input",function(){l.events.trigger("charCounter.update")}),l.events.on("html.beforeInsert",o),l.events.on("charCounter.update",a),l.events.trigger("charCounter.update"),void l.events.on("destroy",function(){r(l.o_win).off("resize.char".concat(l.id)),t.removeData().remove(),t=null}))},count:d=function d(){var e=l.opts.iframe&&l.markdown&&l.markdown.isEnabled()?l.$el.text()||"":l.el.textContent||"",t=l.$el.find(".fr-page-break"),n=(t.text()||"").length;return e.replace(/\u200B/g,"").length-n*t.length}}}});