(function () { 'use strict'; var global = tinymce.util.Tools.resolve('tinymce.PluginManager'); var cleanTranslated = function (newElement) { var nodes = $(newElement).find(".mce-translatehtml"); if (nodes.length > 0) { $(newElement).find(".mce-translatehtml").each(function () { $(this).replaceWith($(this).html()); }); } }; var tinyWrap = function (open_tag, close_tag) { var ed = tinymce.activeEditor || opener.tinymce.activeEditor; /* get editor instance */ var selection = ed.selection.getContent(); /* get user selection, if any */ var temp_name = new Date().getTime().toString(36).toLowerCase(); /* generate a unique string */ var span_open = ''; /* generate '' */ var span_close = ''; /* generate closing '' */ selection = selection.replace(/

/g,'').replace(/<\/p>/g,'
'); /* convert

to
*/ if (selection.substr(selection.length-6) === '
') { selection = selection.substr(0, selection.length-6); /* strip last
if present */ } /* create complete selection replacement: 'OPEN_TAGselectionCLOSE_TAG' */ var content = open_tag + span_open + selection + span_close + close_tag; ed.execCommand('mceReplaceContent', false, content); /* replace selection with new */ var span_elem = ed.dom.get(temp_name); /* get the element of the temp span */ ed.selection.select(span_elem); /* select (highlight) the selection span */ cleanTranslated(span_elem); ed.dom.remove(temp_name, true); /* remove the span, leave it's highlighted text behind(true) */ ed.focus(); /* insure editor has focus */ return; /* taa-daa! all done! */ } var register = function (editor) { const languagesConfigStrings = window.languages; editor.ui.registry.addSplitButton('translatehtml', { tooltip: 'Translate html', icon: 'translate', onAction: function () {}, onItemAction: function (api, value) { if (value[0] != 'remove') { tinyWrap(''); } else { tinyWrap('', ''); } }, fetch: function (callback) { const rtlList = ['ps', 'ar', 'he', 'fa']; var items = [], dir, i; for (i = 0; i < languagesConfigStrings.length; i++) { let iso = languagesConfigStrings[i]['isocode']; dir = 'ltr'; if (rtlList.includes(iso)) { dir = 'rtl'; } items.push({ type: 'choiceitem', text: languagesConfigStrings[i]['originalName'], value: [dir, iso] }); } items.push({ type: 'choiceitem', icon: 'remove', text: 'Remove translation', value: ['remove'] }); callback(items); } }); } function Plugin () { global.add('translatehtml', function (editor) { register(editor); }); } Plugin(); }());