PK:\smce/code/plugin.min.jsnuW+A!function(){"use strict";var t=tinymce.util.Tools.resolve("tinymce.PluginManager"),n=tinymce.util.Tools.resolve("tinymce.dom.DOMUtils"),o=function(t){return t.getParam("code_dialog_width",600)},i=function(t){return t.getParam("code_dialog_height",Math.min(n.DOM.getViewPort().h-200,500))},c=function(t,n){t.focus(),t.undoManager.transact(function(){t.setContent(n)}),t.selection.setCursorLocation(),t.nodeChanged()},d=function(t){return t.getContent({source_view:!0})},e=function(n){var t=o(n),e=i(n);n.windowManager.open({title:"Source code",body:{type:"textbox",name:"code",multiline:!0,minWidth:t,minHeight:e,spellcheck:!1,style:"direction: ltr; text-align: left"},onSubmit:function(t){c(n,t.data.code)}}).find("#code").value(d(n))},u=function(t){t.addCommand("mceCodeEditor",function(){e(t)})},a=function(t){t.addButton("code",{icon:"code",tooltip:"Source code",onclick:function(){e(t)}}),t.addMenuItem("code",{icon:"code",text:"Source code",onclick:function(){e(t)}})};t.add("code",function(t){return u(t),a(t),{}})}();PK:\ an mce/code/plugin.jsnuW+A(function () { var code = (function () { 'use strict'; var global = tinymce.util.Tools.resolve('tinymce.PluginManager'); var global$1 = tinymce.util.Tools.resolve('tinymce.dom.DOMUtils'); var getMinWidth = function (editor) { return editor.getParam('code_dialog_width', 600); }; var getMinHeight = function (editor) { return editor.getParam('code_dialog_height', Math.min(global$1.DOM.getViewPort().h - 200, 500)); }; var Settings = { getMinWidth: getMinWidth, getMinHeight: getMinHeight }; var setContent = function (editor, html) { editor.focus(); editor.undoManager.transact(function () { editor.setContent(html); }); editor.selection.setCursorLocation(); editor.nodeChanged(); }; var getContent = function (editor) { return editor.getContent({ source_view: true }); }; var Content = { setContent: setContent, getContent: getContent }; var open = function (editor) { var minWidth = Settings.getMinWidth(editor); var minHeight = Settings.getMinHeight(editor); var win = editor.windowManager.open({ title: 'Source code', body: { type: 'textbox', name: 'code', multiline: true, minWidth: minWidth, minHeight: minHeight, spellcheck: false, style: 'direction: ltr; text-align: left' }, onSubmit: function (e) { Content.setContent(editor, e.data.code); } }); win.find('#code').value(Content.getContent(editor)); }; var Dialog = { open: open }; var register = function (editor) { editor.addCommand('mceCodeEditor', function () { Dialog.open(editor); }); }; var Commands = { register: register }; var register$1 = function (editor) { editor.addButton('code', { icon: 'code', tooltip: 'Source code', onclick: function () { Dialog.open(editor); } }); editor.addMenuItem('code', { icon: 'code', text: 'Source code', onclick: function () { Dialog.open(editor); } }); }; var Buttons = { register: register$1 }; global.add('code', function (editor) { Commands.register(editor); Buttons.register(editor); return {}; }); function Plugin () { } return Plugin; }()); })(); PK:\ՉBmce/wptadv/plugin.min.jsnuW+A/** * This file is part of the TinyMCE Advanced WordPress plugin and is released under the same license. * For more information please see tinymce-advanced.php. * * Copyright (c) 2007-2020 Andrew Ozz. All rights reserved. */ ( function( tinymce ) { tinymce.PluginManager.add( 'wptadv', function( editor ) { var noAutop = ( ! editor.settings.wpautop && editor.settings.tadv_noautop ); function addLineBreaks( html ) { var blocklist = 'table|thead|tfoot|caption|col|colgroup|tbody|tr|td|th|div|dl|dd|dt|ul|ol|li|pre' + '|form|map|area|blockquote|address|math|style|p|h[1-6]|hr|fieldset|legend|section' + '|article|aside|hgroup|header|footer|nav|figure|figcaption|details|menu|summary'; html = html.replace( new RegExp( '<(?:' + blocklist + ')(?: [^>]*)?>', 'gi' ), '\n$&' ); html = html.replace( new RegExp( '', 'gi' ), '$&\n' ); html = html.replace( /(]*)?>)[\r\n\t]*/gi, '$1\n' ); html = html.replace( />\n[\r\n\t]+\n<' ); html = html.replace( /^
  • \u00a0<\/td>/g, ' ' ); return tinymce.trim( html ); } editor.addCommand( 'Tadv_Mark', function() { editor.formatter.toggle('mark'); }); editor.addButton( 'tadv_mark', { icon: 'backcolor', tooltip: 'Mark', cmd: 'Tadv_Mark', stateSelector: 'mark' }); editor.on( 'init', function() { if ( noAutop ) { editor.on( 'SaveContent', function( event ) { event.content = event.content.replace( /caption\](\s|]*>|

     <\/p>)*\[caption/g, 'caption] [caption' ); event.content = event.content.replace( /<(object|audio|video)[\s\S]+?<\/\1>/g, function( match ) { return match.replace( /[\r\n\t ]+/g, ' ' ); }); event.content = event.content.replace( /]*)?>[\s\S]+?<\/pre>/g, function( match ) { match = match.replace( /
    (\r\n|\n)?/g, '\n' ); return match.replace( /<\/?p( [^>]*)?>(\r\n|\n)?/g, '\n' ); }); event.content = addLineBreaks( event.content ); }); } try { if ( editor.plugins.searchreplace && ! editor.controlManager.buttons.searchreplace ) { editor.shortcuts.remove( 'meta+f' ); } } catch ( er ) {} editor.formatter.register({ mark: { inline: 'mark' } }); }); editor.on( 'ObjectResizeStart', function( event ) { var element = event.target; var table = editor.$( element ); var parentWidth; var tableWidth; var width; if ( table.is( 'table' ) ) { if ( element.style.width && element.style.width.indexOf( '%' ) !== -1 ) { return; } parentWidth = parseInt( table.parent().css( 'width' ), 10 ); tableWidth = parseInt( event.width, 10 ); if ( parentWidth && tableWidth ) { if ( Math.abs( parentWidth - tableWidth ) < 3 ) { table.css({ width: '100%' }); } else { width = Math.round( ( tableWidth / parentWidth ) * 100 ); if ( width > 10 && width < 200 ) { table.css({ width: width + '%' }); } } } } }, true ); editor.addMenuItem( 'tmaresettablesize', { text: 'Reset table size', cmd: 'tmaResetTableSize', icon: 'dashicon dashicons-image-flip-horizontal', context: 'format', }); editor.addMenuItem( 'tmaremovetablestyles', { text: 'Remove table styling', cmd: 'tmaRemoveTableStyles', icon: 'dashicon dashicons-editor-table', context: 'format', }); editor.addButton( 'tmaresettablesize', { title: 'Reset table size', cmd: 'tmaResetTableSize', icon: 'dashicon dashicons-image-flip-horizontal', } ); editor.addButton( 'tmaremovetablestyles', { title: 'Remove table styling', cmd: 'tmaRemoveTableStyles', icon: 'dashicon dashicons-editor-table', } ); editor.addCommand( 'tmaRemoveTableStyles', function() { var node = editor.selection.getStart(); var table = editor.dom.getParents( node, 'table' ); var attr = { style: null, 'data-mce-style': null, width: null, height: null, minWidth: null, maxWidth: null, minHeight: null, maxHeight: null, align: null, valign: null, axis: null, 'char': null, charoff: null, bgcolor: null, border: null, cellspacing: null, cellpadding: null }; if ( table ) { editor.$( table ).attr( attr ).find( 'tr, th, td, thead, tbody, tfoot' ).each( function( i, element ) { editor.$( element ).attr( attr ); } ); } } ); editor.addCommand( 'tmaResetTableSize', function() { var node = editor.selection.getStart(); var table = editor.dom.getParents( node, 'table' ); if ( table ) { removeInlineSizes( null, table ); editor.$( table ).find( 'tr, th, td, thead, tbody, tfoot' ).each( removeInlineSizes ); } } ); function removeInlineSizes( i, node ) { var element = editor.$( node ); element.attr( { width: null, height: null, minWidth: null, maxWidth: null, minHeight: null, maxHeight: null } ); element.css({ width: null, height: null }); if ( element.is( 'table' ) ) { element.css({ 'border-collapse': 'collapse', width: '100%;' }); } if ( ! element.attr( 'style' ) ) { element.attr({ style: null, 'data-mce-style': null }); } else { element.attr( 'data-mce-style', element.attr( 'style' ) ); } } if ( noAutop ) { editor.on( 'beforeSetContent', function( event ) { var autop; var wp = window.wp; if ( ! wp ) { return; } autop = wp.editor && wp.editor.autop; if ( ! autop ) { autop = wp.oldEditor && wp.oldEditor.autop; } if ( event.load && autop && event.content && event.content.indexOf( '\n' ) > -1 && ! /

    /i.test( event.content ) ) { event.content = autop( event.content ); } }, true ); if ( editor.settings.classic_block_editor ) { editor.on( 'beforeGetContent', function( event ) { if ( event.format === 'raw' ) { return; } var blocks = tinymce.$( '.block-editor-block-list__block' ); if ( blocks.length === 1 && blocks.attr( 'data-type' ) === 'core/freeform' ) { // Mark all paragraph tags inside a single freeform block so they are not stripped by the block editor... editor.$( 'p' ).each( function ( i, node ) { if ( ! node.hasAttributes() ) { editor.$( node ).attr( 'data-tadv-p', 'keep' ); } } ); } else { // Remove the above ugliness... editor.$( 'p[data-tadv-p]' ).removeAttr( 'data-tadv-p' ); } }, true ); } } return { addLineBreaks: addLineBreaks }; }); }( window.tinymce )); PK:\ՉBmce/wptadv/plugin.jsnuW+A/** * This file is part of the TinyMCE Advanced WordPress plugin and is released under the same license. * For more information please see tinymce-advanced.php. * * Copyright (c) 2007-2020 Andrew Ozz. All rights reserved. */ ( function( tinymce ) { tinymce.PluginManager.add( 'wptadv', function( editor ) { var noAutop = ( ! editor.settings.wpautop && editor.settings.tadv_noautop ); function addLineBreaks( html ) { var blocklist = 'table|thead|tfoot|caption|col|colgroup|tbody|tr|td|th|div|dl|dd|dt|ul|ol|li|pre' + '|form|map|area|blockquote|address|math|style|p|h[1-6]|hr|fieldset|legend|section' + '|article|aside|hgroup|header|footer|nav|figure|figcaption|details|menu|summary'; html = html.replace( new RegExp( '<(?:' + blocklist + ')(?: [^>]*)?>', 'gi' ), '\n$&' ); html = html.replace( new RegExp( '', 'gi' ), '$&\n' ); html = html.replace( /(]*)?>)[\r\n\t]*/gi, '$1\n' ); html = html.replace( />\n[\r\n\t]+\n<' ); html = html.replace( /^

  • \u00a0<\/td>/g, ' ' ); return tinymce.trim( html ); } editor.addCommand( 'Tadv_Mark', function() { editor.formatter.toggle('mark'); }); editor.addButton( 'tadv_mark', { icon: 'backcolor', tooltip: 'Mark', cmd: 'Tadv_Mark', stateSelector: 'mark' }); editor.on( 'init', function() { if ( noAutop ) { editor.on( 'SaveContent', function( event ) { event.content = event.content.replace( /caption\](\s|]*>|

     <\/p>)*\[caption/g, 'caption] [caption' ); event.content = event.content.replace( /<(object|audio|video)[\s\S]+?<\/\1>/g, function( match ) { return match.replace( /[\r\n\t ]+/g, ' ' ); }); event.content = event.content.replace( /]*)?>[\s\S]+?<\/pre>/g, function( match ) { match = match.replace( /
    (\r\n|\n)?/g, '\n' ); return match.replace( /<\/?p( [^>]*)?>(\r\n|\n)?/g, '\n' ); }); event.content = addLineBreaks( event.content ); }); } try { if ( editor.plugins.searchreplace && ! editor.controlManager.buttons.searchreplace ) { editor.shortcuts.remove( 'meta+f' ); } } catch ( er ) {} editor.formatter.register({ mark: { inline: 'mark' } }); }); editor.on( 'ObjectResizeStart', function( event ) { var element = event.target; var table = editor.$( element ); var parentWidth; var tableWidth; var width; if ( table.is( 'table' ) ) { if ( element.style.width && element.style.width.indexOf( '%' ) !== -1 ) { return; } parentWidth = parseInt( table.parent().css( 'width' ), 10 ); tableWidth = parseInt( event.width, 10 ); if ( parentWidth && tableWidth ) { if ( Math.abs( parentWidth - tableWidth ) < 3 ) { table.css({ width: '100%' }); } else { width = Math.round( ( tableWidth / parentWidth ) * 100 ); if ( width > 10 && width < 200 ) { table.css({ width: width + '%' }); } } } } }, true ); editor.addMenuItem( 'tmaresettablesize', { text: 'Reset table size', cmd: 'tmaResetTableSize', icon: 'dashicon dashicons-image-flip-horizontal', context: 'format', }); editor.addMenuItem( 'tmaremovetablestyles', { text: 'Remove table styling', cmd: 'tmaRemoveTableStyles', icon: 'dashicon dashicons-editor-table', context: 'format', }); editor.addButton( 'tmaresettablesize', { title: 'Reset table size', cmd: 'tmaResetTableSize', icon: 'dashicon dashicons-image-flip-horizontal', } ); editor.addButton( 'tmaremovetablestyles', { title: 'Remove table styling', cmd: 'tmaRemoveTableStyles', icon: 'dashicon dashicons-editor-table', } ); editor.addCommand( 'tmaRemoveTableStyles', function() { var node = editor.selection.getStart(); var table = editor.dom.getParents( node, 'table' ); var attr = { style: null, 'data-mce-style': null, width: null, height: null, minWidth: null, maxWidth: null, minHeight: null, maxHeight: null, align: null, valign: null, axis: null, 'char': null, charoff: null, bgcolor: null, border: null, cellspacing: null, cellpadding: null }; if ( table ) { editor.$( table ).attr( attr ).find( 'tr, th, td, thead, tbody, tfoot' ).each( function( i, element ) { editor.$( element ).attr( attr ); } ); } } ); editor.addCommand( 'tmaResetTableSize', function() { var node = editor.selection.getStart(); var table = editor.dom.getParents( node, 'table' ); if ( table ) { removeInlineSizes( null, table ); editor.$( table ).find( 'tr, th, td, thead, tbody, tfoot' ).each( removeInlineSizes ); } } ); function removeInlineSizes( i, node ) { var element = editor.$( node ); element.attr( { width: null, height: null, minWidth: null, maxWidth: null, minHeight: null, maxHeight: null } ); element.css({ width: null, height: null }); if ( element.is( 'table' ) ) { element.css({ 'border-collapse': 'collapse', width: '100%;' }); } if ( ! element.attr( 'style' ) ) { element.attr({ style: null, 'data-mce-style': null }); } else { element.attr( 'data-mce-style', element.attr( 'style' ) ); } } if ( noAutop ) { editor.on( 'beforeSetContent', function( event ) { var autop; var wp = window.wp; if ( ! wp ) { return; } autop = wp.editor && wp.editor.autop; if ( ! autop ) { autop = wp.oldEditor && wp.oldEditor.autop; } if ( event.load && autop && event.content && event.content.indexOf( '\n' ) > -1 && ! /

    /i.test( event.content ) ) { event.content = autop( event.content ); } }, true ); if ( editor.settings.classic_block_editor ) { editor.on( 'beforeGetContent', function( event ) { if ( event.format === 'raw' ) { return; } var blocks = tinymce.$( '.block-editor-block-list__block' ); if ( blocks.length === 1 && blocks.attr( 'data-type' ) === 'core/freeform' ) { // Mark all paragraph tags inside a single freeform block so they are not stripped by the block editor... editor.$( 'p' ).each( function ( i, node ) { if ( ! node.hasAttributes() ) { editor.$( node ).attr( 'data-tadv-p', 'keep' ); } } ); } else { // Remove the above ugliness... editor.$( 'p[data-tadv-p]' ).removeAttr( 'data-tadv-p' ); } }, true ); } } return { addLineBreaks: addLineBreaks }; }); }( window.tinymce )); PK:\4b 88mce/contextmenu/plugin.jsnuW+A(function () { var contextmenu = (function () { 'use strict'; var Cell = function (initial) { var value = initial; var get = function () { return value; }; var set = function (v) { value = v; }; var clone = function () { return Cell(get()); }; return { get: get, set: set, clone: clone }; }; var global = tinymce.util.Tools.resolve('tinymce.PluginManager'); var get = function (visibleState) { var isContextMenuVisible = function () { return visibleState.get(); }; return { isContextMenuVisible: isContextMenuVisible }; }; var Api = { get: get }; var shouldNeverUseNative = function (editor) { return editor.settings.contextmenu_never_use_native; }; var getContextMenu = function (editor) { return editor.getParam('contextmenu', 'link openlink image inserttable | cell row column deletetable'); }; var Settings = { shouldNeverUseNative: shouldNeverUseNative, getContextMenu: getContextMenu }; var global$1 = tinymce.util.Tools.resolve('tinymce.dom.DOMUtils'); var getUiContainer = function (editor) { return global$1.DOM.select(editor.settings.ui_container)[0]; }; var nu = function (x, y) { return { x: x, y: y }; }; var transpose = function (pos, dx, dy) { return nu(pos.x + dx, pos.y + dy); }; var fromPageXY = function (e) { return nu(e.pageX, e.pageY); }; var fromClientXY = function (e) { return nu(e.clientX, e.clientY); }; var transposeUiContainer = function (element, pos) { if (element && global$1.DOM.getStyle(element, 'position', true) !== 'static') { var containerPos = global$1.DOM.getPos(element); var dx = containerPos.x - element.scrollLeft; var dy = containerPos.y - element.scrollTop; return transpose(pos, -dx, -dy); } else { return transpose(pos, 0, 0); } }; var transposeContentAreaContainer = function (element, pos) { var containerPos = global$1.DOM.getPos(element); return transpose(pos, containerPos.x, containerPos.y); }; var getPos = function (editor, e) { if (editor.inline) { return transposeUiContainer(getUiContainer(editor), fromPageXY(e)); } else { var iframePos = transposeContentAreaContainer(editor.getContentAreaContainer(), fromClientXY(e)); return transposeUiContainer(getUiContainer(editor), iframePos); } }; var Coords = { getPos: getPos }; var global$2 = tinymce.util.Tools.resolve('tinymce.ui.Factory'); var global$3 = tinymce.util.Tools.resolve('tinymce.util.Tools'); var renderMenu = function (editor, visibleState) { var menu, contextmenu; var items = []; contextmenu = Settings.getContextMenu(editor); global$3.each(contextmenu.split(/[ ,]/), function (name) { var item = editor.menuItems[name]; if (name === '|') { item = { text: name }; } if (item) { item.shortcut = ''; items.push(item); } }); for (var i = 0; i < items.length; i++) { if (items[i].text === '|') { if (i === 0 || i === items.length - 1) { items.splice(i, 1); } } } menu = global$2.create('menu', { items: items, context: 'contextmenu', classes: 'contextmenu' }); menu.uiContainer = getUiContainer(editor); menu.renderTo(getUiContainer(editor)); menu.on('hide', function (e) { if (e.control === this) { visibleState.set(false); } }); editor.on('remove', function () { menu.remove(); menu = null; }); return menu; }; var show = function (editor, pos, visibleState, menu) { if (menu.get() === null) { menu.set(renderMenu(editor, visibleState)); } else { menu.get().show(); } menu.get().moveTo(pos.x, pos.y); visibleState.set(true); }; var ContextMenu = { show: show }; var isNativeOverrideKeyEvent = function (editor, e) { return e.ctrlKey && !Settings.shouldNeverUseNative(editor); }; var setup = function (editor, visibleState, menu) { editor.on('contextmenu', function (e) { if (isNativeOverrideKeyEvent(editor, e)) { return; } e.preventDefault(); ContextMenu.show(editor, Coords.getPos(editor, e), visibleState, menu); }); }; var Bind = { setup: setup }; global.add('contextmenu', function (editor) { var menu = Cell(null), visibleState = Cell(false); Bind.setup(editor, visibleState, menu); return Api.get(visibleState); }); function Plugin () { } return Plugin; }()); })(); PK:\ f+>  mce/contextmenu/plugin.min.jsnuW+A!function(){"use strict";var o=function(t){var n=t,e=function(){return n};return{get:e,set:function(t){n=t},clone:function(){return o(e())}}},t=tinymce.util.Tools.resolve("tinymce.PluginManager"),i=function(t){return{isContextMenuVisible:function(){return t.get()}}},r=function(t){return t.settings.contextmenu_never_use_native},u=function(t){return t.getParam("contextmenu","link openlink image inserttable | cell row column deletetable")},l=tinymce.util.Tools.resolve("tinymce.dom.DOMUtils"),s=function(t){return l.DOM.select(t.settings.ui_container)[0]},a=function(t,n){return{x:t,y:n}},f=function(t,n,e){return a(t.x+n,t.y+e)},m=function(t,n){if(t&&"static"!==l.DOM.getStyle(t,"position",!0)){var e=l.DOM.getPos(t),o=e.x-t.scrollLeft,i=e.y-t.scrollTop;return f(n,-o,-i)}return f(n,0,0)},c=function(t,n){if(t.inline)return m(s(t),a((u=n).pageX,u.pageY));var e,o,i,r,u,c=(e=t.getContentAreaContainer(),o=a((r=n).clientX,r.clientY),i=l.DOM.getPos(e),f(o,i.x,i.y));return m(s(t),c)},g=tinymce.util.Tools.resolve("tinymce.ui.Factory"),v=tinymce.util.Tools.resolve("tinymce.util.Tools"),y=function(t,n,e,o){null===o.get()?o.set(function(e,n){var t,o,i=[];o=u(e),v.each(o.split(/[ ,]/),function(t){var n=e.menuItems[t];"|"===t&&(n={text:t}),n&&(n.shortcut="",i.push(n))});for(var r=0;r !,> O Ho~!~bHXn4j֬g9ə6BYW;LCTS&aYۮwq2I8SN;PK:\ ;,HHmce/visualblocks/img/div.gifnuW+AGIF89a !, i<} F3a"c[@;PK:\VVmce/visualblocks/img/aside.gifnuW+AGIF89a !, - j˲7\d)+nGzn ;PK:\]]mce/visualblocks/img/figure.gifnuW+AGIF89a$ !,$ 4H[oȧRvT'v8NIj,tDC*u;PK:\ @@mce/visualblocks/img/dl.gifnuW+AGIF89a !, ɱcR:HH*;PK:\%u@@mce/visualblocks/img/ul.gifnuW+AGIF89a !, ɱbzU(n5⨀W;PK:\88aa%mce/visualblocks/css/visualblocks.cssnuW+A.mce-visualblocks p { padding-top: 10px; border: 1px dashed #BBB; margin-left: 3px; background-image: url(data:image/gif;base64,R0lGODlhCQAJAJEAAAAAAP///7u7u////yH5BAEAAAMALAAAAAAJAAkAAAIQnG+CqCN/mlyvsRUpThG6AgA7); background-repeat: no-repeat; } .mce-visualblocks h1 { padding-top: 10px; border: 1px dashed #BBB; margin-left: 3px; background-image: url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybGu1JuxHoAfRNRW3TWXyF2YiRUAOw==); background-repeat: no-repeat; } .mce-visualblocks h2 { padding-top: 10px; border: 1px dashed #BBB; margin-left: 3px; background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8Hybbx4oOuqgTynJd6bGlWg3DkJzoaUAAAOw==); background-repeat: no-repeat; } .mce-visualblocks h3 { padding-top: 10px; border: 1px dashed #BBB; margin-left: 3px; background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIZjI8Hybbx4oOuqgTynJf2Ln2NOHpQpmhAAQA7); background-repeat: no-repeat; } .mce-visualblocks h4 { padding-top: 10px; border: 1px dashed #BBB; margin-left: 3px; background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxInR0zqeAdhtJlXwV1oCll2HaWgAAOw==); background-repeat: no-repeat; } .mce-visualblocks h5 { padding-top: 10px; border: 1px dashed #BBB; margin-left: 3px; background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxIoiuwjane4iq5GlW05GgIkIZUAAAOw==); background-repeat: no-repeat; } .mce-visualblocks h6 { padding-top: 10px; border: 1px dashed #BBB; margin-left: 3px; background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxIoiuwjan04jep1iZ1XRlAo5bVgAAOw==); background-repeat: no-repeat; } .mce-visualblocks div:not([data-mce-bogus]) { padding-top: 10px; border: 1px dashed #BBB; margin-left: 3px; background-image: url(data:image/gif;base64,R0lGODlhEgAKAIABALu7u////yH5BAEAAAEALAAAAAASAAoAAAIfjI9poI0cgDywrhuxfbrzDEbQM2Ei5aRjmoySW4pAAQA7); background-repeat: no-repeat; } .mce-visualblocks section { padding-top: 10px; border: 1px dashed #BBB; margin: 0 0 1em 3px; background-image: url(data:image/gif;base64,R0lGODlhKAAKAIABALu7u////yH5BAEAAAEALAAAAAAoAAoAAAI5jI+pywcNY3sBWHdNrplytD2ellDeSVbp+GmWqaDqDMepc8t17Y4vBsK5hDyJMcI6KkuYU+jpjLoKADs=); background-repeat: no-repeat; } .mce-visualblocks article { padding-top: 10px; border: 1px dashed #BBB; margin: 0 0 1em 3px; background-image: url(data:image/gif;base64,R0lGODlhKgAKAIABALu7u////yH5BAEAAAEALAAAAAAqAAoAAAI6jI+pywkNY3wG0GBvrsd2tXGYSGnfiF7ikpXemTpOiJScasYoDJJrjsG9gkCJ0ag6KhmaIe3pjDYBBQA7); background-repeat: no-repeat; } .mce-visualblocks blockquote { padding-top: 10px; border: 1px dashed #BBB; background-image: url(data:image/gif;base64,R0lGODlhPgAKAIABALu7u////yH5BAEAAAEALAAAAAA+AAoAAAJPjI+py+0Knpz0xQDyuUhvfoGgIX5iSKZYgq5uNL5q69asZ8s5rrf0yZmpNkJZzFesBTu8TOlDVAabUyatguVhWduud3EyiUk45xhTTgMBBQA7); background-repeat: no-repeat; } .mce-visualblocks address { padding-top: 10px; border: 1px dashed #BBB; margin: 0 0 1em 3px; background-image: url(data:image/gif;base64,R0lGODlhLQAKAIABALu7u////yH5BAEAAAEALAAAAAAtAAoAAAI/jI+pywwNozSP1gDyyZcjb3UaRpXkWaXmZW4OqKLhBmLs+K263DkJK7OJeifh7FicKD9A1/IpGdKkyFpNmCkAADs=); background-repeat: no-repeat; } .mce-visualblocks pre { padding-top: 10px; border: 1px dashed #BBB; margin-left: 3px; background-image: url(data:image/gif;base64,R0lGODlhFQAKAIABALu7uwAAACH5BAEAAAEALAAAAAAVAAoAAAIjjI+ZoN0cgDwSmnpz1NCueYERhnibZVKLNnbOq8IvKpJtVQAAOw==); background-repeat: no-repeat; } .mce-visualblocks figure { padding-top: 10px; border: 1px dashed #BBB; margin: 0 0 1em 3px; background-image: url(data:image/gif;base64,R0lGODlhJAAKAIAAALu7u////yH5BAEAAAEALAAAAAAkAAoAAAI0jI+py+2fwAHUSFvD3RlvG4HIp4nX5JFSpnZUJ6LlrM52OE7uSWosBHScgkSZj7dDKnWAAgA7); background-repeat: no-repeat; } .mce-visualblocks hgroup { padding-top: 10px; border: 1px dashed #BBB; margin: 0 0 1em 3px; background-image: url(data:image/gif;base64,R0lGODlhJwAKAIABALu7uwAAACH5BAEAAAEALAAAAAAnAAoAAAI3jI+pywYNI3uB0gpsRtt5fFnfNZaVSYJil4Wo03Hv6Z62uOCgiXH1kZIIJ8NiIxRrAZNMZAtQAAA7); background-repeat: no-repeat; } .mce-visualblocks aside { padding-top: 10px; border: 1px dashed #BBB; margin: 0 0 1em 3px; background-image: url(data:image/gif;base64,R0lGODlhHgAKAIABAKqqqv///yH5BAEAAAEALAAAAAAeAAoAAAItjI+pG8APjZOTzgtqy7I3f1yehmQcFY4WKZbqByutmW4aHUd6vfcVbgudgpYCADs=); background-repeat: no-repeat; } .mce-visualblocks figcaption { border: 1px dashed #BBB; } .mce-visualblocks ul { padding-top: 10px; border: 1px dashed #BBB; margin: 0 0 1em 3px; background-image: url(data:image/gif;base64,R0lGODlhDQAKAIAAALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybGuYnqUVSjvw26DzzXiqIDlVwAAOw==); background-repeat: no-repeat; } .mce-visualblocks ol { padding-top: 10px; border: 1px dashed #BBB; margin: 0 0 1em 3px; background-image: url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybH6HHt0qourxC6CvzXieHyeWQAAOw==); background-repeat: no-repeat; } .mce-visualblocks dl { padding-top: 10px; border: 1px dashed #BBB; margin: 0 0 1em 3px; background-image: url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybEOnmOvUoWznTqeuEjNSCqeGRUAOw==); background-repeat: no-repeat; } PK:\2@֗mce/insertdatetime/plugin.jsnuW+A(function () { var insertdatetime = (function () { 'use strict'; var Cell = function (initial) { var value = initial; var get = function () { return value; }; var set = function (v) { value = v; }; var clone = function () { return Cell(get()); }; return { get: get, set: set, clone: clone }; }; var global = tinymce.util.Tools.resolve('tinymce.PluginManager'); var getDateFormat = function (editor) { return editor.getParam('insertdatetime_dateformat', editor.translate('%Y-%m-%d')); }; var getTimeFormat = function (editor) { return editor.getParam('insertdatetime_timeformat', editor.translate('%H:%M:%S')); }; var getFormats = function (editor) { return editor.getParam('insertdatetime_formats', [ '%H:%M:%S', '%Y-%m-%d', '%I:%M:%S %p', '%D' ]); }; var getDefaultDateTime = function (editor) { var formats = getFormats(editor); return formats.length > 0 ? formats[0] : getTimeFormat(editor); }; var shouldInsertTimeElement = function (editor) { return editor.getParam('insertdatetime_element', false); }; var Settings = { getDateFormat: getDateFormat, getTimeFormat: getTimeFormat, getFormats: getFormats, getDefaultDateTime: getDefaultDateTime, shouldInsertTimeElement: shouldInsertTimeElement }; var daysShort = 'Sun Mon Tue Wed Thu Fri Sat Sun'.split(' '); var daysLong = 'Sunday Monday Tuesday Wednesday Thursday Friday Saturday Sunday'.split(' '); var monthsShort = 'Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec'.split(' '); var monthsLong = 'January February March April May June July August September October November December'.split(' '); var addZeros = function (value, len) { value = '' + value; if (value.length < len) { for (var i = 0; i < len - value.length; i++) { value = '0' + value; } } return value; }; var getDateTime = function (editor, fmt, date) { date = date || new Date(); fmt = fmt.replace('%D', '%m/%d/%Y'); fmt = fmt.replace('%r', '%I:%M:%S %p'); fmt = fmt.replace('%Y', '' + date.getFullYear()); fmt = fmt.replace('%y', '' + date.getYear()); fmt = fmt.replace('%m', addZeros(date.getMonth() + 1, 2)); fmt = fmt.replace('%d', addZeros(date.getDate(), 2)); fmt = fmt.replace('%H', '' + addZeros(date.getHours(), 2)); fmt = fmt.replace('%M', '' + addZeros(date.getMinutes(), 2)); fmt = fmt.replace('%S', '' + addZeros(date.getSeconds(), 2)); fmt = fmt.replace('%I', '' + ((date.getHours() + 11) % 12 + 1)); fmt = fmt.replace('%p', '' + (date.getHours() < 12 ? 'AM' : 'PM')); fmt = fmt.replace('%B', '' + editor.translate(monthsLong[date.getMonth()])); fmt = fmt.replace('%b', '' + editor.translate(monthsShort[date.getMonth()])); fmt = fmt.replace('%A', '' + editor.translate(daysLong[date.getDay()])); fmt = fmt.replace('%a', '' + editor.translate(daysShort[date.getDay()])); fmt = fmt.replace('%%', '%'); return fmt; }; var updateElement = function (editor, timeElm, computerTime, userTime) { var newTimeElm = editor.dom.create('time', { datetime: computerTime }, userTime); timeElm.parentNode.insertBefore(newTimeElm, timeElm); editor.dom.remove(timeElm); editor.selection.select(newTimeElm, true); editor.selection.collapse(false); }; var insertDateTime = function (editor, format) { if (Settings.shouldInsertTimeElement(editor)) { var userTime = getDateTime(editor, format); var computerTime = void 0; if (/%[HMSIp]/.test(format)) { computerTime = getDateTime(editor, '%Y-%m-%dT%H:%M'); } else { computerTime = getDateTime(editor, '%Y-%m-%d'); } var timeElm = editor.dom.getParent(editor.selection.getStart(), 'time'); if (timeElm) { updateElement(editor, timeElm, computerTime, userTime); } else { editor.insertContent(''); } } else { editor.insertContent(getDateTime(editor, format)); } }; var Actions = { insertDateTime: insertDateTime, getDateTime: getDateTime }; var register = function (editor) { editor.addCommand('mceInsertDate', function () { Actions.insertDateTime(editor, Settings.getDateFormat(editor)); }); editor.addCommand('mceInsertTime', function () { Actions.insertDateTime(editor, Settings.getTimeFormat(editor)); }); }; var Commands = { register: register }; var global$1 = tinymce.util.Tools.resolve('tinymce.util.Tools'); var createMenuItems = function (editor, lastFormatState) { var formats = Settings.getFormats(editor); return global$1.map(formats, function (fmt) { return { text: Actions.getDateTime(editor, fmt), onclick: function () { lastFormatState.set(fmt); Actions.insertDateTime(editor, fmt); } }; }); }; var register$1 = function (editor, lastFormatState) { var menuItems = createMenuItems(editor, lastFormatState); editor.addButton('insertdatetime', { type: 'splitbutton', title: 'Insert date/time', menu: menuItems, onclick: function () { var lastFormat = lastFormatState.get(); Actions.insertDateTime(editor, lastFormat ? lastFormat : Settings.getDefaultDateTime(editor)); } }); editor.addMenuItem('insertdatetime', { icon: 'date', text: 'Date/time', menu: menuItems, context: 'insert' }); }; var Buttons = { register: register$1 }; global.add('insertdatetime', function (editor) { var lastFormatState = Cell(null); Commands.register(editor); Buttons.register(editor, lastFormatState); }); function Plugin () { } return Plugin; }()); })(); PK:\I I mce/insertdatetime/plugin.min.jsnuW+A!function(){"use strict";var r=function(e){var t=e,n=function(){return t};return{get:n,set:function(e){t=e},clone:function(){return r(n())}}},e=tinymce.util.Tools.resolve("tinymce.PluginManager"),n=function(e){return e.getParam("insertdatetime_timeformat",e.translate("%H:%M:%S"))},a=function(e){return e.getParam("insertdatetime_formats",["%H:%M:%S","%Y-%m-%d","%I:%M:%S %p","%D"])},t=function(e){return e.getParam("insertdatetime_dateformat",e.translate("%Y-%m-%d"))},i=n,o=a,u=function(e){var t=a(e);return 0'+n+"")}else e.insertContent(f(e,t));var i,o,u,c,l},y=f,M=function(e){e.addCommand("mceInsertDate",function(){g(e,t(e))}),e.addCommand("mceInsertTime",function(){g(e,i(e))})},v=tinymce.util.Tools.resolve("tinymce.util.Tools"),S=function(t,n){var r,a,e,i=(a=n,e=o(r=t),v.map(e,function(e){return{text:y(r,e),onclick:function(){a.set(e),g(r,e)}}}));t.addButton("insertdatetime",{type:"splitbutton",title:"Insert date/time",menu:i,onclick:function(){var e=n.get();g(t,e||u(t))}}),t.addMenuItem("insertdatetime",{icon:"date",text:"Date/time",menu:i,context:"insert"})};e.add("insertdatetime",function(e){var t=r(null);M(e),S(e,t)})}();PK:\f3 mce/table/plugin.jsnuW+A(function () { var table = (function (domGlobals) { 'use strict'; var global = tinymce.util.Tools.resolve('tinymce.PluginManager'); var noop = function () { }; var compose = function (fa, fb) { return function () { var args = []; for (var _i = 0; _i < arguments.length; _i++) { args[_i] = arguments[_i]; } return fa(fb.apply(null, args)); }; }; var constant = function (value) { return function () { return value; }; }; var identity = function (x) { return x; }; function curry(fn) { var initialArgs = []; for (var _i = 1; _i < arguments.length; _i++) { initialArgs[_i - 1] = arguments[_i]; } return function () { var restArgs = []; for (var _i = 0; _i < arguments.length; _i++) { restArgs[_i] = arguments[_i]; } var all = initialArgs.concat(restArgs); return fn.apply(null, all); }; } var not = function (f) { return function () { var args = []; for (var _i = 0; _i < arguments.length; _i++) { args[_i] = arguments[_i]; } return !f.apply(null, args); }; }; var die = function (msg) { return function () { throw new Error(msg); }; }; var never = constant(false); var always = constant(true); var never$1 = never; var always$1 = always; var none = function () { return NONE; }; var NONE = function () { var eq = function (o) { return o.isNone(); }; var call = function (thunk) { return thunk(); }; var id = function (n) { return n; }; var noop = function () { }; var nul = function () { return null; }; var undef = function () { return undefined; }; var me = { fold: function (n, s) { return n(); }, is: never$1, isSome: never$1, isNone: always$1, getOr: id, getOrThunk: call, getOrDie: function (msg) { throw new Error(msg || 'error: getOrDie called on none.'); }, getOrNull: nul, getOrUndefined: undef, or: id, orThunk: call, map: none, ap: none, each: noop, bind: none, flatten: none, exists: never$1, forall: always$1, filter: none, equals: eq, equals_: eq, toArray: function () { return []; }, toString: constant('none()') }; if (Object.freeze) { Object.freeze(me); } return me; }(); var some = function (a) { var constant_a = function () { return a; }; var self = function () { return me; }; var map = function (f) { return some(f(a)); }; var bind = function (f) { return f(a); }; var me = { fold: function (n, s) { return s(a); }, is: function (v) { return a === v; }, isSome: always$1, isNone: never$1, getOr: constant_a, getOrThunk: constant_a, getOrDie: constant_a, getOrNull: constant_a, getOrUndefined: constant_a, or: self, orThunk: self, map: map, ap: function (optfab) { return optfab.fold(none, function (fab) { return some(fab(a)); }); }, each: function (f) { f(a); }, bind: bind, flatten: constant_a, exists: bind, forall: bind, filter: function (f) { return f(a) ? me : NONE; }, equals: function (o) { return o.is(a); }, equals_: function (o, elementEq) { return o.fold(never$1, function (b) { return elementEq(a, b); }); }, toArray: function () { return [a]; }, toString: function () { return 'some(' + a + ')'; } }; return me; }; var from = function (value) { return value === null || value === undefined ? NONE : some(value); }; var Option = { some: some, none: none, from: from }; var typeOf = function (x) { if (x === null) { return 'null'; } var t = typeof x; if (t === 'object' && (Array.prototype.isPrototypeOf(x) || x.constructor && x.constructor.name === 'Array')) { return 'array'; } if (t === 'object' && (String.prototype.isPrototypeOf(x) || x.constructor && x.constructor.name === 'String')) { return 'string'; } return t; }; var isType = function (type) { return function (value) { return typeOf(value) === type; }; }; var isString = isType('string'); var isArray = isType('array'); var isBoolean = isType('boolean'); var isFunction = isType('function'); var isNumber = isType('number'); var slice = Array.prototype.slice; var rawIndexOf = function () { var pIndexOf = Array.prototype.indexOf; var fastIndex = function (xs, x) { return pIndexOf.call(xs, x); }; var slowIndex = function (xs, x) { return slowIndexOf(xs, x); }; return pIndexOf === undefined ? slowIndex : fastIndex; }(); var contains = function (xs, x) { return rawIndexOf(xs, x) > -1; }; var exists = function (xs, pred) { return findIndex(xs, pred).isSome(); }; var map = function (xs, f) { var len = xs.length; var r = new Array(len); for (var i = 0; i < len; i++) { var x = xs[i]; r[i] = f(x, i, xs); } return r; }; var each = function (xs, f) { for (var i = 0, len = xs.length; i < len; i++) { var x = xs[i]; f(x, i, xs); } }; var eachr = function (xs, f) { for (var i = xs.length - 1; i >= 0; i--) { var x = xs[i]; f(x, i, xs); } }; var filter = function (xs, pred) { var r = []; for (var i = 0, len = xs.length; i < len; i++) { var x = xs[i]; if (pred(x, i, xs)) { r.push(x); } } return r; }; var foldr = function (xs, f, acc) { eachr(xs, function (x) { acc = f(acc, x); }); return acc; }; var foldl = function (xs, f, acc) { each(xs, function (x) { acc = f(acc, x); }); return acc; }; var find = function (xs, pred) { for (var i = 0, len = xs.length; i < len; i++) { var x = xs[i]; if (pred(x, i, xs)) { return Option.some(x); } } return Option.none(); }; var findIndex = function (xs, pred) { for (var i = 0, len = xs.length; i < len; i++) { var x = xs[i]; if (pred(x, i, xs)) { return Option.some(i); } } return Option.none(); }; var slowIndexOf = function (xs, x) { for (var i = 0, len = xs.length; i < len; ++i) { if (xs[i] === x) { return i; } } return -1; }; var push = Array.prototype.push; var flatten = function (xs) { var r = []; for (var i = 0, len = xs.length; i < len; ++i) { if (!isArray(xs[i])) { throw new Error('Arr.flatten item ' + i + ' was not an array, input: ' + xs); } push.apply(r, xs[i]); } return r; }; var bind = function (xs, f) { var output = map(xs, f); return flatten(output); }; var forall = function (xs, pred) { for (var i = 0, len = xs.length; i < len; ++i) { var x = xs[i]; if (pred(x, i, xs) !== true) { return false; } } return true; }; var reverse = function (xs) { var r = slice.call(xs, 0); r.reverse(); return r; }; var last = function (xs) { return xs.length === 0 ? Option.none() : Option.some(xs[xs.length - 1]); }; var from$1 = isFunction(Array.from) ? Array.from : function (x) { return slice.call(x); }; var keys = Object.keys; var each$1 = function (obj, f) { var props = keys(obj); for (var k = 0, len = props.length; k < len; k++) { var i = props[k]; var x = obj[i]; f(x, i, obj); } }; var map$1 = function (obj, f) { return tupleMap(obj, function (x, i, obj) { return { k: i, v: f(x, i, obj) }; }); }; var tupleMap = function (obj, f) { var r = {}; each$1(obj, function (x, i) { var tuple = f(x, i, obj); r[tuple.k] = tuple.v; }); return r; }; var Immutable = function () { var fields = []; for (var _i = 0; _i < arguments.length; _i++) { fields[_i] = arguments[_i]; } return function () { var values = []; for (var _i = 0; _i < arguments.length; _i++) { values[_i] = arguments[_i]; } if (fields.length !== values.length) { throw new Error('Wrong number of arguments to struct. Expected "[' + fields.length + ']", got ' + values.length + ' arguments'); } var struct = {}; each(fields, function (name, i) { struct[name] = constant(values[i]); }); return struct; }; }; var sort = function (arr) { return arr.slice(0).sort(); }; var reqMessage = function (required, keys) { throw new Error('All required keys (' + sort(required).join(', ') + ') were not specified. Specified keys were: ' + sort(keys).join(', ') + '.'); }; var unsuppMessage = function (unsupported) { throw new Error('Unsupported keys for object: ' + sort(unsupported).join(', ')); }; var validateStrArr = function (label, array) { if (!isArray(array)) { throw new Error('The ' + label + ' fields must be an array. Was: ' + array + '.'); } each(array, function (a) { if (!isString(a)) { throw new Error('The value ' + a + ' in the ' + label + ' fields was not a string.'); } }); }; var invalidTypeMessage = function (incorrect, type) { throw new Error('All values need to be of type: ' + type + '. Keys (' + sort(incorrect).join(', ') + ') were not.'); }; var checkDupes = function (everything) { var sorted = sort(everything); var dupe = find(sorted, function (s, i) { return i < sorted.length - 1 && s === sorted[i + 1]; }); dupe.each(function (d) { throw new Error('The field: ' + d + ' occurs more than once in the combined fields: [' + sorted.join(', ') + '].'); }); }; var MixedBag = function (required, optional) { var everything = required.concat(optional); if (everything.length === 0) { throw new Error('You must specify at least one required or optional field.'); } validateStrArr('required', required); validateStrArr('optional', optional); checkDupes(everything); return function (obj) { var keys$1 = keys(obj); var allReqd = forall(required, function (req) { return contains(keys$1, req); }); if (!allReqd) { reqMessage(required, keys$1); } var unsupported = filter(keys$1, function (key) { return !contains(everything, key); }); if (unsupported.length > 0) { unsuppMessage(unsupported); } var r = {}; each(required, function (req) { r[req] = constant(obj[req]); }); each(optional, function (opt) { r[opt] = constant(Object.prototype.hasOwnProperty.call(obj, opt) ? Option.some(obj[opt]) : Option.none()); }); return r; }; }; var ATTRIBUTE = domGlobals.Node.ATTRIBUTE_NODE; var CDATA_SECTION = domGlobals.Node.CDATA_SECTION_NODE; var COMMENT = domGlobals.Node.COMMENT_NODE; var DOCUMENT = domGlobals.Node.DOCUMENT_NODE; var DOCUMENT_TYPE = domGlobals.Node.DOCUMENT_TYPE_NODE; var DOCUMENT_FRAGMENT = domGlobals.Node.DOCUMENT_FRAGMENT_NODE; var ELEMENT = domGlobals.Node.ELEMENT_NODE; var TEXT = domGlobals.Node.TEXT_NODE; var PROCESSING_INSTRUCTION = domGlobals.Node.PROCESSING_INSTRUCTION_NODE; var ENTITY_REFERENCE = domGlobals.Node.ENTITY_REFERENCE_NODE; var ENTITY = domGlobals.Node.ENTITY_NODE; var NOTATION = domGlobals.Node.NOTATION_NODE; var Global = typeof domGlobals.window !== 'undefined' ? domGlobals.window : Function('return this;')(); var path = function (parts, scope) { var o = scope !== undefined && scope !== null ? scope : Global; for (var i = 0; i < parts.length && o !== undefined && o !== null; ++i) { o = o[parts[i]]; } return o; }; var resolve = function (p, scope) { var parts = p.split('.'); return path(parts, scope); }; var unsafe = function (name, scope) { return resolve(name, scope); }; var getOrDie = function (name, scope) { var actual = unsafe(name, scope); if (actual === undefined || actual === null) { throw new Error(name + ' not available on this browser'); } return actual; }; var Global$1 = { getOrDie: getOrDie }; var name = function (element) { var r = element.dom().nodeName; return r.toLowerCase(); }; var type = function (element) { return element.dom().nodeType; }; var isType$1 = function (t) { return function (element) { return type(element) === t; }; }; var isComment = function (element) { return type(element) === COMMENT || name(element) === '#comment'; }; var isElement = isType$1(ELEMENT); var isText = isType$1(TEXT); var rawSet = function (dom, key, value) { if (isString(value) || isBoolean(value) || isNumber(value)) { dom.setAttribute(key, value + ''); } else { domGlobals.console.error('Invalid call to Attr.set. Key ', key, ':: Value ', value, ':: Element ', dom); throw new Error('Attribute value was not simple'); } }; var set = function (element, key, value) { rawSet(element.dom(), key, value); }; var setAll = function (element, attrs) { var dom = element.dom(); each$1(attrs, function (v, k) { rawSet(dom, k, v); }); }; var get = function (element, key) { var v = element.dom().getAttribute(key); return v === null ? undefined : v; }; var has = function (element, key) { var dom = element.dom(); return dom && dom.hasAttribute ? dom.hasAttribute(key) : false; }; var remove = function (element, key) { element.dom().removeAttribute(key); }; var clone = function (element) { return foldl(element.dom().attributes, function (acc, attr) { acc[attr.name] = attr.value; return acc; }, {}); }; var checkRange = function (str, substr, start) { if (substr === '') { return true; } if (str.length < substr.length) { return false; } var x = str.substr(start, start + substr.length); return x === substr; }; var contains$1 = function (str, substr) { return str.indexOf(substr) !== -1; }; var endsWith = function (str, suffix) { return checkRange(str, suffix, str.length - suffix.length); }; var trim = function (str) { return str.replace(/^\s+|\s+$/g, ''); }; var isSupported = function (dom) { return dom.style !== undefined && isFunction(dom.style.getPropertyValue); }; var cached = function (f) { var called = false; var r; return function () { var args = []; for (var _i = 0; _i < arguments.length; _i++) { args[_i] = arguments[_i]; } if (!called) { called = true; r = f.apply(null, args); } return r; }; }; var fromHtml = function (html, scope) { var doc = scope || domGlobals.document; var div = doc.createElement('div'); div.innerHTML = html; if (!div.hasChildNodes() || div.childNodes.length > 1) { domGlobals.console.error('HTML does not have a single root node', html); throw new Error('HTML must have a single root node'); } return fromDom(div.childNodes[0]); }; var fromTag = function (tag, scope) { var doc = scope || domGlobals.document; var node = doc.createElement(tag); return fromDom(node); }; var fromText = function (text, scope) { var doc = scope || domGlobals.document; var node = doc.createTextNode(text); return fromDom(node); }; var fromDom = function (node) { if (node === null || node === undefined) { throw new Error('Node cannot be null or undefined'); } return { dom: constant(node) }; }; var fromPoint = function (docElm, x, y) { var doc = docElm.dom(); return Option.from(doc.elementFromPoint(x, y)).map(fromDom); }; var Element = { fromHtml: fromHtml, fromTag: fromTag, fromText: fromText, fromDom: fromDom, fromPoint: fromPoint }; var inBody = function (element) { var dom = isText(element) ? element.dom().parentNode : element.dom(); return dom !== undefined && dom !== null && dom.ownerDocument.body.contains(dom); }; var body = cached(function () { return getBody(Element.fromDom(domGlobals.document)); }); var getBody = function (doc) { var b = doc.dom().body; if (b === null || b === undefined) { throw new Error('Body is not available yet'); } return Element.fromDom(b); }; var internalSet = function (dom, property, value) { if (!isString(value)) { domGlobals.console.error('Invalid call to CSS.set. Property ', property, ':: Value ', value, ':: Element ', dom); throw new Error('CSS value must be a string: ' + value); } if (isSupported(dom)) { dom.style.setProperty(property, value); } }; var internalRemove = function (dom, property) { if (isSupported(dom)) { dom.style.removeProperty(property); } }; var set$1 = function (element, property, value) { var dom = element.dom(); internalSet(dom, property, value); }; var setAll$1 = function (element, css) { var dom = element.dom(); each$1(css, function (v, k) { internalSet(dom, k, v); }); }; var get$1 = function (element, property) { var dom = element.dom(); var styles = domGlobals.window.getComputedStyle(dom); var r = styles.getPropertyValue(property); var v = r === '' && !inBody(element) ? getUnsafeProperty(dom, property) : r; return v === null ? undefined : v; }; var getUnsafeProperty = function (dom, property) { return isSupported(dom) ? dom.style.getPropertyValue(property) : ''; }; var getRaw = function (element, property) { var dom = element.dom(); var raw = getUnsafeProperty(dom, property); return Option.from(raw).filter(function (r) { return r.length > 0; }); }; var remove$1 = function (element, property) { var dom = element.dom(); internalRemove(dom, property); if (has(element, 'style') && trim(get(element, 'style')) === '') { remove(element, 'style'); } }; var copy = function (source, target) { var sourceDom = source.dom(); var targetDom = target.dom(); if (isSupported(sourceDom) && isSupported(targetDom)) { targetDom.style.cssText = sourceDom.style.cssText; } }; var node = function () { var f = Global$1.getOrDie('Node'); return f; }; var compareDocumentPosition = function (a, b, match) { return (a.compareDocumentPosition(b) & match) !== 0; }; var documentPositionPreceding = function (a, b) { return compareDocumentPosition(a, b, node().DOCUMENT_POSITION_PRECEDING); }; var documentPositionContainedBy = function (a, b) { return compareDocumentPosition(a, b, node().DOCUMENT_POSITION_CONTAINED_BY); }; var Node = { documentPositionPreceding: documentPositionPreceding, documentPositionContainedBy: documentPositionContainedBy }; var firstMatch = function (regexes, s) { for (var i = 0; i < regexes.length; i++) { var x = regexes[i]; if (x.test(s)) { return x; } } return undefined; }; var find$1 = function (regexes, agent) { var r = firstMatch(regexes, agent); if (!r) { return { major: 0, minor: 0 }; } var group = function (i) { return Number(agent.replace(r, '$' + i)); }; return nu(group(1), group(2)); }; var detect = function (versionRegexes, agent) { var cleanedAgent = String(agent).toLowerCase(); if (versionRegexes.length === 0) { return unknown(); } return find$1(versionRegexes, cleanedAgent); }; var unknown = function () { return nu(0, 0); }; var nu = function (major, minor) { return { major: major, minor: minor }; }; var Version = { nu: nu, detect: detect, unknown: unknown }; var edge = 'Edge'; var chrome = 'Chrome'; var ie = 'IE'; var opera = 'Opera'; var firefox = 'Firefox'; var safari = 'Safari'; var isBrowser = function (name, current) { return function () { return current === name; }; }; var unknown$1 = function () { return nu$1({ current: undefined, version: Version.unknown() }); }; var nu$1 = function (info) { var current = info.current; var version = info.version; return { current: current, version: version, isEdge: isBrowser(edge, current), isChrome: isBrowser(chrome, current), isIE: isBrowser(ie, current), isOpera: isBrowser(opera, current), isFirefox: isBrowser(firefox, current), isSafari: isBrowser(safari, current) }; }; var Browser = { unknown: unknown$1, nu: nu$1, edge: constant(edge), chrome: constant(chrome), ie: constant(ie), opera: constant(opera), firefox: constant(firefox), safari: constant(safari) }; var windows = 'Windows'; var ios = 'iOS'; var android = 'Android'; var linux = 'Linux'; var osx = 'OSX'; var solaris = 'Solaris'; var freebsd = 'FreeBSD'; var isOS = function (name, current) { return function () { return current === name; }; }; var unknown$2 = function () { return nu$2({ current: undefined, version: Version.unknown() }); }; var nu$2 = function (info) { var current = info.current; var version = info.version; return { current: current, version: version, isWindows: isOS(windows, current), isiOS: isOS(ios, current), isAndroid: isOS(android, current), isOSX: isOS(osx, current), isLinux: isOS(linux, current), isSolaris: isOS(solaris, current), isFreeBSD: isOS(freebsd, current) }; }; var OperatingSystem = { unknown: unknown$2, nu: nu$2, windows: constant(windows), ios: constant(ios), android: constant(android), linux: constant(linux), osx: constant(osx), solaris: constant(solaris), freebsd: constant(freebsd) }; var DeviceType = function (os, browser, userAgent) { var isiPad = os.isiOS() && /ipad/i.test(userAgent) === true; var isiPhone = os.isiOS() && !isiPad; var isAndroid3 = os.isAndroid() && os.version.major === 3; var isAndroid4 = os.isAndroid() && os.version.major === 4; var isTablet = isiPad || isAndroid3 || isAndroid4 && /mobile/i.test(userAgent) === true; var isTouch = os.isiOS() || os.isAndroid(); var isPhone = isTouch && !isTablet; var iOSwebview = browser.isSafari() && os.isiOS() && /safari/i.test(userAgent) === false; return { isiPad: constant(isiPad), isiPhone: constant(isiPhone), isTablet: constant(isTablet), isPhone: constant(isPhone), isTouch: constant(isTouch), isAndroid: os.isAndroid, isiOS: os.isiOS, isWebView: constant(iOSwebview) }; }; var detect$1 = function (candidates, userAgent) { var agent = String(userAgent).toLowerCase(); return find(candidates, function (candidate) { return candidate.search(agent); }); }; var detectBrowser = function (browsers, userAgent) { return detect$1(browsers, userAgent).map(function (browser) { var version = Version.detect(browser.versionRegexes, userAgent); return { current: browser.name, version: version }; }); }; var detectOs = function (oses, userAgent) { return detect$1(oses, userAgent).map(function (os) { var version = Version.detect(os.versionRegexes, userAgent); return { current: os.name, version: version }; }); }; var UaString = { detectBrowser: detectBrowser, detectOs: detectOs }; var normalVersionRegex = /.*?version\/\ ?([0-9]+)\.([0-9]+).*/; var checkContains = function (target) { return function (uastring) { return contains$1(uastring, target); }; }; var browsers = [ { name: 'Edge', versionRegexes: [/.*?edge\/ ?([0-9]+)\.([0-9]+)$/], search: function (uastring) { return contains$1(uastring, 'edge/') && contains$1(uastring, 'chrome') && contains$1(uastring, 'safari') && contains$1(uastring, 'applewebkit'); } }, { name: 'Chrome', versionRegexes: [ /.*?chrome\/([0-9]+)\.([0-9]+).*/, normalVersionRegex ], search: function (uastring) { return contains$1(uastring, 'chrome') && !contains$1(uastring, 'chromeframe'); } }, { name: 'IE', versionRegexes: [ /.*?msie\ ?([0-9]+)\.([0-9]+).*/, /.*?rv:([0-9]+)\.([0-9]+).*/ ], search: function (uastring) { return contains$1(uastring, 'msie') || contains$1(uastring, 'trident'); } }, { name: 'Opera', versionRegexes: [ normalVersionRegex, /.*?opera\/([0-9]+)\.([0-9]+).*/ ], search: checkContains('opera') }, { name: 'Firefox', versionRegexes: [/.*?firefox\/\ ?([0-9]+)\.([0-9]+).*/], search: checkContains('firefox') }, { name: 'Safari', versionRegexes: [ normalVersionRegex, /.*?cpu os ([0-9]+)_([0-9]+).*/ ], search: function (uastring) { return (contains$1(uastring, 'safari') || contains$1(uastring, 'mobile/')) && contains$1(uastring, 'applewebkit'); } } ]; var oses = [ { name: 'Windows', search: checkContains('win'), versionRegexes: [/.*?windows\ nt\ ?([0-9]+)\.([0-9]+).*/] }, { name: 'iOS', search: function (uastring) { return contains$1(uastring, 'iphone') || contains$1(uastring, 'ipad'); }, versionRegexes: [ /.*?version\/\ ?([0-9]+)\.([0-9]+).*/, /.*cpu os ([0-9]+)_([0-9]+).*/, /.*cpu iphone os ([0-9]+)_([0-9]+).*/ ] }, { name: 'Android', search: checkContains('android'), versionRegexes: [/.*?android\ ?([0-9]+)\.([0-9]+).*/] }, { name: 'OSX', search: checkContains('os x'), versionRegexes: [/.*?os\ x\ ?([0-9]+)_([0-9]+).*/] }, { name: 'Linux', search: checkContains('linux'), versionRegexes: [] }, { name: 'Solaris', search: checkContains('sunos'), versionRegexes: [] }, { name: 'FreeBSD', search: checkContains('freebsd'), versionRegexes: [] } ]; var PlatformInfo = { browsers: constant(browsers), oses: constant(oses) }; var detect$2 = function (userAgent) { var browsers = PlatformInfo.browsers(); var oses = PlatformInfo.oses(); var browser = UaString.detectBrowser(browsers, userAgent).fold(Browser.unknown, Browser.nu); var os = UaString.detectOs(oses, userAgent).fold(OperatingSystem.unknown, OperatingSystem.nu); var deviceType = DeviceType(os, browser, userAgent); return { browser: browser, os: os, deviceType: deviceType }; }; var PlatformDetection = { detect: detect$2 }; var detect$3 = cached(function () { var userAgent = domGlobals.navigator.userAgent; return PlatformDetection.detect(userAgent); }); var PlatformDetection$1 = { detect: detect$3 }; var ELEMENT$1 = ELEMENT; var DOCUMENT$1 = DOCUMENT; var is = function (element, selector) { var dom = element.dom(); if (dom.nodeType !== ELEMENT$1) { return false; } else { var elem = dom; if (elem.matches !== undefined) { return elem.matches(selector); } else if (elem.msMatchesSelector !== undefined) { return elem.msMatchesSelector(selector); } else if (elem.webkitMatchesSelector !== undefined) { return elem.webkitMatchesSelector(selector); } else if (elem.mozMatchesSelector !== undefined) { return elem.mozMatchesSelector(selector); } else { throw new Error('Browser lacks native selectors'); } } }; var bypassSelector = function (dom) { return dom.nodeType !== ELEMENT$1 && dom.nodeType !== DOCUMENT$1 || dom.childElementCount === 0; }; var all = function (selector, scope) { var base = scope === undefined ? domGlobals.document : scope.dom(); return bypassSelector(base) ? [] : map(base.querySelectorAll(selector), Element.fromDom); }; var one = function (selector, scope) { var base = scope === undefined ? domGlobals.document : scope.dom(); return bypassSelector(base) ? Option.none() : Option.from(base.querySelector(selector)).map(Element.fromDom); }; var eq = function (e1, e2) { return e1.dom() === e2.dom(); }; var regularContains = function (e1, e2) { var d1 = e1.dom(); var d2 = e2.dom(); return d1 === d2 ? false : d1.contains(d2); }; var ieContains = function (e1, e2) { return Node.documentPositionContainedBy(e1.dom(), e2.dom()); }; var browser = PlatformDetection$1.detect().browser; var contains$2 = browser.isIE() ? ieContains : regularContains; var is$1 = is; var owner = function (element) { return Element.fromDom(element.dom().ownerDocument); }; var defaultView = function (element) { return Element.fromDom(element.dom().ownerDocument.defaultView); }; var parent = function (element) { return Option.from(element.dom().parentNode).map(Element.fromDom); }; var parents = function (element, isRoot) { var stop = isFunction(isRoot) ? isRoot : never; var dom = element.dom(); var ret = []; while (dom.parentNode !== null && dom.parentNode !== undefined) { var rawParent = dom.parentNode; var p = Element.fromDom(rawParent); ret.push(p); if (stop(p) === true) { break; } else { dom = rawParent; } } return ret; }; var prevSibling = function (element) { return Option.from(element.dom().previousSibling).map(Element.fromDom); }; var nextSibling = function (element) { return Option.from(element.dom().nextSibling).map(Element.fromDom); }; var children = function (element) { return map(element.dom().childNodes, Element.fromDom); }; var child = function (element, index) { var cs = element.dom().childNodes; return Option.from(cs[index]).map(Element.fromDom); }; var firstChild = function (element) { return child(element, 0); }; var spot = Immutable('element', 'offset'); var before = function (marker, element) { var parent$1 = parent(marker); parent$1.each(function (v) { v.dom().insertBefore(element.dom(), marker.dom()); }); }; var after = function (marker, element) { var sibling = nextSibling(marker); sibling.fold(function () { var parent$1 = parent(marker); parent$1.each(function (v) { append(v, element); }); }, function (v) { before(v, element); }); }; var prepend = function (parent, element) { var firstChild$1 = firstChild(parent); firstChild$1.fold(function () { append(parent, element); }, function (v) { parent.dom().insertBefore(element.dom(), v.dom()); }); }; var append = function (parent, element) { parent.dom().appendChild(element.dom()); }; var wrap = function (element, wrapper) { before(element, wrapper); append(wrapper, element); }; var before$1 = function (marker, elements) { each(elements, function (x) { before(marker, x); }); }; var after$1 = function (marker, elements) { each(elements, function (x, i) { var e = i === 0 ? marker : elements[i - 1]; after(e, x); }); }; var append$1 = function (parent, elements) { each(elements, function (x) { append(parent, x); }); }; var empty = function (element) { element.dom().textContent = ''; each(children(element), function (rogue) { remove$2(rogue); }); }; var remove$2 = function (element) { var dom = element.dom(); if (dom.parentNode !== null) { dom.parentNode.removeChild(dom); } }; var unwrap = function (wrapper) { var children$1 = children(wrapper); if (children$1.length > 0) { before$1(wrapper, children$1); } remove$2(wrapper); }; var dimension = Immutable('width', 'height'); var dimensions = Immutable('width', 'height'); var grid = Immutable('rows', 'columns'); var address = Immutable('row', 'column'); var coords = Immutable('x', 'y'); var detail = Immutable('element', 'rowspan', 'colspan'); var detailnew = Immutable('element', 'rowspan', 'colspan', 'isNew'); var extended = Immutable('element', 'rowspan', 'colspan', 'row', 'column'); var rowdata = Immutable('element', 'cells', 'section'); var elementnew = Immutable('element', 'isNew'); var rowdatanew = Immutable('element', 'cells', 'section', 'isNew'); var rowcells = Immutable('cells', 'section'); var rowdetails = Immutable('details', 'section'); var bounds = Immutable('startRow', 'startCol', 'finishRow', 'finishCol'); var ancestors = function (scope, predicate, isRoot) { return filter(parents(scope, isRoot), predicate); }; var children$1 = function (scope, predicate) { return filter(children(scope), predicate); }; var descendants = function (scope, predicate) { var result = []; each(children(scope), function (x) { if (predicate(x)) { result = result.concat([x]); } result = result.concat(descendants(x, predicate)); }); return result; }; var ancestors$1 = function (scope, selector, isRoot) { return ancestors(scope, function (e) { return is(e, selector); }, isRoot); }; var children$2 = function (scope, selector) { return children$1(scope, function (e) { return is(e, selector); }); }; var descendants$1 = function (scope, selector) { return all(selector, scope); }; function ClosestOrAncestor (is, ancestor, scope, a, isRoot) { return is(scope, a) ? Option.some(scope) : isFunction(isRoot) && isRoot(scope) ? Option.none() : ancestor(scope, a, isRoot); } var ancestor = function (scope, predicate, isRoot) { var element = scope.dom(); var stop = isFunction(isRoot) ? isRoot : constant(false); while (element.parentNode) { element = element.parentNode; var el = Element.fromDom(element); if (predicate(el)) { return Option.some(el); } else if (stop(el)) { break; } } return Option.none(); }; var closest = function (scope, predicate, isRoot) { var is = function (s, test) { return test(s); }; return ClosestOrAncestor(is, ancestor, scope, predicate, isRoot); }; var child$1 = function (scope, predicate) { var pred = function (node) { return predicate(Element.fromDom(node)); }; var result = find(scope.dom().childNodes, pred); return result.map(Element.fromDom); }; var descendant = function (scope, predicate) { var descend = function (node) { for (var i = 0; i < node.childNodes.length; i++) { var child_1 = Element.fromDom(node.childNodes[i]); if (predicate(child_1)) { return Option.some(child_1); } var res = descend(node.childNodes[i]); if (res.isSome()) { return res; } } return Option.none(); }; return descend(scope.dom()); }; var ancestor$1 = function (scope, selector, isRoot) { return ancestor(scope, function (e) { return is(e, selector); }, isRoot); }; var child$2 = function (scope, selector) { return child$1(scope, function (e) { return is(e, selector); }); }; var descendant$1 = function (scope, selector) { return one(selector, scope); }; var closest$1 = function (scope, selector, isRoot) { return ClosestOrAncestor(is, ancestor$1, scope, selector, isRoot); }; var firstLayer = function (scope, selector) { return filterFirstLayer(scope, selector, constant(true)); }; var filterFirstLayer = function (scope, selector, predicate) { return bind(children(scope), function (x) { return is(x, selector) ? predicate(x) ? [x] : [] : filterFirstLayer(x, selector, predicate); }); }; var LayerSelector = { firstLayer: firstLayer, filterFirstLayer: filterFirstLayer }; var lookup = function (tags, element, isRoot) { if (isRoot === void 0) { isRoot = never; } if (isRoot(element)) { return Option.none(); } if (contains(tags, name(element))) { return Option.some(element); } var isRootOrUpperTable = function (elm) { return is(elm, 'table') || isRoot(elm); }; return ancestor$1(element, tags.join(','), isRootOrUpperTable); }; var cell = function (element, isRoot) { return lookup([ 'td', 'th' ], element, isRoot); }; var cells = function (ancestor) { return LayerSelector.firstLayer(ancestor, 'th,td'); }; var notCell = function (element, isRoot) { return lookup([ 'caption', 'tr', 'tbody', 'tfoot', 'thead' ], element, isRoot); }; var neighbours = function (selector, element) { return parent(element).map(function (parent) { return children$2(parent, selector); }); }; var neighbourCells = curry(neighbours, 'th,td'); var neighbourRows = curry(neighbours, 'tr'); var firstCell = function (ancestor) { return descendant$1(ancestor, 'th,td'); }; var table = function (element, isRoot) { return closest$1(element, 'table', isRoot); }; var row = function (element, isRoot) { return lookup(['tr'], element, isRoot); }; var rows = function (ancestor) { return LayerSelector.firstLayer(ancestor, 'tr'); }; var attr = function (element, property) { return parseInt(get(element, property), 10); }; var grid$1 = function (element, rowProp, colProp) { var rowsCount = attr(element, rowProp); var cols = attr(element, colProp); return grid(rowsCount, cols); }; var TableLookup = { cell: cell, firstCell: firstCell, cells: cells, neighbourCells: neighbourCells, table: table, row: row, rows: rows, notCell: notCell, neighbourRows: neighbourRows, attr: attr, grid: grid$1 }; var fromTable = function (table) { var rows = TableLookup.rows(table); return map(rows, function (row) { var element = row; var parent$1 = parent(element); var parentSection = parent$1.map(function (p) { var parentName = name(p); return parentName === 'tfoot' || parentName === 'thead' || parentName === 'tbody' ? parentName : 'tbody'; }).getOr('tbody'); var cells = map(TableLookup.cells(row), function (cell) { var rowspan = has(cell, 'rowspan') ? parseInt(get(cell, 'rowspan'), 10) : 1; var colspan = has(cell, 'colspan') ? parseInt(get(cell, 'colspan'), 10) : 1; return detail(cell, rowspan, colspan); }); return rowdata(element, cells, parentSection); }); }; var fromPastedRows = function (rows, example) { return map(rows, function (row) { var cells = map(TableLookup.cells(row), function (cell) { var rowspan = has(cell, 'rowspan') ? parseInt(get(cell, 'rowspan'), 10) : 1; var colspan = has(cell, 'colspan') ? parseInt(get(cell, 'colspan'), 10) : 1; return detail(cell, rowspan, colspan); }); return rowdata(row, cells, example.section()); }); }; var DetailsList = { fromTable: fromTable, fromPastedRows: fromPastedRows }; var key = function (row, column) { return row + ',' + column; }; var getAt = function (warehouse, row, column) { var raw = warehouse.access()[key(row, column)]; return raw !== undefined ? Option.some(raw) : Option.none(); }; var findItem = function (warehouse, item, comparator) { var filtered = filterItems(warehouse, function (detail) { return comparator(item, detail.element()); }); return filtered.length > 0 ? Option.some(filtered[0]) : Option.none(); }; var filterItems = function (warehouse, predicate) { var all = bind(warehouse.all(), function (r) { return r.cells(); }); return filter(all, predicate); }; var generate = function (list) { var access = {}; var cells = []; var maxRows = list.length; var maxColumns = 0; each(list, function (details, r) { var currentRow = []; each(details.cells(), function (detail) { var start = 0; while (access[key(r, start)] !== undefined) { start++; } var current = extended(detail.element(), detail.rowspan(), detail.colspan(), r, start); for (var i = 0; i < detail.colspan(); i++) { for (var j = 0; j < detail.rowspan(); j++) { var cr = r + j; var cc = start + i; var newpos = key(cr, cc); access[newpos] = current; maxColumns = Math.max(maxColumns, cc + 1); } } currentRow.push(current); }); cells.push(rowdata(details.element(), currentRow, details.section())); }); var grid$1 = grid(maxRows, maxColumns); return { grid: constant(grid$1), access: constant(access), all: constant(cells) }; }; var justCells = function (warehouse) { var rows = map(warehouse.all(), function (w) { return w.cells(); }); return flatten(rows); }; var Warehouse = { generate: generate, getAt: getAt, findItem: findItem, filterItems: filterItems, justCells: justCells }; var statsStruct = Immutable('minRow', 'minCol', 'maxRow', 'maxCol'); var findSelectedStats = function (house, isSelected) { var totalColumns = house.grid().columns(); var totalRows = house.grid().rows(); var minRow = totalRows; var minCol = totalColumns; var maxRow = 0; var maxCol = 0; each$1(house.access(), function (detail) { if (isSelected(detail)) { var startRow = detail.row(); var endRow = startRow + detail.rowspan() - 1; var startCol = detail.column(); var endCol = startCol + detail.colspan() - 1; if (startRow < minRow) { minRow = startRow; } else if (endRow > maxRow) { maxRow = endRow; } if (startCol < minCol) { minCol = startCol; } else if (endCol > maxCol) { maxCol = endCol; } } }); return statsStruct(minRow, minCol, maxRow, maxCol); }; var makeCell = function (list, seenSelected, rowIndex) { var row = list[rowIndex].element(); var td = Element.fromTag('td'); append(td, Element.fromTag('br')); var f = seenSelected ? append : prepend; f(row, td); }; var fillInGaps = function (list, house, stats, isSelected) { var totalColumns = house.grid().columns(); var totalRows = house.grid().rows(); for (var i = 0; i < totalRows; i++) { var seenSelected = false; for (var j = 0; j < totalColumns; j++) { if (!(i < stats.minRow() || i > stats.maxRow() || j < stats.minCol() || j > stats.maxCol())) { var needCell = Warehouse.getAt(house, i, j).filter(isSelected).isNone(); if (needCell) { makeCell(list, seenSelected, i); } else { seenSelected = true; } } } } }; var clean = function (table, stats) { var emptyRows = filter(LayerSelector.firstLayer(table, 'tr'), function (row) { return row.dom().childElementCount === 0; }); each(emptyRows, remove$2); if (stats.minCol() === stats.maxCol() || stats.minRow() === stats.maxRow()) { each(LayerSelector.firstLayer(table, 'th,td'), function (cell) { remove(cell, 'rowspan'); remove(cell, 'colspan'); }); } remove(table, 'width'); remove(table, 'height'); remove$1(table, 'width'); remove$1(table, 'height'); }; var extract = function (table, selectedSelector) { var isSelected = function (detail) { return is(detail.element(), selectedSelector); }; var list = DetailsList.fromTable(table); var house = Warehouse.generate(list); var stats = findSelectedStats(house, isSelected); var selector = 'th:not(' + selectedSelector + ')' + ',td:not(' + selectedSelector + ')'; var unselectedCells = LayerSelector.filterFirstLayer(table, 'th,td', function (cell) { return is(cell, selector); }); each(unselectedCells, remove$2); fillInGaps(list, house, stats, isSelected); clean(table, stats); return table; }; var CopySelected = { extract: extract }; function NodeValue (is, name) { var get = function (element) { if (!is(element)) { throw new Error('Can only get ' + name + ' value of a ' + name + ' node'); } return getOption(element).getOr(''); }; var getOption = function (element) { return is(element) ? Option.from(element.dom().nodeValue) : Option.none(); }; var set = function (element, value) { if (!is(element)) { throw new Error('Can only set raw ' + name + ' value of a ' + name + ' node'); } element.dom().nodeValue = value; }; return { get: get, getOption: getOption, set: set }; } var api = NodeValue(isText, 'text'); var get$2 = function (element) { return api.get(element); }; var getOption = function (element) { return api.getOption(element); }; var set$2 = function (element, value) { api.set(element, value); }; var getEnd = function (element) { return name(element) === 'img' ? 1 : getOption(element).fold(function () { return children(element).length; }, function (v) { return v.length; }); }; var NBSP = '\xA0'; var isTextNodeWithCursorPosition = function (el) { return getOption(el).filter(function (text) { return text.trim().length !== 0 || text.indexOf(NBSP) > -1; }).isSome(); }; var elementsWithCursorPosition = [ 'img', 'br' ]; var isCursorPosition = function (elem) { var hasCursorPosition = isTextNodeWithCursorPosition(elem); return hasCursorPosition || contains(elementsWithCursorPosition, name(elem)); }; var first = function (element) { return descendant(element, isCursorPosition); }; var last$1 = function (element) { return descendantRtl(element, isCursorPosition); }; var descendantRtl = function (scope, predicate) { var descend = function (element) { var children$1 = children(element); for (var i = children$1.length - 1; i >= 0; i--) { var child = children$1[i]; if (predicate(child)) { return Option.some(child); } var res = descend(child); if (res.isSome()) { return res; } } return Option.none(); }; return descend(scope); }; var clone$1 = function (original, isDeep) { return Element.fromDom(original.dom().cloneNode(isDeep)); }; var shallow = function (original) { return clone$1(original, false); }; var deep = function (original) { return clone$1(original, true); }; var shallowAs = function (original, tag) { var nu = Element.fromTag(tag); var attributes = clone(original); setAll(nu, attributes); return nu; }; var copy$1 = function (original, tag) { var nu = shallowAs(original, tag); var cloneChildren = children(deep(original)); append$1(nu, cloneChildren); return nu; }; var createCell = function () { var td = Element.fromTag('td'); append(td, Element.fromTag('br')); return td; }; var replace = function (cell, tag, attrs) { var replica = copy$1(cell, tag); each$1(attrs, function (v, k) { if (v === null) { remove(replica, k); } else { set(replica, k, v); } }); return replica; }; var pasteReplace = function (cell) { return cell; }; var newRow = function (doc) { return function () { return Element.fromTag('tr', doc.dom()); }; }; var cloneFormats = function (oldCell, newCell, formats) { var first$1 = first(oldCell); return first$1.map(function (firstText) { var formatSelector = formats.join(','); var parents = ancestors$1(firstText, formatSelector, function (element) { return eq(element, oldCell); }); return foldr(parents, function (last, parent) { var clonedFormat = shallow(parent); remove(clonedFormat, 'contenteditable'); append(last, clonedFormat); return clonedFormat; }, newCell); }).getOr(newCell); }; var cellOperations = function (mutate, doc, formatsToClone) { var newCell = function (prev) { var docu = owner(prev.element()); var td = Element.fromTag(name(prev.element()), docu.dom()); var formats = formatsToClone.getOr([ 'strong', 'em', 'b', 'i', 'span', 'font', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'p', 'div' ]); var lastNode = formats.length > 0 ? cloneFormats(prev.element(), td, formats) : td; append(lastNode, Element.fromTag('br')); copy(prev.element(), td); remove$1(td, 'height'); if (prev.colspan() !== 1) { remove$1(prev.element(), 'width'); } mutate(prev.element(), td); return td; }; return { row: newRow(doc), cell: newCell, replace: replace, gap: createCell }; }; var paste = function (doc) { return { row: newRow(doc), cell: createCell, replace: pasteReplace, gap: createCell }; }; var TableFill = { cellOperations: cellOperations, paste: paste }; var fromHtml$1 = function (html, scope) { var doc = scope || domGlobals.document; var div = doc.createElement('div'); div.innerHTML = html; return children(Element.fromDom(div)); }; var inSelection = function (bounds, detail) { var leftEdge = detail.column(); var rightEdge = detail.column() + detail.colspan() - 1; var topEdge = detail.row(); var bottomEdge = detail.row() + detail.rowspan() - 1; return leftEdge <= bounds.finishCol() && rightEdge >= bounds.startCol() && (topEdge <= bounds.finishRow() && bottomEdge >= bounds.startRow()); }; var isWithin = function (bounds, detail) { return detail.column() >= bounds.startCol() && detail.column() + detail.colspan() - 1 <= bounds.finishCol() && detail.row() >= bounds.startRow() && detail.row() + detail.rowspan() - 1 <= bounds.finishRow(); }; var isRectangular = function (warehouse, bounds) { var isRect = true; var detailIsWithin = curry(isWithin, bounds); for (var i = bounds.startRow(); i <= bounds.finishRow(); i++) { for (var j = bounds.startCol(); j <= bounds.finishCol(); j++) { isRect = isRect && Warehouse.getAt(warehouse, i, j).exists(detailIsWithin); } } return isRect ? Option.some(bounds) : Option.none(); }; var CellBounds = { inSelection: inSelection, isWithin: isWithin, isRectangular: isRectangular }; var getBounds = function (detailA, detailB) { return bounds(Math.min(detailA.row(), detailB.row()), Math.min(detailA.column(), detailB.column()), Math.max(detailA.row() + detailA.rowspan() - 1, detailB.row() + detailB.rowspan() - 1), Math.max(detailA.column() + detailA.colspan() - 1, detailB.column() + detailB.colspan() - 1)); }; var getAnyBox = function (warehouse, startCell, finishCell) { var startCoords = Warehouse.findItem(warehouse, startCell, eq); var finishCoords = Warehouse.findItem(warehouse, finishCell, eq); return startCoords.bind(function (sc) { return finishCoords.map(function (fc) { return getBounds(sc, fc); }); }); }; var getBox = function (warehouse, startCell, finishCell) { return getAnyBox(warehouse, startCell, finishCell).bind(function (bounds) { return CellBounds.isRectangular(warehouse, bounds); }); }; var CellGroup = { getAnyBox: getAnyBox, getBox: getBox }; var moveBy = function (warehouse, cell, row, column) { return Warehouse.findItem(warehouse, cell, eq).bind(function (detail) { var startRow = row > 0 ? detail.row() + detail.rowspan() - 1 : detail.row(); var startCol = column > 0 ? detail.column() + detail.colspan() - 1 : detail.column(); var dest = Warehouse.getAt(warehouse, startRow + row, startCol + column); return dest.map(function (d) { return d.element(); }); }); }; var intercepts = function (warehouse, start, finish) { return CellGroup.getAnyBox(warehouse, start, finish).map(function (bounds) { var inside = Warehouse.filterItems(warehouse, curry(CellBounds.inSelection, bounds)); return map(inside, function (detail) { return detail.element(); }); }); }; var parentCell = function (warehouse, innerCell) { var isContainedBy = function (c1, c2) { return contains$2(c2, c1); }; return Warehouse.findItem(warehouse, innerCell, isContainedBy).map(function (detail) { return detail.element(); }); }; var CellFinder = { moveBy: moveBy, intercepts: intercepts, parentCell: parentCell }; var moveBy$1 = function (cell, deltaRow, deltaColumn) { return TableLookup.table(cell).bind(function (table) { var warehouse = getWarehouse(table); return CellFinder.moveBy(warehouse, cell, deltaRow, deltaColumn); }); }; var intercepts$1 = function (table, first, last) { var warehouse = getWarehouse(table); return CellFinder.intercepts(warehouse, first, last); }; var nestedIntercepts = function (table, first, firstTable, last, lastTable) { var warehouse = getWarehouse(table); var optStartCell = eq(table, firstTable) ? Option.some(first) : CellFinder.parentCell(warehouse, first); var optLastCell = eq(table, lastTable) ? Option.some(last) : CellFinder.parentCell(warehouse, last); return optStartCell.bind(function (startCell) { return optLastCell.bind(function (lastCell) { return CellFinder.intercepts(warehouse, startCell, lastCell); }); }); }; var getBox$1 = function (table, first, last) { var warehouse = getWarehouse(table); return CellGroup.getBox(warehouse, first, last); }; var getWarehouse = function (table) { var list = DetailsList.fromTable(table); return Warehouse.generate(list); }; var TablePositions = { moveBy: moveBy$1, intercepts: intercepts$1, nestedIntercepts: nestedIntercepts, getBox: getBox$1 }; var TagBoundaries = [ 'body', 'p', 'div', 'article', 'aside', 'figcaption', 'figure', 'footer', 'header', 'nav', 'section', 'ol', 'ul', 'li', 'table', 'thead', 'tbody', 'tfoot', 'caption', 'tr', 'td', 'th', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'blockquote', 'pre', 'address' ]; function DomUniverse () { var clone$1 = function (element) { return Element.fromDom(element.dom().cloneNode(false)); }; var document = function (element) { return element.dom().ownerDocument; }; var isBoundary = function (element) { if (!isElement(element)) { return false; } if (name(element) === 'body') { return true; } return contains(TagBoundaries, name(element)); }; var isEmptyTag = function (element) { if (!isElement(element)) { return false; } return contains([ 'br', 'img', 'hr', 'input' ], name(element)); }; var comparePosition = function (element, other) { return element.dom().compareDocumentPosition(other.dom()); }; var copyAttributesTo = function (source, destination) { var as = clone(source); setAll(destination, as); }; return { up: constant({ selector: ancestor$1, closest: closest$1, predicate: ancestor, all: parents }), down: constant({ selector: descendants$1, predicate: descendants }), styles: constant({ get: get$1, getRaw: getRaw, set: set$1, remove: remove$1 }), attrs: constant({ get: get, set: set, remove: remove, copyTo: copyAttributesTo }), insert: constant({ before: before, after: after, afterAll: after$1, append: append, appendAll: append$1, prepend: prepend, wrap: wrap }), remove: constant({ unwrap: unwrap, remove: remove$2 }), create: constant({ nu: Element.fromTag, clone: clone$1, text: Element.fromText }), query: constant({ comparePosition: comparePosition, prevSibling: prevSibling, nextSibling: nextSibling }), property: constant({ children: children, name: name, parent: parent, document: document, isText: isText, isComment: isComment, isElement: isElement, getText: get$2, setText: set$2, isBoundary: isBoundary, isEmptyTag: isEmptyTag }), eq: eq, is: is$1 }; } var leftRight = Immutable('left', 'right'); var brokenPath = Immutable('first', 'second', 'splits'); var bisect = function (universe, parent, child) { var children = universe.property().children(parent); var index = findIndex(children, curry(universe.eq, child)); return index.map(function (ind) { return { before: constant(children.slice(0, ind)), after: constant(children.slice(ind + 1)) }; }); }; var breakToRight = function (universe, parent, child) { return bisect(universe, parent, child).map(function (parts) { var second = universe.create().clone(parent); universe.insert().appendAll(second, parts.after()); universe.insert().after(parent, second); return leftRight(parent, second); }); }; var breakToLeft = function (universe, parent, child) { return bisect(universe, parent, child).map(function (parts) { var prior = universe.create().clone(parent); universe.insert().appendAll(prior, parts.before().concat([child])); universe.insert().appendAll(parent, parts.after()); universe.insert().before(parent, prior); return leftRight(prior, parent); }); }; var breakPath = function (universe, item, isTop, breaker) { var next = function (child, group, splits) { var fallback = brokenPath(child, Option.none(), splits); if (isTop(child)) { return brokenPath(child, group, splits); } else { return universe.property().parent(child).bind(function (parent) { return breaker(universe, parent, child).map(function (breakage) { var extra = [{ first: breakage.left, second: breakage.right }]; var nextChild = isTop(parent) ? parent : breakage.left(); return next(nextChild, Option.some(breakage.right()), splits.concat(extra)); }); }).getOr(fallback); } }; return next(item, Option.none(), []); }; var all$1 = function (universe, look, elements, f) { var head = elements[0]; var tail = elements.slice(1); return f(universe, look, head, tail); }; var oneAll = function (universe, look, elements) { return elements.length > 0 ? all$1(universe, look, elements, unsafeOne) : Option.none(); }; var unsafeOne = function (universe, look, head, tail) { var start = look(universe, head); return foldr(tail, function (b, a) { var current = look(universe, a); return commonElement(universe, b, current); }, start); }; var commonElement = function (universe, start, end) { return start.bind(function (s) { return end.filter(curry(universe.eq, s)); }); }; var eq$1 = function (universe, item) { return curry(universe.eq, item); }; var unsafeSubset = function (universe, common, ps1, ps2) { var children = universe.property().children(common); if (universe.eq(common, ps1[0])) { return Option.some([ps1[0]]); } if (universe.eq(common, ps2[0])) { return Option.some([ps2[0]]); } var finder = function (ps) { var topDown = reverse(ps); var index = findIndex(topDown, eq$1(universe, common)).getOr(-1); var item = index < topDown.length - 1 ? topDown[index + 1] : topDown[index]; return findIndex(children, eq$1(universe, item)); }; var startIndex = finder(ps1); var endIndex = finder(ps2); return startIndex.bind(function (sIndex) { return endIndex.map(function (eIndex) { var first = Math.min(sIndex, eIndex); var last = Math.max(sIndex, eIndex); return children.slice(first, last + 1); }); }); }; var ancestors$2 = function (universe, start, end, isRoot) { if (isRoot === void 0) { isRoot = never; } var ps1 = [start].concat(universe.up().all(start)); var ps2 = [end].concat(universe.up().all(end)); var prune = function (path) { var index = findIndex(path, isRoot); return index.fold(function () { return path; }, function (ind) { return path.slice(0, ind + 1); }); }; var pruned1 = prune(ps1); var pruned2 = prune(ps2); var shared = find(pruned1, function (x) { return exists(pruned2, eq$1(universe, x)); }); return { firstpath: constant(pruned1), secondpath: constant(pruned2), shared: constant(shared) }; }; var subset = function (universe, start, end) { var ancs = ancestors$2(universe, start, end); return ancs.shared().bind(function (shared) { return unsafeSubset(universe, shared, ancs.firstpath(), ancs.secondpath()); }); }; var SubsetFn = { subset: subset, ancestors: ancestors$2 }; var sharedOne = oneAll; var subset$1 = SubsetFn.subset; var ancestors$3 = SubsetFn.ancestors; var breakToLeft$1 = breakToLeft; var breakToRight$1 = breakToRight; var breakPath$1 = breakPath; var Parent = { sharedOne: sharedOne, subset: subset$1, ancestors: ancestors$3, breakToLeft: breakToLeft$1, breakToRight: breakToRight$1, breakPath: breakPath$1 }; var universe = DomUniverse(); var sharedOne$1 = function (look, elements) { return Parent.sharedOne(universe, function (_universe, element) { return look(element); }, elements); }; var subset$2 = function (start, finish) { return Parent.subset(universe, start, finish); }; var ancestors$4 = function (start, finish, isRoot) { return Parent.ancestors(universe, start, finish, isRoot); }; var breakToLeft$2 = function (parent, child) { return Parent.breakToLeft(universe, parent, child); }; var breakToRight$2 = function (parent, child) { return Parent.breakToRight(universe, parent, child); }; var breakPath$2 = function (child, isTop, breaker) { return Parent.breakPath(universe, child, isTop, function (u, p, c) { return breaker(p, c); }); }; var DomParent = { sharedOne: sharedOne$1, subset: subset$2, ancestors: ancestors$4, breakToLeft: breakToLeft$2, breakToRight: breakToRight$2, breakPath: breakPath$2 }; var create = MixedBag([ 'boxes', 'start', 'finish' ], []); var Identified = { create: create }; var lookupTable = function (container) { return ancestor$1(container, 'table'); }; var identify = function (start, finish, isRoot) { var getIsRoot = function (rootTable) { return function (element) { return isRoot !== undefined && isRoot(element) || eq(element, rootTable); }; }; if (eq(start, finish)) { return Option.some(Identified.create({ boxes: Option.some([start]), start: start, finish: finish })); } else { return lookupTable(start).bind(function (startTable) { return lookupTable(finish).bind(function (finishTable) { if (eq(startTable, finishTable)) { return Option.some(Identified.create({ boxes: TablePositions.intercepts(startTable, start, finish), start: start, finish: finish })); } else if (contains$2(startTable, finishTable)) { var ancestorCells = ancestors$1(finish, 'td,th', getIsRoot(startTable)); var finishCell = ancestorCells.length > 0 ? ancestorCells[ancestorCells.length - 1] : finish; return Option.some(Identified.create({ boxes: TablePositions.nestedIntercepts(startTable, start, startTable, finish, finishTable), start: start, finish: finishCell })); } else if (contains$2(finishTable, startTable)) { var ancestorCells = ancestors$1(start, 'td,th', getIsRoot(finishTable)); var startCell = ancestorCells.length > 0 ? ancestorCells[ancestorCells.length - 1] : start; return Option.some(Identified.create({ boxes: TablePositions.nestedIntercepts(finishTable, start, startTable, finish, finishTable), start: start, finish: startCell })); } else { return DomParent.ancestors(start, finish).shared().bind(function (lca) { return closest$1(lca, 'table', isRoot).bind(function (lcaTable) { var finishAncestorCells = ancestors$1(finish, 'td,th', getIsRoot(lcaTable)); var finishCell = finishAncestorCells.length > 0 ? finishAncestorCells[finishAncestorCells.length - 1] : finish; var startAncestorCells = ancestors$1(start, 'td,th', getIsRoot(lcaTable)); var startCell = startAncestorCells.length > 0 ? startAncestorCells[startAncestorCells.length - 1] : start; return Option.some(Identified.create({ boxes: TablePositions.nestedIntercepts(lcaTable, start, startTable, finish, finishTable), start: startCell, finish: finishCell })); }); }); } }); }); } }; var retrieve = function (container, selector) { var sels = descendants$1(container, selector); return sels.length > 0 ? Option.some(sels) : Option.none(); }; var getLast = function (boxes, lastSelectedSelector) { return find(boxes, function (box) { return is(box, lastSelectedSelector); }); }; var getEdges = function (container, firstSelectedSelector, lastSelectedSelector) { return descendant$1(container, firstSelectedSelector).bind(function (first) { return descendant$1(container, lastSelectedSelector).bind(function (last) { return DomParent.sharedOne(lookupTable, [ first, last ]).map(function (tbl) { return { first: constant(first), last: constant(last), table: constant(tbl) }; }); }); }); }; var expandTo = function (finish, firstSelectedSelector) { return ancestor$1(finish, 'table').bind(function (table) { return descendant$1(table, firstSelectedSelector).bind(function (start) { return identify(start, finish).bind(function (identified) { return identified.boxes().map(function (boxes) { return { boxes: constant(boxes), start: constant(identified.start()), finish: constant(identified.finish()) }; }); }); }); }); }; var shiftSelection = function (boxes, deltaRow, deltaColumn, firstSelectedSelector, lastSelectedSelector) { return getLast(boxes, lastSelectedSelector).bind(function (last) { return TablePositions.moveBy(last, deltaRow, deltaColumn).bind(function (finish) { return expandTo(finish, firstSelectedSelector); }); }); }; var CellSelection = { identify: identify, retrieve: retrieve, shiftSelection: shiftSelection, getEdges: getEdges }; var retrieve$1 = function (container, selector) { return CellSelection.retrieve(container, selector); }; var retrieveBox = function (container, firstSelectedSelector, lastSelectedSelector) { return CellSelection.getEdges(container, firstSelectedSelector, lastSelectedSelector).bind(function (edges) { var isRoot = function (ancestor) { return eq(container, ancestor); }; var firstAncestor = ancestor$1(edges.first(), 'thead,tfoot,tbody,table', isRoot); var lastAncestor = ancestor$1(edges.last(), 'thead,tfoot,tbody,table', isRoot); return firstAncestor.bind(function (fA) { return lastAncestor.bind(function (lA) { return eq(fA, lA) ? TablePositions.getBox(edges.table(), edges.first(), edges.last()) : Option.none(); }); }); }); }; var TableSelection = { retrieve: retrieve$1, retrieveBox: retrieveBox }; var selected = 'data-mce-selected'; var selectedSelector = 'td[' + selected + '],th[' + selected + ']'; var attributeSelector = '[' + selected + ']'; var firstSelected = 'data-mce-first-selected'; var firstSelectedSelector = 'td[' + firstSelected + '],th[' + firstSelected + ']'; var lastSelected = 'data-mce-last-selected'; var lastSelectedSelector = 'td[' + lastSelected + '],th[' + lastSelected + ']'; var Ephemera = { selected: constant(selected), selectedSelector: constant(selectedSelector), attributeSelector: constant(attributeSelector), firstSelected: constant(firstSelected), firstSelectedSelector: constant(firstSelectedSelector), lastSelected: constant(lastSelected), lastSelectedSelector: constant(lastSelectedSelector) }; var generate$1 = function (cases) { if (!isArray(cases)) { throw new Error('cases must be an array'); } if (cases.length === 0) { throw new Error('there must be at least one case'); } var constructors = []; var adt = {}; each(cases, function (acase, count) { var keys$1 = keys(acase); if (keys$1.length !== 1) { throw new Error('one and only one name per case'); } var key = keys$1[0]; var value = acase[key]; if (adt[key] !== undefined) { throw new Error('duplicate key detected:' + key); } else if (key === 'cata') { throw new Error('cannot have a case named cata (sorry)'); } else if (!isArray(value)) { throw new Error('case arguments must be an array'); } constructors.push(key); adt[key] = function () { var argLength = arguments.length; if (argLength !== value.length) { throw new Error('Wrong number of arguments to case ' + key + '. Expected ' + value.length + ' (' + value + '), got ' + argLength); } var args = new Array(argLength); for (var i = 0; i < args.length; i++) { args[i] = arguments[i]; } var match = function (branches) { var branchKeys = keys(branches); if (constructors.length !== branchKeys.length) { throw new Error('Wrong number of arguments to match. Expected: ' + constructors.join(',') + '\nActual: ' + branchKeys.join(',')); } var allReqd = forall(constructors, function (reqKey) { return contains(branchKeys, reqKey); }); if (!allReqd) { throw new Error('Not all branches were specified when using match. Specified: ' + branchKeys.join(', ') + '\nRequired: ' + constructors.join(', ')); } return branches[key].apply(null, args); }; return { fold: function () { if (arguments.length !== cases.length) { throw new Error('Wrong number of arguments to fold. Expected ' + cases.length + ', got ' + arguments.length); } var target = arguments[count]; return target.apply(null, args); }, match: match, log: function (label) { domGlobals.console.log(label, { constructors: constructors, constructor: key, params: args }); } }; }; }); return adt; }; var Adt = { generate: generate$1 }; var type$1 = Adt.generate([ { none: [] }, { multiple: ['elements'] }, { single: ['selection'] } ]); var cata = function (subject, onNone, onMultiple, onSingle) { return subject.fold(onNone, onMultiple, onSingle); }; var SelectionTypes = { cata: cata, none: type$1.none, multiple: type$1.multiple, single: type$1.single }; var selection = function (cell, selections) { return SelectionTypes.cata(selections.get(), constant([]), identity, constant([cell])); }; var unmergable = function (cell, selections) { var hasSpan = function (elem) { return has(elem, 'rowspan') && parseInt(get(elem, 'rowspan'), 10) > 1 || has(elem, 'colspan') && parseInt(get(elem, 'colspan'), 10) > 1; }; var candidates = selection(cell, selections); return candidates.length > 0 && forall(candidates, hasSpan) ? Option.some(candidates) : Option.none(); }; var mergable = function (table, selections) { return SelectionTypes.cata(selections.get(), Option.none, function (cells, _env) { if (cells.length === 0) { return Option.none(); } return TableSelection.retrieveBox(table, Ephemera.firstSelectedSelector(), Ephemera.lastSelectedSelector()).bind(function (bounds) { return cells.length > 1 ? Option.some({ bounds: constant(bounds), cells: constant(cells) }) : Option.none(); }); }, Option.none); }; var CellOperations = { mergable: mergable, unmergable: unmergable, selection: selection }; var noMenu = function (cell) { return { element: constant(cell), mergable: Option.none, unmergable: Option.none, selection: constant([cell]) }; }; var forMenu = function (selections, table, cell) { return { element: constant(cell), mergable: constant(CellOperations.mergable(table, selections)), unmergable: constant(CellOperations.unmergable(cell, selections)), selection: constant(CellOperations.selection(cell, selections)) }; }; var notCell$1 = function (element) { return noMenu(element); }; var paste$1 = Immutable('element', 'clipboard', 'generators'); var pasteRows = function (selections, table, cell, clipboard, generators) { return { element: constant(cell), mergable: Option.none, unmergable: Option.none, selection: constant(CellOperations.selection(cell, selections)), clipboard: constant(clipboard), generators: constant(generators) }; }; var TableTargets = { noMenu: noMenu, forMenu: forMenu, notCell: notCell$1, paste: paste$1, pasteRows: pasteRows }; var extractSelected = function (cells) { return TableLookup.table(cells[0]).map(deep).map(function (replica) { return [CopySelected.extract(replica, Ephemera.attributeSelector())]; }); }; var serializeElements = function (editor, elements) { return map(elements, function (elm) { return editor.selection.serializer.serialize(elm.dom(), {}); }).join(''); }; var getTextContent = function (elements) { return map(elements, function (element) { return element.dom().innerText; }).join(''); }; var registerEvents = function (editor, selections, actions, cellSelection) { editor.on('BeforeGetContent', function (e) { var multiCellContext = function (cells) { e.preventDefault(); extractSelected(cells).each(function (elements) { e.content = e.format === 'text' ? getTextContent(elements) : serializeElements(editor, elements); }); }; if (e.selection === true) { SelectionTypes.cata(selections.get(), noop, multiCellContext, noop); } }); editor.on('BeforeSetContent', function (e) { if (e.selection === true && e.paste === true) { var cellOpt = Option.from(editor.dom.getParent(editor.selection.getStart(), 'th,td')); cellOpt.each(function (domCell) { var cell = Element.fromDom(domCell); TableLookup.table(cell).each(function (table) { var elements = filter(fromHtml$1(e.content), function (content) { return name(content) !== 'meta'; }); if (elements.length === 1 && name(elements[0]) === 'table') { e.preventDefault(); var doc = Element.fromDom(editor.getDoc()); var generators = TableFill.paste(doc); var targets = TableTargets.paste(cell, elements[0], generators); actions.pasteCells(table, targets).each(function (rng) { editor.selection.setRng(rng); editor.focus(); cellSelection.clear(table); }); } }); }); } }); }; var Clipboard = { registerEvents: registerEvents }; function Dimension (name, getOffset) { var set = function (element, h) { if (!isNumber(h) && !h.match(/^[0-9]+$/)) { throw new Error(name + '.set accepts only positive integer values. Value was ' + h); } var dom = element.dom(); if (isSupported(dom)) { dom.style[name] = h + 'px'; } }; var get = function (element) { var r = getOffset(element); if (r <= 0 || r === null) { var css = get$1(element, name); return parseFloat(css) || 0; } return r; }; var getOuter = get; var aggregate = function (element, properties) { return foldl(properties, function (acc, property) { var val = get$1(element, property); var value = val === undefined ? 0 : parseInt(val, 10); return isNaN(value) ? acc : acc + value; }, 0); }; var max = function (element, value, properties) { var cumulativeInclusions = aggregate(element, properties); var absoluteMax = value > cumulativeInclusions ? value - cumulativeInclusions : 0; return absoluteMax; }; return { set: set, get: get, getOuter: getOuter, aggregate: aggregate, max: max }; } var api$1 = Dimension('height', function (element) { var dom = element.dom(); return inBody(element) ? dom.getBoundingClientRect().height : dom.offsetHeight; }); var get$3 = function (element) { return api$1.get(element); }; var getOuter = function (element) { return api$1.getOuter(element); }; var api$2 = Dimension('width', function (element) { return element.dom().offsetWidth; }); var get$4 = function (element) { return api$2.get(element); }; var getOuter$1 = function (element) { return api$2.getOuter(element); }; var platform = PlatformDetection$1.detect(); var needManualCalc = function () { return platform.browser.isIE() || platform.browser.isEdge(); }; var toNumber = function (px, fallback) { var num = parseFloat(px); return isNaN(num) ? fallback : num; }; var getProp = function (elm, name, fallback) { return toNumber(get$1(elm, name), fallback); }; var getCalculatedHeight = function (cell) { var paddingTop = getProp(cell, 'padding-top', 0); var paddingBottom = getProp(cell, 'padding-bottom', 0); var borderTop = getProp(cell, 'border-top-width', 0); var borderBottom = getProp(cell, 'border-bottom-width', 0); var height = cell.dom().getBoundingClientRect().height; var boxSizing = get$1(cell, 'box-sizing'); var borders = borderTop + borderBottom; return boxSizing === 'border-box' ? height : height - paddingTop - paddingBottom - borders; }; var getWidth = function (cell) { return getProp(cell, 'width', get$4(cell)); }; var getHeight = function (cell) { return needManualCalc() ? getCalculatedHeight(cell) : getProp(cell, 'height', get$3(cell)); }; var RuntimeSize = { getWidth: getWidth, getHeight: getHeight }; var genericSizeRegex = /(\d+(\.\d+)?)(\w|%)*/; var percentageBasedSizeRegex = /(\d+(\.\d+)?)%/; var pixelBasedSizeRegex = /(\d+(\.\d+)?)px|em/; var setPixelWidth = function (cell, amount) { set$1(cell, 'width', amount + 'px'); }; var setPercentageWidth = function (cell, amount) { set$1(cell, 'width', amount + '%'); }; var setHeight = function (cell, amount) { set$1(cell, 'height', amount + 'px'); }; var getHeightValue = function (cell) { return getRaw(cell, 'height').getOrThunk(function () { return RuntimeSize.getHeight(cell) + 'px'; }); }; var convert = function (cell, number, getter, setter) { var newSize = TableLookup.table(cell).map(function (table) { var total = getter(table); return Math.floor(number / 100 * total); }).getOr(number); setter(cell, newSize); return newSize; }; var normalizePixelSize = function (value, cell, getter, setter) { var number = parseInt(value, 10); return endsWith(value, '%') && name(cell) !== 'table' ? convert(cell, number, getter, setter) : number; }; var getTotalHeight = function (cell) { var value = getHeightValue(cell); if (!value) { return get$3(cell); } return normalizePixelSize(value, cell, get$3, setHeight); }; var get$5 = function (cell, type, f) { var v = f(cell); var span = getSpan(cell, type); return v / span; }; var getSpan = function (cell, type) { return has(cell, type) ? parseInt(get(cell, type), 10) : 1; }; var getRawWidth = function (element) { var cssWidth = getRaw(element, 'width'); return cssWidth.fold(function () { return Option.from(get(element, 'width')); }, function (width) { return Option.some(width); }); }; var normalizePercentageWidth = function (cellWidth, tableSize) { return cellWidth / tableSize.pixelWidth() * 100; }; var choosePercentageSize = function (element, width, tableSize) { var percentMatch = percentageBasedSizeRegex.exec(width); if (percentMatch !== null) { return parseFloat(percentMatch[1]); } else { var intWidth = get$4(element); return normalizePercentageWidth(intWidth, tableSize); } }; var getPercentageWidth = function (cell, tableSize) { var width = getRawWidth(cell); return width.fold(function () { var intWidth = get$4(cell); return normalizePercentageWidth(intWidth, tableSize); }, function (w) { return choosePercentageSize(cell, w, tableSize); }); }; var normalizePixelWidth = function (cellWidth, tableSize) { return cellWidth / 100 * tableSize.pixelWidth(); }; var choosePixelSize = function (element, width, tableSize) { var pixelMatch = pixelBasedSizeRegex.exec(width); if (pixelMatch !== null) { return parseInt(pixelMatch[1], 10); } var percentMatch = percentageBasedSizeRegex.exec(width); if (percentMatch !== null) { var floatWidth = parseFloat(percentMatch[1]); return normalizePixelWidth(floatWidth, tableSize); } return get$4(element); }; var getPixelWidth = function (cell, tableSize) { var width = getRawWidth(cell); return width.fold(function () { return get$4(cell); }, function (w) { return choosePixelSize(cell, w, tableSize); }); }; var getHeight$1 = function (cell) { return get$5(cell, 'rowspan', getTotalHeight); }; var getGenericWidth = function (cell) { var width = getRawWidth(cell); return width.bind(function (w) { var match = genericSizeRegex.exec(w); if (match !== null) { return Option.some({ width: constant(parseFloat(match[1])), unit: constant(match[3]) }); } else { return Option.none(); } }); }; var setGenericWidth = function (cell, amount, unit) { set$1(cell, 'width', amount + unit); }; var Sizes = { percentageBasedSizeRegex: constant(percentageBasedSizeRegex), pixelBasedSizeRegex: constant(pixelBasedSizeRegex), setPixelWidth: setPixelWidth, setPercentageWidth: setPercentageWidth, setHeight: setHeight, getPixelWidth: getPixelWidth, getPercentageWidth: getPercentageWidth, getGenericWidth: getGenericWidth, setGenericWidth: setGenericWidth, getHeight: getHeight$1, getRawWidth: getRawWidth }; var halve = function (main, other) { var width = Sizes.getGenericWidth(main); width.each(function (w) { var newWidth = w.width() / 2; Sizes.setGenericWidth(main, newWidth, w.unit()); Sizes.setGenericWidth(other, newWidth, w.unit()); }); }; var CellMutations = { halve: halve }; var r = function (left, top) { var translate = function (x, y) { return r(left + x, top + y); }; return { left: constant(left), top: constant(top), translate: translate }; }; var Position = r; var boxPosition = function (dom) { var box = dom.getBoundingClientRect(); return Position(box.left, box.top); }; var firstDefinedOrZero = function (a, b) { return a !== undefined ? a : b !== undefined ? b : 0; }; var absolute = function (element) { var doc = element.dom().ownerDocument; var body = doc.body; var win = doc.defaultView; var html = doc.documentElement; var scrollTop = firstDefinedOrZero(win.pageYOffset, html.scrollTop); var scrollLeft = firstDefinedOrZero(win.pageXOffset, html.scrollLeft); var clientTop = firstDefinedOrZero(html.clientTop, body.clientTop); var clientLeft = firstDefinedOrZero(html.clientLeft, body.clientLeft); return viewport(element).translate(scrollLeft - clientLeft, scrollTop - clientTop); }; var viewport = function (element) { var dom = element.dom(); var doc = dom.ownerDocument; var body = doc.body; if (body === dom) { return Position(body.offsetLeft, body.offsetTop); } if (!inBody(element)) { return Position(0, 0); } return boxPosition(dom); }; var rowInfo = Immutable('row', 'y'); var colInfo = Immutable('col', 'x'); var rtlEdge = function (cell) { var pos = absolute(cell); return pos.left() + getOuter$1(cell); }; var ltrEdge = function (cell) { return absolute(cell).left(); }; var getLeftEdge = function (index, cell) { return colInfo(index, ltrEdge(cell)); }; var getRightEdge = function (index, cell) { return colInfo(index, rtlEdge(cell)); }; var getTop = function (cell) { return absolute(cell).top(); }; var getTopEdge = function (index, cell) { return rowInfo(index, getTop(cell)); }; var getBottomEdge = function (index, cell) { return rowInfo(index, getTop(cell) + getOuter(cell)); }; var findPositions = function (getInnerEdge, getOuterEdge, array) { if (array.length === 0) { return []; } var lines = map(array.slice(1), function (cellOption, index) { return cellOption.map(function (cell) { return getInnerEdge(index, cell); }); }); var lastLine = array[array.length - 1].map(function (cell) { return getOuterEdge(array.length - 1, cell); }); return lines.concat([lastLine]); }; var negate = function (step) { return -step; }; var height = { delta: identity, positions: function (optElements) { return findPositions(getTopEdge, getBottomEdge, optElements); }, edge: getTop }; var ltr = { delta: identity, edge: ltrEdge, positions: function (optElements) { return findPositions(getLeftEdge, getRightEdge, optElements); } }; var rtl = { delta: negate, edge: rtlEdge, positions: function (optElements) { return findPositions(getRightEdge, getLeftEdge, optElements); } }; var BarPositions = { height: height, rtl: rtl, ltr: ltr }; var ResizeDirection = { ltr: BarPositions.ltr, rtl: BarPositions.rtl }; function TableDirection (directionAt) { var auto = function (table) { return directionAt(table).isRtl() ? ResizeDirection.rtl : ResizeDirection.ltr; }; var delta = function (amount, table) { return auto(table).delta(amount, table); }; var positions = function (cols, table) { return auto(table).positions(cols, table); }; var edge = function (cell) { return auto(cell).edge(cell); }; return { delta: delta, edge: edge, positions: positions }; } var getGridSize = function (table) { var input = DetailsList.fromTable(table); var warehouse = Warehouse.generate(input); return warehouse.grid(); }; var TableGridSize = { getGridSize: getGridSize }; var __assign = function () { __assign = Object.assign || function __assign(t) { for (var s, i = 1, n = arguments.length; i < n; i++) { s = arguments[i]; for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p]; } return t; }; return __assign.apply(this, arguments); }; var cat = function (arr) { var r = []; var push = function (x) { r.push(x); }; for (var i = 0; i < arr.length; i++) { arr[i].each(push); } return r; }; var findMap = function (arr, f) { for (var i = 0; i < arr.length; i++) { var r = f(arr[i], i); if (r.isSome()) { return r; } } return Option.none(); }; var setIfNot = function (element, property, value, ignore) { if (value === ignore) { remove(element, property); } else { set(element, property, value); } }; var render = function (table, grid) { var newRows = []; var newCells = []; var renderSection = function (gridSection, sectionName) { var section = child$2(table, sectionName).getOrThunk(function () { var tb = Element.fromTag(sectionName, owner(table).dom()); append(table, tb); return tb; }); empty(section); var rows = map(gridSection, function (row) { if (row.isNew()) { newRows.push(row.element()); } var tr = row.element(); empty(tr); each(row.cells(), function (cell) { if (cell.isNew()) { newCells.push(cell.element()); } setIfNot(cell.element(), 'colspan', cell.colspan(), 1); setIfNot(cell.element(), 'rowspan', cell.rowspan(), 1); append(tr, cell.element()); }); return tr; }); append$1(section, rows); }; var removeSection = function (sectionName) { child$2(table, sectionName).each(remove$2); }; var renderOrRemoveSection = function (gridSection, sectionName) { if (gridSection.length > 0) { renderSection(gridSection, sectionName); } else { removeSection(sectionName); } }; var headSection = []; var bodySection = []; var footSection = []; each(grid, function (row) { switch (row.section()) { case 'thead': headSection.push(row); break; case 'tbody': bodySection.push(row); break; case 'tfoot': footSection.push(row); break; } }); renderOrRemoveSection(headSection, 'thead'); renderOrRemoveSection(bodySection, 'tbody'); renderOrRemoveSection(footSection, 'tfoot'); return { newRows: constant(newRows), newCells: constant(newCells) }; }; var copy$2 = function (grid) { var rows = map(grid, function (row) { var tr = shallow(row.element()); each(row.cells(), function (cell) { var clonedCell = deep(cell.element()); setIfNot(clonedCell, 'colspan', cell.colspan(), 1); setIfNot(clonedCell, 'rowspan', cell.rowspan(), 1); append(tr, clonedCell); }); return tr; }); return rows; }; var Redraw = { render: render, copy: copy$2 }; var read = function (element, attr) { var value = get(element, attr); return value === undefined || value === '' ? [] : value.split(' '); }; var add = function (element, attr, id) { var old = read(element, attr); var nu = old.concat([id]); set(element, attr, nu.join(' ')); return true; }; var remove$3 = function (element, attr, id) { var nu = filter(read(element, attr), function (v) { return v !== id; }); if (nu.length > 0) { set(element, attr, nu.join(' ')); } else { remove(element, attr); } return false; }; var supports = function (element) { return element.dom().classList !== undefined; }; var get$6 = function (element) { return read(element, 'class'); }; var add$1 = function (element, clazz) { return add(element, 'class', clazz); }; var remove$4 = function (element, clazz) { return remove$3(element, 'class', clazz); }; var add$2 = function (element, clazz) { if (supports(element)) { element.dom().classList.add(clazz); } else { add$1(element, clazz); } }; var cleanClass = function (element) { var classList = supports(element) ? element.dom().classList : get$6(element); if (classList.length === 0) { remove(element, 'class'); } }; var remove$5 = function (element, clazz) { if (supports(element)) { var classList = element.dom().classList; classList.remove(clazz); } else { remove$4(element, clazz); } cleanClass(element); }; var has$1 = function (element, clazz) { return supports(element) && element.dom().classList.contains(clazz); }; var repeat = function (repititions, f) { var r = []; for (var i = 0; i < repititions; i++) { r.push(f(i)); } return r; }; var range = function (start, end) { var r = []; for (var i = start; i < end; i++) { r.push(i); } return r; }; var deduce = function (xs, index) { if (index < 0 || index >= xs.length - 1) { return Option.none(); } var current = xs[index].fold(function () { var rest = reverse(xs.slice(0, index)); return findMap(rest, function (a, i) { return a.map(function (aa) { return { value: aa, delta: i + 1 }; }); }); }, function (c) { return Option.some({ value: c, delta: 0 }); }); var next = xs[index + 1].fold(function () { var rest = xs.slice(index + 1); return findMap(rest, function (a, i) { return a.map(function (aa) { return { value: aa, delta: i + 1 }; }); }); }, function (n) { return Option.some({ value: n, delta: 1 }); }); return current.bind(function (c) { return next.map(function (n) { var extras = n.delta + c.delta; return Math.abs(n.value - c.value) / extras; }); }); }; var columns = function (warehouse) { var grid = warehouse.grid(); var cols = range(0, grid.columns()); var rowsArr = range(0, grid.rows()); return map(cols, function (col) { var getBlock = function () { return bind(rowsArr, function (r) { return Warehouse.getAt(warehouse, r, col).filter(function (detail) { return detail.column() === col; }).fold(constant([]), function (detail) { return [detail]; }); }); }; var isSingle = function (detail) { return detail.colspan() === 1; }; var getFallback = function () { return Warehouse.getAt(warehouse, 0, col); }; return decide(getBlock, isSingle, getFallback); }); }; var decide = function (getBlock, isSingle, getFallback) { var inBlock = getBlock(); var singleInBlock = find(inBlock, isSingle); var detailOption = singleInBlock.orThunk(function () { return Option.from(inBlock[0]).orThunk(getFallback); }); return detailOption.map(function (detail) { return detail.element(); }); }; var rows$1 = function (warehouse) { var grid = warehouse.grid(); var rowsArr = range(0, grid.rows()); var cols = range(0, grid.columns()); return map(rowsArr, function (row) { var getBlock = function () { return bind(cols, function (c) { return Warehouse.getAt(warehouse, row, c).filter(function (detail) { return detail.row() === row; }).fold(constant([]), function (detail) { return [detail]; }); }); }; var isSingle = function (detail) { return detail.rowspan() === 1; }; var getFallback = function () { return Warehouse.getAt(warehouse, row, 0); }; return decide(getBlock, isSingle, getFallback); }); }; var Blocks = { columns: columns, rows: rows$1 }; var css = function (namespace) { var dashNamespace = namespace.replace(/\./g, '-'); var resolve = function (str) { return dashNamespace + '-' + str; }; return { resolve: resolve }; }; var styles = css('ephox-snooker'); var Styles = { resolve: styles.resolve }; var col = function (column, x, y, w, h) { var blocker = Element.fromTag('div'); setAll$1(blocker, { position: 'absolute', left: x - w / 2 + 'px', top: y + 'px', height: h + 'px', width: w + 'px' }); setAll(blocker, { 'data-column': column, 'role': 'presentation' }); return blocker; }; var row$1 = function (r, x, y, w, h) { var blocker = Element.fromTag('div'); setAll$1(blocker, { position: 'absolute', left: x + 'px', top: y - h / 2 + 'px', height: h + 'px', width: w + 'px' }); setAll(blocker, { 'data-row': r, 'role': 'presentation' }); return blocker; }; var Bar = { col: col, row: row$1 }; var resizeBar = Styles.resolve('resizer-bar'); var resizeRowBar = Styles.resolve('resizer-rows'); var resizeColBar = Styles.resolve('resizer-cols'); var BAR_THICKNESS = 7; var destroy = function (wire) { var previous = descendants$1(wire.parent(), '.' + resizeBar); each(previous, remove$2); }; var drawBar = function (wire, positions, create) { var origin = wire.origin(); each(positions, function (cpOption, i) { cpOption.each(function (cp) { var bar = create(origin, cp); add$2(bar, resizeBar); append(wire.parent(), bar); }); }); }; var refreshCol = function (wire, colPositions, position, tableHeight) { drawBar(wire, colPositions, function (origin, cp) { var colBar = Bar.col(cp.col(), cp.x() - origin.left(), position.top() - origin.top(), BAR_THICKNESS, tableHeight); add$2(colBar, resizeColBar); return colBar; }); }; var refreshRow = function (wire, rowPositions, position, tableWidth) { drawBar(wire, rowPositions, function (origin, cp) { var rowBar = Bar.row(cp.row(), position.left() - origin.left(), cp.y() - origin.top(), tableWidth, BAR_THICKNESS); add$2(rowBar, resizeRowBar); return rowBar; }); }; var refreshGrid = function (wire, table, rows, cols, hdirection, vdirection) { var position = absolute(table); var rowPositions = rows.length > 0 ? hdirection.positions(rows, table) : []; refreshRow(wire, rowPositions, position, getOuter$1(table)); var colPositions = cols.length > 0 ? vdirection.positions(cols, table) : []; refreshCol(wire, colPositions, position, getOuter(table)); }; var refresh = function (wire, table, hdirection, vdirection) { destroy(wire); var list = DetailsList.fromTable(table); var warehouse = Warehouse.generate(list); var rows = Blocks.rows(warehouse); var cols = Blocks.columns(warehouse); refreshGrid(wire, table, rows, cols, hdirection, vdirection); }; var each$2 = function (wire, f) { var bars = descendants$1(wire.parent(), '.' + resizeBar); each(bars, f); }; var hide = function (wire) { each$2(wire, function (bar) { set$1(bar, 'display', 'none'); }); }; var show = function (wire) { each$2(wire, function (bar) { set$1(bar, 'display', 'block'); }); }; var isRowBar = function (element) { return has$1(element, resizeRowBar); }; var isColBar = function (element) { return has$1(element, resizeColBar); }; var Bars = { refresh: refresh, hide: hide, show: show, destroy: destroy, isRowBar: isRowBar, isColBar: isColBar }; var addCell = function (gridRow, index, cell) { var cells = gridRow.cells(); var before = cells.slice(0, index); var after = cells.slice(index); var newCells = before.concat([cell]).concat(after); return setCells(gridRow, newCells); }; var mutateCell = function (gridRow, index, cell) { var cells = gridRow.cells(); cells[index] = cell; }; var setCells = function (gridRow, cells) { return rowcells(cells, gridRow.section()); }; var mapCells = function (gridRow, f) { var cells = gridRow.cells(); var r = map(cells, f); return rowcells(r, gridRow.section()); }; var getCell = function (gridRow, index) { return gridRow.cells()[index]; }; var getCellElement = function (gridRow, index) { return getCell(gridRow, index).element(); }; var cellLength = function (gridRow) { return gridRow.cells().length; }; var GridRow = { addCell: addCell, setCells: setCells, mutateCell: mutateCell, getCell: getCell, getCellElement: getCellElement, mapCells: mapCells, cellLength: cellLength }; var getColumn = function (grid, index) { return map(grid, function (row) { return GridRow.getCell(row, index); }); }; var getRow = function (grid, index) { return grid[index]; }; var findDiff = function (xs, comp) { if (xs.length === 0) { return 0; } var first = xs[0]; var index = findIndex(xs, function (x) { return !comp(first.element(), x.element()); }); return index.fold(function () { return xs.length; }, function (ind) { return ind; }); }; var subgrid = function (grid, row, column, comparator) { var restOfRow = getRow(grid, row).cells().slice(column); var endColIndex = findDiff(restOfRow, comparator); var restOfColumn = getColumn(grid, column).slice(row); var endRowIndex = findDiff(restOfColumn, comparator); return { colspan: constant(endColIndex), rowspan: constant(endRowIndex) }; }; var TableGrid = { subgrid: subgrid }; var toDetails = function (grid, comparator) { var seen = map(grid, function (row, ri) { return map(row.cells(), function (col, ci) { return false; }); }); var updateSeen = function (ri, ci, rowspan, colspan) { for (var r = ri; r < ri + rowspan; r++) { for (var c = ci; c < ci + colspan; c++) { seen[r][c] = true; } } }; return map(grid, function (row, ri) { var details = bind(row.cells(), function (cell, ci) { if (seen[ri][ci] === false) { var result = TableGrid.subgrid(grid, ri, ci, comparator); updateSeen(ri, ci, result.rowspan(), result.colspan()); return [detailnew(cell.element(), result.rowspan(), result.colspan(), cell.isNew())]; } else { return []; } }); return rowdetails(details, row.section()); }); }; var toGrid = function (warehouse, generators, isNew) { var grid = []; for (var i = 0; i < warehouse.grid().rows(); i++) { var rowCells = []; for (var j = 0; j < warehouse.grid().columns(); j++) { var element = Warehouse.getAt(warehouse, i, j).map(function (item) { return elementnew(item.element(), isNew); }).getOrThunk(function () { return elementnew(generators.gap(), true); }); rowCells.push(element); } var row = rowcells(rowCells, warehouse.all()[i].section()); grid.push(row); } return grid; }; var Transitions = { toDetails: toDetails, toGrid: toGrid }; var fromWarehouse = function (warehouse, generators) { return Transitions.toGrid(warehouse, generators, false); }; var deriveRows = function (rendered, generators) { var findRow = function (details) { var rowOfCells = findMap(details, function (detail) { return parent(detail.element()).map(function (row) { var isNew = parent(row).isNone(); return elementnew(row, isNew); }); }); return rowOfCells.getOrThunk(function () { return elementnew(generators.row(), true); }); }; return map(rendered, function (details) { var row = findRow(details.details()); return rowdatanew(row.element(), details.details(), details.section(), row.isNew()); }); }; var toDetailList = function (grid, generators) { var rendered = Transitions.toDetails(grid, eq); return deriveRows(rendered, generators); }; var findInWarehouse = function (warehouse, element) { var all = flatten(map(warehouse.all(), function (r) { return r.cells(); })); return find(all, function (e) { return eq(element, e.element()); }); }; var run = function (operation, extract, adjustment, postAction, genWrappers) { return function (wire, table, target, generators, direction) { var input = DetailsList.fromTable(table); var warehouse = Warehouse.generate(input); var output = extract(warehouse, target).map(function (info) { var model = fromWarehouse(warehouse, generators); var result = operation(model, info, eq, genWrappers(generators)); var grid = toDetailList(result.grid(), generators); return { grid: constant(grid), cursor: result.cursor }; }); return output.fold(function () { return Option.none(); }, function (out) { var newElements = Redraw.render(table, out.grid()); adjustment(table, out.grid(), direction); postAction(table); Bars.refresh(wire, table, BarPositions.height, direction); return Option.some({ cursor: out.cursor, newRows: newElements.newRows, newCells: newElements.newCells }); }); }; }; var onCell = function (warehouse, target) { return TableLookup.cell(target.element()).bind(function (cell) { return findInWarehouse(warehouse, cell); }); }; var onPaste = function (warehouse, target) { return TableLookup.cell(target.element()).bind(function (cell) { return findInWarehouse(warehouse, cell).map(function (details) { var value = __assign({}, details, { generators: target.generators, clipboard: target.clipboard }); return value; }); }); }; var onPasteRows = function (warehouse, target) { var details = map(target.selection(), function (cell) { return TableLookup.cell(cell).bind(function (lc) { return findInWarehouse(warehouse, lc); }); }); var cells = cat(details); return cells.length > 0 ? Option.some({ cells: cells, generators: target.generators, clipboard: target.clipboard }) : Option.none(); }; var onMergable = function (_warehouse, target) { return target.mergable(); }; var onUnmergable = function (_warehouse, target) { return target.unmergable(); }; var onCells = function (warehouse, target) { var details = map(target.selection(), function (cell) { return TableLookup.cell(cell).bind(function (lc) { return findInWarehouse(warehouse, lc); }); }); var cells = cat(details); return cells.length > 0 ? Option.some(cells) : Option.none(); }; var value = function (o) { var is = function (v) { return o === v; }; var or = function (opt) { return value(o); }; var orThunk = function (f) { return value(o); }; var map = function (f) { return value(f(o)); }; var mapError = function (f) { return value(o); }; var each = function (f) { f(o); }; var bind = function (f) { return f(o); }; var fold = function (_, onValue) { return onValue(o); }; var exists = function (f) { return f(o); }; var forall = function (f) { return f(o); }; var toOption = function () { return Option.some(o); }; return { is: is, isValue: always, isError: never, getOr: constant(o), getOrThunk: constant(o), getOrDie: constant(o), or: or, orThunk: orThunk, fold: fold, map: map, mapError: mapError, each: each, bind: bind, exists: exists, forall: forall, toOption: toOption }; }; var error = function (message) { var getOrThunk = function (f) { return f(); }; var getOrDie = function () { return die(String(message))(); }; var or = function (opt) { return opt; }; var orThunk = function (f) { return f(); }; var map = function (f) { return error(message); }; var mapError = function (f) { return error(f(message)); }; var bind = function (f) { return error(message); }; var fold = function (onError, _) { return onError(message); }; return { is: never, isValue: never, isError: always, getOr: identity, getOrThunk: getOrThunk, getOrDie: getOrDie, or: or, orThunk: orThunk, fold: fold, map: map, mapError: mapError, each: noop, bind: bind, exists: never, forall: always, toOption: Option.none }; }; var fromOption = function (opt, err) { return opt.fold(function () { return error(err); }, value); }; var Result = { value: value, error: error, fromOption: fromOption }; var measure = function (startAddress, gridA, gridB) { if (startAddress.row() >= gridA.length || startAddress.column() > GridRow.cellLength(gridA[0])) { return Result.error('invalid start address out of table bounds, row: ' + startAddress.row() + ', column: ' + startAddress.column()); } var rowRemainder = gridA.slice(startAddress.row()); var colRemainder = rowRemainder[0].cells().slice(startAddress.column()); var colRequired = GridRow.cellLength(gridB[0]); var rowRequired = gridB.length; return Result.value({ rowDelta: constant(rowRemainder.length - rowRequired), colDelta: constant(colRemainder.length - colRequired) }); }; var measureWidth = function (gridA, gridB) { var colLengthA = GridRow.cellLength(gridA[0]); var colLengthB = GridRow.cellLength(gridB[0]); return { rowDelta: constant(0), colDelta: constant(colLengthA - colLengthB) }; }; var fill = function (cells, generator) { return map(cells, function () { return elementnew(generator.cell(), true); }); }; var rowFill = function (grid, amount, generator) { return grid.concat(repeat(amount, function (_row) { return GridRow.setCells(grid[grid.length - 1], fill(grid[grid.length - 1].cells(), generator)); })); }; var colFill = function (grid, amount, generator) { return map(grid, function (row) { return GridRow.setCells(row, row.cells().concat(fill(range(0, amount), generator))); }); }; var tailor = function (gridA, delta, generator) { var fillCols = delta.colDelta() < 0 ? colFill : identity; var fillRows = delta.rowDelta() < 0 ? rowFill : identity; var modifiedCols = fillCols(gridA, Math.abs(delta.colDelta()), generator); var tailoredGrid = fillRows(modifiedCols, Math.abs(delta.rowDelta()), generator); return tailoredGrid; }; var Fitment = { measure: measure, measureWidth: measureWidth, tailor: tailor }; var merge = function (grid, bounds, comparator, substitution) { if (grid.length === 0) { return grid; } for (var i = bounds.startRow(); i <= bounds.finishRow(); i++) { for (var j = bounds.startCol(); j <= bounds.finishCol(); j++) { GridRow.mutateCell(grid[i], j, elementnew(substitution(), false)); } } return grid; }; var unmerge = function (grid, target, comparator, substitution) { var first = true; for (var i = 0; i < grid.length; i++) { for (var j = 0; j < GridRow.cellLength(grid[0]); j++) { var current = GridRow.getCellElement(grid[i], j); var isToReplace = comparator(current, target); if (isToReplace === true && first === false) { GridRow.mutateCell(grid[i], j, elementnew(substitution(), true)); } else if (isToReplace === true) { first = false; } } } return grid; }; var uniqueCells = function (row, comparator) { return foldl(row, function (rest, cell) { return exists(rest, function (currentCell) { return comparator(currentCell.element(), cell.element()); }) ? rest : rest.concat([cell]); }, []); }; var splitRows = function (grid, index, comparator, substitution) { if (index > 0 && index < grid.length) { var rowPrevCells = grid[index - 1].cells(); var cells = uniqueCells(rowPrevCells, comparator); each(cells, function (cell) { var replacement = Option.none(); var _loop_1 = function (i) { var _loop_2 = function (j) { var current = grid[i].cells()[j]; var isToReplace = comparator(current.element(), cell.element()); if (isToReplace) { if (replacement.isNone()) { replacement = Option.some(substitution()); } replacement.each(function (sub) { GridRow.mutateCell(grid[i], j, elementnew(sub, true)); }); } }; for (var j = 0; j < GridRow.cellLength(grid[0]); j++) { _loop_2(j); } }; for (var i = index; i < grid.length; i++) { _loop_1(i); } }); } return grid; }; var MergingOperations = { merge: merge, unmerge: unmerge, splitRows: splitRows }; var isSpanning = function (grid, row, col, comparator) { var candidate = GridRow.getCell(grid[row], col); var matching = curry(comparator, candidate.element()); var currentRow = grid[row]; return grid.length > 1 && GridRow.cellLength(currentRow) > 1 && (col > 0 && matching(GridRow.getCellElement(currentRow, col - 1)) || col < currentRow.cells().length - 1 && matching(GridRow.getCellElement(currentRow, col + 1)) || row > 0 && matching(GridRow.getCellElement(grid[row - 1], col)) || row < grid.length - 1 && matching(GridRow.getCellElement(grid[row + 1], col))); }; var mergeTables = function (startAddress, gridA, gridB, generator, comparator) { var startRow = startAddress.row(); var startCol = startAddress.column(); var mergeHeight = gridB.length; var mergeWidth = GridRow.cellLength(gridB[0]); var endRow = startRow + mergeHeight; var endCol = startCol + mergeWidth; for (var r = startRow; r < endRow; r++) { for (var c = startCol; c < endCol; c++) { if (isSpanning(gridA, r, c, comparator)) { MergingOperations.unmerge(gridA, GridRow.getCellElement(gridA[r], c), comparator, generator.cell); } var newCell = GridRow.getCellElement(gridB[r - startRow], c - startCol); var replacement = generator.replace(newCell); GridRow.mutateCell(gridA[r], c, elementnew(replacement, true)); } } return gridA; }; var merge$1 = function (startAddress, gridA, gridB, generator, comparator) { var result = Fitment.measure(startAddress, gridA, gridB); return result.map(function (delta) { var fittedGrid = Fitment.tailor(gridA, delta, generator); return mergeTables(startAddress, fittedGrid, gridB, generator, comparator); }); }; var insert = function (index, gridA, gridB, generator, comparator) { MergingOperations.splitRows(gridA, index, comparator, generator.cell); var delta = Fitment.measureWidth(gridB, gridA); var fittedNewGrid = Fitment.tailor(gridB, delta, generator); var secondDelta = Fitment.measureWidth(gridA, fittedNewGrid); var fittedOldGrid = Fitment.tailor(gridA, secondDelta, generator); return fittedOldGrid.slice(0, index).concat(fittedNewGrid).concat(fittedOldGrid.slice(index, fittedOldGrid.length)); }; var TableMerge = { merge: merge$1, insert: insert }; var insertRowAt = function (grid, index, example, comparator, substitution) { var before = grid.slice(0, index); var after = grid.slice(index); var between = GridRow.mapCells(grid[example], function (ex, c) { var withinSpan = index > 0 && index < grid.length && comparator(GridRow.getCellElement(grid[index - 1], c), GridRow.getCellElement(grid[index], c)); var ret = withinSpan ? GridRow.getCell(grid[index], c) : elementnew(substitution(ex.element(), comparator), true); return ret; }); return before.concat([between]).concat(after); }; var insertColumnAt = function (grid, index, example, comparator, substitution) { return map(grid, function (row) { var withinSpan = index > 0 && index < GridRow.cellLength(row) && comparator(GridRow.getCellElement(row, index - 1), GridRow.getCellElement(row, index)); var sub = withinSpan ? GridRow.getCell(row, index) : elementnew(substitution(GridRow.getCellElement(row, example), comparator), true); return GridRow.addCell(row, index, sub); }); }; var splitCellIntoColumns = function (grid, exampleRow, exampleCol, comparator, substitution) { var index = exampleCol + 1; return map(grid, function (row, i) { var isTargetCell = i === exampleRow; var sub = isTargetCell ? elementnew(substitution(GridRow.getCellElement(row, exampleCol), comparator), true) : GridRow.getCell(row, exampleCol); return GridRow.addCell(row, index, sub); }); }; var splitCellIntoRows = function (grid, exampleRow, exampleCol, comparator, substitution) { var index = exampleRow + 1; var before = grid.slice(0, index); var after = grid.slice(index); var between = GridRow.mapCells(grid[exampleRow], function (ex, i) { var isTargetCell = i === exampleCol; return isTargetCell ? elementnew(substitution(ex.element(), comparator), true) : ex; }); return before.concat([between]).concat(after); }; var deleteColumnsAt = function (grid, start, finish) { var rows = map(grid, function (row) { var cells = row.cells().slice(0, start).concat(row.cells().slice(finish + 1)); return rowcells(cells, row.section()); }); return filter(rows, function (row) { return row.cells().length > 0; }); }; var deleteRowsAt = function (grid, start, finish) { return grid.slice(0, start).concat(grid.slice(finish + 1)); }; var ModificationOperations = { insertRowAt: insertRowAt, insertColumnAt: insertColumnAt, splitCellIntoColumns: splitCellIntoColumns, splitCellIntoRows: splitCellIntoRows, deleteRowsAt: deleteRowsAt, deleteColumnsAt: deleteColumnsAt }; var replaceIn = function (grid, targets, comparator, substitution) { var isTarget = function (cell) { return exists(targets, function (target) { return comparator(cell.element(), target.element()); }); }; return map(grid, function (row) { return GridRow.mapCells(row, function (cell) { return isTarget(cell) ? elementnew(substitution(cell.element(), comparator), true) : cell; }); }); }; var notStartRow = function (grid, rowIndex, colIndex, comparator) { return GridRow.getCellElement(grid[rowIndex], colIndex) !== undefined && (rowIndex > 0 && comparator(GridRow.getCellElement(grid[rowIndex - 1], colIndex), GridRow.getCellElement(grid[rowIndex], colIndex))); }; var notStartColumn = function (row, index, comparator) { return index > 0 && comparator(GridRow.getCellElement(row, index - 1), GridRow.getCellElement(row, index)); }; var replaceColumn = function (grid, index, comparator, substitution) { var targets = bind(grid, function (row, i) { var alreadyAdded = notStartRow(grid, i, index, comparator) || notStartColumn(row, index, comparator); return alreadyAdded ? [] : [GridRow.getCell(row, index)]; }); return replaceIn(grid, targets, comparator, substitution); }; var replaceRow = function (grid, index, comparator, substitution) { var targetRow = grid[index]; var targets = bind(targetRow.cells(), function (item, i) { var alreadyAdded = notStartRow(grid, index, i, comparator) || notStartColumn(targetRow, i, comparator); return alreadyAdded ? [] : [item]; }); return replaceIn(grid, targets, comparator, substitution); }; var TransformOperations = { replaceColumn: replaceColumn, replaceRow: replaceRow }; var adt = Adt.generate([ { none: [] }, { only: ['index'] }, { left: [ 'index', 'next' ] }, { middle: [ 'prev', 'index', 'next' ] }, { right: [ 'prev', 'index' ] } ]); var ColumnContext = __assign({}, adt); var neighbours$1 = function (input, index) { if (input.length === 0) { return ColumnContext.none(); } if (input.length === 1) { return ColumnContext.only(0); } if (index === 0) { return ColumnContext.left(0, 1); } if (index === input.length - 1) { return ColumnContext.right(index - 1, index); } if (index > 0 && index < input.length - 1) { return ColumnContext.middle(index - 1, index, index + 1); } return ColumnContext.none(); }; var determine = function (input, column, step, tableSize) { var result = input.slice(0); var context = neighbours$1(input, column); var zero = function (array) { return map(array, constant(0)); }; var onNone = constant(zero(result)); var onOnly = function (index) { return tableSize.singleColumnWidth(result[index], step); }; var onChange = function (index, next) { if (step >= 0) { var newNext = Math.max(tableSize.minCellWidth(), result[next] - step); return zero(result.slice(0, index)).concat([ step, newNext - result[next] ]).concat(zero(result.slice(next + 1))); } else { var newThis = Math.max(tableSize.minCellWidth(), result[index] + step); var diffx = result[index] - newThis; return zero(result.slice(0, index)).concat([ newThis - result[index], diffx ]).concat(zero(result.slice(next + 1))); } }; var onLeft = onChange; var onMiddle = function (_prev, index, next) { return onChange(index, next); }; var onRight = function (_prev, index) { if (step >= 0) { return zero(result.slice(0, index)).concat([step]); } else { var size = Math.max(tableSize.minCellWidth(), result[index] + step); return zero(result.slice(0, index)).concat([size - result[index]]); } }; return context.fold(onNone, onOnly, onLeft, onMiddle, onRight); }; var Deltas = { determine: determine }; var getSpan$1 = function (cell, type) { return has(cell, type) && parseInt(get(cell, type), 10) > 1; }; var hasColspan = function (cell) { return getSpan$1(cell, 'colspan'); }; var hasRowspan = function (cell) { return getSpan$1(cell, 'rowspan'); }; var getInt = function (element, property) { return parseInt(get$1(element, property), 10); }; var CellUtils = { hasColspan: hasColspan, hasRowspan: hasRowspan, minWidth: constant(10), minHeight: constant(10), getInt: getInt }; var getRaw$1 = function (cell, property, getter) { return getRaw(cell, property).fold(function () { return getter(cell) + 'px'; }, function (raw) { return raw; }); }; var getRawW = function (cell, tableSize) { return getRaw$1(cell, 'width', function (e) { return Sizes.getPixelWidth(e, tableSize); }); }; var getRawH = function (cell) { return getRaw$1(cell, 'height', Sizes.getHeight); }; var getWidthFrom = function (warehouse, direction, getWidth, fallback, tableSize) { var columns = Blocks.columns(warehouse); var backups = map(columns, function (cellOption) { return cellOption.map(direction.edge); }); return map(columns, function (cellOption, c) { var columnCell = cellOption.filter(not(CellUtils.hasColspan)); return columnCell.fold(function () { var deduced = deduce(backups, c); return fallback(deduced); }, function (cell) { return getWidth(cell, tableSize); }); }); }; var getDeduced = function (deduced) { return deduced.map(function (d) { return d + 'px'; }).getOr(''); }; var getRawWidths = function (warehouse, direction, tableSize) { return getWidthFrom(warehouse, direction, getRawW, getDeduced, tableSize); }; var getPercentageWidths = function (warehouse, direction, tableSize) { return getWidthFrom(warehouse, direction, Sizes.getPercentageWidth, function (deduced) { return deduced.fold(function () { return tableSize.minCellWidth(); }, function (cellWidth) { return cellWidth / tableSize.pixelWidth() * 100; }); }, tableSize); }; var getPixelWidths = function (warehouse, direction, tableSize) { return getWidthFrom(warehouse, direction, Sizes.getPixelWidth, function (deduced) { return deduced.getOrThunk(tableSize.minCellWidth); }, tableSize); }; var getHeightFrom = function (warehouse, direction, getHeight, fallback) { var rows = Blocks.rows(warehouse); var backups = map(rows, function (cellOption) { return cellOption.map(direction.edge); }); return map(rows, function (cellOption, c) { var rowCell = cellOption.filter(not(CellUtils.hasRowspan)); return rowCell.fold(function () { var deduced = deduce(backups, c); return fallback(deduced); }, function (cell) { return getHeight(cell); }); }); }; var getPixelHeights = function (warehouse, direction) { return getHeightFrom(warehouse, direction, Sizes.getHeight, function (deduced) { return deduced.getOrThunk(CellUtils.minHeight); }); }; var getRawHeights = function (warehouse, direction) { return getHeightFrom(warehouse, direction, getRawH, getDeduced); }; var ColumnSizes = { getRawWidths: getRawWidths, getPixelWidths: getPixelWidths, getPercentageWidths: getPercentageWidths, getPixelHeights: getPixelHeights, getRawHeights: getRawHeights }; var total = function (start, end, measures) { var r = 0; for (var i = start; i < end; i++) { r += measures[i] !== undefined ? measures[i] : 0; } return r; }; var recalculateWidth = function (warehouse, widths) { var all = Warehouse.justCells(warehouse); return map(all, function (cell) { var width = total(cell.column(), cell.column() + cell.colspan(), widths); return { element: cell.element, width: constant(width), colspan: cell.colspan }; }); }; var recalculateHeight = function (warehouse, heights) { var all = Warehouse.justCells(warehouse); return map(all, function (cell) { var height = total(cell.row(), cell.row() + cell.rowspan(), heights); return { element: cell.element, height: constant(height), rowspan: cell.rowspan }; }); }; var matchRowHeight = function (warehouse, heights) { return map(warehouse.all(), function (row, i) { return { element: row.element, height: constant(heights[i]) }; }); }; var Recalculations = { recalculateWidth: recalculateWidth, recalculateHeight: recalculateHeight, matchRowHeight: matchRowHeight }; var percentageSize = function (width, element) { var floatWidth = parseFloat(width); var pixelWidth = get$4(element); var getCellDelta = function (delta) { return delta / pixelWidth * 100; }; var singleColumnWidth = function (w, _delta) { return [100 - w]; }; var minCellWidth = function () { return CellUtils.minWidth() / pixelWidth * 100; }; var setTableWidth = function (table, _newWidths, delta) { var ratio = delta / 100; var change = ratio * floatWidth; Sizes.setPercentageWidth(table, floatWidth + change); }; return { width: constant(floatWidth), pixelWidth: constant(pixelWidth), getWidths: ColumnSizes.getPercentageWidths, getCellDelta: getCellDelta, singleColumnWidth: singleColumnWidth, minCellWidth: minCellWidth, setElementWidth: Sizes.setPercentageWidth, setTableWidth: setTableWidth }; }; var pixelSize = function (width) { var getCellDelta = identity; var singleColumnWidth = function (w, delta) { var newNext = Math.max(CellUtils.minWidth(), w + delta); return [newNext - w]; }; var setTableWidth = function (table, newWidths, _delta) { var total = foldr(newWidths, function (b, a) { return b + a; }, 0); Sizes.setPixelWidth(table, total); }; return { width: constant(width), pixelWidth: constant(width), getWidths: ColumnSizes.getPixelWidths, getCellDelta: getCellDelta, singleColumnWidth: singleColumnWidth, minCellWidth: CellUtils.minWidth, setElementWidth: Sizes.setPixelWidth, setTableWidth: setTableWidth }; }; var chooseSize = function (element, width) { var percentMatch = Sizes.percentageBasedSizeRegex().exec(width); if (percentMatch !== null) { return percentageSize(percentMatch[1], element); } var pixelMatch = Sizes.pixelBasedSizeRegex().exec(width); if (pixelMatch !== null) { var intWidth = parseInt(pixelMatch[1], 10); return pixelSize(intWidth); } var fallbackWidth = get$4(element); return pixelSize(fallbackWidth); }; var getTableSize = function (element) { var width = Sizes.getRawWidth(element); return width.fold(function () { var fallbackWidth = get$4(element); return pixelSize(fallbackWidth); }, function (w) { return chooseSize(element, w); }); }; var TableSize = { getTableSize: getTableSize }; var getWarehouse$1 = function (list) { return Warehouse.generate(list); }; var sumUp = function (newSize) { return foldr(newSize, function (b, a) { return b + a; }, 0); }; var getTableWarehouse = function (table) { var list = DetailsList.fromTable(table); return getWarehouse$1(list); }; var adjustWidth = function (table, delta, index, direction) { var tableSize = TableSize.getTableSize(table); var step = tableSize.getCellDelta(delta); var warehouse = getTableWarehouse(table); var widths = tableSize.getWidths(warehouse, direction, tableSize); var deltas = Deltas.determine(widths, index, step, tableSize); var newWidths = map(deltas, function (dx, i) { return dx + widths[i]; }); var newSizes = Recalculations.recalculateWidth(warehouse, newWidths); each(newSizes, function (cell) { tableSize.setElementWidth(cell.element(), cell.width()); }); if (index === warehouse.grid().columns() - 1) { tableSize.setTableWidth(table, newWidths, step); } }; var adjustHeight = function (table, delta, index, direction) { var warehouse = getTableWarehouse(table); var heights = ColumnSizes.getPixelHeights(warehouse, direction); var newHeights = map(heights, function (dy, i) { return index === i ? Math.max(delta + dy, CellUtils.minHeight()) : dy; }); var newCellSizes = Recalculations.recalculateHeight(warehouse, newHeights); var newRowSizes = Recalculations.matchRowHeight(warehouse, newHeights); each(newRowSizes, function (row) { Sizes.setHeight(row.element(), row.height()); }); each(newCellSizes, function (cell) { Sizes.setHeight(cell.element(), cell.height()); }); var total = sumUp(newHeights); Sizes.setHeight(table, total); }; var adjustWidthTo = function (table, list, direction) { var tableSize = TableSize.getTableSize(table); var warehouse = getWarehouse$1(list); var widths = tableSize.getWidths(warehouse, direction, tableSize); var newSizes = Recalculations.recalculateWidth(warehouse, widths); each(newSizes, function (cell) { tableSize.setElementWidth(cell.element(), cell.width()); }); if (newSizes.length > 0) { tableSize.setTableWidth(table, widths, tableSize.getCellDelta(0)); } }; var Adjustments = { adjustWidth: adjustWidth, adjustHeight: adjustHeight, adjustWidthTo: adjustWidthTo }; var Cell = function (initial) { var value = initial; var get = function () { return value; }; var set = function (v) { value = v; }; var clone = function () { return Cell(get()); }; return { get: get, set: set, clone: clone }; }; var base = function (handleUnsupported, required) { return baseWith(handleUnsupported, required, { validate: isFunction, label: 'function' }); }; var baseWith = function (handleUnsupported, required, pred) { if (required.length === 0) { throw new Error('You must specify at least one required field.'); } validateStrArr('required', required); checkDupes(required); return function (obj) { var keys$1 = keys(obj); var allReqd = forall(required, function (req) { return contains(keys$1, req); }); if (!allReqd) { reqMessage(required, keys$1); } handleUnsupported(required, keys$1); var invalidKeys = filter(required, function (key) { return !pred.validate(obj[key], key); }); if (invalidKeys.length > 0) { invalidTypeMessage(invalidKeys, pred.label); } return obj; }; }; var handleExact = function (required, keys) { var unsupported = filter(keys, function (key) { return !contains(required, key); }); if (unsupported.length > 0) { unsuppMessage(unsupported); } }; var exactly = function (required) { return base(handleExact, required); }; var verifyGenerators = exactly([ 'cell', 'row', 'replace', 'gap' ]); var elementToData = function (element) { var colspan = has(element, 'colspan') ? parseInt(get(element, 'colspan'), 10) : 1; var rowspan = has(element, 'rowspan') ? parseInt(get(element, 'rowspan'), 10) : 1; return { element: constant(element), colspan: constant(colspan), rowspan: constant(rowspan) }; }; var modification = function (generators, toData) { if (toData === void 0) { toData = elementToData; } verifyGenerators(generators); var position = Cell(Option.none()); var nu = function (data) { return generators.cell(data); }; var nuFrom = function (element) { var data = toData(element); return nu(data); }; var add = function (element) { var replacement = nuFrom(element); if (position.get().isNone()) { position.set(Option.some(replacement)); } recent = Option.some({ item: element, replacement: replacement }); return replacement; }; var recent = Option.none(); var getOrInit = function (element, comparator) { return recent.fold(function () { return add(element); }, function (p) { return comparator(element, p.item) ? p.replacement : add(element); }); }; return { getOrInit: getOrInit, cursor: position.get }; }; var transform = function (scope, tag) { return function (generators) { var position = Cell(Option.none()); verifyGenerators(generators); var list = []; var find$1 = function (element, comparator) { return find(list, function (x) { return comparator(x.item, element); }); }; var makeNew = function (element) { var attrs = { scope: scope }; var cell = generators.replace(element, tag, attrs); list.push({ item: element, sub: cell }); if (position.get().isNone()) { position.set(Option.some(cell)); } return cell; }; var replaceOrInit = function (element, comparator) { return find$1(element, comparator).fold(function () { return makeNew(element); }, function (p) { return comparator(element, p.item) ? p.sub : makeNew(element); }); }; return { replaceOrInit: replaceOrInit, cursor: position.get }; }; }; var merging = function (generators) { verifyGenerators(generators); var position = Cell(Option.none()); var combine = function (cell) { if (position.get().isNone()) { position.set(Option.some(cell)); } return function () { var raw = generators.cell({ element: constant(cell), colspan: constant(1), rowspan: constant(1) }); remove$1(raw, 'width'); remove$1(cell, 'width'); return raw; }; }; return { combine: combine, cursor: position.get }; }; var Generators = { modification: modification, transform: transform, merging: merging }; var blockList = [ 'body', 'p', 'div', 'article', 'aside', 'figcaption', 'figure', 'footer', 'header', 'nav', 'section', 'ol', 'ul', 'table', 'thead', 'tfoot', 'tbody', 'caption', 'tr', 'td', 'th', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'blockquote', 'pre', 'address' ]; var isList = function (universe, item) { var tagName = universe.property().name(item); return contains([ 'ol', 'ul' ], tagName); }; var isBlock = function (universe, item) { var tagName = universe.property().name(item); return contains(blockList, tagName); }; var isFormatting = function (universe, item) { var tagName = universe.property().name(item); return contains([ 'address', 'pre', 'p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6' ], tagName); }; var isHeading = function (universe, item) { var tagName = universe.property().name(item); return contains([ 'h1', 'h2', 'h3', 'h4', 'h5', 'h6' ], tagName); }; var isContainer = function (universe, item) { return contains([ 'div', 'li', 'td', 'th', 'blockquote', 'body', 'caption' ], universe.property().name(item)); }; var isEmptyTag = function (universe, item) { return contains([ 'br', 'img', 'hr', 'input' ], universe.property().name(item)); }; var isFrame = function (universe, item) { return universe.property().name(item) === 'iframe'; }; var isInline = function (universe, item) { return !(isBlock(universe, item) || isEmptyTag(universe, item)) && universe.property().name(item) !== 'li'; }; var Structure = { isBlock: isBlock, isList: isList, isFormatting: isFormatting, isHeading: isHeading, isContainer: isContainer, isEmptyTag: isEmptyTag, isFrame: isFrame, isInline: isInline }; var universe$1 = DomUniverse(); var isBlock$1 = function (element) { return Structure.isBlock(universe$1, element); }; var isList$1 = function (element) { return Structure.isList(universe$1, element); }; var isFormatting$1 = function (element) { return Structure.isFormatting(universe$1, element); }; var isHeading$1 = function (element) { return Structure.isHeading(universe$1, element); }; var isContainer$1 = function (element) { return Structure.isContainer(universe$1, element); }; var isEmptyTag$1 = function (element) { return Structure.isEmptyTag(universe$1, element); }; var isFrame$1 = function (element) { return Structure.isFrame(universe$1, element); }; var isInline$1 = function (element) { return Structure.isInline(universe$1, element); }; var DomStructure = { isBlock: isBlock$1, isList: isList$1, isFormatting: isFormatting$1, isHeading: isHeading$1, isContainer: isContainer$1, isEmptyTag: isEmptyTag$1, isFrame: isFrame$1, isInline: isInline$1 }; var merge$2 = function (cells) { var isBr = function (el) { return name(el) === 'br'; }; var advancedBr = function (children) { return forall(children, function (c) { return isBr(c) || isText(c) && get$2(c).trim().length === 0; }); }; var isListItem = function (el) { return name(el) === 'li' || ancestor(el, DomStructure.isList).isSome(); }; var siblingIsBlock = function (el) { return nextSibling(el).map(function (rightSibling) { if (DomStructure.isBlock(rightSibling)) { return true; } if (DomStructure.isEmptyTag(rightSibling)) { return name(rightSibling) === 'img' ? false : true; } return false; }).getOr(false); }; var markCell = function (cell) { return last$1(cell).bind(function (rightEdge) { var rightSiblingIsBlock = siblingIsBlock(rightEdge); return parent(rightEdge).map(function (parent) { return rightSiblingIsBlock === true || isListItem(parent) || isBr(rightEdge) || DomStructure.isBlock(parent) && !eq(cell, parent) ? [] : [Element.fromTag('br')]; }); }).getOr([]); }; var markContent = function () { var content = bind(cells, function (cell) { var children$1 = children(cell); return advancedBr(children$1) ? [] : children$1.concat(markCell(cell)); }); return content.length === 0 ? [Element.fromTag('br')] : content; }; var contents = markContent(); empty(cells[0]); append$1(cells[0], contents); }; var TableContent = { merge: merge$2 }; var prune = function (table) { var cells = TableLookup.cells(table); if (cells.length === 0) { remove$2(table); } }; var outcome = Immutable('grid', 'cursor'); var elementFromGrid = function (grid, row, column) { return findIn(grid, row, column).orThunk(function () { return findIn(grid, 0, 0); }); }; var findIn = function (grid, row, column) { return Option.from(grid[row]).bind(function (r) { return Option.from(r.cells()[column]).bind(function (c) { return Option.from(c.element()); }); }); }; var bundle = function (grid, row, column) { return outcome(grid, findIn(grid, row, column)); }; var uniqueRows = function (details) { return foldl(details, function (rest, detail) { return exists(rest, function (currentDetail) { return currentDetail.row() === detail.row(); }) ? rest : rest.concat([detail]); }, []).sort(function (detailA, detailB) { return detailA.row() - detailB.row(); }); }; var uniqueColumns = function (details) { return foldl(details, function (rest, detail) { return exists(rest, function (currentDetail) { return currentDetail.column() === detail.column(); }) ? rest : rest.concat([detail]); }, []).sort(function (detailA, detailB) { return detailA.column() - detailB.column(); }); }; var insertRowBefore = function (grid, detail, comparator, genWrappers) { var example = detail.row(); var targetIndex = detail.row(); var newGrid = ModificationOperations.insertRowAt(grid, targetIndex, example, comparator, genWrappers.getOrInit); return bundle(newGrid, targetIndex, detail.column()); }; var insertRowsBefore = function (grid, details, comparator, genWrappers) { var example = details[0].row(); var targetIndex = details[0].row(); var rows = uniqueRows(details); var newGrid = foldl(rows, function (newG, _row) { return ModificationOperations.insertRowAt(newG, targetIndex, example, comparator, genWrappers.getOrInit); }, grid); return bundle(newGrid, targetIndex, details[0].column()); }; var insertRowAfter = function (grid, detail, comparator, genWrappers) { var example = detail.row(); var targetIndex = detail.row() + detail.rowspan(); var newGrid = ModificationOperations.insertRowAt(grid, targetIndex, example, comparator, genWrappers.getOrInit); return bundle(newGrid, targetIndex, detail.column()); }; var insertRowsAfter = function (grid, details, comparator, genWrappers) { var rows = uniqueRows(details); var example = rows[rows.length - 1].row(); var targetIndex = rows[rows.length - 1].row() + rows[rows.length - 1].rowspan(); var newGrid = foldl(rows, function (newG, _row) { return ModificationOperations.insertRowAt(newG, targetIndex, example, comparator, genWrappers.getOrInit); }, grid); return bundle(newGrid, targetIndex, details[0].column()); }; var insertColumnBefore = function (grid, detail, comparator, genWrappers) { var example = detail.column(); var targetIndex = detail.column(); var newGrid = ModificationOperations.insertColumnAt(grid, targetIndex, example, comparator, genWrappers.getOrInit); return bundle(newGrid, detail.row(), targetIndex); }; var insertColumnsBefore = function (grid, details, comparator, genWrappers) { var columns = uniqueColumns(details); var example = columns[0].column(); var targetIndex = columns[0].column(); var newGrid = foldl(columns, function (newG, _row) { return ModificationOperations.insertColumnAt(newG, targetIndex, example, comparator, genWrappers.getOrInit); }, grid); return bundle(newGrid, details[0].row(), targetIndex); }; var insertColumnAfter = function (grid, detail, comparator, genWrappers) { var example = detail.column(); var targetIndex = detail.column() + detail.colspan(); var newGrid = ModificationOperations.insertColumnAt(grid, targetIndex, example, comparator, genWrappers.getOrInit); return bundle(newGrid, detail.row(), targetIndex); }; var insertColumnsAfter = function (grid, details, comparator, genWrappers) { var example = details[details.length - 1].column(); var targetIndex = details[details.length - 1].column() + details[details.length - 1].colspan(); var columns = uniqueColumns(details); var newGrid = foldl(columns, function (newG, _row) { return ModificationOperations.insertColumnAt(newG, targetIndex, example, comparator, genWrappers.getOrInit); }, grid); return bundle(newGrid, details[0].row(), targetIndex); }; var makeRowHeader = function (grid, detail, comparator, genWrappers) { var newGrid = TransformOperations.replaceRow(grid, detail.row(), comparator, genWrappers.replaceOrInit); return bundle(newGrid, detail.row(), detail.column()); }; var makeColumnHeader = function (grid, detail, comparator, genWrappers) { var newGrid = TransformOperations.replaceColumn(grid, detail.column(), comparator, genWrappers.replaceOrInit); return bundle(newGrid, detail.row(), detail.column()); }; var unmakeRowHeader = function (grid, detail, comparator, genWrappers) { var newGrid = TransformOperations.replaceRow(grid, detail.row(), comparator, genWrappers.replaceOrInit); return bundle(newGrid, detail.row(), detail.column()); }; var unmakeColumnHeader = function (grid, detail, comparator, genWrappers) { var newGrid = TransformOperations.replaceColumn(grid, detail.column(), comparator, genWrappers.replaceOrInit); return bundle(newGrid, detail.row(), detail.column()); }; var splitCellIntoColumns$1 = function (grid, detail, comparator, genWrappers) { var newGrid = ModificationOperations.splitCellIntoColumns(grid, detail.row(), detail.column(), comparator, genWrappers.getOrInit); return bundle(newGrid, detail.row(), detail.column()); }; var splitCellIntoRows$1 = function (grid, detail, comparator, genWrappers) { var newGrid = ModificationOperations.splitCellIntoRows(grid, detail.row(), detail.column(), comparator, genWrappers.getOrInit); return bundle(newGrid, detail.row(), detail.column()); }; var eraseColumns = function (grid, details, _comparator, _genWrappers) { var columns = uniqueColumns(details); var newGrid = ModificationOperations.deleteColumnsAt(grid, columns[0].column(), columns[columns.length - 1].column()); var cursor = elementFromGrid(newGrid, details[0].row(), details[0].column()); return outcome(newGrid, cursor); }; var eraseRows = function (grid, details, _comparator, _genWrappers) { var rows = uniqueRows(details); var newGrid = ModificationOperations.deleteRowsAt(grid, rows[0].row(), rows[rows.length - 1].row()); var cursor = elementFromGrid(newGrid, details[0].row(), details[0].column()); return outcome(newGrid, cursor); }; var mergeCells = function (grid, mergable, comparator, _genWrappers) { var cells = mergable.cells(); TableContent.merge(cells); var newGrid = MergingOperations.merge(grid, mergable.bounds(), comparator, constant(cells[0])); return outcome(newGrid, Option.from(cells[0])); }; var unmergeCells = function (grid, unmergable, comparator, genWrappers) { var newGrid = foldr(unmergable, function (b, cell) { return MergingOperations.unmerge(b, cell, comparator, genWrappers.combine(cell)); }, grid); return outcome(newGrid, Option.from(unmergable[0])); }; var pasteCells = function (grid, pasteDetails, comparator, _genWrappers) { var gridify = function (table, generators) { var list = DetailsList.fromTable(table); var wh = Warehouse.generate(list); return Transitions.toGrid(wh, generators, true); }; var gridB = gridify(pasteDetails.clipboard(), pasteDetails.generators()); var startAddress = address(pasteDetails.row(), pasteDetails.column()); var mergedGrid = TableMerge.merge(startAddress, grid, gridB, pasteDetails.generators(), comparator); return mergedGrid.fold(function () { return outcome(grid, Option.some(pasteDetails.element())); }, function (nuGrid) { var cursor = elementFromGrid(nuGrid, pasteDetails.row(), pasteDetails.column()); return outcome(nuGrid, cursor); }); }; var gridifyRows = function (rows, generators, example) { var pasteDetails = DetailsList.fromPastedRows(rows, example); var wh = Warehouse.generate(pasteDetails); return Transitions.toGrid(wh, generators, true); }; var pasteRowsBefore = function (grid, pasteDetails, comparator, _genWrappers) { var example = grid[pasteDetails.cells[0].row()]; var index = pasteDetails.cells[0].row(); var gridB = gridifyRows(pasteDetails.clipboard(), pasteDetails.generators(), example); var mergedGrid = TableMerge.insert(index, grid, gridB, pasteDetails.generators(), comparator); var cursor = elementFromGrid(mergedGrid, pasteDetails.cells[0].row(), pasteDetails.cells[0].column()); return outcome(mergedGrid, cursor); }; var pasteRowsAfter = function (grid, pasteDetails, comparator, _genWrappers) { var example = grid[pasteDetails.cells[0].row()]; var index = pasteDetails.cells[pasteDetails.cells.length - 1].row() + pasteDetails.cells[pasteDetails.cells.length - 1].rowspan(); var gridB = gridifyRows(pasteDetails.clipboard(), pasteDetails.generators(), example); var mergedGrid = TableMerge.insert(index, grid, gridB, pasteDetails.generators(), comparator); var cursor = elementFromGrid(mergedGrid, pasteDetails.cells[0].row(), pasteDetails.cells[0].column()); return outcome(mergedGrid, cursor); }; var resize = Adjustments.adjustWidthTo; var TableOperations = { insertRowBefore: run(insertRowBefore, onCell, noop, noop, Generators.modification), insertRowsBefore: run(insertRowsBefore, onCells, noop, noop, Generators.modification), insertRowAfter: run(insertRowAfter, onCell, noop, noop, Generators.modification), insertRowsAfter: run(insertRowsAfter, onCells, noop, noop, Generators.modification), insertColumnBefore: run(insertColumnBefore, onCell, resize, noop, Generators.modification), insertColumnsBefore: run(insertColumnsBefore, onCells, resize, noop, Generators.modification), insertColumnAfter: run(insertColumnAfter, onCell, resize, noop, Generators.modification), insertColumnsAfter: run(insertColumnsAfter, onCells, resize, noop, Generators.modification), splitCellIntoColumns: run(splitCellIntoColumns$1, onCell, resize, noop, Generators.modification), splitCellIntoRows: run(splitCellIntoRows$1, onCell, noop, noop, Generators.modification), eraseColumns: run(eraseColumns, onCells, resize, prune, Generators.modification), eraseRows: run(eraseRows, onCells, noop, prune, Generators.modification), makeColumnHeader: run(makeColumnHeader, onCell, noop, noop, Generators.transform('row', 'th')), unmakeColumnHeader: run(unmakeColumnHeader, onCell, noop, noop, Generators.transform(null, 'td')), makeRowHeader: run(makeRowHeader, onCell, noop, noop, Generators.transform('col', 'th')), unmakeRowHeader: run(unmakeRowHeader, onCell, noop, noop, Generators.transform(null, 'td')), mergeCells: run(mergeCells, onMergable, noop, noop, Generators.merging), unmergeCells: run(unmergeCells, onUnmergable, resize, noop, Generators.merging), pasteCells: run(pasteCells, onPaste, resize, noop, Generators.modification), pasteRowsBefore: run(pasteRowsBefore, onPasteRows, noop, noop, Generators.modification), pasteRowsAfter: run(pasteRowsAfter, onPasteRows, noop, noop, Generators.modification) }; var getBody$1 = function (editor) { return Element.fromDom(editor.getBody()); }; var getPixelWidth$1 = function (elm) { return elm.getBoundingClientRect().width; }; var getPixelHeight = function (elm) { return elm.getBoundingClientRect().height; }; var getIsRoot = function (editor) { return function (element) { return eq(element, getBody$1(editor)); }; }; var removePxSuffix = function (size) { return size ? size.replace(/px$/, '') : ''; }; var addSizeSuffix = function (size) { if (/^[0-9]+$/.test(size)) { size += 'px'; } return size; }; var removeDataStyle = function (table) { var dataStyleCells = descendants$1(table, 'td[data-mce-style],th[data-mce-style]'); remove(table, 'data-mce-style'); each(dataStyleCells, function (cell) { remove(cell, 'data-mce-style'); }); }; var getDirection = function (element) { return get$1(element, 'direction') === 'rtl' ? 'rtl' : 'ltr'; }; var ltr$1 = { isRtl: constant(false) }; var rtl$1 = { isRtl: constant(true) }; var directionAt = function (element) { var dir = getDirection(element); return dir === 'rtl' ? rtl$1 : ltr$1; }; var Direction = { directionAt: directionAt }; var defaultTableToolbar = [ 'tableprops', 'tabledelete', '|', 'tableinsertrowbefore', 'tableinsertrowafter', 'tabledeleterow', '|', 'tableinsertcolbefore', 'tableinsertcolafter', 'tabledeletecol' ]; var defaultStyles = { 'border-collapse': 'collapse', 'width': '100%' }; var defaultAttributes = { border: '1' }; var getDefaultAttributes = function (editor) { return editor.getParam('table_default_attributes', defaultAttributes, 'object'); }; var getDefaultStyles = function (editor) { return editor.getParam('table_default_styles', defaultStyles, 'object'); }; var hasTableResizeBars = function (editor) { return editor.getParam('table_resize_bars', true, 'boolean'); }; var hasTabNavigation = function (editor) { return editor.getParam('table_tab_navigation', true, 'boolean'); }; var hasAdvancedCellTab = function (editor) { return editor.getParam('table_cell_advtab', true, 'boolean'); }; var hasAdvancedRowTab = function (editor) { return editor.getParam('table_row_advtab', true, 'boolean'); }; var hasAdvancedTableTab = function (editor) { return editor.getParam('table_advtab', true, 'boolean'); }; var hasAppearanceOptions = function (editor) { return editor.getParam('table_appearance_options', true, 'boolean'); }; var hasTableGrid = function (editor) { return editor.getParam('table_grid', true, 'boolean'); }; var shouldStyleWithCss = function (editor) { return editor.getParam('table_style_by_css', false, 'boolean'); }; var getCellClassList = function (editor) { return editor.getParam('table_cell_class_list', [], 'array'); }; var getRowClassList = function (editor) { return editor.getParam('table_row_class_list', [], 'array'); }; var getTableClassList = function (editor) { return editor.getParam('table_class_list', [], 'array'); }; var getColorPickerCallback = function (editor) { return editor.getParam('color_picker_callback'); }; var isPixelsForced = function (editor) { return editor.getParam('table_responsive_width') === false; }; var getCloneElements = function (editor) { var cloneElements = editor.getParam('table_clone_elements'); if (isString(cloneElements)) { return Option.some(cloneElements.split(/[ ,]/)); } else if (Array.isArray(cloneElements)) { return Option.some(cloneElements); } else { return Option.none(); } }; var hasObjectResizing = function (editor) { var objectResizing = editor.getParam('object_resizing', true); return objectResizing === 'table' || objectResizing; }; var getToolbar = function (editor) { var toolbar = editor.getParam('table_toolbar', defaultTableToolbar); if (toolbar === '' || toolbar === false) { return []; } else if (isString(toolbar)) { return toolbar.split(/[ ,]/); } else if (isArray(toolbar)) { return toolbar; } else { return []; } }; var fireNewRow = function (editor, row) { return editor.fire('newrow', { node: row }); }; var fireNewCell = function (editor, cell) { return editor.fire('newcell', { node: cell }); }; var fireObjectResizeStart = function (editor, target, width, height) { editor.fire('ObjectResizeStart', { target: target, width: width, height: height }); }; var fireObjectResized = function (editor, target, width, height) { editor.fire('ObjectResized', { target: target, width: width, height: height }); }; var TableActions = function (editor, lazyWire) { var isTableBody = function (editor) { return name(getBody$1(editor)) === 'table'; }; var lastRowGuard = function (table) { var size = TableGridSize.getGridSize(table); return isTableBody(editor) === false || size.rows() > 1; }; var lastColumnGuard = function (table) { var size = TableGridSize.getGridSize(table); return isTableBody(editor) === false || size.columns() > 1; }; var cloneFormats = getCloneElements(editor); var execute = function (operation, guard, mutate, lazyWire) { return function (table, target) { removeDataStyle(table); var wire = lazyWire(); var doc = Element.fromDom(editor.getDoc()); var direction = TableDirection(Direction.directionAt); var generators = TableFill.cellOperations(mutate, doc, cloneFormats); return guard(table) ? operation(wire, table, target, generators, direction).bind(function (result) { each(result.newRows(), function (row) { fireNewRow(editor, row.dom()); }); each(result.newCells(), function (cell) { fireNewCell(editor, cell.dom()); }); return result.cursor().map(function (cell) { var rng = editor.dom.createRng(); rng.setStart(cell.dom(), 0); rng.setEnd(cell.dom(), 0); return rng; }); }) : Option.none(); }; }; var deleteRow = execute(TableOperations.eraseRows, lastRowGuard, noop, lazyWire); var deleteColumn = execute(TableOperations.eraseColumns, lastColumnGuard, noop, lazyWire); var insertRowsBefore = execute(TableOperations.insertRowsBefore, always, noop, lazyWire); var insertRowsAfter = execute(TableOperations.insertRowsAfter, always, noop, lazyWire); var insertColumnsBefore = execute(TableOperations.insertColumnsBefore, always, CellMutations.halve, lazyWire); var insertColumnsAfter = execute(TableOperations.insertColumnsAfter, always, CellMutations.halve, lazyWire); var mergeCells = execute(TableOperations.mergeCells, always, noop, lazyWire); var unmergeCells = execute(TableOperations.unmergeCells, always, noop, lazyWire); var pasteRowsBefore = execute(TableOperations.pasteRowsBefore, always, noop, lazyWire); var pasteRowsAfter = execute(TableOperations.pasteRowsAfter, always, noop, lazyWire); var pasteCells = execute(TableOperations.pasteCells, always, noop, lazyWire); return { deleteRow: deleteRow, deleteColumn: deleteColumn, insertRowsBefore: insertRowsBefore, insertRowsAfter: insertRowsAfter, insertColumnsBefore: insertColumnsBefore, insertColumnsAfter: insertColumnsAfter, mergeCells: mergeCells, unmergeCells: unmergeCells, pasteRowsBefore: pasteRowsBefore, pasteRowsAfter: pasteRowsAfter, pasteCells: pasteCells }; }; var copyRows = function (table, target, generators) { var list = DetailsList.fromTable(table); var house = Warehouse.generate(list); var details = onCells(house, target); return details.map(function (selectedCells) { var grid = Transitions.toGrid(house, generators, false); var slicedGrid = grid.slice(selectedCells[0].row(), selectedCells[selectedCells.length - 1].row() + selectedCells[selectedCells.length - 1].rowspan()); var slicedDetails = toDetailList(slicedGrid, generators); return Redraw.copy(slicedDetails); }); }; var CopyRows = { copyRows: copyRows }; var global$1 = tinymce.util.Tools.resolve('tinymce.util.Tools'); var getTDTHOverallStyle = function (dom, elm, name) { var cells = dom.select('td,th', elm); var firstChildStyle; var checkChildren = function (firstChildStyle, elms) { for (var i = 0; i < elms.length; i++) { var currentStyle = dom.getStyle(elms[i], name); if (typeof firstChildStyle === 'undefined') { firstChildStyle = currentStyle; } if (firstChildStyle !== currentStyle) { return ''; } } return firstChildStyle; }; firstChildStyle = checkChildren(firstChildStyle, cells); return firstChildStyle; }; var applyAlign = function (editor, elm, name) { if (name) { editor.formatter.apply('align' + name, {}, elm); } }; var applyVAlign = function (editor, elm, name) { if (name) { editor.formatter.apply('valign' + name, {}, elm); } }; var unApplyAlign = function (editor, elm) { global$1.each('left center right'.split(' '), function (name) { editor.formatter.remove('align' + name, {}, elm); }); }; var unApplyVAlign = function (editor, elm) { global$1.each('top middle bottom'.split(' '), function (name) { editor.formatter.remove('valign' + name, {}, elm); }); }; var Styles$1 = { applyAlign: applyAlign, applyVAlign: applyVAlign, unApplyAlign: unApplyAlign, unApplyVAlign: unApplyVAlign, getTDTHOverallStyle: getTDTHOverallStyle }; var buildListItems = function (inputList, itemCallback, startItems) { var appendItems = function (values, output) { output = output || []; global$1.each(values, function (item) { var menuItem = { text: item.text || item.title }; if (item.menu) { menuItem.menu = appendItems(item.menu); } else { menuItem.value = item.value; if (itemCallback) { itemCallback(menuItem); } } output.push(menuItem); }); return output; }; return appendItems(inputList, startItems || []); }; function styleFieldHasFocus(e) { return e.control.rootControl.find('#style')[0].getEl().isEqualNode(domGlobals.document.activeElement); } var syncAdvancedStyleFields = function (editor, evt) { if (styleFieldHasFocus(evt)) { updateAdvancedFields(editor, evt); } else { updateStyleField(editor, evt); } }; var updateStyleField = function (editor, evt) { var dom = editor.dom; var rootControl = evt.control.rootControl; var data = rootControl.toJSON(); var css = dom.parseStyle(data.style); css['border-style'] = data.borderStyle; css['border-color'] = data.borderColor; css['background-color'] = data.backgroundColor; css.width = data.width ? addSizeSuffix(data.width) : ''; css.height = data.height ? addSizeSuffix(data.height) : ''; rootControl.find('#style').value(dom.serializeStyle(dom.parseStyle(dom.serializeStyle(css)))); }; var updateAdvancedFields = function (editor, evt) { var dom = editor.dom; var rootControl = evt.control.rootControl; var data = rootControl.toJSON(); var css = dom.parseStyle(data.style); rootControl.find('#borderStyle').value(css['border-style'] || ''); rootControl.find('#borderColor').value(css['border-color'] || ''); rootControl.find('#backgroundColor').value(css['background-color'] || ''); rootControl.find('#width').value(css.width || ''); rootControl.find('#height').value(css.height || ''); }; var extractAdvancedStyles = function (dom, elm) { var css = dom.parseStyle(dom.getAttrib(elm, 'style')); var data = {}; if (css['border-style']) { data.borderStyle = css['border-style']; } if (css['border-color']) { data.borderColor = css['border-color']; } if (css['background-color']) { data.backgroundColor = css['background-color']; } data.style = dom.serializeStyle(css); return data; }; var createStyleForm = function (editor) { var createColorPickAction = function () { var colorPickerCallback = getColorPickerCallback(editor); if (colorPickerCallback) { return function (evt) { return colorPickerCallback.call(editor, function (value) { evt.control.value(value).fire('change'); }, evt.control.value()); }; } }; return { title: 'Advanced', type: 'form', defaults: { onchange: curry(updateStyleField, editor) }, items: [ { label: 'Style', name: 'style', type: 'textbox', onchange: curry(updateAdvancedFields, editor) }, { type: 'form', padding: 0, formItemDefaults: { layout: 'grid', alignH: [ 'start', 'right' ] }, defaults: { size: 7 }, items: [ { label: 'Border style', type: 'listbox', name: 'borderStyle', width: 90, onselect: curry(updateStyleField, editor), values: [ { text: 'Select...', value: '' }, { text: 'Solid', value: 'solid' }, { text: 'Dotted', value: 'dotted' }, { text: 'Dashed', value: 'dashed' }, { text: 'Double', value: 'double' }, { text: 'Groove', value: 'groove' }, { text: 'Ridge', value: 'ridge' }, { text: 'Inset', value: 'inset' }, { text: 'Outset', value: 'outset' }, { text: 'None', value: 'none' }, { text: 'Hidden', value: 'hidden' } ] }, { label: 'Border color', type: 'colorbox', name: 'borderColor', onaction: createColorPickAction() }, { label: 'Background color', type: 'colorbox', name: 'backgroundColor', onaction: createColorPickAction() } ] } ] }; }; var Helpers = { createStyleForm: createStyleForm, buildListItems: buildListItems, updateStyleField: updateStyleField, extractAdvancedStyles: extractAdvancedStyles, updateAdvancedFields: updateAdvancedFields, syncAdvancedStyleFields: syncAdvancedStyleFields }; var updateStyles = function (elm, cssText) { delete elm.dataset.mceStyle; elm.style.cssText += ';' + cssText; }; var extractDataFromElement = function (editor, elm) { var dom = editor.dom; var data = { width: dom.getStyle(elm, 'width') || dom.getAttrib(elm, 'width'), height: dom.getStyle(elm, 'height') || dom.getAttrib(elm, 'height'), scope: dom.getAttrib(elm, 'scope'), class: dom.getAttrib(elm, 'class'), type: elm.nodeName.toLowerCase(), style: '', align: '', valign: '' }; global$1.each('left center right'.split(' '), function (name) { if (editor.formatter.matchNode(elm, 'align' + name)) { data.align = name; } }); global$1.each('top middle bottom'.split(' '), function (name) { if (editor.formatter.matchNode(elm, 'valign' + name)) { data.valign = name; } }); if (hasAdvancedCellTab(editor)) { global$1.extend(data, Helpers.extractAdvancedStyles(dom, elm)); } return data; }; var onSubmitCellForm = function (editor, cells, evt) { var dom = editor.dom; var data; function setAttrib(elm, name, value) { if (cells.length === 1 || value) { dom.setAttrib(elm, name, value); } } function setStyle(elm, name, value) { if (cells.length === 1 || value) { dom.setStyle(elm, name, value); } } if (hasAdvancedCellTab(editor)) { Helpers.syncAdvancedStyleFields(editor, evt); } data = evt.control.rootControl.toJSON(); editor.undoManager.transact(function () { global$1.each(cells, function (cellElm) { setAttrib(cellElm, 'scope', data.scope); if (cells.length === 1) { setAttrib(cellElm, 'style', data.style); } else { updateStyles(cellElm, data.style); } setAttrib(cellElm, 'class', data.class); setStyle(cellElm, 'width', addSizeSuffix(data.width)); setStyle(cellElm, 'height', addSizeSuffix(data.height)); if (data.type && cellElm.nodeName.toLowerCase() !== data.type) { cellElm = dom.rename(cellElm, data.type); } if (cells.length === 1) { Styles$1.unApplyAlign(editor, cellElm); Styles$1.unApplyVAlign(editor, cellElm); } if (data.align) { Styles$1.applyAlign(editor, cellElm, data.align); } if (data.valign) { Styles$1.applyVAlign(editor, cellElm, data.valign); } }); editor.focus(); }); }; var open = function (editor) { var cellElm, data, classListCtrl, cells = []; cells = editor.dom.select('td[data-mce-selected],th[data-mce-selected]'); cellElm = editor.dom.getParent(editor.selection.getStart(), 'td,th'); if (!cells.length && cellElm) { cells.push(cellElm); } cellElm = cellElm || cells[0]; if (!cellElm) { return; } if (cells.length > 1) { data = { width: '', height: '', scope: '', class: '', align: '', valign: '', style: '', type: cellElm.nodeName.toLowerCase() }; } else { data = extractDataFromElement(editor, cellElm); } if (getCellClassList(editor).length > 0) { classListCtrl = { name: 'class', type: 'listbox', label: 'Class', values: Helpers.buildListItems(getCellClassList(editor), function (item) { if (item.value) { item.textStyle = function () { return editor.formatter.getCssText({ block: 'td', classes: [item.value] }); }; } }) }; } var generalCellForm = { type: 'form', layout: 'flex', direction: 'column', labelGapCalc: 'children', padding: 0, items: [ { type: 'form', layout: 'grid', columns: 2, labelGapCalc: false, padding: 0, defaults: { type: 'textbox', maxWidth: 50 }, items: [ { label: 'Width', name: 'width', onchange: curry(Helpers.updateStyleField, editor) }, { label: 'Height', name: 'height', onchange: curry(Helpers.updateStyleField, editor) }, { label: 'Cell type', name: 'type', type: 'listbox', text: 'None', minWidth: 90, maxWidth: null, values: [ { text: 'Cell', value: 'td' }, { text: 'Header cell', value: 'th' } ] }, { label: 'Scope', name: 'scope', type: 'listbox', text: 'None', minWidth: 90, maxWidth: null, values: [ { text: 'None', value: '' }, { text: 'Row', value: 'row' }, { text: 'Column', value: 'col' }, { text: 'Row group', value: 'rowgroup' }, { text: 'Column group', value: 'colgroup' } ] }, { label: 'H Align', name: 'align', type: 'listbox', text: 'None', minWidth: 90, maxWidth: null, values: [ { text: 'None', value: '' }, { text: 'Left', value: 'left' }, { text: 'Center', value: 'center' }, { text: 'Right', value: 'right' } ] }, { label: 'V Align', name: 'valign', type: 'listbox', text: 'None', minWidth: 90, maxWidth: null, values: [ { text: 'None', value: '' }, { text: 'Top', value: 'top' }, { text: 'Middle', value: 'middle' }, { text: 'Bottom', value: 'bottom' } ] } ] }, classListCtrl ] }; if (hasAdvancedCellTab(editor)) { editor.windowManager.open({ title: 'Cell properties', bodyType: 'tabpanel', data: data, body: [ { title: 'General', type: 'form', items: generalCellForm }, Helpers.createStyleForm(editor) ], onsubmit: curry(onSubmitCellForm, editor, cells) }); } else { editor.windowManager.open({ title: 'Cell properties', data: data, body: generalCellForm, onsubmit: curry(onSubmitCellForm, editor, cells) }); } }; var CellDialog = { open: open }; var extractDataFromElement$1 = function (editor, elm) { var dom = editor.dom; var data = { height: dom.getStyle(elm, 'height') || dom.getAttrib(elm, 'height'), scope: dom.getAttrib(elm, 'scope'), class: dom.getAttrib(elm, 'class'), align: '', style: '', type: elm.parentNode.nodeName.toLowerCase() }; global$1.each('left center right'.split(' '), function (name) { if (editor.formatter.matchNode(elm, 'align' + name)) { data.align = name; } }); if (hasAdvancedRowTab(editor)) { global$1.extend(data, Helpers.extractAdvancedStyles(dom, elm)); } return data; }; var switchRowType = function (dom, rowElm, toType) { var tableElm = dom.getParent(rowElm, 'table'); var oldParentElm = rowElm.parentNode; var parentElm = dom.select(toType, tableElm)[0]; if (!parentElm) { parentElm = dom.create(toType); if (tableElm.firstChild) { if (tableElm.firstChild.nodeName === 'CAPTION') { dom.insertAfter(parentElm, tableElm.firstChild); } else { tableElm.insertBefore(parentElm, tableElm.firstChild); } } else { tableElm.appendChild(parentElm); } } parentElm.appendChild(rowElm); if (!oldParentElm.hasChildNodes()) { dom.remove(oldParentElm); } }; function onSubmitRowForm(editor, rows, oldData, evt) { var dom = editor.dom; function setAttrib(elm, name, value) { if (rows.length === 1 || value) { dom.setAttrib(elm, name, value); } } function setStyle(elm, name, value) { if (rows.length === 1 || value) { dom.setStyle(elm, name, value); } } if (hasAdvancedRowTab(editor)) { Helpers.syncAdvancedStyleFields(editor, evt); } var data = evt.control.rootControl.toJSON(); editor.undoManager.transact(function () { global$1.each(rows, function (rowElm) { setAttrib(rowElm, 'scope', data.scope); setAttrib(rowElm, 'style', data.style); setAttrib(rowElm, 'class', data.class); setStyle(rowElm, 'height', addSizeSuffix(data.height)); if (data.type !== rowElm.parentNode.nodeName.toLowerCase()) { switchRowType(editor.dom, rowElm, data.type); } if (data.align !== oldData.align) { Styles$1.unApplyAlign(editor, rowElm); Styles$1.applyAlign(editor, rowElm, data.align); } }); editor.focus(); }); } var open$1 = function (editor) { var dom = editor.dom; var tableElm, cellElm, rowElm, classListCtrl, data; var rows = []; var generalRowForm; tableElm = dom.getParent(editor.selection.getStart(), 'table'); cellElm = dom.getParent(editor.selection.getStart(), 'td,th'); global$1.each(tableElm.rows, function (row) { global$1.each(row.cells, function (cell) { if (dom.getAttrib(cell, 'data-mce-selected') || cell === cellElm) { rows.push(row); return false; } }); }); rowElm = rows[0]; if (!rowElm) { return; } if (rows.length > 1) { data = { height: '', scope: '', style: '', class: '', align: '', type: rowElm.parentNode.nodeName.toLowerCase() }; } else { data = extractDataFromElement$1(editor, rowElm); } if (getRowClassList(editor).length > 0) { classListCtrl = { name: 'class', type: 'listbox', label: 'Class', values: Helpers.buildListItems(getRowClassList(editor), function (item) { if (item.value) { item.textStyle = function () { return editor.formatter.getCssText({ block: 'tr', classes: [item.value] }); }; } }) }; } generalRowForm = { type: 'form', columns: 2, padding: 0, defaults: { type: 'textbox' }, items: [ { type: 'listbox', name: 'type', label: 'Row type', text: 'Header', maxWidth: null, values: [ { text: 'Header', value: 'thead' }, { text: 'Body', value: 'tbody' }, { text: 'Footer', value: 'tfoot' } ] }, { type: 'listbox', name: 'align', label: 'Alignment', text: 'None', maxWidth: null, values: [ { text: 'None', value: '' }, { text: 'Left', value: 'left' }, { text: 'Center', value: 'center' }, { text: 'Right', value: 'right' } ] }, { label: 'Height', name: 'height' }, classListCtrl ] }; if (hasAdvancedRowTab(editor)) { editor.windowManager.open({ title: 'Row properties', data: data, bodyType: 'tabpanel', body: [ { title: 'General', type: 'form', items: generalRowForm }, Helpers.createStyleForm(editor) ], onsubmit: curry(onSubmitRowForm, editor, rows, data) }); } else { editor.windowManager.open({ title: 'Row properties', data: data, body: generalRowForm, onsubmit: curry(onSubmitRowForm, editor, rows, data) }); } }; var RowDialog = { open: open$1 }; var global$2 = tinymce.util.Tools.resolve('tinymce.Env'); var DefaultRenderOptions = { styles: { 'border-collapse': 'collapse', 'width': '100%' }, attributes: { border: '1' }, percentages: true }; var makeTable = function () { return Element.fromTag('table'); }; var tableBody = function () { return Element.fromTag('tbody'); }; var tableRow = function () { return Element.fromTag('tr'); }; var tableHeaderCell = function () { return Element.fromTag('th'); }; var tableCell = function () { return Element.fromTag('td'); }; var render$1 = function (rows, columns, rowHeaders, columnHeaders, renderOpts) { if (renderOpts === void 0) { renderOpts = DefaultRenderOptions; } var table = makeTable(); setAll$1(table, renderOpts.styles); setAll(table, renderOpts.attributes); var tbody = tableBody(); append(table, tbody); var trs = []; for (var i = 0; i < rows; i++) { var tr = tableRow(); for (var j = 0; j < columns; j++) { var td = i < rowHeaders || j < columnHeaders ? tableHeaderCell() : tableCell(); if (j < columnHeaders) { set(td, 'scope', 'row'); } if (i < rowHeaders) { set(td, 'scope', 'col'); } append(td, Element.fromTag('br')); if (renderOpts.percentages) { set$1(td, 'width', 100 / columns + '%'); } append(tr, td); } trs.push(tr); } append$1(tbody, trs); return table; }; var get$7 = function (element) { return element.dom().innerHTML; }; var getOuter$2 = function (element) { var container = Element.fromTag('div'); var clone = Element.fromDom(element.dom().cloneNode(true)); append(container, clone); return get$7(container); }; var placeCaretInCell = function (editor, cell) { editor.selection.select(cell.dom(), true); editor.selection.collapse(true); }; var selectFirstCellInTable = function (editor, tableElm) { descendant$1(tableElm, 'td,th').each(curry(placeCaretInCell, editor)); }; var fireEvents = function (editor, table) { each(descendants$1(table, 'tr'), function (row) { fireNewRow(editor, row.dom()); each(descendants$1(row, 'th,td'), function (cell) { fireNewCell(editor, cell.dom()); }); }); }; var isPercentage = function (width) { return isString(width) && width.indexOf('%') !== -1; }; var insert$1 = function (editor, columns, rows) { var defaultStyles = getDefaultStyles(editor); var options = { styles: defaultStyles, attributes: getDefaultAttributes(editor), percentages: isPercentage(defaultStyles.width) && !isPixelsForced(editor) }; var table = render$1(rows, columns, 0, 0, options); set(table, 'data-mce-id', '__mce'); var html = getOuter$2(table); editor.insertContent(html); return descendant$1(getBody$1(editor), 'table[data-mce-id="__mce"]').map(function (table) { if (isPixelsForced(editor)) { set$1(table, 'width', get$1(table, 'width')); } remove(table, 'data-mce-id'); fireEvents(editor, table); selectFirstCellInTable(editor, table); return table.dom(); }).getOr(null); }; var InsertTable = { insert: insert$1 }; function styleTDTH(dom, elm, name, value) { if (elm.tagName === 'TD' || elm.tagName === 'TH') { dom.setStyle(elm, name, value); } else { if (elm.children) { for (var i = 0; i < elm.children.length; i++) { styleTDTH(dom, elm.children[i], name, value); } } } } var extractDataFromElement$2 = function (editor, tableElm) { var dom = editor.dom; var data = { width: dom.getStyle(tableElm, 'width') || dom.getAttrib(tableElm, 'width'), height: dom.getStyle(tableElm, 'height') || dom.getAttrib(tableElm, 'height'), cellspacing: dom.getStyle(tableElm, 'border-spacing') || dom.getAttrib(tableElm, 'cellspacing'), cellpadding: dom.getAttrib(tableElm, 'data-mce-cell-padding') || dom.getAttrib(tableElm, 'cellpadding') || Styles$1.getTDTHOverallStyle(editor.dom, tableElm, 'padding'), border: dom.getAttrib(tableElm, 'data-mce-border') || dom.getAttrib(tableElm, 'border') || Styles$1.getTDTHOverallStyle(editor.dom, tableElm, 'border'), borderColor: dom.getAttrib(tableElm, 'data-mce-border-color'), caption: !!dom.select('caption', tableElm)[0], class: dom.getAttrib(tableElm, 'class') }; global$1.each('left center right'.split(' '), function (name) { if (editor.formatter.matchNode(tableElm, 'align' + name)) { data.align = name; } }); if (hasAdvancedTableTab(editor)) { global$1.extend(data, Helpers.extractAdvancedStyles(dom, tableElm)); } return data; }; var applyDataToElement = function (editor, tableElm, data) { var dom = editor.dom; var attrs = {}; var styles = {}; attrs.class = data.class; styles.height = addSizeSuffix(data.height); if (dom.getAttrib(tableElm, 'width') && !shouldStyleWithCss(editor)) { attrs.width = removePxSuffix(data.width); } else { styles.width = addSizeSuffix(data.width); } if (shouldStyleWithCss(editor)) { styles['border-width'] = addSizeSuffix(data.border); styles['border-spacing'] = addSizeSuffix(data.cellspacing); global$1.extend(attrs, { 'data-mce-border-color': data.borderColor, 'data-mce-cell-padding': data.cellpadding, 'data-mce-border': data.border }); } else { global$1.extend(attrs, { border: data.border, cellpadding: data.cellpadding, cellspacing: data.cellspacing }); } if (shouldStyleWithCss(editor)) { if (tableElm.children) { for (var i = 0; i < tableElm.children.length; i++) { styleTDTH(dom, tableElm.children[i], { 'border-width': addSizeSuffix(data.border), 'border-color': data.borderColor, 'padding': addSizeSuffix(data.cellpadding) }); } } } if (data.style) { global$1.extend(styles, dom.parseStyle(data.style)); } else { styles = global$1.extend({}, dom.parseStyle(dom.getAttrib(tableElm, 'style')), styles); } attrs.style = dom.serializeStyle(styles); dom.setAttribs(tableElm, attrs); }; var onSubmitTableForm = function (editor, tableElm, evt) { var dom = editor.dom; var captionElm; var data; if (hasAdvancedTableTab(editor)) { Helpers.syncAdvancedStyleFields(editor, evt); } data = evt.control.rootControl.toJSON(); if (data.class === false) { delete data.class; } editor.undoManager.transact(function () { if (!tableElm) { tableElm = InsertTable.insert(editor, data.cols || 1, data.rows || 1); } applyDataToElement(editor, tableElm, data); captionElm = dom.select('caption', tableElm)[0]; if (captionElm && !data.caption) { dom.remove(captionElm); } if (!captionElm && data.caption) { captionElm = dom.create('caption'); captionElm.innerHTML = !global$2.ie ? '
    ' : '\xA0'; tableElm.insertBefore(captionElm, tableElm.firstChild); } Styles$1.unApplyAlign(editor, tableElm); if (data.align) { Styles$1.applyAlign(editor, tableElm, data.align); } editor.focus(); editor.addVisual(); }); }; var open$2 = function (editor, isProps) { var dom = editor.dom; var tableElm, colsCtrl, rowsCtrl, classListCtrl, data = {}, generalTableForm; if (isProps === true) { tableElm = dom.getParent(editor.selection.getStart(), 'table'); if (tableElm) { data = extractDataFromElement$2(editor, tableElm); } } else { colsCtrl = { label: 'Cols', name: 'cols' }; rowsCtrl = { label: 'Rows', name: 'rows' }; } if (getTableClassList(editor).length > 0) { if (data.class) { data.class = data.class.replace(/\s*mce\-item\-table\s*/g, ''); } classListCtrl = { name: 'class', type: 'listbox', label: 'Class', values: Helpers.buildListItems(getTableClassList(editor), function (item) { if (item.value) { item.textStyle = function () { return editor.formatter.getCssText({ block: 'table', classes: [item.value] }); }; } }) }; } generalTableForm = { type: 'form', layout: 'flex', direction: 'column', labelGapCalc: 'children', padding: 0, items: [ { type: 'form', labelGapCalc: false, padding: 0, layout: 'grid', columns: 2, defaults: { type: 'textbox', maxWidth: 50 }, items: hasAppearanceOptions(editor) ? [ colsCtrl, rowsCtrl, { label: 'Width', name: 'width', onchange: curry(Helpers.updateStyleField, editor) }, { label: 'Height', name: 'height', onchange: curry(Helpers.updateStyleField, editor) }, { label: 'Cell spacing', name: 'cellspacing' }, { label: 'Cell padding', name: 'cellpadding' }, { label: 'Border', name: 'border' }, { label: 'Caption', name: 'caption', type: 'checkbox' } ] : [ colsCtrl, rowsCtrl, { label: 'Width', name: 'width', onchange: curry(Helpers.updateStyleField, editor) }, { label: 'Height', name: 'height', onchange: curry(Helpers.updateStyleField, editor) } ] }, { label: 'Alignment', name: 'align', type: 'listbox', text: 'None', values: [ { text: 'None', value: '' }, { text: 'Left', value: 'left' }, { text: 'Center', value: 'center' }, { text: 'Right', value: 'right' } ] }, classListCtrl ] }; if (hasAdvancedTableTab(editor)) { editor.windowManager.open({ title: 'Table properties', data: data, bodyType: 'tabpanel', body: [ { title: 'General', type: 'form', items: generalTableForm }, Helpers.createStyleForm(editor) ], onsubmit: curry(onSubmitTableForm, editor, tableElm) }); } else { editor.windowManager.open({ title: 'Table properties', data: data, body: generalTableForm, onsubmit: curry(onSubmitTableForm, editor, tableElm) }); } }; var TableDialog = { open: open$2 }; var each$3 = global$1.each; var registerCommands = function (editor, actions, cellSelection, selections, clipboardRows) { var isRoot = getIsRoot(editor); var eraseTable = function () { getSelectionStartCell().orThunk(getSelectionStartCaption).each(function (cellOrCaption) { var table = TableLookup.table(cellOrCaption, isRoot); table.filter(not(isRoot)).each(function (table) { var cursor = Element.fromText(''); after(table, cursor); remove$2(table); var rng = editor.dom.createRng(); rng.setStart(cursor.dom(), 0); rng.setEnd(cursor.dom(), 0); editor.selection.setRng(rng); }); }); }; var getSelectionStartFromSelector = function (selector) { return function () { return Option.from(editor.dom.getParent(editor.selection.getStart(), selector)).map(Element.fromDom); }; }; var getSelectionStartCaption = getSelectionStartFromSelector('caption'); var getSelectionStartCell = getSelectionStartFromSelector('th,td'); var getTableFromCell = function (cell) { return TableLookup.table(cell, isRoot); }; var getSize = function (table) { return { width: getPixelWidth$1(table.dom()), height: getPixelWidth$1(table.dom()) }; }; var resizeChange = function (editor, oldSize, table) { var newSize = getSize(table); if (oldSize.width !== newSize.width || oldSize.height !== newSize.height) { fireObjectResizeStart(editor, table.dom(), oldSize.width, oldSize.height); fireObjectResized(editor, table.dom(), newSize.width, newSize.height); } }; var actOnSelection = function (execute) { getSelectionStartCell().each(function (cell) { getTableFromCell(cell).each(function (table) { var targets = TableTargets.forMenu(selections, table, cell); var beforeSize = getSize(table); execute(table, targets).each(function (rng) { resizeChange(editor, beforeSize, table); editor.selection.setRng(rng); editor.focus(); cellSelection.clear(table); removeDataStyle(table); }); }); }); }; var copyRowSelection = function (execute) { return getSelectionStartCell().bind(function (cell) { return getTableFromCell(cell).bind(function (table) { var doc = Element.fromDom(editor.getDoc()); var targets = TableTargets.forMenu(selections, table, cell); var generators = TableFill.cellOperations(noop, doc, Option.none()); return CopyRows.copyRows(table, targets, generators); }); }); }; var pasteOnSelection = function (execute) { clipboardRows.get().each(function (rows) { var clonedRows = map(rows, function (row) { return deep(row); }); getSelectionStartCell().each(function (cell) { getTableFromCell(cell).each(function (table) { var doc = Element.fromDom(editor.getDoc()); var generators = TableFill.paste(doc); var targets = TableTargets.pasteRows(selections, table, cell, clonedRows, generators); execute(table, targets).each(function (rng) { editor.selection.setRng(rng); editor.focus(); cellSelection.clear(table); }); }); }); }); }; each$3({ mceTableSplitCells: function () { actOnSelection(actions.unmergeCells); }, mceTableMergeCells: function () { actOnSelection(actions.mergeCells); }, mceTableInsertRowBefore: function () { actOnSelection(actions.insertRowsBefore); }, mceTableInsertRowAfter: function () { actOnSelection(actions.insertRowsAfter); }, mceTableInsertColBefore: function () { actOnSelection(actions.insertColumnsBefore); }, mceTableInsertColAfter: function () { actOnSelection(actions.insertColumnsAfter); }, mceTableDeleteCol: function () { actOnSelection(actions.deleteColumn); }, mceTableDeleteRow: function () { actOnSelection(actions.deleteRow); }, mceTableCutRow: function (grid) { clipboardRows.set(copyRowSelection()); actOnSelection(actions.deleteRow); }, mceTableCopyRow: function (grid) { clipboardRows.set(copyRowSelection()); }, mceTablePasteRowBefore: function (grid) { pasteOnSelection(actions.pasteRowsBefore); }, mceTablePasteRowAfter: function (grid) { pasteOnSelection(actions.pasteRowsAfter); }, mceTableDelete: eraseTable }, function (func, name) { editor.addCommand(name, func); }); each$3({ mceInsertTable: curry(TableDialog.open, editor), mceTableProps: curry(TableDialog.open, editor, true), mceTableRowProps: curry(RowDialog.open, editor), mceTableCellProps: curry(CellDialog.open, editor) }, function (func, name) { editor.addCommand(name, function (ui, val) { func(val); }); }); }; var Commands = { registerCommands: registerCommands }; var only = function (element) { var parent = Option.from(element.dom().documentElement).map(Element.fromDom).getOr(element); return { parent: constant(parent), view: constant(element), origin: constant(Position(0, 0)) }; }; var detached = function (editable, chrome) { var origin = function () { return absolute(chrome); }; return { parent: constant(chrome), view: constant(editable), origin: origin }; }; var body$1 = function (editable, chrome) { return { parent: constant(chrome), view: constant(editable), origin: constant(Position(0, 0)) }; }; var ResizeWire = { only: only, detached: detached, body: body$1 }; var Event = function (fields) { var struct = Immutable.apply(null, fields); var handlers = []; var bind = function (handler) { if (handler === undefined) { throw new Error('Event bind error: undefined handler'); } handlers.push(handler); }; var unbind = function (handler) { handlers = filter(handlers, function (h) { return h !== handler; }); }; var trigger = function () { var args = []; for (var _i = 0; _i < arguments.length; _i++) { args[_i] = arguments[_i]; } var event = struct.apply(null, args); each(handlers, function (handler) { handler(event); }); }; return { bind: bind, unbind: unbind, trigger: trigger }; }; var create$1 = function (typeDefs) { var registry = map$1(typeDefs, function (event) { return { bind: event.bind, unbind: event.unbind }; }); var trigger = map$1(typeDefs, function (event) { return event.trigger; }); return { registry: registry, trigger: trigger }; }; var Events = { create: create$1 }; var mkEvent = function (target, x, y, stop, prevent, kill, raw) { return { target: constant(target), x: constant(x), y: constant(y), stop: stop, prevent: prevent, kill: kill, raw: constant(raw) }; }; var handle = function (filter, handler) { return function (rawEvent) { if (!filter(rawEvent)) { return; } var target = Element.fromDom(rawEvent.target); var stop = function () { rawEvent.stopPropagation(); }; var prevent = function () { rawEvent.preventDefault(); }; var kill = compose(prevent, stop); var evt = mkEvent(target, rawEvent.clientX, rawEvent.clientY, stop, prevent, kill, rawEvent); handler(evt); }; }; var binder = function (element, event, filter, handler, useCapture) { var wrapped = handle(filter, handler); element.dom().addEventListener(event, wrapped, useCapture); return { unbind: curry(unbind, element, event, wrapped, useCapture) }; }; var bind$1 = function (element, event, filter, handler) { return binder(element, event, filter, handler, false); }; var unbind = function (element, event, handler, useCapture) { element.dom().removeEventListener(event, handler, useCapture); }; var filter$1 = constant(true); var bind$2 = function (element, event, handler) { return bind$1(element, event, filter$1, handler); }; var hasOwnProperty = Object.prototype.hasOwnProperty; var shallow$1 = function (old, nu) { return nu; }; var baseMerge = function (merger) { return function () { var objects = new Array(arguments.length); for (var i = 0; i < objects.length; i++) { objects[i] = arguments[i]; } if (objects.length === 0) { throw new Error('Can\'t merge zero objects'); } var ret = {}; for (var j = 0; j < objects.length; j++) { var curObject = objects[j]; for (var key in curObject) { if (hasOwnProperty.call(curObject, key)) { ret[key] = merger(ret[key], curObject[key]); } } } return ret; }; }; var merge$3 = baseMerge(shallow$1); var styles$1 = css('ephox-dragster'); var Styles$2 = { resolve: styles$1.resolve }; var Blocker = function (options) { var settings = merge$3({ layerClass: Styles$2.resolve('blocker') }, options); var div = Element.fromTag('div'); set(div, 'role', 'presentation'); setAll$1(div, { position: 'fixed', left: '0px', top: '0px', width: '100%', height: '100%' }); add$2(div, Styles$2.resolve('blocker')); add$2(div, settings.layerClass); var element = function () { return div; }; var destroy = function () { remove$2(div); }; return { element: element, destroy: destroy }; }; var DragMode = exactly([ 'compare', 'extract', 'mutate', 'sink' ]); var DragSink = exactly([ 'element', 'start', 'stop', 'destroy' ]); var DragApi = exactly([ 'forceDrop', 'drop', 'move', 'delayDrop' ]); var compare = function (old, nu) { return Position(nu.left() - old.left(), nu.top() - old.top()); }; var extract$1 = function (event) { return Option.some(Position(event.x(), event.y())); }; var mutate = function (mutation, info) { mutation.mutate(info.left(), info.top()); }; var sink = function (dragApi, settings) { var blocker = Blocker(settings); var mdown = bind$2(blocker.element(), 'mousedown', dragApi.forceDrop); var mup = bind$2(blocker.element(), 'mouseup', dragApi.drop); var mmove = bind$2(blocker.element(), 'mousemove', dragApi.move); var mout = bind$2(blocker.element(), 'mouseout', dragApi.delayDrop); var destroy = function () { blocker.destroy(); mup.unbind(); mmove.unbind(); mout.unbind(); mdown.unbind(); }; var start = function (parent) { append(parent, blocker.element()); }; var stop = function () { remove$2(blocker.element()); }; return DragSink({ element: blocker.element, start: start, stop: stop, destroy: destroy }); }; var MouseDrag = DragMode({ compare: compare, extract: extract$1, sink: sink, mutate: mutate }); var last$2 = function (fn, rate) { var timer = null; var cancel = function () { if (timer !== null) { domGlobals.clearTimeout(timer); timer = null; } }; var throttle = function () { var args = []; for (var _i = 0; _i < arguments.length; _i++) { args[_i] = arguments[_i]; } if (timer !== null) { domGlobals.clearTimeout(timer); } timer = domGlobals.setTimeout(function () { fn.apply(null, args); timer = null; }, rate); }; return { cancel: cancel, throttle: throttle }; }; function InDrag () { var previous = Option.none(); var reset = function () { previous = Option.none(); }; var update = function (mode, nu) { var result = previous.map(function (old) { return mode.compare(old, nu); }); previous = Option.some(nu); return result; }; var onEvent = function (event, mode) { var dataOption = mode.extract(event); dataOption.each(function (data) { var offset = update(mode, data); offset.each(function (d) { events.trigger.move(d); }); }); }; var events = Events.create({ move: Event(['info']) }); return { onEvent: onEvent, reset: reset, events: events.registry }; } function NoDrag () { return { onEvent: noop, reset: noop }; } function Movement () { var noDragState = NoDrag(); var inDragState = InDrag(); var dragState = noDragState; var on = function () { dragState.reset(); dragState = inDragState; }; var off = function () { dragState.reset(); dragState = noDragState; }; var onEvent = function (event, mode) { dragState.onEvent(event, mode); }; var isOn = function () { return dragState === inDragState; }; return { on: on, off: off, isOn: isOn, onEvent: onEvent, events: inDragState.events }; } var setup = function (mutation, mode, settings) { var active = false; var events = Events.create({ start: Event([]), stop: Event([]) }); var movement = Movement(); var drop = function () { sink.stop(); if (movement.isOn()) { movement.off(); events.trigger.stop(); } }; var throttledDrop = last$2(drop, 200); var go = function (parent) { sink.start(parent); movement.on(); events.trigger.start(); }; var mousemove = function (event) { throttledDrop.cancel(); movement.onEvent(event, mode); }; movement.events.move.bind(function (event) { mode.mutate(mutation, event.info()); }); var on = function () { active = true; }; var off = function () { active = false; }; var runIfActive = function (f) { return function () { var args = []; for (var _i = 0; _i < arguments.length; _i++) { args[_i] = arguments[_i]; } if (active) { f.apply(null, args); } }; }; var sink = mode.sink(DragApi({ forceDrop: drop, drop: runIfActive(drop), move: runIfActive(mousemove), delayDrop: runIfActive(throttledDrop.throttle) }), settings); var destroy = function () { sink.destroy(); }; return { element: sink.element, go: go, on: on, off: off, destroy: destroy, events: events.registry }; }; var Dragging = { setup: setup }; var transform$1 = function (mutation, settings) { if (settings === void 0) { settings = {}; } var mode = settings.mode !== undefined ? settings.mode : MouseDrag; return Dragging.setup(mutation, mode, settings); }; var Dragger = { transform: transform$1 }; var Mutation = function () { var events = Events.create({ drag: Event([ 'xDelta', 'yDelta' ]) }); var mutate = function (x, y) { events.trigger.drag(x, y); }; return { mutate: mutate, events: events.registry }; }; var BarMutation = function () { var events = Events.create({ drag: Event([ 'xDelta', 'yDelta', 'target' ]) }); var target = Option.none(); var delegate = Mutation(); delegate.events.drag.bind(function (event) { target.each(function (t) { events.trigger.drag(event.xDelta(), event.yDelta(), t); }); }); var assign = function (t) { target = Option.some(t); }; var get = function () { return target; }; return { assign: assign, get: get, mutate: delegate.mutate, events: events.registry }; }; var isContentEditableTrue = function (elm) { return get(elm, 'contenteditable') === 'true'; }; var findClosestContentEditable = function (target, isRoot) { return closest$1(target, '[contenteditable]', isRoot); }; var resizeBarDragging = Styles.resolve('resizer-bar-dragging'); var BarManager = function (wire, direction, hdirection) { var mutation = BarMutation(); var resizing = Dragger.transform(mutation, {}); var hoverTable = Option.none(); var getResizer = function (element, type) { return Option.from(get(element, type)); }; mutation.events.drag.bind(function (event) { getResizer(event.target(), 'data-row').each(function (_dataRow) { var currentRow = CellUtils.getInt(event.target(), 'top'); set$1(event.target(), 'top', currentRow + event.yDelta() + 'px'); }); getResizer(event.target(), 'data-column').each(function (_dataCol) { var currentCol = CellUtils.getInt(event.target(), 'left'); set$1(event.target(), 'left', currentCol + event.xDelta() + 'px'); }); }); var getDelta = function (target, dir) { var newX = CellUtils.getInt(target, dir); var oldX = parseInt(get(target, 'data-initial-' + dir), 10); return newX - oldX; }; resizing.events.stop.bind(function () { mutation.get().each(function (target) { hoverTable.each(function (table) { getResizer(target, 'data-row').each(function (row) { var delta = getDelta(target, 'top'); remove(target, 'data-initial-top'); events.trigger.adjustHeight(table, delta, parseInt(row, 10)); }); getResizer(target, 'data-column').each(function (column) { var delta = getDelta(target, 'left'); remove(target, 'data-initial-left'); events.trigger.adjustWidth(table, delta, parseInt(column, 10)); }); Bars.refresh(wire, table, hdirection, direction); }); }); }); var handler = function (target, dir) { events.trigger.startAdjust(); mutation.assign(target); set(target, 'data-initial-' + dir, parseInt(get$1(target, dir), 10)); add$2(target, resizeBarDragging); set$1(target, 'opacity', '0.2'); resizing.go(wire.parent()); }; var mousedown = bind$2(wire.parent(), 'mousedown', function (event) { if (Bars.isRowBar(event.target())) { handler(event.target(), 'top'); } if (Bars.isColBar(event.target())) { handler(event.target(), 'left'); } }); var isRoot = function (e) { return eq(e, wire.view()); }; var findClosestEditableTable = function (target) { return closest$1(target, 'table', isRoot).filter(function (table) { return findClosestContentEditable(table, isRoot).exists(isContentEditableTrue); }); }; var mouseover = bind$2(wire.view(), 'mouseover', function (event) { findClosestEditableTable(event.target()).fold(function () { if (inBody(event.target())) { Bars.destroy(wire); } }, function (table) { hoverTable = Option.some(table); Bars.refresh(wire, table, hdirection, direction); }); }); var destroy = function () { mousedown.unbind(); mouseover.unbind(); resizing.destroy(); Bars.destroy(wire); }; var refresh = function (tbl) { Bars.refresh(wire, tbl, hdirection, direction); }; var events = Events.create({ adjustHeight: Event([ 'table', 'delta', 'row' ]), adjustWidth: Event([ 'table', 'delta', 'column' ]), startAdjust: Event([]) }); return { destroy: destroy, refresh: refresh, on: resizing.on, off: resizing.off, hideBars: curry(Bars.hide, wire), showBars: curry(Bars.show, wire), events: events.registry }; }; function TableResize (wire, vdirection) { var hdirection = BarPositions.height; var manager = BarManager(wire, vdirection, hdirection); var events = Events.create({ beforeResize: Event(['table']), afterResize: Event(['table']), startDrag: Event([]) }); manager.events.adjustHeight.bind(function (event) { events.trigger.beforeResize(event.table()); var delta = hdirection.delta(event.delta(), event.table()); Adjustments.adjustHeight(event.table(), delta, event.row(), hdirection); events.trigger.afterResize(event.table()); }); manager.events.startAdjust.bind(function (event) { events.trigger.startDrag(); }); manager.events.adjustWidth.bind(function (event) { events.trigger.beforeResize(event.table()); var delta = vdirection.delta(event.delta(), event.table()); Adjustments.adjustWidth(event.table(), delta, event.column(), vdirection); events.trigger.afterResize(event.table()); }); return { on: manager.on, off: manager.off, hideBars: manager.hideBars, showBars: manager.showBars, destroy: manager.destroy, events: events.registry }; } var createContainer = function () { var container = Element.fromTag('div'); setAll$1(container, { position: 'static', height: '0', width: '0', padding: '0', margin: '0', border: '0' }); append(body(), container); return container; }; var get$8 = function (editor, container) { return editor.inline ? ResizeWire.body(getBody$1(editor), createContainer()) : ResizeWire.only(Element.fromDom(editor.getDoc())); }; var remove$6 = function (editor, wire) { if (editor.inline) { remove$2(wire.parent()); } }; var TableWire = { get: get$8, remove: remove$6 }; var ResizeHandler = function (editor) { var selectionRng = Option.none(); var resize = Option.none(); var wire = Option.none(); var percentageBasedSizeRegex = /(\d+(\.\d+)?)%/; var startW, startRawW; var isTable = function (elm) { return elm.nodeName === 'TABLE'; }; var getRawWidth = function (elm) { return editor.dom.getStyle(elm, 'width') || editor.dom.getAttrib(elm, 'width'); }; var lazyResize = function () { return resize; }; var lazyWire = function () { return wire.getOr(ResizeWire.only(Element.fromDom(editor.getBody()))); }; var destroy = function () { resize.each(function (sz) { sz.destroy(); }); wire.each(function (w) { TableWire.remove(editor, w); }); }; editor.on('init', function () { var direction = TableDirection(Direction.directionAt); var rawWire = TableWire.get(editor); wire = Option.some(rawWire); if (hasObjectResizing(editor) && hasTableResizeBars(editor)) { var sz = TableResize(rawWire, direction); sz.on(); sz.events.startDrag.bind(function (event) { selectionRng = Option.some(editor.selection.getRng()); }); sz.events.beforeResize.bind(function (event) { var rawTable = event.table().dom(); fireObjectResizeStart(editor, rawTable, getPixelWidth$1(rawTable), getPixelHeight(rawTable)); }); sz.events.afterResize.bind(function (event) { var table = event.table(); var rawTable = table.dom(); removeDataStyle(table); selectionRng.each(function (rng) { editor.selection.setRng(rng); editor.focus(); }); fireObjectResized(editor, rawTable, getPixelWidth$1(rawTable), getPixelHeight(rawTable)); editor.undoManager.add(); }); resize = Option.some(sz); } }); editor.on('ObjectResizeStart', function (e) { var targetElm = e.target; if (isTable(targetElm)) { startW = e.width; startRawW = getRawWidth(targetElm); } }); editor.on('ObjectResized', function (e) { var targetElm = e.target; if (isTable(targetElm)) { var table = targetElm; if (percentageBasedSizeRegex.test(startRawW)) { var percentW = parseFloat(percentageBasedSizeRegex.exec(startRawW)[1]); var targetPercentW = e.width * percentW / startW; editor.dom.setStyle(table, 'width', targetPercentW + '%'); } else { var newCellSizes_1 = []; global$1.each(table.rows, function (row) { global$1.each(row.cells, function (cell) { var width = editor.dom.getStyle(cell, 'width', true); newCellSizes_1.push({ cell: cell, width: width }); }); }); global$1.each(newCellSizes_1, function (newCellSize) { editor.dom.setStyle(newCellSize.cell, 'width', newCellSize.width); editor.dom.setAttrib(newCellSize.cell, 'width', null); }); } } }); return { lazyResize: lazyResize, lazyWire: lazyWire, destroy: destroy }; }; var adt$1 = Adt.generate([ { none: ['current'] }, { first: ['current'] }, { middle: [ 'current', 'target' ] }, { last: ['current'] } ]); var none$1 = function (current) { if (current === void 0) { current = undefined; } return adt$1.none(current); }; var CellLocation = __assign({}, adt$1, { none: none$1 }); var detect$4 = function (current, isRoot) { return TableLookup.table(current, isRoot).bind(function (table) { var all = TableLookup.cells(table); var index = findIndex(all, function (x) { return eq(current, x); }); return index.map(function (ind) { return { index: constant(ind), all: constant(all) }; }); }); }; var next = function (current, isRoot) { var detection = detect$4(current, isRoot); return detection.fold(function () { return CellLocation.none(current); }, function (info) { return info.index() + 1 < info.all().length ? CellLocation.middle(current, info.all()[info.index() + 1]) : CellLocation.last(current); }); }; var prev = function (current, isRoot) { var detection = detect$4(current, isRoot); return detection.fold(function () { return CellLocation.none(); }, function (info) { return info.index() - 1 >= 0 ? CellLocation.middle(current, info.all()[info.index() - 1]) : CellLocation.first(current); }); }; var CellNavigation = { next: next, prev: prev }; var create$2 = Immutable('start', 'soffset', 'finish', 'foffset'); var SimRange = { create: create$2 }; var adt$2 = Adt.generate([ { before: ['element'] }, { on: [ 'element', 'offset' ] }, { after: ['element'] } ]); var cata$1 = function (subject, onBefore, onOn, onAfter) { return subject.fold(onBefore, onOn, onAfter); }; var getStart = function (situ) { return situ.fold(identity, identity, identity); }; var before$2 = adt$2.before; var on = adt$2.on; var after$2 = adt$2.after; var Situ = { before: before$2, on: on, after: after$2, cata: cata$1, getStart: getStart }; var adt$3 = Adt.generate([ { domRange: ['rng'] }, { relative: [ 'startSitu', 'finishSitu' ] }, { exact: [ 'start', 'soffset', 'finish', 'foffset' ] } ]); var exactFromRange = function (simRange) { return adt$3.exact(simRange.start(), simRange.soffset(), simRange.finish(), simRange.foffset()); }; var getStart$1 = function (selection) { return selection.match({ domRange: function (rng) { return Element.fromDom(rng.startContainer); }, relative: function (startSitu, finishSitu) { return Situ.getStart(startSitu); }, exact: function (start, soffset, finish, foffset) { return start; } }); }; var domRange = adt$3.domRange; var relative = adt$3.relative; var exact = adt$3.exact; var getWin = function (selection) { var start = getStart$1(selection); return defaultView(start); }; var range$1 = SimRange.create; var Selection = { domRange: domRange, relative: relative, exact: exact, exactFromRange: exactFromRange, getWin: getWin, range: range$1 }; var selectNodeContents = function (win, element) { var rng = win.document.createRange(); selectNodeContentsUsing(rng, element); return rng; }; var selectNodeContentsUsing = function (rng, element) { rng.selectNodeContents(element.dom()); }; var setStart = function (rng, situ) { situ.fold(function (e) { rng.setStartBefore(e.dom()); }, function (e, o) { rng.setStart(e.dom(), o); }, function (e) { rng.setStartAfter(e.dom()); }); }; var setFinish = function (rng, situ) { situ.fold(function (e) { rng.setEndBefore(e.dom()); }, function (e, o) { rng.setEnd(e.dom(), o); }, function (e) { rng.setEndAfter(e.dom()); }); }; var relativeToNative = function (win, startSitu, finishSitu) { var range = win.document.createRange(); setStart(range, startSitu); setFinish(range, finishSitu); return range; }; var exactToNative = function (win, start, soffset, finish, foffset) { var rng = win.document.createRange(); rng.setStart(start.dom(), soffset); rng.setEnd(finish.dom(), foffset); return rng; }; var toRect = function (rect) { return { left: constant(rect.left), top: constant(rect.top), right: constant(rect.right), bottom: constant(rect.bottom), width: constant(rect.width), height: constant(rect.height) }; }; var getFirstRect = function (rng) { var rects = rng.getClientRects(); var rect = rects.length > 0 ? rects[0] : rng.getBoundingClientRect(); return rect.width > 0 || rect.height > 0 ? Option.some(rect).map(toRect) : Option.none(); }; var adt$4 = Adt.generate([ { ltr: [ 'start', 'soffset', 'finish', 'foffset' ] }, { rtl: [ 'start', 'soffset', 'finish', 'foffset' ] } ]); var fromRange = function (win, type, range) { return type(Element.fromDom(range.startContainer), range.startOffset, Element.fromDom(range.endContainer), range.endOffset); }; var getRanges = function (win, selection) { return selection.match({ domRange: function (rng) { return { ltr: constant(rng), rtl: Option.none }; }, relative: function (startSitu, finishSitu) { return { ltr: cached(function () { return relativeToNative(win, startSitu, finishSitu); }), rtl: cached(function () { return Option.some(relativeToNative(win, finishSitu, startSitu)); }) }; }, exact: function (start, soffset, finish, foffset) { return { ltr: cached(function () { return exactToNative(win, start, soffset, finish, foffset); }), rtl: cached(function () { return Option.some(exactToNative(win, finish, foffset, start, soffset)); }) }; } }); }; var doDiagnose = function (win, ranges) { var rng = ranges.ltr(); if (rng.collapsed) { var reversed = ranges.rtl().filter(function (rev) { return rev.collapsed === false; }); return reversed.map(function (rev) { return adt$4.rtl(Element.fromDom(rev.endContainer), rev.endOffset, Element.fromDom(rev.startContainer), rev.startOffset); }).getOrThunk(function () { return fromRange(win, adt$4.ltr, rng); }); } else { return fromRange(win, adt$4.ltr, rng); } }; var diagnose = function (win, selection) { var ranges = getRanges(win, selection); return doDiagnose(win, ranges); }; var asLtrRange = function (win, selection) { var diagnosis = diagnose(win, selection); return diagnosis.match({ ltr: function (start, soffset, finish, foffset) { var rng = win.document.createRange(); rng.setStart(start.dom(), soffset); rng.setEnd(finish.dom(), foffset); return rng; }, rtl: function (start, soffset, finish, foffset) { var rng = win.document.createRange(); rng.setStart(finish.dom(), foffset); rng.setEnd(start.dom(), soffset); return rng; } }); }; var searchForPoint = function (rectForOffset, x, y, maxX, length) { if (length === 0) { return 0; } else if (x === maxX) { return length - 1; } var xDelta = maxX; for (var i = 1; i < length; i++) { var rect = rectForOffset(i); var curDeltaX = Math.abs(x - rect.left); if (y <= rect.bottom) { if (y < rect.top || curDeltaX > xDelta) { return i - 1; } else { xDelta = curDeltaX; } } } return 0; }; var inRect = function (rect, x, y) { return x >= rect.left && x <= rect.right && y >= rect.top && y <= rect.bottom; }; var locateOffset = function (doc, textnode, x, y, rect) { var rangeForOffset = function (o) { var r = doc.dom().createRange(); r.setStart(textnode.dom(), o); r.collapse(true); return r; }; var rectForOffset = function (o) { var r = rangeForOffset(o); return r.getBoundingClientRect(); }; var length = get$2(textnode).length; var offset = searchForPoint(rectForOffset, x, y, rect.right, length); return rangeForOffset(offset); }; var locate = function (doc, node, x, y) { var r = doc.dom().createRange(); r.selectNode(node.dom()); var rects = r.getClientRects(); var foundRect = findMap(rects, function (rect) { return inRect(rect, x, y) ? Option.some(rect) : Option.none(); }); return foundRect.map(function (rect) { return locateOffset(doc, node, x, y, rect); }); }; var searchInChildren = function (doc, node, x, y) { var r = doc.dom().createRange(); var nodes = children(node); return findMap(nodes, function (n) { r.selectNode(n.dom()); return inRect(r.getBoundingClientRect(), x, y) ? locateNode(doc, n, x, y) : Option.none(); }); }; var locateNode = function (doc, node, x, y) { return isText(node) ? locate(doc, node, x, y) : searchInChildren(doc, node, x, y); }; var locate$1 = function (doc, node, x, y) { var r = doc.dom().createRange(); r.selectNode(node.dom()); var rect = r.getBoundingClientRect(); var boundedX = Math.max(rect.left, Math.min(rect.right, x)); var boundedY = Math.max(rect.top, Math.min(rect.bottom, y)); return locateNode(doc, node, boundedX, boundedY); }; var COLLAPSE_TO_LEFT = true; var COLLAPSE_TO_RIGHT = false; var getCollapseDirection = function (rect, x) { return x - rect.left < rect.right - x ? COLLAPSE_TO_LEFT : COLLAPSE_TO_RIGHT; }; var createCollapsedNode = function (doc, target, collapseDirection) { var r = doc.dom().createRange(); r.selectNode(target.dom()); r.collapse(collapseDirection); return r; }; var locateInElement = function (doc, node, x) { var cursorRange = doc.dom().createRange(); cursorRange.selectNode(node.dom()); var rect = cursorRange.getBoundingClientRect(); var collapseDirection = getCollapseDirection(rect, x); var f = collapseDirection === COLLAPSE_TO_LEFT ? first : last$1; return f(node).map(function (target) { return createCollapsedNode(doc, target, collapseDirection); }); }; var locateInEmpty = function (doc, node, x) { var rect = node.dom().getBoundingClientRect(); var collapseDirection = getCollapseDirection(rect, x); return Option.some(createCollapsedNode(doc, node, collapseDirection)); }; var search = function (doc, node, x) { var f = children(node).length === 0 ? locateInEmpty : locateInElement; return f(doc, node, x); }; var caretPositionFromPoint = function (doc, x, y) { return Option.from(doc.dom().caretPositionFromPoint(x, y)).bind(function (pos) { if (pos.offsetNode === null) { return Option.none(); } var r = doc.dom().createRange(); r.setStart(pos.offsetNode, pos.offset); r.collapse(); return Option.some(r); }); }; var caretRangeFromPoint = function (doc, x, y) { return Option.from(doc.dom().caretRangeFromPoint(x, y)); }; var searchTextNodes = function (doc, node, x, y) { var r = doc.dom().createRange(); r.selectNode(node.dom()); var rect = r.getBoundingClientRect(); var boundedX = Math.max(rect.left, Math.min(rect.right, x)); var boundedY = Math.max(rect.top, Math.min(rect.bottom, y)); return locate$1(doc, node, boundedX, boundedY); }; var searchFromPoint = function (doc, x, y) { return Element.fromPoint(doc, x, y).bind(function (elem) { var fallback = function () { return search(doc, elem, x); }; return children(elem).length === 0 ? fallback() : searchTextNodes(doc, elem, x, y).orThunk(fallback); }); }; var availableSearch = document.caretPositionFromPoint ? caretPositionFromPoint : document.caretRangeFromPoint ? caretRangeFromPoint : searchFromPoint; var fromPoint$1 = function (win, x, y) { var doc = Element.fromDom(win.document); return availableSearch(doc, x, y).map(function (rng) { return SimRange.create(Element.fromDom(rng.startContainer), rng.startOffset, Element.fromDom(rng.endContainer), rng.endOffset); }); }; var beforeSpecial = function (element, offset) { var name$1 = name(element); if ('input' === name$1) { return Situ.after(element); } else if (!contains([ 'br', 'img' ], name$1)) { return Situ.on(element, offset); } else { return offset === 0 ? Situ.before(element) : Situ.after(element); } }; var preprocessRelative = function (startSitu, finishSitu) { var start = startSitu.fold(Situ.before, beforeSpecial, Situ.after); var finish = finishSitu.fold(Situ.before, beforeSpecial, Situ.after); return Selection.relative(start, finish); }; var preprocessExact = function (start, soffset, finish, foffset) { var startSitu = beforeSpecial(start, soffset); var finishSitu = beforeSpecial(finish, foffset); return Selection.relative(startSitu, finishSitu); }; var preprocess = function (selection) { return selection.match({ domRange: function (rng) { var start = Element.fromDom(rng.startContainer); var finish = Element.fromDom(rng.endContainer); return preprocessExact(start, rng.startOffset, finish, rng.endOffset); }, relative: preprocessRelative, exact: preprocessExact }); }; var makeRange = function (start, soffset, finish, foffset) { var doc = owner(start); var rng = doc.dom().createRange(); rng.setStart(start.dom(), soffset); rng.setEnd(finish.dom(), foffset); return rng; }; var after$3 = function (start, soffset, finish, foffset) { var r = makeRange(start, soffset, finish, foffset); var same = eq(start, finish) && soffset === foffset; return r.collapsed && !same; }; var doSetNativeRange = function (win, rng) { Option.from(win.getSelection()).each(function (selection) { selection.removeAllRanges(); selection.addRange(rng); }); }; var doSetRange = function (win, start, soffset, finish, foffset) { var rng = exactToNative(win, start, soffset, finish, foffset); doSetNativeRange(win, rng); }; var setLegacyRtlRange = function (win, selection, start, soffset, finish, foffset) { selection.collapse(start.dom(), soffset); selection.extend(finish.dom(), foffset); }; var setRangeFromRelative = function (win, relative) { return diagnose(win, relative).match({ ltr: function (start, soffset, finish, foffset) { doSetRange(win, start, soffset, finish, foffset); }, rtl: function (start, soffset, finish, foffset) { var selection = win.getSelection(); if (selection.setBaseAndExtent) { selection.setBaseAndExtent(start.dom(), soffset, finish.dom(), foffset); } else if (selection.extend) { try { setLegacyRtlRange(win, selection, start, soffset, finish, foffset); } catch (e) { doSetRange(win, finish, foffset, start, soffset); } } else { doSetRange(win, finish, foffset, start, soffset); } } }); }; var setExact = function (win, start, soffset, finish, foffset) { var relative = preprocessExact(start, soffset, finish, foffset); setRangeFromRelative(win, relative); }; var setRelative = function (win, startSitu, finishSitu) { var relative = preprocessRelative(startSitu, finishSitu); setRangeFromRelative(win, relative); }; var toNative = function (selection) { var win = Selection.getWin(selection).dom(); var getDomRange = function (start, soffset, finish, foffset) { return exactToNative(win, start, soffset, finish, foffset); }; var filtered = preprocess(selection); return diagnose(win, filtered).match({ ltr: getDomRange, rtl: getDomRange }); }; var readRange = function (selection) { if (selection.rangeCount > 0) { var firstRng = selection.getRangeAt(0); var lastRng = selection.getRangeAt(selection.rangeCount - 1); return Option.some(SimRange.create(Element.fromDom(firstRng.startContainer), firstRng.startOffset, Element.fromDom(lastRng.endContainer), lastRng.endOffset)); } else { return Option.none(); } }; var doGetExact = function (selection) { var anchor = Element.fromDom(selection.anchorNode); var focus = Element.fromDom(selection.focusNode); return after$3(anchor, selection.anchorOffset, focus, selection.focusOffset) ? Option.some(SimRange.create(anchor, selection.anchorOffset, focus, selection.focusOffset)) : readRange(selection); }; var setToElement = function (win, element) { var rng = selectNodeContents(win, element); doSetNativeRange(win, rng); }; var getExact = function (win) { return Option.from(win.getSelection()).filter(function (sel) { return sel.rangeCount > 0; }).bind(doGetExact); }; var get$9 = function (win) { return getExact(win).map(function (range) { return Selection.exact(range.start(), range.soffset(), range.finish(), range.foffset()); }); }; var getFirstRect$1 = function (win, selection) { var rng = asLtrRange(win, selection); return getFirstRect(rng); }; var getAtPoint = function (win, x, y) { return fromPoint$1(win, x, y); }; var clear = function (win) { var selection = win.getSelection(); selection.removeAllRanges(); }; var global$3 = tinymce.util.Tools.resolve('tinymce.util.VK'); var forward = function (editor, isRoot, cell, lazyWire) { return go(editor, isRoot, CellNavigation.next(cell), lazyWire); }; var backward = function (editor, isRoot, cell, lazyWire) { return go(editor, isRoot, CellNavigation.prev(cell), lazyWire); }; var getCellFirstCursorPosition = function (editor, cell) { var selection = Selection.exact(cell, 0, cell, 0); return toNative(selection); }; var getNewRowCursorPosition = function (editor, table) { var rows = descendants$1(table, 'tr'); return last(rows).bind(function (last) { return descendant$1(last, 'td,th').map(function (first) { return getCellFirstCursorPosition(editor, first); }); }); }; var go = function (editor, isRoot, cell, actions, lazyWire) { return cell.fold(Option.none, Option.none, function (current, next) { return first(next).map(function (cell) { return getCellFirstCursorPosition(editor, cell); }); }, function (current) { return TableLookup.table(current, isRoot).bind(function (table) { var targets = TableTargets.noMenu(current); editor.undoManager.transact(function () { actions.insertRowsAfter(table, targets); }); return getNewRowCursorPosition(editor, table); }); }); }; var rootElements = [ 'table', 'li', 'dl' ]; var handle$1 = function (event, editor, actions, lazyWire) { if (event.keyCode === global$3.TAB) { var body_1 = getBody$1(editor); var isRoot_1 = function (element) { var name$1 = name(element); return eq(element, body_1) || contains(rootElements, name$1); }; var rng = editor.selection.getRng(); if (rng.collapsed) { var start = Element.fromDom(rng.startContainer); TableLookup.cell(start, isRoot_1).each(function (cell) { event.preventDefault(); var navigation = event.shiftKey ? backward : forward; var rng = navigation(editor, isRoot_1, cell, actions, lazyWire); rng.each(function (range) { editor.selection.setRng(range); }); }); } } }; var TabContext = { handle: handle$1 }; var create$3 = Immutable('selection', 'kill'); var Response = { create: create$3 }; var create$4 = function (start, soffset, finish, foffset) { return { start: constant(Situ.on(start, soffset)), finish: constant(Situ.on(finish, foffset)) }; }; var Situs = { create: create$4 }; var convertToRange = function (win, selection) { var rng = asLtrRange(win, selection); return SimRange.create(Element.fromDom(rng.startContainer), rng.startOffset, Element.fromDom(rng.endContainer), rng.endOffset); }; var makeSitus = Situs.create; var Util = { convertToRange: convertToRange, makeSitus: makeSitus }; var sync = function (container, isRoot, start, soffset, finish, foffset, selectRange) { if (!(eq(start, finish) && soffset === foffset)) { return closest$1(start, 'td,th', isRoot).bind(function (s) { return closest$1(finish, 'td,th', isRoot).bind(function (f) { return detect$5(container, isRoot, s, f, selectRange); }); }); } else { return Option.none(); } }; var detect$5 = function (container, isRoot, start, finish, selectRange) { if (!eq(start, finish)) { return CellSelection.identify(start, finish, isRoot).bind(function (cellSel) { var boxes = cellSel.boxes().getOr([]); if (boxes.length > 0) { selectRange(container, boxes, cellSel.start(), cellSel.finish()); return Option.some(Response.create(Option.some(Util.makeSitus(start, 0, start, getEnd(start))), true)); } else { return Option.none(); } }); } else { return Option.none(); } }; var update = function (rows, columns, container, selected, annotations) { var updateSelection = function (newSels) { annotations.clear(container); annotations.selectRange(container, newSels.boxes(), newSels.start(), newSels.finish()); return newSels.boxes(); }; return CellSelection.shiftSelection(selected, rows, columns, annotations.firstSelectedSelector(), annotations.lastSelectedSelector()).map(updateSelection); }; var KeySelection = { sync: sync, detect: detect$5, update: update }; var traverse = Immutable('item', 'mode'); var backtrack = function (universe, item, _direction, transition) { if (transition === void 0) { transition = sidestep; } return universe.property().parent(item).map(function (p) { return traverse(p, transition); }); }; var sidestep = function (universe, item, direction, transition) { if (transition === void 0) { transition = advance; } return direction.sibling(universe, item).map(function (p) { return traverse(p, transition); }); }; var advance = function (universe, item, direction, transition) { if (transition === void 0) { transition = advance; } var children = universe.property().children(item); var result = direction.first(children); return result.map(function (r) { return traverse(r, transition); }); }; var successors = [ { current: backtrack, next: sidestep, fallback: Option.none() }, { current: sidestep, next: advance, fallback: Option.some(backtrack) }, { current: advance, next: advance, fallback: Option.some(sidestep) } ]; var go$1 = function (universe, item, mode, direction, rules) { if (rules === void 0) { rules = successors; } var ruleOpt = find(rules, function (succ) { return succ.current === mode; }); return ruleOpt.bind(function (rule) { return rule.current(universe, item, direction, rule.next).orThunk(function () { return rule.fallback.bind(function (fb) { return go$1(universe, item, fb, direction); }); }); }); }; var left = function () { var sibling = function (universe, item) { return universe.query().prevSibling(item); }; var first = function (children) { return children.length > 0 ? Option.some(children[children.length - 1]) : Option.none(); }; return { sibling: sibling, first: first }; }; var right = function () { var sibling = function (universe, item) { return universe.query().nextSibling(item); }; var first = function (children) { return children.length > 0 ? Option.some(children[0]) : Option.none(); }; return { sibling: sibling, first: first }; }; var Walkers = { left: left, right: right }; var hone = function (universe, item, predicate, mode, direction, isRoot) { var next = go$1(universe, item, mode, direction); return next.bind(function (n) { if (isRoot(n.item())) { return Option.none(); } else { return predicate(n.item()) ? Option.some(n.item()) : hone(universe, n.item(), predicate, n.mode(), direction, isRoot); } }); }; var left$1 = function (universe, item, predicate, isRoot) { return hone(universe, item, predicate, sidestep, Walkers.left(), isRoot); }; var right$1 = function (universe, item, predicate, isRoot) { return hone(universe, item, predicate, sidestep, Walkers.right(), isRoot); }; var isLeaf = function (universe) { return function (element) { return universe.property().children(element).length === 0; }; }; var before$3 = function (universe, item, isRoot) { return seekLeft(universe, item, isLeaf(universe), isRoot); }; var after$4 = function (universe, item, isRoot) { return seekRight(universe, item, isLeaf(universe), isRoot); }; var seekLeft = left$1; var seekRight = right$1; var universe$2 = DomUniverse(); var before$4 = function (element, isRoot) { return before$3(universe$2, element, isRoot); }; var after$5 = function (element, isRoot) { return after$4(universe$2, element, isRoot); }; var seekLeft$1 = function (element, predicate, isRoot) { return seekLeft(universe$2, element, predicate, isRoot); }; var seekRight$1 = function (element, predicate, isRoot) { return seekRight(universe$2, element, predicate, isRoot); }; var ancestor$2 = function (scope, predicate, isRoot) { return ancestor(scope, predicate, isRoot).isSome(); }; var point = Immutable('element', 'offset'); var delta = Immutable('element', 'deltaOffset'); var range$2 = Immutable('element', 'start', 'finish'); var points = Immutable('begin', 'end'); var text = Immutable('element', 'text'); var adt$5 = Adt.generate([ { none: ['message'] }, { success: [] }, { failedUp: ['cell'] }, { failedDown: ['cell'] } ]); var isOverlapping = function (bridge, before, after) { var beforeBounds = bridge.getRect(before); var afterBounds = bridge.getRect(after); return afterBounds.right > beforeBounds.left && afterBounds.left < beforeBounds.right; }; var isRow = function (elem) { return closest$1(elem, 'tr'); }; var verify = function (bridge, before, beforeOffset, after, afterOffset, failure, isRoot) { return closest$1(after, 'td,th', isRoot).bind(function (afterCell) { return closest$1(before, 'td,th', isRoot).map(function (beforeCell) { if (!eq(afterCell, beforeCell)) { return DomParent.sharedOne(isRow, [ afterCell, beforeCell ]).fold(function () { return isOverlapping(bridge, beforeCell, afterCell) ? adt$5.success() : failure(beforeCell); }, function (_sharedRow) { return failure(beforeCell); }); } else { return eq(after, afterCell) && getEnd(afterCell) === afterOffset ? failure(beforeCell) : adt$5.none('in same cell'); } }); }).getOr(adt$5.none('default')); }; var cata$2 = function (subject, onNone, onSuccess, onFailedUp, onFailedDown) { return subject.fold(onNone, onSuccess, onFailedUp, onFailedDown); }; var BeforeAfter = __assign({}, adt$5, { verify: verify, cata: cata$2 }); var inAncestor = Immutable('ancestor', 'descendants', 'element', 'index'); var inParent = Immutable('parent', 'children', 'element', 'index'); var indexInParent = function (element) { return parent(element).bind(function (parent) { var children$1 = children(parent); return indexOf(children$1, element).map(function (index) { return inParent(parent, children$1, element, index); }); }); }; var indexOf = function (elements, element) { return findIndex(elements, curry(eq, element)); }; var isBr = function (elem) { return name(elem) === 'br'; }; var gatherer = function (cand, gather, isRoot) { return gather(cand, isRoot).bind(function (target) { return isText(target) && get$2(target).trim().length === 0 ? gatherer(target, gather, isRoot) : Option.some(target); }); }; var handleBr = function (isRoot, element, direction) { return direction.traverse(element).orThunk(function () { return gatherer(element, direction.gather, isRoot); }).map(direction.relative); }; var findBr = function (element, offset) { return child(element, offset).filter(isBr).orThunk(function () { return child(element, offset - 1).filter(isBr); }); }; var handleParent = function (isRoot, element, offset, direction) { return findBr(element, offset).bind(function (br) { return direction.traverse(br).fold(function () { return gatherer(br, direction.gather, isRoot).map(direction.relative); }, function (adjacent) { return indexInParent(adjacent).map(function (info) { return Situ.on(info.parent(), info.index()); }); }); }); }; var tryBr = function (isRoot, element, offset, direction) { var target = isBr(element) ? handleBr(isRoot, element, direction) : handleParent(isRoot, element, offset, direction); return target.map(function (tgt) { return { start: constant(tgt), finish: constant(tgt) }; }); }; var process = function (analysis) { return BeforeAfter.cata(analysis, function (message) { return Option.none(); }, function () { return Option.none(); }, function (cell) { return Option.some(point(cell, 0)); }, function (cell) { return Option.some(point(cell, getEnd(cell))); }); }; var BrTags = { tryBr: tryBr, process: process }; var nu$3 = MixedBag([ 'left', 'top', 'right', 'bottom' ], []); var moveDown = function (caret, amount) { return nu$3({ left: caret.left(), top: caret.top() + amount, right: caret.right(), bottom: caret.bottom() + amount }); }; var moveUp = function (caret, amount) { return nu$3({ left: caret.left(), top: caret.top() - amount, right: caret.right(), bottom: caret.bottom() - amount }); }; var moveBottomTo = function (caret, bottom) { var height = caret.bottom() - caret.top(); return nu$3({ left: caret.left(), top: bottom - height, right: caret.right(), bottom: bottom }); }; var moveTopTo = function (caret, top) { var height = caret.bottom() - caret.top(); return nu$3({ left: caret.left(), top: top, right: caret.right(), bottom: top + height }); }; var translate = function (caret, xDelta, yDelta) { return nu$3({ left: caret.left() + xDelta, top: caret.top() + yDelta, right: caret.right() + xDelta, bottom: caret.bottom() + yDelta }); }; var getTop$1 = function (caret) { return caret.top(); }; var getBottom = function (caret) { return caret.bottom(); }; var toString = function (caret) { return '(' + caret.left() + ', ' + caret.top() + ') -> (' + caret.right() + ', ' + caret.bottom() + ')'; }; var Carets = { nu: nu$3, moveUp: moveUp, moveDown: moveDown, moveBottomTo: moveBottomTo, moveTopTo: moveTopTo, getTop: getTop$1, getBottom: getBottom, translate: translate, toString: toString }; var getPartialBox = function (bridge, element, offset) { if (offset >= 0 && offset < getEnd(element)) { return bridge.getRangedRect(element, offset, element, offset + 1); } else if (offset > 0) { return bridge.getRangedRect(element, offset - 1, element, offset); } return Option.none(); }; var toCaret = function (rect) { return Carets.nu({ left: rect.left, top: rect.top, right: rect.right, bottom: rect.bottom }); }; var getElemBox = function (bridge, element) { return Option.some(bridge.getRect(element)); }; var getBoxAt = function (bridge, element, offset) { if (isElement(element)) { return getElemBox(bridge, element).map(toCaret); } else if (isText(element)) { return getPartialBox(bridge, element, offset).map(toCaret); } else { return Option.none(); } }; var getEntireBox = function (bridge, element) { if (isElement(element)) { return getElemBox(bridge, element).map(toCaret); } else if (isText(element)) { return bridge.getRangedRect(element, 0, element, getEnd(element)).map(toCaret); } else { return Option.none(); } }; var Rectangles = { getBoxAt: getBoxAt, getEntireBox: getEntireBox }; var JUMP_SIZE = 5; var NUM_RETRIES = 100; var adt$6 = Adt.generate([ { none: [] }, { retry: ['caret'] } ]); var isOutside = function (caret, box) { return caret.left() < box.left() || Math.abs(box.right() - caret.left()) < 1 || caret.left() > box.right(); }; var inOutsideBlock = function (bridge, element, caret) { return closest(element, DomStructure.isBlock).fold(constant(false), function (cell) { return Rectangles.getEntireBox(bridge, cell).exists(function (box) { return isOutside(caret, box); }); }); }; var adjustDown = function (bridge, element, guessBox, original, caret) { var lowerCaret = Carets.moveDown(caret, JUMP_SIZE); if (Math.abs(guessBox.bottom() - original.bottom()) < 1) { return adt$6.retry(lowerCaret); } else if (guessBox.top() > caret.bottom()) { return adt$6.retry(lowerCaret); } else if (guessBox.top() === caret.bottom()) { return adt$6.retry(Carets.moveDown(caret, 1)); } else { return inOutsideBlock(bridge, element, caret) ? adt$6.retry(Carets.translate(lowerCaret, JUMP_SIZE, 0)) : adt$6.none(); } }; var adjustUp = function (bridge, element, guessBox, original, caret) { var higherCaret = Carets.moveUp(caret, JUMP_SIZE); if (Math.abs(guessBox.top() - original.top()) < 1) { return adt$6.retry(higherCaret); } else if (guessBox.bottom() < caret.top()) { return adt$6.retry(higherCaret); } else if (guessBox.bottom() === caret.top()) { return adt$6.retry(Carets.moveUp(caret, 1)); } else { return inOutsideBlock(bridge, element, caret) ? adt$6.retry(Carets.translate(higherCaret, JUMP_SIZE, 0)) : adt$6.none(); } }; var upMovement = { point: Carets.getTop, adjuster: adjustUp, move: Carets.moveUp, gather: before$4 }; var downMovement = { point: Carets.getBottom, adjuster: adjustDown, move: Carets.moveDown, gather: after$5 }; var isAtTable = function (bridge, x, y) { return bridge.elementFromPoint(x, y).filter(function (elm) { return name(elm) === 'table'; }).isSome(); }; var adjustForTable = function (bridge, movement, original, caret, numRetries) { return adjustTil(bridge, movement, original, movement.move(caret, JUMP_SIZE), numRetries); }; var adjustTil = function (bridge, movement, original, caret, numRetries) { if (numRetries === 0) { return Option.some(caret); } if (isAtTable(bridge, caret.left(), movement.point(caret))) { return adjustForTable(bridge, movement, original, caret, numRetries - 1); } return bridge.situsFromPoint(caret.left(), movement.point(caret)).bind(function (guess) { return guess.start().fold(Option.none, function (element) { return Rectangles.getEntireBox(bridge, element).bind(function (guessBox) { return movement.adjuster(bridge, element, guessBox, original, caret).fold(Option.none, function (newCaret) { return adjustTil(bridge, movement, original, newCaret, numRetries - 1); }); }).orThunk(function () { return Option.some(caret); }); }, Option.none); }); }; var ieTryDown = function (bridge, caret) { return bridge.situsFromPoint(caret.left(), caret.bottom() + JUMP_SIZE); }; var ieTryUp = function (bridge, caret) { return bridge.situsFromPoint(caret.left(), caret.top() - JUMP_SIZE); }; var checkScroll = function (movement, adjusted, bridge) { if (movement.point(adjusted) > bridge.getInnerHeight()) { return Option.some(movement.point(adjusted) - bridge.getInnerHeight()); } else if (movement.point(adjusted) < 0) { return Option.some(-movement.point(adjusted)); } else { return Option.none(); } }; var retry = function (movement, bridge, caret) { var moved = movement.move(caret, JUMP_SIZE); var adjusted = adjustTil(bridge, movement, caret, moved, NUM_RETRIES).getOr(moved); return checkScroll(movement, adjusted, bridge).fold(function () { return bridge.situsFromPoint(adjusted.left(), movement.point(adjusted)); }, function (delta) { bridge.scrollBy(0, delta); return bridge.situsFromPoint(adjusted.left(), movement.point(adjusted) - delta); }); }; var Retries = { tryUp: curry(retry, upMovement), tryDown: curry(retry, downMovement), ieTryUp: ieTryUp, ieTryDown: ieTryDown, getJumpSize: constant(JUMP_SIZE) }; var MAX_RETRIES = 20; var platform$1 = PlatformDetection$1.detect(); var findSpot = function (bridge, isRoot, direction) { return bridge.getSelection().bind(function (sel) { return BrTags.tryBr(isRoot, sel.finish(), sel.foffset(), direction).fold(function () { return Option.some(point(sel.finish(), sel.foffset())); }, function (brNeighbour) { var range = bridge.fromSitus(brNeighbour); var analysis = BeforeAfter.verify(bridge, sel.finish(), sel.foffset(), range.finish(), range.foffset(), direction.failure, isRoot); return BrTags.process(analysis); }); }); }; var scan = function (bridge, isRoot, element, offset, direction, numRetries) { if (numRetries === 0) { return Option.none(); } return tryCursor(bridge, isRoot, element, offset, direction).bind(function (situs) { var range = bridge.fromSitus(situs); var analysis = BeforeAfter.verify(bridge, element, offset, range.finish(), range.foffset(), direction.failure, isRoot); return BeforeAfter.cata(analysis, function () { return Option.none(); }, function () { return Option.some(situs); }, function (cell) { if (eq(element, cell) && offset === 0) { return tryAgain(bridge, element, offset, Carets.moveUp, direction); } else { return scan(bridge, isRoot, cell, 0, direction, numRetries - 1); } }, function (cell) { if (eq(element, cell) && offset === getEnd(cell)) { return tryAgain(bridge, element, offset, Carets.moveDown, direction); } else { return scan(bridge, isRoot, cell, getEnd(cell), direction, numRetries - 1); } }); }); }; var tryAgain = function (bridge, element, offset, move, direction) { return Rectangles.getBoxAt(bridge, element, offset).bind(function (box) { return tryAt(bridge, direction, move(box, Retries.getJumpSize())); }); }; var tryAt = function (bridge, direction, box) { if (platform$1.browser.isChrome() || platform$1.browser.isSafari() || platform$1.browser.isFirefox() || platform$1.browser.isEdge()) { return direction.otherRetry(bridge, box); } else if (platform$1.browser.isIE()) { return direction.ieRetry(bridge, box); } else { return Option.none(); } }; var tryCursor = function (bridge, isRoot, element, offset, direction) { return Rectangles.getBoxAt(bridge, element, offset).bind(function (box) { return tryAt(bridge, direction, box); }); }; var handle$2 = function (bridge, isRoot, direction) { return findSpot(bridge, isRoot, direction).bind(function (spot) { return scan(bridge, isRoot, spot.element(), spot.offset(), direction, MAX_RETRIES).map(bridge.fromSitus); }); }; var TableKeys = { handle: handle$2 }; var detection = PlatformDetection$1.detect(); var inSameTable = function (elem, table) { return ancestor$2(elem, function (e) { return parent(e).exists(function (p) { return eq(p, table); }); }); }; var simulate = function (bridge, isRoot, direction, initial, anchor) { return closest$1(initial, 'td,th', isRoot).bind(function (start) { return closest$1(start, 'table', isRoot).bind(function (table) { if (!inSameTable(anchor, table)) { return Option.none(); } return TableKeys.handle(bridge, isRoot, direction).bind(function (range) { return closest$1(range.finish(), 'td,th', isRoot).map(function (finish) { return { start: constant(start), finish: constant(finish), range: constant(range) }; }); }); }); }); }; var navigate = function (bridge, isRoot, direction, initial, anchor, precheck) { if (detection.browser.isIE()) { return Option.none(); } else { return precheck(initial, isRoot).orThunk(function () { return simulate(bridge, isRoot, direction, initial, anchor).map(function (info) { var range = info.range(); return Response.create(Option.some(Util.makeSitus(range.start(), range.soffset(), range.finish(), range.foffset())), true); }); }); } }; var firstUpCheck = function (initial, isRoot) { return closest$1(initial, 'tr', isRoot).bind(function (startRow) { return closest$1(startRow, 'table', isRoot).bind(function (table) { var rows = descendants$1(table, 'tr'); if (eq(startRow, rows[0])) { return seekLeft$1(table, function (element) { return last$1(element).isSome(); }, isRoot).map(function (last) { var lastOffset = getEnd(last); return Response.create(Option.some(Util.makeSitus(last, lastOffset, last, lastOffset)), true); }); } else { return Option.none(); } }); }); }; var lastDownCheck = function (initial, isRoot) { return closest$1(initial, 'tr', isRoot).bind(function (startRow) { return closest$1(startRow, 'table', isRoot).bind(function (table) { var rows = descendants$1(table, 'tr'); if (eq(startRow, rows[rows.length - 1])) { return seekRight$1(table, function (element) { return first(element).isSome(); }, isRoot).map(function (first) { return Response.create(Option.some(Util.makeSitus(first, 0, first, 0)), true); }); } else { return Option.none(); } }); }); }; var select = function (bridge, container, isRoot, direction, initial, anchor, selectRange) { return simulate(bridge, isRoot, direction, initial, anchor).bind(function (info) { return KeySelection.detect(container, isRoot, info.start(), info.finish(), selectRange); }); }; var VerticalMovement = { navigate: navigate, select: select, firstUpCheck: firstUpCheck, lastDownCheck: lastDownCheck }; var findCell = function (target, isRoot) { return closest$1(target, 'td,th', isRoot); }; function MouseSelection (bridge, container, isRoot, annotations) { var cursor = Option.none(); var clearState = function () { cursor = Option.none(); }; var mousedown = function (event) { annotations.clear(container); cursor = findCell(event.target(), isRoot); }; var mouseover = function (event) { cursor.each(function (start) { annotations.clear(container); findCell(event.target(), isRoot).each(function (finish) { CellSelection.identify(start, finish, isRoot).each(function (cellSel) { var boxes = cellSel.boxes().getOr([]); if (boxes.length > 1 || boxes.length === 1 && !eq(start, finish)) { annotations.selectRange(container, boxes, cellSel.start(), cellSel.finish()); bridge.selectContents(finish); } }); }); }); }; var mouseup = function (_event) { cursor.each(clearState); }; return { mousedown: mousedown, mouseover: mouseover, mouseup: mouseup }; } var down = { traverse: nextSibling, gather: after$5, relative: Situ.before, otherRetry: Retries.tryDown, ieRetry: Retries.ieTryDown, failure: BeforeAfter.failedDown }; var up = { traverse: prevSibling, gather: before$4, relative: Situ.before, otherRetry: Retries.tryUp, ieRetry: Retries.ieTryUp, failure: BeforeAfter.failedUp }; var KeyDirection = { down: down, up: up }; var isKey = function (key) { return function (keycode) { return keycode === key; }; }; var isUp = isKey(38); var isDown = isKey(40); var isNavigation = function (keycode) { return keycode >= 37 && keycode <= 40; }; var SelectionKeys = { ltr: { isBackward: isKey(37), isForward: isKey(39) }, rtl: { isBackward: isKey(39), isForward: isKey(37) }, isUp: isUp, isDown: isDown, isNavigation: isNavigation }; var toRaw = function (sr) { return { left: sr.left(), top: sr.top(), right: sr.right(), bottom: sr.bottom(), width: sr.width(), height: sr.height() }; }; var Rect = { toRaw: toRaw }; var isSafari = PlatformDetection$1.detect().browser.isSafari(); var get$a = function (_DOC) { var doc = _DOC !== undefined ? _DOC.dom() : domGlobals.document; var x = doc.body.scrollLeft || doc.documentElement.scrollLeft; var y = doc.body.scrollTop || doc.documentElement.scrollTop; return Position(x, y); }; var by = function (x, y, _DOC) { var doc = _DOC !== undefined ? _DOC.dom() : domGlobals.document; var win = doc.defaultView; win.scrollBy(x, y); }; var WindowBridge = function (win) { var elementFromPoint = function (x, y) { return Element.fromPoint(Element.fromDom(win.document), x, y); }; var getRect = function (element) { return element.dom().getBoundingClientRect(); }; var getRangedRect = function (start, soffset, finish, foffset) { var sel = Selection.exact(start, soffset, finish, foffset); return getFirstRect$1(win, sel).map(Rect.toRaw); }; var getSelection = function () { return get$9(win).map(function (exactAdt) { return Util.convertToRange(win, exactAdt); }); }; var fromSitus = function (situs) { var relative = Selection.relative(situs.start(), situs.finish()); return Util.convertToRange(win, relative); }; var situsFromPoint = function (x, y) { return getAtPoint(win, x, y).map(function (exact) { return Situs.create(exact.start(), exact.soffset(), exact.finish(), exact.foffset()); }); }; var clearSelection = function () { clear(win); }; var selectContents = function (element) { setToElement(win, element); }; var setSelection = function (sel) { setExact(win, sel.start(), sel.soffset(), sel.finish(), sel.foffset()); }; var setRelativeSelection = function (start, finish) { setRelative(win, start, finish); }; var getInnerHeight = function () { return win.innerHeight; }; var getScrollY = function () { var pos = get$a(Element.fromDom(win.document)); return pos.top(); }; var scrollBy = function (x, y) { by(x, y, Element.fromDom(win.document)); }; return { elementFromPoint: elementFromPoint, getRect: getRect, getRangedRect: getRangedRect, getSelection: getSelection, fromSitus: fromSitus, situsFromPoint: situsFromPoint, clearSelection: clearSelection, setSelection: setSelection, setRelativeSelection: setRelativeSelection, selectContents: selectContents, getInnerHeight: getInnerHeight, getScrollY: getScrollY, scrollBy: scrollBy }; }; var rc = Immutable('rows', 'cols'); var mouse = function (win, container, isRoot, annotations) { var bridge = WindowBridge(win); var handlers = MouseSelection(bridge, container, isRoot, annotations); return { mousedown: handlers.mousedown, mouseover: handlers.mouseover, mouseup: handlers.mouseup }; }; var keyboard = function (win, container, isRoot, annotations) { var bridge = WindowBridge(win); var clearToNavigate = function () { annotations.clear(container); return Option.none(); }; var keydown = function (event, start, soffset, finish, foffset, direction) { var realEvent = event.raw(); var keycode = realEvent.which; var shiftKey = realEvent.shiftKey === true; var handler = CellSelection.retrieve(container, annotations.selectedSelector()).fold(function () { if (SelectionKeys.isDown(keycode) && shiftKey) { return curry(VerticalMovement.select, bridge, container, isRoot, KeyDirection.down, finish, start, annotations.selectRange); } else if (SelectionKeys.isUp(keycode) && shiftKey) { return curry(VerticalMovement.select, bridge, container, isRoot, KeyDirection.up, finish, start, annotations.selectRange); } else if (SelectionKeys.isDown(keycode)) { return curry(VerticalMovement.navigate, bridge, isRoot, KeyDirection.down, finish, start, VerticalMovement.lastDownCheck); } else if (SelectionKeys.isUp(keycode)) { return curry(VerticalMovement.navigate, bridge, isRoot, KeyDirection.up, finish, start, VerticalMovement.firstUpCheck); } else { return Option.none; } }, function (selected) { var update = function (attempts) { return function () { var navigation = findMap(attempts, function (delta) { return KeySelection.update(delta.rows(), delta.cols(), container, selected, annotations); }); return navigation.fold(function () { return CellSelection.getEdges(container, annotations.firstSelectedSelector(), annotations.lastSelectedSelector()).map(function (edges) { var relative = SelectionKeys.isDown(keycode) || direction.isForward(keycode) ? Situ.after : Situ.before; bridge.setRelativeSelection(Situ.on(edges.first(), 0), relative(edges.table())); annotations.clear(container); return Response.create(Option.none(), true); }); }, function (_) { return Option.some(Response.create(Option.none(), true)); }); }; }; if (SelectionKeys.isDown(keycode) && shiftKey) { return update([rc(+1, 0)]); } else if (SelectionKeys.isUp(keycode) && shiftKey) { return update([rc(-1, 0)]); } else if (direction.isBackward(keycode) && shiftKey) { return update([ rc(0, -1), rc(-1, 0) ]); } else if (direction.isForward(keycode) && shiftKey) { return update([ rc(0, +1), rc(+1, 0) ]); } else if (SelectionKeys.isNavigation(keycode) && shiftKey === false) { return clearToNavigate; } else { return Option.none; } }); return handler(); }; var keyup = function (event, start, soffset, finish, foffset) { return CellSelection.retrieve(container, annotations.selectedSelector()).fold(function () { var realEvent = event.raw(); var keycode = realEvent.which; var shiftKey = realEvent.shiftKey === true; if (shiftKey === false) { return Option.none(); } if (SelectionKeys.isNavigation(keycode)) { return KeySelection.sync(container, isRoot, start, soffset, finish, foffset, annotations.selectRange); } else { return Option.none(); } }, Option.none); }; return { keydown: keydown, keyup: keyup }; }; var InputHandlers = { mouse: mouse, keyboard: keyboard }; var remove$7 = function (element, classes) { each(classes, function (x) { remove$5(element, x); }); }; var addClass = function (clazz) { return function (element) { add$2(element, clazz); }; }; var removeClasses = function (classes) { return function (element) { remove$7(element, classes); }; }; var byClass = function (ephemera) { var addSelectionClass = addClass(ephemera.selected()); var removeSelectionClasses = removeClasses([ ephemera.selected(), ephemera.lastSelected(), ephemera.firstSelected() ]); var clear = function (container) { var sels = descendants$1(container, ephemera.selectedSelector()); each(sels, removeSelectionClasses); }; var selectRange = function (container, cells, start, finish) { clear(container); each(cells, addSelectionClass); add$2(start, ephemera.firstSelected()); add$2(finish, ephemera.lastSelected()); }; return { clear: clear, selectRange: selectRange, selectedSelector: ephemera.selectedSelector, firstSelectedSelector: ephemera.firstSelectedSelector, lastSelectedSelector: ephemera.lastSelectedSelector }; }; var byAttr = function (ephemera) { var removeSelectionAttributes = function (element) { remove(element, ephemera.selected()); remove(element, ephemera.firstSelected()); remove(element, ephemera.lastSelected()); }; var addSelectionAttribute = function (element) { set(element, ephemera.selected(), '1'); }; var clear = function (container) { var sels = descendants$1(container, ephemera.selectedSelector()); each(sels, removeSelectionAttributes); }; var selectRange = function (container, cells, start, finish) { clear(container); each(cells, addSelectionAttribute); set(start, ephemera.firstSelected(), '1'); set(finish, ephemera.lastSelected(), '1'); }; return { clear: clear, selectRange: selectRange, selectedSelector: ephemera.selectedSelector, firstSelectedSelector: ephemera.firstSelectedSelector, lastSelectedSelector: ephemera.lastSelectedSelector }; }; var SelectionAnnotation = { byClass: byClass, byAttr: byAttr }; var hasInternalTarget = function (e) { return has$1(Element.fromDom(e.target), 'ephox-snooker-resizer-bar') === false; }; function CellSelection$1 (editor, lazyResize) { var handlerStruct = MixedBag([ 'mousedown', 'mouseover', 'mouseup', 'keyup', 'keydown' ], []); var handlers = Option.none(); var annotations = SelectionAnnotation.byAttr(Ephemera); editor.on('init', function (e) { var win = editor.getWin(); var body = getBody$1(editor); var isRoot = getIsRoot(editor); var syncSelection = function () { var sel = editor.selection; var start = Element.fromDom(sel.getStart()); var end = Element.fromDom(sel.getEnd()); var shared = DomParent.sharedOne(TableLookup.table, [ start, end ]); shared.fold(function () { annotations.clear(body); }, noop); }; var mouseHandlers = InputHandlers.mouse(win, body, isRoot, annotations); var keyHandlers = InputHandlers.keyboard(win, body, isRoot, annotations); var hasShiftKey = function (event) { return event.raw().shiftKey === true; }; var handleResponse = function (event, response) { if (!hasShiftKey(event)) { return; } if (response.kill()) { event.kill(); } response.selection().each(function (ns) { var relative = Selection.relative(ns.start(), ns.finish()); var rng = asLtrRange(win, relative); editor.selection.setRng(rng); }); }; var keyup = function (event) { var wrappedEvent = wrapEvent(event); if (wrappedEvent.raw().shiftKey && SelectionKeys.isNavigation(wrappedEvent.raw().which)) { var rng = editor.selection.getRng(); var start = Element.fromDom(rng.startContainer); var end = Element.fromDom(rng.endContainer); keyHandlers.keyup(wrappedEvent, start, rng.startOffset, end, rng.endOffset).each(function (response) { handleResponse(wrappedEvent, response); }); } }; var keydown = function (event) { var wrappedEvent = wrapEvent(event); lazyResize().each(function (resize) { resize.hideBars(); }); var rng = editor.selection.getRng(); var startContainer = Element.fromDom(editor.selection.getStart()); var start = Element.fromDom(rng.startContainer); var end = Element.fromDom(rng.endContainer); var direction = Direction.directionAt(startContainer).isRtl() ? SelectionKeys.rtl : SelectionKeys.ltr; keyHandlers.keydown(wrappedEvent, start, rng.startOffset, end, rng.endOffset, direction).each(function (response) { handleResponse(wrappedEvent, response); }); lazyResize().each(function (resize) { resize.showBars(); }); }; var isMouseEvent = function (event) { return event.hasOwnProperty('x') && event.hasOwnProperty('y'); }; var wrapEvent = function (event) { var target = Element.fromDom(event.target); var stop = function () { event.stopPropagation(); }; var prevent = function () { event.preventDefault(); }; var kill = compose(prevent, stop); return { target: constant(target), x: constant(isMouseEvent(event) ? event.x : null), y: constant(isMouseEvent(event) ? event.y : null), stop: stop, prevent: prevent, kill: kill, raw: constant(event) }; }; var isLeftMouse = function (raw) { return raw.button === 0; }; var isLeftButtonPressed = function (raw) { if (raw.buttons === undefined) { return true; } return (raw.buttons & 1) !== 0; }; var mouseDown = function (e) { if (isLeftMouse(e) && hasInternalTarget(e)) { mouseHandlers.mousedown(wrapEvent(e)); } }; var mouseOver = function (e) { if (isLeftButtonPressed(e) && hasInternalTarget(e)) { mouseHandlers.mouseover(wrapEvent(e)); } }; var mouseUp = function (e) { if (isLeftMouse(e) && hasInternalTarget(e)) { mouseHandlers.mouseup(wrapEvent(e)); } }; editor.on('mousedown', mouseDown); editor.on('mouseover', mouseOver); editor.on('mouseup', mouseUp); editor.on('keyup', keyup); editor.on('keydown', keydown); editor.on('nodechange', syncSelection); handlers = Option.some(handlerStruct({ mousedown: mouseDown, mouseover: mouseOver, mouseup: mouseUp, keyup: keyup, keydown: keydown })); }); var destroy = function () { handlers.each(function (handlers) { }); }; return { clear: annotations.clear, destroy: destroy }; } var Selections = function (editor) { var get = function () { var body = getBody$1(editor); return TableSelection.retrieve(body, Ephemera.selectedSelector()).fold(function () { if (editor.selection.getStart() === undefined) { return SelectionTypes.none(); } else { return SelectionTypes.single(editor.selection); } }, function (cells) { return SelectionTypes.multiple(cells); }); }; return { get: get }; }; var each$4 = global$1.each; var addButtons = function (editor) { var menuItems = []; each$4('inserttable tableprops deletetable | cell row column'.split(' '), function (name) { if (name === '|') { menuItems.push({ text: '-' }); } else { menuItems.push(editor.menuItems[name]); } }); editor.addButton('table', { type: 'menubutton', title: 'Table', menu: menuItems }); function cmd(command) { return function () { editor.execCommand(command); }; } editor.addButton('tableprops', { title: 'Table properties', onclick: cmd('mceTableProps'), icon: 'table' }); editor.addButton('tabledelete', { title: 'Delete table', onclick: cmd('mceTableDelete') }); editor.addButton('tablecellprops', { title: 'Cell properties', onclick: cmd('mceTableCellProps') }); editor.addButton('tablemergecells', { title: 'Merge cells', onclick: cmd('mceTableMergeCells') }); editor.addButton('tablesplitcells', { title: 'Split cell', onclick: cmd('mceTableSplitCells') }); editor.addButton('tableinsertrowbefore', { title: 'Insert row before', onclick: cmd('mceTableInsertRowBefore') }); editor.addButton('tableinsertrowafter', { title: 'Insert row after', onclick: cmd('mceTableInsertRowAfter') }); editor.addButton('tabledeleterow', { title: 'Delete row', onclick: cmd('mceTableDeleteRow') }); editor.addButton('tablerowprops', { title: 'Row properties', onclick: cmd('mceTableRowProps') }); editor.addButton('tablecutrow', { title: 'Cut row', onclick: cmd('mceTableCutRow') }); editor.addButton('tablecopyrow', { title: 'Copy row', onclick: cmd('mceTableCopyRow') }); editor.addButton('tablepasterowbefore', { title: 'Paste row before', onclick: cmd('mceTablePasteRowBefore') }); editor.addButton('tablepasterowafter', { title: 'Paste row after', onclick: cmd('mceTablePasteRowAfter') }); editor.addButton('tableinsertcolbefore', { title: 'Insert column before', onclick: cmd('mceTableInsertColBefore') }); editor.addButton('tableinsertcolafter', { title: 'Insert column after', onclick: cmd('mceTableInsertColAfter') }); editor.addButton('tabledeletecol', { title: 'Delete column', onclick: cmd('mceTableDeleteCol') }); }; var addToolbars = function (editor) { var isTable = function (table) { var selectorMatched = editor.dom.is(table, 'table') && editor.getBody().contains(table); return selectorMatched; }; var toolbar = getToolbar(editor); if (toolbar.length > 0) { editor.addContextToolbar(isTable, toolbar.join(' ')); } }; var Buttons = { addButtons: addButtons, addToolbars: addToolbars }; var addMenuItems = function (editor, selections) { var targets = Option.none(); var tableCtrls = []; var cellCtrls = []; var mergeCtrls = []; var unmergeCtrls = []; var noTargetDisable = function (ctrl) { ctrl.disabled(true); }; var ctrlEnable = function (ctrl) { ctrl.disabled(false); }; var pushTable = function () { var self = this; tableCtrls.push(self); targets.fold(function () { noTargetDisable(self); }, function (targets) { ctrlEnable(self); }); }; var pushCell = function () { var self = this; cellCtrls.push(self); targets.fold(function () { noTargetDisable(self); }, function (targets) { ctrlEnable(self); }); }; var pushMerge = function () { var self = this; mergeCtrls.push(self); targets.fold(function () { noTargetDisable(self); }, function (targets) { self.disabled(targets.mergable().isNone()); }); }; var pushUnmerge = function () { var self = this; unmergeCtrls.push(self); targets.fold(function () { noTargetDisable(self); }, function (targets) { self.disabled(targets.unmergable().isNone()); }); }; var setDisabledCtrls = function () { targets.fold(function () { each(tableCtrls, noTargetDisable); each(cellCtrls, noTargetDisable); each(mergeCtrls, noTargetDisable); each(unmergeCtrls, noTargetDisable); }, function (targets) { each(tableCtrls, ctrlEnable); each(cellCtrls, ctrlEnable); each(mergeCtrls, function (mergeCtrl) { mergeCtrl.disabled(targets.mergable().isNone()); }); each(unmergeCtrls, function (unmergeCtrl) { unmergeCtrl.disabled(targets.unmergable().isNone()); }); }); }; editor.on('init', function () { editor.on('nodechange', function (e) { var cellOpt = Option.from(editor.dom.getParent(editor.selection.getStart(), 'th,td')); targets = cellOpt.bind(function (cellDom) { var cell = Element.fromDom(cellDom); var table = TableLookup.table(cell); return table.map(function (table) { return TableTargets.forMenu(selections, table, cell); }); }); setDisabledCtrls(); }); }); var generateTableGrid = function () { var html = ''; html = ''; for (var y = 0; y < 10; y++) { html += ''; for (var x = 0; x < 10; x++) { html += ''; } html += ''; } html += '
    '; html += '

    '; return html; }; var selectGrid = function (editor, tx, ty, control) { var table = control.getEl().getElementsByTagName('table')[0]; var x, y, focusCell, cell, active; var rtl = control.isRtl() || control.parent().rel === 'tl-tr'; table.nextSibling.innerHTML = tx + 1 + ' x ' + (ty + 1); if (rtl) { tx = 9 - tx; } for (y = 0; y < 10; y++) { for (x = 0; x < 10; x++) { cell = table.rows[y].childNodes[x].firstChild; active = (rtl ? x >= tx : x <= tx) && y <= ty; editor.dom.toggleClass(cell, 'mce-active', active); if (active) { focusCell = cell; } } } return focusCell.parentNode; }; var insertTable = hasTableGrid(editor) === false ? { text: 'Table', icon: 'table', context: 'table', onclick: cmd('mceInsertTable') } : { text: 'Table', icon: 'table', context: 'table', ariaHideMenu: true, onclick: function (e) { if (e.aria) { this.parent().hideAll(); e.stopImmediatePropagation(); editor.execCommand('mceInsertTable'); } }, onshow: function () { selectGrid(editor, 0, 0, this.menu.items()[0]); }, onhide: function () { var elements = this.menu.items()[0].getEl().getElementsByTagName('a'); editor.dom.removeClass(elements, 'mce-active'); editor.dom.addClass(elements[0], 'mce-active'); }, menu: [{ type: 'container', html: generateTableGrid(), onPostRender: function () { this.lastX = this.lastY = 0; }, onmousemove: function (e) { var target = e.target; var x, y; if (target.tagName.toUpperCase() === 'A') { x = parseInt(target.getAttribute('data-mce-x'), 10); y = parseInt(target.getAttribute('data-mce-y'), 10); if (this.isRtl() || this.parent().rel === 'tl-tr') { x = 9 - x; } if (x !== this.lastX || y !== this.lastY) { selectGrid(editor, x, y, e.control); this.lastX = x; this.lastY = y; } } }, onclick: function (e) { var self = this; if (e.target.tagName.toUpperCase() === 'A') { e.preventDefault(); e.stopPropagation(); self.parent().cancel(); editor.undoManager.transact(function () { InsertTable.insert(editor, self.lastX + 1, self.lastY + 1); }); editor.addVisual(); } } }] }; function cmd(command) { return function () { editor.execCommand(command); }; } var tableProperties = { text: 'Table properties', context: 'table', onPostRender: pushTable, onclick: cmd('mceTableProps') }; var deleteTable = { text: 'Delete table', context: 'table', onPostRender: pushTable, cmd: 'mceTableDelete' }; var row = { text: 'Row', context: 'table', menu: [ { text: 'Insert row before', onclick: cmd('mceTableInsertRowBefore'), onPostRender: pushCell }, { text: 'Insert row after', onclick: cmd('mceTableInsertRowAfter'), onPostRender: pushCell }, { text: 'Delete row', onclick: cmd('mceTableDeleteRow'), onPostRender: pushCell }, { text: 'Row properties', onclick: cmd('mceTableRowProps'), onPostRender: pushCell }, { text: '-' }, { text: 'Cut row', onclick: cmd('mceTableCutRow'), onPostRender: pushCell }, { text: 'Copy row', onclick: cmd('mceTableCopyRow'), onPostRender: pushCell }, { text: 'Paste row before', onclick: cmd('mceTablePasteRowBefore'), onPostRender: pushCell }, { text: 'Paste row after', onclick: cmd('mceTablePasteRowAfter'), onPostRender: pushCell } ] }; var column = { text: 'Column', context: 'table', menu: [ { text: 'Insert column before', onclick: cmd('mceTableInsertColBefore'), onPostRender: pushCell }, { text: 'Insert column after', onclick: cmd('mceTableInsertColAfter'), onPostRender: pushCell }, { text: 'Delete column', onclick: cmd('mceTableDeleteCol'), onPostRender: pushCell } ] }; var cell = { separator: 'before', text: 'Cell', context: 'table', menu: [ { text: 'Cell properties', onclick: cmd('mceTableCellProps'), onPostRender: pushCell }, { text: 'Merge cells', onclick: cmd('mceTableMergeCells'), onPostRender: pushMerge }, { text: 'Split cell', onclick: cmd('mceTableSplitCells'), onPostRender: pushUnmerge } ] }; editor.addMenuItem('inserttable', insertTable); editor.addMenuItem('tableprops', tableProperties); editor.addMenuItem('deletetable', deleteTable); editor.addMenuItem('row', row); editor.addMenuItem('column', column); editor.addMenuItem('cell', cell); }; var MenuItems = { addMenuItems: addMenuItems }; var getClipboardRows = function (clipboardRows) { return clipboardRows.get().fold(function () { return; }, function (rows) { return map(rows, function (row) { return row.dom(); }); }); }; var setClipboardRows = function (rows, clipboardRows) { var sugarRows = map(rows, Element.fromDom); clipboardRows.set(Option.from(sugarRows)); }; var getApi = function (editor, clipboardRows) { return { insertTable: function (columns, rows) { return InsertTable.insert(editor, columns, rows); }, setClipboardRows: function (rows) { return setClipboardRows(rows, clipboardRows); }, getClipboardRows: function () { return getClipboardRows(clipboardRows); } }; }; function Plugin(editor) { var resizeHandler = ResizeHandler(editor); var cellSelection = CellSelection$1(editor, resizeHandler.lazyResize); var actions = TableActions(editor, resizeHandler.lazyWire); var selections = Selections(editor); var clipboardRows = Cell(Option.none()); Commands.registerCommands(editor, actions, cellSelection, selections, clipboardRows); Clipboard.registerEvents(editor, selections, actions, cellSelection); MenuItems.addMenuItems(editor, selections); Buttons.addButtons(editor); Buttons.addToolbars(editor); editor.on('PreInit', function () { editor.serializer.addTempAttr(Ephemera.firstSelected()); editor.serializer.addTempAttr(Ephemera.lastSelected()); }); if (hasTabNavigation(editor)) { editor.on('keydown', function (e) { TabContext.handle(e, editor, actions, resizeHandler.lazyWire); }); } editor.on('remove', function () { resizeHandler.destroy(); cellSelection.destroy(); }); return getApi(editor, clipboardRows); } global.add('table', Plugin); function Plugin$1 () { } return Plugin$1; }(window)); })(); PK:\mce/table/plugin.min.jsnuW+A!function(m){"use strict";var e=tinymce.util.Tools.resolve("tinymce.PluginManager"),y=function(){},x=function(n,r){return function(){for(var e=[],t=0;tn.maxRow()||sn.maxCol()||(vn.getAt(t,l,s).filter(r).isNone()?(o=f,i=e[l].element(),u=Te.fromTag("td"),Ot(u,Te.fromTag("br")),(o?Ot:Dt)(i,u)):f=!0)}(m,g,h,d),o=e,f=h,s=I(un.firstLayer(o,"tr"),function(e){return 0===e.dom().childElementCount}),P(s,Pt),f.minCol()!==f.maxCol()&&f.minRow()!==f.maxRow()||P(un.firstLayer(o,"th,td"),function(e){we(e,"rowspan"),we(e,"colspan")}),we(o,"width"),we(o,"height"),We(o,"width"),We(o,"height"),e},yn=(Jt=me,$t="text",{get:function(e){if(!Jt(e))throw new Error("Can only get "+$t+" value of a "+$t+" node");return Qt(e).getOr("")},getOption:Qt=function(e){return Jt(e)?S.from(e.dom().nodeValue):S.none()},set:function(e,t){if(!Jt(e))throw new Error("Can only set raw "+$t+" value of a "+$t+" node");e.dom().nodeValue=t}}),xn=function(e){return yn.get(e)},Cn=function(e){return yn.getOption(e)},Sn=function(e,t){yn.set(e,t)},Rn=function(e){return"img"===ce(e)?1:Cn(e).fold(function(){return Ct(e).length},function(e){return e.length})},Tn=["img","br"],Dn=function(e){return Cn(e).filter(function(e){return 0!==e.trim().length||-1=e.startCol()&&t.column()+t.colspan()-1<=e.finishCol()&&t.row()>=e.startRow()&&t.row()+t.rowspan()-1<=e.finishRow()},zn=function(e,t){var n=t.column(),r=t.column()+t.colspan()-1,o=t.row(),i=t.row()+t.rowspan()-1;return n<=e.finishCol()&&r>=e.startCol()&&o<=e.finishRow()&&i>=e.startRow()},Hn=function(e,t){for(var n=!0,r=b(jn,t),o=t.startRow();o<=t.finishRow();o++)for(var i=t.startCol();i<=t.finishCol();i++)n=n&&vn.getAt(e,o,i).exists(r);return n?S.some(t):S.none()},Un=function(e,t,n){var r=vn.findItem(e,t,gt),o=vn.findItem(e,n,gt);return r.bind(function(r){return o.map(function(e){return t=r,n=e,qt(Math.min(t.row(),n.row()),Math.min(t.column(),n.column()),Math.max(t.row()+t.rowspan()-1,n.row()+n.rowspan()-1),Math.max(t.column()+t.colspan()-1,n.column()+n.colspan()-1));var t,n})})},qn=Un,Vn=function(t,e,n){return Un(t,e,n).bind(function(e){return Hn(t,e)})},Gn=function(r,e,o,i){return vn.findItem(r,e,gt).bind(function(e){var t=0=t.length-1)return S.none();var e=t[n].fold(function(){var e=U(t.slice(0,n));return To(e,function(e,t){return e.map(function(e){return{value:e,delta:t+1}})})},function(e){return S.some({value:e,delta:0})}),r=t[n+1].fold(function(){var e=t.slice(n+1);return To(e,function(e,t){return e.map(function(e){return{value:e,delta:t+1}})})},function(e){return S.some({value:e,delta:1})});return e.bind(function(n){return r.map(function(e){var t=e.delta+n.delta;return Math.abs(e.value-n.value)/t})})},Lo=function(e,t,n){var r=e();return M(r,t).orThunk(function(){return S.from(r[0]).orThunk(n)}).map(function(e){return e.element()})},Fo=function(n){var e=n.grid(),t=Mo(0,e.columns()),r=Mo(0,e.rows());return A(t,function(t){return Lo(function(){return z(r,function(e){return vn.getAt(n,e,t).filter(function(e){return e.column()===t}).fold(C([]),function(e){return[e]})})},function(e){return 1===e.colspan()},function(){return vn.getAt(n,0,t)})})},jo=function(n){var e=n.grid(),t=Mo(0,e.rows()),r=Mo(0,e.columns());return A(t,function(t){return Lo(function(){return z(r,function(e){return vn.getAt(n,t,e).filter(function(e){return e.row()===t}).fold(C([]),function(e){return[e]})})},function(e){return 1===e.rowspan()},function(){return vn.getAt(n,t,0)})})},zo=function(e){var t=e.replace(/\./g,"-");return{resolve:function(e){return t+"-"+e}}},Ho={resolve:zo("ephox-snooker").resolve},Uo=function(e,t,n,r,o){var i=Te.fromTag("div");return Ae(i,{position:"absolute",left:t-r/2+"px",top:n+"px",height:o+"px",width:r+"px"}),pe(i,{"data-column":e,role:"presentation"}),i},qo=function(e,t,n,r,o){var i=Te.fromTag("div");return Ae(i,{position:"absolute",left:t+"px",top:n-o/2+"px",height:o+"px",width:r+"px"}),pe(i,{"data-row":e,role:"presentation"}),i},Vo=Ho.resolve("resizer-bar"),Go=Ho.resolve("resizer-rows"),Yo=Ho.resolve("resizer-cols"),Xo=function(e){var t=Xt(e.parent(),"."+Vo);P(t,Pt)},Ko=function(n,e,r){var o=n.origin();P(e,function(e,t){e.each(function(e){var t=r(o,e);Io(t,Vo),Ot(n.parent(),t)})})},Jo=function(e,t,n,r,o,i){var u,a,c,l,f=uo(t),s=0=t.length||e.column()>ui.cellLength(t[0]))return yi.error("invalid start address out of table bounds, row: "+e.row()+", column: "+e.column());var r=t.slice(e.row()),o=r[0].cells().slice(e.column()),i=ui.cellLength(n[0]),u=n.length;return yi.value({rowDelta:C(r.length-u),colDelta:C(o.length-i)})},Ti=function(e,t){var n=ui.cellLength(e[0]),r=ui.cellLength(t[0]);return{rowDelta:C(0),colDelta:C(n-r)}},Di=function(e,t,n){var r=t.colDelta()<0?Si:o;return(t.rowDelta()<0?Ci:o)(r(e,Math.abs(t.colDelta()),n),Math.abs(t.rowDelta()),n)},Oi=function(e,t,n,r){if(0===e.length)return e;for(var o=t.startRow();o<=t.finishRow();o++)for(var i=t.startCol();i<=t.finishCol();i++)ui.mutateCell(e[o],i,jt(r(),!1));return e},Ni=function(e,t,n,r){for(var o=!0,i=0;i',t.insertBefore(r,t.firstChild)),ba(e,t),o.align&&pa(e,t,o.align),e.focus(),e.addVisual()})},Ma=function(t,e){var n,r,o,i,u,a,c,l,f,s,d=t.dom,m={};!0===e?(n=d.getParent(t.selection.getStart(),"table"))&&(c=n,l=(a=t).dom,f={width:l.getStyle(c,"width")||l.getAttrib(c,"width"),height:l.getStyle(c,"height")||l.getAttrib(c,"height"),cellspacing:l.getStyle(c,"border-spacing")||l.getAttrib(c,"cellspacing"),cellpadding:l.getAttrib(c,"data-mce-cell-padding")||l.getAttrib(c,"cellpadding")||ya(a.dom,c,"padding"),border:l.getAttrib(c,"data-mce-border")||l.getAttrib(c,"border")||ya(a.dom,c,"border"),borderColor:l.getAttrib(c,"data-mce-border-color"),caption:!!l.select("caption",c)[0],"class":l.getAttrib(c,"class")},ha.each("left center right".split(" "),function(e){a.formatter.matchNode(c,"align"+e)&&(f.align=e)}),ra(a)&&ha.extend(f,Sa.extractAdvancedStyles(l,c)),m=f):(r={label:"Cols",name:"cols"},o={label:"Rows",name:"rows"}),0=e.left&&t<=e.right&&n>=e.top&&n<=e.bottom},Ac=function(n,r,e,t,o){var i=function(e){var t=n.dom().createRange();return t.setStart(r.dom(),e),t.collapse(!0),t},u=xn(r).length,a=function(e,t,n,r,o){if(0===o)return 0;if(t===r)return o-1;for(var i=r,u=1;ur.left&&o.left ("+e.right()+", "+e.bottom()+")"}},Fl=function(e){return Ll.nu({left:e.left,top:e.top,right:e.right,bottom:e.bottom})},jl=function(e,t){return S.some(e.getRect(t))},zl=function(e,t,n){return de(t)?jl(e,t).map(Fl):me(t)?(r=e,o=t,i=n,0<=i&&in.right();var t,n})});var n,o,i},Vl={point:Ll.getTop,adjuster:function(e,t,n,r,o){var i=Ll.moveUp(o,5);return Math.abs(n.top()-r.top())<1?Ul.retry(i):n.bottom()o.bottom()?Ul.retry(i):n.top()===o.bottom()?Ul.retry(Ll.moveDown(o,1)):ql(e,t,o)?Ul.retry(Ll.translate(i,5,0)):Ul.none()},move:Ll.moveDown,gather:Tl},Yl=function(n,r,o,i,u){return 0===u?S.some(i):(c=n,l=i.left(),f=r.point(i),c.elementFromPoint(l,f).filter(function(e){return"table"===ce(e)}).isSome()?(t=i,a=u-1,Yl(n,e=r,o,e.move(t,5),a)):n.situsFromPoint(i.left(),r.point(i)).bind(function(e){return e.start().fold(S.none,function(t){return Hl(n,t).bind(function(e){return r.adjuster(n,t,e,o,i).fold(S.none,function(e){return Yl(n,r,o,e,u-1)})}).orThunk(function(){return S.some(i)})},S.none)}));var e,t,a,c,l,f},Xl=function(t,n,e){var r,o,i,u=t.move(e,5),a=Yl(n,t,e,u,100).getOr(u);return(r=t,o=a,i=n,r.point(o)>i.getInnerHeight()?S.some(r.point(o)-i.getInnerHeight()):r.point(o)<0?S.some(-r.point(o)):S.none()).fold(function(){return n.situsFromPoint(a.left(),t.point(a))},function(e){return n.scrollBy(0,e),n.situsFromPoint(a.left(),t.point(a)-e)})},Kl={tryUp:b(Xl,Vl),tryDown:b(Xl,Gl),ieTryUp:function(e,t){return e.situsFromPoint(t.left(),t.top()-5)},ieTryDown:function(e,t){return e.situsFromPoint(t.left(),t.bottom()+5)},getJumpSize:C(5)},Jl=lt.detect(),$l=function(r,o,i,u,a,c){return 0===c?S.none():ef(r,o,i,u,a).bind(function(e){var t=r.fromSitus(e),n=El.verify(r,i,u,t.finish(),t.foffset(),a.failure,o);return El.cata(n,function(){return S.none()},function(){return S.some(e)},function(e){return gt(i,e)&&0===u?Ql(r,i,u,Ll.moveUp,a):$l(r,o,e,0,a,c-1)},function(e){return gt(i,e)&&u===Rn(e)?Ql(r,i,u,Ll.moveDown,a):$l(r,o,e,Rn(e),a,c-1)})})},Ql=function(t,e,n,r,o){return zl(t,e,n).bind(function(e){return Zl(t,o,r(e,Kl.getJumpSize()))})},Zl=function(e,t,n){return Jl.browser.isChrome()||Jl.browser.isSafari()||Jl.browser.isFirefox()||Jl.browser.isEdge()?t.otherRetry(e,n):Jl.browser.isIE()?t.ieRetry(e,n):S.none()},ef=function(t,e,n,r,o){return zl(t,n,r).bind(function(e){return Zl(t,o,e)})},tf=function(t,n,r){return(o=t,i=n,u=r,o.getSelection().bind(function(r){return Wl(i,r.finish(),r.foffset(),u).fold(function(){return S.some(Dl(r.finish(),r.foffset()))},function(e){var t=o.fromSitus(e),n=El.verify(o,r.finish(),r.foffset(),t.finish(),t.foffset(),u.failure,i);return Ml(n)})})).bind(function(e){return $l(t,n,e.element(),e.offset(),r,20).map(t.fromSitus)});var o,i,u},nf=lt.detect(),rf=function(e,t){return Zt(e,function(e){return bt(e).exists(function(e){return gt(e,t)})},n).isSome();var n},of=function(t,r,o,e,i){return rn(e,"td,th",r).bind(function(n){return rn(n,"table",r).bind(function(e){return rf(i,e)?tf(t,r,o).bind(function(t){return rn(t.finish(),"td,th",r).map(function(e){return{start:C(n),finish:C(e),range:C(t)}})}):S.none()})})},uf=function(e,t,n,r,o,i){return nf.browser.isIE()?S.none():i(r,t).orThunk(function(){return of(e,t,n,r,o).map(function(e){var t=e.range();return ul.create(S.some(cl.makeSitus(t.start(),t.soffset(),t.finish(),t.foffset())),!0)})})},af=function(e,t,n,r,o,i,u){return of(e,n,r,o,i).bind(function(e){return fl.detect(t,n,e.start(),e.finish(),u)})},cf=function(e,u){return rn(e,"tr",u).bind(function(i){return rn(i,"table",u).bind(function(e){var t,n,r,o=Xt(e,"tr");return gt(i,o[0])?(t=e,n=function(e){return Nn(e).isSome()},r=u,xl(Sl,t,n,r)).map(function(e){var t=Rn(e);return ul.create(S.some(cl.makeSitus(e,t,e,t)),!0)}):S.none()})})},lf=function(e,u){return rn(e,"tr",u).bind(function(i){return rn(i,"table",u).bind(function(e){var t,n,r,o=Xt(e,"tr");return gt(i,o[o.length-1])?(t=e,n=function(e){return On(e).isSome()},r=u,Cl(Sl,t,n,r)).map(function(e){return ul.create(S.some(cl.makeSitus(e,0,e,0)),!0)}):S.none()})})},ff=function(e,t){return rn(e,"td,th",t)},sf={down:{traverse:xt,gather:Tl,relative:wc.before,otherRetry:Kl.tryDown,ieRetry:Kl.ieTryDown,failure:El.failedDown},up:{traverse:yt,gather:Rl,relative:wc.before,otherRetry:Kl.tryUp,ieRetry:Kl.ieTryUp,failure:El.failedUp}},df=function(t){return function(e){return e===t}},mf=df(38),gf=df(40),hf={ltr:{isBackward:df(37),isForward:df(39)},rtl:{isBackward:df(39),isForward:df(37)},isUp:mf,isDown:gf,isNavigation:function(e){return 37<=e&&e<=40}},pf=function(e){return{left:e.left(),top:e.top(),right:e.right(),bottom:e.bottom(),width:e.width(),height:e.height()}},vf=(lt.detect().browser.isSafari(),function(a){return{elementFromPoint:function(e,t){return Te.fromPoint(Te.fromDom(a.document),e,t)},getRect:function(e){return e.dom().getBoundingClientRect()},getRangedRect:function(e,t,n,r){var o=xc.exact(e,t,n,r);return Jc(a,o).map(pf)},getSelection:function(){return Kc(a).map(function(e){return cl.convertToRange(a,e)})},fromSitus:function(e){var t=xc.relative(e.start(),e.finish());return cl.convertToRange(a,t)},situsFromPoint:function(e,t){return $c(a,e,t).map(function(e){return al(e.start(),e.soffset(),e.finish(),e.foffset())})},clearSelection:function(){a.getSelection().removeAllRanges()},setSelection:function(e){var t,n,r,o,i,u;t=a,n=e.start(),r=e.soffset(),o=e.finish(),i=e.foffset(),u=zc(n,r,o,i),Vc(t,u)},setRelativeSelection:function(e,t){var n,r;n=a,r=jc(e,t),Vc(n,r)},selectContents:function(e){Xc(a,e)},getInnerHeight:function(){return a.innerHeight},getScrollY:function(){var e,t,n,r;return(e=Te.fromDom(a.document),t=e!==undefined?e.dom():m.document,n=t.body.scrollLeft||t.documentElement.scrollLeft,r=t.body.scrollTop||t.documentElement.scrollTop,oo(n,r)).top()},scrollBy:function(e,t){var n,r,o;n=e,r=t,((o=Te.fromDom(a.document))!==undefined?o.dom():m.document).defaultView.scrollBy(n,r)}}}),bf=X("rows","cols"),wf={mouse:function(e,t,n,r){var o,i,u,a,c,l,f=vf(e),s=(o=f,i=t,u=n,a=r,c=S.none(),l=function(){c=S.none()},{mousedown:function(e){a.clear(i),c=ff(e.target(),u)},mouseover:function(e){c.each(function(r){a.clear(i),ff(e.target(),u).each(function(n){hr(r,n,u).each(function(e){var t=e.boxes().getOr([]);(1";for(var n=0;n<10;n++)e+='';e+=""}return e+="",e+=''}(),onPostRender:function(){this.lastX=this.lastY=0},onmousemove:function(e){var t,n,r=e.target;"A"===r.tagName.toUpperCase()&&(t=parseInt(r.getAttribute("data-mce-x"),10),n=parseInt(r.getAttribute("data-mce-y"),10),(this.isRtl()||"tl-tr"===this.parent().rel)&&(t=9-t),t===this.lastX&&n===this.lastY||(s(o,t,n,e.control),this.lastX=t,this.lastY=n))},onclick:function(e){var t=this;"A"===e.target.tagName.toUpperCase()&&(e.preventDefault(),e.stopPropagation(),t.parent().cancel(),o.undoManager.transact(function(){Pa(o,t.lastX+1,t.lastY+1)}),o.addVisual())}}]};function m(e){return function(){o.execCommand(e)}}var g={text:"Table properties",context:"table",onPostRender:e,onclick:m("mceTableProps")},h={text:"Delete table",context:"table",onPostRender:e,cmd:"mceTableDelete"},p={text:"Row",context:"table",menu:[{text:"Insert row before",onclick:m("mceTableInsertRowBefore"),onPostRender:t},{text:"Insert row after",onclick:m("mceTableInsertRowAfter"),onPostRender:t},{text:"Delete row",onclick:m("mceTableDeleteRow"),onPostRender:t},{text:"Row properties",onclick:m("mceTableRowProps"),onPostRender:t},{text:"-"},{text:"Cut row",onclick:m("mceTableCutRow"),onPostRender:t},{text:"Copy row",onclick:m("mceTableCopyRow"),onPostRender:t},{text:"Paste row before",onclick:m("mceTablePasteRowBefore"),onPostRender:t},{text:"Paste row after",onclick:m("mceTablePasteRowAfter"),onPostRender:t}]},v={text:"Column",context:"table",menu:[{text:"Insert column before",onclick:m("mceTableInsertColBefore"),onPostRender:t},{text:"Insert column after",onclick:m("mceTableInsertColAfter"),onPostRender:t},{text:"Delete column",onclick:m("mceTableDeleteCol"),onPostRender:t}]},b={separator:"before",text:"Cell",context:"table",menu:[{text:"Cell properties",onclick:m("mceTableCellProps"),onPostRender:t},{text:"Merge cells",onclick:m("mceTableMergeCells"),onPostRender:function(){var t=this;a.push(t),r.fold(function(){l(t)},function(e){t.disabled(e.mergable().isNone())})}},{text:"Split cell",onclick:m("mceTableSplitCells"),onPostRender:function(){var t=this;c.push(t),r.fold(function(){l(t)},function(e){t.disabled(e.unmergable().isNone())})}}]};o.addMenuItem("inserttable",d),o.addMenuItem("tableprops",g),o.addMenuItem("deletetable",h),o.addMenuItem("row",p),o.addMenuItem("column",v),o.addMenuItem("cell",b)},Nf=function(n,r){return{insertTable:function(e,t){return Pa(n,e,t)},setClipboardRows:function(e){return t=r,n=A(e,Te.fromDom),void t.set(S.from(n));var t,n},getClipboardRows:function(){return r.get().fold(function(){},function(e){return A(e,function(e){return e.dom()})})}}};e.add("table",function(t){var n,r=sc(t),e=Sf(t,r.lazyResize),o=ma(t,r.lazyWire),i=(n=t,{get:function(){var e=Uu(n);return wr(e,Rr.selectedSelector()).fold(function(){return n.selection.getStart()===undefined?Or.none():Or.single(n.selection)},function(e){return Or.multiple(e)})}}),u=mu(S.none());return La(t,o,e,i,u),Wr(t,i,o,e),Of(t,i),Tf(t),Df(t),t.on("PreInit",function(){t.serializer.addTempAttr(Rr.firstSelected()),t.serializer.addTempAttr(Rr.lastSelected())}),t.getParam("table_tab_navigation",!0,"boolean")&&t.on("keydown",function(e){il(e,t,o,r.lazyWire)}),t.on("remove",function(){r.destroy(),e.destroy()}),Nf(t,u)})}(window);PK:\g&mce/nonbreaking/plugin.min.jsnuW+A!function(){"use strict";var n=tinymce.util.Tools.resolve("tinymce.PluginManager"),i=function(n,e){var t,i=(t=n).plugins.visualchars&&t.plugins.visualchars.isEnabled()?' ':" ";n.insertContent(function(n,e){for(var t="",i=0;i ' : ' '; editor.insertContent(stringRepeat(nbsp, times)); editor.dom.setAttrib(editor.dom.select('span.mce-nbsp'), 'data-mce-bogus', '1'); }; var Actions = { insertNbsp: insertNbsp }; var register = function (editor) { editor.addCommand('mceNonBreaking', function () { Actions.insertNbsp(editor, 1); }); }; var Commands = { register: register }; var global$1 = tinymce.util.Tools.resolve('tinymce.util.VK'); var getKeyboardSpaces = function (editor) { var spaces = editor.getParam('nonbreaking_force_tab', 0); if (typeof spaces === 'boolean') { return spaces === true ? 3 : 0; } else { return spaces; } }; var Settings = { getKeyboardSpaces: getKeyboardSpaces }; var setup = function (editor) { var spaces = Settings.getKeyboardSpaces(editor); if (spaces > 0) { editor.on('keydown', function (e) { if (e.keyCode === global$1.TAB && !e.isDefaultPrevented()) { if (e.shiftKey) { return; } e.preventDefault(); e.stopImmediatePropagation(); Actions.insertNbsp(editor, spaces); } }); } }; var Keyboard = { setup: setup }; var register$1 = function (editor) { editor.addButton('nonbreaking', { title: 'Nonbreaking space', cmd: 'mceNonBreaking' }); editor.addMenuItem('nonbreaking', { icon: 'nonbreaking', text: 'Nonbreaking space', cmd: 'mceNonBreaking', context: 'insert' }); }; var Buttons = { register: register$1 }; global.add('nonbreaking', function (editor) { Commands.register(editor); Buttons.register(editor); Keyboard.setup(editor); }); function Plugin () { } return Plugin; }()); })(); PK:\۝͝44mce/visualchars/plugin.jsnuW+A(function () { var visualchars = (function (domGlobals) { 'use strict'; var Cell = function (initial) { var value = initial; var get = function () { return value; }; var set = function (v) { value = v; }; var clone = function () { return Cell(get()); }; return { get: get, set: set, clone: clone }; }; var global = tinymce.util.Tools.resolve('tinymce.PluginManager'); var get = function (toggleState) { var isEnabled = function () { return toggleState.get(); }; return { isEnabled: isEnabled }; }; var Api = { get: get }; var fireVisualChars = function (editor, state) { return editor.fire('VisualChars', { state: state }); }; var Events = { fireVisualChars: fireVisualChars }; var charMap = { '\xA0': 'nbsp', '\xAD': 'shy' }; var charMapToRegExp = function (charMap, global) { var key, regExp = ''; for (key in charMap) { regExp += key; } return new RegExp('[' + regExp + ']', global ? 'g' : ''); }; var charMapToSelector = function (charMap) { var key, selector = ''; for (key in charMap) { if (selector) { selector += ','; } selector += 'span.mce-' + charMap[key]; } return selector; }; var Data = { charMap: charMap, regExp: charMapToRegExp(charMap), regExpGlobal: charMapToRegExp(charMap, true), selector: charMapToSelector(charMap), charMapToRegExp: charMapToRegExp, charMapToSelector: charMapToSelector }; var constant = function (value) { return function () { return value; }; }; var never = constant(false); var always = constant(true); var never$1 = never; var always$1 = always; var none = function () { return NONE; }; var NONE = function () { var eq = function (o) { return o.isNone(); }; var call = function (thunk) { return thunk(); }; var id = function (n) { return n; }; var noop = function () { }; var nul = function () { return null; }; var undef = function () { return undefined; }; var me = { fold: function (n, s) { return n(); }, is: never$1, isSome: never$1, isNone: always$1, getOr: id, getOrThunk: call, getOrDie: function (msg) { throw new Error(msg || 'error: getOrDie called on none.'); }, getOrNull: nul, getOrUndefined: undef, or: id, orThunk: call, map: none, ap: none, each: noop, bind: none, flatten: none, exists: never$1, forall: always$1, filter: none, equals: eq, equals_: eq, toArray: function () { return []; }, toString: constant('none()') }; if (Object.freeze) { Object.freeze(me); } return me; }(); var some = function (a) { var constant_a = function () { return a; }; var self = function () { return me; }; var map = function (f) { return some(f(a)); }; var bind = function (f) { return f(a); }; var me = { fold: function (n, s) { return s(a); }, is: function (v) { return a === v; }, isSome: always$1, isNone: never$1, getOr: constant_a, getOrThunk: constant_a, getOrDie: constant_a, getOrNull: constant_a, getOrUndefined: constant_a, or: self, orThunk: self, map: map, ap: function (optfab) { return optfab.fold(none, function (fab) { return some(fab(a)); }); }, each: function (f) { f(a); }, bind: bind, flatten: constant_a, exists: bind, forall: bind, filter: function (f) { return f(a) ? me : NONE; }, equals: function (o) { return o.is(a); }, equals_: function (o, elementEq) { return o.fold(never$1, function (b) { return elementEq(a, b); }); }, toArray: function () { return [a]; }, toString: function () { return 'some(' + a + ')'; } }; return me; }; var from = function (value) { return value === null || value === undefined ? NONE : some(value); }; var Option = { some: some, none: none, from: from }; var typeOf = function (x) { if (x === null) { return 'null'; } var t = typeof x; if (t === 'object' && (Array.prototype.isPrototypeOf(x) || x.constructor && x.constructor.name === 'Array')) { return 'array'; } if (t === 'object' && (String.prototype.isPrototypeOf(x) || x.constructor && x.constructor.name === 'String')) { return 'string'; } return t; }; var isType = function (type) { return function (value) { return typeOf(value) === type; }; }; var isFunction = isType('function'); var slice = Array.prototype.slice; var map = function (xs, f) { var len = xs.length; var r = new Array(len); for (var i = 0; i < len; i++) { var x = xs[i]; r[i] = f(x, i, xs); } return r; }; var each = function (xs, f) { for (var i = 0, len = xs.length; i < len; i++) { var x = xs[i]; f(x, i, xs); } }; var from$1 = isFunction(Array.from) ? Array.from : function (x) { return slice.call(x); }; var fromHtml = function (html, scope) { var doc = scope || domGlobals.document; var div = doc.createElement('div'); div.innerHTML = html; if (!div.hasChildNodes() || div.childNodes.length > 1) { domGlobals.console.error('HTML does not have a single root node', html); throw new Error('HTML must have a single root node'); } return fromDom(div.childNodes[0]); }; var fromTag = function (tag, scope) { var doc = scope || domGlobals.document; var node = doc.createElement(tag); return fromDom(node); }; var fromText = function (text, scope) { var doc = scope || domGlobals.document; var node = doc.createTextNode(text); return fromDom(node); }; var fromDom = function (node) { if (node === null || node === undefined) { throw new Error('Node cannot be null or undefined'); } return { dom: constant(node) }; }; var fromPoint = function (docElm, x, y) { var doc = docElm.dom(); return Option.from(doc.elementFromPoint(x, y)).map(fromDom); }; var Element = { fromHtml: fromHtml, fromTag: fromTag, fromText: fromText, fromDom: fromDom, fromPoint: fromPoint }; var ATTRIBUTE = domGlobals.Node.ATTRIBUTE_NODE; var CDATA_SECTION = domGlobals.Node.CDATA_SECTION_NODE; var COMMENT = domGlobals.Node.COMMENT_NODE; var DOCUMENT = domGlobals.Node.DOCUMENT_NODE; var DOCUMENT_TYPE = domGlobals.Node.DOCUMENT_TYPE_NODE; var DOCUMENT_FRAGMENT = domGlobals.Node.DOCUMENT_FRAGMENT_NODE; var ELEMENT = domGlobals.Node.ELEMENT_NODE; var TEXT = domGlobals.Node.TEXT_NODE; var PROCESSING_INSTRUCTION = domGlobals.Node.PROCESSING_INSTRUCTION_NODE; var ENTITY_REFERENCE = domGlobals.Node.ENTITY_REFERENCE_NODE; var ENTITY = domGlobals.Node.ENTITY_NODE; var NOTATION = domGlobals.Node.NOTATION_NODE; var Global = typeof domGlobals.window !== 'undefined' ? domGlobals.window : Function('return this;')(); var type = function (element) { return element.dom().nodeType; }; var value = function (element) { return element.dom().nodeValue; }; var isType$1 = function (t) { return function (element) { return type(element) === t; }; }; var isText = isType$1(TEXT); var wrapCharWithSpan = function (value) { return '' + value + ''; }; var Html = { wrapCharWithSpan: wrapCharWithSpan }; var isMatch = function (n) { return isText(n) && value(n) !== undefined && Data.regExp.test(value(n)); }; var filterDescendants = function (scope, predicate) { var result = []; var dom = scope.dom(); var children = map(dom.childNodes, Element.fromDom); each(children, function (x) { if (predicate(x)) { result = result.concat([x]); } result = result.concat(filterDescendants(x, predicate)); }); return result; }; var findParentElm = function (elm, rootElm) { while (elm.parentNode) { if (elm.parentNode === rootElm) { return elm; } elm = elm.parentNode; } }; var replaceWithSpans = function (html) { return html.replace(Data.regExpGlobal, Html.wrapCharWithSpan); }; var Nodes = { isMatch: isMatch, filterDescendants: filterDescendants, findParentElm: findParentElm, replaceWithSpans: replaceWithSpans }; var show = function (editor, rootElm) { var node, div; var nodeList = Nodes.filterDescendants(Element.fromDom(rootElm), Nodes.isMatch); each(nodeList, function (n) { var withSpans = Nodes.replaceWithSpans(value(n)); div = editor.dom.create('div', null, withSpans); while (node = div.lastChild) { editor.dom.insertAfter(node, n.dom()); } editor.dom.remove(n.dom()); }); }; var hide = function (editor, body) { var nodeList = editor.dom.select(Data.selector, body); each(nodeList, function (node) { editor.dom.remove(node, 1); }); }; var toggle = function (editor) { var body = editor.getBody(); var bookmark = editor.selection.getBookmark(); var parentNode = Nodes.findParentElm(editor.selection.getNode(), body); parentNode = parentNode !== undefined ? parentNode : body; hide(editor, parentNode); show(editor, parentNode); editor.selection.moveToBookmark(bookmark); }; var VisualChars = { show: show, hide: hide, toggle: toggle }; var toggleVisualChars = function (editor, toggleState) { var body = editor.getBody(); var selection = editor.selection; var bookmark; toggleState.set(!toggleState.get()); Events.fireVisualChars(editor, toggleState.get()); bookmark = selection.getBookmark(); if (toggleState.get() === true) { VisualChars.show(editor, body); } else { VisualChars.hide(editor, body); } selection.moveToBookmark(bookmark); }; var Actions = { toggleVisualChars: toggleVisualChars }; var register = function (editor, toggleState) { editor.addCommand('mceVisualChars', function () { Actions.toggleVisualChars(editor, toggleState); }); }; var Commands = { register: register }; var global$1 = tinymce.util.Tools.resolve('tinymce.util.Delay'); var setup = function (editor, toggleState) { var debouncedToggle = global$1.debounce(function () { VisualChars.toggle(editor); }, 300); if (editor.settings.forced_root_block !== false) { editor.on('keydown', function (e) { if (toggleState.get() === true) { e.keyCode === 13 ? VisualChars.toggle(editor) : debouncedToggle(); } }); } }; var Keyboard = { setup: setup }; var isEnabledByDefault = function (editor) { return editor.getParam('visualchars_default_state', false); }; var Settings = { isEnabledByDefault: isEnabledByDefault }; var setup$1 = function (editor, toggleState) { editor.on('init', function () { var valueForToggling = !Settings.isEnabledByDefault(editor); toggleState.set(valueForToggling); Actions.toggleVisualChars(editor, toggleState); }); }; var Bindings = { setup: setup$1 }; var toggleActiveState = function (editor) { return function (e) { var ctrl = e.control; editor.on('VisualChars', function (e) { ctrl.active(e.state); }); }; }; var register$1 = function (editor) { editor.addButton('visualchars', { active: false, title: 'Show invisible characters', cmd: 'mceVisualChars', onPostRender: toggleActiveState(editor) }); editor.addMenuItem('visualchars', { text: 'Show invisible characters', cmd: 'mceVisualChars', onPostRender: toggleActiveState(editor), selectable: true, context: 'view', prependToContext: true }); }; global.add('visualchars', function (editor) { var toggleState = Cell(false); Commands.register(editor, toggleState); register$1(editor); Keyboard.setup(editor, toggleState); Bindings.setup(editor, toggleState); return Api.get(toggleState); }); function Plugin () { } return Plugin; }(window)); })(); PK:\M2xBBmce/visualchars/plugin.min.jsnuW+A!function(r){"use strict";var n,e,t,o,u,i,c=function(n){var e=n,t=function(){return e};return{get:t,set:function(n){e=n},clone:function(){return c(t())}}},a=tinymce.util.Tools.resolve("tinymce.PluginManager"),f=function(n){return{isEnabled:function(){return n.get()}}},d=function(n,e){return n.fire("VisualChars",{state:e})},l={"\xa0":"nbsp","\xad":"shy"},s=function(n,e){var t,r="";for(t in n)r+=t;return new RegExp("["+r+"]",e?"g":"")},m=function(n){var e,t="";for(e in n)t&&(t+=","),t+="span.mce-"+n[e];return t},N={charMap:l,regExp:s(l),regExpGlobal:s(l,!0),selector:m(l),charMapToRegExp:s,charMapToSelector:m},g=function(n){return function(){return n}},E=g(!1),h=g(!0),v=E,p=h,T=function(){return O},O=(o={fold:function(n,e){return n()},is:v,isSome:v,isNone:p,getOr:t=function(n){return n},getOrThunk:e=function(n){return n()},getOrDie:function(n){throw new Error(n||"error: getOrDie called on none.")},getOrNull:function(){return null},getOrUndefined:function(){return undefined},or:t,orThunk:e,map:T,ap:T,each:function(){},bind:T,flatten:T,exists:v,forall:p,filter:T,equals:n=function(n){return n.isNone()},equals_:n,toArray:function(){return[]},toString:g("none()")},Object.freeze&&Object.freeze(o),o),y=function(t){var n=function(){return t},e=function(){return o},r=function(n){return n(t)},o={fold:function(n,e){return e(t)},is:function(n){return t===n},isSome:p,isNone:v,getOr:n,getOrThunk:n,getOrDie:n,getOrNull:n,getOrUndefined:n,or:e,orThunk:e,map:function(n){return y(n(t))},ap:function(n){return n.fold(T,function(n){return y(n(t))})},each:function(n){n(t)},bind:r,flatten:n,exists:r,forall:r,filter:function(n){return n(t)?o:O},equals:function(n){return n.is(t)},equals_:function(n,e){return n.fold(v,function(n){return e(t,n)})},toArray:function(){return[t]},toString:function(){return"some("+t+")"}};return o},D=function(n){return null===n||n===undefined?O:y(n)},_=(u="function",function(n){return function(n){if(null===n)return"null";var e=typeof n;return"object"===e&&(Array.prototype.isPrototypeOf(n)||n.constructor&&"Array"===n.constructor.name)?"array":"object"===e&&(String.prototype.isPrototypeOf(n)||n.constructor&&"String"===n.constructor.name)?"string":e}(n)===u}),C=(Array.prototype.slice,function(n,e){for(var t=0,r=n.length;t'+n+""},x=function(n,e){var t=[],r=function(n,e){for(var t=n.length,r=new Array(t),o=0;o 0 && lists[0].nodeName === listName); }); }; }; var updateSelection = function (editor) { return function (e) { var listStyleType = ListUtils.getSelectedStyleType(editor); e.control.items().each(function (ctrl) { ctrl.active(ctrl.settings.data === listStyleType); }); }; }; var addSplitButton = function (editor, id, tooltip, cmd, nodeName, styles) { editor.addButton(id, { active: false, type: 'splitbutton', tooltip: tooltip, menu: ListStyles.toMenuItems(styles), onPostRender: listState(editor, nodeName), onshow: updateSelection(editor), onselect: function (e) { Actions.applyListFormat(editor, nodeName, e.control.settings.data); }, onclick: function () { editor.execCommand(cmd); } }); }; var addButton = function (editor, id, tooltip, cmd, nodeName, styles) { editor.addButton(id, { active: false, type: 'button', tooltip: tooltip, onPostRender: listState(editor, nodeName), onclick: function () { editor.execCommand(cmd); } }); }; var addControl = function (editor, id, tooltip, cmd, nodeName, styles) { if (styles.length > 0) { addSplitButton(editor, id, tooltip, cmd, nodeName, styles); } else { addButton(editor, id, tooltip, cmd, nodeName); } }; var register$1 = function (editor) { addControl(editor, 'numlist', 'Numbered list', 'InsertOrderedList', 'OL', Settings.getNumberStyles(editor)); addControl(editor, 'bullist', 'Bullet list', 'InsertUnorderedList', 'UL', Settings.getBulletStyles(editor)); }; var Buttons = { register: register$1 }; global.add('advlist', function (editor) { var hasPlugin = function (editor, plugin) { var plugins = editor.settings.plugins ? editor.settings.plugins : ''; return global$1.inArray(plugins.split(/[ ,]/), plugin) !== -1; }; if (hasPlugin(editor, 'lists')) { Buttons.register(editor); Commands.register(editor); } }); function Plugin () { } return Plugin; }()); })(); PK:\ Amce/advlist/plugin.min.jsnuW+A!function(){"use strict";var t=tinymce.util.Tools.resolve("tinymce.PluginManager"),a=tinymce.util.Tools.resolve("tinymce.util.Tools"),s=function(t,e,n){var r="UL"===e?"InsertUnorderedList":"InsertOrderedList";t.execCommand(r,!1,!1===n?null:{"list-style-type":n})},o=function(n){n.addCommand("ApplyUnorderedListStyle",function(t,e){s(n,"UL",e["list-style-type"])}),n.addCommand("ApplyOrderedListStyle",function(t,e){s(n,"OL",e["list-style-type"])})},e=function(t){var e=t.getParam("advlist_number_styles","default,lower-alpha,lower-greek,lower-roman,upper-alpha,upper-roman");return e?e.split(/[ ,]/):[]},n=function(t){var e=t.getParam("advlist_bullet_styles","default,circle,disc,square");return e?e.split(/[ ,]/):[]},u=function(t){return t&&/^(TH|TD)$/.test(t.nodeName)},c=function(r){return function(t){return t&&/^(OL|UL|DL)$/.test(t.nodeName)&&(n=t,(e=r).$.contains(e.getBody(),n));var e,n}},d=function(t){var e=t.dom.getParent(t.selection.getNode(),"ol,ul");return t.dom.getStyle(e,"listStyleType")||""},p=function(t){return a.map(t,function(t){return{text:t.replace(/\-/g," ").replace(/\b\w/g,function(t){return t.toUpperCase()}),data:"default"===t?"":t}})},f=function(i,l){return function(t){var o=t.control;i.on("NodeChange",function(t){var e=function(t,e){for(var n=0;n=s[1]?(a=l,o=s[1]-c):r&&d.push(l),!r&&l.length+c>s[0]&&(r=l,i=s[0]-c),c+=l.length),r&&a){if(l=n({startNode:r,startNodeIndex:i,endNode:a,endNodeIndex:o,innerNodes:d,match:s[2],matchIndex:u}),c-=a.length-o,a=r=null,d=[],u++,!(s=t.shift()))break}else if(p[l.nodeName]&&!f[l.nodeName]||!l.firstChild){if(l.nextSibling){l=l.nextSibling;continue}}else if(!h(l)){l=l.firstChild;continue}for(;;){if(l.nextSibling){l=l.nextSibling;break}if(l.parentNode===e)break e;l=l.parentNode}}}(n,c,function(e){var h;if("function"!=typeof e){var r=e.nodeType?e:m.createElement(e);h=function(e,t){var n=r.cloneNode(!1);return n.setAttribute("data-mce-index",t),e&&n.appendChild(m.createTextNode(e)),n}}else h=e;return function(e){var t,n,r,a=e.startNode,i=e.endNode,o=e.matchIndex;if(a===i){var d=a;r=d.parentNode,0t.get()&&o[i].setAttribute("data-mce-index",l-1)}return t.set(u),r?(s=k(e,t),x(e,t)):(s=C(e,t),b(e,t)),!a&&s},hasNext:k,hasPrev:C},n=function(r,a){return{done:function(e){return T.done(r,a,e)},find:function(e,t,n){return T.find(r,a,e,t,n)},next:function(){return T.next(r,a)},prev:function(){return T.prev(r,a)},replace:function(e,t,n){return T.replace(r,a,e,t,n)}}},a=function(i,o){var e,d={};function c(){s.statusbar.find("#next").disabled(!1===T.hasNext(i,o)),s.statusbar.find("#prev").disabled(!1===T.hasPrev(i,o))}function l(){i.windowManager.alert("Could not find the specified string.",function(){s.find("#find")[0].focus()})}i.undoManager.add(),e=p.trim(i.selection.getContent({format:"text"}));var s=i.windowManager.open({layout:"flex",pack:"center",align:"center",onClose:function(){i.focus(),T.done(i,o),i.undoManager.add()},onSubmit:function(e){var t,n,r,a;return e.preventDefault(),n=s.find("#case").checked(),a=s.find("#words").checked(),(r=s.find("#find").value()).length?d.text===r&&d.caseState===n&&d.wholeWord===a?T.hasNext(i,o)?(T.next(i,o),void c()):void l():((t=T.find(i,o,r,n,a))||l(),s.statusbar.items().slice(1).disabled(0===t),c(),void(d={text:r,caseState:n,wholeWord:a})):(T.done(i,o,!1),void s.statusbar.items().slice(1).disabled(!0))},buttons:[{text:"Find",subtype:"primary",onclick:function(){s.submit()}},{text:"Replace",disabled:!0,onclick:function(){T.replace(i,o,s.find("#replace").value())||(s.statusbar.items().slice(1).disabled(!0),o.set(-1),d={})}},{text:"Replace all",disabled:!0,onclick:function(){T.replace(i,o,s.find("#replace").value(),!0,!0),s.statusbar.items().slice(1).disabled(!0),d={}}},{type:"spacer",flex:1},{text:"Prev",name:"prev",disabled:!0,onclick:function(){T.prev(i,o),c()}},{text:"Next",name:"next",disabled:!0,onclick:function(){T.next(i,o),c()}}],title:"Find and replace",items:{type:"form",padding:20,labelGap:30,spacing:10,items:[{type:"textbox",name:"find",size:40,label:"Find",value:e},{type:"textbox",name:"replace",size:40,label:"Replace with"},{type:"checkbox",name:"case",text:"Match case",label:" "},{type:"checkbox",name:"words",text:"Whole words",label:" "}]}})},i=function(e,t){e.addCommand("SearchReplace",function(){a(e,t)})},d=function(e,t){return function(){a(e,t)}},c=function(e,t){e.addMenuItem("searchreplace",{text:"Find and replace",shortcut:"Meta+F",onclick:d(e,t),separator:"before",context:"edit"}),e.addButton("searchreplace",{tooltip:"Find and replace",onclick:d(e,t)}),e.shortcuts.add("Meta+F","",d(e,t))};e.add("searchreplace",function(e){var t=r(-1);return i(e,t),c(e,t),n(e,t)})}();PK:\dk@P@Pmce/searchreplace/plugin.jsnuW+A(function () { var searchreplace = (function () { 'use strict'; var Cell = function (initial) { var value = initial; var get = function () { return value; }; var set = function (v) { value = v; }; var clone = function () { return Cell(get()); }; return { get: get, set: set, clone: clone }; }; var global = tinymce.util.Tools.resolve('tinymce.PluginManager'); var global$1 = tinymce.util.Tools.resolve('tinymce.util.Tools'); function isContentEditableFalse(node) { return node && node.nodeType === 1 && node.contentEditable === 'false'; } function findAndReplaceDOMText(regex, node, replacementNode, captureGroup, schema) { var m; var matches = []; var text, count = 0, doc; var blockElementsMap, hiddenTextElementsMap, shortEndedElementsMap; doc = node.ownerDocument; blockElementsMap = schema.getBlockElements(); hiddenTextElementsMap = schema.getWhiteSpaceElements(); shortEndedElementsMap = schema.getShortEndedElements(); function getMatchIndexes(m, captureGroup) { captureGroup = captureGroup || 0; if (!m[0]) { throw new Error('findAndReplaceDOMText cannot handle zero-length matches'); } var index = m.index; if (captureGroup > 0) { var cg = m[captureGroup]; if (!cg) { throw new Error('Invalid capture group'); } index += m[0].indexOf(cg); m[0] = cg; } return [ index, index + m[0].length, [m[0]] ]; } function getText(node) { var txt; if (node.nodeType === 3) { return node.data; } if (hiddenTextElementsMap[node.nodeName] && !blockElementsMap[node.nodeName]) { return ''; } txt = ''; if (isContentEditableFalse(node)) { return '\n'; } if (blockElementsMap[node.nodeName] || shortEndedElementsMap[node.nodeName]) { txt += '\n'; } if (node = node.firstChild) { do { txt += getText(node); } while (node = node.nextSibling); } return txt; } function stepThroughMatches(node, matches, replaceFn) { var startNode, endNode, startNodeIndex, endNodeIndex, innerNodes = [], atIndex = 0, curNode = node, matchLocation = matches.shift(), matchIndex = 0; out: while (true) { if (blockElementsMap[curNode.nodeName] || shortEndedElementsMap[curNode.nodeName] || isContentEditableFalse(curNode)) { atIndex++; } if (curNode.nodeType === 3) { if (!endNode && curNode.length + atIndex >= matchLocation[1]) { endNode = curNode; endNodeIndex = matchLocation[1] - atIndex; } else if (startNode) { innerNodes.push(curNode); } if (!startNode && curNode.length + atIndex > matchLocation[0]) { startNode = curNode; startNodeIndex = matchLocation[0] - atIndex; } atIndex += curNode.length; } if (startNode && endNode) { curNode = replaceFn({ startNode: startNode, startNodeIndex: startNodeIndex, endNode: endNode, endNodeIndex: endNodeIndex, innerNodes: innerNodes, match: matchLocation[2], matchIndex: matchIndex }); atIndex -= endNode.length - endNodeIndex; startNode = null; endNode = null; innerNodes = []; matchLocation = matches.shift(); matchIndex++; if (!matchLocation) { break; } } else if ((!hiddenTextElementsMap[curNode.nodeName] || blockElementsMap[curNode.nodeName]) && curNode.firstChild) { if (!isContentEditableFalse(curNode)) { curNode = curNode.firstChild; continue; } } else if (curNode.nextSibling) { curNode = curNode.nextSibling; continue; } while (true) { if (curNode.nextSibling) { curNode = curNode.nextSibling; break; } else if (curNode.parentNode !== node) { curNode = curNode.parentNode; } else { break out; } } } } function genReplacer(nodeName) { var makeReplacementNode; if (typeof nodeName !== 'function') { var stencilNode_1 = nodeName.nodeType ? nodeName : doc.createElement(nodeName); makeReplacementNode = function (fill, matchIndex) { var clone = stencilNode_1.cloneNode(false); clone.setAttribute('data-mce-index', matchIndex); if (fill) { clone.appendChild(doc.createTextNode(fill)); } return clone; }; } else { makeReplacementNode = nodeName; } return function (range) { var before; var after; var parentNode; var startNode = range.startNode; var endNode = range.endNode; var matchIndex = range.matchIndex; if (startNode === endNode) { var node_1 = startNode; parentNode = node_1.parentNode; if (range.startNodeIndex > 0) { before = doc.createTextNode(node_1.data.substring(0, range.startNodeIndex)); parentNode.insertBefore(before, node_1); } var el = makeReplacementNode(range.match[0], matchIndex); parentNode.insertBefore(el, node_1); if (range.endNodeIndex < node_1.length) { after = doc.createTextNode(node_1.data.substring(range.endNodeIndex)); parentNode.insertBefore(after, node_1); } node_1.parentNode.removeChild(node_1); return el; } before = doc.createTextNode(startNode.data.substring(0, range.startNodeIndex)); after = doc.createTextNode(endNode.data.substring(range.endNodeIndex)); var elA = makeReplacementNode(startNode.data.substring(range.startNodeIndex), matchIndex); for (var i = 0, l = range.innerNodes.length; i < l; ++i) { var innerNode = range.innerNodes[i]; var innerEl = makeReplacementNode(innerNode.data, matchIndex); innerNode.parentNode.replaceChild(innerEl, innerNode); } var elB = makeReplacementNode(endNode.data.substring(0, range.endNodeIndex), matchIndex); parentNode = startNode.parentNode; parentNode.insertBefore(before, startNode); parentNode.insertBefore(elA, startNode); parentNode.removeChild(startNode); parentNode = endNode.parentNode; parentNode.insertBefore(elB, endNode); parentNode.insertBefore(after, endNode); parentNode.removeChild(endNode); return elB; }; } text = getText(node); if (!text) { return; } if (regex.global) { while (m = regex.exec(text)) { matches.push(getMatchIndexes(m, captureGroup)); } } else { m = text.match(regex); matches.push(getMatchIndexes(m, captureGroup)); } if (matches.length) { count = matches.length; stepThroughMatches(node, matches, genReplacer(replacementNode)); } return count; } var FindReplaceText = { findAndReplaceDOMText: findAndReplaceDOMText }; var getElmIndex = function (elm) { var value = elm.getAttribute('data-mce-index'); if (typeof value === 'number') { return '' + value; } return value; }; var markAllMatches = function (editor, currentIndexState, regex) { var node, marker; marker = editor.dom.create('span', { 'data-mce-bogus': 1 }); marker.className = 'mce-match-marker'; node = editor.getBody(); done(editor, currentIndexState, false); return FindReplaceText.findAndReplaceDOMText(regex, node, marker, false, editor.schema); }; var unwrap = function (node) { var parentNode = node.parentNode; if (node.firstChild) { parentNode.insertBefore(node.firstChild, node); } node.parentNode.removeChild(node); }; var findSpansByIndex = function (editor, index) { var nodes; var spans = []; nodes = global$1.toArray(editor.getBody().getElementsByTagName('span')); if (nodes.length) { for (var i = 0; i < nodes.length; i++) { var nodeIndex = getElmIndex(nodes[i]); if (nodeIndex === null || !nodeIndex.length) { continue; } if (nodeIndex === index.toString()) { spans.push(nodes[i]); } } } return spans; }; var moveSelection = function (editor, currentIndexState, forward) { var testIndex = currentIndexState.get(); var dom = editor.dom; forward = forward !== false; if (forward) { testIndex++; } else { testIndex--; } dom.removeClass(findSpansByIndex(editor, currentIndexState.get()), 'mce-match-marker-selected'); var spans = findSpansByIndex(editor, testIndex); if (spans.length) { dom.addClass(findSpansByIndex(editor, testIndex), 'mce-match-marker-selected'); editor.selection.scrollIntoView(spans[0]); return testIndex; } return -1; }; var removeNode = function (dom, node) { var parent = node.parentNode; dom.remove(node); if (dom.isEmpty(parent)) { dom.remove(parent); } }; var find = function (editor, currentIndexState, text, matchCase, wholeWord) { text = text.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, '\\$&'); text = text.replace(/\s/g, '[^\\S\\r\\n]'); text = wholeWord ? '\\b' + text + '\\b' : text; var count = markAllMatches(editor, currentIndexState, new RegExp(text, matchCase ? 'g' : 'gi')); if (count) { currentIndexState.set(-1); currentIndexState.set(moveSelection(editor, currentIndexState, true)); } return count; }; var next = function (editor, currentIndexState) { var index = moveSelection(editor, currentIndexState, true); if (index !== -1) { currentIndexState.set(index); } }; var prev = function (editor, currentIndexState) { var index = moveSelection(editor, currentIndexState, false); if (index !== -1) { currentIndexState.set(index); } }; var isMatchSpan = function (node) { var matchIndex = getElmIndex(node); return matchIndex !== null && matchIndex.length > 0; }; var replace = function (editor, currentIndexState, text, forward, all) { var i, nodes, node, matchIndex, currentMatchIndex, nextIndex = currentIndexState.get(), hasMore; forward = forward !== false; node = editor.getBody(); nodes = global$1.grep(global$1.toArray(node.getElementsByTagName('span')), isMatchSpan); for (i = 0; i < nodes.length; i++) { var nodeIndex = getElmIndex(nodes[i]); matchIndex = currentMatchIndex = parseInt(nodeIndex, 10); if (all || matchIndex === currentIndexState.get()) { if (text.length) { nodes[i].firstChild.nodeValue = text; unwrap(nodes[i]); } else { removeNode(editor.dom, nodes[i]); } while (nodes[++i]) { matchIndex = parseInt(getElmIndex(nodes[i]), 10); if (matchIndex === currentMatchIndex) { removeNode(editor.dom, nodes[i]); } else { i--; break; } } if (forward) { nextIndex--; } } else if (currentMatchIndex > currentIndexState.get()) { nodes[i].setAttribute('data-mce-index', currentMatchIndex - 1); } } currentIndexState.set(nextIndex); if (forward) { hasMore = hasNext(editor, currentIndexState); next(editor, currentIndexState); } else { hasMore = hasPrev(editor, currentIndexState); prev(editor, currentIndexState); } return !all && hasMore; }; var done = function (editor, currentIndexState, keepEditorSelection) { var i, nodes, startContainer, endContainer; nodes = global$1.toArray(editor.getBody().getElementsByTagName('span')); for (i = 0; i < nodes.length; i++) { var nodeIndex = getElmIndex(nodes[i]); if (nodeIndex !== null && nodeIndex.length) { if (nodeIndex === currentIndexState.get().toString()) { if (!startContainer) { startContainer = nodes[i].firstChild; } endContainer = nodes[i].firstChild; } unwrap(nodes[i]); } } if (startContainer && endContainer) { var rng = editor.dom.createRng(); rng.setStart(startContainer, 0); rng.setEnd(endContainer, endContainer.data.length); if (keepEditorSelection !== false) { editor.selection.setRng(rng); } return rng; } }; var hasNext = function (editor, currentIndexState) { return findSpansByIndex(editor, currentIndexState.get() + 1).length > 0; }; var hasPrev = function (editor, currentIndexState) { return findSpansByIndex(editor, currentIndexState.get() - 1).length > 0; }; var Actions = { done: done, find: find, next: next, prev: prev, replace: replace, hasNext: hasNext, hasPrev: hasPrev }; var get = function (editor, currentIndexState) { var done = function (keepEditorSelection) { return Actions.done(editor, currentIndexState, keepEditorSelection); }; var find = function (text, matchCase, wholeWord) { return Actions.find(editor, currentIndexState, text, matchCase, wholeWord); }; var next = function () { return Actions.next(editor, currentIndexState); }; var prev = function () { return Actions.prev(editor, currentIndexState); }; var replace = function (text, forward, all) { return Actions.replace(editor, currentIndexState, text, forward, all); }; return { done: done, find: find, next: next, prev: prev, replace: replace }; }; var Api = { get: get }; var open = function (editor, currentIndexState) { var last = {}, selectedText; editor.undoManager.add(); selectedText = global$1.trim(editor.selection.getContent({ format: 'text' })); function updateButtonStates() { win.statusbar.find('#next').disabled(Actions.hasNext(editor, currentIndexState) === false); win.statusbar.find('#prev').disabled(Actions.hasPrev(editor, currentIndexState) === false); } function notFoundAlert() { editor.windowManager.alert('Could not find the specified string.', function () { win.find('#find')[0].focus(); }); } var win = editor.windowManager.open({ layout: 'flex', pack: 'center', align: 'center', onClose: function () { editor.focus(); Actions.done(editor, currentIndexState); editor.undoManager.add(); }, onSubmit: function (e) { var count, caseState, text, wholeWord; e.preventDefault(); caseState = win.find('#case').checked(); wholeWord = win.find('#words').checked(); text = win.find('#find').value(); if (!text.length) { Actions.done(editor, currentIndexState, false); win.statusbar.items().slice(1).disabled(true); return; } if (last.text === text && last.caseState === caseState && last.wholeWord === wholeWord) { if (!Actions.hasNext(editor, currentIndexState)) { notFoundAlert(); return; } Actions.next(editor, currentIndexState); updateButtonStates(); return; } count = Actions.find(editor, currentIndexState, text, caseState, wholeWord); if (!count) { notFoundAlert(); } win.statusbar.items().slice(1).disabled(count === 0); updateButtonStates(); last = { text: text, caseState: caseState, wholeWord: wholeWord }; }, buttons: [ { text: 'Find', subtype: 'primary', onclick: function () { win.submit(); } }, { text: 'Replace', disabled: true, onclick: function () { if (!Actions.replace(editor, currentIndexState, win.find('#replace').value())) { win.statusbar.items().slice(1).disabled(true); currentIndexState.set(-1); last = {}; } } }, { text: 'Replace all', disabled: true, onclick: function () { Actions.replace(editor, currentIndexState, win.find('#replace').value(), true, true); win.statusbar.items().slice(1).disabled(true); last = {}; } }, { type: 'spacer', flex: 1 }, { text: 'Prev', name: 'prev', disabled: true, onclick: function () { Actions.prev(editor, currentIndexState); updateButtonStates(); } }, { text: 'Next', name: 'next', disabled: true, onclick: function () { Actions.next(editor, currentIndexState); updateButtonStates(); } } ], title: 'Find and replace', items: { type: 'form', padding: 20, labelGap: 30, spacing: 10, items: [ { type: 'textbox', name: 'find', size: 40, label: 'Find', value: selectedText }, { type: 'textbox', name: 'replace', size: 40, label: 'Replace with' }, { type: 'checkbox', name: 'case', text: 'Match case', label: ' ' }, { type: 'checkbox', name: 'words', text: 'Whole words', label: ' ' } ] } }); }; var Dialog = { open: open }; var register = function (editor, currentIndexState) { editor.addCommand('SearchReplace', function () { Dialog.open(editor, currentIndexState); }); }; var Commands = { register: register }; var showDialog = function (editor, currentIndexState) { return function () { Dialog.open(editor, currentIndexState); }; }; var register$1 = function (editor, currentIndexState) { editor.addMenuItem('searchreplace', { text: 'Find and replace', shortcut: 'Meta+F', onclick: showDialog(editor, currentIndexState), separator: 'before', context: 'edit' }); editor.addButton('searchreplace', { tooltip: 'Find and replace', onclick: showDialog(editor, currentIndexState) }); editor.shortcuts.add('Meta+F', '', showDialog(editor, currentIndexState)); }; var Buttons = { register: register$1 }; global.add('searchreplace', function (editor) { var currentIndexState = Cell(-1); Commands.register(editor, currentIndexState); Buttons.register(editor, currentIndexState); return Api.get(editor, currentIndexState); }); function Plugin () { } return Plugin; }()); })(); PK:\Pj j mce/anchor/plugin.jsnuW+A(function () { var anchor = (function () { 'use strict'; var global = tinymce.util.Tools.resolve('tinymce.PluginManager'); var isValidId = function (id) { return /^[A-Za-z][A-Za-z0-9\-:._]*$/.test(id); }; var getId = function (editor) { var selectedNode = editor.selection.getNode(); var isAnchor = selectedNode.tagName === 'A' && editor.dom.getAttrib(selectedNode, 'href') === ''; return isAnchor ? selectedNode.id || selectedNode.name : ''; }; var insert = function (editor, id) { var selectedNode = editor.selection.getNode(); var isAnchor = selectedNode.tagName === 'A' && editor.dom.getAttrib(selectedNode, 'href') === ''; if (isAnchor) { selectedNode.removeAttribute('name'); selectedNode.id = id; editor.undoManager.add(); } else { editor.focus(); editor.selection.collapse(true); editor.execCommand('mceInsertContent', false, editor.dom.createHTML('a', { id: id })); } }; var Anchor = { isValidId: isValidId, getId: getId, insert: insert }; var insertAnchor = function (editor, newId) { if (!Anchor.isValidId(newId)) { editor.windowManager.alert('Id should start with a letter, followed only by letters, numbers, dashes, dots, colons or underscores.'); return true; } else { Anchor.insert(editor, newId); return false; } }; var open = function (editor) { var currentId = Anchor.getId(editor); editor.windowManager.open({ title: 'Anchor', body: { type: 'textbox', name: 'id', size: 40, label: 'Id', value: currentId }, onsubmit: function (e) { var newId = e.data.id; if (insertAnchor(editor, newId)) { e.preventDefault(); } } }); }; var Dialog = { open: open }; var register = function (editor) { editor.addCommand('mceAnchor', function () { Dialog.open(editor); }); }; var Commands = { register: register }; var isAnchorNode = function (node) { return !node.attr('href') && (node.attr('id') || node.attr('name')) && !node.firstChild; }; var setContentEditable = function (state) { return function (nodes) { for (var i = 0; i < nodes.length; i++) { if (isAnchorNode(nodes[i])) { nodes[i].attr('contenteditable', state); } } }; }; var setup = function (editor) { editor.on('PreInit', function () { editor.parser.addNodeFilter('a', setContentEditable('false')); editor.serializer.addNodeFilter('a', setContentEditable(null)); }); }; var FilterContent = { setup: setup }; var register$1 = function (editor) { editor.addButton('anchor', { icon: 'anchor', tooltip: 'Anchor', cmd: 'mceAnchor', stateSelector: 'a:not([href])' }); editor.addMenuItem('anchor', { icon: 'anchor', text: 'Anchor', context: 'insert', cmd: 'mceAnchor' }); }; var Buttons = { register: register$1 }; global.add('anchor', function (editor) { FilterContent.setup(editor); Commands.register(editor); Buttons.register(editor); }); function Plugin () { } return Plugin; }()); })(); PK:\zԦmce/anchor/plugin.min.jsnuW+A!function(){"use strict";var t=tinymce.util.Tools.resolve("tinymce.PluginManager"),a=function(t){return/^[A-Za-z][A-Za-z0-9\-:._]*$/.test(t)},e=function(t){var e=t.selection.getNode();return"A"===e.tagName&&""===t.dom.getAttrib(e,"href")?e.id||e.name:""},i=function(t,e){var n=t.selection.getNode();"A"===n.tagName&&""===t.dom.getAttrib(n,"href")?(n.removeAttribute("name"),n.id=e,t.undoManager.add()):(t.focus(),t.selection.collapse(!0),t.execCommand("mceInsertContent",!1,t.dom.createHTML("a",{id:e})))},n=function(r){var t=e(r);r.windowManager.open({title:"Anchor",body:{type:"textbox",name:"id",size:40,label:"Id",value:t},onsubmit:function(t){var e,n,o=t.data.id;e=r,(a(n=o)?(i(e,n),0):(e.windowManager.alert("Id should start with a letter, followed only by letters, numbers, dashes, dots, colons or underscores."),1))&&t.preventDefault()}})},o=function(t){t.addCommand("mceAnchor",function(){n(t)})},r=function(o){return function(t){for(var e=0;e'+c+''}),a+=""}),a+=""}var d=[{smile:":-)",razz:":-P",cool:"8-)",wink:";-)",biggrin:":-D"},{twisted:":twisted:",mrgreen:":mrgreen:",lol:":lol:",rolleyes:":roll:",confused:":-?"},{cry:":cry:",surprised:":-o",evil:":evil:",neutral:":-|",redface:":oops:"},{mad:":-x",eek:"8-O",sad:":-(",arrow:":arrow:",idea:":idea:"}];a.addButton("emoticons",{type:"panelbutton",panel:{role:"application",autohide:!0,html:c,onclick:function(b){var c=a.dom.getParent(b.target,"a");c&&(a.insertContent(" "+c.getAttribute("data-mce-alt")+" "),this.hide())}},tooltip:"Emoticons"})});PK:\?mce/emoticons/img/icon_mad.gifnuW+AGIF89a EEE! ,[IjեpLA'a'j *`pP9ĞAf-+`W A& ;`mXk\ 0ò&;PK:\)"mce/emoticons/img/icon_biggrin.gifnuW+AGIF89a EEE! ,YI jե"pIL@gpj)wjʛ pJQl:`J PJ4ZNB oYbe6;PK:\?Omce/emoticons/img/icon_cool.gifnuW+AGIF89a EEE! ,YIjUpCLAgpj k+;vECp4xevE+mAPiN X:o(`e6;PK:\yamce/emoticons/img/icon_idea.gifnuW+AGIF89a EEE! ,]I jUR"pL@g 0R;~C%q2d|>ORԌݶ(¢VhB 3 ̰,p;PK:\,ފ1#mce/emoticons/img/icon_confused.gifnuW+AGIF89a EEE! ,XIjՕpCLA''vqj ?*pƂ!\ 'pd/N3(^0-U&kQ@7 3,Km;PK:\vNFmce/emoticons/img/icon_wink.gifnuW+AGIF89a EEE! ,WIjՕpCLA'00%&p/*p`C%+fP4OpUł:`kLhբanfX$;PK:\V mce/emoticons/img/icon_arrow.gifnuW+AGIF89a EEE! ,WIjՕpELAgpj BUvsC; `"fs2([Lhբa~fX$;PK:\{+PPmce/emoticons/img/icon_lol.gifnuW+AGIF89a EEE! NETSCAPE2.0! ,ZI jեR",AyhTr 1r)\aɎC%<DiJ-A v; Y-4jQ҅xn x1cd"! , I$[8ͫa4 D! ,PH9j! ,0H)j! ,PH9j! ,0H)j;PK:\Iի"mce/emoticons/img/icon_neutral.gifnuW+AGIF89a EEE! ,XIjՕpCLA' vpj A88r9ʊ)\ԓbd`a -e&kQ@73,Km;PK:\"mce/emoticons/img/icon_twisted.gifnuW+AGIF89aEEE*333m!,k DhɘВ$*>DE5@NG @ ꚱ- h> h)8T]°ij,c pّJ<G(F1|FZ(%Z#&(!;PK:\l$]]"mce/emoticons/img/icon_mrgreen.gifnuW+AGIF89aܱگخ֬ҩΦʢȡƟĞ}|yroli~e|dx`!',zP(Sqi( G$@s40t6EcQlx }8 %`$P!F E" E#E%t$\J&EFD%#"! QIJIA;PK:\mce/emoticons/img/icon_evil.gifnuW+AGIF89aEEE*m!,i @h$*2FC5@NG @ ꚱ- h>h)@T]ᰥ"ij,cIwdGk+:G(F()Z#&(!;PK:\ w"mce/emoticons/img/icon_redface.gifnuW+AGIF89al[hhu҇isJEEE˃__H6{! NETSCAPE2.0!,f'MYWND'ڰьM@NnA`8]#c<P*ȈW[d|.8w @ mxD qj:<2ylR)<&D#!! , Q'~D8]0kHN.O\[͐ x H  ̓TAfPIxEhJTE!!2, H'NAJc3]j+WOT-$ERBgJ-ˑ%-3|nQu- ! , P'Ac:uX~n"A6;Fhl4C1`xf"05u0e|< PTADhJE!;PK:\a$mce/emoticons/img/icon_surprised.gifnuW+AGIF89a EEE! ,[IjU"pILA''𦫆qj *pƂ ":=+`,@VvaA6XT0ò&;PK:\mce/emoticons/img/icon_eek.gifnuW+AGIF89a EEE! ,WI9jŔ"I"c0@6r +ﱫۮ00P6 F IEy,(i%`'pa6g1܀}g4$;PK:\Y mce/emoticons/img/icon_sad.gifnuW+AGIF89a EEE! ,XIjՕpCLA'1%&p'*pnCk3 'pe= ߧN3 U&ݳL@7 3, m;PK:\j mce/emoticons/img/icon_smile.gifnuW+AGIF89aEEE333!,[IjUpLA''vqj ?*pƂ!Ӣ X<+kYAb<v5Xj\ 0ò&;PK:\y$}#mce/emoticons/img/icon_rolleyes.gifnuW+AGIF89a EEE! NETSCAPE2.0! ,^I jUpL@'g𦫆E:%\PtdPA^;( 0=c2yO J>`c`@ia(fX5! , YVؠg! , F嬳Ԧ.!2 , P$-'! ,  "! , Fe+0ZE! , I!2T]U*B)@LMZXYr! , I%[8WA'&1^! , I!8K[BhPH(F;PK:\4٣mce/emoticons/img/icon_razz.gifnuW+AGIF89aEEE333!,]IjեRpLA''𦫖qj *pƂJ" `<+kYa<v *~20̰,5;PK:\Zhmce/emoticons/img/icon_cry.gifnuW+AGIF89aEEE؁^^^! NETSCAPE2.0!,\ $AY(T.q 'CA+@An:AJaC" &8tp: 7tgUYj0x !N2Q)<&D#!!, $@HdҜM0lB! ,`@! , @&!! , @HdBI! , `dhB!! ,`@! , @&!! , @Hh "&i;PK:\fmce/emoticons/plugin.jsnuW+A/** * plugin.js (edited for WP) * * Copyright, Moxiecode Systems AB * Released under LGPL License. * * License: http://www.tinymce.com/license * Contributing: http://www.tinymce.com/contributing */ /*global tinymce:true */ tinymce.PluginManager.add('emoticons', function(editor, url) { var emoticons = [{ smile: ':-)', razz: ':-P', cool: '8-)', wink: ';-)', biggrin: ':-D' }, { twisted: ':twisted:', mrgreen: ':mrgreen:', lol: ':lol:', rolleyes: ':roll:', confused: ':-?' }, { cry: ':cry:', surprised: ':-o', evil: ':evil:', neutral: ':-|', redface: ':oops:' }, { mad: ':-x', eek: '8-O', sad: ':-(', arrow: ':arrow:', idea: ':idea:' }]; function getHtml() { var emoticonsHtml; emoticonsHtml = ''; tinymce.each(emoticons, function( row ) { emoticonsHtml += ''; tinymce.each( row, function( icon, name ) { var emoticonUrl = url + '/img/icon_' + name + '.gif'; emoticonsHtml += ''; }); emoticonsHtml += ''; }); emoticonsHtml += '
    ' + icon + '
    '; return emoticonsHtml; } editor.addButton('emoticons', { type: 'panelbutton', panel: { role: 'application', autohide: true, html: getHtml, onclick: function(e) { var linkElm = editor.dom.getParent( e.target, 'a' ); if ( linkElm ) { editor.insertContent( ' ' + linkElm.getAttribute('data-mce-alt') + ' ' ); this.hide(); } } }, tooltip: 'Emoticons' }); }); PK:\O]]mce/link/plugin.jsnuW+A(function () { var link = (function (domGlobals) { 'use strict'; var global = tinymce.util.Tools.resolve('tinymce.PluginManager'); var global$1 = tinymce.util.Tools.resolve('tinymce.util.VK'); var assumeExternalTargets = function (editorSettings) { return typeof editorSettings.link_assume_external_targets === 'boolean' ? editorSettings.link_assume_external_targets : false; }; var hasContextToolbar = function (editorSettings) { return typeof editorSettings.link_context_toolbar === 'boolean' ? editorSettings.link_context_toolbar : false; }; var getLinkList = function (editorSettings) { return editorSettings.link_list; }; var hasDefaultLinkTarget = function (editorSettings) { return typeof editorSettings.default_link_target === 'string'; }; var getDefaultLinkTarget = function (editorSettings) { return editorSettings.default_link_target; }; var getTargetList = function (editorSettings) { return editorSettings.target_list; }; var setTargetList = function (editor, list) { editor.settings.target_list = list; }; var shouldShowTargetList = function (editorSettings) { return getTargetList(editorSettings) !== false; }; var getRelList = function (editorSettings) { return editorSettings.rel_list; }; var hasRelList = function (editorSettings) { return getRelList(editorSettings) !== undefined; }; var getLinkClassList = function (editorSettings) { return editorSettings.link_class_list; }; var hasLinkClassList = function (editorSettings) { return getLinkClassList(editorSettings) !== undefined; }; var shouldShowLinkTitle = function (editorSettings) { return editorSettings.link_title !== false; }; var allowUnsafeLinkTarget = function (editorSettings) { return typeof editorSettings.allow_unsafe_link_target === 'boolean' ? editorSettings.allow_unsafe_link_target : false; }; var Settings = { assumeExternalTargets: assumeExternalTargets, hasContextToolbar: hasContextToolbar, getLinkList: getLinkList, hasDefaultLinkTarget: hasDefaultLinkTarget, getDefaultLinkTarget: getDefaultLinkTarget, getTargetList: getTargetList, setTargetList: setTargetList, shouldShowTargetList: shouldShowTargetList, getRelList: getRelList, hasRelList: hasRelList, getLinkClassList: getLinkClassList, hasLinkClassList: hasLinkClassList, shouldShowLinkTitle: shouldShowLinkTitle, allowUnsafeLinkTarget: allowUnsafeLinkTarget }; var global$2 = tinymce.util.Tools.resolve('tinymce.dom.DOMUtils'); var global$3 = tinymce.util.Tools.resolve('tinymce.Env'); var appendClickRemove = function (link, evt) { domGlobals.document.body.appendChild(link); link.dispatchEvent(evt); domGlobals.document.body.removeChild(link); }; var open = function (url) { if (!global$3.ie || global$3.ie > 10) { var link = domGlobals.document.createElement('a'); link.target = '_blank'; link.href = url; link.rel = 'noreferrer noopener'; var evt = domGlobals.document.createEvent('MouseEvents'); evt.initMouseEvent('click', true, true, domGlobals.window, 0, 0, 0, 0, 0, false, false, false, false, 0, null); appendClickRemove(link, evt); } else { var win = domGlobals.window.open('', '_blank'); if (win) { win.opener = null; var doc = win.document; doc.open(); doc.write(''); doc.close(); } } }; var OpenUrl = { open: open }; var global$4 = tinymce.util.Tools.resolve('tinymce.util.Tools'); var toggleTargetRules = function (rel, isUnsafe) { var rules = ['noopener']; var newRel = rel ? rel.split(/\s+/) : []; var toString = function (rel) { return global$4.trim(rel.sort().join(' ')); }; var addTargetRules = function (rel) { rel = removeTargetRules(rel); return rel.length ? rel.concat(rules) : rules; }; var removeTargetRules = function (rel) { return rel.filter(function (val) { return global$4.inArray(rules, val) === -1; }); }; newRel = isUnsafe ? addTargetRules(newRel) : removeTargetRules(newRel); return newRel.length ? toString(newRel) : null; }; var trimCaretContainers = function (text) { return text.replace(/\uFEFF/g, ''); }; var getAnchorElement = function (editor, selectedElm) { selectedElm = selectedElm || editor.selection.getNode(); if (isImageFigure(selectedElm)) { return editor.dom.select('a[href]', selectedElm)[0]; } else { return editor.dom.getParent(selectedElm, 'a[href]'); } }; var getAnchorText = function (selection, anchorElm) { var text = anchorElm ? anchorElm.innerText || anchorElm.textContent : selection.getContent({ format: 'text' }); return trimCaretContainers(text); }; var isLink = function (elm) { return elm && elm.nodeName === 'A' && elm.href; }; var hasLinks = function (elements) { return global$4.grep(elements, isLink).length > 0; }; var isOnlyTextSelected = function (html) { if (/]+>[^<]+<\/a>$/.test(html) || html.indexOf('href=') === -1)) { return false; } return true; }; var isImageFigure = function (node) { return node && node.nodeName === 'FIGURE' && /\bimage\b/i.test(node.className); }; var link = function (editor, attachState) { return function (data) { editor.undoManager.transact(function () { var selectedElm = editor.selection.getNode(); var anchorElm = getAnchorElement(editor, selectedElm); var linkAttrs = { href: data.href, target: data.target ? data.target : null, rel: data.rel ? data.rel : null, class: data.class ? data.class : null, title: data.title ? data.title : null }; if (!Settings.hasRelList(editor.settings) && Settings.allowUnsafeLinkTarget(editor.settings) === false) { linkAttrs.rel = toggleTargetRules(linkAttrs.rel, linkAttrs.target === '_blank'); } if (data.href === attachState.href) { attachState.attach(); attachState = {}; } if (anchorElm) { editor.focus(); if (data.hasOwnProperty('text')) { if ('innerText' in anchorElm) { anchorElm.innerText = data.text; } else { anchorElm.textContent = data.text; } } editor.dom.setAttribs(anchorElm, linkAttrs); editor.selection.select(anchorElm); editor.undoManager.add(); } else { if (isImageFigure(selectedElm)) { linkImageFigure(editor, selectedElm, linkAttrs); } else if (data.hasOwnProperty('text')) { editor.insertContent(editor.dom.createHTML('a', linkAttrs, editor.dom.encode(data.text))); } else { editor.execCommand('mceInsertLink', false, linkAttrs); } } }); }; }; var unlink = function (editor) { return function () { editor.undoManager.transact(function () { var node = editor.selection.getNode(); if (isImageFigure(node)) { unlinkImageFigure(editor, node); } else { editor.execCommand('unlink'); } }); }; }; var unlinkImageFigure = function (editor, fig) { var a, img; img = editor.dom.select('img', fig)[0]; if (img) { a = editor.dom.getParents(img, 'a[href]', fig)[0]; if (a) { a.parentNode.insertBefore(img, a); editor.dom.remove(a); } } }; var linkImageFigure = function (editor, fig, attrs) { var a, img; img = editor.dom.select('img', fig)[0]; if (img) { a = editor.dom.create('a', attrs); img.parentNode.insertBefore(a, img); a.appendChild(img); } }; var Utils = { link: link, unlink: unlink, isLink: isLink, hasLinks: hasLinks, isOnlyTextSelected: isOnlyTextSelected, getAnchorElement: getAnchorElement, getAnchorText: getAnchorText, toggleTargetRules: toggleTargetRules }; var global$5 = tinymce.util.Tools.resolve('tinymce.util.Delay'); var global$6 = tinymce.util.Tools.resolve('tinymce.util.XHR'); var attachState = {}; var createLinkList = function (editor, callback) { var linkList = Settings.getLinkList(editor.settings); if (typeof linkList === 'string') { global$6.send({ url: linkList, success: function (text) { callback(editor, JSON.parse(text)); } }); } else if (typeof linkList === 'function') { linkList(function (list) { callback(editor, list); }); } else { callback(editor, linkList); } }; var buildListItems = function (inputList, itemCallback, startItems) { var appendItems = function (values, output) { output = output || []; global$4.each(values, function (item) { var menuItem = { text: item.text || item.title }; if (item.menu) { menuItem.menu = appendItems(item.menu); } else { menuItem.value = item.value; if (itemCallback) { itemCallback(menuItem); } } output.push(menuItem); }); return output; }; return appendItems(inputList, startItems || []); }; var delayedConfirm = function (editor, message, callback) { var rng = editor.selection.getRng(); global$5.setEditorTimeout(editor, function () { editor.windowManager.confirm(message, function (state) { editor.selection.setRng(rng); callback(state); }); }); }; var showDialog = function (editor, linkList) { var data = {}; var selection = editor.selection; var dom = editor.dom; var anchorElm, initialText; var win, onlyText, textListCtrl, linkListCtrl, relListCtrl, targetListCtrl, classListCtrl, linkTitleCtrl, value; var linkListChangeHandler = function (e) { var textCtrl = win.find('#text'); if (!textCtrl.value() || e.lastControl && textCtrl.value() === e.lastControl.text()) { textCtrl.value(e.control.text()); } win.find('#href').value(e.control.value()); }; var buildAnchorListControl = function (url) { var anchorList = []; global$4.each(editor.dom.select('a:not([href])'), function (anchor) { var id = anchor.name || anchor.id; if (id) { anchorList.push({ text: id, value: '#' + id, selected: url.indexOf('#' + id) !== -1 }); } }); if (anchorList.length) { anchorList.unshift({ text: 'None', value: '' }); return { name: 'anchor', type: 'listbox', label: 'Anchors', values: anchorList, onselect: linkListChangeHandler }; } }; var updateText = function () { if (!initialText && onlyText && !data.text) { this.parent().parent().find('#text')[0].value(this.value()); } }; var urlChange = function (e) { var meta = e.meta || {}; if (linkListCtrl) { linkListCtrl.value(editor.convertURL(this.value(), 'href')); } global$4.each(e.meta, function (value, key) { var inp = win.find('#' + key); if (key === 'text') { if (initialText.length === 0) { inp.value(value); data.text = value; } } else { inp.value(value); } }); if (meta.attach) { attachState = { href: this.value(), attach: meta.attach }; } if (!meta.text) { updateText.call(this); } }; var onBeforeCall = function (e) { e.meta = win.toJSON(); }; onlyText = Utils.isOnlyTextSelected(selection.getContent()); anchorElm = Utils.getAnchorElement(editor); data.text = initialText = Utils.getAnchorText(editor.selection, anchorElm); data.href = anchorElm ? dom.getAttrib(anchorElm, 'href') : ''; if (anchorElm) { data.target = dom.getAttrib(anchorElm, 'target'); } else if (Settings.hasDefaultLinkTarget(editor.settings)) { data.target = Settings.getDefaultLinkTarget(editor.settings); } if (value = dom.getAttrib(anchorElm, 'rel')) { data.rel = value; } if (value = dom.getAttrib(anchorElm, 'class')) { data.class = value; } if (value = dom.getAttrib(anchorElm, 'title')) { data.title = value; } if (onlyText) { textListCtrl = { name: 'text', type: 'textbox', size: 40, label: 'Text to display', onchange: function () { data.text = this.value(); } }; } if (linkList) { linkListCtrl = { type: 'listbox', label: 'Link list', values: buildListItems(linkList, function (item) { item.value = editor.convertURL(item.value || item.url, 'href'); }, [{ text: 'None', value: '' }]), onselect: linkListChangeHandler, value: editor.convertURL(data.href, 'href'), onPostRender: function () { linkListCtrl = this; } }; } if (Settings.shouldShowTargetList(editor.settings)) { if (Settings.getTargetList(editor.settings) === undefined) { Settings.setTargetList(editor, [ { text: 'None', value: '' }, { text: 'New window', value: '_blank' } ]); } targetListCtrl = { name: 'target', type: 'listbox', label: 'Target', values: buildListItems(Settings.getTargetList(editor.settings)) }; } if (Settings.hasRelList(editor.settings)) { relListCtrl = { name: 'rel', type: 'listbox', label: 'Rel', values: buildListItems(Settings.getRelList(editor.settings), function (item) { if (Settings.allowUnsafeLinkTarget(editor.settings) === false) { item.value = Utils.toggleTargetRules(item.value, data.target === '_blank'); } }) }; } if (Settings.hasLinkClassList(editor.settings)) { classListCtrl = { name: 'class', type: 'listbox', label: 'Class', values: buildListItems(Settings.getLinkClassList(editor.settings), function (item) { if (item.value) { item.textStyle = function () { return editor.formatter.getCssText({ inline: 'a', classes: [item.value] }); }; } }) }; } if (Settings.shouldShowLinkTitle(editor.settings)) { linkTitleCtrl = { name: 'title', type: 'textbox', label: 'Title', value: data.title }; } win = editor.windowManager.open({ title: 'Insert link', data: data, body: [ { name: 'href', type: 'filepicker', filetype: 'file', size: 40, autofocus: true, label: 'Url', onchange: urlChange, onkeyup: updateText, onpaste: updateText, onbeforecall: onBeforeCall }, textListCtrl, linkTitleCtrl, buildAnchorListControl(data.href), linkListCtrl, relListCtrl, targetListCtrl, classListCtrl ], onSubmit: function (e) { var assumeExternalTargets = Settings.assumeExternalTargets(editor.settings); var insertLink = Utils.link(editor, attachState); var removeLink = Utils.unlink(editor); var resultData = global$4.extend({}, data, e.data); var href = resultData.href; if (!href) { removeLink(); return; } if (!onlyText || resultData.text === initialText) { delete resultData.text; } if (href.indexOf('@') > 0 && href.indexOf('//') === -1 && href.indexOf('mailto:') === -1) { delayedConfirm(editor, 'The URL you entered seems to be an email address. Do you want to add the required mailto: prefix?', function (state) { if (state) { resultData.href = 'mailto:' + href; } insertLink(resultData); }); return; } if (assumeExternalTargets === true && !/^\w+:/i.test(href) || assumeExternalTargets === false && /^\s*www[\.|\d\.]/i.test(href)) { delayedConfirm(editor, 'The URL you entered seems to be an external link. Do you want to add the required http:// prefix?', function (state) { if (state) { resultData.href = 'http://' + href; } insertLink(resultData); }); return; } insertLink(resultData); } }); }; var open$1 = function (editor) { createLinkList(editor, showDialog); }; var Dialog = { open: open$1 }; var getLink = function (editor, elm) { return editor.dom.getParent(elm, 'a[href]'); }; var getSelectedLink = function (editor) { return getLink(editor, editor.selection.getStart()); }; var getHref = function (elm) { var href = elm.getAttribute('data-mce-href'); return href ? href : elm.getAttribute('href'); }; var isContextMenuVisible = function (editor) { var contextmenu = editor.plugins.contextmenu; return contextmenu ? contextmenu.isContextMenuVisible() : false; }; var hasOnlyAltModifier = function (e) { return e.altKey === true && e.shiftKey === false && e.ctrlKey === false && e.metaKey === false; }; var gotoLink = function (editor, a) { if (a) { var href = getHref(a); if (/^#/.test(href)) { var targetEl = editor.$(href); if (targetEl.length) { editor.selection.scrollIntoView(targetEl[0], true); } } else { OpenUrl.open(a.href); } } }; var openDialog = function (editor) { return function () { Dialog.open(editor); }; }; var gotoSelectedLink = function (editor) { return function () { gotoLink(editor, getSelectedLink(editor)); }; }; var leftClickedOnAHref = function (editor) { return function (elm) { var sel, rng, node; if (Settings.hasContextToolbar(editor.settings) && !isContextMenuVisible(editor) && Utils.isLink(elm)) { sel = editor.selection; rng = sel.getRng(); node = rng.startContainer; if (node.nodeType === 3 && sel.isCollapsed() && rng.startOffset > 0 && rng.startOffset < node.data.length) { return true; } } return false; }; }; var setupGotoLinks = function (editor) { editor.on('click', function (e) { var link = getLink(editor, e.target); if (link && global$1.metaKeyPressed(e)) { e.preventDefault(); gotoLink(editor, link); } }); editor.on('keydown', function (e) { var link = getSelectedLink(editor); if (link && e.keyCode === 13 && hasOnlyAltModifier(e)) { e.preventDefault(); gotoLink(editor, link); } }); }; var toggleActiveState = function (editor) { return function () { var self = this; editor.on('nodechange', function (e) { self.active(!editor.readonly && !!Utils.getAnchorElement(editor, e.element)); }); }; }; var toggleViewLinkState = function (editor) { return function () { var self = this; var toggleVisibility = function (e) { if (Utils.hasLinks(e.parents)) { self.show(); } else { self.hide(); } }; if (!Utils.hasLinks(editor.dom.getParents(editor.selection.getStart()))) { self.hide(); } editor.on('nodechange', toggleVisibility); self.on('remove', function () { editor.off('nodechange', toggleVisibility); }); }; }; var Actions = { openDialog: openDialog, gotoSelectedLink: gotoSelectedLink, leftClickedOnAHref: leftClickedOnAHref, setupGotoLinks: setupGotoLinks, toggleActiveState: toggleActiveState, toggleViewLinkState: toggleViewLinkState }; var register = function (editor) { editor.addCommand('mceLink', Actions.openDialog(editor)); }; var Commands = { register: register }; var setup = function (editor) { editor.addShortcut('Meta+K', '', Actions.openDialog(editor)); }; var Keyboard = { setup: setup }; var setupButtons = function (editor) { editor.addButton('link', { active: false, icon: 'link', tooltip: 'Insert/edit link', onclick: Actions.openDialog(editor), onpostrender: Actions.toggleActiveState(editor) }); editor.addButton('unlink', { active: false, icon: 'unlink', tooltip: 'Remove link', onclick: Utils.unlink(editor), onpostrender: Actions.toggleActiveState(editor) }); if (editor.addContextToolbar) { editor.addButton('openlink', { icon: 'newtab', tooltip: 'Open link', onclick: Actions.gotoSelectedLink(editor) }); } }; var setupMenuItems = function (editor) { editor.addMenuItem('openlink', { text: 'Open link', icon: 'newtab', onclick: Actions.gotoSelectedLink(editor), onPostRender: Actions.toggleViewLinkState(editor), prependToContext: true }); editor.addMenuItem('link', { icon: 'link', text: 'Link', shortcut: 'Meta+K', onclick: Actions.openDialog(editor), stateSelector: 'a[href]', context: 'insert', prependToContext: true }); editor.addMenuItem('unlink', { icon: 'unlink', text: 'Remove link', onclick: Utils.unlink(editor), stateSelector: 'a[href]' }); }; var setupContextToolbars = function (editor) { if (editor.addContextToolbar) { editor.addContextToolbar(Actions.leftClickedOnAHref(editor), 'openlink | link unlink'); } }; var Controls = { setupButtons: setupButtons, setupMenuItems: setupMenuItems, setupContextToolbars: setupContextToolbars }; global.add('link', function (editor) { Controls.setupButtons(editor); Controls.setupMenuItems(editor); Controls.setupContextToolbars(editor); Actions.setupGotoLinks(editor); Commands.register(editor); Keyboard.setup(editor); }); function Plugin () { } return Plugin; }(window)); })(); PK:\VƺH""mce/link/plugin.min.jsnuW+A!function(l){"use strict";var t=tinymce.util.Tools.resolve("tinymce.PluginManager"),n=tinymce.util.Tools.resolve("tinymce.util.VK"),e=function(t){return t.target_list},o=function(t){return t.rel_list},i=function(t){return t.link_class_list},p=function(t){return"boolean"==typeof t.link_assume_external_targets&&t.link_assume_external_targets},a=function(t){return"boolean"==typeof t.link_context_toolbar&&t.link_context_toolbar},r=function(t){return t.link_list},k=function(t){return"string"==typeof t.default_link_target},y=function(t){return t.default_link_target},b=e,_=function(t,e){t.settings.target_list=e},w=function(t){return!1!==e(t)},T=o,C=function(t){return o(t)!==undefined},M=i,O=function(t){return i(t)!==undefined},R=function(t){return!1!==t.link_title},N=function(t){return"boolean"==typeof t.allow_unsafe_link_target&&t.allow_unsafe_link_target},u=tinymce.util.Tools.resolve("tinymce.dom.DOMUtils"),c=tinymce.util.Tools.resolve("tinymce.Env"),s=function(t){if(!c.ie||10'),i.close()}}var r,a},A=tinymce.util.Tools.resolve("tinymce.util.Tools"),f=function(t,e){var n,o,i=["noopener"],r=t?t.split(/\s+/):[],a=function(t){return t.filter(function(t){return-1===A.inArray(i,t)})};return(r=e?(n=a(n=r)).length?n.concat(i):i:a(r)).length?(o=r,A.trim(o.sort().join(" "))):null},d=function(t,e){return e=e||t.selection.getNode(),v(e)?t.dom.select("a[href]",e)[0]:t.dom.getParent(e,"a[href]")},m=function(t){return t&&"A"===t.nodeName&&t.href},v=function(t){return t&&"FIGURE"===t.nodeName&&/\bimage\b/i.test(t.className)},g=function(t,e){var n,o;(o=t.dom.select("img",e)[0])&&(n=t.dom.getParents(o,"a[href]",e)[0])&&(n.parentNode.insertBefore(o,n),t.dom.remove(n))},h=function(t,e,n){var o,i;(i=t.dom.select("img",e)[0])&&(o=t.dom.create("a",n),i.parentNode.insertBefore(o,i),o.appendChild(i))},L=function(i,r){return function(o){i.undoManager.transact(function(){var t=i.selection.getNode(),e=d(i,t),n={href:o.href,target:o.target?o.target:null,rel:o.rel?o.rel:null,"class":o["class"]?o["class"]:null,title:o.title?o.title:null};C(i.settings)||!1!==N(i.settings)||(n.rel=f(n.rel,"_blank"===n.target)),o.href===r.href&&(r.attach(),r={}),e?(i.focus(),o.hasOwnProperty("text")&&("innerText"in e?e.innerText=o.text:e.textContent=o.text),i.dom.setAttribs(e,n),i.selection.select(e),i.undoManager.add()):v(t)?h(i,t,n):o.hasOwnProperty("text")?i.insertContent(i.dom.createHTML("a",n,i.dom.encode(o.text))):i.execCommand("mceInsertLink",!1,n)})}},P=function(e){return function(){e.undoManager.transact(function(){var t=e.selection.getNode();v(t)?g(e,t):e.execCommand("unlink")})}},x=m,E=function(t){return 0]+>[^<]+<\/a>$/.test(t)||-1===t.indexOf("href=")))},I=d,K=function(t,e){var n=e?e.innerText||e.textContent:t.getContent({format:"text"});return n.replace(/\uFEFF/g,"")},U=f,D=tinymce.util.Tools.resolve("tinymce.util.Delay"),B=tinymce.util.Tools.resolve("tinymce.util.XHR"),F={},q=function(t,o,e){var i=function(t,n){return n=n||[],A.each(t,function(t){var e={text:t.text||t.title};t.menu?e.menu=i(t.menu):(e.value=t.value,o&&o(e)),n.push(e)}),n};return i(t,e||[])},V=function(e,t,n){var o=e.selection.getRng();D.setEditorTimeout(e,function(){e.windowManager.confirm(t,function(t){e.selection.setRng(o),n(t)})})},z=function(a,t){var e,l,o,u,n,i,r,c,s,f,d,m={},v=a.selection,g=a.dom,h=function(t){var e=o.find("#text");(!e.value()||t.lastControl&&e.value()===t.lastControl.text())&&e.value(t.control.text()),o.find("#href").value(t.control.value())},x=function(){l||!u||m.text||this.parent().parent().find("#text")[0].value(this.value())};u=S(v.getContent()),e=I(a),m.text=l=K(a.selection,e),m.href=e?g.getAttrib(e,"href"):"",e?m.target=g.getAttrib(e,"target"):k(a.settings)&&(m.target=y(a.settings)),(d=g.getAttrib(e,"rel"))&&(m.rel=d),(d=g.getAttrib(e,"class"))&&(m["class"]=d),(d=g.getAttrib(e,"title"))&&(m.title=d),u&&(n={name:"text",type:"textbox",size:40,label:"Text to display",onchange:function(){m.text=this.value()}}),t&&(i={type:"listbox",label:"Link list",values:q(t,function(t){t.value=a.convertURL(t.value||t.url,"href")},[{text:"None",value:""}]),onselect:h,value:a.convertURL(m.href,"href"),onPostRender:function(){i=this}}),w(a.settings)&&(b(a.settings)===undefined&&_(a,[{text:"None",value:""},{text:"New window",value:"_blank"}]),c={name:"target",type:"listbox",label:"Target",values:q(b(a.settings))}),C(a.settings)&&(r={name:"rel",type:"listbox",label:"Rel",values:q(T(a.settings),function(t){!1===N(a.settings)&&(t.value=U(t.value,"_blank"===m.target))})}),O(a.settings)&&(s={name:"class",type:"listbox",label:"Class",values:q(M(a.settings),function(t){t.value&&(t.textStyle=function(){return a.formatter.getCssText({inline:"a",classes:[t.value]})})})}),R(a.settings)&&(f={name:"title",type:"textbox",label:"Title",value:m.title}),o=a.windowManager.open({title:"Insert link",data:m,body:[{name:"href",type:"filepicker",filetype:"file",size:40,autofocus:!0,label:"Url",onchange:function(t){var e=t.meta||{};i&&i.value(a.convertURL(this.value(),"href")),A.each(t.meta,function(t,e){var n=o.find("#"+e);"text"===e?0===l.length&&(n.value(t),m.text=t):n.value(t)}),e.attach&&(F={href:this.value(),attach:e.attach}),e.text||x.call(this)},onkeyup:x,onpaste:x,onbeforecall:function(t){t.meta=o.toJSON()}},n,f,function(n){var o=[];if(A.each(a.dom.select("a:not([href])"),function(t){var e=t.name||t.id;e&&o.push({text:e,value:"#"+e,selected:-1!==n.indexOf("#"+e)})}),o.length)return o.unshift({text:"None",value:""}),{name:"anchor",type:"listbox",label:"Anchors",values:o,onselect:h}}(m.href),i,r,c,s],onSubmit:function(t){var e=p(a.settings),n=L(a,F),o=P(a),i=A.extend({},m,t.data),r=i.href;r?(u&&i.text!==l||delete i.text,0 0) { global$4.each(selectorGroups, function (group) { var menuItem = processSelector(selector, group); if (menuItem) { group.item.menu.push(menuItem); } }); } else { var menuItem = processSelector(selector, null); if (menuItem) { ctrl.add(menuItem); } } } } }); global$4.each(groups, function (group) { if (group.item.menu.length > 0) { ctrl.add(group.item); } }); e.control.renderNew(); }); }; var ImportCss = { defaultConvertSelectorToFormat: defaultConvertSelectorToFormat, setup: setup }; var get = function (editor) { var convertSelectorToFormat = function (selectorText) { return ImportCss.defaultConvertSelectorToFormat(editor, selectorText); }; return { convertSelectorToFormat: convertSelectorToFormat }; }; var Api = { get: get }; global.add('importcss', function (editor) { ImportCss.setup(editor); return Api.get(editor); }); function Plugin () { } return Plugin; }()); })(); PK:\>o; ; mce/importcss/plugin.min.jsnuW+A!function(){"use strict";var e=tinymce.util.Tools.resolve("tinymce.PluginManager"),d=tinymce.util.Tools.resolve("tinymce.dom.DOMUtils"),v=tinymce.util.Tools.resolve("tinymce.EditorManager"),h=tinymce.util.Tools.resolve("tinymce.Env"),y=tinymce.util.Tools.resolve("tinymce.util.Tools"),o=function(e){return e.getParam("importcss_merge_classes")},n=function(e){return e.getParam("importcss_exclusive")},_=function(e){return e.getParam("importcss_selector_converter")},r=function(e){return e.getParam("importcss_selector_filter")},i=function(e){return e.getParam("importcss_groups")},u=function(e){return e.getParam("importcss_append")},l=function(e){return e.getParam("importcss_file_filter")},a=function(t){return"string"==typeof t?function(e){return-1!==e.indexOf(t)}:t instanceof RegExp?function(e){return t.test(e)}:t},f=function(f,e,m){var g=[],n={};function p(e,t){var n,r,i,c=e.href;if(r=c,i=h.cacheSuffix,"string"==typeof r&&(r=r.replace("?"+i,"").replace("&"+i,"")),(c=r)&&m(c,t)&&(o=c,u=(s=f).settings,!(l=!1!==u.skin&&(u.skin||"lightgray"))||o!==(u.skin_url?s.documentBaseURI.toAbsolute(u.skin_url):v.baseURL+"/skins/"+l)+"/content"+(s.inline?".inline":"")+".min.css")){var s,o,u,l;y.each(e.imports,function(e){p(e,!0)});try{n=e.cssRules||e.rules}catch(a){}y.each(n,function(e){e.styleSheet?p(e.styleSheet,!0):e.selectorText&&y.each(e.selectorText.split(","),function(e){g.push(y.trim(e))})})}}y.each(f.contentCSS,function(e){n[e]=!0}),m||(m=function(e,t){return t||n[e]});try{y.each(e.styleSheets,function(e){p(e)})}catch(t){}return g},x=function(e,t){var n,r=/^(?:([a-z0-9\-_]+))?(\.[a-z0-9_\-\.]+)$/i.exec(t);if(r){var i=r[1],c=r[2].substr(1).split(".").join(" "),s=y.makeMap("a,img");return r[1]?(n={title:t},e.schema.getTextBlockElements()[i]?n.block=i:e.schema.getBlockElements()[i]||s[i.toLowerCase()]?n.selector=i:n.inline=i):r[2]&&(n={inline:"span",title:t.substr(1),classes:c}),!1!==o(e)?n.classes=c:n.attributes={"class":c},n}},T=function(e,t){return null===t||!1!==n(e)},c=x,t=function(h){h.on("renderFormatsMenu",function(e){var t,p={},c=a(r(h)),v=e.control,s=(t=i(h),y.map(t,function(e){return y.extend({},e,{original:e,selectors:{},filter:a(e.filter),item:{text:e.title,menu:[]}})})),o=function(e,t){if(f=e,g=p,!(T(h,m=t)?f in g:f in m.selectors)){u=e,a=p,T(h,l=t)?a[u]=!0:l.selectors[u]=!0;var n=(c=(i=h).plugins.importcss,s=e,((o=t)&&o.selector_converter?o.selector_converter:_(i)?_(i):function(){return x(i,s)}).call(c,s,o));if(n){var r=n.name||d.DOM.uniqueId();return h.formatter.register(r,n),y.extend({},v.settings.itemDefaults,{text:n.title,format:r})}}var i,c,s,o,u,l,a,f,m,g;return null};u(h)||v.items().remove(),y.each(f(h,e.doc||h.getDoc(),a(l(h))),function(n){if(-1===n.indexOf(".mce-")&&(!c||c(n))){var e=(r=s,i=n,y.grep(r,function(e){return!e.filter||e.filter(i)}));if(0{const e=[];return["core-embed/twitter","core-embed/youtube","core-embed/facebook","core-embed/instagram","core-embed/wordpress","core-embed/soundcloud","core-embed/spotify","core-embed/flickr","core-embed/vimeo","core-embed/animoto","core-embed/cloudup","core-embed/collegehumor","core-embed/crowdsignal","core-embed/dailymotion","core-embed/hulu","core-embed/imgur","core-embed/issuu","core-embed/kickstarter","core-embed/meetup-com","core-embed/mixcloud","core-embed/polldaddy","core-embed/reddit","core-embed/reverbnation","core-embed/screencast","core-embed/scribd","core-embed/slideshare","core-embed/smugmug","core-embed/speaker","core-embed/speaker-deck","core-embed/ted","core-embed/tumblr","core-embed/videopress","core-embed/wordpress-tv","core-embed/amazon-kindle"].forEach(t=>{e.push({type:"block",blocks:[t],transform:e=>{if(!e.url)return h("tadv/classic-paragraph",{content:""});const o=g(h(t,e));let r,n="

    "+e.url+"

    ";return o&&o.indexOf("")>-1&&o.replace(/]*>([\s\S]*?)<\/figcaption>/,(function(e,t){r=t})),n+=r?"

    "+r+"

    ":'


    ',h("tadv/classic-paragraph",{content:n})}})}),["core/paragraph","core/image","core/heading","core/gallery","core/list","core/quote","core/code","core/columns","core/freeform","core/html","core/media-text","core/missing","core/preformatted","core/pullquote","core/subhead","core/table","core/text-columns","core/verse"].forEach(t=>{e.push({type:"block",blocks:[t],transform:e=>{let o=g(h(t,e));return(!o||o.indexOf("")>-1)&&(o+='


    '),h("tadv/classic-paragraph",{content:o})}})}),e.push({type:"raw",priority:21,isMatch:()=>!0},{type:"block",isMultiBlock:!0,blocks:["core/paragraph"],transform:e=>{const t=f({value:u(e.map(({content:e})=>b({html:e})),"\u2028"),multilineTag:"p"});return h("tadv/classic-paragraph",{content:t})}},{type:"block",isMultiBlock:!0,blocks:["tadv/classic-paragraph"],transform:e=>{const t=f({value:u(e.map(({content:e})=>b({html:e})),"\u2028")});return h("tadv/classic-paragraph",{content:t})}},{type:"block",isMultiBlock:!0,blocks:["core/freeform"],transform:e=>{const t=f({value:u(e.map(({content:e})=>b({html:e})),"\u2028")});return h("tadv/classic-paragraph",{content:t})}}),e})(),to:[{type:"block",blocks:["core/freeform"],transform:e=>h("core/freeform",e)},{type:"block",blocks:["core/html"],transform:e=>h("core/html",e)}]};const{__:y}=wp.i18n,v=window.tadvBlockRegister,{name:w,attributes:B,category:_}={name:"tadv/classic-paragraph",category:"common",attributes:{content:{type:"string",source:"html"},align:{type:"string"}}};var x={name:w,attributes:B,category:_,title:v.classicParagraphTitle,description:v.description,keywords:[y("text")],icon:"welcome-widgets-menus",supports:{className:!1,customClassName:!1,reusable:!0},merge:(e,t)=>({content:(e.content||"")+(t.content||"")}),transforms:k,edit:class extends n{constructor(e){super(e),this.initialize=this.initialize.bind(this),this.onSetup=this.onSetup.bind(this),this.focus=this.focus.bind(this)}componentDidMount(){const{baseURL:e,suffix:t}=window.wpEditorL10n.tinymce;window.tinymce.EditorManager.overrideDefaults({base_url:e,suffix:t}),"complete"===document.readyState?this.initialize():window.addEventListener("DOMContentLoaded",this.initialize)}componentWillUnmount(){window.addEventListener("DOMContentLoaded",this.initialize),r.oldEditor.remove(`editor-${this.props.clientId}`)}componentDidUpdate(e){const{clientId:t,isSelected:o,attributes:{content:r}}=this.props,n=window.tinymce.get(`editor-${t}`);e.attributes.content!==r&&this.content!==r&&n.setContent(r||""),!o&&n.initialized&&n.fire("blur",{wpBlockDidUpdate:!0})}initialize(){const{clientId:e,setAttributes:t}=this.props,{settings:o}=window.wpEditorL10n.tinymce;r.oldEditor.initialize(`editor-${e}`,{tinymce:{...o,inline:!0,content_css:!1,fixed_toolbar_container:`#toolbar-${e}`,setup:this.onSetup}}),t({id:e})}onSetup(e){const{attributes:{content:t},setAttributes:o}=this.props;let r;this.editor=e,t&&e.on("loadContent",()=>e.setContent(t)),e.on("blur",t=>{if(t.wpBlockDidUpdate)return;r=e.selection.getBookmark(2,!0),this.content=e.getContent();const{isSelected:n}=this.props;return o({content:this.content}),e.once("focus",()=>{r&&e.selection.moveToBookmark(r)}),!n&&void 0}),e.on("mousedown touchstart",()=>{r=null}),e.on("keydown",t=>{t.keyCode!==i&&t.keyCode!==a||!function(e){const t=e.getBody();return!(t.childNodes.length>1)&&(0===t.childNodes.length||!(t.childNodes[0].childNodes.length>1)&&/^\n?$/.test(t.innerText||t.textContent))}(e)||(this.props.onReplace([]),t.preventDefault(),t.stopImmediatePropagation());const{altKey:o}=t;o&&t.keyCode===s&&t.stopPropagation()}),e.on("init",()=>{const e=this.editor.getBody();document.activeElement===e&&(e.blur(),this.editor.focus())})}focus(){this.editor&&this.editor.focus()}onToolbarKeyDown(e){e.stopPropagation(),e.nativeEvent.stopImmediatePropagation()}render(){const{clientId:e,name:t,attributes:o,setAttributes:r}=this.props;return[c("div",{key:"toolbar",id:`toolbar-${e}`,className:"block-library-classic__toolbar tma-classic-paragraph__toolbar",onClick:this.focus,"data-placeholder":l.classicParagraphTitle,onKeyDown:this.onToolbarKeyDown}),c("div",{key:"editor",id:`editor-${e}`,className:"wp-block-freeform block-library-rich-text__tinymce tma-classic-paragraph"})]}},save:function({attributes:e}){const{content:t}=e;return p(d,null,t)}};const{dispatch:C,select:E}=wp.data,{createBlock:M,rawHandler:S}=wp.blocks;var P=function(){const e=E("core/block-editor").getSelectedBlock();let t;if(e){let o=e.attributes.content;o?(/

    /.test(o)&&(o=o.replace(/

    /g,"

    ")),t=S({HTML:o})):t=M("core/paragraph"),C("core/block-editor").replaceBlocks(e.clientId,t)}};!function(){const e=window.wp,t=window.tadvBlockRegister;if(!e||!t)return;const{createElement:o}=e.element,{__:r}=e.i18n,{addFilter:n}=e.hooks,{PluginBlockSettingsMenuItem:c}=e.editPost,{registerPlugin:i}=e.plugins,{registerBlockType:a,setDefaultBlockName:s}=e.blocks;t.classicParagraph?(a("tadv/classic-paragraph",x),i("tadv-add-submenu",{render:()=>(t.hybridMode&&s("tadv/classic-paragraph"),o(c,{allowedBlocks:["tadv/classic-paragraph"],icon:"screenoptions",label:r("Convert to Blocks"),onClick:P,small:null,role:"menuitem"}))})):t.hybridMode&&i("tadv-set-default-block",{render:()=>(s("core/freeform"),null)})}()}]);PK:\,y$"block-editor/classic-paragraph.cssnuW+Adiv[data-type="tadv/classic-paragraph"].is-selected .block-library-classic__toolbar,div[data-type="tadv/classic-paragraph"].is-typing .block-library-classic__toolbar,div[data-type="tadv/classic-paragraph"] div.mce-toolbar-grp{border-color:rgba(66,88,99,.35)}div[data-type="tadv/classic-paragraph"] .block-library-classic__toolbar:empty{display:none}div[data-type="tadv/classic-paragraph"].is-selected .block-library-classic__toolbar,div[data-type="tadv/classic-paragraph"].is-typing .block-library-classic__toolbar{display:block;z-index:31}PK:\zg!block-editor/richtext-buttons.cssnuW+A.tadv-buttons-panel .components-toolbar__control.tadv-icon-button{width:38px;height:38px;padding:3px}.tadv-buttons-panel .components-toolbar__control.tadv-icon-button>svg{height:32px;width:32px;padding:5px;border-radius:4px;box-sizing:border-box;outline:none;box-shadow:none}.tadv-buttons-panel .components-toolbar{border:none;display:block}.tadv-buttons-panel div.components-toolbar>div{display:inline-block;margin:0}.tadv-mark-icon{background-color:#fff9c0;background-clip:content-box}PK:\Uߏ!block-editor/tma-block-editor.cssnuW+Adiv[data-type="core/freeform"].is-selected .block-library-classic__toolbar,div[data-type="core/freeform"].is-typing .block-library-classic__toolbar{z-index:31}.block-library-classic__toolbar .mce-btn .mce-txt{font-size:13px;color:#454545}.mce-tinymce-inline .mce-menubar>div,.mce-tinymce-inline .mce-toolbar .mce-btn-group>div{white-space:normal}div.mce-menubar,div.mce-menubar *{box-sizing:border-box}.block-library-classic__toolbar .mce-menubar{padding:1px}.block-library-classic__toolbar .mce-menubar .mce-menubtn button span{font-size:13px}.block-library-classic__toolbar .mce-menubar i.mce-caret{margin-top:.35em}.block-library-classic__toolbar .mce-menubar .mce-flow-layout-item{margin:2px 0}div.mce-menubar.mce-toolbar .mce-btn button{padding:3px 4px 2px}div.mce-menubar{border-color:#e5e5e5;background:#fff;border-width:0 0 1px}div.mce-menubar .mce-menubtn:focus{color:#124964;box-shadow:0 0 0 1px #5b9dd9,0 0 2px 1px rgba(30,140,190,.8)}div.mce-menu-item-sep:hover,div.mce-menu .mce-menu-item-sep{border-bottom:1px solid #ddd;height:0;margin:5px 0}div.mce-menubtn span{margin-right:0;padding-left:3px}div.mce-menu-has-icons i.mce-ico:before{margin-left:0}div.mce-menu-has-icons i.mce-ico{line-height:18px;width:18px;height:18px}.wp-core-ui .mce-menu-item .mce-text{font-size:13px}.block-library-classic__toolbar .mce-menubar .mce-menubtn.mce-active,.block-library-classic__toolbar .mce-menubar .mce-menubtn:focus,.block-library-classic__toolbar .mce-menubar .mce-menubtn:hover{border-color:transparent}.block-library-classic__toolbar .mce-menubar .mce-menubtn.mce-active span,.block-library-classic__toolbar .mce-menubar .mce-menubtn:focus span,.block-library-classic__toolbar .mce-menubar .mce-menubtn:hover span{color:#000}.mce-inline-toolbar-grp div.wp-link-input{margin:2px 4px}.mce-inline-toolbar-grp div.wp-link-input input{padding:4px}div.mce-menu-item.mce-menu-item-preview.mce-active:hover,div.mce-menu .mce-menu-item-normal.mce-active,div.mce-menu .mce-menu-item-preview.mce-active,div.mce-menu .mce-menu-item.mce-selected,div.mce-menu .mce-menu-item:focus,div.mce-menu .mce-menu-item:hover{background:#0073aa;color:#fff}div.mce-menu-item.mce-active .mce-menu-shortcut,div.mce-menu-item.mce-disabled:hover .mce-ico,div.mce-menu-item.mce-disabled:hover .mce-text,div.mce-menu-item.mce-menu-item-preview.mce-active .mce-ico,div.mce-menu-item.mce-menu-item-preview.mce-active .mce-text,div.mce-menu-item:focus .mce-ico,div.mce-menu-item:focus .mce-menu-shortcut,div.mce-menu-item:focus .mce-text,div.mce-menu-item:hover .mce-ico,div.mce-menu-item:hover .mce-menu-shortcut,div.mce-menu-item:hover .mce-text{color:inherit}div.mce-menu .mce-menu-item.mce-disabled{cursor:default}div.mce-menu .mce-menu-item.mce-disabled:hover{background:#ccc}div.mce-inline-toolbar-grp .mce-btn.mce-active:hover button,div.mce-inline-toolbar-grp .mce-btn.mce-active:hover i,div.mce-inline-toolbar-grp .mce-btn.mce-active button,div.mce-inline-toolbar-grp .mce-btn.mce-active i,div.mce-inline-toolbar-grp .mce-btn:hover button,div.mce-inline-toolbar-grp .mce-btn:hover i,div.mce-toolbar-grp .mce-btn.mce-active:hover button,div.mce-toolbar-grp .mce-btn.mce-active:hover i,div.mce-toolbar-grp .mce-btn.mce-active button,div.mce-toolbar-grp .mce-btn.mce-active i,div.mce-toolbar-grp .mce-btn:hover button,div.mce-toolbar-grp .mce-btn:hover i{color:#191e23}div.mce-inline-toolbar-grp .mce-btn i,div.mce-toolbar-grp .mce-btn i{font-style:normal}div.mce-toolbar-grp .mce-btn i.mce-ico{font-size:20px}div.mce-widget.mce-tooltip .mce-tooltip-inner{font-size:13px;opacity:1}.mce-inline-toolbar-grp.mce-panel .mce-toolbar .mce-btn{margin:1px}.mce-inline-toolbar-grp.mce-panel .mce-toolbar .mce-btn button{padding:3px}.wp-block-freeform.block-library-rich-text__tinymce table{width:100%}PK:\JΦ>->- block-editor/richtext-buttons.jsnuW+A!function(t){var e={};function o(n){if(e[n])return e[n].exports;var r=e[n]={i:n,l:!1,exports:{}};return t[n].call(r.exports,r,r.exports,o),r.l=!0,r.exports}o.m=t,o.c=e,o.d=function(t,e,n){o.o(t,e)||Object.defineProperty(t,e,{enumerable:!0,get:n})},o.r=function(t){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},o.t=function(t,e){if(1&e&&(t=o(t)),8&e)return t;if(4&e&&"object"==typeof t&&t&&t.__esModule)return t;var n=Object.create(null);if(o.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:t}),2&e&&"string"!=typeof t)for(var r in t)o.d(n,r,function(e){return t[e]}.bind(null,r));return n},o.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return o.d(e,"a",e),e},o.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},o.p="",o(o.s=0)}([function(t,e,o){"use strict";o.r(e);const n=window.tadvBlockButtons,{wp:r}=window,{get:a}=window.lodash,{createElement:c}=r.element,{InspectorControls:l,PanelColorSettings:i}=r.blockEditor,{registerFormatType:s,applyFormat:u,removeFormat:d,getActiveFormat:v}=r.richText;function m(t){return(t=t.replace(/.*?(background-)?color:\s*/,"")).replace(/[; ]+$/,"")}const h=window.tadvBlockButtons||{},{wp:p}=window,{RichTextToolbarButton:g}=p.blockEditor,{registerFormatType:f,removeFormat:b}=p.richText,{createElement:y}=p.element,{ToolbarButton:k}=p.components,w=h.strRemoveFormatting||"Clear formatting";let F;function T(t){const e=[];return F||(F=h.formats_to_remove?h.formats_to_remove.split(","):["core/bold","core/italic","core/code","core/underline","core/strikethrough","core/text-color","tadv/sup","tadv/sub","tadv/mark","tadv/color-panel","tadv/background-color-panel"]),t.forEach(t=>{t&&t.forEach(t=>{F.indexOf(t.type)>-1&&-1===e.indexOf(t.type)&&e.push(t.type)})}),e}function C(t){let e=t.formats;if(!e.length)return t;let o=0,n=e.length;t.end>t.start&&(o=t.start,n=t.end,e=e.slice(o,n));const r=T(e);return r.length?(r.forEach(e=>{t=b(t,e,o,n)}),t):t}const{wp:x}=window,{createElement:B,Fragment:A}=(window.tadvBlockButtons,x.element),{__:N}=x.i18n,{ToolbarButton:E}=x.components,{RichTextToolbarButton:S,RichTextShortcut:_}=x.blockEditor,{registerFormatType:O,getActiveFormat:P,toggleFormat:R,applyFormat:M,removeFormat:U}=x.richText,j=N("Strikethrough");function z(t,e,o){e(R(t,{type:"core/strikethrough"})),o&&o()}const{wp:L}=window,{createElement:I,Fragment:G}=L.element,{__:H}=L.i18n,{ToolbarButton:V}=L.components,{RichTextToolbarButton:$,RichTextShortcut:q}=L.blockEditor,{registerFormatType:D,getActiveFormat:J,toggleFormat:K,remove:Q,applyFormat:W}=L.richText,X=H("Inline Code");function Y(t,e,o){e(K(t,{type:"core/code"})),o&&o()}const{wp:Z}=window,tt=window.tadvBlockButtons||{},{createElement:et,Fragment:ot}=Z.element,{__:nt}=Z.i18n,{ToolbarButton:rt}=Z.components,{RichTextToolbarButton:at,RichTextShortcut:ct}=Z.blockEditor,{Path:lt,SVG:it}=Z.components,{registerFormatType:st,getActiveFormat:ut,toggleFormat:dt,applyFormat:vt,removeFormat:mt}=Z.richText,ht=et(it,{viewBox:"0 0 20 20",xmlns:"http://www.w3.org/2000/svg",className:"dashicon tadv-mark-icon"},et(lt,{"aria-hidden":"true",role:"img",focusable:"false",width:"20",height:"20",d:"M13.23 15h1.9L11 4H9L5 15h1.88l1.07-3h4.18zm-1.53-4.54H8.51L10 5.6z"})),pt=tt.strMark;function gt(t,e,o){e(dt(t,{type:"tadv/mark"})),o&&o()}const{wp:ft}=window,bt=window.tadvBlockButtons||{},{createElement:yt,Fragment:kt}=ft.element,{__:wt}=ft.i18n,{ToolbarButton:Ft}=ft.components,{RichTextToolbarButton:Tt,RichTextShortcut:Ct}=ft.blockEditor,{registerFormatType:xt,getActiveFormat:Bt,applyFormat:At,removeFormat:Nt}=ft.richText;function Et(t,e,o,n){if(t)o(Nt(e,"core/underline"));else{o(At(e,{type:"core/underline",attributes:{style:"text-decoration: underline"}}))}n&&n()}const{wp:St}=window,_t=window.tadvBlockButtons,{createElement:Ot,Fragment:Pt}=St.element,{registerFormatType:Rt,getActiveFormat:Mt,toggleFormat:Ut}=St.richText,{ToolbarButton:jt}=St.components,{RichTextToolbarButton:zt,RichTextShortcut:Lt}=St.blockEditor,{Path:It,SVG:Gt}=St.components,Ht=Ot(Gt,{viewBox:"-85 -985 1024 1024",xmlns:"http://www.w3.org/2000/svg"},Ot(It,{"aria-hidden":"true",role:"img",focusable:"false",transform:"scale(1, -1)",translate:"(0, -960)",d:"M768 754v-50h128v-64h-192v146l128 60v50h-128v64h192v-146zM676 704h-136l-188-188-188 188h-136l256-256-256-256h136l188 188 188-188h136l-256 256z"})),Vt=Ot(Gt,{viewBox:"-85 -975 1024 1024",xmlns:"http://www.w3.org/2000/svg"},Ot(It,{"aria-hidden":"true",role:"img",focusable:"false",transform:"scale(1, -1)",translate:"(0, -960)",d:"M768 50v-50h128v-64h-192v146l128 60v50h-128v64h192v-146zM676 704h-136l-188-188-188 188h-136l256-256-256-256h136l188 188 188-188h136l-256 256z"}));function $t(t,e,o,n){o(Ut(e,{type:t})),n&&n()}function qt({type:t,tagName:e,title:o,character:n,icon:r},a){Rt(t,{title:o,tagName:e,className:null,edit({value:e,onChange:c,onFocus:l,isActive:i}){let s=null;return a||(s=Ot(zt,{title:o,icon:r,onClick:()=>$t(t,e,c,l),isActive:i,shortcutType:"primary",shortcutCharacter:n})),Ot(Pt,null,Ot(Lt,{type:"primary",character:n,onUse:()=>$t(t,e,c)}),s)}})}const{wp:Dt}=window,{createElement:Jt}=Dt.element,{select:Kt}=Dt.data,{addFilter:Qt}=Dt.hooks,{PanelBody:Wt,Toolbar:Xt}=Dt.components,{InspectorControls:Yt}=Dt.blockEditor,{registerFormatType:Zt,unregisterFormatType:te}=Dt.richText,ee=window.tadvBlockButtons||{},oe=ee.buttons?ee.buttons.split(","):[],ne=ee.panelButtons?ee.panelButtons.split(","):[],re=ee.unusedButtons?ee.unusedButtons.split(","):[],ae={"tadv/mark":function(t){st("tadv/mark",{title:pt,tagName:"mark",className:null,edit({value:e,onChange:o,onFocus:n,isActive:r}){let a=null;return t||(a=et(at,{title:pt,icon:ht,onClick:()=>gt(e,o,n),className:"tadv-icon-button-mark",isActive:r,shortcutType:"access",shortcutCharacter:"m"})),et(ot,null,et(ct,{type:"access",character:"m",onUse:()=>gt(e,o)}),a)}})},"tadv/removeformat":function(t){f("tadv/removeformat",{title:w,tagName:"u",className:"remove-format",edit:({value:e,onChange:o,onFocus:n,isActive:r})=>t?null:y(g,{icon:"editor-removeformatting",title:w,onClick:()=>o(C(e)),isActive:null})})},"tadv/sub":function(t){qt({type:"tadv/sub",tagName:"sub",title:_t.strSubscript,character:",",icon:Vt},t)},"tadv/sup":function(t){qt({type:"tadv/sup",tagName:"sup",title:_t.strSuperscript,character:".",icon:Ht},t)},"core/code":function(t){D("core/code",{title:X,tagName:"code",className:null,__unstableInputRule(t){const{start:e,text:o}=t;if("`"!==o.slice(e-1,e))return t;const n=o.slice(0,e-1).lastIndexOf("`");if(-1===n)return t;const r=n,a=e-2;return r===a?t:(t=Q(t,r,r+1),t=Q(t,a,a+1),t=W(t,{type:"core/code"},r,a))},edit({value:e,onChange:o,onFocus:n,isActive:r}){let a=null;return t||(a=I($,{icon:"editor-code",title:X,onClick:()=>Y(e,o,n),isActive:r,shortcutType:"access",shortcutCharacter:"x"})),I(G,null,I(q,{type:"access",character:"x",onUse:()=>Y(e,o)}),a)}})},"core/strikethrough":function(t){O("core/strikethrough",{name:"core/strikethrough",title:j,tagName:"s",className:null,edit({value:e,onChange:o,onFocus:n,isActive:r}){let a=null;return t||(a=B(S,{icon:"editor-strikethrough",title:j,onClick:()=>z(e,o,n),isActive:r,shortcutType:"access",shortcutCharacter:"d"})),B(A,null,B(_,{type:"access",character:"d",onUse:()=>z(e,o)}),a)}})},"core/underline":function(t){xt("core/underline",{title:bt.strUnderline,tagName:"span",className:"underline",attributes:{style:"style"},edit({value:e,onChange:o,onFocus:n,isActive:r}){let a=null;return t||(a=yt(Tt,{title:bt.strUnderline,icon:"editor-underline",onClick:()=>Et(r,e,o,n),className:null,isActive:r,shortcutType:"primary",shortcutCharacter:"u"})),yt(kt,null,yt(Ct,{type:"primary",character:"u",onUse:()=>Et(r,e,o)}),a)}})}},ce={"core/code":function({value:t,onChange:e,onFocus:o,isActive:n}){return I(V,{key:"core/code",icon:"editor-code",className:"tadv-icon-button",isActive:J(t,"core/code"),title:X,onClick:()=>Y(t,e,o)})},"core/strikethrough":function({value:t,onChange:e,onFocus:o,isActive:n}){return B(E,{key:"core/strikethrough",icon:"editor-strikethrough",className:"tadv-icon-button",isActive:P(t,"core/strikethrough"),title:j,onClick:()=>z(t,e,o)})},"core/underline":function({value:t,onChange:e,onFocus:o,isActive:n}){const r=!!Bt(t,"core/underline");return yt(Ft,{key:"core/underline",icon:"editor-underline",className:"tadv-icon-button",isActive:r,title:bt.strUnderline,onClick:()=>Et(r,t,e,o)})},"tadv/removeformat":function({value:t,onChange:e,onFocus:o,isActive:n}){return y(k,{key:"tadv/removeformat",icon:"editor-removeformatting",className:"tadv-icon-button",title:w,onClick:()=>e(C(t))})},"tadv/mark":function({value:t,onChange:e,onFocus:o,isActive:n}){return et(rt,{key:"tadv/mark",icon:"editor-textcolor",className:"tadv-icon-button tadv-icon-button-mark",isActive:ut(t,"tadv/mark"),title:pt,onClick:()=>gt(t,e,o)})},"tadv/sup":function({value:t,onChange:e,onFocus:o,isActive:n}){return Ot(jt,{key:"tadv/sup",icon:Ht,className:"tadv-icon-button",isActive:Mt(t,"tadv/sup"),title:_t.strSuperscript,onClick:()=>$t("tadv/sup",t,e,o)})},"tadv/sub":function({value:t,onChange:e,onFocus:o,isActive:n}){return Ot(jt,{key:"tadv/sub",icon:Vt,className:"tadv-icon-button",isActive:Mt(t,"tadv/sub"),title:_t.strSubscript,onClick:()=>$t("tadv/sub",t,e,o)})}};function le(t){(function(t){const e=Kt("core/rich-text").getFormatTypes();let o=!1;return e.forEach(e=>{e.name===t&&(o=!0)}),o})(t)&&te(t)}function ie(){re.length&&re.forEach(t=>{le(t)}),oe.forEach(t=>{ae.hasOwnProperty(t)&&(le(t),ae[t].call(null))}),ne.length&&(ne.forEach(t=>{-1===oe.indexOf(t)&&ae.hasOwnProperty(t)&&(le(t),ae[t].call(null,"panel"))}),Zt("tadv/tadv-format-panel",{title:ee.strFormatting,tagName:"span",className:"tadv-format-panel",edit({value:t,onChange:e,onFocus:o,isActive:n}){const r=[];return ne.forEach(a=>{ce.hasOwnProperty(a)&&r.push(ce[a].call(null,{value:t,onChange:e,onFocus:o,isActive:n}))}),Jt(Yt,null,Jt(Wt,{title:ee.strFormatting,className:"tadv-buttons-panel"},Jt(Xt,null,r)))}})),function(){if(!n.colorPanel)return;const t=n.colorPanel.indexOf("tadv/color-panel")>-1,e=n.colorPanel.indexOf("tadv/background-color-panel")>-1;t&&s("tadv/color-panel",{title:n.strTextColor,tagName:"span",className:"tadv-color",attributes:{style:"style"},edit({isActive:t,value:o,onChange:r}){let s,h;if(t){const t=v(o,"tadv/color-panel"),e=a(t,["attributes","style"])||"",n=v(o,"tadv/background-color-panel"),r=a(n,["attributes","style"])||"";s=m(e),h=m(r)}const p=[{value:s,onChange:t=>{r(t?u(o,{type:"tadv/color-panel",attributes:{style:"color:"+t}}):d(o,"tadv/color-panel"))},label:n.strTextColorLabel}];return e&&p.push({value:h,onChange:t=>{r(t?u(o,{type:"tadv/background-color-panel",attributes:{style:"background-color:"+t}}):d(o,"tadv/background-color-panel"))},label:n.strBackgroundColorLabel}),c(l,null,c(i,{title:n.strTextColor,initialOpen:!1,colorSettings:p}))}}),s("tadv/background-color-panel",{title:n.strBackgroundColor,tagName:"span",className:"tadv-background-color",attributes:{style:"style"},edit({isActive:o,value:r,onChange:s}){if(!e||t)return null;let h;if(o){const t=v(r,"tadv/background-color-panel");h=m(a(t,["attributes","style"])||"")}const p=[{value:h,onChange:t=>{s(t?u(r,{type:"tadv/background-color-panel",attributes:{style:"background-color:"+t}}):d(r,"tadv/background-color-panel"))},label:n.strBackgroundColorLabel}];return c(l,null,c(i,{title:n.strTextColor,initialOpen:!1,colorSettings:p}))}})}()}let se;Qt("blocks.registerBlockType","tadv-register-formats",(function(t){return se||(ie(),se=!0),t}))}]);PK:\J@@ readme.txtnuW+A=== TinyMCE Advanced === Contributors: azaozz Tags: block editor, classic editor, editor, Gutenberg, formatting, tinymce, write Requires at least: 5.4 Tested up to: 5.4 Stable tag: 5.4.0 Requires PHP: 5.6 License: GPLv2 License URI: http://www.gnu.org/licenses/gpl-2.0.html Extends and enhances the block editor (Gutenberg) and the classic editor (TinyMCE). == Description == TinyMCE Advanced introduces a "Classic Paragraph" block for the block editor (Gutenberg). If you are not quite ready to switch to the block editor, or have plugins that cannot be used there (yet), using the Classic Paragraph block is your best option. It lets you to continue to use the familiar TinyMCE editor for most tasks, and at the same time gives you full access to all blocks and new features in the block editor. Version 5.4 continues to improve and enhance the new features introduced in version 5.0 of TinyMCE Advanced. It includes an improved "Clear Formatting" button, several advanced settings for tables, and importing and exporting of the settings to a file. If you want to continue to use the previous ("classic") editor in WordPress 5.0 and newer, this plugin has an option to replace the new editor with the previous one. If you prefer to have access to both editors side by side or to allow your users to switch editors, it would be better to install the [Classic Editor plugin](https://wordpress.org/plugins/classic-editor/). TinyMCE Advanced is fully compatible with the classic editor plugin and similar plugins that restore use of the previous WordPress editor. As always this plugin will let you add, remove and arrange the buttons that are shown on the Visual Editor toolbar in the Classic Paragraph and Classic blocks in the block editor, and in the classic editor (when enabled by a plugin). There you can configure up to four rows of buttons including Font Sizes, Font Family, text and background colors, tables, etc. It includes 15 plugins for [TinyMCE](https://www.tiny.cloud/) that are automatically enabled or disabled depending on the buttons you have chosen. In addition this plugin adds options for keeping the paragraph tags in text mode and importing the CSS classes from the theme's editor-style.css. = Some of the features added by this plugin = * "Classic Paragraph" block that can be used instead of or together with the standard Paragraph block. * An option to set the Classic Paragraph or Classic block as the default block in the block editor. * Supports converting of most default blocks to classic paragraphs, and from classic paragraphs back to the default blocks. * Support for creating and editing tables in the Classic blocks and the classic editor. * More options when inserting lists in the Classic blocks and the classic editor. * Search and Replace in the Classic blocks and the classic editor. * Ability to set Font Family and Font Sizes in the Classic blocks and the classic editor. * And many others. = Privacy = TinyMCE Advanced does not collect or store any user related data. It does not set cookies, and it does not connect to any third-party websites. It only uses functionality that is available in [WordPress](https://wordpress.org/), and in the [TinyMCE editor](https://tinymce.com/). In that terms TinyMCE Advanced does not affect your website's user privacy in any way. == Installation == Best is to install directly from WordPress. If manual installation is required, please make sure that the plugin files are in a folder named "tinymce-advanced" (not two nested folders) in the WordPress plugins folder, usually "wp-content/plugins". == Changelog == = 5.4.0 = * Updated for WordPress 5.4. * Improved "Reset Table Size" to reset all table elements (tr, th, td, thead, tbody, tfoot). * Improved "Remove Table Styling" to remove all current and deprecated styling attributes from all table elements. = 5.3.0 = * Updated for WordPress 5.3 and TinyMCE 4.9.6. = 5.2.1 = * Updated for WordPress 5.2.1 and TinyMCE 4.9.4. * Fixed resetting of the advanced options on update when all were unselected. * Fixed and improved keepig of paragraph tags in the Classic block. = 5.2.0 = * Updated for WordPress 5.2. * Updated the buttons settings for the block editor toolbar. There are a few new limitations there: most buttons are now hidden in a drop-down and the users are not allowed to arrange the buttons. * Added a new advanced settings section for tables. Makes it possible to better configure how tables are edited and whether to disable use of inline CSS styles. Note that disabling inline styles would make the tables non-resizable in the editor. * Removed the option to enable pasting of image sources in some browsers. It was not working correctly. * Added a new option to always keep paragraph tags in the Classic Paragraph and Classic blocks in the block editor. * Updated exporting and importing of the settings. Now settings are exported to a (downloaded) file, and can be restored by uploading a previously exported settings file. * Improved the block editor Clear Formatting button. If some text is selected, it only clears the styling from that text. If no selection, all styling from the paragraph is cleared. = 5.0.1 = * Fixed importing of backed-up settings. * Updated the FAQ section in the readme. = 5.0.0 = * Added several new buttons to the rich-text toolbar in the block editor. * Added functionality to add, remove and arrange most buttons on the rich-text toolbar in the block editor. * Added alternative location for buttons for the rich-text component. That lets users move buttons that are not used frequently out of the way. * Added settings for selected text color and background color. * Improved fixes and enhancements for the Classic block. * Improved the Classic Paragraph block and added support for converting from most blocks to classic paragraphs, and converting a classic paragraph into separate blocks. = 4.8.2 = * Fixes and improvements for 4.8.1. * Added separate option to enable the Classic Paragraph block. * Added converting of most default blocks to classic paragraphs, and from classic paragraphs to default blocks. = 4.8.1 = * Updated for WordPress 5.0. * Added Hybrid Mode for the block editor. Includes a Classic Paragraph block that replaces the default Paragraph block. * Added option to replace the block editor with the classic editor. * Added another settings section for configuring the toolbars in the Classic block and the Classic Paragraph block. * Added some CSS fixed for the Classic block. * Fixed (removed) setting of inline CSS for table cells when inserting a table. Inline CSS is still added when a table is resized by dragging. = 4.8.0 = * Updated for WordPress 4.9.8 and TinyMCE 4.8.0. = 4.7.13 = * Updated the table and anchor plugins to 4.7.13 (2018-05-16). Fixes a bug in the table plugin in Edge. = 4.7.11 = * Updated for WordPress 4.9.6 and TinyMCE 4.7.11. = 4.6.7 = * Fixed compatibility with Gutenberg freeform block. * Forced refresh of the TinyMCE plugins after activation. * Updated for WordPress 4.9 and TinyMCE 4.6.7. = 4.6.3 = * Updated for WordPress 4.8 and TinyMCE 4.6.3. = 4.5.6 = * Updated for WordPress 4.7.4 and TinyMCE 4.5.6. * Fixed PHP notice after importing settings. = 4.4.3 = * Updated for WordPress 4.7 and TinyMCE 4.4.3. * Fixed missing "Source code" button bug. = 4.4.1 = * Updated for WordPress 4.6 and TinyMCE 4.4.1. * Fixed multisite saving bug. * Added new button in the Text editor to add or reset the line breaks. Adds line breaks only between tags. Works only when it detects that line breaks are missing so it doesn't reformat posts with removed paragraphs. = 4.3.10.1 = * Fixed adding paragraph tags when loading posts that were saved before turning `wpautop` off. * Disabled the (new) inline toolbar for tables as it was overlapping the table in some cases. = 4.3.10 = * Updated for WordPress 4.5.1 and TinyMCE 4.3.10. * Fixed support for adding editor-style.css to themes that don't have it. = 4.3.8 = * Updated for WordPress 4.5 and TinyMCE 4.3.8. * Separated standard options and admin options. * Added settings that can disable the plugin for the main editor, other editors in wp-admin or editors on the front-end. * Korean translation by Josh Kim and Greek translation by Stathis Mellios. = 4.2.8 = * Updated for WordPress 4.4 and TinyMCE 4.2.8. * Japanese translation by Manabu Miwa. = 4.2.5 = * Updated for WordPress 4.3.1 and TinyMCE 4.2.5. * Fixed text domain and plugin headers. = 4.2.3.1 = * Fix error with removing the `textpattern` plugin. = 4.2.3 = * Updated for WordPress 4.3 and TinyMCE 4.2.3. * Removed the `textpattern` plugin as WordPress 4.3 includes similar functionality by default. * French translation by Nicolas Schneider. = 4.1.9 = * Updated for WordPress 4.2 and TinyMCE 4.1.9. * Fixed bugs with showing oEmbed previews when pasting an URL. * Fixed bugs with getting the content from TinyMCE with line breaks. = 4.1.7 = * Updated for WordPress 4.1 and TinyMCE 4.1.7. * Fixed bug where consecutive caption shortcodes may be split with an empty paragraph tag. = 4.1.1 = * Fix bug with image captions when wpautop is disabled. * Add translation support to the settings page. Button names/descriptions are translated from JS using the existing WordPress translation, so this part of the settings page will be translated by default. The other text still needs separate translation. = 4.1 = * Updated for WordPress 4.0 and TinyMCE 4.1. * Add the `textpattern` plugin that supports some of the markdown syntax while typing, [(more info)](http://www.tinymce.com/wiki.php/Configuration:textpattern_patterns). * Add the updated 'table' plugin that supports background and border color. = 4.0.2 = * Fix showing of the second, third and forth button rows when the Toolbar Toggle button is not used. * Fix adding the `directionality` plugin when RTL or LTR button is selected. * Show the ''Advanced Options'' to super admins on multisite installs. * Add the `link` plugin including link rel setting. Replaces the Insert/Edit Link dialog when enabled. * Include updated ''table'' plugin that has support for vertical align for cells. = 4.0.1 = Fix warnings on pages other than Edit Post. Update the description. = 4.0 = Updated for WordPress 3.9 and TinyMCE 4.0. Refreshed the settings screen. Added support for exporting and importing of the settings. = 3.5.9.1 = Updated for WordPress 3.8, fixed auto-embedding of single line URLs when not removing paragraph tags. = 3.5.9 = Updated for WordPress 3.7 and TinyMCE 3.5.9. = 3.5.8 = Updated for WordPress 3.5 and TinyMCE 3.5.8. = 3.4.9 = Updated for WordPress 3.4 and TinyMCE 3.4.9. = 3.4.5.1 = Fixed a bug preventing TinyMCE from importing CSS classes from editor-style.css. = 3.4.5 = Updated for WordPress 3.3 or later and TinyMCE 3.4.5. = 3.4.2.1 = Fix the removal of the *media* plugin so it does not require re-saving the settings. = 3.4.2 = Compatibility with WordPress 3.2 and TinyMCE 3.4.2, removed the options for support for iframe and HTML 5.0 elements as they are supported by default in WordPress 3.2, removed the *media* plugin as it is included by default. = 3.3.9.1 = Added advanced options: stop removing iframes, stop removing HTML 5.0 elements, moved the support for custom editor styles to editor-style.css in the current theme. Attention: if you have a customized `tadv-mce.css` file and your theme doesn't have editor-style.css, please download `tadv-mce.css`, rename it to editor-style.css and upload it to your current theme directory. Alternatively you can add there the editor-style.css from the Twenty Ten theme. If your theme has editor-style.css you can add any custom styles there. = 3.3.9 = Compatibility with WordPress 3.1 and TinyMCE 3.3.9, improved P and BR tags option. = 3.2.7 = Compatibility with WordPress 2.9 and TinyMCE 3.2.7, several minor bug fixes. = 3.2.4 = Compatibility with WordPress 2.8 and TinyMCE 3.2.4, minor bug fixes. = 3.2 = Compatibility with WordPress 2.7 and TinyMCE 3.2, minor bug fixes. = 3.1 = Compatibility with WordPress 2.6 and TinyMCE 3.1, keeps empty paragraphs when disabling the removal of P and BR tags, the buttons for `MCImageManager` and `MCFileManager` can be arranged (if installed). = 3.0.1 = Compatibility with WordPress 2.5.1 and TinyMCE 3.0.7, added option to disable the removal of P and BR tags when saving and in the HTML editor (wpautop), added two more buttons to the HTML editor: `wpautop` and undo, fixed the removal of non-default TinyMCE buttons. = 3.0 = Support for WordPress 2.5 and TinyMCE 3.0. = 2.2 = Deactivate/Uninstall option page, font size drop-down menu and other small changes. = 2.1 = Improved language selection, improved compatibility with WordPress 2.3 and TinyMCE 2.1.1.1, option to override some of the imported css classes and other small improvements and bugfixes. = 2.0 = Includes an admin page for arranging the TinyMCE toolbar buttons, easy installation, a lot of bugfixes, customized "Smilies" plugin that uses the built-in WordPress smilies, etc. The admin page uses jQuery and jQuery UI that lets you "drag and drop" the TinyMCE buttons to arrange your own toolbars and enables/disables the corresponding plugins depending on the used buttons. == Frequently Asked Questions == = I see an error like: "Failed to load plugin from url..." = These errors are usually caused by the file in question being blocked by some security setting on the server, or (rarely) by caching issues or wrong permissions. The first step to debug this is to try to access the file directly in the browser (i.e. copy the URL and paste in the browser and press Enter). If you see the file (that’s usually minified JS, so it is all on one line) chances are it was some sort of caching issue that is now resolved. Try using the editor again. If you see an HTTP error (like 403 or 500) best would be to contact your web hosting company for help. In some cases deleting and re-installing the plugin may help. = Tables look different (inline styles are missing) when I insert a table = Please see the new (as of version 5.2.0) advanced settings for tables. It is possible to disable use of inline styles for tables but that would make the table non-resizable in the editor. If the advanced tabs on the table, row, and column dialogs are enabled (default), it will still be possible to enter width and height values which are set as inline styles. = No styles are imported in the Formats sub-menu = These styles are imported from your current theme editor-style.css file. However some themes do not have this functionality. For these themes TinyMCE Advanced has the option to let you add a customized editor-style.css and import it into the editor. = I have just installed this plugin, but it does not do anything = Change some buttons on one of the toolbars, save your changes, clear your browser cache, and try again. If that does not work try reloading the Edit page several times while holding down Shift. There may also be a network cache somewhere between you and your host. You may need to wait for a few hours until this cache expires. = When I add "Smilies", they do not show in the editor = The "Emoticons" button in TinyMCE adds the codes for the smilies. The actual images are added by WordPress when viewing the Post. Make sure the checkbox "Convert emoticons to graphics on display" in "Options - Writing" is checked. = The plugin does not add any buttons = Make sure the "Disable the visual editor when writing" checkbox under "Users - Your Profile" is **not** checked. = I still see the "old" buttons in the editor = Re-save the settings or click the "Restore Default Settings" button on the plugin settings page and then set the buttons again and save. = Other questions? More screenshots? = Please post on the support forum or visit the homepage for [TinyMCE Advanced](http://www.laptoptips.ca/projects/tinymce-advanced/). == Screenshots == 1. Rich-text toolbar and selected text color settings. 2. The Classic Paragraph block. 3. Converting several paragraphs into one classic paragraph. 4. Converting several paragraphs into one classic paragraph. 5. Settings for the rich-text toolbar, the Formatting toolbar and the selected text color. 6. Settings for the toolbars in Classic Paragraph and Classic blocks. 7. Additional options (defaults are shown). == Upgrade Notice == = 5.2.0 = Another large upgrade. Includes advanced options for tables, updated import and export of settings, and further improvements for the block editor. PK:\{ tadv_admin.phpnuW+Asave_settings(); } elseif ( isset( $_POST['tadv-restore-defaults'] ) ) { check_admin_referer( 'tadv-save-buttons-order' ); // TODO: only for admin || SA $this->admin_settings = $this->get_default_admin_settings(); update_option( 'tadv_admin_settings', $this->get_default_admin_settings() ); // TODO: all users that can have settings $this->user_settings = $this->get_default_user_settings(); update_option( 'tadv_settings', $this->get_default_user_settings() ); $message = '

    ' . __( 'Default settings restored.', 'tinymce-advanced' ) . '

    '; } elseif ( isset( $_POST['tadv-import-settings'] ) ) { check_admin_referer( 'tadv-save-buttons-order' ); // TODO: all users ?>


    ' . __( 'Importing of settings failed.', 'tinymce-advanced' ) . '

    '; } else { $this->save_settings( $import ); $message = '

    ' . __( 'Settings imported successfully.', 'tinymce-advanced' ) . '

    '; } } elseif ( isset( $_GET['tadv-import-file-complete'] ) ) { $err = (int) $_GET['tadv-import-file-complete']; switch( $err ) { case 1: $message = __( 'Importing of settings failed. Please import a valid settings file.', 'tinymce-advanced' ); break; case 2: $message = __( 'Importing of settings failed. The imported file is empty.', 'tinymce-advanced' ); break; case 3: $message = __( 'Importing of settings failed. The imported file is invalid.', 'tinymce-advanced' ); break; } if ( empty( $message ) ) { $message = '

    ' . __( 'Settings imported successfully.', 'tinymce-advanced' ) . '

    '; } else { $message = '

    ' . $message . '

    '; } } $this->load_settings(); if ( empty( $this->toolbar_1 ) && empty( $this->toolbar_2 ) && empty( $this->toolbar_3 ) && empty( $this->toolbar_4 ) ) { $message = '

    ' . __( 'ERROR: All toolbars are empty. Default settings loaded.', 'tinymce-advanced' ) . '

    '; $this->admin_settings = $this->get_default_admin_settings(); $this->user_settings = $this->get_default_user_settings(); $this->load_settings(); } $all_buttons = $this->get_all_buttons(); ?>

    warn_if_unsupported(); if ( isset( $_POST['tadv-save'] ) && empty( $message ) ) { ?>

    get_all_block_buttons(); $all_block_panels = $this->get_all_block_panels(); ?>


      toolbar_block as $button_id ) { if ( in_array( $button_id, $excluded_block_buttons, true ) ) { continue; } if ( isset( $all_block_buttons[ $button_id ] ) ) { $name = $all_block_buttons[ $button_id ]['name']; $icon = $all_block_buttons[ $button_id ]['icon']; unset( $all_block_buttons[ $button_id ] ); } else { continue; } ?>

      toolbar_block_side as $button_id ) { if ( isset( $all_block_buttons[ $button_id ] ) ) { $name = $all_block_buttons[ $button_id ]['name']; $icon = $all_block_buttons[ $button_id ]['icon']; unset( $all_block_buttons[ $button_id ] ); } else { continue; } ?>

      $button ) { $name = $button['name']; $icon = $button['icon']; ?>

    check_user_setting( 'selected_text_color' ) ) echo ' checked'; ?>>

    check_user_setting( 'selected_text_color' ) ) echo ' checked'; ?>>

    check_user_setting( 'selected_text_background_color' ) ) echo ' checked'; ?>>

    check_user_setting( 'selected_text_background_color' ) ) echo ' checked'; ?>>


    check_user_setting( 'menubar_block' ) ) { echo ' checked'; } ?>>

      toolbar_classic_block as $button_id ) { $name = ''; if ( strpos( $button_id, 'separator' ) !== false || in_array( $button_id, array( 'moveforward', 'movebackward', 'absolute' ) ) ) { continue; } if ( isset( $all_buttons_block[ $button_id ] ) ) { $name = $all_buttons_block[ $button_id ]; unset( $all_buttons_block[ $button_id ] ); } else { continue; } ?>

      $name ) { if ( strpos( $button_id, 'separator' ) !== false ) { continue; } ?>

    check_user_setting( 'menubar' ) ) { echo ' checked="checked"'; } ?>>

      $toolbar as $button_id ) { if ( strpos( $button_id, 'separator' ) !== false || in_array( $button_id, array( 'moveforward', 'movebackward', 'absolute' ) ) ) { continue; } if ( isset( $all_buttons_classic[ $button_id ] ) ) { $name = $all_buttons_classic[ $button_id ]; unset( $all_buttons_classic[ $button_id ] ); } else { continue; } ?>

      $name ) { if ( strpos( $button_id, 'separator' ) !== false ) { continue; } ?>

    check_user_setting( 'merge_toolbars' ) ) echo ' checked'; ?> />

    check_user_setting('advlist') ) echo ' checked'; ?> />

    check_user_setting('contextmenu') ) echo ' checked'; ?> />

    check_user_setting('advlink') ) echo ' checked'; ?> />

    check_user_setting( 'fontsize_formats' ) ) echo ' checked="checked"'; ?> />

    fontsize_formats ); ?>

    check_admin_setting( 'classic_paragraph_block' ) ) echo ' checked'; ?> />

    check_admin_setting( 'hybrid_mode' ) ) echo ' checked'; ?> />

    check_admin_setting( 'replace_block_editor' ) ) echo ' checked'; ?> />

    ', '' ); ?>

    check_admin_setting( 'no_autop' ) ) echo ' checked'; ?> />

    has_editor_style(); $disabled = ' disabled'; if ( $has_editor_style === false ) { add_editor_style(); $has_editor_style = $this->has_editor_style(); } if ( $has_editor_style ) { $disabled = ''; } ?>
    check_admin_setting( 'importcss' ) ) echo ' checked'; echo $disabled; ?> />


    check_admin_setting( 'table_resize_bars' ) ) echo ' checked'; ?> />

    check_admin_setting( 'table_default_attributes' ) ) echo ' checked'; ?> />

    check_admin_setting( 'table_grid' ) ) echo ' checked'; ?> />

    check_admin_setting( 'table_tab_navigation' ) ) echo ' checked'; ?> />

    check_admin_setting( 'table_advtab' ) ) echo ' checked'; ?> />


    ', '' ); ?>

     

    check_admin_setting( 'enable_edit_post_screen' ) ) echo ' checked'; ?> />

    check_admin_setting( 'enable_rest_of_wpadmin' ) ) echo ' checked'; ?> />

    check_admin_setting( 'enable_on_front_end' ) ) echo ' checked'; ?> />


    PK:\ !ëëtinymce-advanced.phpnuW+A 'menubar,advlist,menubar_block,merge_toolbars', 'plugins' => 'anchor,code,insertdatetime,nonbreaking,print,searchreplace,table,visualblocks,visualchars,advlist,wptadv', 'toolbar_1' => 'formatselect,bold,italic,blockquote,bullist,numlist,alignleft,aligncenter,alignright,link,unlink,undo,redo', 'toolbar_2' => 'fontselect,fontsizeselect,outdent,indent,pastetext,removeformat,charmap,wp_more,forecolor,table,wp_help', 'toolbar_3' => '', 'toolbar_4' => '', 'toolbar_classic_block' => 'formatselect,bold,italic,blockquote,bullist,numlist,alignleft,aligncenter,alignright,link,forecolor,backcolor,table,wp_help', 'toolbar_block' => 'core/image', 'toolbar_block_side' => 'tadv/sup,tadv/sub,core/strikethrough,core/code,tadv/mark,tadv/removeformat', 'panels_block' => 'tadv/color-panel,tadv/background-color-panel', ); } private function get_default_admin_settings() { return array( 'options' => 'classic_paragraph_block,table_resize_bars,table_grid,table_tab_navigation,table_advtab', ); } private function get_all_plugins() { return array( 'advlist', 'anchor', 'code', 'contextmenu', 'emoticons', 'importcss', 'insertdatetime', 'link', 'nonbreaking', 'print', 'searchreplace', 'table', 'visualblocks', 'visualchars', 'wptadv', ); } private function get_all_user_options() { return array( 'advlist', 'advlink', 'contextmenu', 'menubar', 'menubar_block', 'fontsize_formats', 'merge_toolbars', ); } private function get_all_admin_options() { return array( 'importcss', 'no_autop', 'hybrid_mode', 'classic_paragraph_block', 'replace_block_editor', 'table_resize_bars', 'table_default_attributes', 'table_grid', 'table_tab_navigation', 'table_advtab', ); } private function get_editor_locations() { return array( 'edit_post_screen', 'rest_of_wpadmin', 'on_front_end', ); } private function get_all_block_buttons() { $inline_img_icon = ''; $block_buttons = array( // 'core/bold' => array( 'name' => 'Bold', 'icon' => '' ), // 'core/italic' => array( 'name' => 'Italic', 'icon' => '' ), // 'core/link' => array( 'name' => 'Insert/edit link', 'icon' => '' ), 'core/strikethrough' => array( 'name' => 'Strikethrough', 'icon' => '' ), 'core/code' => array( 'name' => 'Code', 'icon' => '' ), 'core/image' => array( 'name' => 'Inline Image', 'icon' => '' . $inline_img_icon . '' ), 'core/text-color' => array( 'name' => 'Text Color', 'icon' => '' ), 'tadv/mark' => array( 'name' => 'Mark', 'icon' => '' ), 'tadv/removeformat' => array( 'name' => 'Clear formatting', 'icon' => '' ), 'tadv/sup' => array( 'name' => 'Superscript', 'icon' => '' ), 'tadv/sub' => array( 'name' => 'Subscript', 'icon' => '' ), 'core/underline' => array( 'name' => 'Underline', 'icon' => '' ), ); $this->all_block_buttons = $block_buttons; $this->block_buttons_filter = array_keys( $block_buttons ); return $block_buttons; } private function get_all_block_panels() { return array( 'tadv/color-panel', 'tadv/background-color-panel', ); } public function __construct() { register_activation_hook( __FILE__, array( $this, 'update_settings' ) ); if ( is_admin() ) { add_action( 'admin_menu', array( $this, 'add_menu' ) ); add_action( 'admin_enqueue_scripts', array( $this, 'enqueue_scripts' ) ); add_action( 'plugins_loaded', array( $this, 'load_textdomain' ) ); add_filter( 'plugin_action_links', array( $this, 'add_settings_link' ), 10, 2 ); add_action( 'before_wp_tiny_mce', array( $this, 'show_version_warning' ) ); add_action( 'admin_init', array( $this, 'import_export_settings_file' ) ); add_action( 'plugins_loaded', array( $this, 'update_settings' ) ); } add_filter( 'wp_editor_settings', array( $this, 'disable_for_editor' ), 10, 2 ); add_filter( 'mce_buttons', array( $this, 'mce_buttons_1' ), 999, 2 ); add_filter( 'mce_buttons_2', array( $this, 'mce_buttons_2' ), 999, 2 ); add_filter( 'mce_buttons_3', array( $this, 'mce_buttons_3' ), 999, 2 ); add_filter( 'mce_buttons_4', array( $this, 'mce_buttons_4' ), 999, 2 ); add_filter( 'tiny_mce_before_init', array( $this, 'mce_options' ), 10, 2 ); add_filter( 'mce_external_plugins', array( $this, 'mce_external_plugins' ), 999 ); add_filter( 'tiny_mce_plugins', array( $this, 'tiny_mce_plugins' ), 999 ); add_action( 'enqueue_block_editor_assets', array( $this, 'block_editor_assets' ), 20 ); add_action( 'init', array( $this, 'block_editor_init' ) ); add_filter( 'wp_insert_post_data', array( $this, 'filter_post_content' ), 1 ); add_filter( 'excerpt_allowed_blocks', array( $this, 'excerpt_add_allowed_blocks' ) ); } public function disable_for_editor( $settings, $editor_id ) { static $editor_style_added = false; if ( empty( $this->admin_settings ) ) { $this->load_settings(); } $this->disabled_for_editor = false; $this->editor_id = $editor_id; if ( ! empty( $this->admin_settings['disabled_editors'] ) ) { $disabled_editors = explode( ',', $this->admin_settings['disabled_editors'] ); $current_screen = isset( $GLOBALS['current_screen'] ) ? $GLOBALS['current_screen'] : new stdClass; if ( is_admin() ) { if ( $editor_id === 'content' && ( $current_screen->id === 'post' || $current_screen->id === 'page' ) ) { if ( in_array( 'edit_post_screen', $disabled_editors, true ) ) { $this->disabled_for_editor = true; } } elseif ( in_array( 'rest_of_wpadmin', $disabled_editors, true ) ) { $this->disabled_for_editor = true; } } elseif ( in_array( 'on_front_end', $disabled_editors, true ) ) { $this->disabled_for_editor = true; } } if ( ! $this->disabled_for_editor && ! $editor_style_added ) { if ( $this->check_admin_setting( 'importcss' ) && $this->has_editor_style() === false ) { add_editor_style(); } $editor_style_added = true; } return $settings; } private function is_disabled() { return $this->disabled_for_editor; } private function has_editor_style() { if ( ! current_theme_supports( 'editor-style' ) ) { return false; } $editor_stylesheets = get_editor_stylesheets(); if ( is_array( $editor_stylesheets ) ) { foreach ( $editor_stylesheets as $url ) { if ( strpos( $url, 'editor-style.css' ) !== false ) { return $url; } } } return ''; } public function load_textdomain() { load_plugin_textdomain( 'tinymce-advanced', false, 'tinymce-advanced/langs' ); } public function enqueue_scripts( $page ) { if ( 'settings_page_tinymce-advanced' === $page ) { $plugin_url = plugins_url( 'plugin-assets', __FILE__ ); wp_enqueue_style( 'tadv-css', $plugin_url . '/tadv.css', array( 'editor-buttons' ), $this->plugin_version ); wp_enqueue_script( 'tadv-js', $plugin_url . '/tadv.js', array( 'jquery-ui-sortable' ), $this->plugin_version, true ); wp_enqueue_style( 'tadv-mce-skin', includes_url( 'js/tinymce/skins/lightgray/skin.min.css' ), array(), $this->plugin_version ); add_action( 'admin_footer', array( $this, 'load_mce_translation' ) ); } } public function load_mce_translation() { if ( ! class_exists( '_WP_Editors' ) ) { require( ABSPATH . WPINC . '/class-wp-editor.php' ); } ?> admin_settings ) ) { $this->admin_settings = get_option( 'tadv_admin_settings', false ); } if ( empty( $this->user_settings ) ) { $this->user_settings = get_option( 'tadv_settings', false ); } // load defaults if the options don't exist... if ( $this->admin_settings === false ) { $this->admin_settings = $this->get_default_admin_settings(); } $this->admin_options = ! empty( $this->admin_settings['options'] ) ? explode( ',', $this->admin_settings['options'] ) : array(); $default_user_settings = $this->get_default_user_settings(); if ( $this->user_settings === false ) { $this->user_settings = $default_user_settings; } if ( empty( $this->user_settings['toolbar_1'] ) ) { $this->user_settings['toolbar_1'] = $default_user_settings['toolbar_1']; } if ( empty( $this->user_settings['toolbar_classic_block'] ) ) { $this->user_settings['toolbar_classic_block'] = $default_user_settings['toolbar_classic_block']; } if ( empty( $this->user_settings['toolbar_block'] ) ) { $this->user_settings['toolbar_block'] = $default_user_settings['toolbar_block']; } $this->options = ! empty( $this->user_settings['options'] ) ? explode( ',', $this->user_settings['options'] ) : array(); $this->plugins = ! empty( $this->user_settings['plugins'] ) ? explode( ',', $this->user_settings['plugins'] ) : array(); $this->toolbar_1 = ! empty( $this->user_settings['toolbar_1'] ) ? explode( ',', $this->user_settings['toolbar_1'] ) : array(); $this->toolbar_2 = ! empty( $this->user_settings['toolbar_2'] ) ? explode( ',', $this->user_settings['toolbar_2'] ) : array(); $this->toolbar_3 = ! empty( $this->user_settings['toolbar_3'] ) ? explode( ',', $this->user_settings['toolbar_3'] ) : array(); $this->toolbar_4 = ! empty( $this->user_settings['toolbar_4'] ) ? explode( ',', $this->user_settings['toolbar_4'] ) : array(); $this->toolbar_classic_block = ! empty( $this->user_settings['toolbar_classic_block'] ) ? explode( ',', $this->user_settings['toolbar_classic_block'] ) : array(); $this->toolbar_block = ! empty( $this->user_settings['toolbar_block'] ) ? explode( ',', $this->user_settings['toolbar_block'] ) : array(); $this->toolbar_block_side = ! empty( $this->user_settings['toolbar_block_side'] ) ? explode( ',', $this->user_settings['toolbar_block_side'] ) : array(); $this->panels_block = ! empty( $this->user_settings['panels_block'] ) ? explode( ',', $this->user_settings['panels_block'] ) : array(); $this->used_buttons = array_merge( $this->toolbar_1, $this->toolbar_2, $this->toolbar_3, $this->toolbar_4, $this->toolbar_classic_block ); $this->used_block_buttons = array_merge( $this->toolbar_block, $this->toolbar_block_side ); $this->get_all_buttons(); // Force refresh after activation. if ( ! empty( $GLOBALS['tinymce_version'] ) && strpos( $GLOBALS['tinymce_version'], '-tadv-' ) === false ) { $GLOBALS['tinymce_version'] .= '-tadv-' . $this->plugin_version; } } public function show_version_warning() { if ( is_admin() && current_user_can( 'update_plugins' ) && get_current_screen()->base === 'post' ) { $this->warn_if_unsupported(); } } public function warn_if_unsupported() { if ( ! $this->check_minimum_supported_version() ) { $wp_version = ! empty( $GLOBALS['wp_version'] ) ? $GLOBALS['wp_version'] : '(undefined)'; ?>

    required_wp_version, esc_html( $wp_version ) ); echo '
    '; printf( __( 'Please upgrade your WordPress installation or download an older version of the plugin.', 'tinymce-advanced' ), 'https://wordpress.org/plugins/tinymce-advanced/advanced/#download-previous-link' ); ?>

    required_wp_version, '>=' ) ); } public function update_settings() { $version = (int) get_option( 'tadv_version', 0 ); if ( $version >= $this->plugin_version ) { return; } if ( ! $version || $version < 4000 ) { // First install or upgrade to TinyMCE 4.0 $this->user_settings = $this->get_default_user_settings(); $this->admin_settings = $this->get_default_admin_settings(); update_option( 'tadv_settings', $this->user_settings ); update_option( 'tadv_admin_settings', $this->admin_settings ); // Clean out old options delete_option('tadv_options'); delete_option('tadv_toolbars'); delete_option('tadv_plugins'); delete_option('tadv_btns1'); delete_option('tadv_btns2'); delete_option('tadv_btns3'); delete_option('tadv_btns4'); delete_option('tadv_allbtns'); } else { $admin_settings = get_option( 'tadv_admin_settings', false ); $user_settings = get_option( 'tadv_settings', false ); $user_defaults = $this->get_default_user_settings(); if ( $version < 5000 ) { // Update for WP 5.0 $admin_5000 = ! empty( $admin_settings['options'] ) ? $admin_settings['options'] : ''; $user_5000 = ! empty( $user_settings['options'] ) ? $user_settings['options'] : ''; if ( empty( $admin_5000 ) ) { $admin_5000 = 'hybrid_mode,classic_paragraph_block'; } elseif ( strpos( $admin_5000, 'no_hybrid_mode' ) !== false ) { $admin_5000 = str_replace( 'no_hybrid_mode', 'classic_paragraph_block', $admin_5000 ); } else { $admin_5000 .= ',hybrid_mode,classic_paragraph_block'; } if ( empty( $user_5000 ) ) { $user_5000 = 'menubar_block,merge_toolbars'; } elseif ( strpos( $user_5000, 'no_merge_toolbars' ) !== false ) { $user_5000 = str_replace( 'no_merge_toolbars', 'menubar_block', $user_5000 ); } else { $user_5000 .= ',menubar_block,merge_toolbars'; } if ( empty( $user_settings['toolbar_block'] ) ) { $user_settings['toolbar_block'] = $user_defaults['toolbar_block']; $user_settings['toolbar_block_side'] = $user_defaults['toolbar_block_side']; $user_settings['panels_block'] = $user_defaults['panels_block']; } $admin_settings['options'] = $admin_5000; $user_settings['options'] = $user_5000; } if ( $version < 5200 ) { // Update for 5.2, table options if ( empty( $admin_settings ) || ! is_array( $admin_settings ) ) { $admin_settings = array( 'options' => 'table_resize_bars,table_grid,table_tab_navigation,table_advtab', ); } elseif ( empty( $admin_settings['options'] ) || ! is_string( $admin_settings['options'] ) ) { $admin_settings['options'] = 'table_resize_bars,table_grid,table_tab_navigation,table_advtab'; } else { $admin_settings['options'] .= ',table_resize_bars,table_grid,table_tab_navigation,table_advtab'; } if ( ! empty( $user_settings['toolbar_block'] ) ) { // Remove previously manageable buttons... $toolbar_block_5200 = str_replace( array( 'core/bold', 'core/italic', 'core/link' ), '', $user_settings['toolbar_block'] ); $user_settings['toolbar_block'] = trim( $toolbar_block_5200, ' ,' ); } if ( empty( $user_settings['toolbar_block'] ) ) { $user_settings['toolbar_block'] = 'core/image'; } else { $user_settings['toolbar_block'] = $user_settings['toolbar_block'] . ',core/image'; } } // Add the new text colot popup in 5.4 if 'tadv/color-panel' is not enabled. // 'core/text-color' duplicates the functionality... if ( $version < 5400 ) { if ( ! empty( $user_settings['panels_block'] ) && is_string( $user_settings['panels_block'] ) ) { $has_color_panel = ( strpos( $user_settings['panels_block'], 'tadv/color-panel' ) !== false ); } else { $has_color_panel = false; } if ( ! $has_color_panel ) { if ( empty( $user_settings['toolbar_block'] ) ) { $user_settings['toolbar_block'] = 'core/text-color'; } else { $user_settings['toolbar_block'] = $user_settings['toolbar_block'] . ',core/text-color'; } } } update_option( 'tadv_admin_settings', $admin_settings ); update_option( 'tadv_settings', $user_settings ); } // Current version update_option( 'tadv_version', $this->plugin_version ); } public function get_all_buttons() { if ( ! empty( $this->all_buttons ) ) { return $this->all_buttons; } $buttons = array( // Core 'bold' => 'Bold', 'italic' => 'Italic', 'underline' => 'Underline', 'strikethrough' => 'Strikethrough', 'alignleft' => 'Align left', 'aligncenter' => 'Align center', 'alignright' => 'Align right', 'alignjustify' => 'Justify', 'styleselect' => 'Formats', 'formatselect' => 'Paragraph', 'fontselect' => 'Font Family', 'fontsizeselect' => 'Font Sizes', 'cut' => 'Cut', 'copy' => 'Copy', 'paste' => 'Paste', 'bullist' => 'Bulleted list', 'numlist' => 'Numbered list', 'outdent' => 'Decrease indent', 'indent' => 'Increase indent', 'blockquote' => 'Blockquote', 'undo' => 'Undo', 'redo' => 'Redo', 'removeformat' => 'Clear formatting', 'subscript' => 'Subscript', 'superscript' => 'Superscript', // From plugins 'hr' => 'Horizontal line', 'link' => 'Insert/edit link', 'unlink' => 'Remove link', 'image' => 'Insert/edit image', 'charmap' => 'Special character', 'pastetext' => 'Paste as text', 'print' => 'Print', 'anchor' => 'Anchor', 'searchreplace' => 'Find and replace', 'visualblocks' => 'Show blocks', 'visualchars' => 'Show invisible characters', 'code' => 'Source code', 'wp_code' => 'Code', 'fullscreen' => 'Fullscreen', 'insertdatetime' => 'Insert date/time', 'media' => 'Insert/edit video', 'nonbreaking' => 'Nonbreaking space', 'table' => 'Table', 'ltr' => 'Left to right', 'rtl' => 'Right to left', 'emoticons' => 'Emoticons', 'forecolor' => 'Text color', 'backcolor' => 'Background color', // WP 'wp_adv' => 'Toolbar Toggle', 'wp_help' => 'Keyboard Shortcuts', 'wp_more' => 'Read more...', 'wp_page' => 'Page break', 'tadv_mark' => 'Mark', ); // add/remove allowed buttons $buttons = apply_filters( 'tadv_allowed_buttons', $buttons ); $this->all_buttons = $buttons; $this->buttons_filter = array_keys( $buttons ); return $buttons; } public function get_plugins( $plugins = array() ) { if ( ! is_array( $this->used_buttons ) ) { $this->load_settings(); } if ( in_array( 'anchor', $this->used_buttons, true ) ) $plugins[] = 'anchor'; if ( in_array( 'visualchars', $this->used_buttons, true ) ) $plugins[] = 'visualchars'; if ( in_array( 'visualblocks', $this->used_buttons, true ) ) $plugins[] = 'visualblocks'; if ( in_array( 'nonbreaking', $this->used_buttons, true ) ) $plugins[] = 'nonbreaking'; if ( in_array( 'emoticons', $this->used_buttons, true ) ) $plugins[] = 'emoticons'; if ( in_array( 'insertdatetime', $this->used_buttons, true ) ) $plugins[] = 'insertdatetime'; if ( in_array( 'table', $this->used_buttons, true ) ) $plugins[] = 'table'; if ( in_array( 'print', $this->used_buttons, true ) ) $plugins[] = 'print'; if ( in_array( 'searchreplace', $this->used_buttons, true ) ) $plugins[] = 'searchreplace'; if ( in_array( 'code', $this->used_buttons, true ) ) $plugins[] = 'code'; // From options if ( $this->check_user_setting( 'advlist' ) ) $plugins[] = 'advlist'; if ( $this->check_user_setting( 'advlink' ) ) $plugins[] = 'link'; if ( $this->check_admin_setting( 'importcss' ) ) $plugins[] = 'importcss'; if ( $this->check_user_setting( 'contextmenu' ) ) $plugins[] = 'contextmenu'; // add/remove used plugins $plugins = apply_filters( 'tadv_used_plugins', $plugins, $this->used_buttons ); return array_unique( $plugins ); } private function check_user_setting( $setting ) { if ( ! is_array( $this->options ) ) { $this->load_settings(); } // Back-compat for 'fontsize_formats' if ( $setting === 'fontsize_formats' && $this->check_admin_setting( 'fontsize_formats' ) ) { return true; } if ( $setting === 'selected_text_color' ) { return in_array( 'tadv/color-panel', $this->panels_block, true ); } if ( $setting === 'selected_text_background_color' ) { return in_array( 'tadv/background-color-panel', $this->panels_block, true ); } return in_array( $setting, $this->options, true ); } private function check_admin_setting( $setting ) { if ( ! is_array( $this->admin_options ) ) { $this->load_settings(); } if ( strpos( $setting, 'enable_' ) === 0 ) { $disabled_editors = ! empty( $this->admin_settings['disabled_editors'] ) ? explode( ',', $this->admin_settings['disabled_editors'] ) : array(); return ! in_array( str_replace( 'enable_', '', $setting ), $disabled_editors ); } return in_array( $setting, $this->admin_options, true ); } public function mce_buttons_1( $original, $editor_id ) { if ( $this->is_disabled() ) { return $original; } if ( ! is_array( $this->options ) ) { $this->load_settings(); } if ( $editor_id === 'classic-block' ) { $buttons_1 = $this->toolbar_classic_block; } else { $buttons_1 = $this->toolbar_1; } if ( is_array( $original ) && ! empty( $original ) ) { $original = array_diff( $original, $this->buttons_filter ); $buttons_1 = array_merge( $buttons_1, $original ); } return $buttons_1; } public function mce_buttons_2( $original, $editor_id ) { if ( $this->is_disabled() ) { return $original; } if ( ! is_array( $this->options ) ) { $this->load_settings(); } if ( $editor_id === 'classic-block' ) { $buttons_2 = array(); } else { $buttons_2 = $this->toolbar_2; } if ( is_array( $original ) && ! empty( $original ) ) { $original = array_diff( $original, $this->buttons_filter ); $buttons_2 = array_merge( $buttons_2, $original ); } return $buttons_2; } public function mce_buttons_3( $original, $editor_id ) { if ( $this->is_disabled() ) { return $original; } if ( ! is_array( $this->options ) ) { $this->load_settings(); } if ( $editor_id === 'classic-block' ) { $buttons_3 = array(); } else { $buttons_3 = $this->toolbar_3; } if ( is_array( $original ) && ! empty( $original ) ) { $original = array_diff( $original, $this->buttons_filter ); $buttons_3 = array_merge( $buttons_3, $original ); } return $buttons_3; } public function mce_buttons_4( $original, $editor_id ) { if ( $this->is_disabled() ) { return $original; } if ( ! is_array( $this->options ) ) { $this->load_settings(); } if ( $editor_id === 'classic-block' ) { $buttons_4 = array(); } else { $buttons_4 = $this->toolbar_4; } if ( is_array( $original ) && ! empty( $original ) ) { $original = array_diff( $original, $this->buttons_filter ); $buttons_4 = array_merge( $buttons_4, $original ); } return $buttons_4; } public function mce_options( $init, $editor_id = '' ) { if ( $this->is_disabled() ) { return $init; } $init['image_advtab'] = true; $init['rel_list'] = '[{text: "None", value: ""}, {text: "Nofollow", value: "nofollow noreferrer"}]'; // Prevent user errors. $init['removed_menuitems'] = 'newdocument'; if ( $this->check_admin_setting( 'no_autop' ) ) { $init['wpautop'] = false; $init['indent'] = true; $init['tadv_noautop'] = true; } if ( $editor_id === 'classic-block' ) { if ( $this->check_user_setting( 'menubar_block' ) ) { $init['menubar'] = true; } if ( $this->check_user_setting( 'merge_toolbars' ) && ! empty( $init['toolbar1'] ) && is_string( $init['toolbar1'] ) ) { if ( ! empty( $init['toolbar2'] ) && is_string( $init['toolbar2'] ) ) { $init['toolbar1'] = $init['toolbar1'] . ',' . $init['toolbar2']; $init['toolbar2'] = ''; } if ( ! empty( $init['toolbar3'] ) && is_string( $init['toolbar3'] ) ) { $init['toolbar1'] = $init['toolbar1'] . ',' . $init['toolbar3']; $init['toolbar3'] = ''; } if ( ! empty( $init['toolbar4'] ) && is_string( $init['toolbar4'] ) ) { $init['toolbar1'] = $init['toolbar1'] . ',' . $init['toolbar4']; $init['toolbar4'] = ''; } } } else { if ( $this->check_user_setting( 'menubar' ) ) { $init['menubar'] = true; } } if ( ! in_array( 'wp_adv', $this->toolbar_1, true ) ) { $init['wordpress_adv_hidden'] = false; } if ( $this->check_admin_setting( 'importcss' ) ) { $init['importcss_file_filter'] = 'editor-style.css'; } if ( $this->check_user_setting( 'fontsize_formats' ) ) { $init['fontsize_formats'] = $this->fontsize_formats; } if ( in_array( 'table', $this->plugins, true ) ) { $init['table_toolbar'] = false; // Prefer percentage values $init['table_responsive_width'] = true; if ( ! $this->check_admin_setting( 'table_resize_bars' ) ) { $init['table_resize_bars'] = false; $init['object_resizing'] = 'img'; } if ( ! $this->check_admin_setting( 'table_default_attributes' ) ) { $init['table_default_attributes'] = '{}'; } if ( ! $this->check_admin_setting( 'table_grid' ) ) { $init['table_grid'] = false; } if ( ! $this->check_admin_setting( 'table_tab_navigation' ) ) { $init['table_tab_navigation'] = false; } if ( ! $this->check_admin_setting( 'table_advtab' ) ) { $init['table_advtab'] = false; $init['table_cell_advtab'] = false; $init['table_row_advtab'] = false; $init['table_appearance_options'] = false; } } return $init; } public function block_editor_assets() { $plugin_url = plugins_url( 'block-editor', __FILE__ ); if ( ! is_array( $this->admin_options ) ) { $this->load_settings(); } if ( $this->check_admin_setting( 'hybrid_mode' ) || $this->check_admin_setting( 'classic_paragraph_block' ) ) { $strings = array(); $dependencies = array( 'wp-element', 'wp-components', 'wp-i18n', 'wp-keycodes', 'wp-blocks', 'wp-edit-post', 'wp-hooks', 'lodash' ); wp_enqueue_script( 'tadv-classic-paragraph', $plugin_url . '/classic-paragraph.js', $dependencies, $this->plugin_version ); if ( $this->check_admin_setting( 'classic_paragraph_block' ) ) { $strings = array( 'classicParagraphTitle' => __( 'Classic Paragraph', 'tinymce-advanced' ), 'classicParagraph' => 'yes', 'description' => __( 'For use instead of the Paragraph Block. Supports transforming to and from multiple Paragraph blocks, Image, Table, List, Quote, Custom HTML, and most other blocks.', 'tinymce-advanced' ), ); wp_enqueue_style( 'tadv-classic-paragraph-styles', $plugin_url . '/classic-paragraph.css', array(), $this->plugin_version ); } if ( $this->check_admin_setting( 'hybrid_mode' ) ) { $strings['hybridMode'] = 'yes'; } wp_localize_script( 'tadv-classic-paragraph', 'tadvBlockRegister', $strings ); } // Block editor toolbars if ( ! empty( $this->toolbar_block ) || ! empty( $this->toolbar_block_side ) || ! empty( $this->panels_block ) ) { $dependencies = array( 'wp-element', 'wp-components', 'wp-i18n', 'wp-editor', 'wp-rich-text' ); wp_enqueue_script( 'tadv-block-buttons', $plugin_url . '/richtext-buttons.js', $dependencies, $this->plugin_version ); $all_block_buttons = $this->get_all_block_buttons(); $all_block_buttons = array_keys( $all_block_buttons ); $unusedButtons = array_diff( $all_block_buttons, $this->toolbar_block, $this->toolbar_block_side ); $strings = array( 'buttons' => implode( ',', $this->toolbar_block ), 'panelButtons' => implode( ',', $this->toolbar_block_side ), 'unusedButtons' => implode( ',', $unusedButtons ), 'colorPanel' => implode( ',', $this->panels_block ), // Strings 'strFormatting' => __( 'Formatting', 'tinymce-advanced' ), 'strRemoveFormatting' => __( 'Clear formatting', 'tinymce-advanced' ), 'strSuperscript' => __( 'Superscript', 'tinymce-advanced' ), 'strSubscript' => __( 'Subscript', 'tinymce-advanced' ), 'strMark' => __( 'Mark', 'tinymce-advanced' ), 'strUnderline' => __( 'Underline', 'tinymce-advanced' ), 'strTextColor' => __( 'Text Color', 'tinymce-advanced' ), 'strTextColorLabel' => __( 'Selected text color', 'tinymce-advanced' ), 'strBackgroundColor' => __( 'Text Background Color', 'tinymce-advanced' ), 'strBackgroundColorLabel' => __( 'Selected text background color', 'tinymce-advanced' ), ); wp_localize_script( 'tadv-block-buttons', 'tadvBlockButtons', $strings ); wp_enqueue_style( 'tadv-block-buttons-styles', $plugin_url . '/richtext-buttons.css', array(), $this->plugin_version ); } wp_enqueue_style( 'tadv-block-editor-styles', $plugin_url . '/tma-block-editor.css', array(), $this->plugin_version ); } public function block_editor_init() { if ( $this->check_admin_setting( 'replace_block_editor' ) && ! class_exists( 'Classic_Editor' ) ) { add_filter( 'use_block_editor_for_post_type', '__return_false', 1000 ); } } public function filter_post_content( $data ) { $content = $data['post_content']; // Fix for the fix to keep

    tags inside the classic block :-( // $data is slashed... if ( strpos( $content, '

    ' ) !== false ) { $content = str_replace( '

    ', '

    ', $content ); } $data['post_content'] = $content; return $data; } // Excerpts can be generated from classic paragraph blocks public function excerpt_add_allowed_blocks( $allowed_blocks ) { // Make sure a plugin doesn't pass the wrong type here... $allowed_blocks = (array) $allowed_blocks; $allowed_blocks[] = 'tadv/classic-paragraph'; return $allowed_blocks; } public function mce_external_plugins( $mce_plugins ) { if ( ! is_array( $this->options ) ) { $this->load_settings(); } if ( $this->is_disabled() ) { return $mce_plugins; } if ( ! is_array( $this->plugins ) ) { $this->plugins = array(); } $this->plugins[] = 'wptadv'; if ( $this->check_user_setting( 'menubar' ) || $this->check_user_setting( 'menubar_block' ) ) { $this->plugins = array_merge( $this->plugins, $this->required_menubar_plugins ); } $this->plugins = array_intersect( $this->plugins, $this->get_all_plugins() ); $plugin_url = plugins_url( 'mce/', __FILE__ ); $mce_plugins = (array) $mce_plugins; $suffix = defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG ? '' : '.min'; foreach ( $this->plugins as $plugin ) { $mce_plugins["$plugin"] = $plugin_url . $plugin . "/plugin{$suffix}.js"; } return $mce_plugins; } public function tiny_mce_plugins( $plugins ) { if ( $this->is_disabled() ) { return $plugins; } if ( in_array( 'image', $this->used_buttons, true ) && ! in_array( 'image', $plugins, true ) ) { $plugins[] = 'image'; } if ( ( in_array( 'rtl', $this->used_buttons, true ) || in_array( 'ltr', $this->used_buttons, true ) ) && ! in_array( 'directionality', (array) $plugins, true ) ) { $plugins[] = 'directionality'; } return $plugins; } private function parse_buttons( $toolbar_id = false, $buttons = false ) { if ( $toolbar_id && ! $buttons && ! empty( $_POST[$toolbar_id] ) ) $buttons = $_POST[$toolbar_id]; if ( is_array( $buttons ) ) { $_buttons = array_map( array( @$this, 'filter_name' ), $buttons ); return implode( ',', array_filter( $_buttons ) ); } return ''; } private function filter_name( $str ) { if ( empty( $str ) || ! is_string( $str ) ) return ''; // Button names return preg_replace( '/[^a-z0-9_]/i', '', $str ); } private function sanitize_settings( $settings ) { $_settings = array(); if ( ! is_array( $settings ) ) { return $_settings; } foreach( $settings as $name => $value ) { $name = preg_replace( '/[^a-z0-9_]+/', '', $name ); if ( strpos( $name, 'toolbar_' ) === 0 ) { $_settings[$name] = $this->parse_buttons( false, explode( ',', $value ) ); } else if ( 'options' === $name || 'plugins' === $name || 'disabled_plugins' === $name ) { $_settings[$name] = preg_replace( '/[^a-z0-9_,]+/', '', $value ); } } return $_settings; } /** * Validare array of settings against a whitelist. * * @param array $settings The settings. * @param array $checklist The whitelist. * @return string The validated settings CSV. */ private function validate_settings( $settings, $checklist ) { if ( empty( $settings ) ) { return ''; } elseif ( is_string( $settings ) ) { $settings = explode( ',', $settings ); } elseif ( ! is_array( $settings ) ) { return ''; } $_settings = array(); foreach ( $settings as $value ) { if ( in_array( $value, $checklist, true ) ) { $_settings[] = $value; } } return implode( ',', $_settings ); } private function save_settings( $all_settings = null ) { $settings = $user_settings = array(); $default_settings = $this->get_default_user_settings(); if ( empty( $this->buttons_filter ) ) { $this->get_all_buttons(); } if ( ! empty( $all_settings['settings'] ) ) { $user_settings = $all_settings['settings']; } for ( $i = 1; $i < 6; $i++ ) { $toolbar_name = ( $i < 5 ) ? 'toolbar_' . $i : 'toolbar_classic_block'; if ( ! empty( $user_settings[ $toolbar_name ] ) ) { $toolbar = explode( ',', $user_settings[ $toolbar_name ] ); } elseif ( ! empty( $_POST[ $toolbar_name ] ) && is_array( $_POST[ $toolbar_name ] ) ) { $toolbar = $_POST[ $toolbar_name ]; } else { $toolbar = array(); } if ( $i > 1 && in_array( 'wp_adv', $toolbar, true ) ) { $toolbar = array_diff( $toolbar, array( 'wp_adv' ) ); } $settings[ $toolbar_name ] = $this->validate_settings( $toolbar, $this->buttons_filter ); } // Block editor toolbar if ( empty( $this->block_buttons_filter ) ) { $this->get_all_block_buttons(); } if ( ! empty( $user_settings[ 'toolbar_block' ] ) ) { $settings[ 'toolbar_block' ] = $this->validate_settings( $user_settings[ 'toolbar_block' ], $this->block_buttons_filter ); } elseif ( ! empty( $_POST[ 'toolbar_block' ] ) && is_array( $_POST[ 'toolbar_block' ] ) ) { $settings[ 'toolbar_block' ] = $this->validate_settings( $_POST[ 'toolbar_block' ], $this->block_buttons_filter ); } else { $settings[ 'toolbar_block' ] = ''; } if ( ! empty( $user_settings[ 'toolbar_block_side' ] ) ) { $settings[ 'toolbar_block_side' ] = $this->validate_settings( $user_settings[ 'toolbar_block_side' ], $this->block_buttons_filter ); } elseif ( ! empty( $_POST[ 'toolbar_block_side' ] ) && is_array( $_POST[ 'toolbar_block_side' ] ) ) { $settings[ 'toolbar_block_side' ] = $this->validate_settings( $_POST[ 'toolbar_block_side' ], $this->block_buttons_filter ); } else { $settings[ 'toolbar_block_side' ] = ''; } if ( ! empty( $user_settings[ 'panels_block' ] ) ) { $panels_block = $this->validate_settings( explode( ',', $user_settings[ 'panels_block' ] ), $this->get_all_block_panels() ); } else { $panels_block = array(); if ( ! empty( $_POST[ 'selected_text_color' ] ) && $_POST[ 'selected_text_color' ] === 'yes' ) { $panels_block[] = 'tadv/color-panel'; } if ( ! empty( $_POST[ 'selected_text_background_color' ] ) && $_POST[ 'selected_text_background_color' ] === 'yes' ) { $panels_block[] = 'tadv/background-color-panel'; } // core/text-color is a duplicate of tadv/color-panel :( // Remove it if both are set $toolbar_block = explode( ',', $settings[ 'toolbar_block' ] ); if ( in_array( 'tadv/color-panel', $panels_block, true ) && in_array( 'core/text-color', $toolbar_block, true ) ) { $toolbar_block = array_diff( $toolbar_block, array( 'core/text-color' ) ); $settings[ 'toolbar_block' ] = implode( ',', $toolbar_block ); } $panels_block = implode( ',', $panels_block ); } $settings[ 'panels_block' ] = $panels_block; if ( ! empty( $user_settings['options'] ) ) { $options = explode( ',', $user_settings['options'] ); } elseif ( ! empty( $_POST['options'] ) && is_array( $_POST['options'] ) ) { $options = $_POST['options']; } else { $options = array(); } $settings['options'] = $this->validate_settings( $options, $this->get_all_user_options() ); if ( ! empty( $user_settings['plugins'] ) ) { $plugins = explode( ',', $user_settings['plugins'] ); } else { $plugins = array(); } if ( ! empty( $settings['options']['menubar'] ) || ! empty( $settings['options']['menubar_block'] ) ) { $plugins = array_merge( $plugins, $this->required_menubar_plugins ); } // Merge the submitted plugins with plugins needed for the buttons. $this->user_settings = $settings; $this->load_settings(); $plugins = $this->get_plugins( $plugins ); $settings['plugins'] = $this->validate_settings( $plugins, $this->get_all_plugins() ); $this->user_settings = $settings; $this->load_settings(); // Save the new settings. update_option( 'tadv_settings', $settings ); if ( ! is_multisite() || current_user_can( 'manage_sites' ) ) { $this->save_admin_settings( $all_settings ); } } private function save_admin_settings( $all_settings = null ) { $admin_settings = $save_admin_settings = array(); if ( ! empty( $all_settings['admin_settings'] ) ) { $admin_settings = $all_settings['admin_settings']; } if ( ! empty( $admin_settings ) ) { if ( ! empty( $admin_settings['options'] ) ) { $save_admin_settings['options'] = $this->validate_settings( $admin_settings['options'], $this->get_all_admin_options() ); } else { $save_admin_settings['options'] = ''; } $disabled_editors = array_intersect( $this->get_editor_locations(), explode( ',', $admin_settings['disabled_editors'] ) ); } elseif ( isset( $_POST['tadv-save'] ) ) { if ( ! empty( $_POST['admin_options'] ) && is_array( $_POST['admin_options'] ) ) { $save_admin_settings['options'] = $this->validate_settings( $_POST['admin_options'], $this->get_all_admin_options() ); } if ( ! empty( $_POST['tadv_enable_at'] ) && is_array( $_POST['tadv_enable_at'] ) ) { $tadv_enable_at = $_POST['tadv_enable_at']; } else { $tadv_enable_at = array(); } $disabled_editors = array_diff( $this->get_editor_locations(), $tadv_enable_at ); } else { return; } $save_admin_settings['disabled_editors'] = implode( ',', $disabled_editors ); $this->admin_settings = $save_admin_settings; update_option( 'tadv_admin_settings', $save_admin_settings ); } private function import_from_file() { if ( empty( $_FILES['tadv-import']['name'] ) ) { return 1; } $file_type = wp_check_filetype( $_FILES['tadv-import']['name'], array( 'json' => 'application/json' ) ); if ( $file_type['ext'] !== 'json' ) { return 1; } $settings = @file_get_contents( $_FILES['tadv-import']['tmp_name'] ); if ( empty( $settings ) ) { return 2; } $settings = json_decode( $settings, true ); if ( ! is_array( $settings ) ) { return 3; } $this->save_settings( $settings ); return 0; } public function import_export_settings_file() { if ( ! current_user_can( 'manage_options' ) ) { return; } if ( isset( $_POST['tadv-import-file'] ) && isset( $_POST['tadv-import-settings-nonce'] ) && wp_verify_nonce( $_POST['tadv-import-settings-nonce'], 'tadv-import-settings' ) ) { $err = $this->import_from_file(); $url = admin_url( 'options-general.php?page=tinymce-advanced' ); $url = add_query_arg( 'tadv-import-file-complete', $err, $url ); wp_safe_redirect( $url ); exit; } elseif ( isset( $_POST['tadv-export-settings'] ) && isset( $_POST['tadv-export-settings-nonce'] ) && wp_verify_nonce( $_POST['tadv-export-settings-nonce'], 'tadv-export-settings' ) ) { $this->load_settings(); $output = array( 'settings' => $this->user_settings ); // TODO: only admin || SA $output['admin_settings'] = $this->admin_settings; $sitename = get_bloginfo( 'name' ); if ( mb_strlen( $sitename ) > 100 ) { $sitename = mb_substr( $sitename, 0, 100 ); } $sitename = preg_replace( '/[ \.-]+/', '-', $sitename ); $date = date( 'Y-m-d' ); $filename = sanitize_file_name( $sitename . '-TMA-settings-' . $date . '.json' ); nocache_headers(); header( 'Content-Type: application/json; charset=utf-8' ); header( "Content-Disposition: attachment; filename=$filename" ); echo wp_json_encode( $output ); exit; } } public function settings_page() { if ( ! defined( 'TADV_ADMIN_PAGE' ) ) { define( 'TADV_ADMIN_PAGE', true ); } include_once( plugin_dir_path( __FILE__ ) . 'tadv_admin.php' ); } public function add_menu() { add_options_page( 'TinyMCE Advanced', 'TinyMCE Advanced', 'manage_options', 'tinymce-advanced', array( $this, 'settings_page' ) ); } /** * Add a link to the settings page */ public function add_settings_link( $links, $file ) { if ( strpos( $file, '/tinymce-advanced.php' ) !== false && plugin_basename( __FILE__ ) === $file && current_user_can( 'manage_options' ) ) { $settings_link = sprintf( '%s', admin_url( 'options-general.php?page=tinymce-advanced' ), __( 'Settings', 'tinymce-advanced' ) ); $links = (array) $links; $links['tma_settings_link'] = $settings_link; } return $links; } } new Tinymce_Advanced; endif; PK:\x uninstall.phpnuW+A li', cursor: 'move', stop: function( event, ui ) { var toolbar_id; if ( ui && ( toolbar_id = ui.item.parent().attr('id') ) ) { ui.item.find('input.tadv-button').attr('name', toolbar_id + '[]'); } }, activate: function( event, ui ) { $(this).parent().addClass( 'highlighted' ); }, deactivate: function( event, ui ) { $(this).parent().removeClass( 'highlighted' ); }, revert: 300, opacity: 0.7, placeholder: 'tadv-placeholder', forcePlaceholderSize: true }); } function sortBlock() { var classicBlock = $( '.container-classic-block' ); var block = $( '.container-block' ); var blockToolbar = $( '#toolbar_block' ); if ( classicBlock.sortable( 'instance' ) ) { classicBlock.sortable( 'destroy' ); } if ( block.sortable( 'instance' ) ) { block.sortable( 'destroy' ); } if ( blockToolbar.sortable( 'instance' ) ) { blockToolbar.sortable( 'destroy' ); } classicBlock.sortable({ connectWith: '.container-classic-block', items: '> li', cursor: 'move', stop: function( event, ui ) { var toolbar_id = ui.item.parent().attr( 'id' ); resetItemName( toolbar_id, ui.item ); }, activate: function( event, ui ) { $(this).parent().addClass( 'highlighted' ); }, deactivate: function( event, ui ) { $(this).parent().removeClass( 'highlighted' ); }, revert: 300, opacity: 0.7, placeholder: 'tadv-placeholder', forcePlaceholderSize: true }); blockToolbar.sortable({ connectWith: '.container-block', items: '> li', cursor: 'move', stop: function( event, ui ) { var toolbar_id = ui.item.parent().attr( 'id' ); resetItemName( toolbar_id, ui.item ); sortBlockToolbar(); }, activate: function( event, ui ) { $(this).parent().addClass( 'highlighted' ); }, deactivate: function( event, ui ) { $(this).parent().removeClass( 'highlighted' ); }, revert: 300, opacity: 0.7, placeholder: 'tadv-placeholder', forcePlaceholderSize: true }); block.sortable({ connectWith: '.container-block, #toolbar_block', items: '> li', cursor: 'move', stop: function( event, ui ) { var toolbar_id = ui.item.parent().attr( 'id' ); resetItemName( toolbar_id, ui.item ); sortBlockToolbar(); }, activate: function( event, ui ) { $(this).parent().addClass( 'highlighted' ); }, deactivate: function( event, ui ) { $(this).parent().removeClass( 'highlighted' ); }, receive: function( event, ui ) { if ( $( event.target ).is( '#toolbar_block_side' ) && ( ui.item.is( 'li.core-image' ) || ui.item.is( 'li.core-text-color' ) ) ) { block.sortable( 'cancel' ); } }, revert: 300, opacity: 0.7, placeholder: 'tadv-block-placeholder', forcePlaceholderSize: true }); } function resetItemName( name, item ) { if ( name ) { item.find( 'input[type="hidden"]' ).attr( 'name', name + '[]' ); } } function sortBlockToolbar() { var container = $( '#toolbar_block' ); var items = container.find( 'li' ); items.sort( function ( a, b ) { var aa = $( a ).find( 'div' ).attr( 'title' ); var bb = $( b ).find( 'div' ).attr( 'title' ); return ( aa > bb ) ? 1 : -1; }); container.append( items ); } // Make block editor tab sortable on load sortBlock(); $( '.settings-toggle.block' ).on( 'focus', function( event ) { $( '.wrap' ).removeClass( 'classic-active' ).addClass( 'block-active' ); sortBlock(); }); $( '.settings-toggle.classic' ).on( 'focus', function( event ) { $( '.wrap' ).removeClass( 'block-active' ).addClass( 'classic-active' ); sortClassic(); }); $( '#menubar' ).on( 'change', function() { $( '.tadv-mce-menu.tadv-classic-editor' ).toggleClass( 'enabled', $(this).prop('checked') ); }); $( '#menubar_block' ).on( 'change', function() { $( '.tadv-mce-menu.tadv-block-editor' ).toggleClass( 'enabled', $(this).prop('checked') ); }); $( '#tadvadmins' ).on( 'submit', function() { $( 'ul.container' ).each( function( i, node ) { $( node ).find( '.tadv-button' ).attr( 'name', node.id ? node.id + '[]' : '' ); }); }); $( 'input[name="selected_text_color"]' ).on( 'change', function() { if ( this.id === 'selected_text_color_yes' ) { $( '.panel-block-text-color' ).removeClass( 'disabled' ); } else { $( '.panel-block-text-color' ).addClass( 'disabled' ); } } ); $( 'input[name="selected_text_background_color"]' ).on( 'change', function() { if ( this.id === 'selected_text_background_color_yes' ) { $( '.panel-block-background-color' ).removeClass( 'disabled' ); } else { $( '.panel-block-background-color' ).addClass( 'disabled' ); } } ); $( '.tadv-popout-help-toggle, .tadv-popout-help-close' ).on( 'click', function( event ) { $( '.tadv-popout-help' ).toggleClass( 'hidden' ); } ); $('#tadv-export-select').click( function() { $('#tadv-export').focus().select(); }); $importElement.change( function() { $importError.empty(); }); $('#tadv-import-verify').click( function() { var string; string = ( $importElement.val() || '' ).replace( /^[^{]*/, '' ).replace( /[^}]*$/, '' ); $importElement.val( string ); try { JSON.parse( string ); $importError.text( 'No errors.' ); } catch( error ) { $importError.text( error ); } }); function translate( str ) { if ( window.tadvTranslation.hasOwnProperty( str ) ) { return window.tadvTranslation[str]; } return str; } if ( typeof window.tadvTranslation === 'object' ) { $( '.tadvitem' ).each( function( i, element ) { var $element = $( element ), $descr = $element.find( '.descr' ), text = $descr.text(); if ( text ) { text = translate( text ); $descr.text( text ); $element.find( '.mce-ico' ).attr( 'title', text ); } }); $( '.tadv-mce-menu .tadv-translate' ).each( function( i, element ) { var $element = $( element ), text = $element.text(); if ( text ) { $element.text( translate( text ) ); } }); } }); PK:\JkAAplugin-assets/images/colors.pngnuW+APNG  IHDR鎩AIDATx}itye-/h UEIdI%yd䜙9I|qI2Id$rıȱe.DI\DJ@UܪJ#ӧYlT{Uuw=Q4`0<$`00 `0, `a`0  `0X `0 `00 `0, `a`0  `0X `0 `00 `07'v8 UU5>qŁѫѡX2e4AE|u ZjXeɎpKv˒,✾rl6믟:u}}}DBQr577^z֭7n79]|7@,kmmE/];::Q'&z威-[jjjs@Q|Exbww$d_ t:P .]wd`nh4|:Fࡠ*n7*!-!`"U}i@ShlCZ;qd">&ЅCRtNJ]Ȫu>̹'zW o+**oC޽tA@G~vĉH$bޔϼ]W\ywٳ q̭K&===ǎ;<Ɏj+Vvm p%Dbn$)")@(7 VxSV T\9Q!۷.]! =?"⎎OO5 ?r,PGܼy3rNӧOC(;`x'P*n XM6Q}>\x H< .(DP|*5,j?o UUUF9d6yyOOS?$QrK\{o)fCt_я<y ;e zT*5+]p?|f͚5xH쬈.\xgߏo B9lmmbb̙3z*ΜT~,PdMM͎; v6OdDE6NJ0U̎;F@ Ppjbbfc;9ͶV)J^]D:Ԕhwٝ+D |Eyss3(7d``#8 gY44lzzzp h3jU@h$|"R#>Q]k&}#3\ {c JIJT\t// /A CҥKKaߵY4] "gPZ;ɀ,j'C4KP 18 C 6dFbm0dg}A$O)$@rMWG#ז¥0'08O#xWXq#7}o}[p0v_=ڴi(TW^?SpE j-jXC=r9Jŏ(5$?V (8Y06%; áK~UX_&QW&2߲v[E/~駟FI{WWWCC$߿??B-=!jgg'bΝ%)>BG'OvTas"mJ U@|PWWUp\34CmتAǩw޹rEgC'DІT.uQ3_07 h]dɢE|G?ùsH `[oŇgW@%*y&T#v^p!b"4Pchŧh\oa_|Ρ+ $7\o.YpC+?#j,Jիv\1ÇaK5s˗[ZZYڋ/ P(h P&5QOO+++aܘIpAм9Xd6}霘bU! W}b<ggҗT~|gpH/ҫ(Ji'(07 9Q&'LTU H.]*qqQ jkk!6*ZY }:D..EShC=g amrl|;9~x3γ>Ph 4( vqn?ԑFٗetlllbbW^IPAHyXtGzm}gg &jξR39l={>B'400Ϸ''4GpoӧQv4mSg,ȑ#GEBFGG*++Kހ7If /yFt-9 H.QlG5~wjjn^hkk4jx7xd`A QEs hE4W7ߴ"5R XP(T(uYYҘ3J TS?է"&%UA9sꕶ>/|l6k66mc*zǀ:uTWW O)#%9Q\l$(xyy`.]4M 8`zBO!Z>`iRA[hϡClz `3f2=tZoS|ݏx뭷EG4yh'.=' ĹqOC !<"v٫W̨ڬ;O<)&{-hʕ+6cccmi355e%I@ ]]]###H(*Q F===s( T5@@'ɓ݊- '3rQLhwd|sؒfVV0a"]>rX1Ɋ>20AV&Z$`: l8bp Å6=0w5ϭw~DSމ+v799inlH30{FLJl4zb#(n[Äs6@1U4A*ݼ1$3Ѩ% J+F0UD"VL?>3E"9ҍ:{HV0 01Dum̤&s驄%Ӓ)ͯych!\cgm=c`9ł0ضeqnF<MM}A)T֒!kP9|يQI.ݦi&Y@m>& P 0U0P;3MTh;G0R7ȌV\S X۹2Ңŷyds㱪%M[ 1W9& ŷgbrdUd3o;Q%Kskխhs⦷(-\}ӮEwP97ap;F,;s\s-ʒoqÀKWV3`۲ۿk~ CWcUpN˒T|> lP{;tv[!tzQ-ؿm٨ن0ԆHM+}EEܬ~֟ 찪J}C N/XvK\|8D [Ա?[@0UDAlYZPsnMY ---l Z\pͅ M(rvٿ){+oi487J_TǰavԢqnAO&+vh"_kκ0a[lpzp6ճg|V-8{|, SQahxّpbW.ŊXW}۶ml Z\~=vj[}}}CCìlmN>;{&#(# /jTAaiMPӂiYV V_" V4%555SpV``0RVV6>,X@;y3 j'gJ$8ŷayJCc* ^wҝ*h6|4 I-+|66l@}Ŏ;{3Ŀ+t%K;] 'իW[ČnQbCiVApul}ߺt jͺՌ~J@wZw]vz|k0 ;mȌtV5k֬k׮3ڳ 5m6a=q[Հ(8%hΜ78߄AՍ76oMM٫J\|;j 7Yw yVT 6mڴqFX `FЮ Q7͛7[LQ|iÅ㢬Zʊe7;]D"?`rs (qYp)5 Ҫhe*'Q?566pv%Gwun|ZZZonٲe R-$iΝ*|qh4j.h!NR2'FOawwMP4؁TAiNٵs=}4PÞ={lؔph(]-[f9t28;cŊkgZ&҈Ӡ՘q]֭[g0{<D8j"=11NI4 eu~gPōaIIip *>9"8i'>Pss//6iPiZqbE8ݻ!B#4d2 4̈?>>^r9i@pVVjda0 ^uߎ廅m(m -1Mon+A7n>A"Ha޽EF 0<4L&FbZJ ޤܹs}WB 4>Mj(> ;nh i.a>88#,` ?W+U\o',h>IIiKjcnU1 p^㪪}s-] D{{;yUF"a_~ۊ< 2D,ůN{׮][(,j@X"?b1\\zl a^h|C451p)JA AԄVU?bCCC]]ѣGJ`0O~~(]Q|իW_@9pKp뭷(l8FpmibCa_`f #mPqPj6OFps (pptkJ&-6hWYELnǏ- /| rK@ׇౘ@PSSw.%8:ޯ\L& qm۶s=%߀LЉlIE70hZ<ʦs$H)-H1c#$hjaɓ' x&/ׯ/UJk0`jb΄z^Hc4ḵzzzTp1Xx(>T\.9H|U'n 8VKKkR0$Q TjX;̦&Hn.Ք ue +ae ˫[[[q8կ~uڵ% DWZkXʌ -=8[«zZ`.mY PP0Gܾ}<U(4T0(;N D"h4/^̪`_a m./-#JI rMhKjV|?|ǂ 3pxV^ 6<<\kkWh$J /RoRW3yu}+_ٹsgG(3B@RD"J9xϞ=> ZPLx @y7n}HRPl:n˷upΣTJMih%i.%Ak*o^K+8=jA|{zz׾/}>N~x?vq7j`{h0c{ETuG¼_A CCCHZ:[!IpSݻq'@ В.jY-\tm$"O("1VTcW^6\O^OLUbfYCul:V7n\P÷'|,pg﮻?3nmm rg\ ᳟ߏԆzW_u#ΙT_{ )͛zj{.k·QCs5@I|1|P_\z^na IJ湓?6紜#.QyhzgPZqm;||GFFn0qv= 1~~K.%I韶Ft\уCOSBD=h.; *6~bS˶9WG}"P :֬Y#<Õs|25/ x :صk\ʕ+Շ.9r K#{٨{5F>MgL JAʹ#BJ%<|^~g!I9t}=T"Oe\FQsA萜n<|I-wrp}}}?s!(;GOE_QQQUUU__ԘNi #H(067EHY`0vU`0 `00 `0, `a`0  `0X `0 `00 `0, `a`0  `0X `0 `00 `0 `00 `0, `a`0  `0X a%9MӲl@.SEUU|i*l̯keh/I'Sx:kAMDY. @MJ|3nZd"o`{TEН|NP:(BAP5 ,j~j:d2g''c=x"Idl:2UŜ&) .QJUsWkT45W- ջ. ͦ D!UUU^r)*ab)HۀdzP1"k J_UVV sbǣ#GGNDCx*dYtɢCd*I9AjRN!)ELetFHfTu-k׮Z2_0n( (`h4 ,//ZJ# 8( 966F6 pzh#I'`ZysE+?*bLLvsBTQVD1'0 P ! PŴ"1RY1PqXiU~wysmK6o\);8x;::@H@!({MM ni[z J088VTTϴ(PM,(n|m^\.6:J_׳XW:z@;5ITD)*zK6f+r9)b\<_U3w01ǫ {IIz;V&''`f:*hFo uDKB+xoo/ wHD;z.gdpVI}UT2 (j]2ƏiEI'%GPM''c/}m}e>xAxoU ңg(5a(CnB%AX}8؉m(;źjwYKrH&Hx?7^F$KTyeF#_#KNY1Ȓ›3煁ơB𱶶aKp`eeeH{vhVRr7?J55OV1 FKFM\6H»5wmq}X<>xhs$Ձ`I?:uuuUUU6668zɻ c{3+/sVWnIQߐG{Ԃ!t/h_n|#&zTql*|n۞լ 1^ CCCi ʮyv+@~J8ESsS{2 uUn nQӿ1X^G%|mI%Z@U$ݷO`0" \&@CPq\Z$!h}ܓJz" \M _NN7f揵Kepzk${`^E$Q RYYY1'@jjj*** N}}}d9L?pԄ]NY4]&0 ]0ԨqI\?$iFpPuSO JgϼtT)j`05-.` ^ І`0UPJ6^ve ? 3|p(|{a Zo<^+H&_l=y3[`0, ͎ipT 4/XSSS/B`%0K AۆfhJMOpm'٩` M 5I]^p}Hx:7=(0.Px^^^^.y!+++Xq8Br1d }%QhAR1HRTxESfB0W̻SE4-'t:x:깳S|3b B4b^hÐ~1dYʼnMNN:9qq琒MU\a("}c(=|HߛD/op؛s IE=-W&8#a#a0 (_db\` Vf&HEn1tj&Ϸ J` OA/5 y yۈQL/exrvx{oo9)NӑHvVp&Q]]m]gx.9>{,Uy$ucj<ς1T*d03aL/dPG߅co;Q.$'Z:FjC!YU]7/4M;z3gFGGȆ5kl߾tA9ļ_ *v4br< d1DU$bMަ:#ќs6CKr* Q> s"{28e+pyâ\׈IG Pd2+**@\D\O~s?+*8Xnqi퇑 Abg3__PN$2 Fh:UKy´0g ZA tϋy_0mz3M Uz$ӓ';; Tmmm֭G? @DN,6€ʅ حށ@`xxg(L$1vEaN OvF|q]0Y[9ۜ&m,3Ka DC}NB';(uMNU۩(諯zH®]fut:Z}a@0q\nۆzfr\*C&fc(ޤcP"3jP,FT ցbIw6+F!f#\Eh}?ItʢSUgvlwx;c֡j{{ mv+QH$,f3j8o 9Lf``kkkq0R}}}V-3d;˓Ntd0Ȣ#SsWSNb1")A 0y` 1WqQ kح$;M٥ƸL& V BAgΜ9zh__`,bŊ;v477^ؑ#G?~Zpwܱzjĩ///{^~'O.^77m, kCP0 87-R1LtO]Ԉ4ݩ͐ʷ*jЦ{gC\oF*A~P{a0ЁnYr˾q00ے 8t2pwAΝݻ 744tFǂ߿?^lY6kPoƞa 5%VpnPrXBK!Q2)O ] tdlXUIEҦ*nv>k6?%IM! Q> CNQ$:56X72 ²h-Kطo_KK˧>)`p]ee嫯N ٠7>(DFStwwcWGyE@R €s'Zi5N*엍v?S$3Kv!*L) ]̆$ GڐFa[/Cꠙ`C_gQ4)O.0nN8kJR;1>}vǏސ0@ &''FGGIH.s-[X5Jp>Ԛ5ݴ\#j1tf8=( yߩڌVhTj~~jVqd4{ m0;?$K 2abe`\#\x<$i-Hcǎ‚P D$9x`GGG,78ཌྷ6TVV{ u;^h_ˏL2gi}šS]B8q ԓ\|L8=6sZ`4P jEX7ԃAuuu<!ІwŔ-jjj طoѣG7nܸc ^{|>mTZ>'yy6{.hf]NB6 m樤k{ W/C c^&# AD}J|7Ȉ[[[/_B@|] `)N8xx.μYa;_4`nc yIдi7r]DנHB^\[[iӦ8LFǏ'Bû0<< <2˭r&5Ԡu]% }a\NrƲ߾}{cc#?^YYyax{B8P >B!&9000088Q/6,-T EƵ9%&/_+cUC̮f#׌ )hgIQŜ&h[s*eEp_{5GNpdwпQ)?UlIGXhU2ۓDZڇRfħƓlw;+1'q vo² 777ܾ*j*»d`r NҢB"29)ʦ-Ц'Q< 3e7ŲGL4 ƌ6cQ~B%^!4- h10 Y"V#b16Z% Ђ)A'T_$2lb+.LhS3֤U6%"o%"J6#攀۳N `G%AkD"﷨Or V8ULa|#tF˩ e~^`1pCbJ[MK8+KLYz2KUKNeLU6-=ݚoPS. F^B5h1sf%Jĭ7\eҢnXq9g0.+JYu`bbŨ}uabW9>Gu-ЅHNg͛n;RRpּUsy.̉ęCTC 35 WXrwQ$^=d2 efiWtz'J:]̆QmmAo82f)"$866H*eԔ70#=YRMV5wgf޽RI!ݰfqMUd0E.pqstt4͔Y}-;+s<B"@󥵼*s>Ɵ] WRwz7L )NU[6- |3:hVjUUmϾ0ҞІT*511P䵙H$pb ;|MJNX,OmPMb <Vm.t>rI/ dE{hLgjĬK%mXVy<c>}΢!NW0F DhksppʊIm?UZ]UHV"E#+,4Bzd6S`$]GFSP x)T6XP޺햊 ?s c yjjʆH E哭n QJK[86x_ry??FZbli,FH4-pۜ 3/ڌIBSi\tA o94!b;BQIPn[tYO_`~P$ h #28 IaD"111122V5Q,EQ-Xd}m4uR%~3YU|/!$Jd 8̜HL7sThLe@̕t(,􌂧%^wҏlYSUUU;XF 7TWW[M,@1 , 'PeؗQz|Rʊ0Ơ"iȯ)z2pyz6az58Ҳ;8p >_zﵒLF3X{\Ę(++@U޻<hX`0U@555x( K8T1b6"]{9!596tP$[<if| 2 ڌ="_Y2b̈́wm(d\*Kebu ݼf|"JJ&7zl >#*n#e$Q>a1LRxԻ QPgs6‘SrT,WUq[`*a3Ъj H$BY;c8b ><< .//]±+@]gfT/C/]:*ea+p&4ec1ȡP1G=L)٩TKăA+}5_C ȴS)EelJĥ-`]Tp>hpݝ씭/qEQB(Љ# =&u<Srɍt 6(!'(e5$dlZQ*WXu-|s3! *4\.͜M٣ 1\i\-?+ 3H[G CtH] ewKZY_Y3T!k$]_]Ѵamk6Մxn3 GQj ȲLsZ2cc4(Zy&G';::650$(CԗsveM4i/~,o^aEÚf0s[ 7H$dh6# O<@'@K1 m >X&]MblZh00T"PSUzYsՒFoy:=.}UO0CPnG{0>OO?<2^SyM} |jrU](UGh#\gW=甯[=9R` #~gwR3v6;Q paq⯗RMɧ#;N;vVͮ7TT 8xD/Ph"I*HLSu?œ_^)<k =}qb9bifavzGS|ruͶy(ӆ^\nSsě,>ON>´@VoW7~{<&ty).s{1+4KQՈ_o=סl%^o릶.G|5Q;w_J= ss<#MUПTu'BAG6Js,+Ecm7G* @`(uP Wj?_yx>Eu@"vu&FQ#P(劀.@ǘ|~?  uPP5̡CFGG'''l>G;@dOu4b]]]ΥPܒ,wF'VD":HaC@Us ;644 A) D ;*N?o޼>0TH"9رc^--x;:RD: ,YdʕD1;%88W^ٹs]^{5FnXjaw^OOc{y A Bˎlںgd{FvKˌ |\aHKUp;ӛ_6oŢeK{ZN{,,> 0B3r$ !CYM]l @d$dꤣx!Rx嗷o߾o>ԋ*B8ab-pZ< HഉC]c=oٲN/}D:x^zUWسg?O>u֙_#ȡObS0f~m~oK'^ N93?vث>멗m.THHTߧTYu{Tjx@^w,{5g߰ců\2t3 tCP@@ B텤R zi̴  >`XAS Pp+$f!}Q-;tH2]'IDC@>k֬k!z&7P R͛_g$k)SU|Xl/S# OV}k/h\,|~f#[믿 =zxlǷ?+g03%͒4iS `\QQ(Jj[8qͪ|V wPiN\#GRFDhoo`L&:LA"cD^nzC=Cdp< 'åp.[`gFxƍַz)ԋ߆^U7tӝw i /wwwyG7 Cz T us=]vNͨo>?^{R-8P’doe"YE,s}ʏ;p4IAdbpg###e!A 4_t28]P0b&N ׯGiJ F<&;U!"Ѫ<8d{?FGGQ}Uԅ8)R>kv_Wկ0) И?O}sySCkl!ͯ)I ~*OɒLC2rY>s#W}9SjE \{D@gs*CBqf(P3&Z[} EݿBS& *hH)~E:$}ZOx׮](-7)u*–-[:tWT'o͌>pGue/u?[kW0DwRrEHp%- CUbNj줄#v@VUۿۍ7R1Yr8J> 0Oi%`[YaÆ~O<kCܹİdɒdV=O~??ah0R"%[R#@?Y5^;KORm|Vd2d;w(uz]Ik77~*GMqVя~n5_E=hϞ=,X2v4 [}"#v `հZx>σ7µzz #Fʕ+aʉV44E{s?yJL aMf>5_ٿ}8speٰ r XZ[__TxR  7$L¥|i­i{r wo݀63}_7@'h&3э]tY}+jg>#A43c 7ݿ?pW4pEꡉ_go{ÌT@}Ap.F"۲[4y6Z B++4_:N C1JQ2 6nܘH$ lPޡ6jc&AWտ^~=4Gm6%\"5wY8o$ ofՂ^5sDTj*RjI;_݈NprBp8 V&/-x`Æ 8af>LE<`ɒ%M@fO/ZMg214_C UB"S[5Bŀ8>>"۷oٲ[/KK/۷G#ځ 駟կ~Eb-T zF}W_}R7.ZT*h" -@{/a8tnhgw?G 5CAzk@Np#WisU!ԕ0*݁@2D"ޞFFF* ? INHd2 $!(\8J˿ 266oxAšBB^ء0|f r9R[O|PkQEBcH j|O|Y1LwQ11|0ZwgGI&&& OmF3SNOh@apuVGaZΝ;}Yn>qÆ ǎkոw^X'4rsQYׯߵkWZ@{6| "l$stL|rǣ'3L.u&YII|]$C#kWQ:͛7\ZpiG_ ,\ ܸo{O6Gˏ]7 V8ӟ>`h/U|hr3U,@!k*+ʹ\>ì!s!$ x JQ`e \ )5H(h=-@Rf7nDO#fr㦧ʆAy@ t1:)&mdE;w>d9r_n…7oe2F+ڧӳF N 3zqK_˒,~dzNy [D"$;qO\>x ?5@YՒx;v@#xpgHFXR ͛7dIŴ]vU_+e ,yp=PU@.V~T-^}&&H ZcS6FY 4tݕ Tf2iQvi TC޽SXQt ѣ L!a9Q<fhmءS<3d+W~y$s >uACxssM⠝q1ޛ R)mXKCCC-I1>`u]3;-%8 xX}Li}Ee;IK$|L o=* Jbуf-R SSS=blh>{͹r5`/iz=ZקbS}&YEZͅXth4[ ) x0Uu sB7ߺ(MـJ$aVbQ&yV(P."G] nȅH$B"rbh4' `RQ}LNxԈe/ ) Isd4|oIYѸQqeLnZf') ,9P㐿|;eyHoP ;)_˗/5n~$^Kr;s^A,~֮]KwPDK.x@ \oUٲKYQ2מuEp0 gbHGR)l쭖Nq}es {.d9=2@4s\op嗃&)& U꫻p r-3T7ocd-\|ujL<()،5oKO᭻ͥJbtP;55[ Ja>5wyhm@etvv|>iUW]vDSxgyaЀfe#^3%R beŠ(* ^DQ̊}홮ikVuCWd@2aLLLi s099*-qyA8Xؗ^z)M4TԶ]w44Ԃnq՟i5o6K( *~_jL X ZMro(R2r[g͘) mmB-W`+iH؆iDɘH$UPL6$Z- Vu-*o^0eZIk4 B]=`@NNN~|Ɉ山1R!P)|5КVM('σ/_w|N?AȠjrWm^zmFq Їf@(ƚ5ks6qkL}*1 M0_j;ęʾsK7vh>7X*ӷ_U* A4 14Gkthh#-5=#T]vE' \7 4n{7;Us=rȖ-[A >U^f ,^x<wu__b5S5nnw Fs/}/$U%hY9X*~[UdOi11~ nC# B`+p_B___ gx1!oN@Pc5bL&s7數ʕ+amڴ =AP>2P??G>B9*9JԈ>vݶyft 4Aww_UWWW[ZV*Nn|DX)* I9u2몏}϶bEmrAoD"$]U40@#>uB cBH4XN;v젓Wbw {dK`醻X"B2Fo}cG!I$ vby_dQP۪sY~V_D4"R^db]qB_[i7NIk"Л(@;+OhWQHcǎA?`m͛+ʃBݻ< Hh|>C@ 4=CGGgW^y- Z|NX?O|n-+87SXf j vc؈Pt]?.^ԂhuA3xO^>)TMA-P]3Vzb*ѵV)K>))M tV[PIqvᤄ3 hg\ѣД,XCskt/]0>>N\>-J@`%KPpEi;~AU0ǥJt%_|l _~yww7H#m2,_~=̛7@ ^J=x^ yEt]KX&)»_dl$+010@@~a:@~9@8fQ|H:j0hm'XH;GpC7̓0'Jd&fMg\pJ  {`. w E>F:Noxq4# @ꪫ>Ox4]IB@!aƁQ}10ꢧp~N4; wunj7?|K=Rzbr|*3e Ө+F*T1OkU~>Cjԥg- R r1!,739C<@Ā CVBgg'MSxp*9% y_|EA9c Xd%5H;/H@a<|{{G;8jYZO unv2ȼ(+t#G?z@ 䳗3'|`pp[o~Yسhw/B ,-Xld^eZbU/VI n;.pOW4ez~G@DdEanz~]o'0 K4X8?K/4_(;] տ⋯ZPls"N|'@; R~<|r@FnCPGGu JUz{>ЃCoOx{Oz… (ꡉzko{Xa*~YKOR|"H~Y5-]2˒U$ӞC߱s}Ok7LaL MmPiH\kguݬ*6tC28<۷o19ȑ|iV^f͚ .iD\4 }YX~d6TGoF݀ k׮k5:l6ӟX~Lac&R#8߁r-v8W R[d/~{C*5ŞZV.ɒ*:բ.`ZFwF;X~t9`1}-X`Xzr*I@)M~ʮ)aQHgASSS`{*AkJ"5b }}}˖-7ol,qtB9)ib׮] }=ztll -vQMAЎ.] ippgF+?###PvOر==wѢEguW\rJ(FM~?:spAPT>Gc2uvvB! 3tTDzéѡԞP8VLF^6\d˧!"`"j v-#=|U8fĜbP(JpΟ`(VP10H@F@s)lСCxG%!4Q|$E}``9%K^)eˇ^q^X!r'|_4T%]LIJFU6*|@tw}y ;|Ӂ,t: pewYt?b1蚉D?-T0::FAi hT 4üyxNqrCЇK7KOHH qRoe]S,bdӯࣉFAY7zW UTj0{Ų * d=D@P)`mN&A dik@jÇq@>PY<±1pXppptFLARdHz{q bVhB#a%Ibe#>E%q [ :*p l7ҕTlz潫oKl4@CNNNB"जϐ'3@->D́FJQuthINbbqLUS_Yx쐪Ѷ`< fʊaJ义/ eTMdӒE+eҪ⏲*ˑ tq2=yh2[/{bG? }0 СB >x䎆b]]]ѣGqeh۸$]ɀB@D!Z3:*K՗8tqft{HsT1߰kHj8&:B!Ѕ$S9K!.jEYA<m }Yr0D489Ln?PF1w@pGx s JܕE\&('N0JFK78#{xÎ 5'=j/+brV 8i8c +¶ R2Ƃmhht߯FV-fryhhJ=TAh4sꑦ$5M1P@< n7,q@}~Ox!uAY3,b*/D56b4-I1#Ȃ 蛆MUò>i^/&FC{3*gW_Nq-,"i{MAp'ضdUs* (,r9T f$i"אeqޞ3eVnK1zF>" H6 X{4N& Jkll $nhB1ή`0N\o~m/E1_2ٔj3A-rl)wŁ}nh$ LE8)(l4hHTؾGGv$&\ `++4 i?n2Ƥ+eb`0U3lzpimZ(,,.m1.A/Y2jb8t@?5㯶Z2?, -tJyt߃{]M Hd 1|FX*L c R4OdƃmZ,^6$˪;-5cCOqlgPEѫ&%IdX5z ]kݝR/M&d͕Je޼yZx"0Y&s#V=t$"1[|V]ۢr$;IyCɥOxY8 R_"(FmI$°Hm|h03wtǏ$;,l"Af!;::Pi%055EJR\$D0ϤmO"uGFxUÒɤhVՐ2~ ?sX& /ٞt׼5sI>ղW+LlL v B*|ݚj+bLNNtpp&1XVm:Lkڲ/*170̀.)˥jGIgshTeSLXCTsp>;m4A %΁Y-wθ\Ȍ}S/vyD)FGGrWWW8s\( .Ky6U34Vi092<>UJ O1>25ۡ"qYQMݔD# r\ʖ3kd֜ o8)Y Aa74d FCSĴȓaVMMѠbI,ghBA@y);n~ ֔~(eisnhCMS3Q 0.M>|?{(Uei7>ki2IN/^$`(ts@PX^@8g fSOլ\2a3^CD?h4xiW@,+~?~6I֯bsUo}ՠ ˬTUdF`04CwkKXȶзŊeq V"bd'ͅ}vV"<߉{)KÞRbqs #ߩmrRK~&]UnFҶ\.CReJ,3ɩ) =xJM>/{j)CÏ}ظlWV})W2M(z\װ= ,_Pg\ا,CǕG3{`ӹK{C?CB~B˔H۳Vjrj`Mp`s?ڲꪲX3+r~`ϲ/[Z(iR0ڳoˆ'wWK^;PΕd_2*W{~h`^u'j\z: M6 V`atjj/k]1k;5_m[}Ff 5g-*5㌸DKu6MgA,&Fc۫_l@x$Tē\V 0s: |1>׉W͂1Y7n0iV00ch/U,K h&Y)~l?3eK L/r4 l[_{'CJRE ˗VUS_ko;{QqOn8ۿƕ&S6l{$554>U۰`䐬 y:pR _c.H5Bs5C]լFX`MP}P93bpw摠C1HCJRRqen'UorTYsbf9MU #>|q.tŽb3J V=dtw*"|Џ1zجΛ!Ƭ_l"Mڱc8|{ۂª$/?{_m]XV桀XHPZ֞ LKI™ƨ/Y !U*l%05)Wdb t;k-XmRc0]R1Xt ċ.:a"풠 ڡ yz)C}AU_` 4,^ιj4MW-bhyU3U-W40UFd,{{d)ݝO~ZCդlzh*55+M5HX.χc_J8v,{et$ (J !'Z6TE@cirIhJɬ_1k1/dR |6(SxG|4D\[`oR6DQkai$sdA~YmwϏOJ+f=&@;l%oK/[{@HS*:h Q-C _{qc|ƈsջza;MSGsʅQDQhi1["HIu"j/*IYYv蛵KKf[M'kk(>w@b÷<ey!sHVU7J^~FTM+ w^k|@LJ+!gl]N&L2-=uj`h\OALJP%̨-\5[¬L4EV dJ'E#C}6 _ziǖGɣ;%C C;>, CR>,LPd4zCg Z<汲%x"ThJF6gVV1$+7n;: U>|AZ7bTAM6O$yOB#eHTAJBl/tղ_z=^U;gj$}fTRm7j*JPd-n";Sx0uY/ƯCW#^ |`?`ߔ( $\^.L`#9(FqhGjِ%kaOOO)/\9VZ5)!(٪oj'9C!3UqZ1d_D8Y4\CZ!F7OpE/r( RmDzX,WdWkwYk k|9⦅|;oM߾Ö;Go_ox4U۝fX,U87qIx8eY7dV}*Ɏ ^ej$j;mojGy$EJxr˩u2Ϭv^/^brIx%jڵPF|ڲ-a ^ оP8߿x)yM$=Rleb3ߩT*fOi=+oggK*+pS*ÅVb;+*ڣ~K_"gEi MY]9m"u'IAmsϙV,ɍ!ֲbPN=dk)-y5ǶVIjpf\J R) y1`iӍR%_o}o@zTzZfTiJ#/>sn"LV,F:Z\RSegիU F}ToWw*IoY1D5CATsT*Z.\Q4b,qPuPI0VoW*>i`0d 6oD ~ u(sE8[.,R>g⛊BkFP2NZ\tevQZ|2P? )+`Pdh{"ry,@TmT ՒfL%ډ[Of̩NUCoH uڨN$iEZ(DV=iȊ@F"|>)J @ժY=YSԷN$]T>' a|D0hKA-A9%"Lj͘o|wj{[c<H,kzAeHi Ezɪ˲pHP{.b-P$n8BX27l)LD]@/UbN$"V!C%QīJJ-eŧ$*bUTk[=xV/d:K.)_Kr|Łx` 77 Yh7=Ql6q L g%aV9E75 QAtUXULz"˞B:ԣTV=hu:T5BTM񢏸KnTkn5>zƴP?pu/.,a"i&0)6V*9C$;V_bQe%JJ$MLL@=wK:cIPGHδb:qz'_G{ dBS@H-B["(ڴ]Œ86e]-cL˻m(ْ-n+4-ܵ`)j#L&M7bz\+s+%CqA1IO`n⭛Ƨ`8dJpײ wK]˴DɘW˗:#gQ><dY& vuuvn1֣ U4"iL5766på~nkEQt]vG|.N;>"V-'qx'kIb$0m0zUD=!P$r5cP\!:629v(joo îܴR;(9ꢤuhM6tgGQӛ*x Ċwc`g0sv޵`">U/ST-'znڛ8FL޶ھJm%kؘ%agP6 i2_MKΛlȲڸN1St_szd:;;O(!qʍ1R}Ā p{vp㔧Sla^57^Og'M:ը?,1dV)ªe?%ʊ!MEqQ8"arrM"Q0*H$@bh2"=Z||l:p[ hګΙI= ?jE!UԲ R}煺#oCOD;E0L B*c/{o߻oݛ Ƞ\.=zΆ)Zd2Mπ tm.";Pq FӠnW4=:TÚ_%"N%,wq2vj8/0*hՒilE-C8fqf`;v !Fvkh޸i.냹 &1P2R>VG4F# o2H$po_Q7>I44 >4ѵ5JpIfm)TRL$eeus*G-xn/ J>C[>66щDq0(9/p `&qP7$WR0DRЦO{b@+pMfqWojmZ(DdŴJq1}$ۉ1ZJZ#rђ,s䴛A.hb>)YGN`)O:lhې.&xG+\Sxq&vX?66flt&&ɚXXcv@/Y|AUM)2TM(ʺf.[ryl*eeo}4ҿD,pd Y\!$CG@yRDf(kù\'vf078%->s3/=X0ؑHaEێcsPB ;X%A3 !;eh n0dhT'\?uKAqGaD[[[WWW4uk'5"\ `\ L ۇBl|W鯆Vt#%ᠪhv } nla!NVp`* 솪%Cϖ rQԮKfKd7:4L&J9~* TU<Ei8ehX*Oxg?%N˦b@S[5k@mUԉA LҋRZV˸l-6e#6 ›L+ACJ%(9$a:ʃ::::;;=}`0`=&b?ٰɔHAִT929#یPv*WJɨjRJ86+VvG|ph7c'Y VB8uYshCi9p  F3bOe>u~yg%UTSXbaf4QiM S! w^ }W0H$+g|ZMSSSL2r' cR]7NbX[[["[`&-UwXώSGv::/R\,j "Td_@ Dx#7kYm "]~MmYXOv@>Ac}HGRCA*`OH$wJhaH p[&E[Vu3CT!5UłQq`̩`0 'mQIKQU u8ܠhuP~7փ?{}Ɓy/=2hO rqbGmPtڭ Ȋ(&`N`0 &`010 `0L `b`0 `0 `0 &`010 `0L `b`0 `0 `0 &`010 `0 &`010 `0L `b`0 `0 `0 &`?ײ8QIENDB`PK:\(Bqq(plugin-assets/images/toolbar-actions.pngnuW+APNG  IHDRJj8IDATx;OPbRyʆ+ 8;#LHH <4HKChi/wh/-~p{9mRISx@< x@< x@R>'Ƶ=/KYE|Y, rUJ⻽RjmwNc?8ZXKxs(F!iSh(=]w7=C|$LF9_fYUӧs^=0LF| #xw@t:n:w˶}%u Y"R>=n`;#m= ~'ݞwG4_|6_tQu6nDyZb:˯:g)Ήp|@Q1]Pﴓ;1Qtt*b$pƓO]GxH<t ^Bu.UVrPDeunФ_=4&zTYALC9D4x@< x@< _~4!IENDB`PK:\pHCCplugin-assets/tadv.cssnuW+A/** * This file is part of the TinyMCE Advanced WordPress plugin and is released under the same license. * For more information please see tinymce-advanced.php. * * Copyright (c) 2007-2019 Andrew Ozz. All rights reserved. */ body.settings_page_tinymce-advanced { background: #ededed; color: #000; } .tinymce-advanced h4 { font-size: 1.1em; } .settings-toggle { display: inline-block; padding: 12px 16px 12px 6px; margin: 0 6px -1px 0; border: 1px solid #ccc; border-top-left-radius: 5px; border-top-right-radius: 5px; cursor: pointer; } .rtl .settings-toggle { padding: 12px 6px 12px 16px; margin: 0 0 -1px 6px; } .settings-toggle:focus { outline: none; } #classic-editor, #block-editor { padding: 0 18px 18px; border: 1px solid #ccc; } .classic-active .settings-toggle.classic, .block-active .settings-toggle.block { border-bottom-color: #f8f9f9; background-color: #f8f9f9; } .classic-active #block-editor, .classic-active .block .arrow-open, .classic-active .classic .dashicons-arrow-down, .block-active #classic-editor, .block-active .classic .arrow-open, .block-active .block .dashicons-arrow-down { display: none; } .wrap.tinymce-advanced { max-width: 760px; margin: 16px 24px 0 16px; } .rtl .wrap.tinymce-advanced { margin: 16px 16px 0 24px; } #classic-editor, #block-editor { margin-bottom: 45px; background-color: #f8f9f9; } .toolbar-block-wrap { display: inline-block; } /* Block editor buttons */ #toolbar_block { display: inline-block; vertical-align: text-top; } .toolbar-wrap { margin: 8px 0; } .toolbar-wrap.highlighted ul, .toolbar-block-wrap.highlighted, .tma-block-dropdown-toolbar-inner-wrap.highlighted { background-color: #e4f2fd; } .toolbar-block-wrap { margin: 0; } #toolbar_block { border: 0; } .tma-down-addow-wrap { padding: 16px 13px 0; display: inline-block; box-sizing: border-box; vertical-align: text-top; } span.tma-down-addow::after { content: ""; pointer-events: none; display: block; width: 0; height: 0; border-left: 3px solid transparent; border-right: 3px solid transparent; border-top: 5px solid #444; } .tma-block-dropdown-toolbar-wrap { position: relative; margin: 3px 0 0 36px; height: auto; width: 260px; box-shadow: 0 3px 30px rgba(25, 30, 35, 0.16); border: 1px solid #e2e4e7; background: #fff; } .rtl .tma-block-dropdown-toolbar-wrap { margin: 3px 72px 0 0; } /* Drop-down arrow */ .tma-block-dropdown-toolbar-arrow::before { top: -8px; border: 8px solid #e2e4e7; } .tma-block-dropdown-toolbar-arrow::after { top: -6px; border: 8px solid #fff; } .tma-block-dropdown-toolbar-arrow::before, .tma-block-dropdown-toolbar-arrow::after { content: ""; position: absolute; height: 0; width: 0; line-height: 0; border-bottom-style: solid; border-left-color: transparent; border-right-color: transparent; border-top: none; margin-left: -10px; left: 235px; } .rtl .tma-block-dropdown-toolbar-arrow::before, .rtl .tma-block-dropdown-toolbar-arrow::after { left: auto; right: 226px; } .tma-block-dropdown-toolbar-inner-wrap { height: 100%; width: 100%; } ul.toolbar-block-dropdown { padding: 7px 0; margin: 0; height: 100%; width: 100%; min-height: 36px; } ul.toolbar-block-dropdown > li { display: block; margin: 0 0 4px; width: auto; height: 40px; cursor: move; outline: none; } ul.toolbar-block-dropdown > li:hover { color: #191e23; border: none; box-shadow: none; background: #f3f4f5; } ul.toolbar-block-dropdown .tma-components-icon-button { width: 100%; } ul.toolbar-block-dropdown span { vertical-align: middle; } .block-button-name { display: inline-block; vertical-align: middle; } .tma-components-toolbar *, .tma-block-dropdown-toolbar-wrap * { box-sizing: border-box; } .tma-components-toolbar { border: 1px solid #e2e4e7; margin: 0; background-color: #fff; line-height: 1px; min-height: 36px; font-size: 0pt; } .tma-components-toolbar > li { display: inline-block; margin: 0; width: 36px; height: 36px; cursor: move; } .tma-components-toolbar .block-button-name { display: none; } .tma-components-icon-button { display: inline-block; vertical-align: middle; margin: 0; padding: 3px; outline: none; width: 36px; height: 36px; border: none; background: none; color: #555d66; overflow: hidden; border-radius: 4px; -webkit-appearance: none; } .tma-components-icon-button .dashicons, .tma-components-icon-button .mce-ico { display: inline-block; padding: 5px; border-radius: 4px; height: 30px; width: 30px; outline: none; overflow: hidden; } .tma-components-icon-button .mce-ico:before { font-size: 20px; margin: 2px; display: block; } .tma-components-icon-button:hover > span { color: #555d66; box-shadow: inset 0 0 0 1px #555d66, inset 0 0 0 2px #fff; } .toolbar-block-dropdown .tma-components-icon-button:hover > span { box-shadow: none; } .toolbar-side-wrap, .panel-block-colors { width: 260px; border: 1px solid #ddd; background-color: #fff; } .panel-title { padding: 15px; font-weight: 600; background-color: #f8f9f9; margin-bottom: 5px; } .panel-title span { color: #191e23; float: right; } .rtl .panel-title span { float: left; } .toolbar-unused-wrap { width: 350px; } .block-toolbar-unused { min-height: 72px; } .toolbar-block-title { margin: 1.2em 0 0.6em; } .block-toolbar-side { border-color: transparent; margin: 0 12px 10px; min-height: 37px; } .highlighted .block-toolbar-side { border-color: #e2e4e7; } .panel-block-colors-wrap { margin-top: 40px; } .panel-block-colors { float: left; } .rtl .panel-block-colors { float: right; } .panel-block-colors-settings { margin-left: 280px; width: auto; clear: none; } .rtl .panel-block-colors-settings { margin-left: 0; margin-right: 280px; } .panel-block-colors-settings__text { border-top: 40px solid transparent; } .panel-block-colors-settings__background { border-top: 60px solid transparent; } .panel-block-text-color p, .panel-block-background-color p { margin: 10px 16px 5px; color: #555d66; } .panel-block-text-color.disabled, .panel-block-background-color.disabled { opacity: 0.3; } /* Block editor buttons end */ .classic-blocks-title-h4 { margin: 40px 0 1.1em; } /* .tadv-submit-top { margin: 0 -36px; } */ form#tadvadmin { margin-top: 24px; } .tadv-more-plugins label { font-weight: bold; padding: 0 10px; } .advanced-options label { font-weight: 600; } .tinymce-advanced label { vertical-align: baseline; } .tinymce-advanced input[type="checkbox"] { vertical-align: text-bottom; } .advanced-options { margin: 40px 0; } .advanced-options div { margin: 1.2em 0; } .advanced-options p { margin-left: 22px; margin-top: 5px; } .advanced-options .tadv-help { margin: 1em 0; } .advanced-options h3 { margin-top: 15px; } .tadv-more-plugins { margin-bottom: 30px; } .tadv-submit .button-large { float: right; } .rtl .tadv-submit .button-large { float: left; } #tadv-import-error { height: 22px; } .import-file { margin: 2em 0; } #tadv-confirm-uninstall { display: none; background: #FFFFE0; border: 1px solid #E6DB55; padding: 8px; } #tadv-confirm-uninstall .button { margin: 0 5px; } .tadv-import-export { max-width: 800px; min-width: 320px; } #tadv-import { width: 100%; height: 200px; padding: 8px 12px; } ul.container, .unused { position: relative; } .tadvitem i.mce-ico { width: 20px; height: 20px; line-height: 20px; text-align: center; vertical-align: text-top; margin: 0; padding: 0; color: #555; } .tadvitem i.mce-ico.mce-i-ltr, .tadvitem i.mce-ico.mce-i-tadv_mark { font-family: tinymce; font-size: 16px; vertical-align: text-top; } .tadvitem i.mce-ico.mce-i-ltr:before { content: "\e02f"; } .tadvitem i.mce-ico.mce-i-tadv_mark:before { content: "\e01a"; } .tadvitem i.mce-ico.mce-i-tadv_mark { text-shadow: none; background: #ddd; } .tadvitem.mce-listbox i.mce-caret { right: 6px; } .rtl .tadvitem.mce-listbox i.mce-caret { right: auto; left: 6px; } .tadv-mce-menu.mce-menubar { margin-bottom: 0; background: #fff; border: 1px solid #ccc; border-bottom: 0; opacity: 0.4; filter: alpha(opacity=40); } .tadv-mce-menu.enabled { opacity: 1; filter: alpha(opacity=100); } .tadv-mce-menu.mce-menubar .mce-menubtn:hover { background: transparent; border-color: transparent; } /* Menubar fix... */ .mce-menubar .mce-menubtn button span { font-size: 13px; } .tadv-mce-menu.mce-menubar .mce-menubtn:hover button span { color: #000; } .tadv-mce-menu .mce-btn .mce-caret { margin-left: 1px; margin-top: 6px; border-top-color: #555; } #tadvadmin .mce-menubar .mce-menubtn:hover .mce-caret { border-top-color: #000; } .tadv-mce-menu * { cursor: default; } .tadvzones, .unused { -webkit-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; } #tadvadmin p.submit { padding-right: 10px; } #tadvadmin #save { float: right; } .tadvdropzone { padding: 2px 4px; margin: 0 0 10px; background-color: #fff; border: 1px solid #bbb; } .unuseddiv .highlighted, .tadvdropzone.highlighted { background-color: #e4f2fd; color: #000; border-color: #aaa; } .tadvdropzone .descr { display: none; } .tadvdropzone .mce-menubtn .descr { padding: 0; font-size: 13px; } .tadvdropzone .tadvmodule .tadvitem { border: 1px solid transparent; display: block; margin: 1px 2px; padding: 2px 3px; width: 20px; height: 20px; -webkit-border-radius: 2px; border-radius: 2px; } .tadvdropzone .tadvmodule .tadvitem.mce-widget { width: auto; height: 20px; border-color: #ccc; background-color: #fff; cursor: move; } .tadvdropzone.mce-toolbar .mce-btn .the-button { padding: 2px 3px 0; } .tadvdropzone .tadvmodule .tadvitem:hover { border-color: #999; background-image: none; } .tadvdropzone ul { height: 30px; width: 100%; margin: 0; padding: 1px 0 0; line-height: 1; } .unuseddiv { margin: 0 -5px; } .unuseddiv > p { margin: 16px 5px 6px; } .unused li, .tadvdropzone li { margin: 0; padding: 0; border: none; display: inline-block; cursor: move; vertical-align: top; } .unused li { margin: 4px; } .unused { margin: 0; min-height: 36px; } .unused .tadvmodule .tadvitem { display: block; height: 24px; width: 140px; border: 1px solid #bbb; background-color: #fff; margin: 2px 1px 1px; padding: 5px 4px 0; -webkit-border-radius: 2px; border-radius: 2px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; background-image: none; box-shadow: none; } .unused .tadvmodule .descr { display: inline; font-size: 12px; line-height: 20px; } .unused .tadvmodule .the-button .descr { padding: 0 4px; font-size: 13px; } .tadvdropzone #formatselect, .tadvdropzone #styleselect, .tadvdropzone #fontsizeselect, .tadvdropzone #fontselect { width: 115px; } div.tadv-error { color: #ff0000; font-weight: bold; height: 26px; line-height: 26px; display: none; } .wp-adv-error #wp-adv-error-message { visibility: visible; } .wp-adv-error #wp_adv .tadvitem { border-color: red; } .tadv-placeholder { vertical-align: bottom; display: inline-block; position: static; visibility: hidden; } .tadvdropzone .tadv-placeholder { height: 28px; } .tadv-error { color: #d54e21; } .tadv-block-editor-toolbars-wrap { max-width: 650px; } .tadv-mce-menu.tadv-block-editor.mce-menubar { background-image: url(images/toolbar-actions.png); background-position: right; background-repeat: no-repeat; background-size: 84px 37px; } .rtl .tadv-mce-menu.tadv-block-editor.mce-menubar { background-image: url(images/toolbar-actions-rtl.png); background-position: left; } .tadv-block-editor .mce-menubtn { margin: 7px 0 6px; } .tadv-block-editor.tadvdropzone { height: 60px; } #toolbar_classic_block { height: 60px; } .tadv-popout-help { padding: 1px 18px; background-color: #fff; margin: 8px 0; border: 1px solid #e8e8e8; } .tadv-popout-help ol { padding: 0; margin: 1em; } .tadv-popout-help-close { float: right; margin: 1px -16px; } .rtl .tadv-popout-help-close { float: left; } .tadv-popout-help-toggle, .tadv-popout-help-close { cursor: pointer; } .tadv-mark .dashicons-editor-textcolor { background-color: #fff9c0; background-clip: content-box; } .tadv-block-editor > div.mce-container-body { margin-right: 80px; } .rtl .tadv-block-editor > div.mce-container-body { margin-right: 0; margin-left: 80px; } .rtl .the-button { direction: rtl; text-align: right; } .tadv-block-placeholder { background: #fff; vertical-align: middle; } /* Block toolbar */ .tma-block-toolbar-wrap.editor-block-toolbar { white-space: nowrap; overflow-wrap: break-word; box-sizing: border-box; font-size: 16px; line-height: 1.8; color: #191e23; display: flex; flex-grow: 1; width: auto; overflow: inherit; border-right: none; border-left: 1px solid #b5bcc2; } .tma-block-toolbar-wrap.editor-block-toolbar * { box-sizing: inherit; } .tma-block-toolbar-wrap div.components-toolbar { border-top: 1px solid #b5bcc2; border-bottom: 1px solid #b5bcc2; border-right: 1px solid #b5bcc2; margin: 0; background-color: #fff; display: flex; flex-shrink: 0; } .tma-block-toolbar-wrap div.components-toolbar > div { display: flex; } .tma-block-toolbar-wrap .block-editor-block-switcher { position: relative; height: 36px; } .tma-block-toolbar-wrap .components-button { display: inline-flex; text-decoration: none; font-size: 13px; margin: 0; border: 0; cursor: default; -webkit-appearance: none; background: none; outline: none; } .tma-block-toolbar-wrap .components-icon-button { display: flex; align-items: center; padding: 8px; margin: 0; border: none; background: none; color: #555d66; position: relative; overflow: hidden; border-radius: 4px; } .tma-block-toolbar-wrap .components-toolbar__control.components-button { display: inline-flex; align-items: flex-end; margin: 0; padding: 3px; outline: none; position: relative; width: 36px; height: 36px; } .tma-block-toolbar-wrap .components-dropdown-menu { padding: 3px; } .tma-block-toolbar-wrap div.components-toolbar > div + div { margin-left: -3px; } .rtl .tma-block-toolbar-wrap div.components-toolbar > div + div { margin-left: 0; margin-right: -3px; } .tma-block-toolbar-wrap .components-dropdown-menu .components-dropdown-menu__toggle { width: auto; margin: 0; padding: 4px; border: 1px solid transparent; display: flex; flex-direction: row; /* Always hover... */ color: #555d66; box-shadow: inset 0 0 0 1px #555d66, inset 0 0 0 2px #fff; } .tma-block-toolbar-wrap .components-dropdown-menu .components-dropdown-menu__toggle .components-dropdown-menu__indicator::after { content: ""; pointer-events: none; display: block; width: 0; height: 0; border-left: 3px solid transparent; border-right: 3px solid transparent; border-top: 5px solid currentColor; margin: 7px; } .components-dropdown-menu .components-dropdown-menu__toggle:hover, .components-dropdown-menu .components-dropdown-menu__toggle:focus, .components-dropdown-menu .components-dropdown-menu__toggle:not(:disabled):not([aria-disabled="true"]):not(.is-default):hover { color: #555d66; box-shadow: inset 0 0 0 1px #555d66, inset 0 0 0 2px #fff; } .tma-block-toolbar-wrap .block-editor-block-icon { display: flex; align-items: center; justify-content: center; width: 24px; height: 24px; margin: 0; border-radius: 4px; } .tma-block-toolbar-wrap .block-editor-block-icon.has-colors svg { fill: currentColor; } .tma-block-toolbar-wrap .block-editor-block-icon svg { width: 20px; height: 20px; max-width: 24px; max-height: 24px; } .tma-block-toolbar-wrap .components-icon-button svg { fill: currentColor; outline: none; } .tma-block-toolbar-wrap .components-toolbar__control.components-button > svg, .tma-block-toolbar-wrap .components-toolbar__control.components-button > .dashicons { padding: 5px; border-radius: 4px; height: 30px; width: 30px; } .tma-block-toolbar-wrap .components-toolbar__control .dashicon { display: block; } .tma-block-toolbar-wrap .components-icon-button.block-editor-block-switcher__toggle .block-editor-block-icon::after { content: ""; pointer-events: none; display: block; width: 0; height: 0; border-left: 3px solid transparent; border-right: 3px solid transparent; border-top: 5px solid currentColor; margin-left: 4px; margin-right: 2px; } .tma-block-toolbar-wrap .block-editor-block-settings-menu__toggle .dashicon { transform: rotate(90deg); } .tma-block-toolbar-wrap .components-icon-button.block-editor-block-switcher__toggle, .tma-block-toolbar-wrap .components-icon-button.block-editor-block-switcher__no-switcher-icon { width: auto; margin: 0; display: block; height: 36px; padding: 3px; } .tma-block-toolbar-wrap .components-icon-button.block-editor-block-switcher__toggle .block-editor-block-icon, .tma-block-toolbar-wrap .components-icon-button.block-editor-block-switcher__toggle .block-editor-block-switcher__transform { width: 42px; height: 30px; position: relative; margin: 0 auto; padding: 3px; display: flex; align-items: center; } .advanced-options .dashicons { color: #777; } .tadvmodule .the-button { margin: 0; } /* Fixes for inadequate css changes in 5.3 :( */ #tadvadmin .button, #tadvadmin .button-primary { font-size: 14px; line-height: 1.7; padding: 2px 10px 3px; } span.small-info { font-weight: 400; font-size: 13px; } PK:\smce/code/plugin.min.jsnuW+APK:\ an Fmce/code/plugin.jsnuW+APK:\ՉB$mce/wptadv/plugin.min.jsnuW+APK:\ՉB2(mce/wptadv/plugin.jsnuW+APK:\4b 88  Umce/contextmenu/plugin.min.jsnuW+APK:\#w *]mce/print/plugin.min.jsnuW+APK:\2tB_mce/print/plugin.jsnuW+APK:\s=cmce/visualblocks/plugin.jsnuW+APK:\tmce/visualblocks/plugin.min.jsnuW+APK:\vCCt{mce/visualblocks/img/h4.gifnuW+APK:\ɚBB|mce/visualblocks/img/h3.gifnuW+APK:\+hCC|mce/visualblocks/img/h2.gifnuW+APK:\wCC}mce/visualblocks/img/h5.gifnuW+APK:\F'LL}mce/visualblocks/img/pre.gifnuW+APK:\O@@C~mce/visualblocks/img/ol.gifnuW+APK:\vCbb ~mce/visualblocks/img/section.gifnuW+APK:\.d``mce/visualblocks/img/hgroup.gifnuW+APK:\Amce/anchor/plugin.jsnuW+APK:\zԦ/Lmce/anchor/plugin.min.jsnuW+APK:\$Rmce/emoticons/plugin.min.jsnuW+APK:\?o; ;  mce/importcss/plugin.min.jsnuW+APK:\xt!E* block-editor/classic-paragraph.jsnuW+APK:\,y$"OH block-editor/classic-paragraph.cssnuW+APK:\zg!J block-editor/richtext-buttons.cssnuW+APK:\Uߏ!L block-editor/tma-block-editor.cssnuW+APK:\JΦ>->- \ block-editor/richtext-buttons.jsnuW+APK:\J@@  readme.txtnuW+APK:\{ Z tadv_admin.phpnuW+APK:\ !ëës tinymce-advanced.phpnuW+APK:\x  uninstall.phpnuW+APK:\:<(Z! plugin-assets/tadv.jsnuW+APK:\JkAA; plugin-assets/images/colors.pngnuW+APK:\`cc,)~ plugin-assets/images/toolbar-actions-rtl.pngnuW+APK:\tEُQQ# plugin-assets/images/colors-rtl.pngnuW+APK:\(Bqq( plugin-assets/images/toolbar-actions.pngnuW+APK:\pHCC plugin-assets/tadv.cssnuW+APKUU