From f2c2e26638aeb14e5b599fbdfdc6cd4352da8f3f Mon Sep 17 00:00:00 2001 From: Olivier Legat Date: Tue, 21 Sep 2021 15:04:09 +0200 Subject: [PATCH] update TinyMCE --- .../block-editor/classic-paragraph.css | 1 + .../block-editor/classic-paragraph.js | 1 + .../block-editor/richtext-buttons.css | 1 + .../block-editor/richtext-buttons.js | 1 + .../block-editor/tma-block-editor.css | 1 + .../tinymce-advanced/css/tadv-styles.css | 305 - .../plugins/tinymce-advanced/js/tadv.js | 97 - .../langs/tinymce-advanced-ar.mo | Bin 6711 -> 0 bytes .../langs/tinymce-advanced-ar.po | 352 - .../langs/tinymce-advanced-ko_KR.mo | Bin 6840 -> 0 bytes .../langs/tinymce-advanced-ko_KR.po | 339 - .../langs/tinymce-advanced-ru_RU.mo | Bin 8384 -> 0 bytes .../langs/tinymce-advanced-ru_RU.po | 558 - .../langs/tinymce-advanced-sv_SE.mo | Bin 6353 -> 0 bytes .../langs/tinymce-advanced-sv_SE.po | 362 - .../langs/tinymce-advanced.pot | 269 - .../tinymce-advanced/mce/advlist/plugin.js | 372 +- .../mce/advlist/plugin.min.js | 2 +- .../tinymce-advanced/mce/anchor/plugin.js | 317 +- .../tinymce-advanced/mce/anchor/plugin.min.js | 2 +- .../tinymce-advanced/mce/code/plugin.js | 261 +- .../tinymce-advanced/mce/code/plugin.min.js | 2 +- .../mce/contextmenu/plugin.js | 1067 +- .../mce/contextmenu/plugin.min.js | 2 +- .../tinymce-advanced/mce/importcss/plugin.js | 615 +- .../mce/importcss/plugin.min.js | 2 +- .../mce/insertdatetime/plugin.js | 378 +- .../mce/insertdatetime/plugin.min.js | 2 +- .../tinymce-advanced/mce/link/plugin.js | 749 +- .../tinymce-advanced/mce/link/plugin.min.js | 2 +- .../mce/nonbreaking/plugin.js | 227 +- .../mce/nonbreaking/plugin.min.js | 2 +- .../tinymce-advanced/mce/print/plugin.js | 164 +- .../tinymce-advanced/mce/print/plugin.min.js | 2 +- .../mce/searchreplace/plugin.js | 1119 +- .../mce/searchreplace/plugin.min.js | 2 +- .../tinymce-advanced/mce/table/plugin.js | 13722 ++++++++++------ .../tinymce-advanced/mce/table/plugin.min.js | 3 +- .../mce/visualblocks/plugin.js | 293 +- .../mce/visualblocks/plugin.min.js | 2 +- .../mce/visualchars/plugin.js | 1100 +- .../mce/visualchars/plugin.min.js | 2 +- .../tinymce-advanced/mce/wptadv/plugin.js | 163 +- .../tinymce-advanced/mce/wptadv/plugin.min.js | 234 +- .../plugin-assets/images/colors-rtl.png | Bin 0 -> 20879 bytes .../plugin-assets/images/colors.png | Bin 0 -> 16874 bytes .../images/toolbar-actions-rtl.png | Bin 0 -> 1379 bytes .../plugin-assets/images/toolbar-actions.png | Bin 0 -> 625 bytes .../tinymce-advanced/plugin-assets/tadv.css | 1005 ++ .../tinymce-advanced/plugin-assets/tadv.js | 249 + .../plugins/tinymce-advanced/readme.txt | 191 +- .../plugins/tinymce-advanced/screenshot-1.png | Bin 14418 -> 0 bytes .../plugins/tinymce-advanced/screenshot-2.png | Bin 32474 -> 0 bytes .../plugins/tinymce-advanced/screenshot-3.png | Bin 21412 -> 0 bytes .../plugins/tinymce-advanced/screenshot-4.png | Bin 27424 -> 0 bytes .../plugins/tinymce-advanced/screenshot-5.png | Bin 15102 -> 0 bytes .../plugins/tinymce-advanced/tadv_admin.php | 907 +- .../tinymce-advanced/tinymce-advanced.php | 728 +- .../plugins/tinymce-advanced/uninstall.php | 11 +- 59 files changed, 14077 insertions(+), 12109 deletions(-) create mode 100644 wp-content/plugins/tinymce-advanced/block-editor/classic-paragraph.css create mode 100644 wp-content/plugins/tinymce-advanced/block-editor/classic-paragraph.js create mode 100644 wp-content/plugins/tinymce-advanced/block-editor/richtext-buttons.css create mode 100644 wp-content/plugins/tinymce-advanced/block-editor/richtext-buttons.js create mode 100644 wp-content/plugins/tinymce-advanced/block-editor/tma-block-editor.css delete mode 100644 wp-content/plugins/tinymce-advanced/css/tadv-styles.css delete mode 100644 wp-content/plugins/tinymce-advanced/js/tadv.js delete mode 100644 wp-content/plugins/tinymce-advanced/langs/tinymce-advanced-ar.mo delete mode 100644 wp-content/plugins/tinymce-advanced/langs/tinymce-advanced-ar.po delete mode 100644 wp-content/plugins/tinymce-advanced/langs/tinymce-advanced-ko_KR.mo delete mode 100644 wp-content/plugins/tinymce-advanced/langs/tinymce-advanced-ko_KR.po delete mode 100644 wp-content/plugins/tinymce-advanced/langs/tinymce-advanced-ru_RU.mo delete mode 100644 wp-content/plugins/tinymce-advanced/langs/tinymce-advanced-ru_RU.po delete mode 100644 wp-content/plugins/tinymce-advanced/langs/tinymce-advanced-sv_SE.mo delete mode 100644 wp-content/plugins/tinymce-advanced/langs/tinymce-advanced-sv_SE.po delete mode 100644 wp-content/plugins/tinymce-advanced/langs/tinymce-advanced.pot create mode 100644 wp-content/plugins/tinymce-advanced/plugin-assets/images/colors-rtl.png create mode 100644 wp-content/plugins/tinymce-advanced/plugin-assets/images/colors.png create mode 100644 wp-content/plugins/tinymce-advanced/plugin-assets/images/toolbar-actions-rtl.png create mode 100644 wp-content/plugins/tinymce-advanced/plugin-assets/images/toolbar-actions.png create mode 100644 wp-content/plugins/tinymce-advanced/plugin-assets/tadv.css create mode 100644 wp-content/plugins/tinymce-advanced/plugin-assets/tadv.js delete mode 100644 wp-content/plugins/tinymce-advanced/screenshot-1.png delete mode 100644 wp-content/plugins/tinymce-advanced/screenshot-2.png delete mode 100644 wp-content/plugins/tinymce-advanced/screenshot-3.png delete mode 100644 wp-content/plugins/tinymce-advanced/screenshot-4.png delete mode 100644 wp-content/plugins/tinymce-advanced/screenshot-5.png diff --git a/wp-content/plugins/tinymce-advanced/block-editor/classic-paragraph.css b/wp-content/plugins/tinymce-advanced/block-editor/classic-paragraph.css new file mode 100644 index 00000000..7b309f79 --- /dev/null +++ b/wp-content/plugins/tinymce-advanced/block-editor/classic-paragraph.css @@ -0,0 +1 @@ +div[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} \ No newline at end of file diff --git a/wp-content/plugins/tinymce-advanced/block-editor/classic-paragraph.js b/wp-content/plugins/tinymce-advanced/block-editor/classic-paragraph.js new file mode 100644 index 00000000..08149117 --- /dev/null +++ b/wp-content/plugins/tinymce-advanced/block-editor/classic-paragraph.js @@ -0,0 +1 @@ +!function(e){var t={};function o(r){if(t[r])return t[r].exports;var n=t[r]={i:r,l:!1,exports:{}};return e[r].call(n.exports,n,n.exports,o),n.l=!0,n.exports}o.m=e,o.c=t,o.d=function(e,t,r){o.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},o.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},o.t=function(e,t){if(1&t&&(e=o(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(o.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var n in e)o.d(r,n,function(t){return e[t]}.bind(null,n));return r},o.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return o.d(t,"a",t),t},o.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},o.p="",o(o.s=1)}([,function(e,t,o){"use strict";o.r(t);const{wp:r}=window,{debounce:n}=window._,c=window.tadvBlockRegister,{BlockControls:a,useBlockProps:i}=r.blockEditor,{ToolbarGroup:s}=r.components,{Component:l,createElement:d,Fragment:u,useEffect:p,useRef:m}=r.element,{BACKSPACE:b,DELETE:f,F10:g,isKeyboardEvent:k}=r.keycodes;const{RawHTML:y,createElement:h}=wp.element;const{join:v,split:w,create:_,toHTMLString:B}=wp.richText,{createBlock:C,getBlockContent:E}=wp.blocks;var P={from:(()=>{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 C("tadv/classic-paragraph",{content:""});const o=E(C(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+"

":'


',C("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=E(C(t,e));return(!o||o.indexOf("")>-1)&&(o+='


'),C("tadv/classic-paragraph",{content:o})}})}),e.push({type:"raw",priority:21,isMatch:()=>!0},{type:"block",isMultiBlock:!0,blocks:["core/paragraph"],transform:e=>{const t=B({value:v(e.map(({content:e})=>_({html:e})),"\u2028"),multilineTag:"p"});return C("tadv/classic-paragraph",{content:t})}},{type:"block",isMultiBlock:!0,blocks:["tadv/classic-paragraph"],transform:e=>{const t=B({value:v(e.map(({content:e})=>_({html:e})),"\u2028")});return C("tadv/classic-paragraph",{content:t})}},{type:"block",isMultiBlock:!0,blocks:["core/freeform"],transform:e=>{const t=B({value:v(e.map(({content:e})=>_({html:e})),"\u2028")});return C("tadv/classic-paragraph",{content:t})}}),e})(),to:[{type:"block",blocks:["core/freeform"],transform:e=>C("core/freeform",e)},{type:"block",blocks:["core/html"],transform:e=>C("core/html",e)}]};const{__:x}=wp.i18n,T=window.tadvBlockRegister,{name:M,attributes:S,category:L}={name:"tadv/classic-paragraph",category:"common",attributes:{content:{type:"string",source:"html"},align:{type:"string"}}};var N={name:M,attributes:S,category:L,title:T.classicParagraphTitle,description:T.description,keywords:[x("text")],icon:"welcome-widgets-menus",supports:{className:!1,customClassName:!1,reusable:!0},merge:(e,t)=>({content:(e.content||"")+(t.content||"")}),transforms:P,edit:function({clientId:e,attributes:{content:t},setAttributes:o,onReplace:a}){const s=m(!1);return p(()=>{if(!s.current)return;const o=window.tinymce.get(`editor-${e}`);let r;o&&(r=o.getContent()),r!==t&&o.setContent(t||"")},[t]),p(()=>{const{baseURL:c,suffix:i}=window.wpEditorL10n.tinymce;function l(e){let r;t&&e.on("loadContent",()=>e.setContent(t)),e.on("blur",()=>{r=e.selection.getBookmark(2,!0);const t=document.querySelector(".interface-interface-skeleton__content"),n=t.scrollTop;return o({content:e.getContent()}),e.once("focus",()=>{r&&(e.selection.moveToBookmark(r),t.scrollTop!==n&&(t.scrollTop=n))}),!1}),e.on("mousedown touchstart",()=>{r=null});const c=n(()=>{const t=e.getContent();t!==e._lastChange&&(e._lastChange=t,o({content:t}))},250);e.on("Paste Change input Undo Redo",c),e.on("remove",c.cancel),e.on("keydown",t=>{k.primary(t,"z")&&t.stopPropagation(),t.keyCode!==b&&t.keyCode!==f||!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)||(a([]),t.preventDefault(),t.stopImmediatePropagation());const{altKey:o}=t;o&&t.keyCode===g&&t.stopPropagation()}),e.on("init",()=>{const t=e.getBody();t.ownerDocument.activeElement===t&&(t.blur(),e.focus())})}function d(){const{settings:t}=window.wpEditorL10n.tinymce;r.oldEditor.initialize(`editor-${e}`,{tinymce:{...t,inline:!0,content_css:!1,fixed_toolbar_container:`#toolbar-${e}`,setup:l}})}function u(){"complete"===document.readyState&&d()}return s.current=!0,window.tinymce.EditorManager.overrideDefaults({base_url:c,suffix:i}),"complete"===document.readyState?d():document.addEventListener("readystatechange",u),()=>{document.removeEventListener("readystatechange",u),r.oldEditor.remove(`editor-${e}`)}},[]),d("div",i(),d("div",{key:"toolbar",id:`toolbar-${e}`,className:"block-library-classic__toolbar tma-classic-paragraph__toolbar",onClick:function(){const t=window.tinymce.get(`editor-${e}`);t&&t.focus()},"data-placeholder":c.classicParagraphTitle,onKeyDown:function(e){e.stopPropagation(),e.nativeEvent.stopImmediatePropagation()}}),d("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 h(y,null,t)}};const{dispatch:O,select:j}=wp.data,{createBlock:R,rawHandler:$}=wp.blocks;var D=function(){const e=j("core/block-editor").getSelectedBlock();let t;if(e){let o=e.attributes.content;o?(/

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

/g,"

")),t=$({HTML:o})):t=R("core/paragraph"),O("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:a}=e.plugins,{registerBlockType:i,setDefaultBlockName:s}=e.blocks;t.classicParagraph?(i("tadv/classic-paragraph",N),a("tadv-add-submenu",{render:()=>(t.hybridMode&&s("tadv/classic-paragraph"),o(c,{allowedBlocks:["tadv/classic-paragraph"],icon:"screenoptions",label:r("Convert to Blocks"),onClick:D}))})):t.hybridMode&&a("tadv-set-default-block",{render:()=>(s("core/freeform"),null)})}()}]); \ No newline at end of file diff --git a/wp-content/plugins/tinymce-advanced/block-editor/richtext-buttons.css b/wp-content/plugins/tinymce-advanced/block-editor/richtext-buttons.css new file mode 100644 index 00000000..001c506d --- /dev/null +++ b/wp-content/plugins/tinymce-advanced/block-editor/richtext-buttons.css @@ -0,0 +1 @@ +.tadv-buttons-panel .components-toolbar__control.tadv-icon-button>svg{box-sizing:border-box;outline:none;box-shadow:none}.tadv-buttons-panel .components-toolbar{border:none}.tadv-mark-icon{background-color:#fff9c0;background-clip:content-box} \ No newline at end of file diff --git a/wp-content/plugins/tinymce-advanced/block-editor/richtext-buttons.js b/wp-content/plugins/tinymce-advanced/block-editor/richtext-buttons.js new file mode 100644 index 00000000..0b97da4f --- /dev/null +++ b/wp-content/plugins/tinymce-advanced/block-editor/richtext-buttons.js @@ -0,0 +1 @@ +!function(t){var e={};function o(r){if(e[r])return e[r].exports;var n=e[r]={i:r,l:!1,exports:{}};return t[r].call(n.exports,n,n.exports,o),n.l=!0,n.exports}o.m=t,o.c=e,o.d=function(t,e,r){o.o(t,e)||Object.defineProperty(t,e,{enumerable:!0,get:r})},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 r=Object.create(null);if(o.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:t}),2&e&&"string"!=typeof t)for(var n in t)o.d(r,n,function(e){return t[e]}.bind(null,n));return r},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 r=window.tadvBlockButtons,{wp:n}=window,{get:c}=window.lodash,{createElement:a}=n.element,{InspectorControls:l,PanelColorSettings:i}=n.blockEditor,{registerFormatType:s,applyFormat:u,removeFormat:d,getActiveFormat:m}=n.richText;function p(t){return(t=t.replace(/.*?(background-)?color:\s*/,"")).replace(/[; ]+$/,"")}const h=window.tadvBlockButtons||{},{wp:v}=window,{RichTextToolbarButton:g}=v.blockEditor,{registerFormatType:f,removeFormat:b}=v.richText,{createElement:y}=v.element,{ToolbarButton:k}=v.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,r=e.length;t.end>t.start&&(o=t.start,r=t.end,e=e.slice(o,r));const n=T(e);return n.length?(n.forEach(e=>{t=b(t,e,o,r)}),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:L,removeFormat:M}=x.richText,U=N("Strikethrough");function j(t,e,o){e(R(t,{type:"core/strikethrough"})),o&&o()}const{wp:z}=window,{createElement:I,Fragment:G}=z.element,{__:H}=z.i18n,{ToolbarButton:V}=z.components,{RichTextToolbarButton:$,RichTextShortcut:q}=z.blockEditor,{registerFormatType:D,getActiveFormat:J,toggleFormat:K,remove:Q,applyFormat:W}=z.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,{__:rt}=Z.i18n,{ToolbarButton:nt}=Z.components,{RichTextToolbarButton:ct,RichTextShortcut:at}=Z.blockEditor,{Path:lt,SVG:it}=Z.components,{registerFormatType:st,getActiveFormat:ut,toggleFormat:dt,applyFormat:mt,removeFormat:pt}=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"})),vt=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,r){if(t)o(Nt(e,"core/underline"));else{o(At(e,{type:"core/underline",attributes:{style:"text-decoration: underline"}}))}r&&r()}const{wp:St}=window,_t=window.tadvBlockButtons,{createElement:Ot,Fragment:Pt}=St.element,{registerFormatType:Rt,getActiveFormat:Lt,toggleFormat:Mt}=St.richText,{ToolbarButton:Ut}=St.components,{RichTextToolbarButton:jt,RichTextShortcut:zt}=St.blockEditor,{Path:It,SVG:Gt}=St.components,Ht=Ot(Gt,{viewBox:"0 0 24 24",xmlns:"http://www.w3.org/2000/svg"},Ot(It,{"aria-hidden":"true",role:"img",focusable:"false",d:"M16.9 10.3l.8-1.3c.4-.6.7-1.2.9-1.6.2-.4.3-.8.3-1.2 0-.3-.1-.7-.2-1-.2-.2-.4-.4-.7-.6-.3-.2-.6-.3-1-.3s-.8.1-1.1.2c-.3.1-.7.3-1 .6l.1 1.3c.3-.3.5-.5.8-.6s.6-.2.9-.2c.3 0 .5.1.7.2.2.2.2.4.2.7 0 .3-.1.5-.2.8-.1.3-.4.7-.8 1.3l-1.8 2.8h4.3v-1.2h-2.2zm-2.8-3.1h-2L9.5 11 6.9 7.2h-2l3.6 5.3L4.7 18h2l2.7-4 2.7 4h2l-3.8-5.5 3.8-5.3z"})),Vt=Ot(Gt,{viewBox:"0 0 24 24",xmlns:"http://www.w3.org/2000/svg"},Ot(It,{"aria-hidden":"true",role:"img",focusable:"false",d:"M16.9 18.3l.8-1.2c.4-.6.7-1.2.9-1.6.2-.4.3-.8.3-1.2 0-.3-.1-.7-.2-1-.1-.3-.4-.5-.6-.7-.3-.2-.6-.3-1-.3s-.8.1-1.1.2c-.3.1-.7.3-1 .6l.2 1.3c.3-.3.5-.5.8-.6s.6-.2.9-.2c.3 0 .5.1.7.2.2.2.2.4.2.7 0 .3-.1.5-.2.8-.1.3-.4.7-.8 1.3L15 19.4h4.3v-1.2h-2.4zM14.1 7.2h-2L9.5 11 6.9 7.2h-2l3.6 5.3L4.7 18h2l2.7-4 2.7 4h2l-3.8-5.5 3.8-5.3z"}));function $t(t,e,o,r){o(Mt(e,{type:t})),r&&r()}function qt({type:t,tagName:e,title:o,character:r,icon:n},c){Rt(t,{title:o,tagName:e,className:null,edit({value:e,onChange:a,onFocus:l,isActive:i}){let s=null;return c||(s=Ot(jt,{title:o,icon:n,onClick:()=>$t(t,e,a,l),isActive:i,shortcutType:"primary",shortcutCharacter:r})),Ot(Pt,null,Ot(zt,{type:"primary",character:r,onUse:()=>$t(t,e,a)}),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(","):[],re=ee.panelButtons?ee.panelButtons.split(","):[],ne=ee.unusedButtons?ee.unusedButtons.split(","):[],ce={"tadv/mark":function(t){st("tadv/mark",{title:vt,tagName:"mark",className:null,edit({value:e,onChange:o,onFocus:r,isActive:n}){let c=null;return t||(c=et(ct,{title:vt,icon:ht,onClick:()=>gt(e,o,r),className:"tadv-icon-button-mark",isActive:n,shortcutType:"access",shortcutCharacter:"m"})),et(ot,null,et(at,{type:"access",character:"m",onUse:()=>gt(e,o)}),c)}})},"tadv/removeformat":function(t){f("tadv/removeformat",{title:w,tagName:"u",className:"remove-format",edit:({value:e,onChange:o,onFocus:r,isActive:n})=>t?null:y(g,{icon:"editor-removeformatting",title:w,onClick:()=>o(C(e)),isActive:null})})},"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 r=o.slice(0,e-1).lastIndexOf("`");if(-1===r)return t;const n=r,c=e-2;return n===c?t:(t=Q(t,n,n+1),t=Q(t,c,c+1),t=W(t,{type:"core/code"},n,c))},edit({value:e,onChange:o,onFocus:r,isActive:n}){let c=null;return t||(c=I($,{icon:"editor-code",title:X,onClick:()=>Y(e,o,r),isActive:n,shortcutType:"access",shortcutCharacter:"x"})),I(G,null,I(q,{type:"access",character:"x",onUse:()=>Y(e,o)}),c)}})},"core/strikethrough":function(t){O("core/strikethrough",{name:"core/strikethrough",title:U,tagName:"s",className:null,edit({value:e,onChange:o,onFocus:r,isActive:n}){let c=null;return t||(c=B(S,{icon:"editor-strikethrough",title:U,onClick:()=>j(e,o,r),isActive:n,shortcutType:"access",shortcutCharacter:"d"})),B(A,null,B(_,{type:"access",character:"d",onUse:()=>j(e,o)}),c)}})},"core/underline":function(t){xt("core/underline",{title:bt.strUnderline,tagName:"span",className:"underline",attributes:{style:"style"},edit({value:e,onChange:o,onFocus:r,isActive:n}){let c=null;return t||(c=yt(Tt,{title:bt.strUnderline,icon:"editor-underline",onClick:()=>Et(n,e,o,r),className:null,isActive:n,shortcutType:"primary",shortcutCharacter:"u"})),yt(kt,null,yt(Ct,{type:"primary",character:"u",onUse:()=>Et(n,e,o)}),c)}})},"core/subscript":function(t){qt({type:"core/subscript",tagName:"sub",title:_t.strSubscript,character:",",icon:Vt},t)},"core/superscript":function(t){qt({type:"core/superscript",tagName:"sup",title:_t.strSuperscript,character:".",icon:Ht},t)}},ae={"tadv/mark":function({value:t,onChange:e,onFocus:o,isActive:r}){return et(nt,{key:"tadv/mark",icon:"editor-textcolor",className:"tadv-icon-button tadv-icon-button-mark",isActive:ut(t,"tadv/mark"),title:vt,onClick:()=>gt(t,e,o)})},"tadv/removeformat":function({value:t,onChange:e,onFocus:o,isActive:r}){return y(k,{key:"tadv/removeformat",icon:"editor-removeformatting",className:"tadv-icon-button",title:w,onClick:()=>e(C(t))})},"core/code":function({value:t,onChange:e,onFocus:o,isActive:r}){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:r}){return B(E,{key:"core/strikethrough",icon:"editor-strikethrough",className:"tadv-icon-button",isActive:P(t,"core/strikethrough"),title:U,onClick:()=>j(t,e,o)})},"core/underline":function({value:t,onChange:e,onFocus:o,isActive:r}){const n=!!Bt(t,"core/underline");return yt(Ft,{key:"core/underline",icon:"editor-underline",className:"tadv-icon-button",isActive:n,title:bt.strUnderline,onClick:()=>Et(n,t,e,o)})},"core/subscript":function({value:t,onChange:e,onFocus:o,isActive:r}){return Ot(Ut,{key:"core/subscript",icon:Vt,className:"tadv-icon-button",isActive:Lt(t,"core/subscript"),title:_t.strSubscript,onClick:()=>$t("core/subscript",t,e,o)})},"core/superscript":function({value:t,onChange:e,onFocus:o,isActive:r}){return Ot(Ut,{key:"core/superscript",icon:Ht,className:"tadv-icon-button",isActive:Lt(t,"core/superscript"),title:_t.strSuperscript,onClick:()=>$t("core/superscript",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(){ne.length&&ne.forEach(t=>{le(t)}),oe.forEach(t=>{ce.hasOwnProperty(t)&&(le(t),ce[t].call(null))}),re.length&&(re.forEach(t=>{-1===oe.indexOf(t)&&ce.hasOwnProperty(t)&&(le(t),ce[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:r}){const n=[];return re.forEach(c=>{ae.hasOwnProperty(c)&&n.push(ae[c].call(null,{value:t,onChange:e,onFocus:o,isActive:r}))}),Jt(Yt,null,Jt(Wt,{title:ee.strFormatting,className:"tadv-buttons-panel"},Jt(Xt,null,n)))}})),function(){if(!r.colorPanel)return;const t=r.colorPanel.indexOf("tadv/color-panel")>-1,e=r.colorPanel.indexOf("tadv/background-color-panel")>-1;t&&s("tadv/color-panel",{title:r.strTextColor,tagName:"span",className:"tadv-color",attributes:{style:"style"},edit({isActive:t,value:o,onChange:n}){let s,h;if(t){const t=m(o,"tadv/color-panel"),e=c(t,["attributes","style"])||"",r=m(o,"tadv/background-color-panel"),n=c(r,["attributes","style"])||"";s=p(e),h=p(n)}const v=[{value:s,onChange:t=>{n(t?u(o,{type:"tadv/color-panel",attributes:{style:"color:"+t}}):d(o,"tadv/color-panel"))},label:r.strTextColorLabel}];return e&&v.push({value:h,onChange:t=>{n(t?u(o,{type:"tadv/background-color-panel",attributes:{style:"background-color:"+t}}):d(o,"tadv/background-color-panel"))},label:r.strBackgroundColorLabel}),a(l,null,a(i,{title:r.strTextColor,initialOpen:!1,colorSettings:v}))}}),s("tadv/background-color-panel",{title:r.strBackgroundColor,tagName:"span",className:"tadv-background-color",attributes:{style:"style"},edit({isActive:o,value:n,onChange:s}){if(!e||t)return null;let h;if(o){const t=m(n,"tadv/background-color-panel");h=p(c(t,["attributes","style"])||"")}const v=[{value:h,onChange:t=>{s(t?u(n,{type:"tadv/background-color-panel",attributes:{style:"background-color:"+t}}):d(n,"tadv/background-color-panel"))},label:r.strBackgroundColorLabel}];return a(l,null,a(i,{title:r.strTextColor,initialOpen:!1,colorSettings:v}))}})}()}let se;Qt("blocks.registerBlockType","tadv-register-formats",(function(t){return se||(ie(),se=!0),t}))}]); \ No newline at end of file diff --git a/wp-content/plugins/tinymce-advanced/block-editor/tma-block-editor.css b/wp-content/plugins/tinymce-advanced/block-editor/tma-block-editor.css new file mode 100644 index 00000000..2d456581 --- /dev/null +++ b/wp-content/plugins/tinymce-advanced/block-editor/tma-block-editor.css @@ -0,0 +1 @@ +div[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:.4em}.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%} \ No newline at end of file diff --git a/wp-content/plugins/tinymce-advanced/css/tadv-styles.css b/wp-content/plugins/tinymce-advanced/css/tadv-styles.css deleted file mode 100644 index 2caccbe6..00000000 --- a/wp-content/plugins/tinymce-advanced/css/tadv-styles.css +++ /dev/null @@ -1,305 +0,0 @@ -/** - * 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-2016 Andrew Ozz. All rights reserved. - */ - -.tadv-more-plugins label { - font-weight: bold; - padding: 0 10px; -} - -.advanced-options label { - font-weight: bold; -} - -.advanced-options { - margin: 20px 0; - border: 1px solid #ccc; - padding: 0 15px; -} - -.advanced-options div { - margin: 1.2em 0; -} - -.advanced-options p { - margin-left: 22px; - margin-top: 5px; -} - -.advanced-options h3 { - margin-top: 15px; -} - -.tadv-more-plugins { - margin-bottom: 30px; -} - -.tadv-submit .button-large { - float: right; -} - -#tadv-import-error { - height: 22px; -} - -#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-export, -#tadv-import { - width: 100%; - height: 300px; - 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; -} - -#tadv-mce-menu { - 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; -} - -#tadv-mce-menu .mce-btn .mce-caret { - margin-top: 9px; - margin-left: 1px; -} - -#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; -} - -#tadvzones { - margin: 25px 280px 0 0; -} - -.tadvdropzone { - padding: 2px 4px; - margin: 0 0 10px; - background-color: #fff; - border: 1px solid #bbb; -} - -#unuseddiv.highlighted, -.tadvdropzone.highlighted { - background-color: #efefe9; - 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: 0 3px; -} - -.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 { - padding: 10px; - border: 1px solid #ccc; -} - -#unuseddiv h3 { - margin: 5px 5px 12px; -} - -#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: 22px; - width: 140px; - border: 1px solid #bbb; - background-color: #fff; - margin: 1px; - padding: 1px 3px; - -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: 22px; -} - -#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; - font-weight: bold; -} diff --git a/wp-content/plugins/tinymce-advanced/js/tadv.js b/wp-content/plugins/tinymce-advanced/js/tadv.js deleted file mode 100644 index be371f98..00000000 --- a/wp-content/plugins/tinymce-advanced/js/tadv.js +++ /dev/null @@ -1,97 +0,0 @@ -/** - * 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-2016 Andrew Ozz. All rights reserved. - */ - -jQuery( document ).ready( function( $ ) { - var $importElement = $('#tadv-import'), - $importError = $('#tadv-import-error'); - - $('.container').sortable({ - connectWith: '.container', - items: '> 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, - containment: 'document' - }); - - $( '#menubar' ).on( 'change', function() { - $( '#tadv-mce-menu' ).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 + '[]' : '' ); - }); - }); - - $('#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 ) ); - } - }); - } -}); diff --git a/wp-content/plugins/tinymce-advanced/langs/tinymce-advanced-ar.mo b/wp-content/plugins/tinymce-advanced/langs/tinymce-advanced-ar.mo deleted file mode 100644 index f65cfefd2191bc10b2e75e23393e3c12f5dc4f6b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6711 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

Fj_utext (.txt) file, using a " -"plain text editor like Notepad." -msgstr "" -"الرجاء انسخ المحتوى وواحفظه في ملف.txt , استخدم محرر بسيط مثل نوتباد." - -#: ../tadv_admin.php:158 -msgid "" -"It is important that the export is not changed in any way, no spaces, line " -"breaks, etc." -msgstr "" -"من المهم ان لايتم تعديل التصدير بأي طريقة , لامسافات , خطوط فارغة , الخ" - -#: ../tadv_admin.php:163 -msgid "Select All" -msgstr "تحديد الكل" - -#: ../tadv_admin.php:165 ../tadv_admin.php:191 -msgid "Back to Editor Settings" -msgstr "العودة الى اعدادات الحرر" - -#: ../tadv_admin.php:177 -msgid "TinyMCE Advanced Settings Import" -msgstr "TinyMCE Advanced إستيراد إعدادات" - -#: ../tadv_admin.php:180 -msgid "" -"The settings are imported from a JSON encoded string. Please paste the " -"exported string in the text area below." -msgstr "" -"الاعدادات مستوردة من JSON سلسلة مشفرة ,الرجاء الصاق السلسلة المصدرة في " -"منطقة النص ادناه." - -#: ../tadv_admin.php:185 -msgid "Verify" -msgstr "تحقق" - -#: ../tadv_admin.php:186 -msgid "Import" -msgstr "إستيراد" - -#: ../tadv_admin.php:216 -msgid "Importing of settings failed." -msgstr "إستيراد الاعدادات فشل." - -#: ../tadv_admin.php:242 -msgid "ERROR: All toolbars are empty. Default settings loaded." -msgstr "خطأ: جميع الاشرطة فارغة. الاعدادات الافتراضية ارجعت." - -#: ../tadv_admin.php:254 -msgid "Editor Settings" -msgstr "إعدادات المحرر" - -#: ../tadv_admin.php:261 -msgid "Settings saved." -msgstr "الاعدادات حفظت." - -#: ../tadv_admin.php:270 ../tadv_admin.php:540 -msgid "Save Changes" -msgstr "حفظ التغييرات" - -#: ../tadv_admin.php:277 -msgid "Enable the editor menu." -msgstr "تفعيل قائمة المحرر." - -#: ../tadv_admin.php:389 -msgid "" -"Drag buttons from the unused buttons below and drop them in the toolbars " -"above, or drag the buttons in the toolbars to rearrange them." -msgstr "" -"اسحب الازرار من منطقة الازرار الغير مستخدمة في الاسفل وافلتها في الشريط " -"العلوي , او اسحب الازرار من الشريط لاعادة ترتيبهم." - -#: ../tadv_admin.php:392 -msgid "Unused Buttons" -msgstr "الازرار الغير مستخدمة" - -#: ../tadv_admin.php:434 -#, fuzzy -msgid "Options" -msgstr "خيارات متقدمة" - -#: ../tadv_admin.php:437 -msgid "List Style Options" -msgstr "قائمة خيارات الشكل" - -#: ../tadv_admin.php:439 -msgid "" -"Enable more list options: upper or lower case letters for ordered lists, " -"disk or square for unordered lists, etc." -msgstr "" - -#: ../tadv_admin.php:444 -msgid "Context Menu" -msgstr "حالة القائمة" - -#: ../tadv_admin.php:446 -msgid "Replace the browser context (right-click) menu." -msgstr "" - -#: ../tadv_admin.php:451 -msgid "Alternative link dialog" -msgstr "" - -#: ../tadv_admin.php:453 -msgid "" -"Open the TinyMCE link dialog when using the link button on the toolbar or " -"the link menu item." -msgstr "" - -#: ../tadv_admin.php:458 -msgid "Font sizes" -msgstr "" - -#: ../tadv_admin.php:459 -#, fuzzy -msgid "" -"Replace the size setting available for fonts with: 8px 10px 12px 14px 16px " -"20px 24px 28px 32px 36px 48px 60px." -msgstr "" -"استبدل خيار حجم الخطوط مع :8px 10px 12px 14px 16px 20px 24px 28px 32px 36px." - -#: ../tadv_admin.php:467 -msgid "Advanced Options" -msgstr "خيارات متقدمة" - -#: ../tadv_admin.php:476 -msgid "Create CSS classes menu" -msgstr "" - -#: ../tadv_admin.php:478 -msgid "" -"Load the CSS classes used in editor-style.css and replace the Formats button " -"and sub-menu." -msgstr "" -"استخدم كلاسات css المستخدمة في ملف editor-style.css , و استبدل زر الصيغ " -"والقائمة الفرعية." - -#: ../tadv_admin.php:488 -msgid "Keep paragraph tags" -msgstr "" - -#: ../tadv_admin.php:490 -#, fuzzy -msgid "" -"Stop removing the <p> and <br /> tags when saving and show them " -"in the Text editor." -msgstr "ايقاف حذف وسم <p> و <br /> عند الحفظ وعرضهم في محرر النصوص" - -# تحتاج مراجعة -#: ../tadv_admin.php:491 -msgid "" -"This will make it possible to use more advanced coding in the HTML editor " -"without the back-end filtering affecting it much." -msgstr "" -"هذه سوف تتيح لك استخدام HTML اكثر تقدما بدون فلاتر ومؤثرات برمجية كثيرة." - -#: ../tadv_admin.php:492 -msgid "" -"However it may behave unexpectedly in rare cases, so test it thoroughly " -"before enabling it permanently." -msgstr "" -"على اية حال انه تصرف مفاجئ في حالات نادرة , لذا قم بتجربته بشكل كامل قبل " -"تضمينه." - -#: ../tadv_admin.php:493 -msgid "" -"Line breaks in the HTML editor would still affect the output, in particular " -"do not use empty lines, line breaks inside HTML tags or multiple <br /" -"> tags." -msgstr "" -"الخطوط الفارغة في محرر HTML سوف تؤثر في الاخراج . لذا لاتستخدم خطوط فارغة " -"داخل وسوم HTML او تعدد وسوم <br /> ." - -#: ../tadv_admin.php:498 -msgid "Enable pasting of image source" -msgstr "تفعيل اللصق بمصدر الصورة" - -#: ../tadv_admin.php:500 -msgid "" -"Works only in Firefox and Safari. These browsers support pasting of images " -"directly in the editor and convert them to base64 encoded text." -msgstr "" -"تعمل فقط على فايرفوكس و سفاري. هؤلاء المتصفحات يدعمون لصق الصور مباشرة في " -"المحرر و تحويلها الى base64 نص مشفر." - -#: ../tadv_admin.php:501 -msgid "" -"This is not acceptable for larger images like photos or graphics, but may be " -"useful in some cases for very small images like icons, not larger than 2-3KB." -msgstr "" -"هذه غير متوافقة للصور الكبير مثل الصور الفوتوغرافية , ولكنها مفيدة لالصور " -"الصغيرة كالايقونات , ليست اكبر من 2-3 كيلوبايت" - -#: ../tadv_admin.php:502 -msgid "These images will not be available in the Media Library." -msgstr "لن تكون هذه الصور متاحة في مكتبة الوسائط." - -#: ../tadv_admin.php:508 -msgid "Administration" -msgstr "الادارة" - -#: ../tadv_admin.php:510 -msgid "Settings import and export" -msgstr "" - -#: ../tadv_admin.php:512 -msgid "Export Settings" -msgstr "تصدير الاعدادات" - -#: ../tadv_admin.php:513 -msgid "Import Settings" -msgstr "استيراد الاعدادات" - -#: ../tadv_admin.php:517 -#, fuzzy -msgid "Enable the editor enhancements for:" -msgstr "تفعيل قائمة المحرر." - -#: ../tadv_admin.php:520 -msgid "The main editor (Add New and Edit posts and pages)" -msgstr "" - -#: ../tadv_admin.php:524 -msgid "Other editors in wp-admin" -msgstr "" - -#: ../tadv_admin.php:528 -msgid "Editors on the front end of the site" -msgstr "" - -#: ../tadv_admin.php:539 -msgid "Restore Default Settings" -msgstr "استعادة الاعدادات الافتراضية" - -#: ../tadv_admin.php:545 -msgid "" -"The [Toolbar toggle] button shows or hides the second, third, and forth " -"button rows. It will only work when it is in the first row and there are " -"buttons in the second row." -msgstr "" -"زر شريط التبديل يعرض او يخفي صف الازرار الثاني ,الثالث وصاعدا. سيعمل فقط " -"عندما يكون في اول صف و الازرار في ثاني صف." - -#: ../tinymce-advanced.php:221 -#, php-format -msgid "" -"TinyMCE Advanced requires WordPress version %1$s or newer. It appears that " -"you are running %2$s. This can make the editor unstable." -msgstr "" -"TinyMCE Advanced requires WordPress version %1$s or newer. It appears that " -"you are running %2$s. This can make the editor unstable." - -#: ../tinymce-advanced.php:228 -#, php-format -msgid "" -"Please upgrade your WordPress installation or download an older version of the plugin." -msgstr "" -"Please upgrade your WordPress installation or download an older version of the plugin." - -#: ../tinymce-advanced.php:703 -#, fuzzy -msgid "Settings" -msgstr "إعدادات المحرر" - -#~ msgid "" -#~ "New in TinyMCE 4.0/WordPress 3.9 is the editor menu. When it is enabled, " -#~ "most buttons are also available as menu items." -#~ msgstr "" -#~ "جديد قائمة المحرر في TinyMCE 4.0/WordPress 3.9 , عند تفعيلها , اغلب " -#~ "الازرار متاحة في القائمة." - -#~ msgid "Also enable:" -#~ msgstr "فعل ايضا:" - -#~ msgid "Link (replaces the Insert/Edit Link dialog)" -#~ msgstr "رابط (استبدال المدرج/تعديل رابط الحوار)" - -#~ msgid "Import editor-style.css." -#~ msgstr "استيراد ملفeditor-style.css." - -#~ msgid "" -#~ "It seems your theme does not support customised styles for the editor." -#~ msgstr "يبدو ان قالبك لايدعم الستايل المخصص للمحرر." - -#~ msgid "" -#~ "You can create a CSS file named editor-style.css and upload " -#~ "it to your theme's directory." -#~ msgstr "" -#~ "تستطيع انشاء ملف CSS بأسم editor-style.css ورفعه الى مسار " -#~ "الثيم الخاص بك." - -#~ msgid "After that, enable this setting." -#~ msgstr "بعد ذلك, فعل هذا" - -#~ msgid "Replace font size settings" -#~ msgstr " استبداال خيارات حجم الخط" - -#~ msgid "Markdown typing support (text pattern plugin)" -#~ msgstr "دعم تنسيق الكتابة ( اضافة اسلوب النص )" - -#~ msgid "" -#~ "This plugin matches special patterns while you type and applies formats " -#~ "or executes commands on the matched text." -#~ msgstr "هذه الاضافة " - -#~ msgid "" -#~ "The default patterns are the same as the markdown syntax so you can type " -#~ "# text to create a header, 1. text to create a " -#~ "list, **text** to make it bold, etc." -#~ msgstr "" -#~ "الاساليب الافتراضية هي نفسها الموجودة في markdown syntax لذا يمكنك كتابة " -#~ "# text لإنشاء هيدر , 1. text لإنشاء قائمة ," -#~ "**text** لجعله سميك , الخ" - -#~ msgid "More information" -#~ msgstr "معلومات اكثر" diff --git a/wp-content/plugins/tinymce-advanced/langs/tinymce-advanced-ko_KR.mo b/wp-content/plugins/tinymce-advanced/langs/tinymce-advanced-ko_KR.mo deleted file mode 100644 index ad391fb1e6931b9d9bc36f9825bcd25747b792c7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6840 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 diff --git a/wp-content/plugins/tinymce-advanced/langs/tinymce-advanced-ko_KR.po b/wp-content/plugins/tinymce-advanced/langs/tinymce-advanced-ko_KR.po deleted file mode 100644 index c9c95dc6..00000000 --- a/wp-content/plugins/tinymce-advanced/langs/tinymce-advanced-ko_KR.po +++ /dev/null @@ -1,339 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: TinyMCE Advanced\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-03-17 12:21-0800\n" -"PO-Revision-Date: 2016-03-17 12:24-0800\n" -"Last-Translator: jminst \n" -"Language-Team: \n" -"Language: ko\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=1; plural=0;\n" -"X-Poedit-SourceCharset: UTF-8\n" -"X-Generator: Poedit 1.6.9\n" -"X-Poedit-Basepath: .\n" -"X-Poedit-KeywordsList: _:1;gettext:1;dgettext:2;ngettext:1,2;dngettext:2,3;" -"__:1;_e:1;_c:1;_n:1,2;_n_noop:1,2;_nc:1,2;__ngettext:1,2;__ngettext_noop:1,2;" -"_x:1,2c;_ex:1,2c;_nx:1,2,4c;_nx_noop:1,2,3c;_n_js:1,2;_nx_js:1,2,3c;" -"esc_attr__:1;esc_html__:1;esc_attr_e:1;esc_html_e:1;esc_attr_x:1,2c;" -"esc_html_x:1,2c;comments_number_link:2,3;t:1;st:1;trans:1;transChoice:1,2\n" -"X-Loco-Target-Locale: ko_KR\n" -"X-Poedit-SearchPath-0: .\n" -"X-Poedit-SearchPath-1: ..\n" - -#: ../tadv_admin.php:140 -msgid "Default settings restored." -msgstr "기본 설정이 복구됨." - -#: ../tadv_admin.php:152 -msgid "TinyMCE Advanced Settings Export" -msgstr "TinyMCE 고급 설정 내보내기" - -#: ../tadv_admin.php:156 -msgid "The settings are exported as a JSON encoded string." -msgstr "설정은 JSON 인코딩 스트링으로 내보냅니다." - -#: ../tadv_admin.php:157 -msgid "" -"Please copy the content and save it in a text (.txt) file, using a " -"plain text editor like Notepad." -msgstr "" -"내용을 복사하여 메모장과 같은 평문 편집기를 사용하여 텍스트 (.txt) 파" -"일로 저장해주세요." - -#: ../tadv_admin.php:158 -msgid "" -"It is important that the export is not changed in any way, no spaces, line " -"breaks, etc." -msgstr "내보내기에 띄어쓰기, 줄 바꿈 등의 변경사항이 없는 것이 중요합니다." - -#: ../tadv_admin.php:163 -msgid "Select All" -msgstr "모두 선택" - -#: ../tadv_admin.php:165 ../tadv_admin.php:191 -msgid "Back to Editor Settings" -msgstr "편집기 설정으로 돌아가기" - -#: ../tadv_admin.php:177 -msgid "TinyMCE Advanced Settings Import" -msgstr "TinyMCE 고급 설정 가져오기" - -#: ../tadv_admin.php:180 -msgid "" -"The settings are imported from a JSON encoded string. Please paste the " -"exported string in the text area below." -msgstr "" -"설정은 JSON 인코딩 스트링에서 가져옵니다. 내보낸 스트링을 아래 텍스트 영역에 " -"붙여넣어주세요." - -#: ../tadv_admin.php:185 -msgid "Verify" -msgstr "검증" - -#: ../tadv_admin.php:186 -msgid "Import" -msgstr "가져오기" - -#: ../tadv_admin.php:216 -msgid "Importing of settings failed." -msgstr "설정 가져오기를 실패함." - -#: ../tadv_admin.php:242 -msgid "ERROR: All toolbars are empty. Default settings loaded." -msgstr "오류: 모든 도구 표시줄이 비어있습니다. 기본 설정을 불러왔습니다." - -#: ../tadv_admin.php:254 -msgid "Editor Settings" -msgstr "편집기 설정" - -#: ../tadv_admin.php:261 -msgid "Settings saved." -msgstr "설정이 저장됨." - -#: ../tadv_admin.php:270 ../tadv_admin.php:540 -msgid "Save Changes" -msgstr "변경사항 저장" - -#: ../tadv_admin.php:277 -msgid "Enable the editor menu." -msgstr "편집기 메뉴를 활성화합니다." - -#: ../tadv_admin.php:389 -msgid "" -"Drag buttons from the unused buttons below and drop them in the toolbars " -"above, or drag the buttons in the toolbars to rearrange them." -msgstr "" -"아래 사용하지 않은 버튼에서 끌어다 위의 도구 표시줄에 놓거나, 도구 표시줄의 " -"버튼을 끌어다 재배치하십시오." - -#: ../tadv_admin.php:392 -msgid "Unused Buttons" -msgstr "사용하지 않은 버튼" - -#: ../tadv_admin.php:434 -#, fuzzy -msgid "Options" -msgstr "고급 옵션" - -#: ../tadv_admin.php:437 -msgid "List Style Options" -msgstr "목록 스타일 옵션" - -#: ../tadv_admin.php:439 -msgid "" -"Enable more list options: upper or lower case letters for ordered lists, " -"disk or square for unordered lists, etc." -msgstr "" - -#: ../tadv_admin.php:444 -msgid "Context Menu" -msgstr "콘텍스트 메뉴" - -#: ../tadv_admin.php:446 -msgid "Replace the browser context (right-click) menu." -msgstr "" - -#: ../tadv_admin.php:451 -msgid "Alternative link dialog" -msgstr "" - -#: ../tadv_admin.php:453 -msgid "" -"Open the TinyMCE link dialog when using the link button on the toolbar or " -"the link menu item." -msgstr "" - -#: ../tadv_admin.php:458 -msgid "Font sizes" -msgstr "" - -#: ../tadv_admin.php:459 -msgid "" -"Replace the size setting available for fonts with: 8px 10px 12px 14px 16px " -"20px 24px 28px 32px 36px 48px 60px." -msgstr "" -"다음 글꼴에 사용 가능한 크기 설정을 대체합니다: 8px 10px 12px 14px 16px 20px " -"24px 28px 32px 36px 48px 60px." - -#: ../tadv_admin.php:467 -msgid "Advanced Options" -msgstr "고급 옵션" - -#: ../tadv_admin.php:476 -msgid "Create CSS classes menu" -msgstr "" - -#: ../tadv_admin.php:478 -msgid "" -"Load the CSS classes used in editor-style.css and replace the Formats button " -"and sub-menu." -msgstr "" -"editor-style.css 의 CSS 클래스를 불러오고 형식 버튼 및 하위 메뉴를 대체합니" -"다." - -#: ../tadv_admin.php:488 -msgid "Keep paragraph tags" -msgstr "" - -#: ../tadv_admin.php:490 -#, fuzzy -msgid "" -"Stop removing the <p> and <br /> tags when saving and show them " -"in the Text editor." -msgstr "" -"저장 시 <p> 및 <br /> 태그의 제거를 중단하고 텍스트 편집기에 표시" -"합니다." - -#: ../tadv_admin.php:491 -msgid "" -"This will make it possible to use more advanced coding in the HTML editor " -"without the back-end filtering affecting it much." -msgstr "" -"이 기능은 백엔드 필터링의 영향을 최소화하여 HTML 편집기에서 더욱 전문적인 코" -"딩을 사용할 수 있도록 합니다." - -#: ../tadv_admin.php:492 -msgid "" -"However it may behave unexpectedly in rare cases, so test it thoroughly " -"before enabling it permanently." -msgstr "" -"하지만 드문 경우 예상치 못하게 행동할 수 있으므로, 영구적으로 활성화하기 전" -"에 철저하게 검사하십시오." - -#: ../tadv_admin.php:493 -msgid "" -"Line breaks in the HTML editor would still affect the output, in particular " -"do not use empty lines, line breaks inside HTML tags or multiple <br /" -"> tags." -msgstr "" -"HTML 편집기의 줄 바꿈은 출력에 영향을 끼치므로, 특히 빈 줄, HTML 태그의 줄 바" -"꿈 또는 다중 <br /> 태그를 사용하지 마십시오." - -#: ../tadv_admin.php:498 -msgid "Enable pasting of image source" -msgstr "이미지 소스 붙여넣기 활성화" - -#: ../tadv_admin.php:500 -msgid "" -"Works only in Firefox and Safari. These browsers support pasting of images " -"directly in the editor and convert them to base64 encoded text." -msgstr "" -"파이어폭스 및 사파리에서만 작동함. 이 브라우저는 편집기에 이미지 직접 붙여넣" -"기 및 base64 인코딩 텍스트로 변환을 지원합니다. " - -#: ../tadv_admin.php:501 -msgid "" -"This is not acceptable for larger images like photos or graphics, but may be " -"useful in some cases for very small images like icons, not larger than 2-3KB." -msgstr "" -"이 기능은 사진 또는 그래픽과 같은 큰 이미지를 허용하지 않으나, 2-3KB 보다 작" -"은 아이콘과 같은 매우 작은 이미지일 경우 유용할 수 있습니다." - -#: ../tadv_admin.php:502 -msgid "These images will not be available in the Media Library." -msgstr "이 이미지는 미디어 라이브러리에 나타나지 않습니다." - -#: ../tadv_admin.php:508 -msgid "Administration" -msgstr "관리" - -#: ../tadv_admin.php:510 -msgid "Settings import and export" -msgstr "" - -#: ../tadv_admin.php:512 -msgid "Export Settings" -msgstr "설정 내보내기" - -#: ../tadv_admin.php:513 -msgid "Import Settings" -msgstr "설정 가져오기" - -#: ../tadv_admin.php:517 -#, fuzzy -msgid "Enable the editor enhancements for:" -msgstr "편집기 메뉴를 활성화합니다." - -#: ../tadv_admin.php:520 -msgid "The main editor (Add New and Edit posts and pages)" -msgstr "" - -#: ../tadv_admin.php:524 -msgid "Other editors in wp-admin" -msgstr "" - -#: ../tadv_admin.php:528 -msgid "Editors on the front end of the site" -msgstr "" - -#: ../tadv_admin.php:539 -msgid "Restore Default Settings" -msgstr "기본 설정 복원" - -#: ../tadv_admin.php:545 -msgid "" -"The [Toolbar toggle] button shows or hides the second, third, and forth " -"button rows. It will only work when it is in the first row and there are " -"buttons in the second row." -msgstr "" -"[도구 표시줄 전환] 버튼은 두 번째, 세 번째 및 네 번째 버튼 줄을 표시하거나 숨" -"깁니다. 첫 번째 줄이고 두 번째 줄에 버튼이 있을 경우에만 작동합니다. " - -#: ../tinymce-advanced.php:221 -#, php-format -msgid "" -"TinyMCE Advanced requires WordPress version %1$s or newer. It appears that " -"you are running %2$s. This can make the editor unstable." -msgstr "" -"TinyMCE Advanced 는 워드프레스 버전 %1$s 이상을 요구합니다. 현재 %2$s 이(가) " -"실행 중인 것 같습니다. 이로 인해 편집기가 불안정해질 수 있습니다." - -#: ../tinymce-advanced.php:228 -#, php-format -msgid "" -"Please upgrade your WordPress installation or download an older version of the plugin." -msgstr "" -"워드프레스 설치를 업그레이드 하시거나 이전 버전의 플러그인" -"을 다운로드 해주세요." - -#: ../tinymce-advanced.php:703 -#, fuzzy -msgid "Settings" -msgstr "편집기 설정" - -#~ msgid "" -#~ "New in TinyMCE 4.0/WordPress 3.9 is the editor menu. When it is enabled, " -#~ "most buttons are also available as menu items." -#~ msgstr "" -#~ "TinyMCE 4.0/워드프레스 3.9의 새로운 내용은 편집기 메뉴입니다. 활성화할 경" -#~ "우, 대부분의 버튼이 메뉴 항목으로도 사용 가능합니다." - -#~ msgid "Also enable:" -#~ msgstr "또한 다음을 활성화:" - -#~ msgid "Link (replaces the Insert/Edit Link dialog)" -#~ msgstr "링크 (링크 삽입/편집 대화를 대체)" - -#~ msgid "Import editor-style.css." -#~ msgstr "editor-style.css를 가져오십시오." - -#~ msgid "" -#~ "It seems your theme does not support customised styles for the editor." -#~ msgstr "테마가 편집기에 사용자 지정 스타일을 지원하지 않는 것 같습니다." - -#~ msgid "" -#~ "You can create a CSS file named editor-style.css and upload " -#~ "it to your theme's directory." -#~ msgstr "" -#~ "editor-style.css 이름의 CSS 파일을 생성하여 테마의 디렉터리" -#~ "에 업로드 할 수 있습니다." - -#~ msgid "After that, enable this setting." -#~ msgstr "그런 다음, 이 설정을 활성화하십시오." - -#~ msgid "Replace font size settings" -#~ msgstr "글꼴 크기 설정 바꾸기" diff --git a/wp-content/plugins/tinymce-advanced/langs/tinymce-advanced-ru_RU.mo b/wp-content/plugins/tinymce-advanced/langs/tinymce-advanced-ru_RU.mo deleted file mode 100644 index 301705db7355ff31a0bc58bc413064ff158ca414..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8384 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 diff --git a/wp-content/plugins/tinymce-advanced/langs/tinymce-advanced-ru_RU.po b/wp-content/plugins/tinymce-advanced/langs/tinymce-advanced-ru_RU.po deleted file mode 100644 index a1f00a42..00000000 --- a/wp-content/plugins/tinymce-advanced/langs/tinymce-advanced-ru_RU.po +++ /dev/null @@ -1,558 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: tinymce-advanced\n" -"POT-Creation-Date: 2016-03-17 12:21-0800\n" -"PO-Revision-Date: 2016-03-17 12:24-0800\n" -"Last-Translator: Vadim Bogaiskov \n" -"Language-Team: Vadim Bogaiskov\n" -"Language: ru\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"X-Generator: Poedit 1.6.9\n" -"X-Poedit-KeywordsList: _;gettext;gettext_noop;_e;__;_n;_x\n" -"X-Poedit-Basepath: ..\n" -"Plural-Forms: nplurals=3; plural=((((n%10)==1)&&((n%100)!=11))?(0):(((((n" -"%10)>=2)&&((n%10)<=4))&&(((n%100)<10)||((n%100)>=20)))?(1):2));\n" -"X-Poedit-SourceCharset: UTF-8\n" -"X-Poedit-SearchPath-0: .\n" - -#: ../tadv_admin.php:140 -msgid "Default settings restored." -msgstr "Настройки по умолчанию восстановлены" - -#: ../tadv_admin.php:152 -msgid "TinyMCE Advanced Settings Export" -msgstr "Экспорт настроек TinyMCE Advanced" - -#: ../tadv_admin.php:156 -msgid "The settings are exported as a JSON encoded string." -msgstr "Настройки экспортируется как закодированная JSON-строка." - -#: ../tadv_admin.php:157 -msgid "" -"Please copy the content and save it in a text (.txt) file, using a " -"plain text editor like Notepad." -msgstr "" -"Пожалуйста скопируйте содержимое и сохраните его в текстовом (.txt) " -"файл, используя текстовый редактор, например Блокнот." - -#: ../tadv_admin.php:158 -msgid "" -"It is important that the export is not changed in any way, no spaces, line " -"breaks, etc." -msgstr "" -"Важно, чтобы экспорт никак не изменялся, без пробелов, разрывы строк и т.д." - -#: ../tadv_admin.php:163 -msgid "Select All" -msgstr "Выбрать все" - -#: ../tadv_admin.php:165 ../tadv_admin.php:191 -msgid "Back to Editor Settings" -msgstr "Назад в настройки редактора" - -#: ../tadv_admin.php:177 -msgid "TinyMCE Advanced Settings Import" -msgstr "Импорт настроек TinyMCE Advanced" - -#: ../tadv_admin.php:180 -msgid "" -"The settings are imported from a JSON encoded string. Please paste the " -"exported string in the text area below." -msgstr "" -"Настройки импортируются из закодированной JSON-строки. Пожалуйста вставьте " -"экспортированную строку в текстовом поле ниже." - -#: ../tadv_admin.php:185 -msgid "Verify" -msgstr "Проверить" - -#: ../tadv_admin.php:186 -msgid "Import" -msgstr "Импорт" - -#: ../tadv_admin.php:216 -msgid "Importing of settings failed." -msgstr "Импорт настроек не выполнен." - -#: ../tadv_admin.php:242 -msgid "ERROR: All toolbars are empty. Default settings loaded." -msgstr "" -"ОШИБКА: Все панели инструментов пусты. Загружены настройки по умолчанию." - -#: ../tadv_admin.php:254 -msgid "Editor Settings" -msgstr "Настройки редактора" - -#: ../tadv_admin.php:261 -msgid "Settings saved." -msgstr "Настройки сохранены." - -#: ../tadv_admin.php:270 ../tadv_admin.php:540 -msgid "Save Changes" -msgstr "Сохранить изменения" - -#: ../tadv_admin.php:277 -msgid "Enable the editor menu." -msgstr "Включить меню редактора." - -#: ../tadv_admin.php:389 -msgid "" -"Drag buttons from the unused buttons below and drop them in the toolbars " -"above, or drag the buttons in the toolbars to rearrange them." -msgstr "" -"Перетащите кнопки из области неиспользованных, расположенной ниже и " -"поместите их в панели инструментов наверху, или переместите кнопки в панелях " -"инструментов, чтобы изменить их." - -#: ../tadv_admin.php:392 -msgid "Unused Buttons" -msgstr "Неиспользуемые кнопки" - -#: ../tadv_admin.php:434 -#, fuzzy -msgid "Options" -msgstr "Дополнительные параметры" - -#: ../tadv_admin.php:437 -msgid "List Style Options" -msgstr "Список настроек стилей" - -#: ../tadv_admin.php:439 -msgid "" -"Enable more list options: upper or lower case letters for ordered lists, " -"disk or square for unordered lists, etc." -msgstr "" - -#: ../tadv_admin.php:444 -msgid "Context Menu" -msgstr "Контекстное меню" - -#: ../tadv_admin.php:446 -msgid "Replace the browser context (right-click) menu." -msgstr "" - -#: ../tadv_admin.php:451 -msgid "Alternative link dialog" -msgstr "" - -#: ../tadv_admin.php:453 -msgid "" -"Open the TinyMCE link dialog when using the link button on the toolbar or " -"the link menu item." -msgstr "" - -#: ../tadv_admin.php:458 -msgid "Font sizes" -msgstr "" - -#: ../tadv_admin.php:459 -msgid "" -"Replace the size setting available for fonts with: 8px 10px 12px 14px 16px " -"20px 24px 28px 32px 36px 48px 60px." -msgstr "" -"Заменяет настройки размера шрифта одним из доступных: 8px 10px 12px 14px " -"16px 20px 24px 28px 32px 36px 48px 60px." - -#: ../tadv_admin.php:467 -msgid "Advanced Options" -msgstr "Дополнительные параметры" - -#: ../tadv_admin.php:476 -msgid "Create CSS classes menu" -msgstr "" - -#: ../tadv_admin.php:478 -msgid "" -"Load the CSS classes used in editor-style.css and replace the Formats button " -"and sub-menu." -msgstr "" -"Загрузить классы CSS, используемые в editor-style.css и заменить кнопку " -"Форматы и подменю." - -#: ../tadv_admin.php:488 -msgid "Keep paragraph tags" -msgstr "" - -#: ../tadv_admin.php:490 -#, fuzzy -msgid "" -"Stop removing the <p> and <br /> tags when saving and show them " -"in the Text editor." -msgstr "" -"Остановить удаление тегов <p> и <br /> при сохранении и " -"показать их в текстовом редакторе" - -#: ../tadv_admin.php:491 -msgid "" -"This will make it possible to use more advanced coding in the HTML editor " -"without the back-end filtering affecting it much." -msgstr "" -"Это позволит использовать более передовые методы кодирования в редакторе " -"HTML без фоновой фильтрации, существенно влияющей на него." - -#: ../tadv_admin.php:492 -msgid "" -"However it may behave unexpectedly in rare cases, so test it thoroughly " -"before enabling it permanently." -msgstr "" -"Однако в редких случаях это может вести себя непредсказуемо, поэтому " -"тщательно проверьте его перед включением на постоянно." - -#: ../tadv_admin.php:493 -msgid "" -"Line breaks in the HTML editor would still affect the output, in particular " -"do not use empty lines, line breaks inside HTML tags or multiple <br /" -"> tags." -msgstr "" -"Переносы строк в редакторе HTML прежнему будет влиять на результат, в " -"частности, не используйте пустые строки, переносы строк внутри тегов HTML " -"или многократные теги <br />. " - -#: ../tadv_admin.php:498 -msgid "Enable pasting of image source" -msgstr "Включить вставку исходного кода изображения" - -#: ../tadv_admin.php:500 -msgid "" -"Works only in Firefox and Safari. These browsers support pasting of images " -"directly in the editor and convert them to base64 encoded text." -msgstr "" -"Работает только в Firefox и Safari. Эти браузеры поддерживают вставку " -"изображений непосредственно в редакторе и конвертацию их в base64-" -"закодированный текст." - -#: ../tadv_admin.php:501 -msgid "" -"This is not acceptable for larger images like photos or graphics, but may be " -"useful in some cases for very small images like icons, not larger than 2-3KB." -msgstr "" -"Это неприемлемо для больших изображений, таких как фотографии или графики, " -"но может быть полезным в некоторых случаях для очень маленьких изображений, " -"таких как иконки размером не более 2-3KB." - -#: ../tadv_admin.php:502 -msgid "These images will not be available in the Media Library." -msgstr "Эти изображения не будут доступны в библиотеке мультимедиа." - -#: ../tadv_admin.php:508 -msgid "Administration" -msgstr "Управление" - -#: ../tadv_admin.php:510 -msgid "Settings import and export" -msgstr "" - -#: ../tadv_admin.php:512 -msgid "Export Settings" -msgstr "Экспорт настроек" - -#: ../tadv_admin.php:513 -msgid "Import Settings" -msgstr "Импорт настроек" - -#: ../tadv_admin.php:517 -#, fuzzy -msgid "Enable the editor enhancements for:" -msgstr "Включить меню редактора." - -#: ../tadv_admin.php:520 -msgid "The main editor (Add New and Edit posts and pages)" -msgstr "" - -#: ../tadv_admin.php:524 -msgid "Other editors in wp-admin" -msgstr "" - -#: ../tadv_admin.php:528 -msgid "Editors on the front end of the site" -msgstr "" - -#: ../tadv_admin.php:539 -msgid "Restore Default Settings" -msgstr "Восстановить настройки по умолчанию" - -#: ../tadv_admin.php:545 -msgid "" -"The [Toolbar toggle] button shows or hides the second, third, and forth " -"button rows. It will only work when it is in the first row and there are " -"buttons in the second row." -msgstr "" -"Кнопка [Панель переключения] отображает/скрывает вторую, третью и четвертую " -"строки кнопок. Она будет работать только тогда, когда она находится в первой " -"строке и есть кнопки во второй строке." - -#: ../tinymce-advanced.php:221 -#, php-format -msgid "" -"TinyMCE Advanced requires WordPress version %1$s or newer. It appears that " -"you are running %2$s. This can make the editor unstable." -msgstr "" -"Для работы TinyMCE Advanced требуется WordPress версии %1$s или выше. " -"Похоже, что Вы работаете на %2$s. Это может сделать работу редактора " -"неустойчивой." - -#: ../tinymce-advanced.php:228 -#, php-format -msgid "" -"Please upgrade your WordPress installation or download an older version of the plugin." -msgstr "" -"Пожалуйста, обновите Ваш WordPress или скачайте старую версию " -"плагина ." - -#: ../tinymce-advanced.php:703 -#, fuzzy -msgid "Settings" -msgstr "Настройки редактора" - -#~ msgid "" -#~ "New in TinyMCE 4.0/WordPress 3.9 is the editor menu. When it is enabled, " -#~ "most buttons are also available as menu items." -#~ msgstr "" -#~ "Новое в TinyMCE 4.0/WordPress 3.9 - меню редактора. Когда оно включено, " -#~ "большинство кнопок, также доступны как элементы меню." - -#~ msgid "Also enable:" -#~ msgstr "Также вкл.:" - -#~ msgid "Link (replaces the Insert/Edit Link dialog)" -#~ msgstr "Ссылка (заменяет диалог Вставить/Редактировать ссылку)" - -#~ msgid "Import editor-style.css." -#~ msgstr "Импорт editor-style.css." - -#~ msgid "" -#~ "It seems your theme does not support customised styles for the editor." -#~ msgstr "" -#~ "Кажется, ваша тема не поддерживает пользовательские стили для редактора." - -#~ msgid "" -#~ "You can create a CSS file named editor-style.css and upload " -#~ "it to your theme's directory." -#~ msgstr "" -#~ "Вы можете создать CSS-файл с именем editor-style.css и " -#~ "загрузите его в папку вашей темы." - -#~ msgid "After that, enable this setting." -#~ msgstr "После этого, включить этот параметр." - -#~ msgid "Replace font size settings" -#~ msgstr "Заменить настройки размера шрифта " - -#~ msgid "" -#~ "This plugin requires WordPress version 4.0 or newer. Please upgrade your " -#~ "WordPress installation or download an %solder version of the plugin%s." -#~ msgstr "" -#~ "Для этого плагина требуется WordPress версии 4.0 или более новой. " -#~ "Обновите WordPress или загрузите %sстарую версию плагина%s." - -#~ msgid "" -#~ "The settings are exported as a JSON encoded string. Please copy the " -#~ "content and save it in a text (.txt) file, using a plain text " -#~ "editor like Notepad. It is important that the export is not changed in " -#~ "any way, no spaces, line breaks, etc." -#~ msgstr "" -#~ "Настройки экспортируется как строки JSON . Пожалуйста, скопируйте " -#~ "содержимое и сохранить его в текстовом файле (.txt), используя " -#~ "простой текстовый редактор, например, Блокнот. Важно, чтобы " -#~ "экспортированный файл не изменяется ни каким образом, не добавлением " -#~ "пробелов, не разрывом строк, и т.д." - -#~ msgid "" -#~ "The settings are imported from a JSON encoded string. Please paste the " -#~ "exported string in the textarea below." -#~ msgstr "" -#~ "Настройки импортируются из JSON. Пожалуйста, вставьте экспортированную " -#~ "строку ниже в текстовое поле." - -#~ msgid "" -#~ "It seems your theme does not support customised styles for the editor. " -#~ "You can create a CSS file named editor-style.css and upload " -#~ "it to your theme's directory. After that, enable this setting." -#~ msgstr "" -#~ "Кажется, Ваша тема не поддерживает пользовательские стили для редактора. " -#~ "Вы можете создать файл с именем editor-style.css и загрузить его в " -#~ "каталог Вашей темы. После этого включите эту настройку." - -#~ msgid "Markdown typing support (text pattern plugin)" -#~ msgstr "Поддержка ввода Markdown (плагин шаблона текста)" - -#~ msgid "" -#~ "This plugin matches special patterns while you type and applies formats " -#~ "or executed commands on these text patterns. The default patterns are the " -#~ "same as the markdown syntax so you can type # text to create " -#~ "a header, 1. text to create a list, **text** to " -#~ "make something bold, etc." -#~ msgstr "" -#~ "Этот модуль использует специальные шаблоны во время ввода текста и " -#~ "применяет форматы или введенные команды из этих текстовых шаблонов. По " -#~ "умолчанию шаблоны соответствуют синтаксису markdown, так что Вы можете " -#~ "ввести # text, чтобы создать заголовок, 1. text, чтобы создать список, **text**, чтобы выделить текст " -#~ "жирным шрифтом и т.д." - -#~ msgid "More information" -#~ msgstr "Более подробная информация" - -#~ msgid "" -#~ "This will make it possible to use more advanced coding in the HTML editor " -#~ "without the back-end filtering affecting it much. However it may behave " -#~ "unexpectedly in rare cases, so test it thoroughly before enabling it " -#~ "permanently. Line breaks in the HTML editor would still affect the " -#~ "output, in particular do not use empty lines, line breaks inside HTML " -#~ "tags or multiple <br /> tags." -#~ msgstr "" -#~ "Эта функция делает возможным использовать более продвинутое кодирование в " -#~ "HTML редакторе без фоновой фильтрации, оказывающей не него существенное " -#~ "влияние. Однако в редких случаях она может вести себя непредсказуемо, " -#~ "поэтому тщательно проверьте её перед включением постоянно. Разрывы строк " -#~ "в HTML редакторе будут по-прежнему влиять на результат, в частности не " -#~ "используйте пустые строки, разрывы строк внутри HTML тегов или несколько " -#~ "тегов
." - -#~ msgid "" -#~ "Works only in Firefox and Safari. These browsers support pasting of " -#~ "images directly in the editor and convert them to base64 encoded text. " -#~ "This is not acceptable for larger images like photos or graphics, but may " -#~ "be useful in some cases for very small images like icons, not larger than " -#~ "2-3KB. These images will not be available in the Media Library." -#~ msgstr "" -#~ "Работает только в Firefox и Safari. Эти браузеры поддерживают вставку " -#~ "изображений непосредственно в редакторе и конвертируют их в текст, " -#~ "закодированный по формату base64. Это не приемлемо для больших " -#~ "изображений, таких как фотографии или графики, но может быть полезно в " -#~ "некоторых случаях для очень маленьких изображений, таких как иконки, не " -#~ "больше, чем 2-3KB. Эти изображения не будут доступны в библиотеке " -#~ "мультимедиа." - -#~ msgid "older version of the plugin." -#~ msgstr "старую версию плагина." - -#~ msgid "The settings are exported as a JSON encoded string. " -#~ msgstr "Настройки экспортируется как JSON ." - -#~ msgid "" -#~ "It seems your theme doesn't support customised styles for the editor. " -#~ msgstr "" -#~ "Кажется, Ваша тема не поддерживает специальные стили для редактора. " - -#~ msgid "" -#~ "You can create a CSS file named editor-style.css and upload " -#~ "it to your theme's directory. " -#~ msgstr "" -#~ "Вы можете создать файл CSS с именем editor-style.css и " -#~ "загрузить его в каталог вашей темы. " - -#~ msgid "" -#~ "This will make it possible to use more advanced coding in the HTML editor " -#~ "without the back-end filtering affecting it much. " -#~ msgstr "" -#~ "Это сделает возможным использование более продвинутого кодирования в " -#~ "редакторе HTML без фоновой фильтрации влияющей на многое. " - -#~ msgid "" -#~ "However it may behave unexpectedly in rare cases, so test it thoroughly " -#~ "before enabling it permanently. " -#~ msgstr "" -#~ "Однако в редких случаях это может вести себя непредсказуемымо, поэтому " -#~ "проверьте все тщательно перед включением его постоянно. " - -#~ msgid "All options have been removed from the database. You can" -#~ msgstr "Все опции были удалены из базы данных. Вы можете" - -#~ msgid "deactivate TinyMCE Advanced" -#~ msgstr "отключить TinyMCE Advanced" - -#~ msgid "or" -#~ msgstr "или" - -#~ msgid "reload this page" -#~ msgstr "перезагрузить страницу" - -#~ msgid "to reset them to the default values." -#~ msgstr "сбросить их к значениям по умолчанию." - -#~ msgid "TinyMCE Buttons Arrangement" -#~ msgstr "Компоновка кнопок TinyMCE " - -#~ msgid "Drag and drop buttons onto the toolbars below." -#~ msgstr "Перетащите кнопки снизу на панели инструментов." - -#~ msgid "" -#~ "Adding too many buttons will make the toolbar too long and will not " -#~ "display correctly in TinyMCE!" -#~ msgstr "" -#~ "Добавление слишком большого количества кнопок сделает панель инструментов " -#~ "слишком длинной и она не будет корректно отображаться в TinyMCE!" - -#~ msgid "Advanced Image" -#~ msgstr "Дополнительные изображения" - -#~ msgid "" -#~ "(to show the browser context menu in Firefox, hold down the Ctrl key)." -#~ msgstr "" -#~ "(чтобы показать контекстное меню браузера в Firefox, удерживайте нажатой " -#~ "клавишу Ctrl)." - -#~ msgid "Advanced Link" -#~ msgstr "Дополнительные ссылки" - -#~ msgid "" -#~ "Enabling this TinyMCE plugin will overwrite the internal links feature in " -#~ "WordPress 3.1 and newer. Cuttently there is no way to enable both of them " -#~ "at the same time." -#~ msgstr "" -#~ "Включение этого модуля TinyMCE перезапишет внутренние ссылки в WordPress " -#~ "3.1 и старше. В настоящее время не существует способа включить их оба " -#~ "одновременно." - -#~ msgid "" -#~ "This is only needed if you created that file. Themes that style the " -#~ "editor will import the stylesheet automatically." -#~ msgstr "" -#~ "Это необходимо, только если Вы создали этот файл. Темы этого стиля " -#~ "редактор будет импортировать таблицы стилей автоматически." - -#~ msgid "" -#~ "Note that selecting this will also disable the Styles drop-down menu." -#~ msgstr "" -#~ "Обратите внимание, что если выбрать этот пункт будут также отключены " -#~ "стили выпадающего меню." - -#~ msgid "Language Settings" -#~ msgstr "Настройки языка" - -#~ msgid "Your WordPress language is set to" -#~ msgstr "Язык WordPress -" - -#~ msgid "" -#~ "However there is no matching language installed for TinyMCE plugins. This " -#~ "plugin includes several translations: German, French, Italian, Spanish, " -#~ "Portuguese, Russian, Japanese and Chinese. More translations are " -#~ "available at the" -#~ msgstr "" -#~ "Однако для модулей TinyMCE никакой язык не установлен. Этот плагин " -#~ "включает в себя несколько переводов: немецкий, французский, итальянский, " -#~ "испанский, португальский, русский, японский и китайский языки. Другие " -#~ "переводы доступны в" - -#~ msgid "TinyMCE web site." -#~ msgstr "Вэб-сайт TinyMCE." - -#~ msgid "" -#~ "The Kitchen Sink button shows/hides the next toolbar row. It will not " -#~ "work at the current place." -#~ msgstr "" -#~ "Кнопка Kitchen Sink показывает/скрывает следующую строку панели " -#~ "инструментов. Он не будет работать на этом месте." - -#~ msgid "Remove all saved settings from the database?" -#~ msgstr "Удалить все сохраненные настройки из базы данных?" - -#~ msgid "Cancel" -#~ msgstr "Отмена" - -#~ msgid "Continue" -#~ msgstr "Продолжить" diff --git a/wp-content/plugins/tinymce-advanced/langs/tinymce-advanced-sv_SE.mo b/wp-content/plugins/tinymce-advanced/langs/tinymce-advanced-sv_SE.mo deleted file mode 100644 index 541c5480f89caeae14f213bd9fb8a8913b7414ed..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6353 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 diff --git a/wp-content/plugins/tinymce-advanced/langs/tinymce-advanced-sv_SE.po b/wp-content/plugins/tinymce-advanced/langs/tinymce-advanced-sv_SE.po deleted file mode 100644 index 5b9ae773..00000000 --- a/wp-content/plugins/tinymce-advanced/langs/tinymce-advanced-sv_SE.po +++ /dev/null @@ -1,362 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: TinyMCE Advanced\n" -"POT-Creation-Date: 2016-03-17 12:21-0800\n" -"PO-Revision-Date: 2016-03-17 14:16-0800\n" -"Last-Translator: \n" -"Language-Team: \n" -"Language: sv_SE\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"X-Generator: Poedit 1.6.9\n" -"X-Poedit-Basepath: .\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" -"X-Poedit-KeywordsList: __;_e;__ngettext:1,2;_n:1,2;__ngettext_noop:1,2;" -"_n_noop:1,2;_c,_nc:4c,1,2;_x:1,2c;_nx:4c,1,2;_nx_noop:4c,1,2;_ex:1,2c;" -"esc_attr__;esc_attr_e;esc_attr_x:1,2c;esc_html__;esc_html_e;esc_html_x:1,2c\n" -"X-Poedit-SearchPath-0: .\n" -"X-Poedit-SearchPath-1: ..\n" - -#: ../tadv_admin.php:140 -msgid "Default settings restored." -msgstr "Standardinställningar återställda." - -#: ../tadv_admin.php:152 -msgid "TinyMCE Advanced Settings Export" -msgstr "TinyMCE Avancerad Inställningsexport" - -#: ../tadv_admin.php:156 -msgid "The settings are exported as a JSON encoded string." -msgstr "Inställningarna exporteras som en JSON-kodad sträng." - -#: ../tadv_admin.php:157 -msgid "" -"Please copy the content and save it in a text (.txt) file, using a " -"plain text editor like Notepad." -msgstr "" -"Vänligen kopiera innehållet och spara det i en text-fil (.txt), genom " -"en ren texteditor såsom Anteckningar." - -#: ../tadv_admin.php:158 -msgid "" -"It is important that the export is not changed in any way, no spaces, line " -"breaks, etc." -msgstr "" -"Det är viktigt att exporten inte ändras på något sätt, inga mellanrum eller " -"radbrytningar etc." - -#: ../tadv_admin.php:163 -msgid "Select All" -msgstr "Välj allt" - -#: ../tadv_admin.php:165 ../tadv_admin.php:191 -msgid "Back to Editor Settings" -msgstr "Tillbaka till redigerarinställningar" - -#: ../tadv_admin.php:177 -msgid "TinyMCE Advanced Settings Import" -msgstr "TinyMCE Avancerad Inställningsimport" - -#: ../tadv_admin.php:180 -msgid "" -"The settings are imported from a JSON encoded string. Please paste the " -"exported string in the text area below." -msgstr "" -"Inställningarna importeras från en JSON-kodad sträng. Vänligen klistra in " -"den exporterade strängen i textfältet nedan." - -#: ../tadv_admin.php:185 -msgid "Verify" -msgstr "Jämför" - -#: ../tadv_admin.php:186 -msgid "Import" -msgstr "Importera" - -#: ../tadv_admin.php:216 -msgid "Importing of settings failed." -msgstr "Import av inställningar misslyckades." - -#: ../tadv_admin.php:242 -msgid "ERROR: All toolbars are empty. Default settings loaded." -msgstr "FEL: Alla verktygsfält är tomma. Ursprungsinställningar inladdade." - -#: ../tadv_admin.php:254 -msgid "Editor Settings" -msgstr "Redigerarinställningar" - -#: ../tadv_admin.php:261 -msgid "Settings saved." -msgstr "Inställningar sparade." - -#: ../tadv_admin.php:270 ../tadv_admin.php:540 -msgid "Save Changes" -msgstr "Spara ändringar" - -#: ../tadv_admin.php:277 -msgid "Enable the editor menu." -msgstr "Aktivera redigerarmenyn." - -#: ../tadv_admin.php:389 -msgid "" -"Drag buttons from the unused buttons below and drop them in the toolbars " -"above, or drag the buttons in the toolbars to rearrange them." -msgstr "" -"Dra knappar från de oanvända knapparna nedan och släpp dem i verktygsfälten " -"ovan, eller dra knapparna i verktygsfältet för att arrangera om dem." - -#: ../tadv_admin.php:392 -msgid "Unused Buttons" -msgstr "Oanvända knappar" - -#: ../tadv_admin.php:434 -#, fuzzy -msgid "Options" -msgstr "Avancerade tillval" - -#: ../tadv_admin.php:437 -msgid "List Style Options" -msgstr "Liststil-tillval" - -#: ../tadv_admin.php:439 -msgid "" -"Enable more list options: upper or lower case letters for ordered lists, " -"disk or square for unordered lists, etc." -msgstr "" - -#: ../tadv_admin.php:444 -msgid "Context Menu" -msgstr "Sammanhangsmeny" - -#: ../tadv_admin.php:446 -msgid "Replace the browser context (right-click) menu." -msgstr "" - -#: ../tadv_admin.php:451 -msgid "Alternative link dialog" -msgstr "" - -#: ../tadv_admin.php:453 -msgid "" -"Open the TinyMCE link dialog when using the link button on the toolbar or " -"the link menu item." -msgstr "" - -#: ../tadv_admin.php:458 -msgid "Font sizes" -msgstr "" - -#: ../tadv_admin.php:459 -msgid "" -"Replace the size setting available for fonts with: 8px 10px 12px 14px 16px " -"20px 24px 28px 32px 36px 48px 60px." -msgstr "" -"Ersätter storleksinställningen för teckensnitt med: 8px 10px 12px 14px 16px " -"20px 24px 28px 32px 36px 48px 60px." - -#: ../tadv_admin.php:467 -msgid "Advanced Options" -msgstr "Avancerade tillval" - -#: ../tadv_admin.php:476 -msgid "Create CSS classes menu" -msgstr "" - -#: ../tadv_admin.php:478 -msgid "" -"Load the CSS classes used in editor-style.css and replace the Formats button " -"and sub-menu." -msgstr "" -"Ladda CSS-klasser från editor-style.css och ersätt Formaterings-knapp och " -"undermeny." - -#: ../tadv_admin.php:488 -msgid "Keep paragraph tags" -msgstr "" - -#: ../tadv_admin.php:490 -#, fuzzy -msgid "" -"Stop removing the <p> and <br /> tags when saving and show them " -"in the Text editor." -msgstr "" -"Sluta ta bort <p> och <br />-taggar vid sparande och visa dem i " -"textredigeraren" - -#: ../tadv_admin.php:491 -msgid "" -"This will make it possible to use more advanced coding in the HTML editor " -"without the back-end filtering affecting it much." -msgstr "" -"Detta möjliggör mer avancerad kodning i HTML-redigeraren utan att backend-" -"filtrering påverkar så mycket." - -#: ../tadv_admin.php:492 -msgid "" -"However it may behave unexpectedly in rare cases, so test it thoroughly " -"before enabling it permanently." -msgstr "" -"Ändå kan det uppföra sig oväntat i särskilda fall, så testa noggrant innan " -"du aktiverar det permanent." - -#: ../tadv_admin.php:493 -msgid "" -"Line breaks in the HTML editor would still affect the output, in particular " -"do not use empty lines, line breaks inside HTML tags or multiple <br /" -"> tags." -msgstr "" -"Radbrytningar i HTML-redigeraren skulle fortfarande påverka utmatningen så " -"använd i synnerhet inte några tomma rader, radbrytningar inuti HTML-taggar " -"eller flera <br />-taggar." - -#: ../tadv_admin.php:498 -msgid "Enable pasting of image source" -msgstr "Aktivera inklistring av bildkällor" - -#: ../tadv_admin.php:500 -msgid "" -"Works only in Firefox and Safari. These browsers support pasting of images " -"directly in the editor and convert them to base64 encoded text." -msgstr "" -"Fungerar enbart med Firefox och Safari. Dessa webbläsare stöder inklistring " -"av bilder direkt i redigeraren och konverterar dem till base64-kodad text." - -#: ../tadv_admin.php:501 -msgid "" -"This is not acceptable for larger images like photos or graphics, but may be " -"useful in some cases for very small images like icons, not larger than 2-3KB." -msgstr "" -"Detta är inte acceptabelt för större bilder som foton eller grafik, men kan " -"vara användbart i vissa fall för väldigt små bilder såsom ikoner, inte " -"större än 2-3kB." - -#: ../tadv_admin.php:502 -msgid "These images will not be available in the Media Library." -msgstr "Dessa bilder kommer inte att finnas i Mediabiblioteket." - -#: ../tadv_admin.php:508 -msgid "Administration" -msgstr "Administration" - -#: ../tadv_admin.php:510 -msgid "Settings import and export" -msgstr "" - -#: ../tadv_admin.php:512 -msgid "Export Settings" -msgstr "Exportera inställningar" - -#: ../tadv_admin.php:513 -msgid "Import Settings" -msgstr "Importera inställningar" - -#: ../tadv_admin.php:517 -#, fuzzy -msgid "Enable the editor enhancements for:" -msgstr "Aktivera redigerarmenyn." - -#: ../tadv_admin.php:520 -msgid "The main editor (Add New and Edit posts and pages)" -msgstr "" - -#: ../tadv_admin.php:524 -msgid "Other editors in wp-admin" -msgstr "" - -#: ../tadv_admin.php:528 -msgid "Editors on the front end of the site" -msgstr "" - -#: ../tadv_admin.php:539 -msgid "Restore Default Settings" -msgstr "Återställ ursprungsinställningar" - -#: ../tadv_admin.php:545 -msgid "" -"The [Toolbar toggle] button shows or hides the second, third, and forth " -"button rows. It will only work when it is in the first row and there are " -"buttons in the second row." -msgstr "" -"[Växla verktygsfält]-knappen visar eller gömmer den andra, tredje och fjärde " -"knappraden. Det fungerar endast när knappen finns på den första raden och " -"det finns knappar i den andra raden." - -#: ../tinymce-advanced.php:221 -#, php-format -msgid "" -"TinyMCE Advanced requires WordPress version %1$s or newer. It appears that " -"you are running %2$s. This can make the editor unstable." -msgstr "" -"Detta tillägg kräver WordPress version %1$s eller nyare. Det verkar som att " -"du kör %2$s. Detta kan göra redigeraren instabil." - -#: ../tinymce-advanced.php:228 -#, php-format -msgid "" -"Please upgrade your WordPress installation or download an older version of the plugin." -msgstr "" -"Vänligen uppgradera din WordPress-installation eller ladda hem en äldre version av tillägget." - -#: ../tinymce-advanced.php:703 -#, fuzzy -msgid "Settings" -msgstr "Redigerarinställningar" - -#~ msgid "" -#~ "New in TinyMCE 4.0/WordPress 3.9 is the editor menu. When it is enabled, " -#~ "most buttons are also available as menu items." -#~ msgstr "" -#~ "Nytt i TinyMCE 4.0/WordPress 3.9 är redigerarmenyn. När den är aktiverad " -#~ "blir de flesta knapparna också tillgängliga som menyval." - -#~ msgid "Also enable:" -#~ msgstr "Aktivera också:" - -#~ msgid "Link (replaces the Insert/Edit Link dialog)" -#~ msgstr "Länk (ersätter dialogfönstret Infoga/redigera länk)" - -#~ msgid "Import editor-style.css." -#~ msgstr "Importera editor-style.css." - -#~ msgid "" -#~ "It seems your theme does not support customised styles for the editor." -#~ msgstr "" -#~ "Det verkar som att ditt tema inte stöder anpassade stilar för redigeraren." - -#~ msgid "" -#~ "You can create a CSS file named editor-style.css and upload " -#~ "it to your theme's directory." -#~ msgstr "" -#~ "Du kan skapa en CSS-fil namngiven editor-style.css och ladda " -#~ "upp till ditt temas mapp." - -#~ msgid "After that, enable this setting." -#~ msgstr "Efteråt, aktivera denna inställning." - -#~ msgid "Replace font size settings" -#~ msgstr "Ersätt textstorleksinställningar" - -#~ msgid "Markdown typing support (text pattern plugin)" -#~ msgstr "Stöd för att skriva Markdown (tillägg för textflöde)" - -#~ msgid "" -#~ "This plugin matches special patterns while you type and applies formats " -#~ "or executes commands on the matched text." -#~ msgstr "" -#~ "Detta tillägg matchar speciella mönster medan du skriver och applicerar " -#~ "formatering eller utför kommandon utifrån matchad text." - -#~ msgid "" -#~ "The default patterns are the same as the markdown syntax so you can type " -#~ "# text to create a header, 1. text to create a " -#~ "list, **text** to make it bold, etc." -#~ msgstr "" -#~ "Standardmönster är samma som markdown-syntax så att du kan skriva # " -#~ "text för att skapa en rubrik, 1. text för att skapa " -#~ "en lista, **text** för fet stil etc." - -#~ msgid "More information" -#~ msgstr "Mer information" diff --git a/wp-content/plugins/tinymce-advanced/langs/tinymce-advanced.pot b/wp-content/plugins/tinymce-advanced/langs/tinymce-advanced.pot deleted file mode 100644 index 00da9c0e..00000000 --- a/wp-content/plugins/tinymce-advanced/langs/tinymce-advanced.pot +++ /dev/null @@ -1,269 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: TinyMCE Advanced\n" -"POT-Creation-Date: 2016-03-17 12:21-0800\n" -"PO-Revision-Date: 2016-03-17 12:21-0800\n" -"Last-Translator: \n" -"Language-Team: \n" -"Language: en_US\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"X-Generator: Poedit 1.6.9\n" -"X-Poedit-Basepath: .\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" -"X-Poedit-KeywordsList: __;_e;__ngettext:1,2;_n:1,2;__ngettext_noop:1,2;" -"_n_noop:1,2;_c,_nc:4c,1,2;_x:1,2c;_nx:4c,1,2;_nx_noop:4c,1,2;_ex:1,2c;" -"esc_attr__;esc_attr_e;esc_attr_x:1,2c;esc_html__;esc_html_e;esc_html_x:1,2c\n" -"X-Poedit-SearchPath-0: .\n" -"X-Poedit-SearchPath-1: ..\n" - -#: ../tadv_admin.php:140 -msgid "Default settings restored." -msgstr "" - -#: ../tadv_admin.php:152 -msgid "TinyMCE Advanced Settings Export" -msgstr "" - -#: ../tadv_admin.php:156 -msgid "The settings are exported as a JSON encoded string." -msgstr "" - -#: ../tadv_admin.php:157 -msgid "" -"Please copy the content and save it in a text (.txt) file, using a " -"plain text editor like Notepad." -msgstr "" - -#: ../tadv_admin.php:158 -msgid "" -"It is important that the export is not changed in any way, no spaces, line " -"breaks, etc." -msgstr "" - -#: ../tadv_admin.php:163 -msgid "Select All" -msgstr "" - -#: ../tadv_admin.php:165 ../tadv_admin.php:191 -msgid "Back to Editor Settings" -msgstr "" - -#: ../tadv_admin.php:177 -msgid "TinyMCE Advanced Settings Import" -msgstr "" - -#: ../tadv_admin.php:180 -msgid "" -"The settings are imported from a JSON encoded string. Please paste the " -"exported string in the text area below." -msgstr "" - -#: ../tadv_admin.php:185 -msgid "Verify" -msgstr "" - -#: ../tadv_admin.php:186 -msgid "Import" -msgstr "" - -#: ../tadv_admin.php:216 -msgid "Importing of settings failed." -msgstr "" - -#: ../tadv_admin.php:242 -msgid "ERROR: All toolbars are empty. Default settings loaded." -msgstr "" - -#: ../tadv_admin.php:254 -msgid "Editor Settings" -msgstr "" - -#: ../tadv_admin.php:261 -msgid "Settings saved." -msgstr "" - -#: ../tadv_admin.php:270 ../tadv_admin.php:540 -msgid "Save Changes" -msgstr "" - -#: ../tadv_admin.php:277 -msgid "Enable the editor menu." -msgstr "" - -#: ../tadv_admin.php:389 -msgid "" -"Drag buttons from the unused buttons below and drop them in the toolbars " -"above, or drag the buttons in the toolbars to rearrange them." -msgstr "" - -#: ../tadv_admin.php:392 -msgid "Unused Buttons" -msgstr "" - -#: ../tadv_admin.php:434 -msgid "Options" -msgstr "" - -#: ../tadv_admin.php:437 -msgid "List Style Options" -msgstr "" - -#: ../tadv_admin.php:439 -msgid "" -"Enable more list options: upper or lower case letters for ordered lists, " -"disk or square for unordered lists, etc." -msgstr "" - -#: ../tadv_admin.php:444 -msgid "Context Menu" -msgstr "" - -#: ../tadv_admin.php:446 -msgid "Replace the browser context (right-click) menu." -msgstr "" - -#: ../tadv_admin.php:451 -msgid "Alternative link dialog" -msgstr "" - -#: ../tadv_admin.php:453 -msgid "" -"Open the TinyMCE link dialog when using the link button on the toolbar or " -"the link menu item." -msgstr "" - -#: ../tadv_admin.php:458 -msgid "Font sizes" -msgstr "" - -#: ../tadv_admin.php:459 -msgid "" -"Replace the size setting available for fonts with: 8px 10px 12px 14px 16px " -"20px 24px 28px 32px 36px 48px 60px." -msgstr "" - -#: ../tadv_admin.php:467 -msgid "Advanced Options" -msgstr "" - -#: ../tadv_admin.php:476 -msgid "Create CSS classes menu" -msgstr "" - -#: ../tadv_admin.php:478 -msgid "" -"Load the CSS classes used in editor-style.css and replace the Formats button " -"and sub-menu." -msgstr "" - -#: ../tadv_admin.php:488 -msgid "Keep paragraph tags" -msgstr "" - -#: ../tadv_admin.php:490 -msgid "" -"Stop removing the <p> and <br /> tags when saving and show them " -"in the Text editor." -msgstr "" - -#: ../tadv_admin.php:491 -msgid "" -"This will make it possible to use more advanced coding in the HTML editor " -"without the back-end filtering affecting it much." -msgstr "" - -#: ../tadv_admin.php:492 -msgid "" -"However it may behave unexpectedly in rare cases, so test it thoroughly " -"before enabling it permanently." -msgstr "" - -#: ../tadv_admin.php:493 -msgid "" -"Line breaks in the HTML editor would still affect the output, in particular " -"do not use empty lines, line breaks inside HTML tags or multiple <br /" -"> tags." -msgstr "" - -#: ../tadv_admin.php:498 -msgid "Enable pasting of image source" -msgstr "" - -#: ../tadv_admin.php:500 -msgid "" -"Works only in Firefox and Safari. These browsers support pasting of images " -"directly in the editor and convert them to base64 encoded text." -msgstr "" - -#: ../tadv_admin.php:501 -msgid "" -"This is not acceptable for larger images like photos or graphics, but may be " -"useful in some cases for very small images like icons, not larger than 2-3KB." -msgstr "" - -#: ../tadv_admin.php:502 -msgid "These images will not be available in the Media Library." -msgstr "" - -#: ../tadv_admin.php:508 -msgid "Administration" -msgstr "" - -#: ../tadv_admin.php:510 -msgid "Settings import and export" -msgstr "" - -#: ../tadv_admin.php:512 -msgid "Export Settings" -msgstr "" - -#: ../tadv_admin.php:513 -msgid "Import Settings" -msgstr "" - -#: ../tadv_admin.php:517 -msgid "Enable the editor enhancements for:" -msgstr "" - -#: ../tadv_admin.php:520 -msgid "The main editor (Add New and Edit posts and pages)" -msgstr "" - -#: ../tadv_admin.php:524 -msgid "Other editors in wp-admin" -msgstr "" - -#: ../tadv_admin.php:528 -msgid "Editors on the front end of the site" -msgstr "" - -#: ../tadv_admin.php:539 -msgid "Restore Default Settings" -msgstr "" - -#: ../tadv_admin.php:545 -msgid "" -"The [Toolbar toggle] button shows or hides the second, third, and forth " -"button rows. It will only work when it is in the first row and there are " -"buttons in the second row." -msgstr "" - -#: ../tinymce-advanced.php:221 -#, php-format -msgid "" -"TinyMCE Advanced requires WordPress version %1$s or newer. It appears that " -"you are running %2$s. This can make the editor unstable." -msgstr "" - -#: ../tinymce-advanced.php:228 -#, php-format -msgid "" -"Please upgrade your WordPress installation or download an older version of the plugin." -msgstr "" - -#: ../tinymce-advanced.php:703 -msgid "Settings" -msgstr "" diff --git a/wp-content/plugins/tinymce-advanced/mce/advlist/plugin.js b/wp-content/plugins/tinymce-advanced/mce/advlist/plugin.js index 573693e5..6dc32b66 100644 --- a/wp-content/plugins/tinymce-advanced/mce/advlist/plugin.js +++ b/wp-content/plugins/tinymce-advanced/mce/advlist/plugin.js @@ -1,256 +1,160 @@ (function () { +var advlist = (function () { + 'use strict'; -var defs = {}; // id -> {dependencies, definition, instance (possibly undefined)} + var global = tinymce.util.Tools.resolve('tinymce.PluginManager'); -// Used when there is no 'main' module. -// The name is probably (hopefully) unique so minification removes for releases. -var register_3795 = function (id) { - var module = dem(id); - var fragments = id.split('.'); - var target = Function('return this;')(); - for (var i = 0; i < fragments.length - 1; ++i) { - if (target[fragments[i]] === undefined) - target[fragments[i]] = {}; - target = target[fragments[i]]; - } - target[fragments[fragments.length - 1]] = module; -}; + var global$1 = tinymce.util.Tools.resolve('tinymce.util.Tools'); -var instantiate = function (id) { - var actual = defs[id]; - var dependencies = actual.deps; - var definition = actual.defn; - var len = dependencies.length; - var instances = new Array(len); - for (var i = 0; i < len; ++i) - instances[i] = dem(dependencies[i]); - var defResult = definition.apply(null, instances); - if (defResult === undefined) - throw 'module [' + id + '] returned undefined'; - actual.instance = defResult; -}; + var applyListFormat = function (editor, listName, styleValue) { + var cmd = listName === 'UL' ? 'InsertUnorderedList' : 'InsertOrderedList'; + editor.execCommand(cmd, false, styleValue === false ? null : { 'list-style-type': styleValue }); + }; + var Actions = { applyListFormat: applyListFormat }; -var def = function (id, dependencies, definition) { - if (typeof id !== 'string') - throw 'module id must be a string'; - else if (dependencies === undefined) - throw 'no dependencies for ' + id; - else if (definition === undefined) - throw 'no definition function for ' + id; - defs[id] = { - deps: dependencies, - defn: definition, - instance: undefined - }; -}; + var register = function (editor) { + editor.addCommand('ApplyUnorderedListStyle', function (ui, value) { + Actions.applyListFormat(editor, 'UL', value['list-style-type']); + }); + editor.addCommand('ApplyOrderedListStyle', function (ui, value) { + Actions.applyListFormat(editor, 'OL', value['list-style-type']); + }); + }; + var Commands = { register: register }; -var dem = function (id) { - var actual = defs[id]; - if (actual === undefined) - throw 'module [' + id + '] was undefined'; - else if (actual.instance === undefined) - instantiate(id); - return actual.instance; -}; + var getNumberStyles = function (editor) { + var styles = editor.getParam('advlist_number_styles', 'default,lower-alpha,lower-greek,lower-roman,upper-alpha,upper-roman'); + return styles ? styles.split(/[ ,]/) : []; + }; + var getBulletStyles = function (editor) { + var styles = editor.getParam('advlist_bullet_styles', 'default,circle,disc,square'); + return styles ? styles.split(/[ ,]/) : []; + }; + var Settings = { + getNumberStyles: getNumberStyles, + getBulletStyles: getBulletStyles + }; -var req = function (ids, callback) { - var len = ids.length; - var instances = new Array(len); - for (var i = 0; i < len; ++i) - instances.push(dem(ids[i])); - callback.apply(null, callback); -}; - -var ephox = {}; - -ephox.bolt = { - module: { - api: { - define: def, - require: req, - demand: dem - } - } -}; - -var define = def; -var require = req; -var demand = dem; -// this helps with minificiation when using a lot of global references -var defineGlobal = function (id, ref) { - define(id, [], function () { return ref; }); -}; -/*jsc -["tinymce.plugins.advlist.Plugin","tinymce.core.PluginManager","tinymce.core.util.Tools","global!tinymce.util.Tools.resolve"] -jsc*/ -defineGlobal("global!tinymce.util.Tools.resolve", tinymce.util.Tools.resolve); -/** - * ResolveGlobal.js - * - * Released under LGPL License. - * Copyright (c) 1999-2017 Ephox Corp. All rights reserved - * - * License: http://www.tinymce.com/license - * Contributing: http://www.tinymce.com/contributing - */ - -define( - 'tinymce.core.PluginManager', - [ - 'global!tinymce.util.Tools.resolve' - ], - function (resolve) { - return resolve('tinymce.PluginManager'); - } -); - -/** - * ResolveGlobal.js - * - * Released under LGPL License. - * Copyright (c) 1999-2017 Ephox Corp. All rights reserved - * - * License: http://www.tinymce.com/license - * Contributing: http://www.tinymce.com/contributing - */ - -define( - 'tinymce.core.util.Tools', - [ - 'global!tinymce.util.Tools.resolve' - ], - function (resolve) { - return resolve('tinymce.util.Tools'); - } -); - -/** - * Plugin.js - * - * Released under LGPL License. - * Copyright (c) 1999-2017 Ephox Corp. All rights reserved - * - * License: http://www.tinymce.com/license - * Contributing: http://www.tinymce.com/contributing - */ - -/** - * This class contains all core logic for the advlist plugin. - * - * @class tinymce.plugins.advlist.Plugin - * @private - */ -define( - 'tinymce.plugins.advlist.Plugin', - [ - 'tinymce.core.PluginManager', - 'tinymce.core.util.Tools' - ], - function (PluginManager, Tools) { - PluginManager.add('advlist', function (editor) { - var olMenuItems, ulMenuItems; - - var hasPlugin = function (editor, plugin) { - var plugins = editor.settings.plugins ? editor.settings.plugins : ''; - return Tools.inArray(plugins.split(/[ ,]/), plugin) !== -1; + var isChildOfBody = function (editor, elm) { + return editor.$.contains(editor.getBody(), elm); + }; + var isTableCellNode = function (node) { + return node && /^(TH|TD)$/.test(node.nodeName); + }; + var isListNode = function (editor) { + return function (node) { + return node && /^(OL|UL|DL)$/.test(node.nodeName) && isChildOfBody(editor, node); }; + }; + var getSelectedStyleType = function (editor) { + var listElm = editor.dom.getParent(editor.selection.getNode(), 'ol,ul'); + return editor.dom.getStyle(listElm, 'listStyleType') || ''; + }; + var ListUtils = { + isTableCellNode: isTableCellNode, + isListNode: isListNode, + getSelectedStyleType: getSelectedStyleType + }; - function isChildOfBody(elm) { - return editor.$.contains(editor.getBody(), elm); - } + var styleValueToText = function (styleValue) { + return styleValue.replace(/\-/g, ' ').replace(/\b\w/g, function (chr) { + return chr.toUpperCase(); + }); + }; + var toMenuItems = function (styles) { + return global$1.map(styles, function (styleValue) { + var text = styleValueToText(styleValue); + var data = styleValue === 'default' ? '' : styleValue; + return { + text: text, + data: data + }; + }); + }; + var ListStyles = { toMenuItems: toMenuItems }; - function isListNode(node) { - return node && (/^(OL|UL|DL)$/).test(node.nodeName) && isChildOfBody(node); - } - - function buildMenuItems(listName, styleValues) { - var items = []; - if (styleValues) { - Tools.each(styleValues.split(/[ ,]/), function (styleValue) { - items.push({ - text: styleValue.replace(/\-/g, ' ').replace(/\b\w/g, function (chr) { - return chr.toUpperCase(); - }), - data: styleValue == 'default' ? '' : styleValue - }); - }); + var findIndex = function (list, predicate) { + for (var index = 0; index < list.length; index++) { + var element = list[index]; + if (predicate(element)) { + return index; } - return items; } - - olMenuItems = buildMenuItems('OL', editor.getParam( - "advlist_number_styles", - "default,lower-alpha,lower-greek,lower-roman,upper-alpha,upper-roman" - )); - - ulMenuItems = buildMenuItems('UL', editor.getParam("advlist_bullet_styles", "default,circle,disc,square")); - - function applyListFormat(listName, styleValue) { - var cmd = listName == 'UL' ? 'InsertUnorderedList' : 'InsertOrderedList'; - editor.execCommand(cmd, false, styleValue === false ? null : { 'list-style-type': styleValue }); - } - - function updateSelection(e) { - var listStyleType = editor.dom.getStyle(editor.dom.getParent(editor.selection.getNode(), 'ol,ul'), 'listStyleType') || ''; - + return -1; + }; + var listState = function (editor, listName) { + return function (e) { + var ctrl = e.control; + editor.on('NodeChange', function (e) { + var tableCellIndex = findIndex(e.parents, ListUtils.isTableCellNode); + var parents = tableCellIndex !== -1 ? e.parents.slice(0, tableCellIndex) : e.parents; + var lists = global$1.grep(parents, ListUtils.isListNode(editor)); + ctrl.active(lists.length > 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 listState = function (listName) { - return function () { - var self = this; - - editor.on('NodeChange', function (e) { - var lists = Tools.grep(e.parents, isListNode); - self.active(lists.length > 0 && lists[0].nodeName === listName); - }); - }; }; + }; + 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 }; - if (hasPlugin(editor, "lists")) { - editor.addCommand('ApplyUnorderedListStyle', function (ui, value) { - applyListFormat('UL', value['list-style-type']); - }); - - editor.addCommand('ApplyOrderedListStyle', function (ui, value) { - applyListFormat('OL', value['list-style-type']); - }); - - editor.addButton('numlist', { - type: (olMenuItems.length > 0) ? 'splitbutton' : 'button', - tooltip: 'Numbered list', - menu: olMenuItems, - onPostRender: listState('OL'), - onshow: updateSelection, - onselect: function (e) { - applyListFormat('OL', e.control.settings.data); - }, - onclick: function () { - editor.execCommand('InsertOrderedList'); - } - }); - - editor.addButton('bullist', { - type: (ulMenuItems.length > 0) ? 'splitbutton' : 'button', - tooltip: 'Bullet list', - onPostRender: listState('UL'), - menu: ulMenuItems, - onshow: updateSelection, - onselect: function (e) { - applyListFormat('UL', e.control.settings.data); - }, - onclick: function () { - editor.execCommand('InsertUnorderedList'); - } - }); + 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 function () { }; + return Plugin; - } -); -dem('tinymce.plugins.advlist.Plugin')(); +}()); })(); diff --git a/wp-content/plugins/tinymce-advanced/mce/advlist/plugin.min.js b/wp-content/plugins/tinymce-advanced/mce/advlist/plugin.min.js index e281ace2..122cd8ff 100644 --- a/wp-content/plugins/tinymce-advanced/mce/advlist/plugin.min.js +++ b/wp-content/plugins/tinymce-advanced/mce/advlist/plugin.min.js @@ -1 +1 @@ -!function(){var a={},b=function(b){for(var c=a[b],e=c.deps,f=c.defn,g=e.length,h=new Array(g),i=0;i0&&f[0].nodeName===c)})}};j(a,"lists")&&(a.addCommand("ApplyUnorderedListStyle",function(a,b){f("UL",b["list-style-type"])}),a.addCommand("ApplyOrderedListStyle",function(a,b){f("OL",b["list-style-type"])}),a.addButton("numlist",{type:h.length>0?"splitbutton":"button",tooltip:"Numbered list",menu:h,onPostRender:k("OL"),onshow:g,onselect:function(a){f("OL",a.control.settings.data)},onclick:function(){a.execCommand("InsertOrderedList")}}),a.addButton("bullist",{type:i.length>0?"splitbutton":"button",tooltip:"Bullet list",onPostRender:k("UL"),menu:i,onshow:g,onselect:function(a){f("UL",a.control.settings.data)},onclick:function(){a.execCommand("InsertUnorderedList")}}))}),function(){}}),d("0")()}(); \ No newline at end of file +!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 {dependencies, definition, instance (possibly undefined)} + var global = tinymce.util.Tools.resolve('tinymce.PluginManager'); -// Used when there is no 'main' module. -// The name is probably (hopefully) unique so minification removes for releases. -var register_3795 = function (id) { - var module = dem(id); - var fragments = id.split('.'); - var target = Function('return this;')(); - for (var i = 0; i < fragments.length - 1; ++i) { - if (target[fragments[i]] === undefined) - target[fragments[i]] = {}; - target = target[fragments[i]]; - } - target[fragments[fragments.length - 1]] = module; -}; - -var instantiate = function (id) { - var actual = defs[id]; - var dependencies = actual.deps; - var definition = actual.defn; - var len = dependencies.length; - var instances = new Array(len); - for (var i = 0; i < len; ++i) - instances[i] = dem(dependencies[i]); - var defResult = definition.apply(null, instances); - if (defResult === undefined) - throw 'module [' + id + '] returned undefined'; - actual.instance = defResult; -}; - -var def = function (id, dependencies, definition) { - if (typeof id !== 'string') - throw 'module id must be a string'; - else if (dependencies === undefined) - throw 'no dependencies for ' + id; - else if (definition === undefined) - throw 'no definition function for ' + id; - defs[id] = { - deps: dependencies, - defn: definition, - instance: undefined - }; -}; - -var dem = function (id) { - var actual = defs[id]; - if (actual === undefined) - throw 'module [' + id + '] was undefined'; - else if (actual.instance === undefined) - instantiate(id); - return actual.instance; -}; - -var req = function (ids, callback) { - var len = ids.length; - var instances = new Array(len); - for (var i = 0; i < len; ++i) - instances.push(dem(ids[i])); - callback.apply(null, callback); -}; - -var ephox = {}; - -ephox.bolt = { - module: { - api: { - define: def, - require: req, - demand: dem - } - } -}; - -var define = def; -var require = req; -var demand = dem; -// this helps with minificiation when using a lot of global references -var defineGlobal = function (id, ref) { - define(id, [], function () { return ref; }); -}; -/*jsc -["tinymce.plugins.anchor.Plugin","tinymce.core.Env","tinymce.core.PluginManager","global!tinymce.util.Tools.resolve"] -jsc*/ -defineGlobal("global!tinymce.util.Tools.resolve", tinymce.util.Tools.resolve); -/** - * ResolveGlobal.js - * - * Released under LGPL License. - * Copyright (c) 1999-2017 Ephox Corp. All rights reserved - * - * License: http://www.tinymce.com/license - * Contributing: http://www.tinymce.com/contributing - */ - -define( - 'tinymce.core.Env', - [ - 'global!tinymce.util.Tools.resolve' - ], - function (resolve) { - return resolve('tinymce.Env'); - } -); - -/** - * ResolveGlobal.js - * - * Released under LGPL License. - * Copyright (c) 1999-2017 Ephox Corp. All rights reserved - * - * License: http://www.tinymce.com/license - * Contributing: http://www.tinymce.com/contributing - */ - -define( - 'tinymce.core.PluginManager', - [ - 'global!tinymce.util.Tools.resolve' - ], - function (resolve) { - return resolve('tinymce.PluginManager'); - } -); - -/** - * Plugin.js - * - * Released under LGPL License. - * Copyright (c) 1999-2017 Ephox Corp. All rights reserved - * - * License: http://www.tinymce.com/license - * Contributing: http://www.tinymce.com/contributing - */ - -/** - * This class contains all core logic for the anchor plugin. - * - * @class tinymce.anchor.Plugin - * @private - */ -define( - 'tinymce.plugins.anchor.Plugin', - [ - 'tinymce.core.Env', - 'tinymce.core.PluginManager' - ], - - function (Env, PluginManager) { - PluginManager.add('anchor', function (editor) { - 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 isValidId = function (id) { - // Follows HTML4 rules: https://www.w3.org/TR/html401/types.html#type-id - return /^[A-Za-z][A-Za-z0-9\-:._]*$/.test(id); - }; - - var showDialog = function () { - var selectedNode = editor.selection.getNode(); - var isAnchor = selectedNode.tagName == 'A' && editor.dom.getAttrib(selectedNode, 'href') === ''; - var value = ''; - - if (isAnchor) { - value = selectedNode.id || selectedNode.name || ''; - } - - editor.windowManager.open({ - title: 'Anchor', - body: { type: 'textbox', name: 'id', size: 40, label: 'Id', value: value }, - onsubmit: function (e) { - var id = e.data.id; - - if (!isValidId(id)) { - e.preventDefault(); - editor.windowManager.alert( - 'Id should start with a letter, followed only by letters, numbers, dashes, dots, colons or underscores.' - ); - return; - } - - if (isAnchor) { - selectedNode.removeAttribute('name'); - selectedNode.id = id; - } else { - editor.selection.collapse(true); - editor.execCommand('mceInsertContent', false, editor.dom.createHTML('a', { - id: id - })); - } - } - }); - }; - - if (Env.ceFalse) { - editor.on('PreInit', function () { - editor.parser.addNodeFilter('a', setContentEditable('false')); - editor.serializer.addNodeFilter('a', setContentEditable(null)); - }); + 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 + }; - editor.addCommand('mceAnchor', showDialog); + 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', - onclick: showDialog, + cmd: 'mceAnchor', stateSelector: 'a:not([href])' }); - editor.addMenuItem('anchor', { icon: 'anchor', text: 'Anchor', context: 'insert', - onclick: showDialog + cmd: 'mceAnchor' }); - }); + }; + var Buttons = { register: register$1 }; - return function () { }; - } -); -dem('tinymce.plugins.anchor.Plugin')(); + global.add('anchor', function (editor) { + FilterContent.setup(editor); + Commands.register(editor); + Buttons.register(editor); + }); + function Plugin () { + } + + return Plugin; + +}()); })(); diff --git a/wp-content/plugins/tinymce-advanced/mce/anchor/plugin.min.js b/wp-content/plugins/tinymce-advanced/mce/anchor/plugin.min.js index 6b3361d2..177f5051 100644 --- a/wp-content/plugins/tinymce-advanced/mce/anchor/plugin.min.js +++ b/wp-content/plugins/tinymce-advanced/mce/anchor/plugin.min.js @@ -1 +1 @@ -!function(){var a={},b=function(b){for(var c=a[b],e=c.deps,f=c.defn,g=e.length,h=new Array(g),i=0;i {dependencies, definition, instance (possibly undefined)} + var global = tinymce.util.Tools.resolve('tinymce.PluginManager'); -// Used when there is no 'main' module. -// The name is probably (hopefully) unique so minification removes for releases. -var register_3795 = function (id) { - var module = dem(id); - var fragments = id.split('.'); - var target = Function('return this;')(); - for (var i = 0; i < fragments.length - 1; ++i) { - if (target[fragments[i]] === undefined) - target[fragments[i]] = {}; - target = target[fragments[i]]; - } - target[fragments[fragments.length - 1]] = module; -}; + var global$1 = tinymce.util.Tools.resolve('tinymce.dom.DOMUtils'); -var instantiate = function (id) { - var actual = defs[id]; - var dependencies = actual.deps; - var definition = actual.defn; - var len = dependencies.length; - var instances = new Array(len); - for (var i = 0; i < len; ++i) - instances[i] = dem(dependencies[i]); - var defResult = definition.apply(null, instances); - if (defResult === undefined) - throw 'module [' + id + '] returned undefined'; - actual.instance = defResult; -}; + 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 def = function (id, dependencies, definition) { - if (typeof id !== 'string') - throw 'module id must be a string'; - else if (dependencies === undefined) - throw 'no dependencies for ' + id; - else if (definition === undefined) - throw 'no definition function for ' + id; - defs[id] = { - deps: dependencies, - defn: definition, - instance: undefined - }; -}; + 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 dem = function (id) { - var actual = defs[id]; - if (actual === undefined) - throw 'module [' + id + '] was undefined'; - else if (actual.instance === undefined) - instantiate(id); - return actual.instance; -}; + 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 req = function (ids, callback) { - var len = ids.length; - var instances = new Array(len); - for (var i = 0; i < len; ++i) - instances.push(dem(ids[i])); - callback.apply(null, callback); -}; - -var ephox = {}; - -ephox.bolt = { - module: { - api: { - define: def, - require: req, - demand: dem - } - } -}; - -var define = def; -var require = req; -var demand = dem; -// this helps with minificiation when using a lot of global references -var defineGlobal = function (id, ref) { - define(id, [], function () { return ref; }); -}; -/*jsc -["tinymce.plugins.code.Plugin","tinymce.core.dom.DOMUtils","tinymce.core.PluginManager","global!tinymce.util.Tools.resolve"] -jsc*/ -defineGlobal("global!tinymce.util.Tools.resolve", tinymce.util.Tools.resolve); -/** - * ResolveGlobal.js - * - * Released under LGPL License. - * Copyright (c) 1999-2017 Ephox Corp. All rights reserved - * - * License: http://www.tinymce.com/license - * Contributing: http://www.tinymce.com/contributing - */ - -define( - 'tinymce.core.dom.DOMUtils', - [ - 'global!tinymce.util.Tools.resolve' - ], - function (resolve) { - return resolve('tinymce.dom.DOMUtils'); - } -); - -/** - * ResolveGlobal.js - * - * Released under LGPL License. - * Copyright (c) 1999-2017 Ephox Corp. All rights reserved - * - * License: http://www.tinymce.com/license - * Contributing: http://www.tinymce.com/contributing - */ - -define( - 'tinymce.core.PluginManager', - [ - 'global!tinymce.util.Tools.resolve' - ], - function (resolve) { - return resolve('tinymce.PluginManager'); - } -); - -/** - * Plugin.js - * - * Released under LGPL License. - * Copyright (c) 1999-2017 Ephox Corp. All rights reserved - * - * License: http://www.tinymce.com/license - * Contributing: http://www.tinymce.com/contributing - */ - -/** - * This class contains all core logic for the code plugin. - * - * @class tinymce.code.Plugin - * @private - */ -define( - 'tinymce.plugins.code.Plugin', - [ - 'tinymce.core.dom.DOMUtils', - 'tinymce.core.PluginManager' - ], - function (DOMUtils, PluginManager) { - PluginManager.add('code', function (editor) { - function showDialog() { - var win = editor.windowManager.open({ - title: "Source code", - body: { - type: 'textbox', - name: 'code', - multiline: true, - minWidth: editor.getParam("code_dialog_width", 600), - minHeight: editor.getParam("code_dialog_height", Math.min(DOMUtils.DOM.getViewPort().h - 200, 500)), - spellcheck: false, - style: 'direction: ltr; text-align: left' - }, - onSubmit: function (e) { - // We get a lovely "Wrong document" error in IE 11 if we - // don't move the focus to the editor before creating an undo - // transation since it tries to make a bookmark for the current selection - editor.focus(); - - editor.undoManager.transact(function () { - editor.setContent(e.data.code); - }); - - editor.selection.setCursorLocation(); - editor.nodeChanged(); - } - }); - - // Gecko has a major performance issue with textarea - // contents so we need to set it when all reflows are done - win.find('#code').value(editor.getContent({ source_view: true })); - } - - editor.addCommand("mceCodeEditor", showDialog); + 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: showDialog + onclick: function () { + Dialog.open(editor); + } }); - editor.addMenuItem('code', { icon: 'code', text: 'Source code', - context: 'tools', - onclick: showDialog + onclick: function () { + Dialog.open(editor); + } }); - }); + }; + var Buttons = { register: register$1 }; - return function () { }; - } -); -dem('tinymce.plugins.code.Plugin')(); + global.add('code', function (editor) { + Commands.register(editor); + Buttons.register(editor); + return {}; + }); + function Plugin () { + } + + return Plugin; + +}()); })(); diff --git a/wp-content/plugins/tinymce-advanced/mce/code/plugin.min.js b/wp-content/plugins/tinymce-advanced/mce/code/plugin.min.js index 7a0437ed..7afcca64 100644 --- a/wp-content/plugins/tinymce-advanced/mce/code/plugin.min.js +++ b/wp-content/plugins/tinymce-advanced/mce/code/plugin.min.js @@ -1 +1 @@ -!function(){var a={},b=function(b){for(var c=a[b],e=c.deps,f=c.defn,g=e.length,h=new Array(g),i=0;i {dependencies, definition, instance (possibly undefined)} - -// Used when there is no 'main' module. -// The name is probably (hopefully) unique so minification removes for releases. -var register_3795 = function (id) { - var module = dem(id); - var fragments = id.split('.'); - var target = Function('return this;')(); - for (var i = 0; i < fragments.length - 1; ++i) { - if (target[fragments[i]] === undefined) - target[fragments[i]] = {}; - target = target[fragments[i]]; - } - target[fragments[fragments.length - 1]] = module; -}; - -var instantiate = function (id) { - var actual = defs[id]; - var dependencies = actual.deps; - var definition = actual.defn; - var len = dependencies.length; - var instances = new Array(len); - for (var i = 0; i < len; ++i) - instances[i] = dem(dependencies[i]); - var defResult = definition.apply(null, instances); - if (defResult === undefined) - throw 'module [' + id + '] returned undefined'; - actual.instance = defResult; -}; - -var def = function (id, dependencies, definition) { - if (typeof id !== 'string') - throw 'module id must be a string'; - else if (dependencies === undefined) - throw 'no dependencies for ' + id; - else if (definition === undefined) - throw 'no definition function for ' + id; - defs[id] = { - deps: dependencies, - defn: definition, - instance: undefined - }; -}; - -var dem = function (id) { - var actual = defs[id]; - if (actual === undefined) - throw 'module [' + id + '] was undefined'; - else if (actual.instance === undefined) - instantiate(id); - return actual.instance; -}; - -var req = function (ids, callback) { - var len = ids.length; - var instances = new Array(len); - for (var i = 0; i < len; ++i) - instances.push(dem(ids[i])); - callback.apply(null, callback); -}; - -var ephox = {}; - -ephox.bolt = { - module: { - api: { - define: def, - require: req, - demand: dem - } - } -}; - -var define = def; -var require = req; -var demand = dem; -// this helps with minificiation when using a lot of global references -var defineGlobal = function (id, ref) { - define(id, [], function () { return ref; }); -}; -/*jsc -["tinymce.plugins.contextmenu.Plugin","tinymce.core.dom.DOMUtils","tinymce.core.Env","tinymce.core.PluginManager","tinymce.core.ui.Factory","tinymce.core.util.Tools","tinymce.plugins.contextmenu.RangePoint","global!tinymce.util.Tools.resolve","ephox.katamari.api.Arr","ephox.katamari.api.Option","global!Array","global!Error","global!String","ephox.katamari.api.Fun","global!Object"] -jsc*/ -defineGlobal("global!tinymce.util.Tools.resolve", tinymce.util.Tools.resolve); -/** - * ResolveGlobal.js - * - * Released under LGPL License. - * Copyright (c) 1999-2017 Ephox Corp. All rights reserved - * - * License: http://www.tinymce.com/license - * Contributing: http://www.tinymce.com/contributing - */ - -define( - 'tinymce.core.dom.DOMUtils', - [ - 'global!tinymce.util.Tools.resolve' - ], - function (resolve) { - return resolve('tinymce.dom.DOMUtils'); - } -); - -/** - * ResolveGlobal.js - * - * Released under LGPL License. - * Copyright (c) 1999-2017 Ephox Corp. All rights reserved - * - * License: http://www.tinymce.com/license - * Contributing: http://www.tinymce.com/contributing - */ - -define( - 'tinymce.core.Env', - [ - 'global!tinymce.util.Tools.resolve' - ], - function (resolve) { - return resolve('tinymce.Env'); - } -); - -/** - * ResolveGlobal.js - * - * Released under LGPL License. - * Copyright (c) 1999-2017 Ephox Corp. All rights reserved - * - * License: http://www.tinymce.com/license - * Contributing: http://www.tinymce.com/contributing - */ - -define( - 'tinymce.core.PluginManager', - [ - 'global!tinymce.util.Tools.resolve' - ], - function (resolve) { - return resolve('tinymce.PluginManager'); - } -); - -/** - * ResolveGlobal.js - * - * Released under LGPL License. - * Copyright (c) 1999-2017 Ephox Corp. All rights reserved - * - * License: http://www.tinymce.com/license - * Contributing: http://www.tinymce.com/contributing - */ - -define( - 'tinymce.core.ui.Factory', - [ - 'global!tinymce.util.Tools.resolve' - ], - function (resolve) { - return resolve('tinymce.ui.Factory'); - } -); - -/** - * ResolveGlobal.js - * - * Released under LGPL License. - * Copyright (c) 1999-2017 Ephox Corp. All rights reserved - * - * License: http://www.tinymce.com/license - * Contributing: http://www.tinymce.com/contributing - */ - -define( - 'tinymce.core.util.Tools', - [ - 'global!tinymce.util.Tools.resolve' - ], - function (resolve) { - return resolve('tinymce.util.Tools'); - } -); - -defineGlobal("global!Array", Array); -defineGlobal("global!Error", Error); -define( - 'ephox.katamari.api.Fun', - - [ - 'global!Array', - 'global!Error' - ], - - function (Array, Error) { - - var noop = function () { }; - - var compose = function (fa, fb) { - return function () { - return fa(fb.apply(null, arguments)); - }; - }; - - var constant = function (value) { - return function () { + var Cell = function (initial) { + var value = initial; + var get = function () { return value; }; - }; - - var identity = function (x) { - return x; - }; - - var tripleEquals = function(a, b) { - return a === b; - }; - - // Don't use array slice(arguments), makes the whole function unoptimisable on Chrome - var curry = function (f) { - // equivalent to arguments.slice(1) - // starting at 1 because 0 is the f, makes things tricky. - // Pay attention to what variable is where, and the -1 magic. - // thankfully, we have tests for this. - var args = new Array(arguments.length - 1); - for (var i = 1; i < arguments.length; i++) args[i-1] = arguments[i]; - - return function () { - var newArgs = new Array(arguments.length); - for (var j = 0; j < newArgs.length; j++) newArgs[j] = arguments[j]; - - var all = args.concat(newArgs); - return f.apply(null, all); + var set = function (v) { + value = v; + }; + var clone = function () { + return Cell(get()); + }; + return { + get: get, + set: set, + clone: clone }; }; - var not = function (f) { - return function () { - return !f.apply(null, arguments); - }; - }; - - var die = function (msg) { - return function () { - throw new Error(msg); - }; - }; - - var apply = function (f) { - return f(); - }; - - var call = function(f) { - f(); - }; - - var never = constant(false); - var always = constant(true); - - - return { - noop: noop, - compose: compose, - constant: constant, - identity: identity, - tripleEquals: tripleEquals, - curry: curry, - not: not, - die: die, - apply: apply, - call: call, - never: never, - always: always - }; - } -); - -defineGlobal("global!Object", Object); -define( - 'ephox.katamari.api.Option', - - [ - 'ephox.katamari.api.Fun', - 'global!Object' - ], - - function (Fun, Object) { - - var never = Fun.never; - var always = Fun.always; - - /** - Option objects support the following methods: - - fold :: this Option a -> ((() -> b, a -> b)) -> Option b - - is :: this Option a -> a -> Boolean - - isSome :: this Option a -> () -> Boolean - - isNone :: this Option a -> () -> Boolean - - getOr :: this Option a -> a -> a - - getOrThunk :: this Option a -> (() -> a) -> a - - getOrDie :: this Option a -> String -> a - - or :: this Option a -> Option a -> Option a - - if some: return self - - if none: return opt - - orThunk :: this Option a -> (() -> Option a) -> Option a - - Same as "or", but uses a thunk instead of a value - - map :: this Option a -> (a -> b) -> Option b - - "fmap" operation on the Option Functor. - - same as 'each' - - ap :: this Option a -> Option (a -> b) -> Option b - - "apply" operation on the Option Apply/Applicative. - - Equivalent to <*> in Haskell/PureScript. - - each :: this Option a -> (a -> b) -> Option b - - same as 'map' - - bind :: this Option a -> (a -> Option b) -> Option b - - "bind"/"flatMap" operation on the Option Bind/Monad. - - Equivalent to >>= in Haskell/PureScript; flatMap in Scala. - - flatten :: {this Option (Option a))} -> () -> Option a - - "flatten"/"join" operation on the Option Monad. - - exists :: this Option a -> (a -> Boolean) -> Boolean - - forall :: this Option a -> (a -> Boolean) -> Boolean - - filter :: this Option a -> (a -> Boolean) -> Option a - - equals :: this Option a -> Option a -> Boolean - - equals_ :: this Option a -> (Option a, a -> Boolean) -> Boolean - - toArray :: this Option a -> () -> [a] - - */ - - var none = function () { return NONE; }; - - var NONE = (function () { - var eq = function (o) { - return o.isNone(); - }; - - // inlined from peanut, maybe a micro-optimisation? - var call = function (thunk) { return thunk(); }; - var id = function (n) { return n; }; - var noop = function () { }; - - var me = { - fold: function (n, s) { return n(); }, - is: never, - isSome: never, - isNone: always, - getOr: id, - getOrThunk: call, - getOrDie: function (msg) { - throw new Error(msg || 'error: getOrDie called on none.'); - }, - or: id, - orThunk: call, - map: none, - ap: none, - each: noop, - bind: none, - flatten: none, - exists: never, - forall: always, - filter: none, - equals: eq, - equals_: eq, - toArray: function () { return []; }, - toString: Fun.constant("none()") - }; - if (Object.freeze) Object.freeze(me); - return me; - })(); - - - /** some :: a -> Option a */ - var some = function (a) { - - // inlined from peanut, maybe a micro-optimisation? - var constant_a = function () { return a; }; - - var self = function () { - // can't Fun.constant this one - 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, - isNone: never, - getOr: constant_a, - getOrThunk: constant_a, - getOrDie: 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, - function (b) { return elementEq(a, b); } - ); - }, - toArray: function () { - return [a]; - }, - toString: function () { - return 'some(' + a + ')'; - } - }; - return me; - }; - - /** from :: undefined|null|a -> Option a */ - var from = function (value) { - return value === null || value === undefined ? NONE : some(value); - }; - - return { - some: some, - none: none, - from: from - }; - } -); - -defineGlobal("global!String", String); -define( - 'ephox.katamari.api.Arr', - - [ - 'ephox.katamari.api.Option', - 'global!Array', - 'global!Error', - 'global!String' - ], - - function (Option, Array, Error, String) { - // Use the native Array.indexOf if it is available (IE9+) otherwise fall back to manual iteration - // https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Array/indexOf - 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 indexOf = function (xs, x) { - // The rawIndexOf method does not wrap up in an option. This is for performance reasons. - var r = rawIndexOf(xs, x); - return r === -1 ? Option.none() : Option.some(r); - }; - - var contains = function (xs, x) { - return rawIndexOf(xs, x) > -1; - }; - - // Using findIndex is likely less optimal in Chrome (dynamic return type instead of bool) - // but if we need that micro-optimisation we can inline it later. - var exists = function (xs, pred) { - return findIndex(xs, pred).isSome(); - }; - - var range = function (num, f) { - var r = []; - for (var i = 0; i < num; i++) { - r.push(f(i)); - } - return r; - }; - - // It's a total micro optimisation, but these do make some difference. - // Particularly for browsers other than Chrome. - // - length caching - // http://jsperf.com/browser-diet-jquery-each-vs-for-loop/69 - // - not using push - // http://jsperf.com/array-direct-assignment-vs-push/2 - - var chunk = function (array, size) { - var r = []; - for (var i = 0; i < array.length; i += size) { - var s = array.slice(i, i + size); - r.push(s); - } - return r; - }; - - var map = function(xs, f) { - // pre-allocating array size when it's guaranteed to be known - // http://jsperf.com/push-allocated-vs-dynamic/22 - 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; - }; - - // Unwound implementing other functions in terms of each. - // The code size is roughly the same, and it should allow for better optimisation. - 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 partition = function(xs, pred) { - var pass = []; - var fail = []; - for (var i = 0, len = xs.length; i < len; i++) { - var x = xs[i]; - var arr = pred(x, i, xs) ? pass : fail; - arr.push(x); - } - return { pass: pass, fail: fail }; - }; - - 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; - }; - - /* - * Groups an array into contiguous arrays of like elements. Whether an element is like or not depends on f. - * - * f is a function that derives a value from an element - e.g. true or false, or a string. - * Elements are like if this function generates the same value for them (according to ===). - * - * - * Order of the elements is preserved. Arr.flatten() on the result will return the original list, as with Haskell groupBy function. - * For a good explanation, see the group function (which is a special case of groupBy) - * http://hackage.haskell.org/package/base-4.7.0.0/docs/Data-List.html#v:group - */ - var groupBy = function (xs, f) { - if (xs.length === 0) { - return []; - } else { - var wasType = f(xs[0]); // initial case for matching - var r = []; - var group = []; - - for (var i = 0, len = xs.length; i < len; i++) { - var x = xs[i]; - var type = f(x); - if (type !== wasType) { - r.push(group); - group = []; - } - wasType = type; - group.push(x); - } - if (group.length !== 0) { - r.push(group); - } - 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) { - // Note, this is possible because push supports multiple arguments: - // http://jsperf.com/concat-push/6 - // Note that in the past, concat() would silently work (very slowly) for array-like objects. - // With this change it will throw an error. - var r = []; - for (var i = 0, len = xs.length; i < len; ++i) { - // Ensure that each value is an array itself - if (! Array.prototype.isPrototypeOf(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 equal = function (a1, a2) { - return a1.length === a2.length && forall(a1, function (x, i) { - return x === a2[i]; - }); - }; - - var slice = Array.prototype.slice; - var reverse = function (xs) { - var r = slice.call(xs, 0); - r.reverse(); - return r; - }; - - var difference = function (a1, a2) { - return filter(a1, function (x) { - return !contains(a2, x); - }); - }; - - var mapToObject = function(xs, f) { - var r = {}; - for (var i = 0, len = xs.length; i < len; i++) { - var x = xs[i]; - r[String(x)] = f(x, i); - } - return r; - }; - - var pure = function(x) { - return [x]; - }; - - var sort = function (xs, comparator) { - var copy = slice.call(xs, 0); - copy.sort(comparator); - return copy; - }; - - return { - map: map, - each: each, - eachr: eachr, - partition: partition, - filter: filter, - groupBy: groupBy, - indexOf: indexOf, - foldr: foldr, - foldl: foldl, - find: find, - findIndex: findIndex, - flatten: flatten, - bind: bind, - forall: forall, - exists: exists, - contains: contains, - equal: equal, - reverse: reverse, - chunk: chunk, - difference: difference, - mapToObject: mapToObject, - pure: pure, - sort: sort, - range: range - }; - } -); -/** - * RangePoint.js - * - * Released under LGPL License. - * Copyright (c) 1999-2017 Ephox Corp. All rights reserved - * - * License: http://www.tinymce.com/license - * Contributing: http://www.tinymce.com/contributing - */ - -define( - 'tinymce.plugins.contextmenu.RangePoint', - [ - 'ephox.katamari.api.Arr' - ], - function (Arr) { - var containsXY = function (clientRect, clientX, clientY) { - return ( - clientX >= clientRect.left && - clientX <= clientRect.right && - clientY >= clientRect.top && - clientY <= clientRect.bottom - ); - }; - - var isXYWithinRange = function (clientX, clientY, range) { - if (range.collapsed) { - return false; - } - - return Arr.foldl(range.getClientRects(), function (state, rect) { - return state || containsXY(rect, clientX, clientY); - }, false); - }; - - return { - isXYWithinRange: isXYWithinRange - }; - } -); -/** - * Plugin.js - * - * Released under LGPL License. - * Copyright (c) 1999-2017 Ephox Corp. All rights reserved - * - * License: http://www.tinymce.com/license - * Contributing: http://www.tinymce.com/contributing - */ - -/** - * This class contains all core logic for the contextmenu plugin. - * - * @class tinymce.contextmenu.Plugin - * @private - */ -define( - 'tinymce.plugins.contextmenu.Plugin', - [ - 'tinymce.core.dom.DOMUtils', - 'tinymce.core.Env', - 'tinymce.core.PluginManager', - 'tinymce.core.ui.Factory', - 'tinymce.core.util.Tools', - 'tinymce.plugins.contextmenu.RangePoint' - ], - function (DOMUtils, Env, PluginManager, Factory, Tools, RangePoint) { - var DOM = DOMUtils.DOM; - - PluginManager.add('contextmenu', function (editor) { - var menu, visibleState, contextmenuNeverUseNative = editor.settings.contextmenu_never_use_native; - - var isNativeOverrideKeyEvent = function (e) { - return e.ctrlKey && !contextmenuNeverUseNative; - }; - - var isMacWebKit = function () { - return Env.mac && Env.webkit; - }; + var global = tinymce.util.Tools.resolve('tinymce.PluginManager'); + var get = function (visibleState) { var isContextMenuVisible = function () { - return visibleState === true; + return visibleState.get(); }; + return { isContextMenuVisible: isContextMenuVisible }; + }; + var Api = { get: get }; - var isImage = function (elm) { - return elm && elm.nodeName === 'IMG'; + 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 isEventOnImageOutsideRange = function (evt, range) { - return isImage(evt.target) && RangePoint.isXYWithinRange(evt.clientX, evt.clientY, range) === false; - }; + var global$2 = tinymce.util.Tools.resolve('tinymce.ui.Factory'); - /** - * This takes care of a os x native issue where it expands the selection - * to the word at the caret position to do "lookups". Since we are overriding - * the context menu we also need to override this expanding so the behavior becomes - * normalized. Firefox on os x doesn't expand to the word when using the context menu. - */ - editor.on('mousedown', function (e) { - if (isMacWebKit() && e.button === 2 && !isNativeOverrideKeyEvent(e) && editor.selection.isCollapsed()) { - editor.once('contextmenu', function (e2) { - if (!isImage(e2.target)) { - editor.selection.placeCaretAt(e2.clientX, e2.clientY); - } - }); + 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) { - var contextmenu; - - if (isNativeOverrideKeyEvent(e)) { + if (isNativeOverrideKeyEvent(editor, e)) { return; } - - if (isEventOnImageOutsideRange(e, editor.selection.getRng())) { - editor.selection.select(e.target); - } - e.preventDefault(); - contextmenu = editor.settings.contextmenu || 'link openlink image inserttable | cell row column deletetable'; - - // Render menu - if (!menu) { - var items = []; - - Tools.each(contextmenu.split(/[ ,]/), function (name) { - var item = editor.menuItems[name]; - - if (name == '|') { - item = { text: name }; - } - - if (item) { - item.shortcut = ''; // Hide shortcuts - 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 = Factory.create('menu', { - items: items, - context: 'contextmenu', - classes: 'contextmenu' - }).renderTo(); - - menu.on('hide', function (e) { - if (e.control === this) { - visibleState = false; - } - }); - - editor.on('remove', function () { - menu.remove(); - menu = null; - }); - - } else { - menu.show(); - } - - // Position menu - var pos = { x: e.pageX, y: e.pageY }; - - if (!editor.inline) { - pos = DOM.getPos(editor.getContentAreaContainer()); - pos.x += e.clientX; - pos.y += e.clientY; - } - - menu.moveTo(pos.x, pos.y); - visibleState = true; + ContextMenu.show(editor, Coords.getPos(editor, e), visibleState, menu); }); + }; + var Bind = { setup: setup }; - return { - isContextMenuVisible: isContextMenuVisible - }; + global.add('contextmenu', function (editor) { + var menu = Cell(null), visibleState = Cell(false); + Bind.setup(editor, visibleState, menu); + return Api.get(visibleState); }); - return function () { }; - } -); -dem('tinymce.plugins.contextmenu.Plugin')(); + function Plugin () { + } + + return Plugin; + +}()); })(); diff --git a/wp-content/plugins/tinymce-advanced/mce/contextmenu/plugin.min.js b/wp-content/plugins/tinymce-advanced/mce/contextmenu/plugin.min.js index 65251839..a2e2c754 100644 --- a/wp-content/plugins/tinymce-advanced/mce/contextmenu/plugin.min.js +++ b/wp-content/plugins/tinymce-advanced/mce/contextmenu/plugin.min.js @@ -1 +1 @@ -!function(){var a={},b=function(b){for(var c=a[b],e=c.deps,f=c.defn,g=e.length,h=new Array(g),i=0;i-1},h=function(a,b){return t(a,b).isSome()},i=function(a,b){for(var c=[],d=0;d=0;c--){var d=a[c];b(d,c,a)}},n=function(a,b){for(var c=[],d=[],e=0,f=a.length;e=a.left&&b<=a.right&&c>=a.top&&c<=a.bottom},c=function(c,d,e){return!e.collapsed&&a.foldl(e.getClientRects(),function(a,e){return a||b(e,c,d)},!1)};return{isXYWithinRange:c}}),g("0",["1","2","3","4","5","6"],function(a,b,c,d,e,f){var g=a.DOM;return c.add("contextmenu",function(a){var c,h,i=a.settings.contextmenu_never_use_native,j=function(a){return a.ctrlKey&&!i},k=function(){return b.mac&&b.webkit},l=function(){return h===!0},m=function(a){return a&&"IMG"===a.nodeName},n=function(a,b){return m(a.target)&&f.isXYWithinRange(a.clientX,a.clientY,b)===!1};return a.on("mousedown",function(b){k()&&2===b.button&&!j(b)&&a.selection.isCollapsed()&&a.once("contextmenu",function(b){m(b.target)||a.selection.placeCaretAt(b.clientX,b.clientY)})}),a.on("contextmenu",function(b){var f;if(!j(b)){if(n(b,a.selection.getRng())&&a.selection.select(b.target),b.preventDefault(),f=a.settings.contextmenu||"link openlink image inserttable | cell row column deletetable",c)c.show();else{var i=[];e.each(f.split(/[ ,]/),function(b){var c=a.menuItems[b];"|"==b&&(c={text:b}),c&&(c.shortcut="",i.push(c))});for(var k=0;k {dependencies, definition, instance (possibly undefined)} + var global = tinymce.util.Tools.resolve('tinymce.PluginManager'); -// Used when there is no 'main' module. -// The name is probably (hopefully) unique so minification removes for releases. -var register_3795 = function (id) { - var module = dem(id); - var fragments = id.split('.'); - var target = Function('return this;')(); - for (var i = 0; i < fragments.length - 1; ++i) { - if (target[fragments[i]] === undefined) - target[fragments[i]] = {}; - target = target[fragments[i]]; - } - target[fragments[fragments.length - 1]] = module; -}; + var global$1 = tinymce.util.Tools.resolve('tinymce.dom.DOMUtils'); -var instantiate = function (id) { - var actual = defs[id]; - var dependencies = actual.deps; - var definition = actual.defn; - var len = dependencies.length; - var instances = new Array(len); - for (var i = 0; i < len; ++i) - instances[i] = dem(dependencies[i]); - var defResult = definition.apply(null, instances); - if (defResult === undefined) - throw 'module [' + id + '] returned undefined'; - actual.instance = defResult; -}; + var global$2 = tinymce.util.Tools.resolve('tinymce.EditorManager'); -var def = function (id, dependencies, definition) { - if (typeof id !== 'string') - throw 'module id must be a string'; - else if (dependencies === undefined) - throw 'no dependencies for ' + id; - else if (definition === undefined) - throw 'no definition function for ' + id; - defs[id] = { - deps: dependencies, - defn: definition, - instance: undefined - }; -}; + var global$3 = tinymce.util.Tools.resolve('tinymce.Env'); -var dem = function (id) { - var actual = defs[id]; - if (actual === undefined) - throw 'module [' + id + '] was undefined'; - else if (actual.instance === undefined) - instantiate(id); - return actual.instance; -}; + var global$4 = tinymce.util.Tools.resolve('tinymce.util.Tools'); -var req = function (ids, callback) { - var len = ids.length; - var instances = new Array(len); - for (var i = 0; i < len; ++i) - instances.push(dem(ids[i])); - callback.apply(null, callback); -}; + var shouldMergeClasses = function (editor) { + return editor.getParam('importcss_merge_classes'); + }; + var shouldImportExclusive = function (editor) { + return editor.getParam('importcss_exclusive'); + }; + var getSelectorConverter = function (editor) { + return editor.getParam('importcss_selector_converter'); + }; + var getSelectorFilter = function (editor) { + return editor.getParam('importcss_selector_filter'); + }; + var getCssGroups = function (editor) { + return editor.getParam('importcss_groups'); + }; + var shouldAppend = function (editor) { + return editor.getParam('importcss_append'); + }; + var getFileFilter = function (editor) { + return editor.getParam('importcss_file_filter'); + }; + var Settings = { + shouldMergeClasses: shouldMergeClasses, + shouldImportExclusive: shouldImportExclusive, + getSelectorConverter: getSelectorConverter, + getSelectorFilter: getSelectorFilter, + getCssGroups: getCssGroups, + shouldAppend: shouldAppend, + getFileFilter: getFileFilter + }; -var ephox = {}; - -ephox.bolt = { - module: { - api: { - define: def, - require: req, - demand: dem - } - } -}; - -var define = def; -var require = req; -var demand = dem; -// this helps with minificiation when using a lot of global references -var defineGlobal = function (id, ref) { - define(id, [], function () { return ref; }); -}; -/*jsc -["tinymce.plugins.importcss.Plugin","tinymce.core.EditorManager","tinymce.core.dom.DOMUtils","tinymce.core.Env","tinymce.core.PluginManager","tinymce.core.util.Tools","global!tinymce.util.Tools.resolve"] -jsc*/ -defineGlobal("global!tinymce.util.Tools.resolve", tinymce.util.Tools.resolve); -/** - * ResolveGlobal.js - * - * Released under LGPL License. - * Copyright (c) 1999-2017 Ephox Corp. All rights reserved - * - * License: http://www.tinymce.com/license - * Contributing: http://www.tinymce.com/contributing - */ - -define( - 'tinymce.core.EditorManager', - [ - 'global!tinymce.util.Tools.resolve' - ], - function (resolve) { - return resolve('tinymce.EditorManager'); - } -); - -/** - * ResolveGlobal.js - * - * Released under LGPL License. - * Copyright (c) 1999-2017 Ephox Corp. All rights reserved - * - * License: http://www.tinymce.com/license - * Contributing: http://www.tinymce.com/contributing - */ - -define( - 'tinymce.core.dom.DOMUtils', - [ - 'global!tinymce.util.Tools.resolve' - ], - function (resolve) { - return resolve('tinymce.dom.DOMUtils'); - } -); - -/** - * ResolveGlobal.js - * - * Released under LGPL License. - * Copyright (c) 1999-2017 Ephox Corp. All rights reserved - * - * License: http://www.tinymce.com/license - * Contributing: http://www.tinymce.com/contributing - */ - -define( - 'tinymce.core.Env', - [ - 'global!tinymce.util.Tools.resolve' - ], - function (resolve) { - return resolve('tinymce.Env'); - } -); - -/** - * ResolveGlobal.js - * - * Released under LGPL License. - * Copyright (c) 1999-2017 Ephox Corp. All rights reserved - * - * License: http://www.tinymce.com/license - * Contributing: http://www.tinymce.com/contributing - */ - -define( - 'tinymce.core.PluginManager', - [ - 'global!tinymce.util.Tools.resolve' - ], - function (resolve) { - return resolve('tinymce.PluginManager'); - } -); - -/** - * ResolveGlobal.js - * - * Released under LGPL License. - * Copyright (c) 1999-2017 Ephox Corp. All rights reserved - * - * License: http://www.tinymce.com/license - * Contributing: http://www.tinymce.com/contributing - */ - -define( - 'tinymce.core.util.Tools', - [ - 'global!tinymce.util.Tools.resolve' - ], - function (resolve) { - return resolve('tinymce.util.Tools'); - } -); - -/** - * Plugin.js - * - * Released under LGPL License. - * Copyright (c) 1999-2017 Ephox Corp. All rights reserved - * - * License: http://www.tinymce.com/license - * Contributing: http://www.tinymce.com/contributing - */ - -/** - * This class contains all core logic for the importcss plugin. - * - * @class tinymce.importcss.Plugin - * @private - */ -define( - 'tinymce.plugins.importcss.Plugin', - [ - 'tinymce.core.EditorManager', - 'tinymce.core.dom.DOMUtils', - 'tinymce.core.Env', - 'tinymce.core.PluginManager', - 'tinymce.core.util.Tools' - ], - function (EditorManager, DOMUtils, Env, PluginManager, Tools) { - PluginManager.add('importcss', function (editor) { - var self = this, each = Tools.each; - - function removeCacheSuffix(url) { - var cacheSuffix = Env.cacheSuffix; - - if (typeof url == 'string') { - url = url.replace('?' + cacheSuffix, '').replace('&' + cacheSuffix, ''); - } - - return url; + var removeCacheSuffix = function (url) { + var cacheSuffix = global$3.cacheSuffix; + if (typeof url === 'string') { + url = url.replace('?' + cacheSuffix, '').replace('&' + cacheSuffix, ''); } - - function isSkinContentCss(href) { - var settings = editor.settings, skin = settings.skin !== false ? settings.skin || 'lightgray' : false; - - if (skin) { - var skinUrl = settings.skin_url; - - if (skinUrl) { - skinUrl = editor.documentBaseURI.toAbsolute(skinUrl); - } else { - skinUrl = EditorManager.baseURL + '/skins/' + skin; - } - - return href === skinUrl + '/content' + (editor.inline ? '.inline' : '') + '.min.css'; - } - - return false; + return url; + }; + var isSkinContentCss = function (editor, href) { + var settings = editor.settings, skin = settings.skin !== false ? settings.skin || 'lightgray' : false; + if (skin) { + var skinUrl = settings.skin_url ? editor.documentBaseURI.toAbsolute(settings.skin_url) : global$2.baseURL + '/skins/' + skin; + return href === skinUrl + '/content' + (editor.inline ? '.inline' : '') + '.min.css'; } - - function compileFilter(filter) { - if (typeof filter == "string") { - return function (value) { - return value.indexOf(filter) !== -1; - }; - } else if (filter instanceof RegExp) { - return function (value) { - return filter.test(value); - }; - } - - return filter; + return false; + }; + var compileFilter = function (filter) { + if (typeof filter === 'string') { + return function (value) { + return value.indexOf(filter) !== -1; + }; + } else if (filter instanceof RegExp) { + return function (value) { + return filter.test(value); + }; } - - function getSelectors(doc, fileFilter) { - var selectors = [], contentCSSUrls = {}; - - function append(styleSheet, imported) { - var href = styleSheet.href, rules; - - href = removeCacheSuffix(href); - - if (!href || !fileFilter(href, imported) || isSkinContentCss(href)) { - return; - } - - each(styleSheet.imports, function (styleSheet) { - append(styleSheet, true); - }); - - try { - rules = styleSheet.cssRules || styleSheet.rules; - } catch (e) { - // Firefox fails on rules to remote domain for example: - // @import url(//fonts.googleapis.com/css?family=Pathway+Gothic+One); - } - - each(rules, function (cssRule) { - if (cssRule.styleSheet) { - append(cssRule.styleSheet, true); - } else if (cssRule.selectorText) { - each(cssRule.selectorText.split(','), function (selector) { - selectors.push(Tools.trim(selector)); - }); - } - }); - } - - each(editor.contentCSS, function (url) { - contentCSSUrls[url] = true; - }); - - if (!fileFilter) { - fileFilter = function (href, imported) { - return imported || contentCSSUrls[href]; - }; - } - - try { - each(doc.styleSheets, function (styleSheet) { - append(styleSheet); - }); - } catch (e) { - // Ignore - } - - return selectors; - } - - function defaultConvertSelectorToFormat(selectorText) { - var format; - - // Parse simple element.class1, .class1 - var selector = /^(?:([a-z0-9\-_]+))?(\.[a-z0-9_\-\.]+)$/i.exec(selectorText); - if (!selector) { + return filter; + }; + var getSelectors = function (editor, doc, fileFilter) { + var selectors = [], contentCSSUrls = {}; + function append(styleSheet, imported) { + var href = styleSheet.href, rules; + href = removeCacheSuffix(href); + if (!href || !fileFilter(href, imported) || isSkinContentCss(editor, href)) { return; } - - var elementName = selector[1]; - var classes = selector[2].substr(1).split('.').join(' '); - var inlineSelectorElements = Tools.makeMap('a,img'); - - // element.class - Produce block formats - if (selector[1]) { - format = { - title: selectorText - }; - - if (editor.schema.getTextBlockElements()[elementName]) { - // Text block format ex: h1.class1 - format.block = elementName; - } else if (editor.schema.getBlockElements()[elementName] || inlineSelectorElements[elementName.toLowerCase()]) { - // Block elements such as table.class and special inline elements such as a.class or img.class - format.selector = elementName; - } else { - // Inline format strong.class1 - format.inline = elementName; + global$4.each(styleSheet.imports, function (styleSheet) { + append(styleSheet, true); + }); + try { + rules = styleSheet.cssRules || styleSheet.rules; + } catch (e) { + } + global$4.each(rules, function (cssRule) { + if (cssRule.styleSheet) { + append(cssRule.styleSheet, true); + } else if (cssRule.selectorText) { + global$4.each(cssRule.selectorText.split(','), function (selector) { + selectors.push(global$4.trim(selector)); + }); } - } else if (selector[2]) { - // .class - Produce inline span with classes - format = { - inline: 'span', - title: selectorText.substr(1), - classes: classes - }; - } - - // Append to or override class attribute - if (editor.settings.importcss_merge_classes !== false) { - format.classes = classes; - } else { - format.attributes = { "class": classes }; - } - - return format; - } - - function getGroupsBySelector(groups, selector) { - return Tools.grep(groups, function (group) { - return !group.filter || group.filter(selector); }); } - - function compileUserDefinedGroups(groups) { - return Tools.map(groups, function (group) { - return Tools.extend({}, group, { - original: group, - selectors: {}, - filter: compileFilter(group.filter), - item: { - text: group.title, - menu: [] - } - }); + global$4.each(editor.contentCSS, function (url) { + contentCSSUrls[url] = true; + }); + if (!fileFilter) { + fileFilter = function (href, imported) { + return imported || contentCSSUrls[href]; + }; + } + try { + global$4.each(doc.styleSheets, function (styleSheet) { + append(styleSheet); }); + } catch (e) { } - - function isExclusiveMode(editor, group) { - // Exclusive mode can only be disabled when there are groups allowing the same style to be present in multiple groups - return group === null || editor.settings.importcss_exclusive !== false; + return selectors; + }; + var defaultConvertSelectorToFormat = function (editor, selectorText) { + var format; + var selector = /^(?:([a-z0-9\-_]+))?(\.[a-z0-9_\-\.]+)$/i.exec(selectorText); + if (!selector) { + return; } - - function isUniqueSelector(selector, group, globallyUniqueSelectors) { - return !(isExclusiveMode(editor, group) ? selector in globallyUniqueSelectors : selector in group.selectors); - } - - function markUniqueSelector(selector, group, globallyUniqueSelectors) { - if (isExclusiveMode(editor, group)) { - globallyUniqueSelectors[selector] = true; + var elementName = selector[1]; + var classes = selector[2].substr(1).split('.').join(' '); + var inlineSelectorElements = global$4.makeMap('a,img'); + if (selector[1]) { + format = { title: selectorText }; + if (editor.schema.getTextBlockElements()[elementName]) { + format.block = elementName; + } else if (editor.schema.getBlockElements()[elementName] || inlineSelectorElements[elementName.toLowerCase()]) { + format.selector = elementName; } else { - group.selectors[selector] = true; + format.inline = elementName; } + } else if (selector[2]) { + format = { + inline: 'span', + title: selectorText.substr(1), + classes: classes + }; } - - function convertSelectorToFormat(plugin, selector, group) { - var selectorConverter, settings = editor.settings; - - if (group && group.selector_converter) { - selectorConverter = group.selector_converter; - } else if (settings.importcss_selector_converter) { - selectorConverter = settings.importcss_selector_converter; - } else { - selectorConverter = defaultConvertSelectorToFormat; - } - - return selectorConverter.call(plugin, selector, group); + if (Settings.shouldMergeClasses(editor) !== false) { + format.classes = classes; + } else { + format.attributes = { class: classes }; } - + return format; + }; + var getGroupsBySelector = function (groups, selector) { + return global$4.grep(groups, function (group) { + return !group.filter || group.filter(selector); + }); + }; + var compileUserDefinedGroups = function (groups) { + return global$4.map(groups, function (group) { + return global$4.extend({}, group, { + original: group, + selectors: {}, + filter: compileFilter(group.filter), + item: { + text: group.title, + menu: [] + } + }); + }); + }; + var isExclusiveMode = function (editor, group) { + return group === null || Settings.shouldImportExclusive(editor) !== false; + }; + var isUniqueSelector = function (editor, selector, group, globallyUniqueSelectors) { + return !(isExclusiveMode(editor, group) ? selector in globallyUniqueSelectors : selector in group.selectors); + }; + var markUniqueSelector = function (editor, selector, group, globallyUniqueSelectors) { + if (isExclusiveMode(editor, group)) { + globallyUniqueSelectors[selector] = true; + } else { + group.selectors[selector] = true; + } + }; + var convertSelectorToFormat = function (editor, plugin, selector, group) { + var selectorConverter; + if (group && group.selector_converter) { + selectorConverter = group.selector_converter; + } else if (Settings.getSelectorConverter(editor)) { + selectorConverter = Settings.getSelectorConverter(editor); + } else { + selectorConverter = function () { + return defaultConvertSelectorToFormat(editor, selector); + }; + } + return selectorConverter.call(plugin, selector, group); + }; + var setup = function (editor) { editor.on('renderFormatsMenu', function (e) { - var settings = editor.settings, globallyUniqueSelectors = {}; - var selectorFilter = compileFilter(settings.importcss_selector_filter), ctrl = e.control; - var groups = compileUserDefinedGroups(settings.importcss_groups); - + var globallyUniqueSelectors = {}; + var selectorFilter = compileFilter(Settings.getSelectorFilter(editor)), ctrl = e.control; + var groups = compileUserDefinedGroups(Settings.getCssGroups(editor)); var processSelector = function (selector, group) { - if (isUniqueSelector(selector, group, globallyUniqueSelectors)) { - markUniqueSelector(selector, group, globallyUniqueSelectors); - - var format = convertSelectorToFormat(self, selector, group); + if (isUniqueSelector(editor, selector, group, globallyUniqueSelectors)) { + markUniqueSelector(editor, selector, group, globallyUniqueSelectors); + var format = convertSelectorToFormat(editor, editor.plugins.importcss, selector, group); if (format) { - var formatName = format.name || DOMUtils.DOM.uniqueId(); + var formatName = format.name || global$1.DOM.uniqueId(); editor.formatter.register(formatName, format); - - return Tools.extend({}, ctrl.settings.itemDefaults, { + return global$4.extend({}, ctrl.settings.itemDefaults, { text: format.title, format: formatName }); } } - return null; }; - - if (!editor.settings.importcss_append) { + if (!Settings.shouldAppend(editor)) { ctrl.items().remove(); } - - each(getSelectors(e.doc || editor.getDoc(), compileFilter(settings.importcss_file_filter)), function (selector) { + global$4.each(getSelectors(editor, e.doc || editor.getDoc(), compileFilter(Settings.getFileFilter(editor))), function (selector) { if (selector.indexOf('.mce-') === -1) { if (!selectorFilter || selectorFilter(selector)) { var selectorGroups = getGroupsBySelector(groups, selector); - if (selectorGroups.length > 0) { - Tools.each(selectorGroups, function (group) { + global$4.each(selectorGroups, function (group) { var menuItem = processSelector(selector, group); if (menuItem) { group.item.menu.push(menuItem); @@ -458,22 +230,35 @@ define( } } }); - - each(groups, function (group) { + 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 + }; - // Expose default convertSelectorToFormat implementation - self.convertSelectorToFormat = defaultConvertSelectorToFormat; + 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 function () { }; - } -); -dem('tinymce.plugins.importcss.Plugin')(); + return Plugin; + +}()); })(); diff --git a/wp-content/plugins/tinymce-advanced/mce/importcss/plugin.min.js b/wp-content/plugins/tinymce-advanced/mce/importcss/plugin.min.js index 0579ac49..8585a1e9 100644 --- a/wp-content/plugins/tinymce-advanced/mce/importcss/plugin.min.js +++ b/wp-content/plugins/tinymce-advanced/mce/importcss/plugin.min.js @@ -1 +1 @@ -!function(){var a={},b=function(b){for(var c=a[b],e=c.deps,f=c.defn,g=e.length,h=new Array(g),i=0;i0)e.each(b,function(b){var c=s(a,b);c&&b.item.menu.push(c)});else{var c=s(a,null);c&&j.add(c)}}}),r(m,function(a){a.item.menu.length>0&&j.add(a.item)}),a.control.renderNew()}),q.convertSelectorToFormat=j}),function(){}}),d("0")()}(); \ No newline at end of file +!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 {dependencies, definition, instance (possibly undefined)} + 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 + }; + }; -// Used when there is no 'main' module. -// The name is probably (hopefully) unique so minification removes for releases. -var register_3795 = function (id) { - var module = dem(id); - var fragments = id.split('.'); - var target = Function('return this;')(); - for (var i = 0; i < fragments.length - 1; ++i) { - if (target[fragments[i]] === undefined) - target[fragments[i]] = {}; - target = target[fragments[i]]; - } - target[fragments[fragments.length - 1]] = module; -}; + var global = tinymce.util.Tools.resolve('tinymce.PluginManager'); -var instantiate = function (id) { - var actual = defs[id]; - var dependencies = actual.deps; - var definition = actual.defn; - var len = dependencies.length; - var instances = new Array(len); - for (var i = 0; i < len; ++i) - instances[i] = dem(dependencies[i]); - var defResult = definition.apply(null, instances); - if (defResult === undefined) - throw 'module [' + id + '] returned undefined'; - actual.instance = defResult; -}; + 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 def = function (id, dependencies, definition) { - if (typeof id !== 'string') - throw 'module id must be a string'; - else if (dependencies === undefined) - throw 'no dependencies for ' + id; - else if (definition === undefined) - throw 'no definition function for ' + id; - defs[id] = { - deps: dependencies, - defn: definition, - instance: undefined - }; -}; - -var dem = function (id) { - var actual = defs[id]; - if (actual === undefined) - throw 'module [' + id + '] was undefined'; - else if (actual.instance === undefined) - instantiate(id); - return actual.instance; -}; - -var req = function (ids, callback) { - var len = ids.length; - var instances = new Array(len); - for (var i = 0; i < len; ++i) - instances.push(dem(ids[i])); - callback.apply(null, callback); -}; - -var ephox = {}; - -ephox.bolt = { - module: { - api: { - define: def, - require: req, - demand: dem - } - } -}; - -var define = def; -var require = req; -var demand = dem; -// this helps with minificiation when using a lot of global references -var defineGlobal = function (id, ref) { - define(id, [], function () { return ref; }); -}; -/*jsc -["tinymce.plugins.insertdatetime.Plugin","tinymce.core.PluginManager","tinymce.core.util.Tools","global!tinymce.util.Tools.resolve"] -jsc*/ -defineGlobal("global!tinymce.util.Tools.resolve", tinymce.util.Tools.resolve); -/** - * ResolveGlobal.js - * - * Released under LGPL License. - * Copyright (c) 1999-2017 Ephox Corp. All rights reserved - * - * License: http://www.tinymce.com/license - * Contributing: http://www.tinymce.com/contributing - */ - -define( - 'tinymce.core.PluginManager', - [ - 'global!tinymce.util.Tools.resolve' - ], - function (resolve) { - return resolve('tinymce.PluginManager'); - } -); - -/** - * ResolveGlobal.js - * - * Released under LGPL License. - * Copyright (c) 1999-2017 Ephox Corp. All rights reserved - * - * License: http://www.tinymce.com/license - * Contributing: http://www.tinymce.com/contributing - */ - -define( - 'tinymce.core.util.Tools', - [ - 'global!tinymce.util.Tools.resolve' - ], - function (resolve) { - return resolve('tinymce.util.Tools'); - } -); - -/** - * Plugin.js - * - * Released under LGPL License. - * Copyright (c) 1999-2017 Ephox Corp. All rights reserved - * - * License: http://www.tinymce.com/license - * Contributing: http://www.tinymce.com/contributing - */ - -/** - * This class contains all core logic for the insertdatetime plugin. - * - * @class tinymce.insertdatetime.Plugin - * @private - */ -define( - 'tinymce.plugins.insertdatetime.Plugin', - [ - 'tinymce.core.PluginManager', - 'tinymce.core.util.Tools' - ], - function (PluginManager, Tools) { - PluginManager.add('insertdatetime', function (editor) { - 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 menuItems = [], lastFormat, defaultButtonTimeFormat; - - function getDateTime(fmt, date) { - function addZeros(value, len) { - value = "" + value; - - if (value.length < len) { - for (var i = 0; i < (len - value.length); i++) { - value = "0" + value; - } - } - - return value; + 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; } - - 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; } - - function insertDateTime(format) { - var html = getDateTime(format); - - if (editor.settings.insertdatetime_element) { - var computerTime; - - if (/%[HMSIp]/.test(format)) { - computerTime = getDateTime("%Y-%m-%dT%H:%M"); - } else { - computerTime = getDateTime("%Y-%m-%d"); - } - - html = ''; - - var timeElm = editor.dom.getParent(editor.selection.getStart(), 'time'); - if (timeElm) { - editor.dom.setOuterHTML(timeElm, html); - return; - } + 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'); } - - editor.insertContent(html); + 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 () { - insertDateTime(editor.getParam("insertdatetime_dateformat", editor.translate("%Y-%m-%d"))); + Actions.insertDateTime(editor, Settings.getDateFormat(editor)); }); - editor.addCommand('mceInsertTime', function () { - insertDateTime(editor.getParam("insertdatetime_timeformat", editor.translate('%H:%M:%S'))); + 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 () { - insertDateTime(lastFormat || defaultButtonTimeFormat); - }, - menu: menuItems - }); - - Tools.each(editor.settings.insertdatetime_formats || [ - "%H:%M:%S", - "%Y-%m-%d", - "%I:%M:%S %p", - "%D" - ], function (fmt) { - if (!defaultButtonTimeFormat) { - defaultButtonTimeFormat = fmt; + var lastFormat = lastFormatState.get(); + Actions.insertDateTime(editor, lastFormat ? lastFormat : Settings.getDefaultDateTime(editor)); } - - menuItems.push({ - text: getDateTime(fmt), - onclick: function () { - lastFormat = fmt; - insertDateTime(fmt); - } - }); }); - 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); }); - return function () { }; - } -); -dem('tinymce.plugins.insertdatetime.Plugin')(); + function Plugin () { + } + + return Plugin; + +}()); })(); diff --git a/wp-content/plugins/tinymce-advanced/mce/insertdatetime/plugin.min.js b/wp-content/plugins/tinymce-advanced/mce/insertdatetime/plugin.min.js index 3f42c2b3..b200240b 100644 --- a/wp-content/plugins/tinymce-advanced/mce/insertdatetime/plugin.min.js +++ b/wp-content/plugins/tinymce-advanced/mce/insertdatetime/plugin.min.js @@ -1 +1 @@ -!function(){var a={},b=function(b){for(var c=a[b],e=c.deps,f=c.defn,g=e.length,h=new Array(g),i=0;i'+d+"";var f=a.dom.getParent(a.selection.getStart(),"time");if(f)return void a.dom.setOuterHTML(f,d)}a.insertContent(d)}var e,f,g="Sun Mon Tue Wed Thu Fri Sat Sun".split(" "),h="Sunday Monday Tuesday Wednesday Thursday Friday Saturday Sunday".split(" "),i="Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec".split(" "),j="January February March April May June July August September October November December".split(" "),k=[];a.addCommand("mceInsertDate",function(){d(a.getParam("insertdatetime_dateformat",a.translate("%Y-%m-%d")))}),a.addCommand("mceInsertTime",function(){d(a.getParam("insertdatetime_timeformat",a.translate("%H:%M:%S")))}),a.addButton("insertdatetime",{type:"splitbutton",title:"Insert date/time",onclick:function(){d(e||f)},menu:k}),b.each(a.settings.insertdatetime_formats||["%H:%M:%S","%Y-%m-%d","%I:%M:%S %p","%D"],function(a){f||(f=a),k.push({text:c(a),onclick:function(){e=a,d(a)}})}),a.addMenuItem("insertdatetime",{icon:"date",text:"Date/time",menu:k,context:"insert"})}),function(){}}),d("0")()}(); \ No newline at end of file +!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)})}(); \ No newline at end of file diff --git a/wp-content/plugins/tinymce-advanced/mce/link/plugin.js b/wp-content/plugins/tinymce-advanced/mce/link/plugin.js index a2f1aa1c..47d61c2b 100644 --- a/wp-content/plugins/tinymce-advanced/mce/link/plugin.js +++ b/wp-content/plugins/tinymce-advanced/mce/link/plugin.js @@ -1,252 +1,54 @@ (function () { +var link = (function (domGlobals) { + 'use strict'; -var defs = {}; // id -> {dependencies, definition, instance (possibly undefined)} + var global = tinymce.util.Tools.resolve('tinymce.PluginManager'); -// Used when there is no 'main' module. -// The name is probably (hopefully) unique so minification removes for releases. -var register_3795 = function (id) { - var module = dem(id); - var fragments = id.split('.'); - var target = Function('return this;')(); - for (var i = 0; i < fragments.length - 1; ++i) { - if (target[fragments[i]] === undefined) - target[fragments[i]] = {}; - target = target[fragments[i]]; - } - target[fragments[fragments.length - 1]] = module; -}; + var global$1 = tinymce.util.Tools.resolve('tinymce.util.VK'); -var instantiate = function (id) { - var actual = defs[id]; - var dependencies = actual.deps; - var definition = actual.defn; - var len = dependencies.length; - var instances = new Array(len); - for (var i = 0; i < len; ++i) - instances[i] = dem(dependencies[i]); - var defResult = definition.apply(null, instances); - if (defResult === undefined) - throw 'module [' + id + '] returned undefined'; - actual.instance = defResult; -}; - -var def = function (id, dependencies, definition) { - if (typeof id !== 'string') - throw 'module id must be a string'; - else if (dependencies === undefined) - throw 'no dependencies for ' + id; - else if (definition === undefined) - throw 'no definition function for ' + id; - defs[id] = { - deps: dependencies, - defn: definition, - instance: undefined - }; -}; - -var dem = function (id) { - var actual = defs[id]; - if (actual === undefined) - throw 'module [' + id + '] was undefined'; - else if (actual.instance === undefined) - instantiate(id); - return actual.instance; -}; - -var req = function (ids, callback) { - var len = ids.length; - var instances = new Array(len); - for (var i = 0; i < len; ++i) - instances.push(dem(ids[i])); - callback.apply(null, callback); -}; - -var ephox = {}; - -ephox.bolt = { - module: { - api: { - define: def, - require: req, - demand: dem - } - } -}; - -var define = def; -var require = req; -var demand = dem; -// this helps with minificiation when using a lot of global references -var defineGlobal = function (id, ref) { - define(id, [], function () { return ref; }); -}; -/*jsc -["tinymce.plugins.link.Plugin","tinymce.core.PluginManager","tinymce.plugins.link.core.Actions","tinymce.plugins.link.ui.Controls","global!tinymce.util.Tools.resolve","tinymce.core.util.VK","tinymce.plugins.link.ui.Dialog","tinymce.plugins.link.core.OpenUrl","tinymce.plugins.link.core.Utils","tinymce.plugins.link.core.Settings","tinymce.core.util.Delay","tinymce.core.util.Tools","tinymce.core.util.XHR","global!RegExp","tinymce.core.dom.DOMUtils","tinymce.core.Env"] -jsc*/ -defineGlobal("global!tinymce.util.Tools.resolve", tinymce.util.Tools.resolve); -/** - * ResolveGlobal.js - * - * Released under LGPL License. - * Copyright (c) 1999-2017 Ephox Corp. All rights reserved - * - * License: http://www.tinymce.com/license - * Contributing: http://www.tinymce.com/contributing - */ - -define( - 'tinymce.core.PluginManager', - [ - 'global!tinymce.util.Tools.resolve' - ], - function (resolve) { - return resolve('tinymce.PluginManager'); - } -); - -/** - * ResolveGlobal.js - * - * Released under LGPL License. - * Copyright (c) 1999-2017 Ephox Corp. All rights reserved - * - * License: http://www.tinymce.com/license - * Contributing: http://www.tinymce.com/contributing - */ - -define( - 'tinymce.core.util.VK', - [ - 'global!tinymce.util.Tools.resolve' - ], - function (resolve) { - return resolve('tinymce.util.VK'); - } -); - -/** - * ResolveGlobal.js - * - * Released under LGPL License. - * Copyright (c) 1999-2017 Ephox Corp. All rights reserved - * - * License: http://www.tinymce.com/license - * Contributing: http://www.tinymce.com/contributing - */ - -define( - 'tinymce.core.util.Delay', - [ - 'global!tinymce.util.Tools.resolve' - ], - function (resolve) { - return resolve('tinymce.util.Delay'); - } -); - -/** - * ResolveGlobal.js - * - * Released under LGPL License. - * Copyright (c) 1999-2017 Ephox Corp. All rights reserved - * - * License: http://www.tinymce.com/license - * Contributing: http://www.tinymce.com/contributing - */ - -define( - 'tinymce.core.util.Tools', - [ - 'global!tinymce.util.Tools.resolve' - ], - function (resolve) { - return resolve('tinymce.util.Tools'); - } -); - -/** - * ResolveGlobal.js - * - * Released under LGPL License. - * Copyright (c) 1999-2017 Ephox Corp. All rights reserved - * - * License: http://www.tinymce.com/license - * Contributing: http://www.tinymce.com/contributing - */ - -define( - 'tinymce.core.util.XHR', - [ - 'global!tinymce.util.Tools.resolve' - ], - function (resolve) { - return resolve('tinymce.util.XHR'); - } -); - -define( - 'tinymce.plugins.link.core.Settings', - [ - - ], - function () { 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; }; - - return { + var Settings = { assumeExternalTargets: assumeExternalTargets, hasContextToolbar: hasContextToolbar, getLinkList: getLinkList, @@ -262,135 +64,117 @@ define( shouldShowLinkTitle: shouldShowLinkTitle, allowUnsafeLinkTarget: allowUnsafeLinkTarget }; - } -); -defineGlobal("global!RegExp", RegExp); -/** - * Utils.js - * - * Released under LGPL License. - * Copyright (c) 1999-2017 Ephox Corp. All rights reserved - * - * License: http://www.tinymce.com/license - * Contributing: http://www.tinymce.com/contributing - */ + var global$2 = tinymce.util.Tools.resolve('tinymce.dom.DOMUtils'); -define( - 'tinymce.plugins.link.core.Utils', - [ - 'tinymce.core.util.Tools', - 'tinymce.plugins.link.core.Settings', - 'global!RegExp' - ], - function (Tools, Settings, RegExp) { + 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 Tools.trim(rel.sort().join(' ')); + 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 Tools.inArray(rules, val) === -1; + 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.getStart(); + selectedElm = selectedElm || editor.selection.getNode(); if (isImageFigure(selectedElm)) { - // for an image conained in a figure we look for a link inside the selected element 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' }); + 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 Tools.grep(elements, isLink).length > 0; + return global$4.grep(elements, isLink).length > 0; }; - - var isOnlyTextSelected = function (html) { - // Partial html and not a fully selected anchor element - if (/]+>[^<]+<\/a>$/.test(html) || html.indexOf('href=') == -1)) { + 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, + 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'); + 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) { + 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 { @@ -405,8 +189,6 @@ define( }); }; }; - - var unlink = function (editor) { return function () { editor.undoManager.transact(function () { @@ -419,8 +201,6 @@ define( }); }; }; - - var unlinkImageFigure = function (editor, fig) { var a, img; img = editor.dom.select('img', fig)[0]; @@ -432,8 +212,6 @@ define( } } }; - - var linkImageFigure = function (editor, fig, attrs) { var a, img; img = editor.dom.select('img', fig)[0]; @@ -443,8 +221,7 @@ define( a.appendChild(img); } }; - - return { + var Utils = { link: link, unlink: unlink, isLink: isLink, @@ -454,41 +231,22 @@ define( getAnchorText: getAnchorText, toggleTargetRules: toggleTargetRules }; - } -); -/** - * Dialog.js - * - * Released under LGPL License. - * Copyright (c) 1999-2017 Ephox Corp. All rights reserved - * - * License: http://www.tinymce.com/license - * Contributing: http://www.tinymce.com/contributing - */ -define( - 'tinymce.plugins.link.ui.Dialog', - [ - 'tinymce.core.util.Delay', - 'tinymce.core.util.Tools', - 'tinymce.core.util.XHR', - 'tinymce.plugins.link.core.Utils', - 'tinymce.plugins.link.core.Settings' - ], - function (Delay, Tools, XHR, Utils, Settings) { + 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") { - XHR.send({ + if (typeof linkList === 'string') { + global$6.send({ url: linkList, success: function (text) { callback(editor, JSON.parse(text)); } }); - } else if (typeof linkList == "function") { + } else if (typeof linkList === 'function') { linkList(function (list) { callback(editor, list); }); @@ -496,77 +254,64 @@ define( callback(editor, linkList); } }; - var buildListItems = function (inputList, itemCallback, startItems) { var appendItems = function (values, output) { output = output || []; - - Tools.each(values, function (item) { + 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 || []); }; - - // Delay confirm since onSubmit will move focus var delayedConfirm = function (editor, message, callback) { var rng = editor.selection.getRng(); - - Delay.setEditorTimeout(editor, function () { + global$5.setEditorTimeout(editor, function () { editor.windowManager.confirm(message, function (state) { editor.selection.setRng(rng); callback(state); }); }); }; - var showDialog = function (editor, linkList) { - var data = {}, selection = editor.selection, dom = editor.dom, anchorElm, initialText; + 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())) { + 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 = []; - - Tools.each(editor.dom.select('a:not([href])'), function (anchor) { + 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 + selected: url.indexOf('#' + id) !== -1 }); } }); - if (anchorList.length) { - anchorList.unshift({ text: 'None', value: '' }); - + anchorList.unshift({ + text: 'None', + value: '' + }); return { name: 'anchor', type: 'listbox', @@ -576,23 +321,18 @@ define( }; } }; - 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')); } - - Tools.each(e.meta, function (value, key) { + global$4.each(e.meta, function (value, key) { var inp = win.find('#' + key); - if (key === 'text') { if (initialText.length === 0) { inp.value(value); @@ -602,47 +342,37 @@ define( 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'))) { + if (value = dom.getAttrib(anchorElm, 'rel')) { data.rel = value; } - - if ((value = dom.getAttrib(anchorElm, 'class'))) { - data['class'] = value; + if (value = dom.getAttrib(anchorElm, 'class')) { + data.class = value; } - - if ((value = dom.getAttrib(anchorElm, 'title'))) { + if (value = dom.getAttrib(anchorElm, 'title')) { data.title = value; } - if (onlyText) { textListCtrl = { name: 'text', @@ -654,35 +384,36 @@ define( } }; } - 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: '' }] - ), + 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 () { - /*eslint consistent-this:0*/ linkListCtrl = this; } }; } - if (Settings.shouldShowTargetList(editor.settings)) { if (Settings.getTargetList(editor.settings) === undefined) { Settings.setTargetList(editor, [ - { text: 'None', value: '' }, - { text: 'New window', value: '_blank' } + { + text: 'None', + value: '' + }, + { + text: 'New window', + value: '_blank' + } ]); } - targetListCtrl = { name: 'target', type: 'listbox', @@ -690,41 +421,35 @@ define( 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'); - } + 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] }); - }; - } + 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', @@ -733,7 +458,6 @@ define( value: data.title }; } - win = editor.windowManager.open({ title: 'Insert link', data: data, @@ -747,6 +471,7 @@ define( label: 'Url', onchange: urlChange, onkeyup: updateText, + onpaste: updateText, onbeforecall: onBeforeCall }, textListCtrl, @@ -761,203 +486,59 @@ define( var assumeExternalTargets = Settings.assumeExternalTargets(editor.settings); var insertLink = Utils.link(editor, attachState); var removeLink = Utils.unlink(editor); - - var resultData = Tools.extend({}, data, e.data); - /*eslint dot-notation: 0*/ + var resultData = global$4.extend({}, data, e.data); var href = resultData.href; - if (!href) { removeLink(); return; } - if (!onlyText || resultData.text === initialText) { delete resultData.text; } - - // Is email and not //user@domain.com - 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); + 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; } - - // Is not protocol prefixed - 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); + 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 = function (editor) { + var open$1 = function (editor) { createLinkList(editor, showDialog); }; + var Dialog = { open: open$1 }; - return { - open: open - }; - } -); -/** - * ResolveGlobal.js - * - * Released under LGPL License. - * Copyright (c) 1999-2017 Ephox Corp. All rights reserved - * - * License: http://www.tinymce.com/license - * Contributing: http://www.tinymce.com/contributing - */ - -define( - 'tinymce.core.dom.DOMUtils', - [ - 'global!tinymce.util.Tools.resolve' - ], - function (resolve) { - return resolve('tinymce.dom.DOMUtils'); - } -); - -/** - * ResolveGlobal.js - * - * Released under LGPL License. - * Copyright (c) 1999-2017 Ephox Corp. All rights reserved - * - * License: http://www.tinymce.com/license - * Contributing: http://www.tinymce.com/contributing - */ - -define( - 'tinymce.core.Env', - [ - 'global!tinymce.util.Tools.resolve' - ], - function (resolve) { - return resolve('tinymce.Env'); - } -); - -/** - * OpenUrl.js - * - * Released under LGPL License. - * Copyright (c) 1999-2017 Ephox Corp. All rights reserved - * - * License: http://www.tinymce.com/license - * Contributing: http://www.tinymce.com/contributing - */ - -define( - 'tinymce.plugins.link.core.OpenUrl', - [ - 'tinymce.core.dom.DOMUtils', - 'tinymce.core.Env' - ], - function (DOMUtils, Env) { - var appendClickRemove = function (link, evt) { - document.body.appendChild(link); - link.dispatchEvent(evt); - document.body.removeChild(link); - }; - - var open = function (url) { - // Chrome and Webkit has implemented noopener and works correctly with/without popup blocker - // Firefox has it implemented noopener but when the popup blocker is activated it doesn't work - // Edge has only implemented noreferrer and it seems to remove opener as well - // Older IE versions pre IE 11 falls back to a window.open approach - if (!Env.ie || Env.ie > 10) { - var link = document.createElement('a'); - link.target = '_blank'; - link.href = url; - link.rel = 'noreferrer noopener'; - - var evt = document.createEvent('MouseEvents'); - evt.initMouseEvent('click', true, true, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null); - - appendClickRemove(link, evt); - } else { - var win = window.open('', '_blank'); - if (win) { - win.opener = null; - var doc = win.document; - doc.open(); - doc.write(''); - doc.close(); - } - } - }; - - return { - open: open - }; - } -); -/** - * Actions.js - * - * Released under LGPL License. - * Copyright (c) 1999-2017 Ephox Corp. All rights reserved - * - * License: http://www.tinymce.com/license - * Contributing: http://www.tinymce.com/contributing - */ - -define( - 'tinymce.plugins.link.core.Actions', - [ - 'tinymce.core.util.VK', - 'tinymce.plugins.link.ui.Dialog', - 'tinymce.plugins.link.core.OpenUrl', - 'tinymce.plugins.link.core.Utils', - 'tinymce.plugins.link.core.Settings' - ], - function (VK, Dialog, OpenUrl, Utils, Settings) { 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) { - // Returns the real href value not the resolved a.href value 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); @@ -971,19 +552,16 @@ define( } } }; - 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; @@ -991,24 +569,21 @@ define( sel = editor.selection; rng = sel.getRng(); node = rng.startContainer; - // ignore cursor positions at the beginning/end (to make context toolbar less noisy) - if (node.nodeType == 3 && sel.isCollapsed() && rng.startOffset > 0 && rng.startOffset < node.data.length) { + 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 && VK.metaKeyPressed(e)) { + 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)) { @@ -1017,7 +592,6 @@ define( } }); }; - var toggleActiveState = function (editor) { return function () { var self = this; @@ -1026,11 +600,9 @@ define( }); }; }; - var toggleViewLinkState = function (editor) { return function () { var self = this; - var toggleVisibility = function (e) { if (Utils.hasLinks(e.parents)) { self.show(); @@ -1038,20 +610,16 @@ define( 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); }); }; }; - - return { + var Actions = { openDialog: openDialog, gotoSelectedLink: gotoSelectedLink, leftClickedOnAHref: leftClickedOnAHref, @@ -1059,42 +627,32 @@ define( toggleActiveState: toggleActiveState, toggleViewLinkState: toggleViewLinkState }; - } -); -/** - * Controls.js - * - * Released under LGPL License. - * Copyright (c) 1999-2017 Ephox Corp. All rights reserved - * - * License: http://www.tinymce.com/license - * Contributing: http://www.tinymce.com/contributing - */ -define( - 'tinymce.plugins.link.ui.Controls', - [ - 'tinymce.plugins.link.core.Actions', - 'tinymce.plugins.link.core.Utils' - ], - function (Actions, Utils) { + 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', - shortcut: 'Meta+K', 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', @@ -1103,7 +661,6 @@ define( }); } }; - var setupMenuItems = function (editor) { editor.addMenuItem('openlink', { text: 'Open link', @@ -1112,7 +669,6 @@ define( onPostRender: Actions.toggleViewLinkState(editor), prependToContext: true }); - editor.addMenuItem('link', { icon: 'link', text: 'Link', @@ -1122,53 +678,36 @@ define( 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' - ); + editor.addContextToolbar(Actions.leftClickedOnAHref(editor), 'openlink | link unlink'); } }; - - return { + var Controls = { setupButtons: setupButtons, setupMenuItems: setupMenuItems, setupContextToolbars: setupContextToolbars }; - } -); -/** - * Plugin.js - * - * Released under LGPL License. - * Copyright (c) 1999-2017 Ephox Corp. All rights reserved - * - * License: http://www.tinymce.com/license - * Contributing: http://www.tinymce.com/contributing - */ -define( - 'tinymce.plugins.link.Plugin', - [ - 'tinymce.core.PluginManager', - 'tinymce.plugins.link.core.Actions', - 'tinymce.plugins.link.ui.Controls' - ], - function (PluginManager, Actions, Controls) { - PluginManager.add('link', function (editor) { + global.add('link', function (editor) { Controls.setupButtons(editor); Controls.setupMenuItems(editor); Controls.setupContextToolbars(editor); Actions.setupGotoLinks(editor); - editor.addShortcut('Meta+K', '', Actions.openDialog(editor)); - editor.addCommand('mceLink', Actions.openDialog(editor)); + Commands.register(editor); + Keyboard.setup(editor); }); + function Plugin () { + } - return function () { }; - } -); -dem('tinymce.plugins.link.Plugin')(); + return Plugin; + +}(window)); })(); diff --git a/wp-content/plugins/tinymce-advanced/mce/link/plugin.min.js b/wp-content/plugins/tinymce-advanced/mce/link/plugin.min.js index dcd9d436..e07a9120 100644 --- a/wp-content/plugins/tinymce-advanced/mce/link/plugin.min.js +++ b/wp-content/plugins/tinymce-advanced/mce/link/plugin.min.js @@ -1 +1 @@ -!function(){var a={},b=function(b){for(var c=a[b],e=c.deps,f=c.defn,g=e.length,h=new Array(g),i=0;i0},j=function(a){return!(/]+>[^<]+<\/a>$/.test(a)||a.indexOf("href=")==-1))},k=function(a){return a&&"FIGURE"===a.nodeName&&/\bimage\b/i.test(a.className)},l=function(a,c){return function(e){a.undoManager.transact(function(){var g=a.selection.getNode(),h=f(a,g),i={href:e.href,target:e.target?e.target:null,rel:e.rel?e.rel:null,"class":e["class"]?e["class"]:null,title:e.title?e.title:null};b.hasRelList(a.settings)||b.allowUnsafeLinkTarget(a.settings)!==!1||(i.rel=d(i.rel,"_blank"==i.target)),e.href===c.href&&(c.attach(),c={}),h?(a.focus(),e.hasOwnProperty("text")&&("innerText"in h?h.innerText=e.text:h.textContent=e.text),a.dom.setAttribs(h,i),a.selection.select(h),a.undoManager.add()):k(g)?o(a,g,i):e.hasOwnProperty("text")?a.insertContent(a.dom.createHTML("a",i,a.dom.encode(e.text))):a.execCommand("mceInsertLink",!1,i)})}},m=function(a){return function(){a.undoManager.transact(function(){var b=a.selection.getNode();k(b)?n(a,b):a.execCommand("unlink")})}},n=function(a,b){var c,d;d=a.dom.select("img",b)[0],d&&(c=a.dom.getParents(d,"a[href]",b)[0],c&&(c.parentNode.insertBefore(d,c),a.dom.remove(c)))},o=function(a,b,c){var d,e;e=a.dom.select("img",b)[0],e&&(d=a.dom.create("a",c),e.parentNode.insertBefore(d,e),d.appendChild(e))};return{link:l,unlink:m,isLink:h,hasLinks:i,isOnlyTextSelected:j,getAnchorElement:f,getAnchorText:g,toggleTargetRules:d}}),g("6",["a","b","c","8","9"],function(a,b,c,d,e){var f={},g=function(a,b){var d=e.getLinkList(a.settings);"string"==typeof d?c.send({url:d,success:function(c){b(a,JSON.parse(c))}}):"function"==typeof d?d(function(c){b(a,c)}):b(a,d)},h=function(a,c,d){var e=function(a,d){return d=d||[],b.each(a,function(a){var b={text:a.text||a.title};a.menu?b.menu=e(a.menu):(b.value=a.value,c&&c(b)),d.push(b)}),d};return e(a,d||[])},i=function(b,c,d){var e=b.selection.getRng();a.setEditorTimeout(b,function(){b.windowManager.confirm(c,function(a){b.selection.setRng(e),d(a)})})},j=function(a,c){var g,j,k,l,m,n,o,p,q,r,s,t={},u=a.selection,v=a.dom,w=function(a){var b=k.find("#text");(!b.value()||a.lastControl&&b.value()==a.lastControl.text())&&b.value(a.control.text()),k.find("#href").value(a.control.value())},x=function(c){var d=[];if(b.each(a.dom.select("a:not([href])"),function(a){var b=a.name||a.id;b&&d.push({text:b,value:"#"+b,selected:c.indexOf("#"+b)!=-1})}),d.length)return d.unshift({text:"None",value:""}),{name:"anchor",type:"listbox",label:"Anchors",values:d,onselect:w}},y=function(){j||!l||t.text||this.parent().parent().find("#text")[0].value(this.value())},z=function(c){var d=c.meta||{};n&&n.value(a.convertURL(this.value(),"href")),b.each(c.meta,function(a,b){var c=k.find("#"+b);"text"===b?0===j.length&&(c.value(a),t.text=a):c.value(a)}),d.attach&&(f={href:this.value(),attach:d.attach}),d.text||y.call(this)},A=function(a){a.meta=k.toJSON()};l=d.isOnlyTextSelected(u.getContent()),g=d.getAnchorElement(a),t.text=j=d.getAnchorText(a.selection,g),t.href=g?v.getAttrib(g,"href"):"",g?t.target=v.getAttrib(g,"target"):e.hasDefaultLinkTarget(a.settings)&&(t.target=e.getDefaultLinkTarget(a.settings)),(s=v.getAttrib(g,"rel"))&&(t.rel=s),(s=v.getAttrib(g,"class"))&&(t["class"]=s),(s=v.getAttrib(g,"title"))&&(t.title=s),l&&(m={name:"text",type:"textbox",size:40,label:"Text to display",onchange:function(){t.text=this.value()}}),c&&(n={type:"listbox",label:"Link list",values:h(c,function(b){b.value=a.convertURL(b.value||b.url,"href")},[{text:"None",value:""}]),onselect:w,value:a.convertURL(t.href,"href"),onPostRender:function(){n=this}}),e.shouldShowTargetList(a.settings)&&(void 0===e.getTargetList(a.settings)&&e.setTargetList(a,[{text:"None",value:""},{text:"New window",value:"_blank"}]),p={name:"target",type:"listbox",label:"Target",values:h(e.getTargetList(a.settings))}),e.hasRelList(a.settings)&&(o={name:"rel",type:"listbox",label:"Rel",values:h(e.getRelList(a.settings),function(b){e.allowUnsafeLinkTarget(a.settings)===!1&&(b.value=d.toggleTargetRules(b.value,"_blank"===t.target))})}),e.hasLinkClassList(a.settings)&&(q={name:"class",type:"listbox",label:"Class",values:h(e.getLinkClassList(a.settings),function(b){b.value&&(b.textStyle=function(){return a.formatter.getCssText({inline:"a",classes:[b.value]})})})}),e.shouldShowLinkTitle(a.settings)&&(r={name:"title",type:"textbox",label:"Title",value:t.title}),k=a.windowManager.open({title:"Insert link",data:t,body:[{name:"href",type:"filepicker",filetype:"file",size:40,autofocus:!0,label:"Url",onchange:z,onkeyup:y,onbeforecall:A},m,r,x(t.href),n,o,p,q],onSubmit:function(c){var g=e.assumeExternalTargets(a.settings),h=d.link(a,f),k=d.unlink(a),m=b.extend({},t,c.data),n=m.href;return n?(l&&m.text!==j||delete m.text,n.indexOf("@")>0&&n.indexOf("//")==-1&&n.indexOf("mailto:")==-1?void i(a,"The URL you entered seems to be an email address. Do you want to add the required mailto: prefix?",function(a){a&&(m.href="mailto:"+n),h(m)}):g===!0&&!/^\w+:/i.test(n)||g===!1&&/^\s*www[\.|\d\.]/i.test(n)?void i(a,"The URL you entered seems to be an external link. Do you want to add the required http:// prefix?",function(a){a&&(m.href="http://"+n),h(m)}):void h(m)):void k()}})},k=function(a){g(a,j)};return{open:k}}),g("e",["4"],function(a){return a("tinymce.dom.DOMUtils")}),g("f",["4"],function(a){return a("tinymce.Env")}),g("7",["e","f"],function(a,b){var c=function(a,b){document.body.appendChild(a),a.dispatchEvent(b),document.body.removeChild(a)},d=function(d){if(!b.ie||b.ie>10){var e=document.createElement("a");e.target="_blank",e.href=d,e.rel="noreferrer noopener";var f=document.createEvent("MouseEvents");f.initMouseEvent("click",!0,!0,window,0,0,0,0,0,!1,!1,!1,!1,0,null),c(e,f)}else{var g=window.open("","_blank");if(g){g.opener=null;var h=g.document;h.open(),h.write(''),h.close()}}};return{open:d}}),g("2",["5","6","7","8","9"],function(a,b,c,d,e){var f=function(a,b){return a.dom.getParent(b,"a[href]")},g=function(a){return f(a,a.selection.getStart())},h=function(a){var b=a.getAttribute("data-mce-href");return b?b:a.getAttribute("href")},i=function(a){var b=a.plugins.contextmenu;return!!b&&b.isContextMenuVisible()},j=function(a){return a.altKey===!0&&a.shiftKey===!1&&a.ctrlKey===!1&&a.metaKey===!1},k=function(a,b){if(b){var d=h(b);if(/^#/.test(d)){var e=a.$(d);e.length&&a.selection.scrollIntoView(e[0],!0)}else c.open(b.href)}},l=function(a){return function(){b.open(a)}},m=function(a){return function(){k(a,g(a))}},n=function(a){return function(b){var c,f,g;return!!(e.hasContextToolbar(a.settings)&&!i(a)&&d.isLink(b)&&(c=a.selection,f=c.getRng(),g=f.startContainer,3==g.nodeType&&c.isCollapsed()&&f.startOffset>0&&f.startOffset'),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 {dependencies, definition, instance (possibly undefined)} + var global = tinymce.util.Tools.resolve('tinymce.PluginManager'); -// Used when there is no 'main' module. -// The name is probably (hopefully) unique so minification removes for releases. -var register_3795 = function (id) { - var module = dem(id); - var fragments = id.split('.'); - var target = Function('return this;')(); - for (var i = 0; i < fragments.length - 1; ++i) { - if (target[fragments[i]] === undefined) - target[fragments[i]] = {}; - target = target[fragments[i]]; - } - target[fragments[fragments.length - 1]] = module; -}; - -var instantiate = function (id) { - var actual = defs[id]; - var dependencies = actual.deps; - var definition = actual.defn; - var len = dependencies.length; - var instances = new Array(len); - for (var i = 0; i < len; ++i) - instances[i] = dem(dependencies[i]); - var defResult = definition.apply(null, instances); - if (defResult === undefined) - throw 'module [' + id + '] returned undefined'; - actual.instance = defResult; -}; - -var def = function (id, dependencies, definition) { - if (typeof id !== 'string') - throw 'module id must be a string'; - else if (dependencies === undefined) - throw 'no dependencies for ' + id; - else if (definition === undefined) - throw 'no definition function for ' + id; - defs[id] = { - deps: dependencies, - defn: definition, - instance: undefined - }; -}; - -var dem = function (id) { - var actual = defs[id]; - if (actual === undefined) - throw 'module [' + id + '] was undefined'; - else if (actual.instance === undefined) - instantiate(id); - return actual.instance; -}; - -var req = function (ids, callback) { - var len = ids.length; - var instances = new Array(len); - for (var i = 0; i < len; ++i) - instances.push(dem(ids[i])); - callback.apply(null, callback); -}; - -var ephox = {}; - -ephox.bolt = { - module: { - api: { - define: def, - require: req, - demand: dem - } - } -}; - -var define = def; -var require = req; -var demand = dem; -// this helps with minificiation when using a lot of global references -var defineGlobal = function (id, ref) { - define(id, [], function () { return ref; }); -}; -/*jsc -["tinymce.plugins.nonbreaking.Plugin","tinymce.core.PluginManager","global!tinymce.util.Tools.resolve"] -jsc*/ -defineGlobal("global!tinymce.util.Tools.resolve", tinymce.util.Tools.resolve); -/** - * ResolveGlobal.js - * - * Released under LGPL License. - * Copyright (c) 1999-2017 Ephox Corp. All rights reserved - * - * License: http://www.tinymce.com/license - * Contributing: http://www.tinymce.com/contributing - */ - -define( - 'tinymce.core.PluginManager', - [ - 'global!tinymce.util.Tools.resolve' - ], - function (resolve) { - return resolve('tinymce.PluginManager'); - } -); - -/** - * Plugin.js - * - * Released under LGPL License. - * Copyright (c) 1999-2017 Ephox Corp. All rights reserved - * - * License: http://www.tinymce.com/license - * Contributing: http://www.tinymce.com/contributing - */ - -/** - * This class contains all core logic for the nonbreaking plugin. - * - * @class tinymce.nonbreaking.Plugin - * @private - */ -define( - 'tinymce.plugins.nonbreaking.Plugin', - [ - 'tinymce.core.PluginManager' - ], - function (PluginManager) { - PluginManager.add('nonbreaking', function (editor) { - var setting = editor.getParam('nonbreaking_force_tab'); - var stringRepeat = function (string, repeats) { - var str = ''; - for (var index = 0; index < repeats; index++) { - str += string; - } - return str; - }; - - var insertNbsp = function (times) { - var nbsp = (editor.plugins.visualchars && editor.plugins.visualchars.state) ? ' ' : ' '; - - editor.insertContent(stringRepeat(nbsp, times)); - editor.dom.setAttrib(editor.dom.select('span.mce-nbsp'), 'data-mce-bogus', '1'); - }; + var stringRepeat = function (string, repeats) { + var str = ''; + for (var index = 0; index < repeats; index++) { + str += string; + } + return str; + }; + var isVisualCharsEnabled = function (editor) { + return editor.plugins.visualchars ? editor.plugins.visualchars.isEnabled() : false; + }; + var insertNbsp = function (editor, times) { + var nbsp = isVisualCharsEnabled(editor) ? ' ' : ' '; + 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 () { - insertNbsp(1); + 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 }; - if (setting) { - var spaces = +setting > 1 ? +setting : 3; // defaults to 3 spaces if setting is true (or 1) - - editor.on('keydown', function (e) { - if (e.keyCode == 9) { - - if (e.shiftKey) { - return; - } - - e.preventDefault(); - insertNbsp(spaces); - } - }); - } + global.add('nonbreaking', function (editor) { + Commands.register(editor); + Buttons.register(editor); + Keyboard.setup(editor); }); + function Plugin () { + } - return function () { }; - } -); -dem('tinymce.plugins.nonbreaking.Plugin')(); + return Plugin; + +}()); })(); diff --git a/wp-content/plugins/tinymce-advanced/mce/nonbreaking/plugin.min.js b/wp-content/plugins/tinymce-advanced/mce/nonbreaking/plugin.min.js index 6cc9d6e8..084d9b2b 100644 --- a/wp-content/plugins/tinymce-advanced/mce/nonbreaking/plugin.min.js +++ b/wp-content/plugins/tinymce-advanced/mce/nonbreaking/plugin.min.js @@ -1 +1 @@ -!function(){var a={},b=function(b){for(var c=a[b],e=c.deps,f=c.defn,g=e.length,h=new Array(g),i=0;i ':" ";a.insertContent(c(d,b)),a.dom.setAttrib(a.dom.select("span.mce-nbsp"),"data-mce-bogus","1")};if(a.addCommand("mceNonBreaking",function(){d(1)}),a.addButton("nonbreaking",{title:"Nonbreaking space",cmd:"mceNonBreaking"}),a.addMenuItem("nonbreaking",{text:"Nonbreaking space",cmd:"mceNonBreaking",context:"insert"}),b){var e=+b>1?+b:3;a.on("keydown",function(a){if(9==a.keyCode){if(a.shiftKey)return;a.preventDefault(),d(e)}})}}),function(){}}),d("0")()}(); \ No newline at end of file +!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 {dependencies, definition, instance (possibly undefined)} + var global = tinymce.util.Tools.resolve('tinymce.PluginManager'); -// Used when there is no 'main' module. -// The name is probably (hopefully) unique so minification removes for releases. -var register_3795 = function (id) { - var module = dem(id); - var fragments = id.split('.'); - var target = Function('return this;')(); - for (var i = 0; i < fragments.length - 1; ++i) { - if (target[fragments[i]] === undefined) - target[fragments[i]] = {}; - target = target[fragments[i]]; - } - target[fragments[fragments.length - 1]] = module; -}; + var global$1 = tinymce.util.Tools.resolve('tinymce.Env'); -var instantiate = function (id) { - var actual = defs[id]; - var dependencies = actual.deps; - var definition = actual.defn; - var len = dependencies.length; - var instances = new Array(len); - for (var i = 0; i < len; ++i) - instances[i] = dem(dependencies[i]); - var defResult = definition.apply(null, instances); - if (defResult === undefined) - throw 'module [' + id + '] returned undefined'; - actual.instance = defResult; -}; - -var def = function (id, dependencies, definition) { - if (typeof id !== 'string') - throw 'module id must be a string'; - else if (dependencies === undefined) - throw 'no dependencies for ' + id; - else if (definition === undefined) - throw 'no definition function for ' + id; - defs[id] = { - deps: dependencies, - defn: definition, - instance: undefined - }; -}; - -var dem = function (id) { - var actual = defs[id]; - if (actual === undefined) - throw 'module [' + id + '] was undefined'; - else if (actual.instance === undefined) - instantiate(id); - return actual.instance; -}; - -var req = function (ids, callback) { - var len = ids.length; - var instances = new Array(len); - for (var i = 0; i < len; ++i) - instances.push(dem(ids[i])); - callback.apply(null, callback); -}; - -var ephox = {}; - -ephox.bolt = { - module: { - api: { - define: def, - require: req, - demand: dem - } - } -}; - -var define = def; -var require = req; -var demand = dem; -// this helps with minificiation when using a lot of global references -var defineGlobal = function (id, ref) { - define(id, [], function () { return ref; }); -}; -/*jsc -["tinymce.plugins.print.Plugin","tinymce.core.PluginManager","global!tinymce.util.Tools.resolve"] -jsc*/ -defineGlobal("global!tinymce.util.Tools.resolve", tinymce.util.Tools.resolve); -/** - * ResolveGlobal.js - * - * Released under LGPL License. - * Copyright (c) 1999-2017 Ephox Corp. All rights reserved - * - * License: http://www.tinymce.com/license - * Contributing: http://www.tinymce.com/contributing - */ - -define( - 'tinymce.core.PluginManager', - [ - 'global!tinymce.util.Tools.resolve' - ], - function (resolve) { - return resolve('tinymce.PluginManager'); - } -); - -/** - * Plugin.js - * - * Released under LGPL License. - * Copyright (c) 1999-2017 Ephox Corp. All rights reserved - * - * License: http://www.tinymce.com/license - * Contributing: http://www.tinymce.com/contributing - */ - -/** - * This class contains all core logic for the print plugin. - * - * @class tinymce.print.Plugin - * @private - */ -define( - 'tinymce.plugins.print.Plugin', - [ - 'tinymce.core.PluginManager' - ], - function (PluginManager) { - PluginManager.add('print', function (editor) { + var register = function (editor) { editor.addCommand('mcePrint', function () { - editor.getWin().print(); + if (global$1.ie && global$1.ie <= 11) { + editor.getDoc().execCommand('print', false, null); + } else { + editor.getWin().print(); + } }); + }; + var Commands = { register: register }; + var register$1 = function (editor) { editor.addButton('print', { title: 'Print', cmd: 'mcePrint' }); - - editor.addShortcut('Meta+P', '', 'mcePrint'); - editor.addMenuItem('print', { text: 'Print', cmd: 'mcePrint', - icon: 'print', - shortcut: 'Meta+P', - context: 'file' + icon: 'print' }); - }); + }; + var Buttons = { register: register$1 }; - return function () { }; - } -); -dem('tinymce.plugins.print.Plugin')(); + global.add('print', function (editor) { + Commands.register(editor); + Buttons.register(editor); + editor.addShortcut('Meta+P', '', 'mcePrint'); + }); + function Plugin () { + } + + return Plugin; + +}()); })(); diff --git a/wp-content/plugins/tinymce-advanced/mce/print/plugin.min.js b/wp-content/plugins/tinymce-advanced/mce/print/plugin.min.js index eccf5ad2..90d7c483 100644 --- a/wp-content/plugins/tinymce-advanced/mce/print/plugin.min.js +++ b/wp-content/plugins/tinymce-advanced/mce/print/plugin.min.js @@ -1 +1 @@ -!function(){var a={},b=function(b){for(var c=a[b],e=c.deps,f=c.defn,g=e.length,h=new Array(g),i=0;i {dependencies, definition, instance (possibly undefined)} + 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 + }; + }; -// Used when there is no 'main' module. -// The name is probably (hopefully) unique so minification removes for releases. -var register_3795 = function (id) { - var module = dem(id); - var fragments = id.split('.'); - var target = Function('return this;')(); - for (var i = 0; i < fragments.length - 1; ++i) { - if (target[fragments[i]] === undefined) - target[fragments[i]] = {}; - target = target[fragments[i]]; - } - target[fragments[fragments.length - 1]] = module; -}; + var global = tinymce.util.Tools.resolve('tinymce.PluginManager'); -var instantiate = function (id) { - var actual = defs[id]; - var dependencies = actual.deps; - var definition = actual.defn; - var len = dependencies.length; - var instances = new Array(len); - for (var i = 0; i < len; ++i) - instances[i] = dem(dependencies[i]); - var defResult = definition.apply(null, instances); - if (defResult === undefined) - throw 'module [' + id + '] returned undefined'; - actual.instance = defResult; -}; + var global$1 = tinymce.util.Tools.resolve('tinymce.util.Tools'); -var def = function (id, dependencies, definition) { - if (typeof id !== 'string') - throw 'module id must be a string'; - else if (dependencies === undefined) - throw 'no dependencies for ' + id; - else if (definition === undefined) - throw 'no definition function for ' + id; - defs[id] = { - deps: dependencies, - defn: definition, - instance: undefined - }; -}; - -var dem = function (id) { - var actual = defs[id]; - if (actual === undefined) - throw 'module [' + id + '] was undefined'; - else if (actual.instance === undefined) - instantiate(id); - return actual.instance; -}; - -var req = function (ids, callback) { - var len = ids.length; - var instances = new Array(len); - for (var i = 0; i < len; ++i) - instances.push(dem(ids[i])); - callback.apply(null, callback); -}; - -var ephox = {}; - -ephox.bolt = { - module: { - api: { - define: def, - require: req, - demand: dem - } - } -}; - -var define = def; -var require = req; -var demand = dem; -// this helps with minificiation when using a lot of global references -var defineGlobal = function (id, ref) { - define(id, [], function () { return ref; }); -}; -/*jsc -["tinymce.plugins.searchreplace.Plugin","tinymce.core.PluginManager","tinymce.core.util.Tools","tinymce.plugins.searchreplace.core.FindReplaceText","global!tinymce.util.Tools.resolve"] -jsc*/ -defineGlobal("global!tinymce.util.Tools.resolve", tinymce.util.Tools.resolve); -/** - * ResolveGlobal.js - * - * Released under LGPL License. - * Copyright (c) 1999-2017 Ephox Corp. All rights reserved - * - * License: http://www.tinymce.com/license - * Contributing: http://www.tinymce.com/contributing - */ - -define( - 'tinymce.core.PluginManager', - [ - 'global!tinymce.util.Tools.resolve' - ], - function (resolve) { - return resolve('tinymce.PluginManager'); - } -); - -/** - * ResolveGlobal.js - * - * Released under LGPL License. - * Copyright (c) 1999-2017 Ephox Corp. All rights reserved - * - * License: http://www.tinymce.com/license - * Contributing: http://www.tinymce.com/contributing - */ - -define( - 'tinymce.core.util.Tools', - [ - 'global!tinymce.util.Tools.resolve' - ], - function (resolve) { - return resolve('tinymce.util.Tools'); - } -); - -/** - * FindReplaceText.js - * - * Released under LGPL License. - * Copyright (c) 1999-2017 Ephox Corp. All rights reserved - * - * License: http://www.tinymce.com/license - * Contributing: http://www.tinymce.com/contributing - */ - -/*jshint smarttabs:true, undef:true, unused:true, latedef:true, curly:true, bitwise:true */ -/*eslint no-labels:0, no-constant-condition: 0 */ - -define( - 'tinymce.plugins.searchreplace.core.FindReplaceText', - [ - ], - function () { function isContentEditableFalse(node) { - return node && node.nodeType == 1 && node.contentEditable === "false"; + return node && node.nodeType === 1 && node.contentEditable === 'false'; } - - // Based on work developed by: James Padolsey http://james.padolsey.com - // released under UNLICENSE that is compatible with LGPL - // TODO: Handle contentEditable edgecase: - //

texttexttexttexttext

function findAndReplaceDOMText(regex, node, replacementNode, captureGroup, schema) { - var m, matches = [], text, count = 0, doc; + var m; + var matches = []; + var text, count = 0, doc; var blockElementsMap, hiddenTextElementsMap, shortEndedElementsMap; - doc = node.ownerDocument; - blockElementsMap = schema.getBlockElements(); // H1-H6, P, TD etc - hiddenTextElementsMap = schema.getWhiteSpaceElements(); // TEXTAREA, PRE, STYLE, SCRIPT - shortEndedElementsMap = schema.getShortEndedElements(); // BR, IMG, INPUT - + blockElementsMap = schema.getBlockElements(); + hiddenTextElementsMap = schema.getWhiteSpaceElements(); + shortEndedElementsMap = schema.getShortEndedElements(); function getMatchIndexes(m, captureGroup) { captureGroup = captureGroup || 0; - if (!m[0]) { - throw 'findAndReplaceDOMText cannot handle zero-length matches'; + throw new Error('findAndReplaceDOMText cannot handle zero-length matches'); } - var index = m.index; - if (captureGroup > 0) { var cg = m[captureGroup]; - if (!cg) { - throw 'Invalid capture group'; + throw new Error('Invalid capture group'); } - index += m[0].indexOf(cg); m[0] = cg; } - - return [index, index + m[0].length, [m[0]]]; + 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)) { + if (node = node.firstChild) { do { txt += getText(node); - } while ((node = node.nextSibling)); + } 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]) { - // We've found the ending - endNode = curNode; - endNodeIndex = matchLocation[1] - atIndex; - } else if (startNode) { - // Intersecting node - innerNodes.push(curNode); + 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 (!startNode && curNode.length + atIndex > matchLocation[0]) { - // We've found the match start - startNode = curNode; - startNodeIndex = matchLocation[0] - 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; } - - atIndex += curNode.length; - } - - if (startNode && endNode) { - curNode = replaceFn({ - startNode: startNode, - startNodeIndex: startNodeIndex, - endNode: endNode, - endNodeIndex: endNodeIndex, - innerNodes: innerNodes, - match: matchLocation[2], - matchIndex: matchIndex - }); - - // replaceFn has to return the node that replaced the endNode - // and then we step back so we can continue from the end of the - // match: - atIndex -= (endNode.length - endNodeIndex); - startNode = null; - endNode = null; - innerNodes = []; - matchLocation = matches.shift(); - matchIndex++; - - if (!matchLocation) { - break; // no more matches - } - } else if ((!hiddenTextElementsMap[curNode.nodeName] || blockElementsMap[curNode.nodeName]) && curNode.firstChild) { - if (!isContentEditableFalse(curNode)) { - // Move down - curNode = curNode.firstChild; + 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; } - } else if (curNode.nextSibling) { - // Move forward: - curNode = curNode.nextSibling; - continue; - } - - // Move forward or up: - while (true) { - if (curNode.nextSibling) { - curNode = curNode.nextSibling; - break; - } else if (curNode.parentNode !== node) { - curNode = curNode.parentNode; - } else { - break out; + while (true) { + if (curNode.nextSibling) { + curNode = curNode.nextSibling; + break; + } else if (curNode.parentNode !== node) { + curNode = curNode.parentNode; + } else { + break out; + } } } - } } - - /** - * Generates the actual replaceFn which splits up text nodes - * and inserts the replacement element. - */ function genReplacer(nodeName) { var makeReplacementNode; - - if (typeof nodeName != 'function') { - var stencilNode = nodeName.nodeType ? nodeName : doc.createElement(nodeName); - + if (typeof nodeName !== 'function') { + var stencilNode_1 = nodeName.nodeType ? nodeName : doc.createElement(nodeName); makeReplacementNode = function (fill, matchIndex) { - var clone = stencilNode.cloneNode(false); - + 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, after, parentNode, startNode = range.startNode, - endNode = range.endNode, matchIndex = range.matchIndex; - + var before; + var after; + var parentNode; + var startNode = range.startNode; + var endNode = range.endNode; + var matchIndex = range.matchIndex; if (startNode === endNode) { - var node = startNode; - - parentNode = node.parentNode; + var node_1 = startNode; + parentNode = node_1.parentNode; if (range.startNodeIndex > 0) { - // Add `before` text node (before the match) - before = doc.createTextNode(node.data.substring(0, range.startNodeIndex)); - parentNode.insertBefore(before, node); + before = doc.createTextNode(node_1.data.substring(0, range.startNodeIndex)); + parentNode.insertBefore(before, node_1); } - - // Create the replacement node: var el = makeReplacementNode(range.match[0], matchIndex); - parentNode.insertBefore(el, node); - if (range.endNodeIndex < node.length) { - // Add `after` text node (after the match) - after = doc.createTextNode(node.data.substring(range.endNodeIndex)); - parentNode.insertBefore(after, node); + 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.parentNode.removeChild(node); - + node_1.parentNode.removeChild(node_1); return el; } - - // Replace startNode -> [innerNodes...] -> endNode (in that order) 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); - var innerEls = []; - 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); - innerEls.push(innerEl); } - 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))) { + 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 }; - return { - findAndReplaceDOMText: findAndReplaceDOMText + var getElmIndex = function (elm) { + var value = elm.getAttribute('data-mce-index'); + if (typeof value === 'number') { + return '' + value; + } + return value; }; - } -); -/** - * Plugin.js - * - * Released under LGPL License. - * Copyright (c) 1999-2017 Ephox Corp. All rights reserved - * - * License: http://www.tinymce.com/license - * Contributing: http://www.tinymce.com/contributing - */ - -/*jshint smarttabs:true, undef:true, unused:true, latedef:true, curly:true, bitwise:true */ -/*eslint no-labels:0, no-constant-condition: 0 */ - -/** - * This class contains all core logic for the searchreplace plugin. - * - * @class tinymce.searchreplace.Plugin - * @private - */ -define( - 'tinymce.plugins.searchreplace.Plugin', - [ - 'tinymce.core.PluginManager', - 'tinymce.core.util.Tools', - 'tinymce.plugins.searchreplace.core.FindReplaceText' - ], - function (PluginManager, Tools, FindReplaceText) { - function Plugin(editor) { - var self = this, currentIndex = -1; - - function showDialog() { - var last = {}, selectedText; - - selectedText = Tools.trim(editor.selection.getContent({ format: 'text' })); - - function updateButtonStates() { - win.statusbar.find('#next').disabled(!findSpansByIndex(currentIndex + 1).length); - win.statusbar.find('#prev').disabled(!findSpansByIndex(currentIndex - 1).length); + 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]); + } } - - function notFoundAlert() { - editor.windowManager.alert('Could not find the specified string.', function () { - win.find('#find')[0].focus(); - }); + } + 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); } - - var win = editor.windowManager.open({ - layout: "flex", - pack: "center", - align: "center", - onClose: function () { - editor.focus(); - self.done(); - }, - 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) { - self.done(false); - win.statusbar.items().slice(1).disabled(true); - return; + } + 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 + }; - if (last.text == text && last.caseState == caseState && last.wholeWord == wholeWord) { - if (findSpansByIndex(currentIndex + 1).length === 0) { - notFoundAlert(); - return; - } + 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 }; - self.next(); - updateButtonStates(); - return; - } - - count = self.find(text, caseState, wholeWord); - if (!count) { + 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; } - - win.statusbar.items().slice(1).disabled(count === 0); + Actions.next(editor, currentIndexState); updateButtonStates(); - - last = { - text: text, - caseState: caseState, - wholeWord: wholeWord - }; + 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(); + } }, - buttons: [ - { - text: "Find", subtype: 'primary', onclick: function () { - win.submit(); - } - }, - { - text: "Replace", disabled: true, onclick: function () { - if (!self.replace(win.find('#replace').value())) { - win.statusbar.items().slice(1).disabled(true); - currentIndex = -1; - last = {}; - } - } - }, - { - text: "Replace all", disabled: true, onclick: function () { - self.replace(win.find('#replace').value(), true, true); + { + 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 = {}; } - }, - { type: "spacer", flex: 1 }, + } + }, + { + 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: [ { - text: "Prev", name: 'prev', disabled: true, onclick: function () { - self.prev(); - updateButtonStates(); - } + type: 'textbox', + name: 'find', + size: 40, + label: 'Find', + value: selectedText }, { - text: "Next", name: 'next', disabled: true, onclick: function () { - self.next(); - updateButtonStates(); - } + 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: ' ' } - ], - 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 }; - self.init = function (ed) { - ed.addMenuItem('searchreplace', { - text: 'Find and replace', - shortcut: 'Meta+F', - onclick: showDialog, - separator: 'before', - context: 'edit' - }); + var register = function (editor, currentIndexState) { + editor.addCommand('SearchReplace', function () { + Dialog.open(editor, currentIndexState); + }); + }; + var Commands = { register: register }; - ed.addButton('searchreplace', { - tooltip: 'Find and replace', - shortcut: 'Meta+F', - onclick: showDialog - }); - - ed.addCommand("SearchReplace", showDialog); - ed.shortcuts.add('Meta+F', '', showDialog); + 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 }; - function getElmIndex(elm) { - var value = elm.getAttribute('data-mce-index'); - - if (typeof value == "number") { - return "" + value; - } - - return value; - } - - function markAllMatches(regex) { - var node, marker; - - marker = editor.dom.create('span', { - "data-mce-bogus": 1 - }); - - marker.className = 'mce-match-marker'; // IE 7 adds class="mce-match-marker" and class=mce-match-marker - node = editor.getBody(); - - self.done(false); - - return FindReplaceText.findAndReplaceDOMText(regex, node, marker, false, editor.schema); - } - - function unwrap(node) { - var parentNode = node.parentNode; - - if (node.firstChild) { - parentNode.insertBefore(node.firstChild, node); - } - - node.parentNode.removeChild(node); - } - - function findSpansByIndex(index) { - var nodes, spans = []; - - nodes = Tools.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; - } - - function moveSelection(forward) { - var testIndex = currentIndex, dom = editor.dom; - - forward = forward !== false; - - if (forward) { - testIndex++; - } else { - testIndex--; - } - - dom.removeClass(findSpansByIndex(currentIndex), 'mce-match-marker-selected'); - - var spans = findSpansByIndex(testIndex); - if (spans.length) { - dom.addClass(findSpansByIndex(testIndex), 'mce-match-marker-selected'); - editor.selection.scrollIntoView(spans[0]); - return testIndex; - } - - return -1; - } - - function removeNode(node) { - var dom = editor.dom, parent = node.parentNode; - - dom.remove(node); - - if (dom.isEmpty(parent)) { - dom.remove(parent); - } - } - - self.find = function (text, matchCase, wholeWord) { - text = text.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&"); - text = text.replace(/\s/g, '\\s'); - text = wholeWord ? '\\b' + text + '\\b' : text; - - var count = markAllMatches(new RegExp(text, matchCase ? 'g' : 'gi')); - - if (count) { - currentIndex = -1; - currentIndex = moveSelection(true); - } - - return count; - }; - - self.next = function () { - var index = moveSelection(true); - - if (index !== -1) { - currentIndex = index; - } - }; - - self.prev = function () { - var index = moveSelection(false); - - if (index !== -1) { - currentIndex = index; - } - }; - - function isMatchSpan(node) { - var matchIndex = getElmIndex(node); - - return matchIndex !== null && matchIndex.length > 0; - } - - self.replace = function (text, forward, all) { - var i, nodes, node, matchIndex, currentMatchIndex, nextIndex = currentIndex, hasMore; - - forward = forward !== false; - - node = editor.getBody(); - nodes = Tools.grep(Tools.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 === currentIndex) { - if (text.length) { - nodes[i].firstChild.nodeValue = text; - unwrap(nodes[i]); - } else { - removeNode(nodes[i]); - } - - while (nodes[++i]) { - matchIndex = parseInt(getElmIndex(nodes[i]), 10); - - if (matchIndex === currentMatchIndex) { - removeNode(nodes[i]); - } else { - i--; - break; - } - } - - if (forward) { - nextIndex--; - } - } else if (currentMatchIndex > currentIndex) { - nodes[i].setAttribute('data-mce-index', currentMatchIndex - 1); - } - } - - editor.undoManager.add(); - currentIndex = nextIndex; - - if (forward) { - hasMore = findSpansByIndex(nextIndex + 1).length > 0; - self.next(); - } else { - hasMore = findSpansByIndex(nextIndex - 1).length > 0; - self.prev(); - } - - return !all && hasMore; - }; - - self.done = function (keepEditorSelection) { - var i, nodes, startContainer, endContainer; - - nodes = Tools.toArray(editor.getBody().getElementsByTagName('span')); - for (i = 0; i < nodes.length; i++) { - var nodeIndex = getElmIndex(nodes[i]); - - if (nodeIndex !== null && nodeIndex.length) { - if (nodeIndex === currentIndex.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; - } - }; + global.add('searchreplace', function (editor) { + var currentIndexState = Cell(-1); + Commands.register(editor, currentIndexState); + Buttons.register(editor, currentIndexState); + return Api.get(editor, currentIndexState); + }); + function Plugin () { } - PluginManager.add('searchreplace', Plugin); + return Plugin; - return function () { }; - } -); -dem('tinymce.plugins.searchreplace.Plugin')(); +}()); })(); diff --git a/wp-content/plugins/tinymce-advanced/mce/searchreplace/plugin.min.js b/wp-content/plugins/tinymce-advanced/mce/searchreplace/plugin.min.js index 544b4ade..f63ed059 100644 --- a/wp-content/plugins/tinymce-advanced/mce/searchreplace/plugin.min.js +++ b/wp-content/plugins/tinymce-advanced/mce/searchreplace/plugin.min.js @@ -1 +1 @@ -!function(){var a={},b=function(b){for(var c=a[b],e=c.deps,f=c.defn,g=e.length,h=new Array(g),i=0;i0){var d=a[b];if(!d)throw"Invalid capture group";c+=a[0].indexOf(d),a[0]=d}return[c,c+a[0].length,[a[0]]]}function h(b){var c;if(3===b.nodeType)return b.data;if(o[b.nodeName]&&!n[b.nodeName])return"";if(c="",a(b))return"\n";if((n[b.nodeName]||p[b.nodeName])&&(c+="\n"),b=b.firstChild)do c+=h(b);while(b=b.nextSibling);return c}function i(b,c,d){var e,f,g,h,i=[],j=0,k=b,l=c.shift(),m=0;a:for(;;){if((n[k.nodeName]||p[k.nodeName]||a(k))&&j++,3===k.nodeType&&(!f&&k.length+j>=l[1]?(f=k,h=l[1]-j):e&&i.push(k),!e&&k.length+j>l[0]&&(e=k,g=l[0]-j),j+=k.length),e&&f){if(k=d({startNode:e,startNodeIndex:g,endNode:f,endNodeIndex:h,innerNodes:i,match:l[2],matchIndex:m}),j-=f.length-h,e=null,f=null,i=[],l=c.shift(),m++,!l)break}else if(o[k.nodeName]&&!n[k.nodeName]||!k.firstChild){if(k.nextSibling){k=k.nextSibling;continue}}else if(!a(k)){k=k.firstChild;continue}for(;;){if(k.nextSibling){k=k.nextSibling;break}if(k.parentNode===b)break a;k=k.parentNode}}}function j(a){var b;if("function"!=typeof a){var c=a.nodeType?a:m.createElement(a);b=function(a,b){var d=c.cloneNode(!1);return d.setAttribute("data-mce-index",b),a&&d.appendChild(m.createTextNode(a)),d}}else b=a;return function(a){var c,d,e,f=a.startNode,g=a.endNode,h=a.matchIndex;if(f===g){var i=f;e=i.parentNode,a.startNodeIndex>0&&(c=m.createTextNode(i.data.substring(0,a.startNodeIndex)),e.insertBefore(c,i));var j=b(a.match[0],h);return e.insertBefore(j,i),a.endNodeIndex0}var l=this,m=-1;l.init=function(a){a.addMenuItem("searchreplace",{text:"Find and replace",shortcut:"Meta+F",onclick:d,separator:"before",context:"edit"}),a.addButton("searchreplace",{tooltip:"Find and replace",shortcut:"Meta+F",onclick:d}),a.addCommand("SearchReplace",d),a.shortcuts.add("Meta+F","",d)},l.find=function(a,b,c){a=a.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g,"\\$&"),a=a.replace(/\s/g,"\\s"),a=c?"\\b"+a+"\\b":a;var d=f(new RegExp(a,b?"g":"gi"));return d&&(m=-1,m=i(!0)),d},l.next=function(){var a=i(!0);a!==-1&&(m=a)},l.prev=function(){var a=i(!1);a!==-1&&(m=a)},l.replace=function(c,d,f){var i,n,o,p,q,r,s=m;for(d=d!==!1,o=a.getBody(),n=b.grep(b.toArray(o.getElementsByTagName("span")),k),i=0;im&&n[i].setAttribute("data-mce-index",q-1)}return a.undoManager.add(),m=s,d?(r=h(s+1).length>0,l.next()):(r=h(s-1).length>0,l.prev()),!f&&r},l.done=function(c){var d,f,h,i;for(f=b.toArray(a.getBody().getElementsByTagName("span")),d=0;d=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)})}(); \ No newline at end of file diff --git a/wp-content/plugins/tinymce-advanced/mce/table/plugin.js b/wp-content/plugins/tinymce-advanced/mce/table/plugin.js index c83befa0..ae544c3b 100644 --- a/wp-content/plugins/tinymce-advanced/mce/table/plugin.js +++ b/wp-content/plugins/tinymce-advanced/mce/table/plugin.js @@ -1,4806 +1,9270 @@ (function () { +var table = (function (domGlobals) { + 'use strict'; -var defs = {}; // id -> {dependencies, definition, instance (possibly undefined)} + var global = tinymce.util.Tools.resolve('tinymce.PluginManager'); -// Used when there is no 'main' module. -// The name is probably (hopefully) unique so minification removes for releases. -var register_3795 = function (id) { - var module = dem(id); - var fragments = id.split('.'); - var target = Function('return this;')(); - for (var i = 0; i < fragments.length - 1; ++i) { - if (target[fragments[i]] === undefined) - target[fragments[i]] = {}; - target = target[fragments[i]]; - } - target[fragments[fragments.length - 1]] = module; -}; - -var instantiate = function (id) { - var actual = defs[id]; - var dependencies = actual.deps; - var definition = actual.defn; - var len = dependencies.length; - var instances = new Array(len); - for (var i = 0; i < len; ++i) - instances[i] = dem(dependencies[i]); - var defResult = definition.apply(null, instances); - if (defResult === undefined) - throw 'module [' + id + '] returned undefined'; - actual.instance = defResult; -}; - -var def = function (id, dependencies, definition) { - if (typeof id !== 'string') - throw 'module id must be a string'; - else if (dependencies === undefined) - throw 'no dependencies for ' + id; - else if (definition === undefined) - throw 'no definition function for ' + id; - defs[id] = { - deps: dependencies, - defn: definition, - instance: undefined - }; -}; - -var dem = function (id) { - var actual = defs[id]; - if (actual === undefined) - throw 'module [' + id + '] was undefined'; - else if (actual.instance === undefined) - instantiate(id); - return actual.instance; -}; - -var req = function (ids, callback) { - var len = ids.length; - var instances = new Array(len); - for (var i = 0; i < len; ++i) - instances.push(dem(ids[i])); - callback.apply(null, callback); -}; - -var ephox = {}; - -ephox.bolt = { - module: { - api: { - define: def, - require: req, - demand: dem - } - } -}; - -var define = def; -var require = req; -var demand = dem; -// this helps with minificiation when using a lot of global references -var defineGlobal = function (id, ref) { - define(id, [], function () { return ref; }); -}; -/*jsc -["tinymce.plugins.table.Plugin","tinymce.core.dom.TreeWalker","tinymce.core.Env","tinymce.core.PluginManager","tinymce.core.util.Tools","tinymce.core.util.VK","tinymce.plugins.table.model.TableGrid","tinymce.plugins.table.selection.CellSelection","tinymce.plugins.table.ui.Dialogs","tinymce.plugins.table.ui.ResizeBars","tinymce.plugins.table.util.Utils","tinymce.plugins.table.util.Quirks","global!tinymce.util.Tools.resolve","tinymce.plugins.table.model.SplitCols","tinymce.core.util.Delay"] -jsc*/ -defineGlobal("global!tinymce.util.Tools.resolve", tinymce.util.Tools.resolve); -/** - * ResolveGlobal.js - * - * Released under LGPL License. - * Copyright (c) 1999-2017 Ephox Corp. All rights reserved - * - * License: http://www.tinymce.com/license - * Contributing: http://www.tinymce.com/contributing - */ - -define( - 'tinymce.core.dom.TreeWalker', - [ - 'global!tinymce.util.Tools.resolve' - ], - function (resolve) { - return resolve('tinymce.dom.TreeWalker'); - } -); - -/** - * ResolveGlobal.js - * - * Released under LGPL License. - * Copyright (c) 1999-2017 Ephox Corp. All rights reserved - * - * License: http://www.tinymce.com/license - * Contributing: http://www.tinymce.com/contributing - */ - -define( - 'tinymce.core.Env', - [ - 'global!tinymce.util.Tools.resolve' - ], - function (resolve) { - return resolve('tinymce.Env'); - } -); - -/** - * ResolveGlobal.js - * - * Released under LGPL License. - * Copyright (c) 1999-2017 Ephox Corp. All rights reserved - * - * License: http://www.tinymce.com/license - * Contributing: http://www.tinymce.com/contributing - */ - -define( - 'tinymce.core.PluginManager', - [ - 'global!tinymce.util.Tools.resolve' - ], - function (resolve) { - return resolve('tinymce.PluginManager'); - } -); - -/** - * ResolveGlobal.js - * - * Released under LGPL License. - * Copyright (c) 1999-2017 Ephox Corp. All rights reserved - * - * License: http://www.tinymce.com/license - * Contributing: http://www.tinymce.com/contributing - */ - -define( - 'tinymce.core.util.Tools', - [ - 'global!tinymce.util.Tools.resolve' - ], - function (resolve) { - return resolve('tinymce.util.Tools'); - } -); - -/** - * ResolveGlobal.js - * - * Released under LGPL License. - * Copyright (c) 1999-2017 Ephox Corp. All rights reserved - * - * License: http://www.tinymce.com/license - * Contributing: http://www.tinymce.com/contributing - */ - -define( - 'tinymce.core.util.VK', - [ - 'global!tinymce.util.Tools.resolve' - ], - function (resolve) { - return resolve('tinymce.util.VK'); - } -); - -/** - * Utils.js - * - * Released under LGPL License. - * Copyright (c) 1999-2017 Ephox Corp. All rights reserved - * - * License: http://www.tinymce.com/license - * Contributing: http://www.tinymce.com/contributing - */ - -/** - * Various utility functions. - * - * @class tinymce.table.util.Utils - * @private - */ -define( - 'tinymce.plugins.table.util.Utils', - [ - 'tinymce.core.Env' - ], - function (Env) { - var setSpanVal = function (name) { - return function (td, val) { - if (td) { - val = parseInt(val, 10); - - if (val === 1 || val === 0) { - td.removeAttribute(name, 1); - } else { - td.setAttribute(name, val, 1); - } + 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 getSpanVal = function (name) { - return function (td) { - return parseInt(td.getAttribute(name) || 1, 10); + var constant = function (value) { + return function () { + return value; }; }; - - function paddCell(cell) { - if (!Env.ie || Env.ie > 9) { - if (!cell.hasChildNodes()) { - cell.innerHTML = '
'; - } + 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); + }; } - - return { - setColSpan: setSpanVal('colSpan'), - setRowSpan: setSpanVal('rowspan'), - getColSpan: getSpanVal('colSpan'), - getRowSpan: getSpanVal('rowSpan'), - setSpanVal: function (td, name, value) { - setSpanVal(name)(td, value); - }, - getSpanVal: function (td, name) { - return getSpanVal(name)(td); - }, - paddCell: paddCell - }; - } -); - -/** - * SplitCols.js - * - * Released under LGPL License. - * Copyright (c) 1999-2016 Ephox Corp. All rights reserved - * - * License: http://www.tinymce.com/license - * Contributing: http://www.tinymce.com/contributing - */ - -/** - * Contains logic for handling splitting of merged rows. - * - * @class tinymce.table.model.SplitCols - * @private - */ -define( - 'tinymce.plugins.table.model.SplitCols', - [ - 'tinymce.core.util.Tools', - 'tinymce.plugins.table.util.Utils' - ], - function (Tools, Utils) { - var getCellAt = function (grid, x, y) { - return grid[y] ? grid[y][x] : null; - }; - - var getCellElmAt = function (grid, x, y) { - var cell = getCellAt(grid, x, y); - return cell ? cell.elm : null; - }; - - var countHoles = function (grid, x, y, delta) { - var y2, cell, count = 0, elm = getCellElmAt(grid, x, y); - - for (y2 = y; delta > 0 ? y2 < grid.length : y2 >= 0; y2 += delta) { - cell = getCellAt(grid, x, y2); - if (elm !== cell.elm) { - break; + 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); - count++; + 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 me = { + fold: function (n, s) { + return n(); + }, + is: never, + isSome: never, + isNone: always, + getOr: id, + getOrThunk: call, + getOrDie: function (msg) { + throw new Error(msg || 'error: getOrDie called on none.'); + }, + getOrNull: constant(null), + getOrUndefined: constant(undefined), + or: id, + orThunk: call, + map: none, + each: noop, + bind: none, + exists: never, + forall: always, + filter: none, + equals: eq, + equals_: eq, + toArray: function () { + return []; + }, + toString: constant('none()') + }; + if (Object.freeze) { + Object.freeze(me); } - - return count; + return me; + }(); + var some = function (a) { + var constant_a = constant(a); + var self = function () { + return me; + }; + var bind = function (f) { + return f(a); + }; + var me = { + fold: function (n, s) { + return s(a); + }, + is: function (v) { + return a === v; + }, + isSome: always, + isNone: never, + getOr: constant_a, + getOrThunk: constant_a, + getOrDie: constant_a, + getOrNull: constant_a, + getOrUndefined: constant_a, + or: self, + orThunk: self, + map: function (f) { + return some(f(a)); + }, + each: function (f) { + f(a); + }, + bind: bind, + exists: bind, + forall: bind, + filter: function (f) { + return f(a) ? me : NONE; + }, + toArray: function () { + return [a]; + }, + toString: function () { + return 'some(' + a + ')'; + }, + equals: function (o) { + return o.is(a); + }, + equals_: function (o, elementEq) { + return o.fold(never, function (b) { + return elementEq(a, b); + }); + } + }; + return me; + }; + var from = function (value) { + return value === null || value === undefined ? NONE : some(value); + }; + var Option = { + some: some, + none: none, + from: from }; - var findRealElm = function (grid, x, y) { - var cell, row = grid[y]; + 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'); - for (var x2 = x; x2 < row.length; x2++) { - cell = row[x2]; - if (cell.real) { - return cell.elm; + var nativeSlice = Array.prototype.slice; + var nativeIndexOf = Array.prototype.indexOf; + var nativePush = Array.prototype.push; + var rawIndexOf = function (ts, t) { + return nativeIndexOf.call(ts, t); + }; + var contains = function (xs, x) { + return rawIndexOf(xs, x) > -1; + }; + var exists = function (xs, pred) { + for (var i = 0, len = xs.length; i < len; i++) { + var x = xs[i]; + if (pred(x, i)) { + return true; } } - - return null; + return false; + }; + 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); + } + return r; + }; + var each = function (xs, f) { + for (var i = 0, len = xs.length; i < len; i++) { + var x = xs[i]; + f(x, i); + } + }; + var eachr = function (xs, f) { + for (var i = xs.length - 1; i >= 0; i--) { + var x = xs[i]; + f(x, i); + } + }; + 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)) { + 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)) { + 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)) { + return Option.some(i); + } + } + return Option.none(); + }; + 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); + } + nativePush.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) !== true) { + return false; + } + } + return true; + }; + var reverse = function (xs) { + var r = nativeSlice.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 nativeSlice.call(x); }; - var getRowSplitInfo = function (grid, y) { - var cell, result = [], row = grid[y]; + 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); + } + }; + var map$1 = function (obj, f) { + return tupleMap(obj, function (x, i) { + return { + k: i, + v: f(x, i) + }; + }); + }; + var tupleMap = function (obj, f) { + var r = {}; + each$1(obj, function (x, i) { + var tuple = f(x, i); + r[tuple.k] = tuple.v; + }); + return r; + }; - for (var x = 0; x < row.length; x++) { - cell = row[x]; - result.push({ - elm: cell.elm, - above: countHoles(grid, x, y, -1) - 1, - below: countHoles(grid, x, y, 1) - 1 + 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; + }; + }; - x += Utils.getColSpan(cell.elm) - 1; + 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 createCell = function (info, rowSpan) { - var doc = info.elm.ownerDocument; - var newCell = doc.createElement('td'); - - Utils.setColSpan(newCell, Utils.getColSpan(info.elm)); - Utils.setRowSpan(newCell, rowSpan); - Utils.paddCell(newCell); - - return newCell; + 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); }; - var insertOrAppendCell = function (grid, newCell, x, y) { - var realCellElm = findRealElm(grid, x + 1, y); + function ClosestOrAncestor (is, ancestor, scope, a, isRoot) { + return is(scope, a) ? Option.some(scope) : isFunction(isRoot) && isRoot(scope) ? Option.none() : ancestor(scope, a, isRoot); + } - if (!realCellElm) { - realCellElm = findRealElm(grid, 0, y); - realCellElm.parentNode.appendChild(newCell); - } else { - realCellElm.parentNode.insertBefore(newCell, realCellElm); + 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 splitAbove = function (grid, info, x, y) { - if (info.above !== 0) { - Utils.setRowSpan(info.elm, info.above); - var cell = createCell(info, info.below + 1); - insertOrAppendCell(grid, cell, x, y); - return cell; + 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; } - - return null; - }; - - var splitBelow = function (grid, info, x, y) { - if (info.below !== 0) { - Utils.setRowSpan(info.elm, info.above + 1); - var cell = createCell(info, info.below); - insertOrAppendCell(grid, cell, x, y + 1); - return cell; + if (isRoot(element)) { + return Option.none(); } - - return null; + 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 splitAt = function (grid, x, y, before) { - var rowInfos = getRowSplitInfo(grid, y); - var rowElm = getCellElmAt(grid, x, y).parentNode; + 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 = []; - - Tools.each(rowInfos, function (info, x) { - var cell = before ? splitAbove(grid, info, x, y) : splitBelow(grid, info, x, y); - if (cell !== null) { - cells.push(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 { - cells: cells, - row: rowElm + grid: constant(grid$1), + access: constant(access), + all: constant(cells) }; }; - - return { - splitAt: splitAt + 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 }; - } -); -/** - * TableGrid.js - * - * Released under LGPL License. - * Copyright (c) 1999-2017 Ephox Corp. All rights reserved - * - * License: http://www.tinymce.com/license - * Contributing: http://www.tinymce.com/contributing - */ - -/** - * This class creates a grid out of a table element. This - * makes it a whole lot easier to handle complex tables with - * col/row spans. - * - * @class tinymce.table.model.TableGrid - * @private - */ -define( - 'tinymce.plugins.table.model.TableGrid', - [ - 'tinymce.core.util.Tools', - 'tinymce.core.Env', - 'tinymce.plugins.table.util.Utils', - 'tinymce.plugins.table.model.SplitCols' - ], - function (Tools, Env, Utils, SplitCols) { - var each = Tools.each, getSpanVal = Utils.getSpanVal, setSpanVal = Utils.setSpanVal; - - return function (editor, table, selectedCell) { - var grid, gridWidth, startPos, endPos, selection = editor.selection, dom = selection.dom; - - function removeCellSelection() { - editor.$('td[data-mce-selected],th[data-mce-selected]').removeAttr('data-mce-selected'); - } - - function isEditorBody(node) { - return node === editor.getBody(); - } - - function getChildrenByName(node, names) { - if (!node) { - return []; - } - - names = Tools.map(names.split(','), function (name) { - return name.toLowerCase(); - }); - - return Tools.grep(node.childNodes, function (node) { - return Tools.inArray(names, node.nodeName.toLowerCase()) !== -1; - }); - } - - function buildGrid() { - var startY = 0; - - grid = []; - gridWidth = 0; - - each(['thead', 'tbody', 'tfoot'], function (part) { - var partElm = getChildrenByName(table, part)[0]; - var rows = getChildrenByName(partElm, 'tr'); - - each(rows, function (tr, y) { - y += startY; - - each(getChildrenByName(tr, 'td,th'), function (td, x) { - var x2, y2, rowspan, colspan; - - // Skip over existing cells produced by rowspan - if (grid[y]) { - while (grid[y][x]) { - x++; - } - } - - // Get col/rowspan from cell - rowspan = getSpanVal(td, 'rowspan'); - colspan = getSpanVal(td, 'colspan'); - - // Fill out rowspan/colspan right and down - for (y2 = y; y2 < y + rowspan; y2++) { - if (!grid[y2]) { - grid[y2] = []; - } - - for (x2 = x; x2 < x + colspan; x2++) { - grid[y2][x2] = { - part: part, - real: y2 == y && x2 == x, - elm: td, - rowspan: rowspan, - colspan: colspan - }; - } - } - - gridWidth = Math.max(gridWidth, x + 1); - }); - }); - - startY += rows.length; - }); - } - - function fireNewRow(node) { - editor.fire('newrow', { - node: node - }); - - return node; - } - - function fireNewCell(node) { - editor.fire('newcell', { - node: node - }); - - return node; - } - - function cloneNode(node, children) { - node = node.cloneNode(children); - node.removeAttribute('id'); - - return node; - } - - function getCell(x, y) { - var row; - - row = grid[y]; - if (row) { - return row[x]; - } - } - - function getRow(grid, y) { - return grid[y] ? grid[y] : null; - } - - function getColumn(grid, x) { - var out = []; - - for (var y = 0; y < grid.length; y++) { - out.push(getCell(x, y)); - } - - return out; - } - - function isCellSelected(cell) { - return cell && (!!dom.getAttrib(cell.elm, 'data-mce-selected') || cell == selectedCell); - } - - function getSelectedRows() { - var rows = []; - - each(table.rows, function (row) { - each(row.cells, function (cell) { - if (dom.getAttrib(cell, 'data-mce-selected') || (selectedCell && cell == selectedCell.elm)) { - rows.push(row); - return false; - } - }); - }); - - return rows; - } - - function countSelectedCols() { - var cols = 0; - - each(grid, function (row) { - each(row, function (cell) { - if (isCellSelected(cell)) { - cols++; - } - }); - if (cols) { - return false; + 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; } - }); - - return cols; - } - - function deleteTable() { - var rng = dom.createRng(); - - if (isEditorBody(table)) { - return; - } - - rng.setStartAfter(table); - rng.setEndAfter(table); - - selection.setRng(rng); - - dom.remove(table); - } - - function cloneCell(cell) { - var formatNode, cloneFormats = {}; - - if (editor.settings.table_clone_elements !== false) { - cloneFormats = Tools.makeMap( - (editor.settings.table_clone_elements || 'strong em b i span font h1 h2 h3 h4 h5 h6 p div').toUpperCase(), - /[ ,]/ - ); - } - - // Clone formats - Tools.walk(cell, function (node) { - var curNode; - - if (node.nodeType == 3) { - each(dom.getParents(node.parentNode, null, cell).reverse(), function (node) { - if (!cloneFormats[node.nodeName]) { - return; - } - - node = cloneNode(node, false); - - if (!formatNode) { - formatNode = curNode = node; - } else if (curNode) { - curNode.appendChild(node); - } - - curNode = node; - }); - - // Add something to the inner node - if (curNode) { - curNode.innerHTML = Env.ie && Env.ie < 10 ? ' ' : '
'; - } - - return false; + if (startCol < minCol) { + minCol = startCol; + } else if (endCol > maxCol) { + maxCol = endCol; } - }, 'childNodes'); + } + }); + 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 }; - cell = cloneNode(cell, false); - fireNewCell(cell); + 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 + }; + } - setSpanVal(cell, 'rowSpan', 1); - setSpanVal(cell, 'colSpan', 1); + 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); + }; - if (formatNode) { - cell.appendChild(formatNode); + 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 { - Utils.paddCell(cell); + set(replica, k, v); } - - return cell; - } - - function cleanup() { - var rng = dom.createRng(), row; - - // Empty rows - each(dom.select('tr', table), function (tr) { - if (tr.cells.length === 0) { - dom.remove(tr); - } + }); + 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); }); - - // Empty table - if (dom.select('tr', table).length === 0) { - rng.setStartBefore(table); - rng.setEndBefore(table); - selection.setRng(rng); - dom.remove(table); - return; + 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 + }; - // Empty header/body/footer - each(dom.select('thead,tbody,tfoot', table), function (part) { - if (part.rows.length === 0) { - dom.remove(part); - } + 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 + }; - // Restore selection to start position if it still exists - buildGrid(); - - // If we have a valid startPos object - if (startPos) { - // Restore the selection to the closest table position - row = grid[Math.min(grid.length - 1, startPos.y)]; - if (row) { - selection.select(row[Math.min(row.length - 1, startPos.x)].elm, true); - selection.collapse(true); - } - } - } - - function fillLeftDown(x, y, rows, cols) { - var tr, x2, r, c, cell; - - tr = grid[y][x].elm.parentNode; - for (r = 1; r <= rows; r++) { - tr = dom.getNext(tr, 'tr'); - - if (tr) { - // Loop left to find real cell - for (x2 = x; x2 >= 0; x2--) { - cell = grid[y + r][x2].elm; - - if (cell.parentNode == tr) { - // Append clones after - for (c = 1; c <= cols; c++) { - dom.insertAfter(cloneCell(cell), cell); - } - - break; - } - } - - if (x2 == -1) { - // Insert nodes before first cell - for (c = 1; c <= cols; c++) { - tr.insertBefore(cloneCell(tr.cells[0]), tr.cells[0]); - } - } - } - } - } - - function split() { - each(grid, function (row, y) { - each(row, function (cell, x) { - var colSpan, rowSpan, i; - - if (isCellSelected(cell)) { - cell = cell.elm; - colSpan = getSpanVal(cell, 'colspan'); - rowSpan = getSpanVal(cell, 'rowspan'); - - if (colSpan > 1 || rowSpan > 1) { - setSpanVal(cell, 'rowSpan', 1); - setSpanVal(cell, 'colSpan', 1); - - // Insert cells right - for (i = 0; i < colSpan - 1; i++) { - dom.insertAfter(cloneCell(cell), cell); - } - - fillLeftDown(x, y, rowSpan - 1, colSpan); - } - } - }); + 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(); }); - } - - function findItemsOutsideOfRange(items, start, end) { - var out = []; - - for (var i = 0; i < items.length; i++) { - if (i < start || i > end) { - out.push(items[i]); - } - } - - return out; - } - - function getFakeCells(cells) { - return Tools.grep(cells, function (cell) { - return cell.real === false; + }); + }; + 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 + }; - function getUniqueElms(cells) { - var elms = []; + 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 + }; - for (var i = 0; i < cells.length; i++) { - var elm = cells[i].elm; - if (elms[elms.length - 1] !== elm) { - elms.push(elm); - } + 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; } - - return elms; - } - - function reduceRowSpans(grid, startX, startY, endX, endY) { - var count = 0; - - if (endY - startY < 1) { - return 0; + if (name(element) === 'body') { + return true; } - - for (var y = startY + 1; y <= endY; y++) { - var allCells = findItemsOutsideOfRange(getRow(grid, y), startX, endX); - var fakeCells = getFakeCells(allCells); - - if (allCells.length === fakeCells.length) { - Tools.each(getUniqueElms(fakeCells), function (elm) { - Utils.setRowSpan(elm, Utils.getRowSpan(elm) - 1); - }); - - count++; - } + 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 + }; + } - return count; - } - - function reduceColSpans(grid, startX, startY, endX, endY) { - var count = 0; - - if (endX - startX < 1) { - return 0; - } - - for (var x = startX + 1; x <= endX; x++) { - var allCells = findItemsOutsideOfRange(getColumn(grid, x), startY, endY); - var fakeCells = getFakeCells(allCells); - - if (allCells.length === fakeCells.length) { - Tools.each(getUniqueElms(fakeCells), function (elm) { - Utils.setColSpan(elm, Utils.getColSpan(elm) - 1); - }); - - count++; - } - } - - return count; - } - - function merge(cell, cols, rows) { - var pos, startX, startY, endX, endY, x, y, startCell, endCell, children, count, reducedRows, reducedCols; - - // Use specified cell and cols/rows - if (cell) { - pos = getPos(cell); - startX = pos.x; - startY = pos.y; - endX = startX + (cols - 1); - endY = startY + (rows - 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 { - startPos = endPos = null; - - // Calculate start/end pos by checking for selected cells in grid works better with context menu - each(grid, function (row, y) { - each(row, function (cell, x) { - if (isCellSelected(cell)) { - if (!startPos) { - startPos = { x: x, y: y }; - } - - endPos = { x: x, y: y }; - } + 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)); }); - }); - - // Use selection, but make sure startPos is valid before accessing - if (startPos) { - startX = startPos.x; - startY = startPos.y; - endX = endPos.x; - endY = endPos.y; - } + }).getOr(fallback); } + }; + return next(item, Option.none(), []); + }; - // Find start/end cells - startCell = getCell(startX, startY); - endCell = getCell(endX, endY); + 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)); + }); + }; - // Check if the cells exists and if they are of the same part for example tbody = tbody - if (startCell && endCell && startCell.part == endCell.part) { - // Split and rebuild grid - split(); - buildGrid(); + 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 + }; - reducedRows = reduceRowSpans(grid, startX, startY, endX, endY); - reducedCols = reduceColSpans(grid, startX, startY, endX, endY); + 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 + }; - // Set row/col span to start cell - startCell = getCell(startX, startY).elm; - var colSpan = (endX - startX - reducedCols) + 1; - var rowSpan = (endY - startY - reducedRows) + 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 + }; - // All cells in table selected then just make it a table with one cell - if (colSpan === gridWidth && rowSpan === grid.length) { - colSpan = 1; - rowSpan = 1; - } + var create = MixedBag([ + 'boxes', + 'start', + 'finish' + ], []); + var Identified = { create: create }; - // Multiple whole rows selected then just make it one rowSpan - if (colSpan === gridWidth && rowSpan > 1) { - rowSpan = 1; - } - - setSpanVal(startCell, 'colSpan', colSpan); - setSpanVal(startCell, 'rowSpan', rowSpan); - - // Remove other cells and add it's contents to the start cell - for (y = startY; y <= endY; y++) { - for (x = startX; x <= endX; x++) { - if (!grid[y] || !grid[y][x]) { - continue; - } - - cell = grid[y][x].elm; - - /*jshint loopfunc:true */ - /*eslint no-loop-func:0 */ - if (cell != startCell) { - // Move children to startCell - children = Tools.grep(cell.childNodes); - each(children, function (node) { - startCell.appendChild(node); + 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 + })); }); - - // Remove bogus nodes if there is children in the target cell - if (children.length) { - children = Tools.grep(startCell.childNodes); - count = 0; - each(children, function (node) { - if (node.nodeName == 'BR' && count++ < children.length - 1) { - startCell.removeChild(node); - } - }); - } - - dom.remove(cell); - } - } - } - - // Remove empty rows etc and restore caret location - cleanup(); - } - } - - function insertRow(before) { - var posY, cell, lastCell, x, rowElm, newRow, newCell, otherCell, rowSpan, spanValue; - - // Find first/last row - each(grid, function (row, y) { - each(row, function (cell) { - if (isCellSelected(cell)) { - cell = cell.elm; - rowElm = cell.parentNode; - newRow = fireNewRow(cloneNode(rowElm, false)); - posY = y; - - if (before) { - return false; - } - } - }); - - if (before) { - return posY === undefined; - } - }); - - // If posY is undefined there is nothing for us to do here...just return to avoid crashing below - if (posY === undefined) { - return; - } - - for (x = 0, spanValue = 0; x < grid[0].length; x += spanValue) { - // Cell not found could be because of an invalid table structure - if (!grid[posY][x]) { - continue; - } - - cell = grid[posY][x].elm; - spanValue = getSpanVal(cell, 'colspan'); - - if (cell != lastCell) { - if (!before) { - rowSpan = getSpanVal(cell, 'rowspan'); - if (rowSpan > 1) { - setSpanVal(cell, 'rowSpan', rowSpan + 1); - continue; - } - } else { - // Check if cell above can be expanded - if (posY > 0 && grid[posY - 1][x]) { - otherCell = grid[posY - 1][x].elm; - rowSpan = getSpanVal(otherCell, 'rowSpan'); - if (rowSpan > 1) { - setSpanVal(otherCell, 'rowSpan', rowSpan + 1); - continue; - } - } - } - - // Insert new cell into new row - newCell = cloneCell(cell); - setSpanVal(newCell, 'colSpan', cell.colSpan); - - newRow.appendChild(newCell); - - lastCell = cell; - } - } - - if (newRow.hasChildNodes()) { - if (!before) { - dom.insertAfter(newRow, rowElm); - } else { - rowElm.parentNode.insertBefore(newRow, rowElm); - } - } - } - - function insertRows(before, num) { - num = num || getSelectedRows().length || 1; - for (var i = 0; i < num; i++) { - insertRow(before); - } - } - - function insertCol(before) { - var posX, lastCell; - - // Find first/last column - each(grid, function (row) { - each(row, function (cell, x) { - if (isCellSelected(cell)) { - posX = x; - - if (before) { - return false; - } - } - }); - - if (before) { - return posX === undefined; - } - }); - - each(grid, function (row, y) { - var cell, rowSpan, colSpan; - - if (!row[posX]) { - return; - } - - cell = row[posX].elm; - if (cell != lastCell) { - colSpan = getSpanVal(cell, 'colspan'); - rowSpan = getSpanVal(cell, 'rowspan'); - - if (colSpan == 1) { - if (!before) { - dom.insertAfter(cloneCell(cell), cell); - fillLeftDown(posX, y, rowSpan - 1, colSpan); - } else { - cell.parentNode.insertBefore(cloneCell(cell), cell); - fillLeftDown(posX, y, rowSpan - 1, colSpan); - } - } else { - setSpanVal(cell, 'colSpan', cell.colSpan + 1); - } - - lastCell = cell; - } - }); - } - - function insertCols(before, num) { - num = num || countSelectedCols() || 1; - for (var i = 0; i < num; i++) { - insertCol(before); - } - } - - function getSelectedCells(grid) { - return Tools.grep(getAllCells(grid), isCellSelected); - } - - function getAllCells(grid) { - var cells = []; - - each(grid, function (row) { - each(row, function (cell) { - cells.push(cell); - }); - }); - - return cells; - } - - function deleteCols() { - var cols = []; - - if (isEditorBody(table)) { - if (grid[0].length == 1) { - return; - } - - if (getSelectedCells(grid).length == getAllCells(grid).length) { - return; - } - } - - // Get selected column indexes - each(grid, function (row) { - each(row, function (cell, x) { - if (isCellSelected(cell) && Tools.inArray(cols, x) === -1) { - each(grid, function (row) { - var cell = row[x].elm, colSpan; - - colSpan = getSpanVal(cell, 'colSpan'); - - if (colSpan > 1) { - setSpanVal(cell, 'colSpan', colSpan - 1); - } else { - dom.remove(cell); - } - }); - - cols.push(x); - } - }); - }); - - cleanup(); - } - - function deleteRows() { - var rows; - - function deleteRow(tr) { - var pos, lastCell; - - // Move down row spanned cells - each(tr.cells, function (cell) { - var rowSpan = getSpanVal(cell, 'rowSpan'); - - if (rowSpan > 1) { - setSpanVal(cell, 'rowSpan', rowSpan - 1); - pos = getPos(cell); - fillLeftDown(pos.x, pos.y, 1, 1); - } - }); - - // Delete cells - pos = getPos(tr.cells[0]); - each(grid[pos.y], function (cell) { - var rowSpan; - - cell = cell.elm; - - if (cell != lastCell) { - rowSpan = getSpanVal(cell, 'rowSpan'); - - if (rowSpan <= 1) { - dom.remove(cell); - } else { - setSpanVal(cell, 'rowSpan', rowSpan - 1); - } - - lastCell = cell; - } - }); - } - - // Get selected rows and move selection out of scope - rows = getSelectedRows(); - - if (isEditorBody(table) && rows.length == table.rows.length) { - return; - } - - // Delete all selected rows - each(rows.reverse(), function (tr) { - deleteRow(tr); - }); - - cleanup(); - } - - function cutRows() { - var rows = getSelectedRows(); - - if (isEditorBody(table) && rows.length == table.rows.length) { - return; - } - - dom.remove(rows); - cleanup(); - - return rows; - } - - function copyRows() { - var rows = getSelectedRows(); - - each(rows, function (row, i) { - rows[i] = cloneNode(row, true); - }); - - return rows; - } - - function pasteRows(rows, before) { - var splitResult, targetRow, newRows; - - // indices of the rows where rowspans expire (a way to handle multiple rowspans in the same row) - var rowSpansDueAt = []; - - // Nothing to paste - if (!rows) { - return; - } - - splitResult = SplitCols.splitAt(grid, startPos.x, startPos.y, before); - targetRow = splitResult.row; - Tools.each(splitResult.cells, fireNewCell); - - newRows = Tools.map(rows, function (row) { - return row.cloneNode(true); - }); - - each(newRows, function (row, y, rows) { - var x, cellCount = row.cells.length, cell, colCount = 0, rowSpan, colSpan; - - fireNewRow(row); - - for (x = 0; x < cellCount; x++) { - cell = row.cells[x]; - - colSpan = getSpanVal(cell, 'colspan'); - rowSpan = getSpanVal(cell, 'rowspan'); - - colCount += colSpan; - - if (rowSpan > 1) { - colCount--; // decrement for every activated rowspan (count will be adjusted below) - - if (y + rowSpan > rows.length) { - // adjust rowspan to the number of available rows - rowSpan = rows.length - y; - setSpanVal(cell, 'rowSpan', rowSpan); - rowSpansDueAt.push(rows.length - 1); - } else { - rowSpansDueAt.push(y + rowSpan - 1); - } - } - - fireNewCell(cell); - } - - // take into account currently active rowspans - each(rowSpansDueAt, function (dueY) { - if (y <= dueY) { - colCount++; - } - }); - - // Needs more cells - for (x = colCount; x < gridWidth; x++) { - row.appendChild(cloneCell(row.cells[cellCount - 1])); - } - - // Needs less cells - for (x = gridWidth; x < colCount; x++) { - cell = row.cells[row.cells.length - 1]; - colSpan = getSpanVal(cell, 'colspan'); - if (colSpan > 1) { - setSpanVal(cell, 'colSpan', colSpan - 1); - } else { - dom.remove(cell); - } - } - - // Add before/after - if (before) { - targetRow.parentNode.insertBefore(row, targetRow); - } else { - targetRow = dom.insertAfter(row, targetRow); - } - }); - - removeCellSelection(); - } - - function getPos(target) { - var pos; - - each(grid, function (row, y) { - each(row, function (cell, x) { - if (cell.elm == target) { - pos = { x: x, y: y }; - return false; - } - }); - - return !pos; - }); - - return pos; - } - - function setStartCell(cell) { - startPos = getPos(cell); - } - - function findEndPos() { - var maxX, maxY; - - maxX = maxY = 0; - - each(grid, function (row, y) { - each(row, function (cell, x) { - var colSpan, rowSpan; - - if (isCellSelected(cell)) { - cell = grid[y][x]; - - if (x > maxX) { - maxX = x; - } - - if (y > maxY) { - maxY = y; - } - - if (cell.real) { - colSpan = cell.colspan - 1; - rowSpan = cell.rowspan - 1; - - if (colSpan) { - if (x + colSpan > maxX) { - maxX = x + colSpan; - } - } - - if (rowSpan) { - if (y + rowSpan > maxY) { - maxY = y + rowSpan; - } - } - } - } - }); - }); - - return { x: maxX, y: maxY }; - } - - function setEndCell(cell) { - var startX, startY, endX, endY, maxX, maxY, colSpan, rowSpan, x, y; - - endPos = getPos(cell); - - if (startPos && endPos) { - // Get start/end positions - startX = Math.min(startPos.x, endPos.x); - startY = Math.min(startPos.y, endPos.y); - endX = Math.max(startPos.x, endPos.x); - endY = Math.max(startPos.y, endPos.y); - - // Expand end position to include spans - maxX = endX; - maxY = endY; - - // This logic tried to expand the selection to always be a rectangle - // Expand startX - /*for (y = startY; y <= maxY; y++) { - cell = grid[y][startX]; - - if (!cell.real) { - newX = startX - (cell.colspan - 1); - if (newX < startX && newX >= 0) { - startX = newX; - } - } - } - - // Expand startY - for (x = startX; x <= maxX; x++) { - cell = grid[startY][x]; - - if (!cell.real) { - newY = startY - (cell.rowspan - 1); - if (newY < startY && newY >= 0) { - startY = newY; - } - } - }*/ - - // Find max X, Y - for (y = startY; y <= endY; y++) { - for (x = startX; x <= endX; x++) { - cell = grid[y][x]; - - if (cell.real) { - colSpan = cell.colspan - 1; - rowSpan = cell.rowspan - 1; - - if (colSpan) { - if (x + colSpan > maxX) { - maxX = x + colSpan; - } - } - - if (rowSpan) { - if (y + rowSpan > maxY) { - maxY = y + rowSpan; - } - } - } - } - } - - removeCellSelection(); - - // Add new selection - for (y = startY; y <= maxY; y++) { - for (x = startX; x <= maxX; x++) { - if (grid[y][x]) { - dom.setAttrib(grid[y][x].elm, 'data-mce-selected', '1'); - } - } - } - } - } - - function moveRelIdx(cellElm, delta) { - var pos, index, cell; - - pos = getPos(cellElm); - index = pos.y * gridWidth + pos.x; - - do { - index += delta; - cell = getCell(index % gridWidth, Math.floor(index / gridWidth)); - - if (!cell) { - break; - } - - if (cell.elm != cellElm) { - selection.select(cell.elm, true); - - if (dom.isEmpty(cell.elm)) { - selection.collapse(true); - } - - return true; - } - } while (cell.elm == cellElm); - - return false; - } - - function splitCols(before) { - if (startPos) { - var splitResult = SplitCols.splitAt(grid, startPos.x, startPos.y, before); - Tools.each(splitResult.cells, fireNewCell); - } - } - - table = table || dom.getParent(selection.getStart(true), 'table'); - - buildGrid(); - - selectedCell = selectedCell || dom.getParent(selection.getStart(true), 'th,td'); - - if (selectedCell) { - startPos = getPos(selectedCell); - endPos = findEndPos(); - selectedCell = getCell(startPos.x, startPos.y); - } - - Tools.extend(this, { - deleteTable: deleteTable, - split: split, - merge: merge, - insertRow: insertRow, - insertRows: insertRows, - insertCol: insertCol, - insertCols: insertCols, - splitCols: splitCols, - deleteCols: deleteCols, - deleteRows: deleteRows, - cutRows: cutRows, - copyRows: copyRows, - pasteRows: pasteRows, - getPos: getPos, - setStartCell: setStartCell, - setEndCell: setEndCell, - moveRelIdx: moveRelIdx, - refresh: buildGrid - }); - }; - } -); - -/** - * CellSelection.js - * - * Released under LGPL License. - * Copyright (c) 1999-2017 Ephox Corp. All rights reserved - * - * License: http://www.tinymce.com/license - * Contributing: http://www.tinymce.com/contributing - */ - -/** - * This class handles table cell selection by faking it using a css class that gets applied - * to cells when dragging the mouse from one cell to another. - * - * @class tinymce.table.selection.CellSelection - * @private - */ -define( - 'tinymce.plugins.table.selection.CellSelection', - [ - 'tinymce.plugins.table.model.TableGrid', - 'tinymce.core.dom.TreeWalker', - 'tinymce.core.util.Tools' - ], - function (TableGrid, TreeWalker, Tools) { - return function (editor, selectionChange) { - var dom = editor.dom, tableGrid, startCell, startTable, lastMouseOverTarget, hasCellSelection = true, resizing, dragging; - - function clear(force) { - // Restore selection possibilities - editor.getBody().style.webkitUserSelect = ''; - - if (force || hasCellSelection) { - editor.$('td[data-mce-selected],th[data-mce-selected]').removeAttr('data-mce-selected'); - hasCellSelection = false; - } - } - - var endSelection = function () { - startCell = tableGrid = startTable = lastMouseOverTarget = null; - selectionChange(false); - }; - - function isCellInTable(table, cell) { - if (!table || !cell) { - return false; - } - - return table === dom.getParent(cell, 'table'); - } - - function cellSelectionHandler(e) { - var sel, target = e.target, currentCell; - - if (resizing || dragging) { - return; - } - - // Fake mouse enter by keeping track of last mouse over - if (target === lastMouseOverTarget) { - return; - } - - lastMouseOverTarget = target; - - if (startTable && startCell) { - currentCell = dom.getParent(target, 'td,th'); - - if (!isCellInTable(startTable, currentCell)) { - currentCell = dom.getParent(startTable, 'td,th'); - } - - // Selection inside first cell is normal until we have expanted - if (startCell === currentCell && !hasCellSelection) { - return; - } - - selectionChange(true); - - if (isCellInTable(startTable, currentCell)) { - e.preventDefault(); - - if (!tableGrid) { - tableGrid = new TableGrid(editor, startTable, startCell); - editor.getBody().style.webkitUserSelect = 'none'; - } - - tableGrid.setEndCell(currentCell); - hasCellSelection = true; - - // Remove current selection - sel = editor.selection.getSel(); - - try { - if (sel.removeAllRanges) { - sel.removeAllRanges(); - } else { - sel.empty(); - } - } catch (ex) { - // IE9 might throw errors here - } - } - } - } - - editor.on('SelectionChange', function (e) { - if (hasCellSelection) { - e.stopImmediatePropagation(); - } - }, true); - - // Add cell selection logic - editor.on('MouseDown', function (e) { - if (e.button != 2 && !resizing && !dragging) { - clear(); - - startCell = dom.getParent(e.target, 'td,th'); - startTable = dom.getParent(startCell, 'table'); - } - }); - - editor.on('mouseover', cellSelectionHandler); - - editor.on('remove', function () { - dom.unbind(editor.getDoc(), 'mouseover', cellSelectionHandler); - clear(); - }); - - editor.on('MouseUp', function () { - var rng, sel = editor.selection, selectedCells, walker, node, lastNode; - - function setPoint(node, start) { - var walker = new TreeWalker(node, node); - - do { - // Text node - if (node.nodeType == 3 && Tools.trim(node.nodeValue).length !== 0) { - if (start) { - rng.setStart(node, 0); - } else { - rng.setEnd(node, node.nodeValue.length); - } - - return; - } - - // BR element - if (node.nodeName == 'BR') { - if (start) { - rng.setStartBefore(node); - } else { - rng.setEndBefore(node); - } - - return; - } - } while ((node = (start ? walker.next() : walker.prev()))); - } - - // Move selection to startCell - if (startCell) { - if (tableGrid) { - editor.getBody().style.webkitUserSelect = ''; - } - - // Try to expand text selection as much as we can only Gecko supports cell selection - selectedCells = dom.select('td[data-mce-selected],th[data-mce-selected]'); - if (selectedCells.length > 0) { - rng = dom.createRng(); - node = selectedCells[0]; - rng.setStartBefore(node); - rng.setEndAfter(node); - - setPoint(node, 1); - walker = new TreeWalker(node, dom.getParent(selectedCells[0], 'table')); - - do { - if (node.nodeName == 'TD' || node.nodeName == 'TH') { - if (!dom.getAttrib(node, 'data-mce-selected')) { - break; - } - - lastNode = node; - } - } while ((node = walker.next())); - - setPoint(lastNode); - - sel.setRng(rng); - } - - editor.nodeChanged(); - endSelection(); - } - }); - - editor.on('KeyUp Drop SetContent', function (e) { - clear(e.type == 'setcontent'); - endSelection(); - resizing = false; - }); - - editor.on('ObjectResizeStart ObjectResized', function (e) { - resizing = e.type != 'objectresized'; - }); - - editor.on('dragstart', function () { - dragging = true; - }); - - editor.on('drop dragend', function () { - dragging = false; - }); - - return { - clear: clear - }; - }; - } -); - -/** - * Dialogs.js - * - * Released under LGPL License. - * Copyright (c) 1999-2017 Ephox Corp. All rights reserved - * - * License: http://www.tinymce.com/license - * Contributing: http://www.tinymce.com/contributing - */ - -/*eslint dot-notation:0*/ - -/** - * ... - * - * @class tinymce.table.ui.Dialogs - * @private - */ -define( - 'tinymce.plugins.table.ui.Dialogs', - [ - 'tinymce.core.util.Tools', - 'tinymce.core.Env' - ], - function (Tools, Env) { - var each = Tools.each; - - return function (editor) { - var self = this; - - function createColorPickAction() { - var colorPickerCallback = editor.settings.color_picker_callback; - - if (colorPickerCallback) { - return function () { - var self = this; - - colorPickerCallback.call( - editor, - function (value) { - self.value(value).fire('change'); - }, - self.value() - ); - }; - } - } - - function createStyleForm(dom) { - return { - title: 'Advanced', - type: 'form', - defaults: { - onchange: function () { - updateStyle(dom, this.parents().reverse()[0], this.name() == "style"); - } - }, - items: [ - { - label: 'Style', - name: 'style', - type: 'textbox' - }, - - { - type: 'form', - padding: 0, - formItemDefaults: { - layout: 'grid', - alignH: ['start', 'right'] - }, - defaults: { - size: 7 - }, - items: [ - { - label: 'Border color', - type: 'colorbox', - name: 'borderColor', - onaction: createColorPickAction() - }, - - { - label: 'Background color', - type: 'colorbox', - name: 'backgroundColor', - onaction: createColorPickAction() - } - ] - } - ] - }; - } - - function removePxSuffix(size) { - return size ? size.replace(/px$/, '') : ""; - } - - function addSizeSuffix(size) { - if (/^[0-9]+$/.test(size)) { - size += "px"; - } - - return size; - } - - function unApplyAlign(elm) { - each('left center right'.split(' '), function (name) { - editor.formatter.remove('align' + name, {}, elm); - }); - } - - function unApplyVAlign(elm) { - each('top middle bottom'.split(' '), function (name) { - editor.formatter.remove('valign' + name, {}, elm); - }); - } - - function buildListItems(inputList, itemCallback, startItems) { - function appendItems(values, output) { - output = output || []; - - Tools.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 updateStyle(dom, win, isStyleCtrl) { - var data = win.toJSON(); - var css = dom.parseStyle(data.style); - - if (isStyleCtrl) { - win.find('#borderColor').value(css["border-color"] || '')[0].fire('change'); - win.find('#backgroundColor').value(css["background-color"] || '')[0].fire('change'); - } else { - css["border-color"] = data.borderColor; - css["background-color"] = data.backgroundColor; - } - - win.find('#style').value(dom.serializeStyle(dom.parseStyle(dom.serializeStyle(css)))); - } - - function appendStylesToData(dom, data, elm) { - var css = dom.parseStyle(dom.getAttrib(elm, 'style')); - - if (css["border-color"]) { - data.borderColor = css["border-color"]; - } - - if (css["background-color"]) { - data.backgroundColor = css["background-color"]; - } - - data.style = dom.serializeStyle(css); - } - - function mergeStyles(dom, elm, styles) { - var css = dom.parseStyle(dom.getAttrib(elm, 'style')); - - each(styles, function (style) { - css[style.name] = style.value; - }); - - dom.setAttrib(elm, 'style', dom.serializeStyle(dom.parseStyle(dom.serializeStyle(css)))); - } - - self.tableProps = function () { - self.table(true); - }; - - self.table = function (isProps) { - var dom = editor.dom, tableElm, colsCtrl, rowsCtrl, classListCtrl, data = {}, generalTableForm, stylesToMerge; - - function onSubmitTableForm() { - - //Explore the layers of the table till we find the first layer of tds or ths - function styleTDTH(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(elm.children[i], name, value); - } - } - } - } - - var captionElm; - - updateStyle(dom, this); - data = Tools.extend(data, this.toJSON()); - - if (data["class"] === false) { - delete data["class"]; - } - - editor.undoManager.transact(function () { - if (!tableElm) { - tableElm = editor.plugins.table.insertTable(data.cols || 1, data.rows || 1); - } - - editor.dom.setAttribs(tableElm, { - style: data.style, - 'class': data['class'] - }); - - if (editor.settings.table_style_by_css) { - stylesToMerge = []; - stylesToMerge.push({ name: 'border', value: data.border }); - stylesToMerge.push({ name: 'border-spacing', value: addSizeSuffix(data.cellspacing) }); - mergeStyles(dom, tableElm, stylesToMerge); - dom.setAttribs(tableElm, { - 'data-mce-border-color': data.borderColor, - 'data-mce-cell-padding': data.cellpadding, - 'data-mce-border': data.border - }); - if (tableElm.children) { - for (var i = 0; i < tableElm.children.length; i++) { - styleTDTH(tableElm.children[i], 'border', data.border); - styleTDTH(tableElm.children[i], 'padding', addSizeSuffix(data.cellpadding)); - } - } - } else { - editor.dom.setAttribs(tableElm, { - border: data.border, - cellpadding: data.cellpadding, - cellspacing: data.cellspacing }); } - - if (dom.getAttrib(tableElm, 'width') && !editor.settings.table_style_by_css) { - dom.setAttrib(tableElm, 'width', removePxSuffix(data.width)); - } else { - dom.setStyle(tableElm, 'width', addSizeSuffix(data.width)); - } - - dom.setStyle(tableElm, 'height', addSizeSuffix(data.height)); - - // Toggle caption on/off - captionElm = dom.select('caption', tableElm)[0]; - - if (captionElm && !data.caption) { - dom.remove(captionElm); - } - - if (!captionElm && data.caption) { - captionElm = dom.create('caption'); - captionElm.innerHTML = !Env.ie ? '
' : '\u00a0'; - tableElm.insertBefore(captionElm, tableElm.firstChild); - } - unApplyAlign(tableElm); - if (data.align) { - editor.formatter.apply('align' + data.align, {}, tableElm); - } - - editor.focus(); - editor.addVisual(); - }); - } - - function getTDTHOverallStyle(elm, name) { - var cells = editor.dom.select("td,th", elm), firstChildStyle; - - function checkChildren(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; - } - - if (isProps === true) { - tableElm = dom.getParent(editor.selection.getStart(), 'table'); - - if (tableElm) { - data = { - width: removePxSuffix(dom.getStyle(tableElm, 'width') || dom.getAttrib(tableElm, 'width')), - height: removePxSuffix(dom.getStyle(tableElm, 'height') || dom.getAttrib(tableElm, 'height')), - cellspacing: removePxSuffix(dom.getStyle(tableElm, 'border-spacing') || - dom.getAttrib(tableElm, 'cellspacing')), - cellpadding: dom.getAttrib(tableElm, 'data-mce-cell-padding') || dom.getAttrib(tableElm, 'cellpadding') || - getTDTHOverallStyle(tableElm, 'padding'), - border: dom.getAttrib(tableElm, 'data-mce-border') || dom.getAttrib(tableElm, 'border') || - getTDTHOverallStyle(tableElm, 'border'), - borderColor: dom.getAttrib(tableElm, 'data-mce-border-color'), - caption: !!dom.select('caption', tableElm)[0], - 'class': dom.getAttrib(tableElm, 'class') - }; - - each('left center right'.split(' '), function (name) { - if (editor.formatter.matchNode(tableElm, 'align' + name)) { - data.align = name; - } - }); - } - } else { - colsCtrl = { label: 'Cols', name: 'cols' }; - rowsCtrl = { label: 'Rows', name: 'rows' }; - } - - if (editor.settings.table_class_list) { - if (data["class"]) { - data["class"] = data["class"].replace(/\s*mce\-item\-table\s*/g, ''); - } - - classListCtrl = { - name: 'class', - type: 'listbox', - label: 'Class', - values: buildListItems( - editor.settings.table_class_list, - 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: (editor.settings.table_appearance_options !== false) ? [ - colsCtrl, - rowsCtrl, - { label: 'Width', name: 'width' }, - { label: 'Height', name: 'height' }, - { 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' }, - { label: 'Height', name: 'height' } - ] - }, - - { - 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 (editor.settings.table_advtab !== false) { - appendStylesToData(dom, data, tableElm); - - editor.windowManager.open({ - title: "Table properties", - data: data, - bodyType: 'tabpanel', - body: [ - { - title: 'General', - type: 'form', - items: generalTableForm - }, - createStyleForm(dom) - ], - - onsubmit: onSubmitTableForm - }); - } else { - editor.windowManager.open({ - title: "Table properties", - data: data, - body: generalTableForm, - onsubmit: onSubmitTableForm - }); - } - }; - - self.merge = function (grid, cell) { - editor.windowManager.open({ - title: "Merge cells", - body: [ - { label: 'Cols', name: 'cols', type: 'textbox', value: '1', size: 10 }, - { label: 'Rows', name: 'rows', type: 'textbox', value: '1', size: 10 } - ], - onsubmit: function () { - var data = this.toJSON(); - - editor.undoManager.transact(function () { - grid.merge(cell, data.cols, data.rows); - }); - } - }); - }; - - self.cell = function () { - var dom = editor.dom, cellElm, data, classListCtrl, cells = []; - - 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); - } - } - - function onSubmitCellForm() { - updateStyle(dom, this); - data = Tools.extend(data, this.toJSON()); - - editor.undoManager.transact(function () { - each(cells, function (cellElm) { - setAttrib(cellElm, 'scope', data.scope); - setAttrib(cellElm, 'style', data.style); - setAttrib(cellElm, 'class', data['class']); - setStyle(cellElm, 'width', addSizeSuffix(data.width)); - setStyle(cellElm, 'height', addSizeSuffix(data.height)); - - // Switch cell type - if (data.type && cellElm.nodeName.toLowerCase() !== data.type) { - cellElm = dom.rename(cellElm, data.type); - } - - // Remove alignment - if (cells.length === 1) { - unApplyAlign(cellElm); - unApplyVAlign(cellElm); - } - - // Apply alignment - if (data.align) { - editor.formatter.apply('align' + data.align, {}, cellElm); - } - - // Apply vertical alignment - if (data.valign) { - editor.formatter.apply('valign' + data.valign, {}, cellElm); - } - }); - - editor.focus(); - }); - } - - // Get selected cells or the current cell - 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) { - // If this element is null, return now to avoid crashing. - return; - } - - if (cells.length > 1) { - data = { - width: '', - height: '', - scope: '', - 'class': '', - align: '', - style: '', - type: cellElm.nodeName.toLowerCase() - }; - } else { - data = { - width: removePxSuffix(dom.getStyle(cellElm, 'width') || dom.getAttrib(cellElm, 'width')), - height: removePxSuffix(dom.getStyle(cellElm, 'height') || dom.getAttrib(cellElm, 'height')), - scope: dom.getAttrib(cellElm, 'scope'), - 'class': dom.getAttrib(cellElm, 'class') - }; - - data.type = cellElm.nodeName.toLowerCase(); - - each('left center right'.split(' '), function (name) { - if (editor.formatter.matchNode(cellElm, 'align' + name)) { - data.align = name; - } - }); - - each('top middle bottom'.split(' '), function (name) { - if (editor.formatter.matchNode(cellElm, 'valign' + name)) { - data.valign = name; - } - }); - - appendStylesToData(dom, data, cellElm); - } - - if (editor.settings.table_cell_class_list) { - classListCtrl = { - name: 'class', - type: 'listbox', - label: 'Class', - values: buildListItems( - editor.settings.table_cell_class_list, - 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' }, - { label: 'Height', name: 'height' }, - { - 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 (editor.settings.table_cell_advtab !== false) { - editor.windowManager.open({ - title: "Cell properties", - bodyType: 'tabpanel', - data: data, - body: [ - { - title: 'General', - type: 'form', - items: generalCellForm - }, - - createStyleForm(dom) - ], - - onsubmit: onSubmitCellForm - }); - } else { - editor.windowManager.open({ - title: "Cell properties", - data: data, - body: generalCellForm, - onsubmit: onSubmitCellForm - }); - } - }; - - self.row = function () { - var dom = editor.dom, tableElm, cellElm, rowElm, classListCtrl, data, rows = [], generalRowForm; - - 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); - } - } - - function onSubmitRowForm() { - var tableElm, oldParentElm, parentElm; - - updateStyle(dom, this); - data = Tools.extend(data, this.toJSON()); - - editor.undoManager.transact(function () { - var toType = data.type; - - 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 (toType !== rowElm.parentNode.nodeName.toLowerCase()) { - tableElm = dom.getParent(rowElm, 'table'); - - oldParentElm = rowElm.parentNode; - parentElm = dom.select(toType, tableElm)[0]; - if (!parentElm) { - parentElm = dom.create(toType); - if (tableElm.firstChild) { - // caption tag should be the first descendant of the table tag (see TINY-1167) - 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); - } - } - - // Apply/remove alignment - if (rows.length === 1) { - unApplyAlign(rowElm); - } - - if (data.align) { - editor.formatter.apply('align' + data.align, {}, rowElm); - } - }); - - editor.focus(); - }); - } - - tableElm = editor.dom.getParent(editor.selection.getStart(), 'table'); - cellElm = editor.dom.getParent(editor.selection.getStart(), 'td,th'); - - each(tableElm.rows, function (row) { - each(row.cells, function (cell) { - if (dom.getAttrib(cell, 'data-mce-selected') || cell == cellElm) { - rows.push(row); - return false; - } }); }); - - rowElm = rows[0]; - if (!rowElm) { - // If this element is null, return now to avoid crashing. - return; - } - - if (rows.length > 1) { - data = { - height: '', - scope: '', - 'class': '', - align: '', - type: rowElm.parentNode.nodeName.toLowerCase() - }; - } else { - data = { - height: removePxSuffix(dom.getStyle(rowElm, 'height') || dom.getAttrib(rowElm, 'height')), - scope: dom.getAttrib(rowElm, 'scope'), - 'class': dom.getAttrib(rowElm, 'class') - }; - - data.type = rowElm.parentNode.nodeName.toLowerCase(); - - each('left center right'.split(' '), function (name) { - if (editor.formatter.matchNode(rowElm, 'align' + name)) { - data.align = name; - } - }); - - appendStylesToData(dom, data, rowElm); - } - - if (editor.settings.table_row_class_list) { - classListCtrl = { - name: 'class', - type: 'listbox', - label: 'Class', - values: buildListItems( - editor.settings.table_row_class_list, - 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 (editor.settings.table_row_advtab !== false) { - editor.windowManager.open({ - title: "Row properties", - data: data, - bodyType: 'tabpanel', - body: [ - { - title: 'General', - type: 'form', - items: generalRowForm - }, - createStyleForm(dom) - ], - - onsubmit: onSubmitRowForm - }); - } else { - editor.windowManager.open({ - title: "Row properties", - data: data, - body: generalRowForm, - onsubmit: onSubmitRowForm - }); - } - }; + } }; - } -); - -/** - * ResizeBars.js - * - * Released under LGPL License. - * Copyright (c) 1999-2017 Ephox Corp. All rights reserved - * - * License: http://www.tinymce.com/license - * Contributing: http://www.tinymce.com/contributing - */ - -/** - * This class handles table column and row resizing by adding divs over the columns and rows of the table. - * These divs are then manipulated using mouse events to resize the underlying table. - * - * @class tinymce.table.ui.ResizeBars - * @private - */ -define( - 'tinymce.plugins.table.ui.ResizeBars', - [ - 'tinymce.core.util.Tools', - 'tinymce.core.util.VK' - ], - function (Tools, VK) { - var hoverTable; - - return function (editor) { - var RESIZE_BAR_CLASS = 'mce-resize-bar', - RESIZE_BAR_ROW_CLASS = 'mce-resize-bar-row', - RESIZE_BAR_ROW_CURSOR_STYLE = 'row-resize', - RESIZE_BAR_ROW_DATA_ATTRIBUTE = 'data-row', - RESIZE_BAR_ROW_DATA_INITIAL_TOP_ATTRIBUTE = 'data-initial-top', - RESIZE_BAR_COL_CLASS = 'mce-resize-bar-col', - RESIZE_BAR_COL_CURSOR_STYLE = 'col-resize', - RESIZE_BAR_COL_DATA_ATTRIBUTE = 'data-col', - RESIZE_BAR_COL_DATA_INITIAL_LEFT_ATTRIBUTE = 'data-initial-left', - RESIZE_BAR_THICKNESS = 4, - RESIZE_MINIMUM_WIDTH = 10, - RESIZE_MINIMUM_HEIGHT = 10, - RESIZE_BAR_DRAGGING_CLASS = 'mce-resize-bar-dragging'; - - var percentageBasedSizeRegex = new RegExp(/(\d+(\.\d+)?%)/), - pixelBasedSizeRegex = new RegExp(/px|em/); - - var delayDrop, dragging, blockerElement, dragBar, lastX, lastY; - - // Get the absolute position's top edge. - function getTopEdge(index, row) { - return { - index: index, - y: editor.dom.getPos(row).y - }; - } - - // Get the absolute position's bottom edge. - function getBottomEdge(index, row) { - return { - index: index, - y: editor.dom.getPos(row).y + row.offsetHeight - }; - } - - // Get the absolute position's left edge. - function getLeftEdge(index, cell) { - return { - index: index, - x: editor.dom.getPos(cell).x - }; - } - - // Get the absolute position's right edge. - function getRightEdge(index, cell) { - return { - index: index, - x: editor.dom.getPos(cell).x + cell.offsetWidth - }; - } - - function isRtl() { - var dir = editor.getBody().dir; - return dir === 'rtl'; - } - - function isInline() { - return editor.inline; - } - - function getBody() { - return isInline ? editor.getBody().ownerDocument.body : editor.getBody(); - } - - function getInnerEdge(index, cell) { - return isRtl() ? getRightEdge(index, cell) : getLeftEdge(index, cell); - } - - function getOuterEdge(index, cell) { - return isRtl() ? getLeftEdge(index, cell) : getRightEdge(index, cell); - } - - function getPercentageWidthFallback(element, table) { - return getComputedStyleSize(element, 'width') / getComputedStyleSize(table, 'width') * 100; - } - - function getComputedStyleSize(element, property) { - var widthString = editor.dom.getStyle(element, property, true); - var width = parseInt(widthString, 10); - return width; - } - - function getCurrentTablePercentWidth(table) { - var tableWidth = getComputedStyleSize(table, 'width'); - var tableParentWidth = getComputedStyleSize(table.parentElement, 'width'); - return tableWidth / tableParentWidth * 100; - } - - function getCellPercentDelta(table, delta) { - var tableWidth = getComputedStyleSize(table, 'width'); - return delta / tableWidth * 100; - } - - function getTablePercentDelta(table, delta) { - var tableParentWidth = getComputedStyleSize(table.parentElement, 'width'); - return delta / tableParentWidth * 100; - } - - // Find the left/right (ltr/rtl) or top side locations of the cells to measure. - // This is the location of the borders we need to draw over. - function findPositions(getInner, getOuter, thingsToMeasure) { - var tablePositions = []; - - // Skip the first item in the array = no left (LTR), right (RTL) or top bars - for (var i = 1; i < thingsToMeasure.length; i++) { - // Get the element from the details - var item = thingsToMeasure[i].element; - - // We need to zero index this again - tablePositions.push(getInner(i - 1, item)); - } - - var lastTableLineToMake = thingsToMeasure[thingsToMeasure.length - 1]; - tablePositions.push(getOuter(thingsToMeasure.length - 1, lastTableLineToMake.element)); - - return tablePositions; - } - - // Clear the bars. - function clearBars() { - var bars = editor.dom.select('.' + RESIZE_BAR_CLASS, getBody()); - Tools.each(bars, function (bar) { - editor.dom.remove(bar); - }); - } - - // Refresh the bars. - function refreshBars(tableElement) { - clearBars(); - drawBars(tableElement); - } - - // Generates a resize bar object for the editor to add. - function generateBar(classToAdd, cursor, left, top, height, width, indexAttr, index) { - var bar = { - 'data-mce-bogus': 'all', - 'class': RESIZE_BAR_CLASS + ' ' + classToAdd, - 'unselectable': 'on', - 'data-mce-resize': false, - style: 'cursor: ' + cursor + '; ' + - 'margin: 0; ' + - 'padding: 0; ' + - 'position: absolute; ' + - 'left: ' + left + 'px; ' + - 'top: ' + top + 'px; ' + - 'height: ' + height + 'px; ' + - 'width: ' + width + 'px; ' - }; - - bar[indexAttr] = index; - - return bar; - } - - // Draw the row bars over the row borders. - function drawRows(rowPositions, tableWidth, tablePosition) { - Tools.each(rowPositions, function (rowPosition) { - var left = tablePosition.x, - top = rowPosition.y - RESIZE_BAR_THICKNESS / 2, - height = RESIZE_BAR_THICKNESS, - width = tableWidth; - - editor.dom.add(getBody(), 'div', - generateBar(RESIZE_BAR_ROW_CLASS, RESIZE_BAR_ROW_CURSOR_STYLE, - left, top, height, width, RESIZE_BAR_ROW_DATA_ATTRIBUTE, rowPosition.index)); - }); - } - - // Draw the column bars over the column borders. - function drawCols(cellPositions, tableHeight, tablePosition) { - Tools.each(cellPositions, function (cellPosition) { - var left = cellPosition.x - RESIZE_BAR_THICKNESS / 2, - top = tablePosition.y, - height = tableHeight, - width = RESIZE_BAR_THICKNESS; - - editor.dom.add(getBody(), 'div', - generateBar(RESIZE_BAR_COL_CLASS, RESIZE_BAR_COL_CURSOR_STYLE, - left, top, height, width, RESIZE_BAR_COL_DATA_ATTRIBUTE, cellPosition.index)); - }); - } - - // Get a matrix of the cells in each row and the rows in the table. - function getTableDetails(table) { - return Tools.map(table.rows, function (row) { - - var cells = Tools.map(row.cells, function (cell) { - - var rowspan = cell.hasAttribute('rowspan') ? parseInt(cell.getAttribute('rowspan'), 10) : 1; - var colspan = cell.hasAttribute('colspan') ? parseInt(cell.getAttribute('colspan'), 10) : 1; - + 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 { - element: cell, - rowspan: rowspan, - colspan: colspan + first: constant(first), + last: constant(last), + table: constant(tbl) }; }); - - return { - element: row, - cells: cells - }; - }); - - } - - // Get a grid model of the table. - function getTableGrid(tableDetails) { - function key(rowIndex, colIndex) { - return rowIndex + ',' + colIndex; - } - - function getAt(rowIndex, colIndex) { - return access[key(rowIndex, colIndex)]; - } - - function getAllCells() { - var allCells = []; - Tools.each(rows, function (row) { - allCells = allCells.concat(row.cells); - }); - return allCells; - } - - function getAllRows() { - return rows; - } - - var access = {}; - var rows = []; - - var maxRows = 0; - var maxCols = 0; - - Tools.each(tableDetails, function (row, rowIndex) { - var currentRow = []; - - Tools.each(row.cells, function (cell) { - - var start = 0; - - while (access[key(rowIndex, start)] !== undefined) { - start++; - } - - var current = { - element: cell.element, - colspan: cell.colspan, - rowspan: cell.rowspan, - rowIndex: rowIndex, - colIndex: start - }; - - for (var i = 0; i < cell.colspan; i++) { - for (var j = 0; j < cell.rowspan; j++) { - var cr = rowIndex + j; - var cc = start + i; - access[key(cr, cc)] = current; - maxRows = Math.max(maxRows, cr + 1); - maxCols = Math.max(maxCols, cc + 1); - } - } - - currentRow.push(current); - }); - - rows.push({ - element: row.element, - cells: currentRow - }); - }); - - return { - grid: { - maxRows: maxRows, - maxCols: maxCols - }, - getAt: getAt, - getAllCells: getAllCells, - getAllRows: getAllRows - }; - } - - function range(start, end) { - var r = []; - - for (var i = start; i < end; i++) { - r.push(i); - } - - return r; - } - - // Attempt to get a representative single block for this column. - // If we can't find a single block, all blocks in this row/column are spanned - // and we'll need to fallback to getting the first cell in the row/column. - function decide(getBlock, isSingle, getFallback) { - var inBlock = getBlock(); - var singleInBlock; - - for (var i = 0; i < inBlock.length; i++) { - if (isSingle(inBlock[i])) { - singleInBlock = inBlock[i]; - } - } - return singleInBlock ? singleInBlock : getFallback(); - } - - // Attempt to get representative blocks for the width of each column. - function getColumnBlocks(tableGrid) { - var cols = range(0, tableGrid.grid.maxCols); - var rows = range(0, tableGrid.grid.maxRows); - - return Tools.map(cols, function (col) { - function getBlock() { - var details = []; - for (var i = 0; i < rows.length; i++) { - var detail = tableGrid.getAt(i, col); - if (detail && detail.colIndex === col) { - details.push(detail); - } - } - - return details; - } - - function isSingle(detail) { - return detail.colspan === 1; - } - - function getFallback() { - var item; - - for (var i = 0; i < rows.length; i++) { - item = tableGrid.getAt(i, col); - if (item) { - return item; - } - } - - return null; - } - - return decide(getBlock, isSingle, getFallback); - }); - } - - // Attempt to get representative blocks for the height of each row. - function getRowBlocks(tableGrid) { - var cols = range(0, tableGrid.grid.maxCols); - var rows = range(0, tableGrid.grid.maxRows); - - return Tools.map(rows, function (row) { - function getBlock() { - var details = []; - for (var i = 0; i < cols.length; i++) { - var detail = tableGrid.getAt(row, i); - if (detail && detail.rowIndex === row) { - details.push(detail); - } - } - return details; - } - - function isSingle(detail) { - return detail.rowspan === 1; - } - - function getFallback() { - return tableGrid.getAt(row, 0); - } - - return decide(getBlock, isSingle, getFallback); - }); - } - - // Draw resize bars over the left/right (ltr/rtl) or top side locations of the cells to measure. - // This is the location of the borders we need to draw over. - function drawBars(table) { - var tableDetails = getTableDetails(table); - var tableGrid = getTableGrid(tableDetails); - var rows = getRowBlocks(tableGrid); - var cols = getColumnBlocks(tableGrid); - - var tablePosition = editor.dom.getPos(table); - var rowPositions = rows.length > 0 ? findPositions(getTopEdge, getBottomEdge, rows) : []; - var colPositions = cols.length > 0 ? findPositions(getInnerEdge, getOuterEdge, cols) : []; - - drawRows(rowPositions, table.offsetWidth, tablePosition); - drawCols(colPositions, table.offsetHeight, tablePosition); - } - - // Attempt to deduce the width/height of a column/row that has more than one cell spanned. - function deduceSize(deducables, index, isPercentageBased, table) { - if (index < 0 || index >= deducables.length - 1) { - return ""; - } - - var current = deducables[index]; - - if (current) { - current = { - value: current, - delta: 0 - }; - } else { - var reversedUpToIndex = deducables.slice(0, index).reverse(); - for (var i = 0; i < reversedUpToIndex.length; i++) { - if (reversedUpToIndex[i]) { - current = { - value: reversedUpToIndex[i], - delta: i + 1 - }; - } - } - } - - var next = deducables[index + 1]; - - if (next) { - next = { - value: next, - delta: 1 - }; - } else { - var rest = deducables.slice(index + 1); - for (var j = 0; j < rest.length; j++) { - if (rest[j]) { - next = { - value: rest[j], - delta: j + 1 - }; - } - } - } - - var extras = next.delta - current.delta; - var pixelWidth = Math.abs(next.value - current.value) / extras; - return isPercentageBased ? pixelWidth / getComputedStyleSize(table, 'width') * 100 : pixelWidth; - } - - function getStyleOrAttrib(element, property) { - var sizeString = editor.dom.getStyle(element, property); - if (!sizeString) { - sizeString = editor.dom.getAttrib(element, property); - } - if (!sizeString) { - sizeString = editor.dom.getStyle(element, property, true); - } - return sizeString; - } - - function getWidth(element, isPercentageBased, table) { - var widthString = getStyleOrAttrib(element, 'width'); - - var widthNumber = parseInt(widthString, 10); - - var getWidthFallback = isPercentageBased ? - getPercentageWidthFallback(element, table) : - getComputedStyleSize(element, 'width'); - - // If this is percentage based table, but this cell isn't percentage based. - // Or if this is a pixel based table, but this cell isn't pixel based. - if (isPercentageBased && !isPercentageBasedSize(widthString) || - !isPercentageBased && !isPixelBasedSize(widthString)) { - // set the widthnumber to 0 - widthNumber = 0; - } - - return !isNaN(widthNumber) && widthNumber > 0 ? - widthNumber : getWidthFallback; - } - - // Attempt to get the css width from column representative cells. - function getWidths(tableGrid, isPercentageBased, table) { - - var cols = getColumnBlocks(tableGrid); - - var backups = Tools.map(cols, function (col) { - return getInnerEdge(col.colIndex, col.element).x; - }); - - var widths = []; - - for (var i = 0; i < cols.length; i++) { - var span = cols[i].element.hasAttribute('colspan') ? parseInt(cols[i].element.getAttribute('colspan'), 10) : 1; - // Deduce if the column has colspan of more than 1 - var width = span > 1 ? deduceSize(backups, i) : getWidth(cols[i].element, isPercentageBased, table); - // If everything's failed and we still don't have a width - width = width ? width : RESIZE_MINIMUM_WIDTH; - widths.push(width); - } - - return widths; - } - - // Attempt to get the pixel height from a cell. - function getPixelHeight(element) { - - var heightString = getStyleOrAttrib(element, 'height'); - - var heightNumber = parseInt(heightString, 10); - - if (isPercentageBasedSize(heightString)) { - heightNumber = 0; - } - - return !isNaN(heightNumber) && heightNumber > 0 ? - heightNumber : getComputedStyleSize(element, 'height'); - } - - // Attempt to get the css height from row representative cells. - function getPixelHeights(tableGrid) { - - var rows = getRowBlocks(tableGrid); - - var backups = Tools.map(rows, function (row) { - return getTopEdge(row.rowIndex, row.element).y; - }); - - var heights = []; - - for (var i = 0; i < rows.length; i++) { - var span = rows[i].element.hasAttribute('rowspan') ? parseInt(rows[i].element.getAttribute('rowspan'), 10) : 1; - - var height = span > 1 ? deduceSize(backups, i) : getPixelHeight(rows[i].element); - - height = height ? height : RESIZE_MINIMUM_HEIGHT; - heights.push(height); - } - - return heights; - } - - // Determine how much each column's css width will need to change. - // Sizes = result = pixels widths OR percentage based widths - function determineDeltas(sizes, column, step, min, isPercentageBased) { - - var result = sizes.slice(0); - - function generateZeros(array) { - return Tools.map(array, function () { - return 0; - }); - } - - function onOneColumn() { - var deltas; - if (isPercentageBased) { - // If we have one column in a percent based table, that column should be 100% of the width of the table. - deltas = [100 - result[0]]; - } else { - var newNext = Math.max(min, result[0] + step); - deltas = [newNext - result[0]]; - } - return deltas; - } - - function onLeftOrMiddle(index, next) { - - var startZeros = generateZeros(result.slice(0, index)); - var endZeros = generateZeros(result.slice(next + 1)); - var deltas; - - if (step >= 0) { - var newNext = Math.max(min, result[next] - step); - deltas = startZeros.concat([step, newNext - result[next]]).concat(endZeros); - } else { - var newThis = Math.max(min, result[index] + step); - var diffx = result[index] - newThis; - deltas = startZeros.concat([newThis - result[index], diffx]).concat(endZeros); - } - - return deltas; - } - - function onRight(previous, index) { - var startZeros = generateZeros(result.slice(0, index)); - var deltas; - - if (step >= 0) { - deltas = startZeros.concat([step]); - } else { - var size = Math.max(min, result[index] + step); - deltas = startZeros.concat([size - result[index]]); - } - - return deltas; - - } - - var deltas; - - if (sizes.length === 0) { // No Columns - deltas = []; - } else if (sizes.length === 1) { // One Column - deltas = onOneColumn(); - } else if (column === 0) { // Left Column - deltas = onLeftOrMiddle(0, 1); - } else if (column > 0 && column < sizes.length - 1) { // Middle Column - deltas = onLeftOrMiddle(column, column + 1); - } else if (column === sizes.length - 1) { // Right Column - deltas = onRight(column - 1, column); - } else { - deltas = []; - } - - return deltas; - } - - function total(start, end, measures) { - var r = 0; - for (var i = start; i < end; i++) { - r += measures[i]; - } - return r; - } - - // Combine cell's css widths to determine widths of colspan'd cells. - function recalculateWidths(tableGrid, widths) { - var allCells = tableGrid.getAllCells(); - return Tools.map(allCells, function (cell) { - var width = total(cell.colIndex, cell.colIndex + cell.colspan, widths); - return { - element: cell.element, - width: width, - colspan: cell.colspan - }; - }); - } - - // Combine cell's css heights to determine heights of rowspan'd cells. - function recalculateCellHeights(tableGrid, heights) { - var allCells = tableGrid.getAllCells(); - return Tools.map(allCells, function (cell) { - var height = total(cell.rowIndex, cell.rowIndex + cell.rowspan, heights); - return { - element: cell.element, - height: height, - rowspan: cell.rowspan - }; - }); - } - - // Calculate row heights. - function recalculateRowHeights(tableGrid, heights) { - var allRows = tableGrid.getAllRows(); - return Tools.map(allRows, function (row, i) { - return { - element: row.element, - height: heights[i] - }; - }); - } - - function isPercentageBasedSize(size) { - return percentageBasedSizeRegex.test(size); - } - - function isPixelBasedSize(size) { - return pixelBasedSizeRegex.test(size); - } - - // Adjust the width of the column of table at index, with delta. - function adjustWidth(table, delta, index) { - var tableDetails = getTableDetails(table); - var tableGrid = getTableGrid(tableDetails); - - function setSizes(newSizes, styleExtension) { - Tools.each(newSizes, function (cell) { - editor.dom.setStyle(cell.element, 'width', cell.width + styleExtension); - editor.dom.setAttrib(cell.element, 'width', null); - }); - } - - function getNewTablePercentWidth() { - return index < tableGrid.grid.maxCols - 1 ? getCurrentTablePercentWidth(table) : - getCurrentTablePercentWidth(table) + getTablePercentDelta(table, delta); - } - - function getNewTablePixelWidth() { - return index < tableGrid.grid.maxCols - 1 ? getComputedStyleSize(table, 'width') : - getComputedStyleSize(table, 'width') + delta; - } - - function setTableSize(newTableWidth, styleExtension, isPercentBased) { - if (index == tableGrid.grid.maxCols - 1 || !isPercentBased) { - editor.dom.setStyle(table, 'width', newTableWidth + styleExtension); - editor.dom.setAttrib(table, 'width', null); - } - } - - var percentageBased = isPercentageBasedSize(table.width) || - isPercentageBasedSize(table.style.width); - - var widths = getWidths(tableGrid, percentageBased, table); - - var step = percentageBased ? getCellPercentDelta(table, delta) : delta; - // TODO: change the min for percentage maybe? - var deltas = determineDeltas(widths, index, step, RESIZE_MINIMUM_WIDTH, percentageBased, table); - var newWidths = []; - - for (var i = 0; i < deltas.length; i++) { - newWidths.push(deltas[i] + widths[i]); - } - - var newSizes = recalculateWidths(tableGrid, newWidths); - var styleExtension = percentageBased ? '%' : 'px'; - var newTableWidth = percentageBased ? getNewTablePercentWidth() : - getNewTablePixelWidth(); - - editor.undoManager.transact(function () { - setSizes(newSizes, styleExtension); - setTableSize(newTableWidth, styleExtension, percentageBased); - }); - } - - // Adjust the height of the row of table at index, with delta. - function adjustHeight(table, delta, index) { - var tableDetails = getTableDetails(table); - var tableGrid = getTableGrid(tableDetails); - - var heights = getPixelHeights(tableGrid); - - var newHeights = [], newTotalHeight = 0; - - for (var i = 0; i < heights.length; i++) { - newHeights.push(i === index ? delta + heights[i] : heights[i]); - newTotalHeight += newTotalHeight[i]; - } - - var newCellSizes = recalculateCellHeights(tableGrid, newHeights); - var newRowSizes = recalculateRowHeights(tableGrid, newHeights); - - editor.undoManager.transact(function () { - - Tools.each(newRowSizes, function (row) { - editor.dom.setStyle(row.element, 'height', row.height + 'px'); - editor.dom.setAttrib(row.element, 'height', null); - }); - - Tools.each(newCellSizes, function (cell) { - editor.dom.setStyle(cell.element, 'height', cell.height + 'px'); - editor.dom.setAttrib(cell.element, 'height', null); - }); - - editor.dom.setStyle(table, 'height', newTotalHeight + 'px'); - editor.dom.setAttrib(table, 'height', null); - }); - } - - function scheduleDelayedDropEvent() { - delayDrop = setTimeout(function () { - drop(); - }, 200); - } - - function cancelDelayedDropEvent() { - clearTimeout(delayDrop); - } - - function getBlockerElement() { - var blocker = document.createElement('div'); - - blocker.setAttribute('style', 'margin: 0; ' + - 'padding: 0; ' + - 'position: fixed; ' + - 'left: 0px; ' + - 'top: 0px; ' + - 'height: 100%; ' + - 'width: 100%;'); - blocker.setAttribute('data-mce-bogus', 'all'); - - return blocker; - } - - function bindBlockerEvents(blocker, dragHandler) { - editor.dom.bind(blocker, 'mouseup', function () { - drop(); - }); - - editor.dom.bind(blocker, 'mousemove', function (e) { - cancelDelayedDropEvent(); - - if (dragging) { - dragHandler(e); - } - }); - - editor.dom.bind(blocker, 'mouseout', function () { - scheduleDelayedDropEvent(); - }); - - } - - function drop() { - editor.dom.remove(blockerElement); - - if (dragging) { - editor.dom.removeClass(dragBar, RESIZE_BAR_DRAGGING_CLASS); - dragging = false; - - var index, delta; - - if (isCol(dragBar)) { - var initialLeft = parseInt(editor.dom.getAttrib(dragBar, RESIZE_BAR_COL_DATA_INITIAL_LEFT_ATTRIBUTE), 10); - var newLeft = editor.dom.getPos(dragBar).x; - index = parseInt(editor.dom.getAttrib(dragBar, RESIZE_BAR_COL_DATA_ATTRIBUTE), 10); - delta = isRtl() ? initialLeft - newLeft : newLeft - initialLeft; - if (Math.abs(delta) >= 1) { // simple click with no real resize (<1px) must not add CSS properties - adjustWidth(hoverTable, delta, index); - } - } else if (isRow(dragBar)) { - var initialTop = parseInt(editor.dom.getAttrib(dragBar, RESIZE_BAR_ROW_DATA_INITIAL_TOP_ATTRIBUTE), 10); - var newTop = editor.dom.getPos(dragBar).y; - index = parseInt(editor.dom.getAttrib(dragBar, RESIZE_BAR_ROW_DATA_ATTRIBUTE), 10); - delta = newTop - initialTop; - if (Math.abs(delta) >= 1) { // simple click with no real resize (<1px) must not add CSS properties - adjustHeight(hoverTable, delta, index); - } - } - refreshBars(hoverTable); - editor.nodeChanged(); - } - } - - function setupBaseDrag(bar, dragHandler) { - blockerElement = blockerElement ? blockerElement : getBlockerElement(); - dragging = true; - editor.dom.addClass(bar, RESIZE_BAR_DRAGGING_CLASS); - dragBar = bar; - bindBlockerEvents(blockerElement, dragHandler); - editor.dom.add(getBody(), blockerElement); - } - - function isCol(target) { - return editor.dom.hasClass(target, RESIZE_BAR_COL_CLASS); - } - - function isRow(target) { - return editor.dom.hasClass(target, RESIZE_BAR_ROW_CLASS); - } - - function colDragHandler(event) { - lastX = lastX !== undefined ? lastX : event.clientX; // we need a firstX - var deltaX = event.clientX - lastX; - lastX = event.clientX; - var oldLeft = editor.dom.getPos(dragBar).x; - editor.dom.setStyle(dragBar, 'left', oldLeft + deltaX + 'px'); - } - - function rowDragHandler(event) { - lastY = lastY !== undefined ? lastY : event.clientY; - var deltaY = event.clientY - lastY; - lastY = event.clientY; - var oldTop = editor.dom.getPos(dragBar).y; - editor.dom.setStyle(dragBar, 'top', oldTop + deltaY + 'px'); - } - - function setupColDrag(bar) { - lastX = undefined; - setupBaseDrag(bar, colDragHandler); - } - - function setupRowDrag(bar) { - lastY = undefined; - setupBaseDrag(bar, rowDragHandler); - } - - function mouseDownHandler(e) { - var target = e.target, body = editor.getBody(); - - // Since this code is working on global events we need to work on a global hoverTable state - // and make sure that the state is correct according to the events fired - if (!editor.$.contains(body, hoverTable) && hoverTable !== body) { - return; - } - - if (isCol(target)) { - e.preventDefault(); - var initialLeft = editor.dom.getPos(target).x; - editor.dom.setAttrib(target, RESIZE_BAR_COL_DATA_INITIAL_LEFT_ATTRIBUTE, initialLeft); - setupColDrag(target); - } else if (isRow(target)) { - e.preventDefault(); - var initialTop = editor.dom.getPos(target).y; - editor.dom.setAttrib(target, RESIZE_BAR_ROW_DATA_INITIAL_TOP_ATTRIBUTE, initialTop); - setupRowDrag(target); - } else { - clearBars(); - } - } - - editor.on('init', function () { - // Needs to be like this for inline mode, editor.on does not bind to elements in the document body otherwise - editor.dom.bind(getBody(), 'mousedown', mouseDownHandler); }); - - // If we're updating the table width via the old mechanic, we need to update the constituent cells' widths/heights too. - editor.on('ObjectResized', function (e) { - var table = e.target; - if (table.nodeName === 'TABLE') { - var newCellSizes = []; - Tools.each(table.rows, function (row) { - Tools.each(row.cells, function (cell) { - var width = editor.dom.getStyle(cell, 'width', true); - newCellSizes.push({ - cell: cell, - width: width - }); + }; + 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()) + }; }); }); - Tools.each(newCellSizes, function (newCellSize) { - editor.dom.setStyle(newCellSize.cell, 'width', newCellSize.width); - editor.dom.setAttrib(newCellSize.cell, 'width', null); + }); + }); + }; + 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 }; - editor.on('mouseover', function (e) { - if (!dragging) { - var tableElement = editor.dom.getParent(e.target, 'table'); - - if (e.target.nodeName === 'TABLE' || tableElement) { - hoverTable = tableElement; - refreshBars(tableElement); - } + 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); } - }); - - // Prevents the user from moving the caret inside the resize bars on Chrome - // Only does it on arrow keys since clearBars might be an epxensive operation - // since it's querying the DOM - editor.on('keydown', function (e) { - switch (e.keyCode) { - case VK.LEFT: - case VK.RIGHT: - case VK.UP: - case VK.DOWN: - clearBars(); - break; + var dom = element.dom(); + if (isSupported(dom)) { + dom.style[name] = h + 'px'; } - }); - - editor.on('remove', function () { - clearBars(); - editor.dom.unbind(getBody(), 'mousedown', mouseDownHandler); - }); - + }; + 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 { - adjustWidth: adjustWidth, - adjustHeight: adjustHeight, - clearBars: clearBars, - drawBars: drawBars, - determineDeltas: determineDeltas, - getTableGrid: getTableGrid, - getTableDetails: getTableDetails, - getWidths: getWidths, - getPixelHeights: getPixelHeights, - isPercentageBasedSize: isPercentageBasedSize, - isPixelBasedSize: isPixelBasedSize, - recalculateWidths: recalculateWidths, - recalculateCellHeights: recalculateCellHeights, - recalculateRowHeights: recalculateRowHeights + 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; -/** - * ResolveGlobal.js - * - * Released under LGPL License. - * Copyright (c) 1999-2017 Ephox Corp. All rights reserved - * - * License: http://www.tinymce.com/license - * Contributing: http://www.tinymce.com/contributing - */ + 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); + }; -define( - 'tinymce.core.util.Delay', - [ - 'global!tinymce.util.Tools.resolve' - ], - function (resolve) { - return resolve('tinymce.util.Delay'); - } -); + 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 + }; -/** - * Quirks.js - * - * Released under LGPL License. - * Copyright (c) 1999-2017 Ephox Corp. All rights reserved - * - * License: http://www.tinymce.com/license - * Contributing: http://www.tinymce.com/contributing - */ + var ResizeDirection = { + ltr: BarPositions.ltr, + rtl: BarPositions.rtl + }; -/** - * This class includes fixes for various browser quirks. - * - * @class tinymce.table.util.Quirks - * @private - */ -define( - 'tinymce.plugins.table.util.Quirks', - [ - 'tinymce.core.util.VK', - 'tinymce.core.util.Delay', - 'tinymce.core.Env', - 'tinymce.core.util.Tools', - 'tinymce.plugins.table.util.Utils' - ], - function (VK, Delay, Env, Tools, Utils) { - var each = Tools.each, getSpanVal = Utils.getSpanVal; + 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 + }; + } - return function (editor) { - /** - * Fixed caret movement around tables on WebKit. - */ - function moveWebKitSelection() { - function eventHandler(e) { - var key = e.keyCode; + var getGridSize = function (table) { + var input = DetailsList.fromTable(table); + var warehouse = Warehouse.generate(input); + return warehouse.grid(); + }; + var TableGridSize = { getGridSize: getGridSize }; - function handle(upBool, sourceNode) { - var siblingDirection = upBool ? 'previousSibling' : 'nextSibling'; - var currentRow = editor.dom.getParent(sourceNode, 'tr'); - var siblingRow = currentRow[siblingDirection]; + 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); + }; - if (siblingRow) { - moveCursorToRow(editor, sourceNode, siblingRow, upBool); - e.preventDefault(); - return true; + 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 tableNode = editor.dom.getParent(currentRow, 'table'); - var middleNode = currentRow.parentNode; - var parentNodeName = middleNode.nodeName.toLowerCase(); - if (parentNodeName === 'tbody' || parentNodeName === (upBool ? 'tfoot' : 'thead')) { - var targetParent = getTargetParent(upBool, tableNode, middleNode, 'tbody'); - if (targetParent !== null) { - return moveToRowInTarget(upBool, targetParent, sourceNode); + 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(__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); } - - return escapeTable(upBool, currentRow, siblingDirection, tableNode); + }; + for (var i = index; i < grid.length; i++) { + _loop_1(i); } + }); + } + return grid; + }; + var MergingOperations = { + merge: merge, + unmerge: unmerge, + splitRows: splitRows + }; - function getTargetParent(upBool, topNode, secondNode, nodeName) { - var tbodies = editor.dom.select('>' + nodeName, topNode); - var position = tbodies.indexOf(secondNode); - if (upBool && position === 0 || !upBool && position === tbodies.length - 1) { - return getFirstHeadOrFoot(upBool, topNode); - } else if (position === -1) { - var topOrBottom = secondNode.tagName.toLowerCase() === 'thead' ? 0 : tbodies.length - 1; - return tbodies[topOrBottom]; - } - - return tbodies[position + (upBool ? -1 : 1)]; + 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 + }; - function getFirstHeadOrFoot(upBool, parent) { - var tagName = upBool ? 'thead' : 'tfoot'; - var headOrFoot = editor.dom.select('>' + tagName, parent); - return headOrFoot.length !== 0 ? headOrFoot[0] : null; + 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 + }; - function moveToRowInTarget(upBool, targetParent, sourceNode) { - var targetRow = getChildForDirection(targetParent, upBool); + 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 + }; - if (targetRow) { - moveCursorToRow(editor, sourceNode, targetRow, upBool); - } + 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 + }; - e.preventDefault(); + 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; } - - function escapeTable(upBool, currentRow, siblingDirection, table) { - var tableSibling = table[siblingDirection]; - - if (tableSibling) { - moveCursorToStartOfElement(tableSibling); - return true; - } - - var parentCell = editor.dom.getParent(table, 'td,th'); - if (parentCell) { - return handle(upBool, parentCell, e); - } - - var backUpSibling = getChildForDirection(currentRow, !upBool); - moveCursorToStartOfElement(backUpSibling); - e.preventDefault(); - return false; + if (DomStructure.isEmptyTag(rightSibling)) { + return name(rightSibling) === 'img' ? false : true; } - - function getChildForDirection(parent, up) { - var child = parent && parent[up ? 'lastChild' : 'firstChild']; - // BR is not a valid table child to return in this case we return the table cell - return child && child.nodeName === 'BR' ? editor.dom.getParent(child, 'td,th') : child; - } - - function moveCursorToStartOfElement(n) { - editor.selection.select(n, true); - editor.selection.collapse(true); - } - - function isVerticalMovement() { - return key == VK.UP || key == VK.DOWN; - } - - function isInTable(editor) { - var node = editor.selection.getNode(); - var currentRow = editor.dom.getParent(node, 'tr'); - return currentRow !== null; - } - - function columnIndex(column) { - var colIndex = 0; - var c = column; - while (c.previousSibling) { - c = c.previousSibling; - colIndex = colIndex + getSpanVal(c, "colspan"); - } - return colIndex; - } - - function findColumn(rowElement, columnIndex) { - var c = 0, r = 0; - - each(rowElement.children, function (cell, i) { - c = c + getSpanVal(cell, "colspan"); - r = i; - if (c > columnIndex) { - return false; - } - }); - return r; - } - - function moveCursorToRow(ed, node, row, upBool) { - var srcColumnIndex = columnIndex(editor.dom.getParent(node, 'td,th')); - var tgtColumnIndex = findColumn(row, srcColumnIndex); - var tgtNode = row.childNodes[tgtColumnIndex]; - var rowCellTarget = getChildForDirection(tgtNode, upBool); - moveCursorToStartOfElement(rowCellTarget || tgtNode); - } - - function shouldFixCaret(preBrowserNode) { - var newNode = editor.selection.getNode(); - var newParent = editor.dom.getParent(newNode, 'td,th'); - var oldParent = editor.dom.getParent(preBrowserNode, 'td,th'); - - return newParent && newParent !== oldParent && checkSameParentTable(newParent, oldParent); - } - - function checkSameParentTable(nodeOne, NodeTwo) { - return editor.dom.getParent(nodeOne, 'TABLE') === editor.dom.getParent(NodeTwo, 'TABLE'); - } - - if (isVerticalMovement() && isInTable(editor)) { - var preBrowserNode = editor.selection.getNode(); - Delay.setEditorTimeout(editor, function () { - if (shouldFixCaret(preBrowserNode)) { - handle(!e.shiftKey && key === VK.UP, preBrowserNode, e); - } - }, 0); - } - } - - editor.on('KeyDown', function (e) { - eventHandler(e); - }); - } - - function fixBeforeTableCaretBug() { - // Checks if the selection/caret is at the start of the specified block element - function isAtStart(rng, par) { - var doc = par.ownerDocument, rng2 = doc.createRange(), elm; - - rng2.setStartBefore(par); - rng2.setEnd(rng.endContainer, rng.endOffset); - - elm = doc.createElement('body'); - elm.appendChild(rng2.cloneContents()); - - // Check for text characters of other elements that should be treated as content - return elm.innerHTML.replace(/<(br|img|object|embed|input|textarea)[^>]*>/gi, '-').replace(/<[^>]+>/g, '').length === 0; - } - - // Fixes an bug where it's impossible to place the caret before a table in Gecko - // this fix solves it by detecting when the caret is at the beginning of such a table - // and then manually moves the caret infront of the table - editor.on('KeyDown', function (e) { - var rng, table, dom = editor.dom; - - // On gecko it's not possible to place the caret before a table - if (e.keyCode == 37 || e.keyCode == 38) { - rng = editor.selection.getRng(); - table = dom.getParent(rng.startContainer, 'table'); - - if (table && editor.getBody().firstChild == table) { - if (isAtStart(rng, table)) { - rng = dom.createRng(); - - rng.setStartBefore(table); - rng.setEndBefore(table); - - editor.selection.setRng(rng); - - e.preventDefault(); - } - } - } - }); - } - - // Fixes an issue on Gecko where it's impossible to place the caret behind a table - // This fix will force a paragraph element after the table but only when the forced_root_block setting is enabled - function fixTableCaretPos() { - editor.on('KeyDown SetContent VisualAid', function () { - var last; - - // Skip empty text nodes from the end - for (last = editor.getBody().lastChild; last; last = last.previousSibling) { - if (last.nodeType == 3) { - if (last.nodeValue.length > 0) { - break; - } - } else if (last.nodeType == 1 && (last.tagName == 'BR' || !last.getAttribute('data-mce-bogus'))) { - break; - } - } - - if (last && last.nodeName == 'TABLE') { - if (editor.settings.forced_root_block) { - editor.dom.add( - editor.getBody(), - editor.settings.forced_root_block, - editor.settings.forced_root_block_attrs, - Env.ie && Env.ie < 10 ? ' ' : '
' - ); - } else { - editor.dom.add(editor.getBody(), 'br', { 'data-mce-bogus': '1' }); - } - } - }); - - editor.on('PreProcess', function (o) { - var last = o.node.lastChild; - - if (last && (last.nodeName == "BR" || (last.childNodes.length == 1 && - (last.firstChild.nodeName == 'BR' || last.firstChild.nodeValue == '\u00a0'))) && - last.previousSibling && last.previousSibling.nodeName == "TABLE") { - editor.dom.remove(last); - } - }); - } - - // this nasty hack is here to work around some WebKit selection bugs. - function fixTableCellSelection() { - function tableCellSelected(ed, rng, n, currentCell) { - // The decision of when a table cell is selected is somewhat involved. The fact that this code is - // required is actually a pointer to the root cause of this bug. A cell is selected when the start - // and end offsets are 0, the start container is a text, and the selection node is either a TR (most cases) - // or the parent of the table (in the case of the selection containing the last cell of a table). - var TEXT_NODE = 3, table = ed.dom.getParent(rng.startContainer, 'TABLE'); - var tableParent, allOfCellSelected, tableCellSelection; - - if (table) { - tableParent = table.parentNode; - } - - allOfCellSelected = rng.startContainer.nodeType == TEXT_NODE && - rng.startOffset === 0 && - rng.endOffset === 0 && - currentCell && - (n.nodeName == "TR" || n == tableParent); - - tableCellSelection = (n.nodeName == "TD" || n.nodeName == "TH") && !currentCell; - - return allOfCellSelected || tableCellSelection; - } - - function fixSelection() { - var rng = editor.selection.getRng(); - var n = editor.selection.getNode(); - var currentCell = editor.dom.getParent(rng.startContainer, 'TD,TH'); - - if (!tableCellSelected(editor, rng, n, currentCell)) { - return; - } - - if (!currentCell) { - currentCell = n; - } - - // Get the very last node inside the table cell - var end = currentCell.lastChild; - while (end.lastChild) { - end = end.lastChild; - } - - // Select the entire table cell. Nothing outside of the table cell should be selected. - if (end.nodeType == 3) { - rng.setEnd(end, end.data.length); - editor.selection.setRng(rng); - } - } - - editor.on('KeyDown', function () { - fixSelection(); - }); - - editor.on('MouseDown', function (e) { - if (e.button != 2) { - fixSelection(); - } - }); - } - - /** - * Delete table if all cells are selected. - */ - function deleteTable() { - function placeCaretInCell(cell) { - editor.selection.select(cell, true); - editor.selection.collapse(true); - } - - function clearCell(cell) { - editor.$(cell).empty(); - Utils.paddCell(cell); - } - - editor.on('keydown', function (e) { - if ((e.keyCode == VK.DELETE || e.keyCode == VK.BACKSPACE) && !e.isDefaultPrevented()) { - var table, tableCells, selectedTableCells, cell; - - table = editor.dom.getParent(editor.selection.getStart(), 'table'); - if (table) { - tableCells = editor.dom.select('td,th', table); - selectedTableCells = Tools.grep(tableCells, function (cell) { - return !!editor.dom.getAttrib(cell, 'data-mce-selected'); - }); - - if (selectedTableCells.length === 0) { - // If caret is within an empty table cell then empty it for real - cell = editor.dom.getParent(editor.selection.getStart(), 'td,th'); - if (editor.selection.isCollapsed() && cell && editor.dom.isEmpty(cell)) { - e.preventDefault(); - clearCell(cell); - placeCaretInCell(cell); - } - - return; - } - - e.preventDefault(); - - editor.undoManager.transact(function () { - if (tableCells.length == selectedTableCells.length) { - editor.execCommand('mceTableDelete'); - } else { - Tools.each(selectedTableCells, clearCell); - placeCaretInCell(selectedTableCells[0]); - } - }); - } - } - }); - } - - /** - * When caption is empty and we continue to delete, caption gets deleted along with the contents. - * So, we take over delete operation (both forward and backward) and once caption is empty, we do - * prevent it from disappearing. - */ - function handleDeleteInCaption() { - var ZWSP = '\uFEFF'; - - var isEmptyNode = function (node) { - return editor.dom.isEmpty(node) || node.firstChild === node.lastChild && isCaretContainer(node.firstChild); - }; - - var isTableCaption = function (node) { - return node && node.nodeName == 'CAPTION' && node.parentNode.nodeName == 'TABLE'; - }; - - var isTheHeirOf = function (heir, ancestor) { - var node = ancestor.firstChild; - do { - if (node === heir) { - return true; - } - } while ((node = node.firstChild)); return false; - }; - - var isCaretContainer = function (node) { - if (node.nodeType === 3) { - if (node.data === ZWSP) { - return true; - } - node = node.parentNode; - } - return node.nodeType === 1 && node.hasAttribute('data-mce-caret'); - }; - - var caretIsAtTheLeftEdgeOf = function (node) { - var rng = editor.selection.getRng(); - return !rng.startOffset && !rng.startContainer.previousSibling && isTheHeirOf(rng.startContainer, node); - }; - - var appendCaretContainer = function (node, isBlock) { - var caretNode; - if (!isBlock) { - caretNode = node.ownerDocument.createTextNode(ZWSP); - } else { - caretNode = editor.dom.create('p', { - 'data-mce-caret': 'after', - 'data-mce-bogus': 'all' - }, - '
'); - } - node.appendChild(caretNode); - }; - - var restoreCaretPlaceholder = function (container, insertCaret) { - var lastChild = container.lastChild; - var rng = editor.selection.getRng(); - - // save the current position of the caret to restore it later (IE requires this) - var caretContainer = rng.startContainer; - var caretOffset = rng.startOffset; - - // if container contains only debris, we replace the contents with inline caret placeholder, to avoid - // vertical stretching of the caption - if (isEmptyNode(container)) { - container.innerHTML = ZWSP; - // in IE caret springs off from the caption (to the first td), we need to bring it back - caretContainer = container.lastChild; - caretOffset = 0; - } else if (!isCaretContainer(lastChild)) { - appendCaretContainer(container, editor.dom.isBlock(lastChild)); - } - - // in IE caret is off after restoration - editor.selection.setCursorLocation(caretContainer, caretOffset); - }; - - var contractSelectionTo = function (caption) { - var rng = editor.selection.getRng(); - var newRng = editor.dom.createRng(); - var firstChild = caption.firstChild; - - if (rng.commonAncestorContainer === caption.parentNode && isTheHeirOf(rng.startContainer, caption)) { // ignore backward selections - // rng.selectNodeContents() didn't work in IE - newRng.setStart(caption, 0); - if (firstChild.nodeType === 1) { - newRng.setEnd(caption, caption.childNodes.length); - } else { - newRng.setEnd(firstChild, firstChild.nodeValue.length); - } - editor.selection.setRng(newRng); - } - }; - - editor.on('keydown', function (e) { - if (e.keyCode !== VK.DELETE && e.keyCode !== VK.BACKSPACE || e.isDefaultPrevented()) { - return; - } - - var container = editor.dom.getParent(editor.selection.getStart(), 'caption'); - if (!isTableCaption(container)) { - return; - } - - // in IE caption collapses if caret placeholder is deleted (and it is very much possible) - if (!editor.selection.isCollapsed()) { - - // in Chrome triple click selects beyond the boundaries of the caption, if then delete is pressed, - // contents are being removed with the whole caption, so make sure we stay in caption - contractSelectionTo(container); - - // if the whole contents are selected, caret placeholder will be deleted too and we take - // over delete operation here to do it manually and restore the placeholder if required - editor.undoManager.transact(function () { - editor.execCommand('Delete'); - restoreCaretPlaceholder(container); - }); - e.preventDefault(); - } else { - restoreCaretPlaceholder(container); - - if (isEmptyNode(container) || e.keyCode === VK.BACKSPACE && caretIsAtTheLeftEdgeOf(container)) { // see TINY-979 - e.preventDefault(); - } - } + }).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 }; - handleDeleteInCaption(); - deleteTable(); - - if (Env.webkit) { - moveWebKitSelection(); - fixTableCellSelection(); - } - - if (Env.gecko) { - fixBeforeTableCaretBug(); - fixTableCaretPos(); - } - - if (Env.ie > 9) { - fixBeforeTableCaretBug(); - fixTableCaretPos(); + 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) + }; -/** - * Plugin.js - * - * Released under LGPL License. - * Copyright (c) 1999-2017 Ephox Corp. All rights reserved - * - * License: http://www.tinymce.com/license - * Contributing: http://www.tinymce.com/contributing - */ - -/** - * This class contains all core logic for the table plugin. - * - * @class tinymce.table.Plugin - * @private - */ -define( - 'tinymce.plugins.table.Plugin', - [ - 'tinymce.core.dom.TreeWalker', - 'tinymce.core.Env', - 'tinymce.core.PluginManager', - 'tinymce.core.util.Tools', - 'tinymce.core.util.VK', - 'tinymce.plugins.table.model.TableGrid', - 'tinymce.plugins.table.selection.CellSelection', - 'tinymce.plugins.table.ui.Dialogs', - 'tinymce.plugins.table.ui.ResizeBars', - 'tinymce.plugins.table.util.Utils', - 'tinymce.plugins.table.util.Quirks' - ], - function (TreeWalker, Env, PluginManager, Tools, VK, TableGrid, CellSelection, Dialogs, ResizeBars, Utils, Quirks) { - var each = Tools.each; - - function Plugin(editor) { - var clipboardRows, self = this, dialogs = new Dialogs(editor), resizeBars; - - if (editor.settings.object_resizing && editor.settings.table_resize_bars !== false && - (editor.settings.object_resizing === true || editor.settings.object_resizing === 'table')) { - resizeBars = ResizeBars(editor); + 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'); + }); + }; - function cmd(command) { - return function () { - editor.execCommand(command); + 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 + }; + }; - function insertTable(cols, rows) { - var y, x, html, tableElm; + 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 }; - html = ''; + var global$1 = tinymce.util.Tools.resolve('tinymce.util.Tools'); - for (y = 0; y < rows; y++) { - html += ''; - - for (x = 0; x < cols; x++) { - html += ''; + 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 ''; } - - html += ''; } - - html += '
' + (Env.ie && Env.ie < 10 ? ' ' : '
') + '
'; - - editor.undoManager.transact(function () { - editor.insertContent(html); - - tableElm = editor.dom.get('__mce'); - editor.dom.setAttrib(tableElm, 'id', null); - - editor.$('tr', tableElm).each(function (index, row) { - editor.fire('newrow', { - node: row - }); - - editor.$('th,td', row).each(function (index, cell) { - editor.fire('newcell', { - node: cell - }); - }); - }); - - editor.dom.setAttribs(tableElm, editor.settings.table_default_attributes || {}); - editor.dom.setStyles(tableElm, editor.settings.table_default_styles || {}); - }); - - return tableElm; + 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 + }; - function handleDisabledState(ctrl, selector, sameParts) { - function bindStateListener() { - var selectedElm, selectedCells, parts = {}, sum = 0, state; - - selectedCells = editor.dom.select('td[data-mce-selected],th[data-mce-selected]'); - selectedElm = selectedCells[0]; - if (!selectedElm) { - selectedElm = editor.selection.getStart(); - } - - // Make sure that we don't have a selection inside thead and tbody at the same time - if (sameParts && selectedCells.length > 0) { - each(selectedCells, function (cell) { - return parts[cell.parentNode.parentNode.nodeName] = 1; - }); - - each(parts, function (value) { - sum += value; - }); - - state = sum !== 1; + 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 { - state = !editor.dom.getParent(selectedElm, selector); - } - - ctrl.disabled(state); - - editor.selection.selectorChanged(selector, function (state) { - ctrl.disabled(!state); - }); - } - - if (editor.initialized) { - bindStateListener(); - } else { - editor.on('init', bindStateListener); - } - } - - function postRender() { - /*jshint validthis:true*/ - handleDisabledState(this, 'table'); - } - - var hasMergedCellsSelected = function (node) { - var cell = editor.dom.getParent(node, 'th,td'); - var selectedCells = editor.dom.select('td[data-mce-selected],th[data-mce-selected]').concat(cell ? [cell] : []); - var mergedCellsSelected = Tools.grep(selectedCells, function (elm) { - return Utils.getColSpan(elm) > 1 || Utils.getRowSpan(elm) > 1; - }); - - return mergedCellsSelected.length > 0; - }; - - var postRenderSplitCell = function (e) { - var ctrl = e.control; - - ctrl.disabled(!hasMergedCellsSelected(editor.selection.getStart())); - editor.on('nodechange', function (e) { - ctrl.disabled(!hasMergedCellsSelected(e.element)); - }); - }; - - function postRenderCell() { - /*jshint validthis:true*/ - handleDisabledState(this, 'td,th'); - } - - function postRenderMergeCell() { - /*jshint validthis:true*/ - handleDisabledState(this, 'td,th', true); - } - - function generateTableGrid() { - var html = ''; - - html = ''; - - for (var y = 0; y < 10; y++) { - html += ''; - - for (var x = 0; x < 10; x++) { - html += ''; - } - - html += ''; - } - - html += '
'; - - html += ''; - - return html; - } - - function selectGrid(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; + menuItem.value = item.value; + if (itemCallback) { + itemCallback(menuItem); } } - } - - return focusCell.parentNode; + 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 + }; - if (editor.settings.table_grid === false) { - editor.addMenuItem('inserttable', { - text: 'Table', - icon: 'table', - context: 'table', - onclick: dialogs.table + 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.addMenuItem('inserttable', { - text: 'Table', - icon: 'table', - context: 'table', - ariaHideMenu: true, - onclick: function (e) { - if (e.aria) { - this.parent().hideAll(); - e.stopImmediatePropagation(); - dialogs.table(); - } - }, - onshow: function () { - selectGrid(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, 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(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(self.lastX + 1, self.lastY + 1); - }); - - editor.addVisual(); - } - } - } - ] + editor.windowManager.open({ + title: 'Cell properties', + data: data, + body: generalCellForm, + onsubmit: curry(onSubmitCellForm, editor, cells) }); } + }; + var CellDialog = { open: open }; - editor.addMenuItem('tableprops', { - text: 'Table properties', - context: 'table', - onPostRender: postRender, - onclick: dialogs.tableProps - }); - - editor.addMenuItem('deletetable', { - text: 'Delete table', - context: 'table', - onPostRender: postRender, - cmd: 'mceTableDelete' - }); - - editor.addMenuItem('cell', { - separator: 'before', - text: 'Cell', - context: 'table', - menu: [ - { text: 'Cell properties', onclick: cmd('mceTableCellProps'), onPostRender: postRenderCell }, - { text: 'Merge cells', onclick: cmd('mceTableMergeCells'), onPostRender: postRenderMergeCell }, - { text: 'Split cell', disabled: true, onclick: cmd('mceTableSplitCells'), onPostRender: postRenderSplitCell } - ] - }); - - editor.addMenuItem('row', { - text: 'Row', - context: 'table', - menu: [ - { text: 'Insert row before', onclick: cmd('mceTableInsertRowBefore'), onPostRender: postRenderCell }, - { text: 'Insert row after', onclick: cmd('mceTableInsertRowAfter'), onPostRender: postRenderCell }, - { text: 'Delete row', onclick: cmd('mceTableDeleteRow'), onPostRender: postRenderCell }, - { text: 'Row properties', onclick: cmd('mceTableRowProps'), onPostRender: postRenderCell }, - { text: '-' }, - { text: 'Cut row', onclick: cmd('mceTableCutRow'), onPostRender: postRenderCell }, - { text: 'Copy row', onclick: cmd('mceTableCopyRow'), onPostRender: postRenderCell }, - { text: 'Paste row before', onclick: cmd('mceTablePasteRowBefore'), onPostRender: postRenderCell }, - { text: 'Paste row after', onclick: cmd('mceTablePasteRowAfter'), onPostRender: postRenderCell } - ] - }); - - editor.addMenuItem('column', { - text: 'Column', - context: 'table', - menu: [ - { text: 'Insert column before', onclick: cmd('mceTableInsertColBefore'), onPostRender: postRenderCell }, - { text: 'Insert column after', onclick: cmd('mceTableInsertColAfter'), onPostRender: postRenderCell }, - { text: 'Delete column', onclick: cmd('mceTableDeleteCol'), onPostRender: postRenderCell } - ] - }); - - var menuItems = []; - each("inserttable tableprops deletetable | cell row column".split(' '), function (name) { - if (name == '|') { - menuItems.push({ text: '-' }); - } else { - menuItems.push(editor.menuItems[name]); + 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; } }); - - editor.addButton("table", { - type: "menubutton", - title: "Table", - menu: menuItems - }); - - // Select whole table is a table border is clicked - if (!Env.isIE) { - editor.on('click', function (e) { - e = e.target; - - if (e.nodeName === 'TABLE') { - editor.selection.select(e); - editor.nodeChanged(); - } - }); + if (hasAdvancedRowTab(editor)) { + global$1.extend(data, Helpers.extractAdvancedStyles(dom, elm)); } - - self.quirks = new Quirks(editor); - - editor.on('Init', function () { - self.cellSelection = new CellSelection(editor, function (selecting) { - if (selecting && resizeBars) { - resizeBars.clearBars(); - } - }); - self.resizeBars = resizeBars; - }); - - editor.on('PreInit', function () { - // Remove internal data attributes - editor.serializer.addAttributeFilter( - 'data-mce-cell-padding,data-mce-border,data-mce-border-color', - function (nodes, name) { - - var i = nodes.length; - - while (i--) { - nodes[i].attr(name, null); - } - }); - }); - - // Register action commands - each({ - mceTableSplitCells: function (grid) { - grid.split(); - }, - - mceTableMergeCells: function (grid) { - var cell; - - cell = editor.dom.getParent(editor.selection.getStart(), 'th,td'); - - if (!editor.dom.select('td[data-mce-selected],th[data-mce-selected]').length) { - dialogs.merge(grid, cell); + 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 { - grid.merge(); + tableElm.insertBefore(parentElm, tableElm.firstChild); } - }, - - mceTableInsertRowBefore: function (grid) { - grid.insertRows(true); - }, - - mceTableInsertRowAfter: function (grid) { - grid.insertRows(); - }, - - mceTableInsertColBefore: function (grid) { - grid.insertCols(true); - }, - - mceTableInsertColAfter: function (grid) { - grid.insertCols(); - }, - - mceTableDeleteCol: function (grid) { - grid.deleteCols(); - }, - - mceTableDeleteRow: function (grid) { - grid.deleteRows(); - }, - - mceTableCutRow: function (grid) { - clipboardRows = grid.cutRows(); - }, - - mceTableCopyRow: function (grid) { - clipboardRows = grid.copyRows(); - }, - - mceTablePasteRowBefore: function (grid) { - grid.pasteRows(clipboardRows, true); - }, - - mceTablePasteRowAfter: function (grid) { - grid.pasteRows(clipboardRows); - }, - - mceSplitColsBefore: function (grid) { - grid.splitCols(true); - }, - - mceSplitColsAfter: function (grid) { - grid.splitCols(false); - }, - - mceTableDelete: function (grid) { - if (resizeBars) { - resizeBars.clearBars(); - } - grid.deleteTable(); + } else { + tableElm.appendChild(parentElm); } - }, function (func, name) { - editor.addCommand(name, function () { - var grid = new TableGrid(editor); - - if (grid) { - func(grid); - editor.execCommand('mceRepaint'); - self.cellSelection.clear(); + } + 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 }; - // Register dialog commands - each({ - mceInsertTable: dialogs.table, - mceTableProps: function () { - dialogs.table(true); + 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); }, - mceTableRowProps: dialogs.row, - mceTableCellProps: dialogs.cell + 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 }; - function addButtons() { - editor.addButton('tableprops', { - title: 'Table properties', - onclick: dialogs.tableProps, - icon: 'table' + 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; }); - - editor.addButton('tabledelete', { - title: 'Delete table', - onclick: cmd('mceTableDelete') + }; + 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 + }; + }; - editor.addButton('tablecellprops', { - title: 'Cell properties', - onclick: cmd('mceTableCellProps') - }); + 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 }; - 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') - }); - - } - - function isTable(table) { - - var selectorMatched = editor.dom.is(table, 'table') && editor.getBody().contains(table); - - return selectorMatched; - } - - function addToolbars() { - var toolbarItems = editor.settings.table_toolbar; - - if (toolbarItems === '' || toolbarItems === false) { + 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); + }; - if (!toolbarItems) { - toolbarItems = 'tableprops tabledelete | ' + - 'tableinsertrowbefore tableinsertrowafter tabledeleterow | ' + - 'tableinsertcolbefore tableinsertcolafter tabledeletecol'; + 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]; } - - editor.addContextToolbar( - isTable, - toolbarItems - ); - } - - function getClipboardRows() { - return clipboardRows; - } - - function setClipboardRows(rows) { - clipboardRows = rows; - } - - addButtons(); - addToolbars(); - - // Enable tab key cell navigation - if (editor.settings.table_tab_navigation !== false) { - editor.on('keydown', function (e) { - var cellElm, grid, delta; - var selectionStart = editor.selection.getStart(); - - if (e.keyCode === VK.TAB) { - if (editor.dom.getParent(selectionStart, 'LI,DT,DD')) { - return; - } - - cellElm = editor.dom.getParent(selectionStart, 'th,td'); - - if (cellElm) { - e.preventDefault(); - - grid = new TableGrid(editor); - delta = e.shiftKey ? -1 : 1; - - editor.undoManager.transact(function () { - if (!grid.moveRelIdx(cellElm, delta) && delta > 0) { - grid.insertRow(); - grid.refresh(); - grid.moveRelIdx(cellElm, delta); - } - }); + 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); - self.insertTable = insertTable; - self.setClipboardRows = setClipboardRows; - self.getClipboardRows = getClipboardRows; + 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 + }; } - PluginManager.add('table', Plugin); + function NoDrag () { + return { + onEvent: noop, + reset: noop + }; + } - return function () { }; - } -); + 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 + }; + } -dem('tinymce.plugins.table.Plugin')(); + 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 + }; + }; + + var create$2 = function (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 TableResize = { create: create$2 }; + + 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.create(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(__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$3 = Immutable('start', 'soffset', 'finish', 'foffset'); + var SimRange = { create: create$3 }; + + 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$4 = Immutable('selection', 'kill'); + var Response = { create: create$4 }; + + var create$5 = function (start, soffset, finish, foffset) { + return { + start: constant(Situ.on(start, soffset)), + finish: constant(Situ.on(finish, foffset)) + }; + }; + var Situs = { create: create$5 }; + + 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(__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; + } + if (global$2.ie && global$2.ie >= 12 && raw.buttons === 0) { + 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)); })(); diff --git a/wp-content/plugins/tinymce-advanced/mce/table/plugin.min.js b/wp-content/plugins/tinymce-advanced/mce/table/plugin.min.js index 178af251..80d078b4 100644 --- a/wp-content/plugins/tinymce-advanced/mce/table/plugin.min.js +++ b/wp-content/plugins/tinymce-advanced/mce/table/plugin.min.js @@ -1,2 +1 @@ -!function(){var a={},b=function(b){for(var c=a[b],e=c.deps,f=c.defn,g=e.length,h=new Array(g),i=0;i9)&&(b.hasChildNodes()||(b.innerHTML='
'))}var c=function(a){return function(b,c){b&&(c=parseInt(c,10),1===c||0===c?b.removeAttribute(a,1):b.setAttribute(a,c,1))}},d=function(a){return function(b){return parseInt(b.getAttribute(a)||1,10)}};return{setColSpan:c("colSpan"),setRowSpan:c("rowspan"),getColSpan:d("colSpan"),getRowSpan:d("rowSpan"),setSpanVal:function(a,b,d){c(b)(a,d)},getSpanVal:function(a,b){return d(b)(a)},paddCell:b}}),g("d",["4","a"],function(a,b){var c=function(a,b,c){return a[c]?a[c][b]:null},d=function(a,b,d){var e=c(a,b,d);return e?e.elm:null},e=function(a,b,e,f){var g,h,i=0,j=d(a,b,e);for(g=e;(f>0?g=0)&&(h=c(a,b,g),j===h.elm);g+=f)i++;return i},f=function(a,b,c){for(var d,e=a[c],f=b;f'),!1},"childNodes"),d=q(d,!1),p(d),g(d,"rowSpan",1),g(d,"colSpan",1),f?d.appendChild(f):c.paddCell(d),d}function z(){var a,b=ca.createRng();return e(ca.select("tr",i),function(a){0===a.cells.length&&ca.remove(a)}),0===ca.select("tr",i).length?(b.setStartBefore(i),b.setEndBefore(i),ba.setRng(b),void ca.remove(i)):(e(ca.select("thead,tbody,tfoot",i),function(a){0===a.rows.length&&ca.remove(a)}),n(),void(_&&(a=Z[Math.min(Z.length-1,_.y)],a&&(ba.select(a[Math.min(a.length-1,_.x)].elm,!0),ba.collapse(!0)))))}function A(a,b,c,d){var e,f,g,h,i;for(e=Z[b][a].elm.parentNode,g=1;g<=c;g++)if(e=ca.getNext(e,"tr")){for(f=a;f>=0;f--)if(i=Z[b+g][f].elm,i.parentNode==e){for(h=1;h<=d;h++)ca.insertAfter(y(i),i);break}if(f==-1)for(h=1;h<=d;h++)e.insertBefore(y(e.cells[0]),e.cells[0])}}function B(){e(Z,function(a,b){e(a,function(a,c){var d,e,h;if(u(a)&&(a=a.elm,d=f(a,"colspan"),e=f(a,"rowspan"),d>1||e>1)){for(g(a,"rowSpan",1),g(a,"colSpan",1),h=0;hc)&&d.push(a[e]);return d}function D(b){return a.grep(b,function(a){return a.real===!1})}function E(a){for(var b=[],c=0;c1&&(x=1),g(o,"colSpan",w),g(o,"rowSpan",x),m=i;m<=k;m++)for(l=h;l<=j;l++)Z[m]&&Z[m][l]&&(b=Z[m][l].elm,b!=o&&(q=a.grep(b.childNodes),e(q,function(a){o.appendChild(a)}),q.length&&(q=a.grep(o.childNodes),s=0,e(q,function(a){"BR"==a.nodeName&&s++0&&Z[b-1][h]&&(l=Z[b-1][h].elm,m=f(l,"rowSpan"),m>1)){g(l,"rowSpan",m+1);continue}}else if(m=f(c,"rowspan"),m>1){g(c,"rowSpan",m+1);continue}k=y(c),g(k,"colSpan",c.colSpan),j.appendChild(k),d=c}j.hasChildNodes()&&(a?i.parentNode.insertBefore(j,i):ca.insertAfter(j,i))}}function J(a,b){b=b||v().length||1;for(var c=0;c1?g(c,"colSpan",b-1):ca.remove(c)}),b.push(d))})}),z()}function P(){function a(a){var b,c;e(a.cells,function(a){var c=f(a,"rowSpan");c>1&&(g(a,"rowSpan",c-1),b=T(a),A(b.x,b.y,1,1))}),b=T(a.cells[0]),e(Z[b.y],function(a){var b;a=a.elm,a!=c&&(b=f(a,"rowSpan"),b<=1?ca.remove(a):g(a,"rowSpan",b-1),c=a)})}var b;b=v(),l(i)&&b.length==i.rows.length||(e(b.reverse(),function(b){a(b)}),z())}function Q(){var a=v();if(!l(i)||a.length!=i.rows.length)return ca.remove(a),z(),a}function R(){var a=v();return e(a,function(b,c){a[c]=q(b,!0)}),a}function S(b,c){var h,i,j,l=[];b&&(h=d.splitAt(Z,_.x,_.y,c),i=h.row,a.each(h.cells,p),j=a.map(b,function(a){return a.cloneNode(!0)}),e(j,function(a,b,d){var h,j,k,m,n=a.cells.length,q=0;for(o(a),h=0;h1&&(q--,b+k>d.length?(k=d.length-b,g(j,"rowSpan",k),l.push(d.length-1)):l.push(b+k-1)),p(j);for(e(l,function(a){b<=a&&q++}),h=q;h<$;h++)a.appendChild(y(a.cells[n-1]));for(h=$;h1?g(j,"colSpan",m-1):ca.remove(j);c?i.parentNode.insertBefore(a,i):i=ca.insertAfter(a,i)}),k())}function T(a){var b;return e(Z,function(c,d){return e(c,function(c,e){if(c.elm==a)return b={x:e,y:d},!1}),!b}),b}function U(a){_=T(a)}function V(){var a,b;return a=b=0,e(Z,function(c,d){e(c,function(c,e){var f,g;u(c)&&(c=Z[d][e],e>a&&(a=e),d>b&&(b=d),c.real&&(f=c.colspan-1,g=c.rowspan-1,f&&e+f>a&&(a=e+f),g&&d+g>b&&(b=d+g)))})}),{x:a,y:b}}function W(a){var b,c,d,e,f,g,h,i,j,l;if(aa=T(a),_&&aa){for(b=Math.min(_.x,aa.x),c=Math.min(_.y,aa.y),d=Math.max(_.x,aa.x),e=Math.max(_.y,aa.y),f=d,g=e,l=c;l<=e;l++)for(j=b;j<=d;j++)a=Z[l][j],a.real&&(h=a.colspan-1,i=a.rowspan-1,h&&j+h>f&&(f=j+h),i&&l+i>g&&(g=l+i));for(k(),l=c;l<=g;l++)for(j=b;j<=f;j++)Z[l][j]&&ca.setAttrib(Z[l][j].elm,"data-mce-selected","1")}}function X(a,b){var c,d,e;c=T(a),d=c.y*$+c.x;do{if(d+=b,e=r(d%$,Math.floor(d/$)),!e)break;if(e.elm!=a)return ba.select(e.elm,!0),ca.isEmpty(e.elm)&&ba.collapse(!0),!0}while(e.elm==a);return!1}function Y(b){if(_){var c=d.splitAt(Z,_.x,_.y,b);a.each(c.cells,p)}}var Z,$,_,aa,ba=h.selection,ca=ba.dom;i=i||ca.getParent(ba.getStart(!0),"table"),n(),j=j||ca.getParent(ba.getStart(!0),"th,td"),j&&(_=T(j),aa=V(),j=r(_.x,_.y)),a.extend(this,{deleteTable:x,split:B,merge:H,insertRow:I,insertRows:J,insertCol:K,insertCols:L,splitCols:Y,deleteCols:O,deleteRows:P,cutRows:Q,copyRows:R,pasteRows:S,getPos:T,setStartCell:U,setEndCell:W,moveRelIdx:X,refresh:n})}}),g("7",["6","1","4"],function(a,b,c){return function(d,e){function f(a){d.getBody().style.webkitUserSelect="",(a||p)&&(d.$("td[data-mce-selected],th[data-mce-selected]").removeAttr("data-mce-selected"),p=!1)}function g(a,b){return!(!a||!b)&&a===o.getParent(b,"table")}function h(b){var c,f,h=b.target;if(!m&&!n&&h!==l&&(l=h,k&&j)){if(f=o.getParent(h,"td,th"),g(k,f)||(f=o.getParent(k,"td,th")),j===f&&!p)return;if(e(!0),g(k,f)){b.preventDefault(),i||(i=new a(d,k,j),d.getBody().style.webkitUserSelect="none"),i.setEndCell(f),p=!0,c=d.selection.getSel();try{c.removeAllRanges?c.removeAllRanges():c.empty()}catch(a){}}}}var i,j,k,l,m,n,o=d.dom,p=!0,q=function(){j=i=k=l=null,e(!1)};return d.on("SelectionChange",function(a){p&&a.stopImmediatePropagation()},!0),d.on("MouseDown",function(a){2==a.button||m||n||(f(),j=o.getParent(a.target,"td,th"),k=o.getParent(j,"table"))}),d.on("mouseover",h),d.on("remove",function(){o.unbind(d.getDoc(),"mouseover",h),f()}),d.on("MouseUp",function(){function a(a,d){var f=new b(a,a);do{if(3==a.nodeType&&0!==c.trim(a.nodeValue).length)return void(d?e.setStart(a,0):e.setEnd(a,a.nodeValue.length));if("BR"==a.nodeName)return void(d?e.setStartBefore(a):e.setEndBefore(a))}while(a=d?f.next():f.prev())}var e,f,g,h,k,l=d.selection;if(j){if(i&&(d.getBody().style.webkitUserSelect=""),f=o.select("td[data-mce-selected],th[data-mce-selected]"),f.length>0){e=o.createRng(),h=f[0],e.setStartBefore(h),e.setEndAfter(h),a(h,1),g=new b(h,o.getParent(f[0],"table"));do if("TD"==h.nodeName||"TH"==h.nodeName){if(!o.getAttrib(h,"data-mce-selected"))break;k=h}while(h=g.next());a(k),l.setRng(e)}d.nodeChanged(),q()}}),d.on("KeyUp Drop SetContent",function(a){f("setcontent"==a.type),q(),m=!1}),d.on("ObjectResizeStart ObjectResized",function(a){m="objectresized"!=a.type}),d.on("dragstart",function(){n=!0}),d.on("drop dragend",function(){n=!1}),{clear:f}}}),g("8",["4","2"],function(a,b){var c=a.each;return function(d){function e(){var a=d.settings.color_picker_callback;if(a)return function(){var b=this;a.call(d,function(a){b.value(a).fire("change")},b.value())}}function f(a){return{title:"Advanced",type:"form",defaults:{onchange:function(){l(a,this.parents().reverse()[0],"style"==this.name())}},items:[{label:"Style",name:"style",type:"textbox"},{type:"form",padding:0,formItemDefaults:{layout:"grid",alignH:["start","right"]},defaults:{size:7},items:[{label:"Border color",type:"colorbox",name:"borderColor",onaction:e()},{label:"Background color",type:"colorbox",name:"backgroundColor",onaction:e()}]}]}}function g(a){return a?a.replace(/px$/,""):""}function h(a){return/^[0-9]+$/.test(a)&&(a+="px"),a}function i(a){c("left center right".split(" "),function(b){d.formatter.remove("align"+b,{},a)})}function j(a){c("top middle bottom".split(" "),function(b){d.formatter.remove("valign"+b,{},a)})}function k(b,c,d){function e(b,d){return d=d||[],a.each(b,function(a){var b={text:a.text||a.title};a.menu?b.menu=e(a.menu):(b.value=a.value,c&&c(b)),d.push(b)}),d}return e(b,d||[])}function l(a,b,c){var d=b.toJSON(),e=a.parseStyle(d.style);c?(b.find("#borderColor").value(e["border-color"]||"")[0].fire("change"),b.find("#backgroundColor").value(e["background-color"]||"")[0].fire("change")):(e["border-color"]=d.borderColor,e["background-color"]=d.backgroundColor),b.find("#style").value(a.serializeStyle(a.parseStyle(a.serializeStyle(e))))}function m(a,b,c){var d=a.parseStyle(a.getAttrib(c,"style"));d["border-color"]&&(b.borderColor=d["border-color"]),d["background-color"]&&(b.backgroundColor=d["background-color"]),b.style=a.serializeStyle(d)}function n(a,b,d){var e=a.parseStyle(a.getAttrib(b,"style"));c(d,function(a){e[a.name]=a.value}),a.setAttrib(b,"style",a.serializeStyle(a.parseStyle(a.serializeStyle(e))))}var o=this;o.tableProps=function(){o.table(!0)},o.table=function(e){function j(){function c(a,b,d){if("TD"===a.tagName||"TH"===a.tagName)v.setStyle(a,b,d);else if(a.children)for(var e=0;e',p.insertBefore(e,p.firstChild)),i(p),w.align&&d.formatter.apply("align"+w.align,{},p),d.focus(),d.addVisual()})}function o(a,b){function c(a,c){for(var d=0;d1?p={width:"",height:"",scope:"","class":"",align:"",style:"",type:o.nodeName.toLowerCase()}:(p={width:g(r.getStyle(o,"width")||r.getAttrib(o,"width")),height:g(r.getStyle(o,"height")||r.getAttrib(o,"height")),scope:r.getAttrib(o,"scope"),"class":r.getAttrib(o,"class")},p.type=o.nodeName.toLowerCase(),c("left center right".split(" "),function(a){d.formatter.matchNode(o,"align"+a)&&(p.align=a)}),c("top middle bottom".split(" "),function(a){d.formatter.matchNode(o,"valign"+a)&&(p.valign=a)}),m(r,p,o)),d.settings.table_cell_class_list&&(q={name:"class",type:"listbox",label:"Class",values:k(d.settings.table_cell_class_list,function(a){a.value&&(a.textStyle=function(){return d.formatter.getCssText({block:"td",classes:[a.value]})})})});var t={type:"form",layout:"flex",direction:"column",labelGapCalc:"children",padding:0,items:[{type:"form",layout:"grid",columns:2,labelGapCalc:!1,padding:0,defaults:{type:"textbox",maxWidth:50},items:[{label:"Width",name:"width"},{label:"Height",name:"height"},{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"}]}]},q]};d.settings.table_cell_advtab!==!1?d.windowManager.open({title:"Cell properties",bodyType:"tabpanel",data:p,body:[{title:"General",type:"form",items:t},f(r)],onsubmit:n}):d.windowManager.open({title:"Cell properties",data:p,body:t,onsubmit:n})}},o.row=function(){function b(a,b,c){(1===u.length||c)&&t.setAttrib(a,b,c)}function e(a,b,c){(1===u.length||c)&&t.setStyle(a,b,c)}function j(){var f,g,j;l(t,this),r=a.extend(r,this.toJSON()),d.undoManager.transact(function(){var a=r.type;c(u,function(c){b(c,"scope",r.scope),b(c,"style",r.style),b(c,"class",r["class"]),e(c,"height",h(r.height)),a!==c.parentNode.nodeName.toLowerCase()&&(f=t.getParent(c,"table"),g=c.parentNode,j=t.select(a,f)[0],j||(j=t.create(a),f.firstChild?"CAPTION"===f.firstChild.nodeName?t.insertAfter(j,f.firstChild):f.insertBefore(j,f.firstChild):f.appendChild(j)),j.appendChild(c),g.hasChildNodes()||t.remove(g)),1===u.length&&i(c),r.align&&d.formatter.apply("align"+r.align,{},c)}),d.focus()})}var n,o,p,q,r,s,t=d.dom,u=[];n=d.dom.getParent(d.selection.getStart(),"table"),o=d.dom.getParent(d.selection.getStart(),"td,th"),c(n.rows,function(a){c(a.cells,function(b){if(t.getAttrib(b,"data-mce-selected")||b==o)return u.push(a),!1})}),p=u[0],p&&(u.length>1?r={height:"",scope:"","class":"",align:"",type:p.parentNode.nodeName.toLowerCase()}:(r={height:g(t.getStyle(p,"height")||t.getAttrib(p,"height")),scope:t.getAttrib(p,"scope"),"class":t.getAttrib(p,"class")},r.type=p.parentNode.nodeName.toLowerCase(),c("left center right".split(" "),function(a){d.formatter.matchNode(p,"align"+a)&&(r.align=a)}),m(t,r,p)),d.settings.table_row_class_list&&(q={name:"class",type:"listbox",label:"Class",values:k(d.settings.table_row_class_list,function(a){a.value&&(a.textStyle=function(){return d.formatter.getCssText({block:"tr",classes:[a.value]})})})}),s={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"},q]},d.settings.table_row_advtab!==!1?d.windowManager.open({title:"Row properties",data:r,bodyType:"tabpanel",body:[{title:"General",type:"form",items:s},f(t)],onsubmit:j}):d.windowManager.open({title:"Row properties",data:r,body:s,onsubmit:j}))}}}),g("9",["4","5"],function(a,b){var c;return function(d){function e(a,b){return{index:a,y:d.dom.getPos(b).y}}function f(a,b){return{index:a,y:d.dom.getPos(b).y+b.offsetHeight}}function g(a,b){return{index:a,x:d.dom.getPos(b).x}}function h(a,b){return{index:a,x:d.dom.getPos(b).x+b.offsetWidth}}function i(){var a=d.getBody().dir;return"rtl"===a}function j(){return d.inline}function k(){return j?d.getBody().ownerDocument.body:d.getBody()}function l(a,b){return i()?h(a,b):g(a,b)}function m(a,b){return i()?g(a,b):h(a,b)}function n(a,b){return o(a,"width")/o(b,"width")*100}function o(a,b){var c=d.dom.getStyle(a,b,!0),e=parseInt(c,10);return e}function p(a){var b=o(a,"width"),c=o(a.parentElement,"width");return b/c*100}function q(a,b){var c=o(a,"width");return b/c*100}function r(a,b){var c=o(a.parentElement,"width");return b/c*100}function s(a,b,c){for(var d=[],e=1;e0?s(e,f,g):[],k=h.length>0?s(l,m,h):[];w(j,a.offsetWidth,i),x(k,a.offsetHeight,i)}function F(a,b,c,d){if(b<0||b>=a.length-1)return"";var e=a[b];if(e)e={value:e,delta:0};else for(var f=a.slice(0,b).reverse(),g=0;g0?e:f}function I(b,c,d){for(var e=C(b),f=a.map(e,function(a){return l(a.colIndex,a.element).x}),g=[],h=0;h1?F(f,h):H(e[h].element,c,d);j=j?j:va,g.push(j)}return g}function J(a){var b=G(a,"height"),c=parseInt(b,10);return Q(b)&&(c=0),!isNaN(c)&&c>0?c:o(a,"height")}function K(b){for(var c=D(b),d=a.map(c,function(a){return e(a.rowIndex,a.element).y}),f=[],g=0;g1?F(d,g):J(c[g].element);i=i?i:wa,f.push(i)}return f}function L(b,c,d,e,f){function g(b){return a.map(b,function(){return 0})}function h(){var a;if(f)a=[100-l[0]];else{var b=Math.max(e,l[0]+d);a=[b-l[0]]}return a}function i(a,b){var c,f=g(l.slice(0,a)),h=g(l.slice(b+1));if(d>=0){var i=Math.max(e,l[b]-d);c=f.concat([d,i-l[b]]).concat(h)}else{var j=Math.max(e,l[a]+d),k=l[a]-j;c=f.concat([j-l[a],k]).concat(h)}return c}function j(a,b){var c,f=g(l.slice(0,b));if(d>=0)c=f.concat([d]);else{var h=Math.max(e,l[b]+d);c=f.concat([h-l[b]])}return c}var k,l=b.slice(0);return k=0===b.length?[]:1===b.length?h():0===c?i(0,1):c>0&&c=1&&S(c,b,a)}else if(_(ia)){var g=parseInt(d.dom.getAttrib(ia,pa),10),h=d.dom.getPos(ia).y;a=parseInt(d.dom.getAttrib(ia,oa),10),b=h-g,Math.abs(b)>=1&&T(c,b,a)}u(c),d.nodeChanged()}}function Z(a,b){ha=ha?ha:W(),ga=!0,d.dom.addClass(a,xa),ia=a,X(ha,b),d.dom.add(k(),ha)}function $(a){return d.dom.hasClass(a,qa)}function _(a){return d.dom.hasClass(a,ma)}function aa(a){ja=void 0!==ja?ja:a.clientX;var b=a.clientX-ja;ja=a.clientX;var c=d.dom.getPos(ia).x;d.dom.setStyle(ia,"left",c+b+"px")}function ba(a){ka=void 0!==ka?ka:a.clientY;var b=a.clientY-ka;ka=a.clientY;var c=d.dom.getPos(ia).y;d.dom.setStyle(ia,"top",c+b+"px")}function ca(a){ja=void 0,Z(a,aa)}function da(a){ka=void 0,Z(a,ba)}function ea(a){var b=a.target,e=d.getBody();if(d.$.contains(e,c)||c===e)if($(b)){a.preventDefault();var f=d.dom.getPos(b).x;d.dom.setAttrib(b,ta,f),ca(b)}else if(_(b)){a.preventDefault();var g=d.dom.getPos(b).y;d.dom.setAttrib(b,pa,g),da(b)}else t()}var fa,ga,ha,ia,ja,ka,la="mce-resize-bar",ma="mce-resize-bar-row",na="row-resize",oa="data-row",pa="data-initial-top",qa="mce-resize-bar-col",ra="col-resize",sa="data-col",ta="data-initial-left",ua=4,va=10,wa=10,xa="mce-resize-bar-dragging",ya=new RegExp(/(\d+(\.\d+)?%)/),za=new RegExp(/px|em/); -return d.on("init",function(){d.dom.bind(k(),"mousedown",ea)}),d.on("ObjectResized",function(b){var c=b.target;if("TABLE"===c.nodeName){var e=[];a.each(c.rows,function(b){a.each(b.cells,function(a){var b=d.dom.getStyle(a,"width",!0);e.push({cell:a,width:b})})}),a.each(e,function(a){d.dom.setStyle(a.cell,"width",a.width),d.dom.setAttrib(a.cell,"width",null)})}}),d.on("mouseover",function(a){if(!ga){var b=d.dom.getParent(a.target,"table");("TABLE"===a.target.nodeName||b)&&(c=b,u(b))}}),d.on("keydown",function(a){switch(a.keyCode){case b.LEFT:case b.RIGHT:case b.UP:case b.DOWN:t()}}),d.on("remove",function(){t(),d.dom.unbind(k(),"mousedown",ea)}),{adjustWidth:S,adjustHeight:T,clearBars:t,drawBars:E,determineDeltas:L,getTableGrid:z,getTableDetails:y,getWidths:I,getPixelHeights:K,isPercentageBasedSize:Q,isPixelBasedSize:R,recalculateWidths:N,recalculateCellHeights:O,recalculateRowHeights:P}}}),g("e",["c"],function(a){return a("tinymce.util.Delay")}),g("b",["5","e","2","4","a"],function(a,b,c,d,e){var f=d.each,g=e.getSpanVal;return function(h){function i(){function c(c){function d(a,b){var d=a?"previousSibling":"nextSibling",f=h.dom.getParent(b,"tr"),g=f[d];if(g)return r(h,b,g,a),c.preventDefault(),!0;var i=h.dom.getParent(f,"table"),l=f.parentNode,m=l.nodeName.toLowerCase();if("tbody"===m||m===(a?"tfoot":"thead")){var n=e(a,i,l,"tbody");if(null!==n)return j(a,n,b)}return k(a,f,d,i)}function e(a,b,c,d){var e=h.dom.select(">"+d,b),f=e.indexOf(c);if(a&&0===f||!a&&f===e.length-1)return i(a,b);if(f===-1){var g="thead"===c.tagName.toLowerCase()?0:e.length-1;return e[g]}return e[f+(a?-1:1)]}function i(a,b){var c=a?"thead":"tfoot",d=h.dom.select(">"+c,b);return 0!==d.length?d[0]:null}function j(a,b,d){var e=l(b,a);return e&&r(h,d,e,a),c.preventDefault(),!0}function k(a,b,e,f){var g=f[e];if(g)return m(g),!0;var i=h.dom.getParent(f,"td,th");if(i)return d(a,i,c);var j=l(b,!a);return m(j),c.preventDefault(),!1}function l(a,b){var c=a&&a[b?"lastChild":"firstChild"];return c&&"BR"===c.nodeName?h.dom.getParent(c,"td,th"):c}function m(a){h.selection.select(a,!0),h.selection.collapse(!0)}function n(){return u==a.UP||u==a.DOWN}function o(a){var b=a.selection.getNode(),c=a.dom.getParent(b,"tr");return null!==c}function p(a){for(var b=0,c=a;c.previousSibling;)c=c.previousSibling,b+=g(c,"colspan");return b}function q(a,b){var c=0,d=0;return f(a.children,function(a,e){if(c+=g(a,"colspan"),d=e,c>b)return!1}),d}function r(a,b,c,d){var e=p(h.dom.getParent(b,"td,th")),f=q(c,e),g=c.childNodes[f],i=l(g,d);m(i||g)}function s(a){var b=h.selection.getNode(),c=h.dom.getParent(b,"td,th"),d=h.dom.getParent(a,"td,th");return c&&c!==d&&t(c,d)}function t(a,b){return h.dom.getParent(a,"TABLE")===h.dom.getParent(b,"TABLE")}var u=c.keyCode;if(n()&&o(h)){var v=h.selection.getNode();b.setEditorTimeout(h,function(){s(v)&&d(!c.shiftKey&&u===a.UP,v,c)},0)}}h.on("KeyDown",function(a){c(a)})}function j(){function a(a,b){var c,d=b.ownerDocument,e=d.createRange();return e.setStartBefore(b),e.setEnd(a.endContainer,a.endOffset),c=d.createElement("body"),c.appendChild(e.cloneContents()),0===c.innerHTML.replace(/<(br|img|object|embed|input|textarea)[^>]*>/gi,"-").replace(/<[^>]+>/g,"").length}h.on("KeyDown",function(b){var c,d,e=h.dom;37!=b.keyCode&&38!=b.keyCode||(c=h.selection.getRng(),d=e.getParent(c.startContainer,"table"),d&&h.getBody().firstChild==d&&a(c,d)&&(c=e.createRng(),c.setStartBefore(d),c.setEndBefore(d),h.selection.setRng(c),b.preventDefault()))})}function k(){h.on("KeyDown SetContent VisualAid",function(){var a;for(a=h.getBody().lastChild;a;a=a.previousSibling)if(3==a.nodeType){if(a.nodeValue.length>0)break}else if(1==a.nodeType&&("BR"==a.tagName||!a.getAttribute("data-mce-bogus")))break;a&&"TABLE"==a.nodeName&&(h.settings.forced_root_block?h.dom.add(h.getBody(),h.settings.forced_root_block,h.settings.forced_root_block_attrs,c.ie&&c.ie<10?" ":'
'):h.dom.add(h.getBody(),"br",{"data-mce-bogus":"1"}))}),h.on("PreProcess",function(a){var b=a.node.lastChild;b&&("BR"==b.nodeName||1==b.childNodes.length&&("BR"==b.firstChild.nodeName||"\xa0"==b.firstChild.nodeValue))&&b.previousSibling&&"TABLE"==b.previousSibling.nodeName&&h.dom.remove(b)})}function l(){function a(a,b,c,d){var e,f,g,h=3,i=a.dom.getParent(b.startContainer,"TABLE");return i&&(e=i.parentNode),f=b.startContainer.nodeType==h&&0===b.startOffset&&0===b.endOffset&&d&&("TR"==c.nodeName||c==e),g=("TD"==c.nodeName||"TH"==c.nodeName)&&!d,f||g}function b(){var b=h.selection.getRng(),c=h.selection.getNode(),d=h.dom.getParent(b.startContainer,"TD,TH");if(a(h,b,c,d)){d||(d=c);for(var e=d.lastChild;e.lastChild;)e=e.lastChild;3==e.nodeType&&(b.setEnd(e,e.data.length),h.selection.setRng(b))}}h.on("KeyDown",function(){b()}),h.on("MouseDown",function(a){2!=a.button&&b()})}function m(){function b(a){h.selection.select(a,!0),h.selection.collapse(!0)}function c(a){h.$(a).empty(),e.paddCell(a)}h.on("keydown",function(e){if((e.keyCode==a.DELETE||e.keyCode==a.BACKSPACE)&&!e.isDefaultPrevented()){var f,g,i,j;if(f=h.dom.getParent(h.selection.getStart(),"table")){if(g=h.dom.select("td,th",f),i=d.grep(g,function(a){return!!h.dom.getAttrib(a,"data-mce-selected")}),0===i.length)return j=h.dom.getParent(h.selection.getStart(),"td,th"),void(h.selection.isCollapsed()&&j&&h.dom.isEmpty(j)&&(e.preventDefault(),c(j),b(j)));e.preventDefault(),h.undoManager.transact(function(){g.length==i.length?h.execCommand("mceTableDelete"):(d.each(i,c),b(i[0]))})}}})}function n(){var b="\ufeff",c=function(a){return h.dom.isEmpty(a)||a.firstChild===a.lastChild&&f(a.firstChild)},d=function(a){return a&&"CAPTION"==a.nodeName&&"TABLE"==a.parentNode.nodeName},e=function(a,b){var c=b.firstChild;do if(c===a)return!0;while(c=c.firstChild);return!1},f=function(a){if(3===a.nodeType){if(a.data===b)return!0;a=a.parentNode}return 1===a.nodeType&&a.hasAttribute("data-mce-caret")},g=function(a){var b=h.selection.getRng();return!b.startOffset&&!b.startContainer.previousSibling&&e(b.startContainer,a)},i=function(a,c){var d;d=c?h.dom.create("p",{"data-mce-caret":"after","data-mce-bogus":"all"},'
'):a.ownerDocument.createTextNode(b),a.appendChild(d)},j=function(a,d){var e=a.lastChild,g=h.selection.getRng(),j=g.startContainer,k=g.startOffset;c(a)?(a.innerHTML=b,j=a.lastChild,k=0):f(e)||i(a,h.dom.isBlock(e)),h.selection.setCursorLocation(j,k)},k=function(a){var b=h.selection.getRng(),c=h.dom.createRng(),d=a.firstChild;b.commonAncestorContainer===a.parentNode&&e(b.startContainer,a)&&(c.setStart(a,0),1===d.nodeType?c.setEnd(a,a.childNodes.length):c.setEnd(d,d.nodeValue.length),h.selection.setRng(c))};h.on("keydown",function(b){if(!(b.keyCode!==a.DELETE&&b.keyCode!==a.BACKSPACE||b.isDefaultPrevented())){var e=h.dom.getParent(h.selection.getStart(),"caption");d(e)&&(h.selection.isCollapsed()?(j(e),(c(e)||b.keyCode===a.BACKSPACE&&g(e))&&b.preventDefault()):(k(e),h.undoManager.transact(function(){h.execCommand("Delete"),j(e)}),b.preventDefault()))}})}n(),m(),c.webkit&&(i(),l()),c.gecko&&(j(),k()),c.ie>9&&(j(),k())}}),g("0",["1","2","3","4","5","6","7","8","9","a","b"],function(a,b,c,d,e,f,g,h,i,j,k){function l(a){function c(b){return function(){a.execCommand(b)}}function l(c,d){var e,f,g,h;for(g='',e=0;e",f=0;f"+(b.ie&&b.ie<10?" ":"
")+"";g+=""}return g+="
",a.undoManager.transact(function(){a.insertContent(g),h=a.dom.get("__mce"),a.dom.setAttrib(h,"id",null),a.$("tr",h).each(function(b,c){a.fire("newrow",{node:c}),a.$("th,td",c).each(function(b,c){a.fire("newcell",{node:c})})}),a.dom.setAttribs(h,a.settings.table_default_attributes||{}),a.dom.setStyles(h,a.settings.table_default_styles||{})}),h}function n(b,c,d){function e(){var e,f,g,h={},i=0;f=a.dom.select("td[data-mce-selected],th[data-mce-selected]"),e=f[0],e||(e=a.selection.getStart()),d&&f.length>0?(m(f,function(a){return h[a.parentNode.parentNode.nodeName]=1}),m(h,function(a){i+=a}),g=1!==i):g=!a.dom.getParent(e,c),b.disabled(g),a.selection.selectorChanged(c,function(a){b.disabled(!a)})}a.initialized?e():a.on("init",e)}function o(){n(this,"table")}function p(){n(this,"td,th")}function q(){n(this,"td,th",!0)}function r(){var a="";a='';for(var b=0;b<10;b++){a+="";for(var c=0;c<10;c++)a+='';a+=""}return a+="
",a+=''}function s(b,c,d){var e,f,g,h,i,j=d.getEl().getElementsByTagName("table")[0],k=d.isRtl()||"tl-tr"==d.parent().rel;for(j.nextSibling.innerHTML=b+1+" x "+(c+1),k&&(b=9-b),f=0;f<10;f++)for(e=0;e<10;e++)h=j.rows[f].childNodes[e].firstChild,i=(k?e>=b:e<=b)&&f<=c,a.dom.toggleClass(h,"mce-active",i),i&&(g=h);return g.parentNode}function t(){a.addButton("tableprops",{title:"Table properties",onclick:B.tableProps,icon:"table"}),a.addButton("tabledelete",{title:"Delete table",onclick:c("mceTableDelete")}),a.addButton("tablecellprops",{title:"Cell properties",onclick:c("mceTableCellProps")}),a.addButton("tablemergecells",{title:"Merge cells",onclick:c("mceTableMergeCells")}),a.addButton("tablesplitcells",{title:"Split cell",onclick:c("mceTableSplitCells")}),a.addButton("tableinsertrowbefore",{title:"Insert row before",onclick:c("mceTableInsertRowBefore")}),a.addButton("tableinsertrowafter",{title:"Insert row after",onclick:c("mceTableInsertRowAfter")}),a.addButton("tabledeleterow",{title:"Delete row",onclick:c("mceTableDeleteRow")}),a.addButton("tablerowprops",{title:"Row properties",onclick:c("mceTableRowProps")}),a.addButton("tablecutrow",{title:"Cut row",onclick:c("mceTableCutRow")}),a.addButton("tablecopyrow",{title:"Copy row",onclick:c("mceTableCopyRow")}),a.addButton("tablepasterowbefore",{title:"Paste row before",onclick:c("mceTablePasteRowBefore")}),a.addButton("tablepasterowafter",{title:"Paste row after",onclick:c("mceTablePasteRowAfter")}),a.addButton("tableinsertcolbefore",{title:"Insert column before",onclick:c("mceTableInsertColBefore")}),a.addButton("tableinsertcolafter",{title:"Insert column after",onclick:c("mceTableInsertColAfter")}),a.addButton("tabledeletecol",{title:"Delete column",onclick:c("mceTableDeleteCol")})}function u(b){var c=a.dom.is(b,"table")&&a.getBody().contains(b);return c}function v(){var b=a.settings.table_toolbar;""!==b&&b!==!1&&(b||(b="tableprops tabledelete | tableinsertrowbefore tableinsertrowafter tabledeleterow | tableinsertcolbefore tableinsertcolafter tabledeletecol"),a.addContextToolbar(u,b))}function w(){return y}function x(a){y=a}var y,z,A=this,B=new h(a);!a.settings.object_resizing||a.settings.table_resize_bars===!1||a.settings.object_resizing!==!0&&"table"!==a.settings.object_resizing||(z=i(a));var C=function(b){var c=a.dom.getParent(b,"th,td"),e=a.dom.select("td[data-mce-selected],th[data-mce-selected]").concat(c?[c]:[]),f=d.grep(e,function(a){return j.getColSpan(a)>1||j.getRowSpan(a)>1});return f.length>0},D=function(b){var c=b.control;c.disabled(!C(a.selection.getStart())),a.on("nodechange",function(a){c.disabled(!C(a.element))})};a.settings.table_grid===!1?a.addMenuItem("inserttable",{text:"Table",icon:"table",context:"table",onclick:B.table}):a.addMenuItem("inserttable",{text:"Table",icon:"table",context:"table",ariaHideMenu:!0,onclick:function(a){a.aria&&(this.parent().hideAll(),a.stopImmediatePropagation(),B.table())},onshow:function(){s(0,0,this.menu.items()[0])},onhide:function(){var b=this.menu.items()[0].getEl().getElementsByTagName("a");a.dom.removeClass(b,"mce-active"),a.dom.addClass(b[0],"mce-active")},menu:[{type:"container",html:r(),onPostRender:function(){this.lastX=this.lastY=0},onmousemove:function(a){var b,c,d=a.target;"A"==d.tagName.toUpperCase()&&(b=parseInt(d.getAttribute("data-mce-x"),10),c=parseInt(d.getAttribute("data-mce-y"),10),(this.isRtl()||"tl-tr"==this.parent().rel)&&(b=9-b),b===this.lastX&&c===this.lastY||(s(b,c,a.control),this.lastX=b,this.lastY=c))},onclick:function(b){var c=this;"A"==b.target.tagName.toUpperCase()&&(b.preventDefault(),b.stopPropagation(),c.parent().cancel(),a.undoManager.transact(function(){l(c.lastX+1,c.lastY+1)}),a.addVisual())}}]}),a.addMenuItem("tableprops",{text:"Table properties",context:"table",onPostRender:o,onclick:B.tableProps}),a.addMenuItem("deletetable",{text:"Delete table",context:"table",onPostRender:o,cmd:"mceTableDelete"}),a.addMenuItem("cell",{separator:"before",text:"Cell",context:"table",menu:[{text:"Cell properties",onclick:c("mceTableCellProps"),onPostRender:p},{text:"Merge cells",onclick:c("mceTableMergeCells"),onPostRender:q},{text:"Split cell",disabled:!0,onclick:c("mceTableSplitCells"),onPostRender:D}]}),a.addMenuItem("row",{text:"Row",context:"table",menu:[{text:"Insert row before",onclick:c("mceTableInsertRowBefore"),onPostRender:p},{text:"Insert row after",onclick:c("mceTableInsertRowAfter"),onPostRender:p},{text:"Delete row",onclick:c("mceTableDeleteRow"),onPostRender:p},{text:"Row properties",onclick:c("mceTableRowProps"),onPostRender:p},{text:"-"},{text:"Cut row",onclick:c("mceTableCutRow"),onPostRender:p},{text:"Copy row",onclick:c("mceTableCopyRow"),onPostRender:p},{text:"Paste row before",onclick:c("mceTablePasteRowBefore"),onPostRender:p},{text:"Paste row after",onclick:c("mceTablePasteRowAfter"),onPostRender:p}]}),a.addMenuItem("column",{text:"Column",context:"table",menu:[{text:"Insert column before",onclick:c("mceTableInsertColBefore"),onPostRender:p},{text:"Insert column after",onclick:c("mceTableInsertColAfter"),onPostRender:p},{text:"Delete column",onclick:c("mceTableDeleteCol"),onPostRender:p}]});var E=[];m("inserttable tableprops deletetable | cell row column".split(" "),function(b){"|"==b?E.push({text:"-"}):E.push(a.menuItems[b])}),a.addButton("table",{type:"menubutton",title:"Table",menu:E}),b.isIE||a.on("click",function(b){b=b.target,"TABLE"===b.nodeName&&(a.selection.select(b),a.nodeChanged())}),A.quirks=new k(a),a.on("Init",function(){A.cellSelection=new g(a,function(a){a&&z&&z.clearBars()}),A.resizeBars=z}),a.on("PreInit",function(){a.serializer.addAttributeFilter("data-mce-cell-padding,data-mce-border,data-mce-border-color",function(a,b){for(var c=a.length;c--;)a[c].attr(b,null)})}),m({mceTableSplitCells:function(a){a.split()},mceTableMergeCells:function(b){var c;c=a.dom.getParent(a.selection.getStart(),"th,td"),a.dom.select("td[data-mce-selected],th[data-mce-selected]").length?b.merge():B.merge(b,c)},mceTableInsertRowBefore:function(a){a.insertRows(!0)},mceTableInsertRowAfter:function(a){a.insertRows()},mceTableInsertColBefore:function(a){a.insertCols(!0)},mceTableInsertColAfter:function(a){a.insertCols()},mceTableDeleteCol:function(a){a.deleteCols()},mceTableDeleteRow:function(a){a.deleteRows()},mceTableCutRow:function(a){y=a.cutRows()},mceTableCopyRow:function(a){y=a.copyRows()},mceTablePasteRowBefore:function(a){a.pasteRows(y,!0)},mceTablePasteRowAfter:function(a){a.pasteRows(y)},mceSplitColsBefore:function(a){a.splitCols(!0)},mceSplitColsAfter:function(a){a.splitCols(!1)},mceTableDelete:function(a){z&&z.clearBars(),a.deleteTable()}},function(b,c){a.addCommand(c,function(){var c=new f(a);c&&(b(c),a.execCommand("mceRepaint"),A.cellSelection.clear())})}),m({mceInsertTable:B.table,mceTableProps:function(){B.table(!0)},mceTableRowProps:B.row,mceTableCellProps:B.cell},function(b,c){a.addCommand(c,function(a,c){b(c)})}),t(),v(),a.settings.table_tab_navigation!==!1&&a.on("keydown",function(b){var c,d,g,h=a.selection.getStart();if(b.keyCode===e.TAB){if(a.dom.getParent(h,"LI,DT,DD"))return;c=a.dom.getParent(h,"th,td"),c&&(b.preventDefault(),d=new f(a),g=b.shiftKey?-1:1,a.undoManager.transact(function(){!d.moveRelIdx(c,g)&&g>0&&(d.insertRow(),d.refresh(),d.moveRelIdx(c,g))}))}}),A.insertTable=l,A.setClipboardRows=x,A.getClipboardRows=w}var m=d.each;return c.add("table",l),function(){}}),d("0")()}(); \ No newline at end of file +!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()||(mn.getAt(t,l,s).filter(r).isNone()?(o=f,i=e[l].element(),u=xe.fromTag("td"),Rt(u,xe.fromTag("br")),(o?Rt:Ct)(i,u)):f=!0)}(m,g,h,d),o=e,f=h,s=A(tn.firstLayer(o,"tr"),function(e){return 0===e.dom().childElementCount}),k(s,Nt),f.minCol()!==f.maxCol()&&f.minRow()!==f.maxRow()||k(tn.firstLayer(o,"th,td"),function(e){he(e,"rowspan"),he(e,"colspan")}),he(o,"width"),he(o,"height"),Ae(o,"width"),Ae(o,"height"),e},pn=(Gt=le,Yt="text",{get:function(e){if(!Gt(e))throw new Error("Can only get "+Yt+" value of a "+Yt+" node");return Xt(e).getOr("")},getOption:Xt=function(e){return Gt(e)?R.from(e.dom().nodeValue):R.none()},set:function(e,t){if(!Gt(e))throw new Error("Can only set raw "+Yt+" value of a "+Yt+" node");e.dom().nodeValue=t}}),vn=function(e){return pn.get(e)},bn=function(e){return pn.getOption(e)},wn=function(e,t){pn.set(e,t)},yn=function(e){return"img"===oe(e)?1:bn(e).fold(function(){return bt(e).length},function(e){return e.length})},xn=["img","br"],Cn=function(e){return bn(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()},_n=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()},Ln=function(e,t){for(var n=!0,r=b(Mn,t),o=t.startRow();o<=t.finishRow();o++)for(var i=t.startCol();i<=t.finishCol();i++)n=n&&mn.getAt(e,o,i).exists(r);return n?R.some(t):R.none()},Fn=function(e,t,n){var r=mn.findItem(e,t,ft),o=mn.findItem(e,n,ft);return r.bind(function(r){return o.map(function(e){return t=r,n=e,jt(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})})},jn=Fn,zn=function(t,e,n){return Fn(t,e,n).bind(function(e){return Ln(t,e)})},Hn=function(r,e,o,i){return mn.findItem(r,e,ft).bind(function(e){var t=0=t.length-1)return R.none();var e=t[n].fold(function(){var e=F(t.slice(0,n));return xo(e,function(e,t){return e.map(function(e){return{value:e,delta:t+1}})})},function(e){return R.some({value:e,delta:0})}),r=t[n+1].fold(function(){var e=t.slice(n+1);return xo(e,function(e,t){return e.map(function(e){return{value:e,delta:t+1}})})},function(e){return R.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})})},Bo=function(e,t,n){var r=e();return B(r,t).orThunk(function(){return R.from(r[0]).orThunk(n)}).map(function(e){return e.element()})},Wo=function(n){var e=n.grid(),t=Po(0,e.columns()),r=Po(0,e.rows());return E(t,function(t){return Bo(function(){return _(r,function(e){return mn.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 mn.getAt(n,0,t)})})},Mo=function(n){var e=n.grid(),t=Po(0,e.rows()),r=Po(0,e.columns());return E(t,function(t){return Bo(function(){return _(r,function(e){return mn.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 mn.getAt(n,t,0)})})},_o=function(e){var t=e.replace(/\./g,"-");return{resolve:function(e){return t+"-"+e}}},Lo={resolve:_o("ephox-snooker").resolve},Fo=function(e,t,n,r,o){var i=xe.fromTag("div");return Oe(i,{position:"absolute",left:t-r/2+"px",top:n+"px",height:o+"px",width:r+"px"}),de(i,{"data-column":e,role:"presentation"}),i},jo=function(e,t,n,r,o){var i=xe.fromTag("div");return Oe(i,{position:"absolute",left:t+"px",top:n-o/2+"px",height:o+"px",width:r+"px"}),de(i,{"data-row":e,role:"presentation"}),i},zo=Lo.resolve("resizer-bar"),Ho=Lo.resolve("resizer-rows"),Uo=Lo.resolve("resizer-cols"),qo=function(e){var t=qt(e.parent(),"."+zo);k(t,Nt)},Vo=function(n,e,r){var o=n.origin();k(e,function(e,t){e.each(function(e){var t=r(o,e);Eo(t,zo),Rt(n.parent(),t)})})},Go=function(e,t,n,r,o,i){var u,a,c,l,f=no(t),s=0=t.length||e.column()>ni.cellLength(t[0]))return pi.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=ni.cellLength(n[0]),u=n.length;return pi.value({rowDelta:C(r.length-u),colDelta:C(o.length-i)})},xi=function(e,t){var n=ni.cellLength(e[0]),r=ni.cellLength(t[0]);return{rowDelta:C(0),colDelta:C(n-r)}},Ci=function(e,t,n){var r=t.colDelta()<0?wi:o;return(t.rowDelta()<0?bi:o)(r(e,Math.abs(t.colDelta()),n),Math.abs(t.rowDelta()),n)},Ri=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++)ni.mutateCell(e[o],i,Mt(r(),!1));return e},Si=function(e,t,n,r){for(var o=!0,i=0;i',t.insertBefore(r,t.firstChild)),ga(e,t),o.align&&da(e,t,o.align),e.focus(),e.addVisual()})},Pa=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")||pa(a.dom,c,"padding"),border:l.getAttrib(c,"data-mce-border")||l.getAttrib(c,"border")||pa(a.dom,c,"border"),borderColor:l.getAttrib(c,"data-mce-border-color"),caption:!!l.select("caption",c)[0],"class":l.getAttrib(c,"class")},sa.each("left center right".split(" "),function(e){a.formatter.matchNode(c,"align"+e)&&(f.align=e)}),Zu(a)&&sa.extend(f,wa.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},Nc=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=vn(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()+")"}},Ml=function(e){return Wl.nu({left:e.left,top:e.top,right:e.right,bottom:e.bottom})},_l=function(e,t){return R.some(e.getRect(t))},Ll=function(e,t,n){return ce(t)?_l(e,t).map(Ml):le(t)?(r=e,o=t,i=n,0<=i&&in.right();var t,n})});var n,o,i},Hl={point:Wl.getTop,adjuster:function(e,t,n,r,o){var i=Wl.moveUp(o,5);return Math.abs(n.top()-r.top())<1?jl.retry(i):n.bottom()o.bottom()?jl.retry(i):n.top()===o.bottom()?jl.retry(Wl.moveDown(o,1)):zl(e,t,o)?jl.retry(Wl.translate(i,5,0)):jl.none()},move:Wl.moveDown,gather:Cl},ql=function(n,r,o,i,u){return 0===u?R.some(i):(c=n,l=i.left(),f=r.point(i),c.elementFromPoint(l,f).filter(function(e){return"table"===oe(e)}).isSome()?(t=i,a=u-1,ql(n,e=r,o,e.move(t,5),a)):n.situsFromPoint(i.left(),r.point(i)).bind(function(e){return e.start().fold(R.none,function(t){return Fl(n,t).bind(function(e){return r.adjuster(n,t,e,o,i).fold(R.none,function(e){return ql(n,r,o,e,u-1)})}).orThunk(function(){return R.some(i)})},R.none)}));var e,t,a,c,l,f},Vl=function(t,n,e){var r,o,i,u=t.move(e,5),a=ql(n,t,e,u,100).getOr(u);return(r=t,o=a,i=n,r.point(o)>i.getInnerHeight()?R.some(r.point(o)-i.getInnerHeight()):r.point(o)<0?R.some(-r.point(o)):R.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)})},Gl={tryUp:b(Vl,Hl),tryDown:b(Vl,Ul),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)},Yl=it.detect(),Xl=function(r,o,i,u,a,c){return 0===c?R.none():$l(r,o,i,u,a).bind(function(e){var t=r.fromSitus(e),n=Dl.verify(r,i,u,t.finish(),t.foffset(),a.failure,o);return Dl.cata(n,function(){return R.none()},function(){return R.some(e)},function(e){return ft(i,e)&&0===u?Kl(r,i,u,Wl.moveUp,a):Xl(r,o,e,0,a,c-1)},function(e){return ft(i,e)&&u===yn(e)?Kl(r,i,u,Wl.moveDown,a):Xl(r,o,e,yn(e),a,c-1)})})},Kl=function(t,e,n,r,o){return Ll(t,e,n).bind(function(e){return Jl(t,o,r(e,Gl.getJumpSize()))})},Jl=function(e,t,n){return Yl.browser.isChrome()||Yl.browser.isSafari()||Yl.browser.isFirefox()||Yl.browser.isEdge()?t.otherRetry(e,n):Yl.browser.isIE()?t.ieRetry(e,n):R.none()},$l=function(t,e,n,r,o){return Ll(t,n,r).bind(function(e){return Jl(t,o,e)})},Ql=function(t,n,r){return(o=t,i=n,u=r,o.getSelection().bind(function(r){return Pl(i,r.finish(),r.foffset(),u).fold(function(){return R.some(Rl(r.finish(),r.foffset()))},function(e){var t=o.fromSitus(e),n=Dl.verify(o,r.finish(),r.foffset(),t.finish(),t.foffset(),u.failure,i);return Il(n)})})).bind(function(e){return Xl(t,n,e.element(),e.offset(),r,20).map(t.fromSitus)});var o,i,u},Zl=it.detect(),ef=function(e,t){return Kt(e,function(e){return gt(e).exists(function(e){return ft(e,t)})},n).isSome();var n},tf=function(t,r,o,e,i){return Zt(e,"td,th",r).bind(function(n){return Zt(n,"table",r).bind(function(e){return ef(i,e)?Ql(t,r,o).bind(function(t){return Zt(t.finish(),"td,th",r).map(function(e){return{start:C(n),finish:C(e),range:C(t)}})}):R.none()})})},nf=function(e,t,n,r,o,i){return Zl.browser.isIE()?R.none():i(r,t).orThunk(function(){return tf(e,t,n,r,o).map(function(e){var t=e.range();return rl.create(R.some(il.makeSitus(t.start(),t.soffset(),t.finish(),t.foffset())),!0)})})},rf=function(e,t,n,r,o,i,u){return tf(e,n,r,o,i).bind(function(e){return al.detect(t,n,e.start(),e.finish(),u)})},of=function(e,u){return Zt(e,"tr",u).bind(function(i){return Zt(i,"table",u).bind(function(e){var t,n,r,o=qt(e,"tr");return ft(i,o[0])?(t=e,n=function(e){return Sn(e).isSome()},r=u,bl(yl,t,n,r)).map(function(e){var t=yn(e);return rl.create(R.some(il.makeSitus(e,t,e,t)),!0)}):R.none()})})},uf=function(e,u){return Zt(e,"tr",u).bind(function(i){return Zt(i,"table",u).bind(function(e){var t,n,r,o=qt(e,"tr");return ft(i,o[o.length-1])?(t=e,n=function(e){return Rn(e).isSome()},r=u,wl(yl,t,n,r)).map(function(e){return rl.create(R.some(il.makeSitus(e,0,e,0)),!0)}):R.none()})})},af=function(e,t){return Zt(e,"td,th",t)},cf={down:{traverse:vt,gather:Cl,relative:pc.before,otherRetry:Gl.tryDown,ieRetry:Gl.ieTryDown,failure:Dl.failedDown},up:{traverse:pt,gather:xl,relative:pc.before,otherRetry:Gl.tryUp,ieRetry:Gl.ieTryUp,failure:Dl.failedUp}},lf=function(t){return function(e){return e===t}},ff=lf(38),sf=lf(40),df={ltr:{isBackward:lf(37),isForward:lf(39)},rtl:{isBackward:lf(39),isForward:lf(37)},isUp:ff,isDown:sf,isNavigation:function(e){return 37<=e&&e<=40}},mf=function(e){return{left:e.left(),top:e.top(),right:e.right(),bottom:e.bottom(),width:e.width(),height:e.height()}},gf=(it.detect().browser.isSafari(),function(a){return{elementFromPoint:function(e,t){return xe.fromPoint(xe.fromDom(a.document),e,t)},getRect:function(e){return e.dom().getBoundingClientRect()},getRangedRect:function(e,t,n,r){var o=bc.exact(e,t,n,r);return Yc(a,o).map(mf)},getSelection:function(){return Gc(a).map(function(e){return il.convertToRange(a,e)})},fromSitus:function(e){var t=bc.relative(e.start(),e.finish());return il.convertToRange(a,t)},situsFromPoint:function(e,t){return Xc(a,e,t).map(function(e){return ol(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=Lc(n,r,o,i),Hc(t,u)},setRelativeSelection:function(e,t){var n,r;n=a,r=_c(e,t),Hc(n,r)},selectContents:function(e){Vc(a,e)},getInnerHeight:function(){return a.innerHeight},getScrollY:function(){var e,t,n,r;return(e=xe.fromDom(a.document),t=e!==undefined?e.dom():m.document,n=t.body.scrollLeft||t.documentElement.scrollLeft,r=t.body.scrollTop||t.documentElement.scrollTop,eo(n,r)).top()},scrollBy:function(e,t){var n,r,o;n=e,r=t,((o=xe.fromDom(a.document))!==undefined?o.dom():m.document).defaultView.scrollBy(n,r)}}}),hf=q("rows","cols"),pf={mouse:function(e,t,n,r){var o,i,u,a,c,l,f=gf(e),s=(o=f,i=t,u=n,a=r,c=R.none(),l=function(){c=R.none()},{mousedown:function(e){a.clear(i),c=af(e.target(),u)},mouseover:function(e){c.each(function(r){a.clear(i),af(e.target(),u).each(function(n){sr(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(){Na(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)},Tf=function(n,r){return{insertTable:function(e,t){return Na(n,e,t)},setClipboardRows:function(e){return t=r,n=E(e,xe.fromDom),void t.set(R.from(n));var t,n},getClipboardRows:function(){return r.get().fold(function(){},function(e){return E(e,function(e){return e.dom()})})}}};e.add("table",function(t){var n,r=cc(t),e=yf(t,r.lazyResize),o=la(t,r.lazyWire),i=(n=t,{get:function(){var e=Fu(n);return hr(e,yr.selectedSelector()).fold(function(){return n.selection.getStart()===undefined?Rr.none():Rr.single(n.selection)},function(e){return Rr.multiple(e)})}}),u=lu(R.none());return Ba(t,o,e,i,u),Ar(t,i,o,e),Sf(t,i),Cf(t),Rf(t),t.on("PreInit",function(){t.serializer.addTempAttr(yr.firstSelected()),t.serializer.addTempAttr(yr.lastSelected())}),t.getParam("table_tab_navigation",!0,"boolean")&&t.on("keydown",function(e){nl(e,t,o,r.lazyWire)}),t.on("remove",function(){r.destroy(),e.destroy()}),Tf(t,u)})}(window); \ No newline at end of file diff --git a/wp-content/plugins/tinymce-advanced/mce/visualblocks/plugin.js b/wp-content/plugins/tinymce-advanced/mce/visualblocks/plugin.js index c2029588..267fb07a 100644 --- a/wp-content/plugins/tinymce-advanced/mce/visualblocks/plugin.js +++ b/wp-content/plugins/tinymce-advanced/mce/visualblocks/plugin.js @@ -1,208 +1,135 @@ (function () { +var visualblocks = (function () { + 'use strict'; -var defs = {}; // id -> {dependencies, definition, instance (possibly undefined)} + 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 + }; + }; -// Used when there is no 'main' module. -// The name is probably (hopefully) unique so minification removes for releases. -var register_3795 = function (id) { - var module = dem(id); - var fragments = id.split('.'); - var target = Function('return this;')(); - for (var i = 0; i < fragments.length - 1; ++i) { - if (target[fragments[i]] === undefined) - target[fragments[i]] = {}; - target = target[fragments[i]]; - } - target[fragments[fragments.length - 1]] = module; -}; + var global = tinymce.util.Tools.resolve('tinymce.PluginManager'); -var instantiate = function (id) { - var actual = defs[id]; - var dependencies = actual.deps; - var definition = actual.defn; - var len = dependencies.length; - var instances = new Array(len); - for (var i = 0; i < len; ++i) - instances[i] = dem(dependencies[i]); - var defResult = definition.apply(null, instances); - if (defResult === undefined) - throw 'module [' + id + '] returned undefined'; - actual.instance = defResult; -}; + var fireVisualBlocks = function (editor, state) { + editor.fire('VisualBlocks', { state: state }); + }; + var Events = { fireVisualBlocks: fireVisualBlocks }; -var def = function (id, dependencies, definition) { - if (typeof id !== 'string') - throw 'module id must be a string'; - else if (dependencies === undefined) - throw 'no dependencies for ' + id; - else if (definition === undefined) - throw 'no definition function for ' + id; - defs[id] = { - deps: dependencies, - defn: definition, - instance: undefined - }; -}; + var isEnabledByDefault = function (editor) { + return editor.getParam('visualblocks_default_state', false); + }; + var getContentCss = function (editor) { + return editor.settings.visualblocks_content_css; + }; + var Settings = { + isEnabledByDefault: isEnabledByDefault, + getContentCss: getContentCss + }; -var dem = function (id) { - var actual = defs[id]; - if (actual === undefined) - throw 'module [' + id + '] was undefined'; - else if (actual.instance === undefined) - instantiate(id); - return actual.instance; -}; + var global$1 = tinymce.util.Tools.resolve('tinymce.dom.DOMUtils'); -var req = function (ids, callback) { - var len = ids.length; - var instances = new Array(len); - for (var i = 0; i < len; ++i) - instances.push(dem(ids[i])); - callback.apply(null, callback); -}; + var global$2 = tinymce.util.Tools.resolve('tinymce.util.Tools'); -var ephox = {}; - -ephox.bolt = { - module: { - api: { - define: def, - require: req, - demand: dem - } - } -}; - -var define = def; -var require = req; -var demand = dem; -// this helps with minificiation when using a lot of global references -var defineGlobal = function (id, ref) { - define(id, [], function () { return ref; }); -}; -/*jsc -["tinymce.plugins.visualblocks.Plugin","tinymce.core.PluginManager","global!tinymce.util.Tools.resolve"] -jsc*/ -defineGlobal("global!tinymce.util.Tools.resolve", tinymce.util.Tools.resolve); -/** - * ResolveGlobal.js - * - * Released under LGPL License. - * Copyright (c) 1999-2017 Ephox Corp. All rights reserved - * - * License: http://www.tinymce.com/license - * Contributing: http://www.tinymce.com/contributing - */ - -define( - 'tinymce.core.PluginManager', - [ - 'global!tinymce.util.Tools.resolve' - ], - function (resolve) { - return resolve('tinymce.PluginManager'); - } -); - -/** - * Plugin.js - * - * Released under LGPL License. - * Copyright (c) 1999-2017 Ephox Corp. All rights reserved - * - * License: http://www.tinymce.com/license - * Contributing: http://www.tinymce.com/contributing - */ - -/** - * This class contains all core logic for the code plugin. - * - * @class tinymce.visualblocks.Plugin - * @private - */ -define( - 'tinymce.plugins.visualblocks.Plugin', - [ - 'tinymce.core.PluginManager' - ], - function (PluginManager) { - PluginManager.add('visualblocks', function (editor, url) { - var cssId, visualBlocksMenuItem, enabled; - - // We don't support older browsers like IE6/7 and they don't provide prototypes for DOM objects - if (!window.NodeList) { - return; - } - - function toggleActiveState() { - var self = this; - - self.active(enabled); - - editor.on('VisualBlocks', function () { - self.active(editor.dom.hasClass(editor.getBody(), 'mce-visualblocks')); - }); - } - - editor.addCommand('mceVisualBlocks', function () { - var dom = editor.dom, linkElm; - - if (!cssId) { - cssId = dom.uniqueId(); - linkElm = dom.create('link', { - id: cssId, - rel: 'stylesheet', - href: url + '/css/visualblocks.css' - }); - - editor.getDoc().getElementsByTagName('head')[0].appendChild(linkElm); - } - - // Toggle on/off visual blocks while computing previews - editor.on("PreviewFormats AfterPreviewFormats", function (e) { - if (enabled) { - dom.toggleClass(editor.getBody(), 'mce-visualblocks', e.type == "afterpreviewformats"); - } - }); - - dom.toggleClass(editor.getBody(), 'mce-visualblocks'); - enabled = editor.dom.hasClass(editor.getBody(), 'mce-visualblocks'); - - if (visualBlocksMenuItem) { - visualBlocksMenuItem.active(dom.hasClass(editor.getBody(), 'mce-visualblocks')); - } - - editor.fire('VisualBlocks'); + var cssId = global$1.DOM.uniqueId(); + var load = function (doc, url) { + var linkElements = global$2.toArray(doc.getElementsByTagName('link')); + var matchingLinkElms = global$2.grep(linkElements, function (head) { + return head.id === cssId; }); + if (matchingLinkElms.length === 0) { + var linkElm = global$1.DOM.create('link', { + id: cssId, + rel: 'stylesheet', + href: url + }); + doc.getElementsByTagName('head')[0].appendChild(linkElm); + } + }; + var LoadCss = { load: load }; + var toggleVisualBlocks = function (editor, pluginUrl, enabledState) { + var dom = editor.dom; + var contentCss = Settings.getContentCss(editor); + LoadCss.load(editor.getDoc(), contentCss ? contentCss : pluginUrl + '/css/visualblocks.css'); + dom.toggleClass(editor.getBody(), 'mce-visualblocks'); + enabledState.set(!enabledState.get()); + Events.fireVisualBlocks(editor, enabledState.get()); + }; + var VisualBlocks = { toggleVisualBlocks: toggleVisualBlocks }; + + var register = function (editor, pluginUrl, enabledState) { + editor.addCommand('mceVisualBlocks', function () { + VisualBlocks.toggleVisualBlocks(editor, pluginUrl, enabledState); + }); + }; + var Commands = { register: register }; + + var setup = function (editor, pluginUrl, enabledState) { + editor.on('PreviewFormats AfterPreviewFormats', function (e) { + if (enabledState.get()) { + editor.dom.toggleClass(editor.getBody(), 'mce-visualblocks', e.type === 'afterpreviewformats'); + } + }); + editor.on('init', function () { + if (Settings.isEnabledByDefault(editor)) { + VisualBlocks.toggleVisualBlocks(editor, pluginUrl, enabledState); + } + }); + editor.on('remove', function () { + editor.dom.removeClass(editor.getBody(), 'mce-visualblocks'); + }); + }; + var Bindings = { setup: setup }; + + var toggleActiveState = function (editor, enabledState) { + return function (e) { + var ctrl = e.control; + ctrl.active(enabledState.get()); + editor.on('VisualBlocks', function (e) { + ctrl.active(e.state); + }); + }; + }; + var register$1 = function (editor, enabledState) { editor.addButton('visualblocks', { + active: false, title: 'Show blocks', cmd: 'mceVisualBlocks', - onPostRender: toggleActiveState + onPostRender: toggleActiveState(editor, enabledState) }); - editor.addMenuItem('visualblocks', { text: 'Show blocks', cmd: 'mceVisualBlocks', - onPostRender: toggleActiveState, + onPostRender: toggleActiveState(editor, enabledState), selectable: true, context: 'view', prependToContext: true }); + }; + var Buttons = { register: register$1 }; - editor.on('init', function () { - if (editor.settings.visualblocks_default_state) { - editor.execCommand('mceVisualBlocks', false, null, { skip_focus: true }); - } - }); - - editor.on('remove', function () { - editor.dom.removeClass(editor.getBody(), 'mce-visualblocks'); - }); + global.add('visualblocks', function (editor, pluginUrl) { + var enabledState = Cell(false); + Commands.register(editor, pluginUrl, enabledState); + Buttons.register(editor, enabledState); + Bindings.setup(editor, pluginUrl, enabledState); }); + function Plugin () { + } - return function () { }; - } -); -dem('tinymce.plugins.visualblocks.Plugin')(); + return Plugin; + +}()); })(); diff --git a/wp-content/plugins/tinymce-advanced/mce/visualblocks/plugin.min.js b/wp-content/plugins/tinymce-advanced/mce/visualblocks/plugin.min.js index 067eaac0..09bfaf25 100644 --- a/wp-content/plugins/tinymce-advanced/mce/visualblocks/plugin.min.js +++ b/wp-content/plugins/tinymce-advanced/mce/visualblocks/plugin.min.js @@ -1 +1 @@ -!function(){var a={},b=function(b){for(var c=a[b],e=c.deps,f=c.defn,g=e.length,h=new Array(g),i=0;i {dependencies, definition, instance (possibly undefined)} - -// Used when there is no 'main' module. -// The name is probably (hopefully) unique so minification removes for releases. -var register_3795 = function (id) { - var module = dem(id); - var fragments = id.split('.'); - var target = Function('return this;')(); - for (var i = 0; i < fragments.length - 1; ++i) { - if (target[fragments[i]] === undefined) - target[fragments[i]] = {}; - target = target[fragments[i]]; - } - target[fragments[fragments.length - 1]] = module; -}; - -var instantiate = function (id) { - var actual = defs[id]; - var dependencies = actual.deps; - var definition = actual.defn; - var len = dependencies.length; - var instances = new Array(len); - for (var i = 0; i < len; ++i) - instances[i] = dem(dependencies[i]); - var defResult = definition.apply(null, instances); - if (defResult === undefined) - throw 'module [' + id + '] returned undefined'; - actual.instance = defResult; -}; - -var def = function (id, dependencies, definition) { - if (typeof id !== 'string') - throw 'module id must be a string'; - else if (dependencies === undefined) - throw 'no dependencies for ' + id; - else if (definition === undefined) - throw 'no definition function for ' + id; - defs[id] = { - deps: dependencies, - defn: definition, - instance: undefined - }; -}; - -var dem = function (id) { - var actual = defs[id]; - if (actual === undefined) - throw 'module [' + id + '] was undefined'; - else if (actual.instance === undefined) - instantiate(id); - return actual.instance; -}; - -var req = function (ids, callback) { - var len = ids.length; - var instances = new Array(len); - for (var i = 0; i < len; ++i) - instances.push(dem(ids[i])); - callback.apply(null, callback); -}; - -var ephox = {}; - -ephox.bolt = { - module: { - api: { - define: def, - require: req, - demand: dem - } - } -}; - -var define = def; -var require = req; -var demand = dem; -// this helps with minificiation when using a lot of global references -var defineGlobal = function (id, ref) { - define(id, [], function () { return ref; }); -}; -/*jsc -["tinymce.plugins.visualchars.Plugin","tinymce.core.PluginManager","tinymce.core.util.Delay","ephox.katamari.api.Arr","ephox.sugar.api.node.Element","tinymce.plugins.visualchars.core.VisualChars","global!tinymce.util.Tools.resolve","ephox.katamari.api.Option","global!Array","global!Error","global!String","ephox.katamari.api.Fun","global!console","global!document","tinymce.plugins.visualchars.core.Data","tinymce.plugins.visualchars.core.Nodes","ephox.sugar.api.node.Node","global!Object","ephox.sugar.api.node.NodeTypes","tinymce.plugins.visualchars.core.Html"] -jsc*/ -defineGlobal("global!tinymce.util.Tools.resolve", tinymce.util.Tools.resolve); -/** - * ResolveGlobal.js - * - * Released under LGPL License. - * Copyright (c) 1999-2017 Ephox Corp. All rights reserved - * - * License: http://www.tinymce.com/license - * Contributing: http://www.tinymce.com/contributing - */ - -define( - 'tinymce.core.PluginManager', - [ - 'global!tinymce.util.Tools.resolve' - ], - function (resolve) { - return resolve('tinymce.PluginManager'); - } -); - -/** - * ResolveGlobal.js - * - * Released under LGPL License. - * Copyright (c) 1999-2017 Ephox Corp. All rights reserved - * - * License: http://www.tinymce.com/license - * Contributing: http://www.tinymce.com/contributing - */ - -define( - 'tinymce.core.util.Delay', - [ - 'global!tinymce.util.Tools.resolve' - ], - function (resolve) { - return resolve('tinymce.util.Delay'); - } -); - -defineGlobal("global!Array", Array); -defineGlobal("global!Error", Error); -define( - 'ephox.katamari.api.Fun', - - [ - 'global!Array', - 'global!Error' - ], - - function (Array, Error) { - - var noop = function () { }; - - var compose = function (fa, fb) { - return function () { - return fa(fb.apply(null, arguments)); + 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 noop = function () { + }; var constant = function (value) { return function () { return value; }; }; - - var identity = function (x) { - return x; - }; - - var tripleEquals = function(a, b) { - return a === b; - }; - - // Don't use array slice(arguments), makes the whole function unoptimisable on Chrome - var curry = function (f) { - // equivalent to arguments.slice(1) - // starting at 1 because 0 is the f, makes things tricky. - // Pay attention to what variable is where, and the -1 magic. - // thankfully, we have tests for this. - var args = new Array(arguments.length - 1); - for (var i = 1; i < arguments.length; i++) args[i-1] = arguments[i]; - - return function () { - var newArgs = new Array(arguments.length); - for (var j = 0; j < newArgs.length; j++) newArgs[j] = arguments[j]; - - var all = args.concat(newArgs); - return f.apply(null, all); - }; - }; - - var not = function (f) { - return function () { - return !f.apply(null, arguments); - }; - }; - - var die = function (msg) { - return function () { - throw new Error(msg); - }; - }; - - var apply = function (f) { - return f(); - }; - - var call = function(f) { - f(); - }; - var never = constant(false); var always = constant(true); - - return { - noop: noop, - compose: compose, - constant: constant, - identity: identity, - tripleEquals: tripleEquals, - curry: curry, - not: not, - die: die, - apply: apply, - call: call, - never: never, - always: always + var none = function () { + return NONE; }; - } -); - -defineGlobal("global!Object", Object); -define( - 'ephox.katamari.api.Option', - - [ - 'ephox.katamari.api.Fun', - 'global!Object' - ], - - function (Fun, Object) { - - var never = Fun.never; - var always = Fun.always; - - /** - Option objects support the following methods: - - fold :: this Option a -> ((() -> b, a -> b)) -> Option b - - is :: this Option a -> a -> Boolean - - isSome :: this Option a -> () -> Boolean - - isNone :: this Option a -> () -> Boolean - - getOr :: this Option a -> a -> a - - getOrThunk :: this Option a -> (() -> a) -> a - - getOrDie :: this Option a -> String -> a - - or :: this Option a -> Option a -> Option a - - if some: return self - - if none: return opt - - orThunk :: this Option a -> (() -> Option a) -> Option a - - Same as "or", but uses a thunk instead of a value - - map :: this Option a -> (a -> b) -> Option b - - "fmap" operation on the Option Functor. - - same as 'each' - - ap :: this Option a -> Option (a -> b) -> Option b - - "apply" operation on the Option Apply/Applicative. - - Equivalent to <*> in Haskell/PureScript. - - each :: this Option a -> (a -> b) -> Option b - - same as 'map' - - bind :: this Option a -> (a -> Option b) -> Option b - - "bind"/"flatMap" operation on the Option Bind/Monad. - - Equivalent to >>= in Haskell/PureScript; flatMap in Scala. - - flatten :: {this Option (Option a))} -> () -> Option a - - "flatten"/"join" operation on the Option Monad. - - exists :: this Option a -> (a -> Boolean) -> Boolean - - forall :: this Option a -> (a -> Boolean) -> Boolean - - filter :: this Option a -> (a -> Boolean) -> Option a - - equals :: this Option a -> Option a -> Boolean - - equals_ :: this Option a -> (Option a, a -> Boolean) -> Boolean - - toArray :: this Option a -> () -> [a] - - */ - - var none = function () { return NONE; }; - - var NONE = (function () { + var NONE = function () { var eq = function (o) { return o.isNone(); }; - - // inlined from peanut, maybe a micro-optimisation? - var call = function (thunk) { return thunk(); }; - var id = function (n) { return n; }; - var noop = function () { }; - + var call = function (thunk) { + return thunk(); + }; + var id = function (n) { + return n; + }; var me = { - fold: function (n, s) { return n(); }, + fold: function (n, s) { + return n(); + }, is: never, isSome: never, isNone: always, @@ -309,491 +70,218 @@ define( getOrDie: function (msg) { throw new Error(msg || 'error: getOrDie called on none.'); }, + getOrNull: constant(null), + getOrUndefined: constant(undefined), or: id, orThunk: call, map: none, - ap: none, each: noop, bind: none, - flatten: none, exists: never, forall: always, filter: none, equals: eq, equals_: eq, - toArray: function () { return []; }, - toString: Fun.constant("none()") + toArray: function () { + return []; + }, + toString: constant('none()') }; - if (Object.freeze) Object.freeze(me); + if (Object.freeze) { + Object.freeze(me); + } return me; - })(); - - - /** some :: a -> Option a */ + }(); var some = function (a) { - - // inlined from peanut, maybe a micro-optimisation? - var constant_a = function () { return a; }; - + var constant_a = constant(a); var self = function () { - // can't Fun.constant this one 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; }, + fold: function (n, s) { + return s(a); + }, + is: function (v) { + return a === v; + }, isSome: always, isNone: never, 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)); - }); + map: function (f) { + return some(f(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, - function (b) { return elementEq(a, b); } - ); - }, toArray: function () { return [a]; }, toString: function () { return 'some(' + a + ')'; + }, + equals: function (o) { + return o.is(a); + }, + equals_: function (o, elementEq) { + return o.fold(never, function (b) { + return elementEq(a, b); + }); } }; return me; }; - - /** from :: undefined|null|a -> Option a */ var from = function (value) { return value === null || value === undefined ? NONE : some(value); }; - - return { + var Option = { some: some, none: none, from: from }; - } -); -defineGlobal("global!String", String); -define( - 'ephox.katamari.api.Arr', - - [ - 'ephox.katamari.api.Option', - 'global!Array', - 'global!Error', - 'global!String' - ], - - function (Option, Array, Error, String) { - // Use the native Array.indexOf if it is available (IE9+) otherwise fall back to manual iteration - // https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Array/indexOf - 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 indexOf = function (xs, x) { - // The rawIndexOf method does not wrap up in an option. This is for performance reasons. - var r = rawIndexOf(xs, x); - return r === -1 ? Option.none() : Option.some(r); - }; - - var contains = function (xs, x) { - return rawIndexOf(xs, x) > -1; - }; - - // Using findIndex is likely less optimal in Chrome (dynamic return type instead of bool) - // but if we need that micro-optimisation we can inline it later. - var exists = function (xs, pred) { - return findIndex(xs, pred).isSome(); - }; - - var range = function (num, f) { - var r = []; - for (var i = 0; i < num; i++) { - r.push(f(i)); + var typeOf = function (x) { + if (x === null) { + return 'null'; } - return r; - }; - - // It's a total micro optimisation, but these do make some difference. - // Particularly for browsers other than Chrome. - // - length caching - // http://jsperf.com/browser-diet-jquery-each-vs-for-loop/69 - // - not using push - // http://jsperf.com/array-direct-assignment-vs-push/2 - - var chunk = function (array, size) { - var r = []; - for (var i = 0; i < array.length; i += size) { - var s = array.slice(i, i + size); - r.push(s); + var t = typeof x; + if (t === 'object' && (Array.prototype.isPrototypeOf(x) || x.constructor && x.constructor.name === 'Array')) { + return 'array'; } - return r; + 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 map = function(xs, f) { - // pre-allocating array size when it's guaranteed to be known - // http://jsperf.com/push-allocated-vs-dynamic/22 + var nativeSlice = 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); + r[i] = f(x, i); } return r; }; - - // Unwound implementing other functions in terms of each. - // The code size is roughly the same, and it should allow for better optimisation. - var each = function(xs, f) { + var each = function (xs, f) { for (var i = 0, len = xs.length; i < len; i++) { var x = xs[i]; - f(x, i, xs); + f(x, i); } }; - - var eachr = function (xs, f) { - for (var i = xs.length - 1; i >= 0; i--) { - var x = xs[i]; - f(x, i, xs); - } + var from$1 = isFunction(Array.from) ? Array.from : function (x) { + return nativeSlice.call(x); }; - var partition = function(xs, pred) { - var pass = []; - var fail = []; - for (var i = 0, len = xs.length; i < len; i++) { - var x = xs[i]; - var arr = pred(x, i, xs) ? pass : fail; - arr.push(x); - } - return { pass: pass, fail: fail }; - }; - - 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; - }; - - /* - * Groups an array into contiguous arrays of like elements. Whether an element is like or not depends on f. - * - * f is a function that derives a value from an element - e.g. true or false, or a string. - * Elements are like if this function generates the same value for them (according to ===). - * - * - * Order of the elements is preserved. Arr.flatten() on the result will return the original list, as with Haskell groupBy function. - * For a good explanation, see the group function (which is a special case of groupBy) - * http://hackage.haskell.org/package/base-4.7.0.0/docs/Data-List.html#v:group - */ - var groupBy = function (xs, f) { - if (xs.length === 0) { - return []; - } else { - var wasType = f(xs[0]); // initial case for matching - var r = []; - var group = []; - - for (var i = 0, len = xs.length; i < len; i++) { - var x = xs[i]; - var type = f(x); - if (type !== wasType) { - r.push(group); - group = []; - } - wasType = type; - group.push(x); - } - if (group.length !== 0) { - r.push(group); - } - 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) { - // Note, this is possible because push supports multiple arguments: - // http://jsperf.com/concat-push/6 - // Note that in the past, concat() would silently work (very slowly) for array-like objects. - // With this change it will throw an error. - var r = []; - for (var i = 0, len = xs.length; i < len; ++i) { - // Ensure that each value is an array itself - if (! Array.prototype.isPrototypeOf(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 equal = function (a1, a2) { - return a1.length === a2.length && forall(a1, function (x, i) { - return x === a2[i]; - }); - }; - - var slice = Array.prototype.slice; - var reverse = function (xs) { - var r = slice.call(xs, 0); - r.reverse(); - return r; - }; - - var difference = function (a1, a2) { - return filter(a1, function (x) { - return !contains(a2, x); - }); - }; - - var mapToObject = function(xs, f) { - var r = {}; - for (var i = 0, len = xs.length; i < len; i++) { - var x = xs[i]; - r[String(x)] = f(x, i); - } - return r; - }; - - var pure = function(x) { - return [x]; - }; - - var sort = function (xs, comparator) { - var copy = slice.call(xs, 0); - copy.sort(comparator); - return copy; - }; - - return { - map: map, - each: each, - eachr: eachr, - partition: partition, - filter: filter, - groupBy: groupBy, - indexOf: indexOf, - foldr: foldr, - foldl: foldl, - find: find, - findIndex: findIndex, - flatten: flatten, - bind: bind, - forall: forall, - exists: exists, - contains: contains, - equal: equal, - reverse: reverse, - chunk: chunk, - difference: difference, - mapToObject: mapToObject, - pure: pure, - sort: sort, - range: range - }; - } -); -define("global!console", [], function () { if (typeof console === "undefined") console = { log: function () {} }; return console; }); -defineGlobal("global!document", document); -define( - 'ephox.sugar.api.node.Element', - - [ - 'ephox.katamari.api.Fun', - 'global!Error', - 'global!console', - 'global!document' - ], - - function (Fun, Error, console, document) { var fromHtml = function (html, scope) { - var doc = scope || document; + var doc = scope || domGlobals.document; var div = doc.createElement('div'); div.innerHTML = html; if (!div.hasChildNodes() || div.childNodes.length > 1) { - console.error('HTML does not have a single root node', html); - throw 'HTML must have a single root node'; + 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 || document; + var doc = scope || domGlobals.document; var node = doc.createElement(tag); return fromDom(node); }; - var fromText = function (text, scope) { - var doc = scope || document; + 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: Fun.constant(node) - }; + if (node === null || node === undefined) { + throw new Error('Node cannot be null or undefined'); + } + return { dom: constant(node) }; }; - - return { + 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 + fromDom: fromDom, + fromPoint: fromPoint }; - } -); -/** - * Plugin.js - * - * Released under LGPL License. - * Copyright (c) 1999-2017 Ephox Corp. All rights reserved - * - * License: http://www.tinymce.com/license - * Contributing: http://www.tinymce.com/contributing - */ -define( - 'tinymce.plugins.visualchars.core.Data', + 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); - function () { var charMap = { - '\u00a0': 'nbsp', - '\u00ad': 'shy' + '\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; }; - - return { + var Data = { charMap: charMap, regExp: charMapToRegExp(charMap), regExpGlobal: charMapToRegExp(charMap, true), @@ -801,138 +289,28 @@ define( charMapToRegExp: charMapToRegExp, charMapToSelector: charMapToSelector }; - } -); -define( - 'ephox.sugar.api.node.NodeTypes', - [ - - ], - - function () { - return { - ATTRIBUTE: 2, - CDATA_SECTION: 4, - COMMENT: 8, - DOCUMENT: 9, - DOCUMENT_TYPE: 10, - DOCUMENT_FRAGMENT: 11, - ELEMENT: 1, - TEXT: 3, - PROCESSING_INSTRUCTION: 7, - ENTITY_REFERENCE: 5, - ENTITY: 6, - NOTATION: 12 + var wrapCharWithSpan = function (value) { + return '' + value + ''; }; - } -); -define( - 'ephox.sugar.api.node.Node', + var Html = { wrapCharWithSpan: wrapCharWithSpan }; - [ - 'ephox.sugar.api.node.NodeTypes' - ], - - function (NodeTypes) { - var name = function (element) { - var r = element.dom().nodeName; - return r.toLowerCase(); - }; - - var type = function (element) { - return element.dom().nodeType; - }; - - var value = function (element) { - return element.dom().nodeValue; - }; - - var isType = function (t) { - return function (element) { - return type(element) === t; - }; - }; - - var isComment = function (element) { - return type(element) === NodeTypes.COMMENT || name(element) === '#comment'; - }; - - var isElement = isType(NodeTypes.ELEMENT); - var isText = isType(NodeTypes.TEXT); - var isDocument = isType(NodeTypes.DOCUMENT); - - return { - name: name, - type: type, - value: value, - isElement: isElement, - isText: isText, - isDocument: isDocument, - isComment: isComment - }; - } -); - -define( - 'tinymce.plugins.visualchars.core.Html', - [ - 'tinymce.plugins.visualchars.core.Data' - ], - function (Data) { - var wrapCharWithSpan = function (value) { - return '' + value + ''; - }; - - return { - wrapCharWithSpan: wrapCharWithSpan - }; - } -); - -/** - * Plugin.js - * - * Released under LGPL License. - * Copyright (c) 1999-2017 Ephox Corp. All rights reserved - * - * License: http://www.tinymce.com/license - * Contributing: http://www.tinymce.com/contributing - */ - -define( - 'tinymce.plugins.visualchars.core.Nodes', - - [ - 'ephox.katamari.api.Arr', - 'ephox.sugar.api.node.Element', - 'ephox.sugar.api.node.Node', - 'tinymce.plugins.visualchars.core.Data', - 'tinymce.plugins.visualchars.core.Html' - ], - - function (Arr, Element, Node, Data, Html) { var isMatch = function (n) { - return Node.isText(n) && - Node.value(n) !== undefined && - Data.regExp.test(Node.value(n)); + var value$1 = value(n); + return isText(n) && value$1 !== undefined && Data.regExp.test(value$1); }; - - // inlined sugars PredicateFilter.descendants for file size var filterDescendants = function (scope, predicate) { var result = []; var dom = scope.dom(); - var children = Arr.map(dom.childNodes, Element.fromDom); - - Arr.each(children, function (x) { + var children = map(dom.childNodes, Element.fromDom); + each(children, function (x) { if (predicate(x)) { - result = result.concat([ 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) { @@ -941,165 +319,139 @@ define( elm = elm.parentNode; } }; - - var replaceWithSpans = function (html) { - return html.replace(Data.regExpGlobal, Html.wrapCharWithSpan); + var replaceWithSpans = function (text) { + return text.replace(Data.regExpGlobal, Html.wrapCharWithSpan); }; - - return { + var Nodes = { isMatch: isMatch, filterDescendants: filterDescendants, findParentElm: findParentElm, replaceWithSpans: replaceWithSpans }; - } -); -/** - * Plugin.js - * - * Released under LGPL License. - * Copyright (c) 1999-2017 Ephox Corp. All rights reserved - * - * License: http://www.tinymce.com/license - * Contributing: http://www.tinymce.com/contributing - */ -define( - 'tinymce.plugins.visualchars.core.VisualChars', - - [ - 'tinymce.plugins.visualchars.core.Data', - 'tinymce.plugins.visualchars.core.Nodes', - 'ephox.katamari.api.Arr', - 'ephox.sugar.api.node.Element', - 'ephox.sugar.api.node.Node' - ], - - function (Data, Nodes, Arr, Element, Node) { var show = function (editor, rootElm) { var node, div; var nodeList = Nodes.filterDescendants(Element.fromDom(rootElm), Nodes.isMatch); - - Arr.each(nodeList, function (n) { - var withSpans = Nodes.replaceWithSpans(Node.value(n)); - + each(nodeList, function (n) { + var withSpans = Nodes.replaceWithSpans(editor.dom.encode(value(n))); div = editor.dom.create('div', null, withSpans); - while ((node = div.lastChild)) { + 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); - - Arr.each(nodeList, function (node) { + 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); - - // if user does select all the parentNode will be undefined parentNode = parentNode !== undefined ? parentNode : body; - hide(editor, parentNode); show(editor, parentNode); - editor.selection.moveToBookmark(bookmark); }; - - - return { + var VisualChars = { show: show, hide: hide, toggle: toggle }; - } -); -/** - * Plugin.js - * - * Released under LGPL License. - * Copyright (c) 1999-2017 Ephox Corp. All rights reserved - * - * License: http://www.tinymce.com/license - * Contributing: http://www.tinymce.com/contributing - */ -define( - 'tinymce.plugins.visualchars.Plugin', - [ - 'tinymce.core.PluginManager', - 'tinymce.core.util.Delay', - 'ephox.katamari.api.Arr', - 'ephox.sugar.api.node.Element', - 'tinymce.plugins.visualchars.core.VisualChars' - ], - function (PluginManager, Delay, Arr, Element, VisualChars) { - PluginManager.add('visualchars', function (editor) { - var self = this, state; - var toggleActiveState = function () { - var self = this; + 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 }; - editor.on('VisualChars', function (e) { - self.active(e.state); - }); - }; + var register = function (editor, toggleState) { + editor.addCommand('mceVisualChars', function () { + Actions.toggleVisualChars(editor, toggleState); + }); + }; + var Commands = { register: register }; - var debouncedToggle = Delay.debounce(function () { + 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 (self.state === true) { + if (toggleState.get() === true) { e.keyCode === 13 ? VisualChars.toggle(editor) : debouncedToggle(); } }); } + }; + var Keyboard = { setup: setup }; - editor.addCommand('mceVisualChars', function () { - var body = editor.getBody(), selection = editor.selection, bookmark; + var isEnabledByDefault = function (editor) { + return editor.getParam('visualchars_default_state', false); + }; + var Settings = { isEnabledByDefault: isEnabledByDefault }; - state = !state; - self.state = state; - editor.fire('VisualChars', { state: state }); - - bookmark = selection.getBookmark(); - - if (state === true) { - VisualChars.show(editor, body); - } else { - VisualChars.hide(editor, body); - } - - selection.moveToBookmark(bookmark); + 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 + onPostRender: toggleActiveState(editor) }); - editor.addMenuItem('visualchars', { text: 'Show invisible characters', cmd: 'mceVisualChars', - onPostRender: toggleActiveState, + onPostRender: toggleActiveState(editor), selectable: true, context: 'view', prependToContext: true }); - }); + }; - return function () {}; - } -); -dem('tinymce.plugins.visualchars.Plugin')(); + 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)); })(); diff --git a/wp-content/plugins/tinymce-advanced/mce/visualchars/plugin.min.js b/wp-content/plugins/tinymce-advanced/mce/visualchars/plugin.min.js index 165a8b30..0a193452 100644 --- a/wp-content/plugins/tinymce-advanced/mce/visualchars/plugin.min.js +++ b/wp-content/plugins/tinymce-advanced/mce/visualchars/plugin.min.js @@ -1 +1 @@ -!function(){var a={},b=function(b){for(var c=a[b],e=c.deps,f=c.defn,g=e.length,h=new Array(g),i=0;i-1},h=function(a,b){return t(a,b).isSome()},i=function(a,b){for(var c=[],d=0;d=0;c--){var d=a[c];b(d,c,a)}},n=function(a,b){for(var c=[],d=[],e=0,f=a.length;e1)throw c.error("HTML does not have a single root node",a),"HTML must have a single root node";return h(f.childNodes[0])},f=function(a,b){var c=b||d,e=c.createElement(a);return h(e)},g=function(a,b){var c=b||d,e=c.createTextNode(a);return h(e)},h=function(c){if(null===c||void 0===c)throw new b("Node cannot be null or undefined");return{dom:a.constant(c)}};return{fromHtml:e,fromTag:f,fromText:g,fromDom:h}}),g("e",[],function(){var a={"\xa0":"nbsp","\xad":"shy"},b=function(a,b){var c,d="";for(c in a)d+=c;return new RegExp("["+d+"]",b?"g":"")},c=function(a){var b,c="";for(b in a)c&&(c+=","),c+="span.mce-"+a[b];return c};return{charMap:a,regExp:b(a),regExpGlobal:b(a,!0),selector:c(a),charMapToRegExp:b,charMapToSelector:c}}),g("i",[],function(){return{ATTRIBUTE:2,CDATA_SECTION:4,COMMENT:8,DOCUMENT:9,DOCUMENT_TYPE:10,DOCUMENT_FRAGMENT:11,ELEMENT:1,TEXT:3,PROCESSING_INSTRUCTION:7,ENTITY_REFERENCE:5,ENTITY:6,NOTATION:12}}),g("g",["i"],function(a){var b=function(a){var b=a.dom().nodeName;return b.toLowerCase()},c=function(a){return a.dom().nodeType},d=function(a){return a.dom().nodeValue},e=function(a){return function(b){return c(b)===a}},f=function(d){return c(d)===a.COMMENT||"#comment"===b(d)},g=e(a.ELEMENT),h=e(a.TEXT),i=e(a.DOCUMENT);return{name:b,type:c,value:d,isElement:g,isText:h,isDocument:i,isComment:f}}),g("j",["e"],function(a){var b=function(b){return''+b+""};return{wrapCharWithSpan:b}}),g("f",["3","4","g","e","j"],function(a,b,c,d,e){var f=function(a){return c.isText(a)&&void 0!==c.value(a)&&d.regExp.test(c.value(a))},g=function(c,d){var e=[],f=c.dom(),h=a.map(f.childNodes,b.fromDom);return a.each(h,function(a){d(a)&&(e=e.concat([a])),e=e.concat(g(a,d))}),e},h=function(a,b){for(;a.parentNode;){if(a.parentNode===b)return a;a=a.parentNode}},i=function(a){return a.replace(d.regExpGlobal,e.wrapCharWithSpan)};return{isMatch:f,filterDescendants:g,findParentElm:h,replaceWithSpans:i}}),g("5",["e","f","3","4","g"],function(a,b,c,d,e){var f=function(a,f){var g,h,i=b.filterDescendants(d.fromDom(f),b.isMatch);c.each(i,function(c){var d=b.replaceWithSpans(e.value(c));for(h=a.dom.create("div",null,d);g=h.lastChild;)a.dom.insertAfter(g,c.dom());a.dom.remove(c.dom())})},g=function(b,d){var e=b.dom.select(a.selector,d);c.each(e,function(a){b.dom.remove(a,1)})},h=function(a){var c=a.getBody(),d=a.selection.getBookmark(),e=b.findParentElm(a.selection.getNode(),c);e=void 0!==e?e:c,g(a,e),f(a,e),a.selection.moveToBookmark(d)};return{show:f,hide:g,toggle:h}}),g("0",["1","2","3","4","5"],function(a,b,c,d,e){return a.add("visualchars",function(a){var c,d=this,f=function(){var b=this;a.on("VisualChars",function(a){b.active(a.state)})},g=b.debounce(function(){e.toggle(a)},300);a.settings.forced_root_block!==!1&&a.on("keydown",function(b){d.state===!0&&(13===b.keyCode?e.toggle(a):g())}),a.addCommand("mceVisualChars",function(){var b,f=a.getBody(),g=a.selection;c=!c,d.state=c,a.fire("VisualChars",{state:c}),b=g.getBookmark(),c===!0?e.show(a,f):e.hide(a,f),g.moveToBookmark(b)}),a.addButton("visualchars",{title:"Show invisible characters",cmd:"mceVisualChars",onPostRender:f}),a.addMenuItem("visualchars",{text:"Show invisible characters",cmd:"mceVisualChars",onPostRender:f,selectable:!0,context:"view",prependToContext:!0})}),function(){}}),d("0")()}(); \ No newline at end of file +!function(r){"use strict";var n,e,t,o,i,u,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})},s=function(){},l=function(n){return function(){return n}},m=l(!1),N=l(!0),g=function(){return E},E=(n=function(n){return n.isNone()},o={fold:function(n,e){return n()},is:m,isSome:m,isNone:N,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:l(null),getOrUndefined:l(undefined),or:t,orThunk:e,map:g,each:s,bind:g,exists:m,forall:N,filter:g,equals:n,equals_:n,toArray:function(){return[]},toString:l("none()")},Object.freeze&&Object.freeze(o),o),h=function(t){var n=l(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:N,isNone:m,getOr:n,getOrThunk:n,getOrDie:n,getOrNull:n,getOrUndefined:n,or:e,orThunk:e,map:function(n){return h(n(t))},each:function(n){n(t)},bind:r,exists:r,forall:r,filter:function(n){return n(t)?o:E},toArray:function(){return[t]},toString:function(){return"some("+t+")"},equals:function(n){return n.is(t)},equals_:function(n,e){return n.fold(m,function(n){return e(t,n)})}};return o},v=function(n){return null===n||n===undefined?E:h(n)},T=(i="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)===i}),p=(Array.prototype.slice,function(n,e){for(var t=0,r=n.length;t'+n+""},A=function(n,e){var t=[],r=function(n,e){for(var t=n.length,r=new Array(t),o=0;o 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 = typeof window.wp !== 'undefined' && window.wp.editor && window.wp.editor.autop; + 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 { diff --git a/wp-content/plugins/tinymce-advanced/mce/wptadv/plugin.min.js b/wp-content/plugins/tinymce-advanced/mce/wptadv/plugin.min.js index e5b2a04d..46c876b0 100644 --- a/wp-content/plugins/tinymce-advanced/mce/wptadv/plugin.min.js +++ b/wp-content/plugins/tinymce-advanced/mce/wptadv/plugin.min.js @@ -1 +1,233 @@ -!function(a){a.PluginManager.add("wptadv",function(b){function c(b){var c="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";return b=b.replace(new RegExp("<(?:"+c+")(?: [^>]*)?>","gi"),"\n$&"),b=b.replace(new RegExp("","gi"),"$&\n"),b=b.replace(/(]*)?>)[\r\n\t]*/gi,"$1\n"),b=b.replace(/>\n[\r\n\t]+\n<"),b=b.replace(/^

  • \u00a0<\/td>/g," "),a.trim(b)}var d=b.settings.tadv_oembed_regex||[new RegExp("https?://(www\\.)?youtube\\.com/(watch|playlist).*","i"),new RegExp("https?://youtu.be/.*","i"),new RegExp("https?://blip.tv/.*","i"),new RegExp("https?://(www\\.)?vimeo\\.com/.*","i"),new RegExp("https?://(www\\.)?dailymotion\\.com/.*","i"),new RegExp("https?://dai.ly/.*","i"),new RegExp("https?://(www\\.)?flickr\\.com/.*","i"),new RegExp("https?://flic.kr/.*","i"),new RegExp("https?://(.+\\.)?smugmug\\.com/.*","i"),new RegExp("https?://(www\\.)?hulu\\.com/watch/.*","i"),new RegExp("https?://(www\\.)?viddler\\.com/.*","i"),new RegExp("https?://qik.com/.*","i"),new RegExp("https?://revision3.com/.*","i"),new RegExp("https?://i*.photobucket.com/albums/.*","i"),new RegExp("https?://gi*.photobucket.com/groups/.*","i"),new RegExp("https?://(www\\.)?scribd\\.com/.*","i"),new RegExp("https?://wordpress.tv/.*","i"),new RegExp("https?://(.+\\.)?polldaddy\\.com/.*","i"),new RegExp("https?://poll\\.fm/.*","i"),new RegExp("https?://(www\\.)?funnyordie\\.com/videos/.*","i"),new RegExp("https?://(www\\.)?twitter\\.com/.+?/status(es)?/.*","i"),new RegExp("https?://vine\\.co/v/.*","i"),new RegExp("https?://(www\\.)?soundcloud\\.com/.*","i"),new RegExp("https?://(www\\.)?slideshare\\.net/.*","i"),new RegExp("https?://instagr(\\.am|am\\.com)/p/.*","i"),new RegExp("https?://(www\\.)?rdio\\.com/.*","i"),new RegExp("https?://rd\\.io/x/.*","i"),new RegExp("https?://(open|play)\\.spotify\\.com/.*","i"),new RegExp("https?://(.+\\.)?imgur\\.com/.*","i"),new RegExp("https?://(www\\.)?meetu(\\.ps|p\\.com)/.*","i"),new RegExp("https?://(www\\.)?issuu\\.com/.+/docs/.*","i"),new RegExp("https?://(www\\.)?collegehumor\\.com/video/.*","i"),new RegExp("https?://(www\\.)?mixcloud\\.com/.*","i"),new RegExp("https?://(www\\.|embed\\.)?ted\\.com/talks/.*","i"),new RegExp("https?://(www\\.)(animoto|video214)\\.com/play/.*","i"),new RegExp("https?://(.+).tumblr.com/post/.*","i"),new RegExp("https?://(www.)?kickstarter.com/projects/.*","i"),new RegExp("https?://kck.st/.*","i")],e=!b.settings.wpautop&&b.settings.tadv_noautop;return b.on("init",function(){e&&b.on("SaveContent",function(a){b.settings.tadv_noautop2&&(a.content=a.content.replace(/

    \s*(https?:\/\/[^<>\s]+)\s*<\/p>/gi,function(a,b){for(var c in d)if(d[c].test(b))return b+"\n\n";return a})),a.content=a.content.replace(/caption\](\s|]*>|

     <\/p>)*\[caption/g,"caption] [caption"),a.content=a.content.replace(/<(object|audio|video)[\s\S]+?<\/\1>/g,function(a){return a.replace(/[\r\n\t ]+/g," ")}),a.content=a.content.replace(/]*)?>[\s\S]+?<\/pre>/g,function(a){return a=a.replace(/
    (\r\n|\n)?/g,"\n"),a.replace(/<\/?p( [^>]*)?>(\r\n|\n)?/g,"\n")}),a.content=c(a.content)});try{b.plugins.searchreplace&&!b.controlManager.buttons.searchreplace&&b.shortcuts.remove("meta+f")}catch(a){}}),e&&b.on("beforeSetContent",function(a){var b="undefined"!=typeof window.wp&&window.wp.editor&&window.wp.editor.autop;a.load&&b&&a.content&&a.content.indexOf("\n")>-1&&!/

    /i.test(a.content)&&(a.content=b(a.content))},!0),b.on("beforeGetContent",function(a){"raw"!==a.format&&b.$('img[id="__wp-temp-img-id"]').attr("id",null)}),{addLineBreaks:c}})}(window.tinymce); \ No newline at end of file +/** + * Additional functionality for TinyMCE. + * @package advanced-editor-tools + */ + +( 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 )); diff --git a/wp-content/plugins/tinymce-advanced/plugin-assets/images/colors-rtl.png b/wp-content/plugins/tinymce-advanced/plugin-assets/images/colors-rtl.png new file mode 100644 index 0000000000000000000000000000000000000000..9bcfdca2d797a92383c1b0d5827cab32bc9a6103 GIT binary patch literal 20879 zcmc$lRZv@R)b4S24N#ooPOxIZT}laVrMSDhyB2qME$&j>3lw)L?ye{QZ@$ZOd1lT{ zW>5Ac+1c-U*Lv1(Jv%~0Ng5r67zGLn3SCx4LKO-M1_^RJf&>G3g*l2Xhl2X5E-N9b z=Du>)g`B3V;lk=!l2KYiwy=Ku*IF@Wk7(QnTc zzMD>SxlWUM6v`eFZ1^MaiUPBto@F)BMz;At%koZlfg97z{bRZE*jb*(b^Ht1MO(W^ ze*ar(<0vj>zGd_dnm@QkM!QsS=evfO$SW^ z=9 z^7ic!p};~z@LP8|P`Qi1QQ`hKkuM%5B`r-yNB3*lS~yo)0A#$S40tMY0TRay8j+Hc z>gnmh!op4!WuO(uXF;|4T393u~wOegIyWAe2rly{U88pHM59D5EtI*@c4GRbe zczJmtA|h&3X>RMHR7>2vIS*FxrdG_x1*XE*fMg?L0 zl>2<^C>Q&LhwfgVRHzykyZKSV?zXNhL!F;Ec9 z;z^*D2{0=CfnJ;0+!V3f=QoB+;ezGe)*tz-@T8E-S!qs_(e~ z*60iMugb!G?wcT3`elYmy!}t)<0(m5xXtC{Z@K|B$w~hYq{$ zr-Neo)Id6YKU7SmPyAdWFGH^6fYpbkN=)I7lk!vy8&gbU6txow?G{oW)gO zra%NB3bC`0q99c?&om3TiADeg9)+->W_*I^H}rUl_z0Ckd+a!-XqtwroJmtkTyme= zui>!sNRU7laF*e`y3@m;la;^`2MHIz_a?-bTK%nRyI--Q{50x$Nz1EJPO+|9K7TNo z`Eh6PahGnE(^p7i1%D&4Vx?y@lFfmDk?$_vsuk-|R z$(A~N4wDrp7v77*>i4Ntdq@}YqKkW?_NgJF2SDOy-Dz4VRnK*K^+aj1th?M!xbDhN zXiQWq?nmKk-wdaW2-!FFV*PlS(Qr$x-G4%tL6u!%(M1pS`iTTmk$13ZSg0 zv5~#m``%Vx5G47l_=Ky zKHg3iYo#qls}XKB9DETkc9lz2fQ^O z!pAU$R|=>4x-=|&|NhXkY2_L;2V?LwrqTVpP>X?ynaj?whcc5^mm_jluIzK}l$+`C z4fEDd9J~M7D(-dq0hs6@Vu%A<)2;+&45TJg6P!aYt~)EYj=m^Gap z{NF5(340zTQ!YyTQQ~#I9?nA~KxSu0M@JVIVOU|YPK@HIVh(wq0!#~L=_gg7e`9f# z(rWAYpbSZ__q?oMhL^dgM9c{dd^rhY96`RFXPY9?DyeYcLB-gy^!(oc`MvkTV&;+32lle?GPuA(O_MVAr?BW?kbZGKZ~IrE(b)MM`y9BFua^6| zN7wT-X%`z4GZ`&xFYSWgYjX4S8pYP#3R%#bX%TW_oKPJr4Z-kpyO&_h*o(ItzmMA< zyVu3-+jxR+u(G+tswRqGz#8>bqZLI6YTWcBCHx%R^=Fsk9n!8j0(G=xO8)VdR%B^_ zP6R=GnM$9RdqpKBF=?_-pH5FtgU#IsEN)w7&x$<+WVRiFuYTMdt zLK|IqZN6+k_AG}Ahi;!v&s2gv<1MJ$O6{XJ09IUF+;G#Fb6L!<3YY$Ff@|9QY23i~ zdX!GS7>5j(Or5%&2%fE%xRAYce>}CYl%K<}dPh?B5h};;-J`DG=V3jJfP$nRI|<9# zWDVx`3{%oOLcil%@&+Die+48f22Q}eIG~ABwYO1}eleC>I zX2u?2KFN`_<#2+A8@ipr-wsFp0?bBZ?y3(ij!vH*Ko!R;R1FEw*}P^ zc*kvmC`lPadsw2+EI(0yqttdkA7lDGibsQgh8dM9S#F#b1ydhKxq{aFe$PzKZf)hO zH$j0vu7=4!R(sx7V@P;a<2ke(WBzRA@gW2y%Z2O+_o1^ZTYNUW(dpG{Y5hJBI_-P^ zOIh#=E;+v4O8g@HAqWxke60=lcb)NQVoD=awXr(>-I0*8?~#Z|%lF~kZFBZDGF7U? z&pN8q#GocTk=vj=EpB~*+m-kFb@_kQhsqfKxx|gC84=qyFy2t=BgULJ2a_jfXCcN# z@d9oy^e&!yi?UV-yz#rxyn((ejMASJ9s1QDXXAX~Y!A=RL$QMzxaSQdD}~Gv{HAk+ z>c|L~HK90NyCyerfPLsX&{a@AM5O*y51Csv)ULr}Xm5s)%2P+8jnfxF(EH1MJA_d9 z<7qmG-4ePJuTAqR_?KWCZ~`X z*o^+Yhj^Aq@ui``v|O0GD%4=P$A{0!-sEGsjs&gVF)*SJm!bzo6Ixrxz<^w>Ep*CV zm4X7J7af4Vg)jo21;^V+qX6F$I`tkz{tAT?*3ZP8zCF-00v2id@mZD@l;Zgvgp z{yd0WK9Ime;04i{({jzmuJ`zfjM)$3YXFz+gC+CEj`Jg64W5t87VW$mYfA^B)%HO?=VhYB_NHT}=7^J>VnWFc@zpS!}(>Ej>y(k=Ow zgj!@qLrlV%#&#aN2B6Rkg=v^cdlMkNg zew@Vl?hjADS@n&;CqeTs1={;9(?wvYkY(^yJ-rgLv_~rt5oV)zk`IhpSf(qOy1N4q zySlotq9)DYkMo3tgzEB~+CHJoeG=c$TI;Y{tf9+sr^;5MOOn-;XGuV%N3)HAiH?me zU`NCxqsjH#T?webJbQ#FjHedAmllZ7mDwYZ3K3-mF$9c7_n$7+7tSuYvBna(zd!x! zxr(vNg9lAl8^P~b;6b_G@b)|@3gXF)E{+_p4h4Qc%)A$QDg4*%#4Lno6E{Zr&2p5J zUB18i$LL`|gt&CySNz@j?E+P40TJ!LlHJpuGemA&-dh>G4>jM^5xlOy(jd3+Xc- zbJNG$??ucQGNi#bIhkhWa`12eRmSi9pKdOM+jm!$-`TVk%@AifIe-S@=@}V;C1_x5 zv2?0$I^0Q6Z%AU$gZ>A6!onDZ-LorHG3{roE&r+7p!kwS9Wplg+t)wxY>@Zj$fT(u zHyJr(>!>vMeWBJ@65EJHEhQTR*;A^V%;$Di!@wt5^(QZ@HXdQE8l!o@$8+rmRnj0T z3nqYxB z#KdNyA(5=#*j)N&DWCnxn+$&3^cT8g=-d?lvg(13vUiutnAKOwd$F+}G8DOcQI_f6 z&m_v;)m5o@S{w>)f4_2YOb{G;*8$iuR##TEbAATix@DM2%hJ-)Qq&b8C^rNVw%Dvn zaRFk!DJlOo2Yt7%b2(8TkuLuZt=&2}l`W9#bFVe_={(yuLKy1C0kS8DV@a(V7h2se z^fl>#K`V|Hc+d(<( zOKHWJ`@GNe&{r~xH`%CLCX72!Ej!_;`Z)o1RRvx zbcNk7Db7T8xkC~_T19yaiG@pp$Ax3=&jPNeAZmB}+)rk+M0kWUQkpU6L$j)=cu|9p zwQVs@xRJ#MjF4cC4>sz#-hmD36aCIcm`u7*u$evVVTDw{AXfFtS~A}@HJ1F|QhguV z&=y(*88|dF?H{MuxtZU1A_*g<3gfk~(1FhD$*8T@zkkE2nQ{_#TKxIy+6Ie=Q8Z^k zxQ?dwCLV@yw$ZivZD=QAK=bRRGX=r$@bLOwLwwlL;cOuV!i555_jmrUf{jpQDN(Tm zE2dB8&m;HwHrshi`QNT51QWS3jWMB^_B5JFeLZNL(BOq#3Iigxt3_Wh#c$o6oD`8@ zGIsK^r-&V*IG|U?H!}CCk)xxdA&PI&hFDV`B1>6h-#K1{{f`F>iAhOa^tgHjida79 zUS9JRqY=4l)-?P3WDnqm#VU|pTSV?n`be4x$cC1bBMv{1%9AJ15PI(_pxFsA_M#-q z!5hs66$F^#?Lh_zOx1v4Xe ztC^fr8iFn!_AGx%|FPxpjy?EJW+GXWseQ)~u|AhJsP2H?yZQEJUK)ftLhU^4-|E!rhi{QQlVNQhu_8AwoPhg zlve$BYuN%WjFLF@Yys=i9hDF7{JD_s+r&5rzp9YDT+jiI5LwxmZ?cvWsD~v!;97a8 zpL6!r&kAVKTIl>2zr=P&yp-m<^5ZOO8bQ0p=UL`ZTCUYu3TVH$zX~-4Zr|nM{YK}! zx8PNbYk``iZCiz*!D3Kq8P#FxiNV-mg_5acAr zn|MsJ*}e(`?MJ_tq&RThuAo#Jb~IE)A&fo=U=O<(AC008p;{ppd5bk?f#|Cb9;O)d+7=bZ zjLR1RfuvEInu~oyMdzvWb6cFK8Y_gevona?+GqiovpMq$_`BQ1IlB(ES9*du1?A9E zC{H|_=r+~~l-gDQ%MN7t(9k3BC@VL41!|1R=5`2+rD^5xD=RDP8^naSJ187b5V#tn z0-&^|aAHc1Oyz>le}=GDchwjQgvQ=LcvKopul#bupr9Z~N8<$Ms{3s0W~6WM;@zcP z?_6t%@C6uj{2B|NUC&AzN(&8>8Xlm&;3=m}V+86W1`aBu25JUR*vv3OYgp4Z{G-6r zRR;{Z5U^+i{ocLfrau=v%cn3qXfS_Cg<*p9mGk2#0D3A^mOA@wu|dc3y&sh($q@MR!a>CNzL$g2OnBDR3?(W8CQg>HmNn>cs`;_Tv1P)Biok#(yX|!T1TY=|dRN%VPHSb) zwtjUm*;HsbvDG$RK8>U!e8?(hAVy*Sb<@UAOmwSqxEtT|za5`>rc<{?vVr-CNH zU;v@#J@d2hb?G&TBN#EJ5b0#2|^$6H%lA%yzjr5B=z%ul|5YxLw7+`33q zBw(XM621bhB)ic^V8}SrBVkdpA>|;6BDO3w0}8Xtj1XU?LwTzAY3His1roi z7h*%cJ0m-2&>n(vgYdd&i5O_n!H{mhvZKA7cpln56+*4o9LHI>I)Y2pc()ER?S_67 zbR|PFX<4^1%b~9K!q|yRp(TMrCP45H6n!Ye3H(y@0e7X{p*#e11)d z9EOp<^JT1xKZXD|H$FyKpANd*LC|*uVJPk#w+#>T;2|5t+j~%liLsh>kt=l4dZ4&Mp+_= zv*6}?u!4d@{H?|IC501o6+1uw(ZfqVV|#bw*&WNw?5xApAR#V^hbUj7W>N4Ggi$jn z76A*?=9{s)7xmmo&kxH-ftSGfz)aira)*Un3-0%OyAPf-`RxRHG)9CCzmpc<%AOtr zO9d276zwy`+jYkcJNgFI(c{Ez=tAfa&OOKGoyFIdEI%Ey#;8-0mYT`5WCnB_yki`j zFtP1?7LA{VOc3E90~fs%8fmd2K{$^z3Tc@IcPuD!xlmyBCHgM?>A(Lx;Vt-iP?vJv zd84G3o7JU%m`;xjOb!SL=s0hWs@S9u!DWpi@SnAx7J9h7zxNzA&(l)8^}|Dh4d9t~ z?0N1lBtab#abBSNvZJT|m6NG@^NC2gmr=)b_SoX&Wu!v{`!-BPM&lEj0veq(Cc7GC z5JfbEQgTq}G&!NxtMOz?a@fzz&CO+1r%^iP|J3t++D}|MO`>(u`Ak9oN(<2mFab?g zi_I-9yeokL_PX^(gY7OSBb5O#jWecH*`$`x;m3b<>_RveRq%7vk@MgodFnO*)7$@9 zXZ+z`9!%bj+nU3$mRa^f>-ES^G5ztM^ZgcmcY$C#VX%tABoB@DpEnld7IhbvB*x&z zOFRA7j<>TQc9T7ASxC0B0_LHL>A?sYf|Qh$5`9;^N5eBy#`o*%IaE_9@iJ5pDi|uf zC%G4AG7yl4)fMRzcIk4bgNjnw4Bn^Qx|6*7V{l`Y0EdVokD?=amQ5>;8n{F@kWe_X zX<3(YXhh#fIEI=Dd*8x*_cz7s0>#h|WpG=)AI7~S!8`FdSSj3{`LyRH`dvoG)sP7) zv!#0~rA`n$5eHAVWz0=Bc=RR8`(BWei}hKz{PH3Nz3mY8j5zw;`y_CZm~j%(pYmaZ z4NS7Z7WH0UUOqm$bEapB`1!H}tXCc-rlTaN@>LEYESesw@lMK^KLa0enh>5qLb zyf$|Rqe#|aiilKh3AGJR{#LUu5;xi#r>Ij`6+=Kd7N-LQWhrJ}NuxF*Tdy=CllpU> zG!?PxoaA8;HxiEY8OCLpeBU*6_8dP$zUKEHEH`&uTVWRa8;Yctvw3xnyP(aPYT1PC)<$1z{e0zq$VkhOK#n?hs#aHB`BTt5B%^7k7JAO?IlVpFCm*xa6{9!CiZ>ajXBLCn>M^$7uuoU>6J~Y<-%c*!m z{)IO=(iPEMm{$|NIE``W?JBP8-&~8q^9#7Jg0Z4w2o-l=RTM}(*qfG>^_v2k11N1( z@`StQY;KN34P7;}zRtoeRF<_zt#(&lUar^SnjpFPi7sparA-&(f)^QR>s7#8B>?_d zgA5lO_eLNTo4E0#FVp`Ie8H|L#rylkhcLJ&9X{``{x4H>=4L{D_W&5&3_+-)61R1i zMT7T!1EX8+Z`=X4wr>6bs8UV?Z09~xY=|`A#LUIF&%eyI_}erYefN&z{9ZFYbik*^ zFEz>*92}jKzR0%z?QoOW;y+Ij%E_o_k5Fj@u|if!1j^hPV5n>!P^4^PmNm?BPFD*^WnmnuEFcg9yg}Wp(RA|kw*1M z>EUhw6iAG}B#s)(|20fH3hk)Xtf$JH6yrpI36QEhnf z1{ESpgR_NzhwKVFHUsAeI|yxrwC3?I+u*UEFpsRM1m5`To62g%yHn)C>rF@Qm6k8Q zdXRy{4KR@EY_aD@67>nk9B%1B93|e6Vd=mvR1LfyN6UWne;tmQ=o7G zrg-JzoV2DHi231is0foe+rH7Zza$|xt^gZB7{nuE~wY`;&G*?zvMXn;0y&nh2ZCRN3 zcn7~}LgLC2-4*Uf!opHGfeO5{-Y{0j%Xx>$%kng5 zoYir3RB~kXH)D3Huy&B94^?;#!Q%ufi-flzZu0T4fSvLYm#b{=HYYsZUW z7Zz5UgP@D#O%^#&<<5@b@MrmyUX|AK_7nR#f=Ee=P;#=wE68McSm4wQqmSXot!bPsh^@*9JH>z90eXqw%2)^VaPaZNA#z- zYV-oPNEAt7;+Q{DNM(;pOMov>Pr*tRJ9h34Kx#Y;6j1wdMWyi5sPcyUZVXUQcJVjl-A;%W`aY52aJg33_{CxU{|JJ9 z`{Q3??4ydqsEe7I(J6j&w=czGm%$Q&2MBe87UWfg9Jwd1wr+dFrx#+x!NDb}nFaOgJ zO~J5{lXvsJT8HoLOTV_wk7wL+--p;*UQZ7n^TmoO!kAgAo&qy86Ro@MDvYD_8%(qp zjKFM%>ar1V1+dwuwryL@0<0hQ%AGA08o(yV@F$|r#M9qb`W8eYkz`yd`TcOG$2Jgt zoz#=SH*boge^V7Q`))7=Ml^0B6 z+qx}I{;VP`jp%|L_uwZ7hVyKF*zmgOxDcKR62G@oCMO2~-2Y33N6LPlkoh3lJaTO6 zaRDqnWMuQU>A7PC!IGDn$Kl^I8W=}?wXWnFlvTZ{{AGL#$w?BmxLNc##}mQzG;=xP znVa=nLr#Bv9>0|~fYipjxxP8{MAT1QI8fr_G7r03Y)M)zdH~m|4 ze&ateP@7WVd7X6^0mpQN&w7DV#P4lf~= z1C=<}^R=hjIpvF``d!GF`4FLYQ;0;Ur=`Vhwm{M>+vP95hHky%z8t;OAwr{|d916y zV-qliRF?2hN8H(x^VV`#VFzXm`KL*=Qq-iuNHD%m@Ut2No=Rf=eU8M1;lKXRLgTFZ zx3Pml<2c*KZdJpz@Y-NVqaEsuarF4)Y=rbDN|vMOA|6L^Z3}>Fw={b2i9v4opEGrf zpbShuj2uU?VA3%Mok}Dn48$$~fSG@!T}&@rASWYJDpr+9Dk8^X+i{pXmMM_ZjLgo? z=CWb9IQ6zywYU721x@acH;V+hY~lggS7~i*ZT|}8Rj2p%lZhA%L!!fVE-u43<5D;ETv0WHJB#;tkx%GDEB&Lf=4KjIX6?@BRg0v^#GezbGHMJ$+qBz~_aH!3f;YIGRPo1ci%I9n=XWfTwiy zNDS6y>j4ox{q%%37oZ2D#AHRyFg>z>v4Qi%A=u!k;mt=fCAp0iS4n-RCnk4-$Ox)p z!ICwVDRsQWB4?w^0K5RPY{p1A^fvhS+0%=HOQe6hpKCVr2l_|(f4(xmixqAGM3jK@pIC?^U3P$d{rksVp0KDairL=6)J zQwt?rdV^#5On+znBFn=~g^wIG%2%OJmdk^9DW-A_3FsqX)REv|R5&02^tTKsFGMOR z^Eb$eVcGhACSTlL`ZFc)>%Tc~n($#v$-J&EA45Z^rUU-ZLqtgO4SVhSxeO+Mo^Hp( z^w%6t_uq!~E05DPX9zFLDLY{tN9Yi}8w`?x%W9wX>J?;b<)pwojEVV~3*Mk8XSb}? zIiI6Wj|((70q^(Nqs$5Txd3K}^%8v_kcb5XooHWT;_rro9Z%K{rG?`hEi!1tahMSy z5!fyAj|D*uvx@!87vdPHe9__EtMrsv3uJTXay1kJ93TwVK&QuzyHbS1kfZp*Ojt=M z`Ns2%JR|n#rP3tVhCq{xjC^!mZ7&svbXuOXykjmB~!U&iy1aFxu<;R7|qNIf~mTr8^TiTeBJGT98HM-%G2G+{}^&yNliI)MPR zFP8y~_7v$E)_tK+ynBC=C)D7raWRHG54tMtt}cQL<-4qbpek`F2viWO3c^`|r%FH? z*(%DKj;E{R02|vHR$HrnDE=yoe28>I|eT8!ICv`3{mrV&#f-(wQMyd##{B0EI zaL`+)01n;zMz;L4Hf^Bg2a&B6$Ft3bf<$PDcs-_Lk>BMI_Sz!YG80iu)Djgtjpq_2 zv6wbYu>Vw~?Zh=OjwjR+pq8(nb(cFka0+>tUrci*=^U`NcX{5a@;N6vm^ypOIMwy5aeO4Dl5f^o?aEm4;b78sd=aBuxERKo30Vbv(0t40 zm#181wUlhu68$tUh*x5RwnY5PM+-pY$X*ZvlOO@)<4>4WuoY2xmf~7uM|LN|Mu-5-K^m=vKd%fn_;s3SI}M59&M=37F?T=icO zji`JUQ&{JGKTw$Zn<>ycIZK8DZH~;%o%fcuvo~uAq!88D@WWZ^+xogq$3J0W zP3}8-KzM+hklH|BpQ!mWaNFrPp@im{TM?E+1tfTgSOR+pO@M66o5~C^raOd!683#| z2R420Qk|e!~nH6Z zu%}yUhB58}J28%+w9zv=@-L}Tm}byyTVPRPFUFfVY~;i=aG3y7<_XlBY~?vTr7(pn zo~ck5U(*R>czWRTe$AobXhM&90g01|iIk4v+92M<uVGZt!~B|(#&!nN*#_N6BZK? zz170cPsBEo)1RzpsEEnrzsD4Q1%kN<_Yj+{J?+O28Z1I_ZM5l`nc>P=pKUl;!$q;# zv^XtmV2$7-_y(LGL0Ka2+`F~SnA)5XBFs^-=;bUG_s(!{avsi`LAze>dKKlziUnc+ znR$$RHaAySQ90IM5urPvTkfB{w?aopN2N3w|Eu{w2&yRNRR@3%%F%Deb3;M9yEdd} z+RQL#`aCq_6#}s=hj-i;fj`9KTT>(O50(EqAnsYmo2dj!&Q{V+ewH;((B$^4L(@AB zw_4ARP(2tqtnp)0JWH9N-8U`_nM{^5+356W)UJFQckhF1q#_Q8~S_`2+~HiEbSBjxcBE>UMJ;j-wGss${l~M7XAc63v1*u2TiRe8JmRv3QUC zyoT3u4)Jduv2$}v;>w+?&g;@3j7#*ePZ!zv1ET*bQ;h;#I;5p?+|R%Ri94f3#pdb@ z@gtmRzQ`g@XPOhV$PsMIIS3KXen*R)u^&m?PVKV7@0sz#3k^pa)#vwRC22{BmJm4F|H!kek7hsdRMIk#sr=T#nMh-ax1YZoN0Pp)D=H==&gL1(CL!iBn}wN+<%`CEJbp3=kQMja?)xI| z{Qc>Rk4O(Nv2YrHk9R(s6#bpd^jeHNpFRZ;kEa@za#M8xYX9vg`s98`^f zP?&!ZXkt;3QTvnkbV)dU+$ul3!UF4-Q}!uix>u?6-y>%54x4^EO;WNUz4Oo?cqh>L zN#b7T$cf5_=1Z*p1BlNIt@1ntizvAls~vx4@4nR(@7qz3a@s;w)uZk|1Wv*~M~&YB zkhvXKl73@W^?w#1iB*wSbD+CLKxVN<42b!d>CE>~r2DXQbxr7Id1BYG zjiahOxi4+omR^1=_}unE>QA#StN67lnTcHd;x%(RSImEVy}X=ZY<>?#$UPWvN+h>V z9-}Dy*4yHDo76>G$@aACMPS*U%`kWyCO#0i?pM|6v($QT{Zm8TCm=7MVOV3Gvlo9( zv4lRuQ+KgW=r2Xma~v~~fr^>#z;~hX;fl52?&Gsh3s_@Cjv7M=3(qu6k|;f778qo`V&o+Q%ZP?a4gXXTgOcqkoa$feth z#@Mxdjeb+3fXY;|agPBfW4Q*om#?|uzR=)(ei3}FsZFKU7pkj%(M|>gx1ycB?XQ;D$v}?V$2dQ&qn;yP+g5f9f|3SxcJ?2&=9P(TU}kyb9CKQ& zh7yJfU+ag1JCUbtt}qk%Gvwqrg$lNAN8n{&W(s;EqP5Pr0jby7KHbH~pg5x3&6}zu zG-}uD#QUEYzkki+sb%WmtI>tmk#7bs!;@Ba!~$Ml9bR^oZ6m7qR(oEDl1XX5!R$`( z5LqvH(QtDEbFRmQ!FS8ot98eChJW_rt48k1DLhub*qA_o;l2nK zbAsab6W4oRsDf>i!fDXlHB=<|l!zDjNyTUIR)wDn&d7dz#_b>>FIt@ALFVW2$q_WX z_?29-YO$(=NkGWoYg@X?3UE!V-KL|Omecz3Ta=M0e_?jKB0+Qh>oXYje&7MVXq0;T z?XmJfnEYdA)7xRapVhglKen{ztr&vDpNtN;HXkqBc} zkfNPyJ_W{z!xLwYUC45g*%~1Ch7+j(;w)`_|2d z!5UTV*KZfuwRUUmzf?G2Rg2@j|DEw}Ubnd|MQbxA-+Xqu%wA-cPYJz0U9vOxRW-#c zzr8-saY?Oica<#4nk1Argik?@=E?^A_9{`4F>}nQU`Ql&saPW6m#?7YvEcbU7@@pi z;gO*mCq5`WxUs3#VvtD5pHSthf~((dedNf(49<;JD6UhJuazz#cGawqWP8?>FA`;Y zK?CaMR)L*x7j}Nqv}M^PH=l;ko@;$haQ#-Y^gibgu%1q-A`TVi@LZ~z%3P%U)H_s_ zVPFkSr5OEbrTzz>_vFfr*J@xQPWWJd1x*v1$iF`~Ud0AB%X$?*@if(O&JObZHG=|V zRFa;jwg2XzDqxVx%l4#Zb^8JwNEHMwa9%UsT#lw?9+($GB zY%pW^7kL24oLiBxU!_0Qwt=uO;+-?d%ySN zlj*RlA3X+gR3^=S}5joh5lY&)Iz41GE!s)*eyN9MpCziryXLWg> zHemsCB_gYJb>9EJ^R_-P%@aBy-+IBe4|p4mYPhDhQv@d zse57`>8&>`LMUL%f~Tg|Hcr^J=XTzD9J2!-Z8RG{KEPJxcet7BZSsEMZMc51-W~Yv z2yA`XA9gZvqJ=#w8T5DpMDxyUS^C1Sma8~Xt^y6^-DPM5R2S5Odo?Vle!P72x7OJp zVXIiuJL>Hh&K z;~*4PmG7}`h^np8c9*o9m=MonYC__XSB0e{@7Clod;gQOf9pc~B7n%K zEON7S*rq{eDf;hB*Ff$ffn7FENc6u7K z!t|AjG0;=I!EAf^AG-Fm;N#XoeFJf1%jbewcPcWq#%uEmn0g5I<1tgORIg9upkYc3 zA6|JI9Dw+~1->MrB7l>Ig@djL=C>BTMJF+nwCj0|lGN%&0~K+2lp)!B+oM@oEPw8* zAdmXRggo;uE>xyg4PR6aue4}UEX|tDd7;6;Q>aHD+)$AMFFl?9iPZ%0-K9sP^?2=G)Zkv3TywwZ{82 zE_I^*2tG=Pca0$+&k-fmMe+!PgV6d-L)UyFY?k8_jzjBv5#A|cSY~^vO$^s7#m33b@cFQ%>j{g<8Z~BwBZBV_9-8t zb4gdE26^kwmAmb)Bzqp0AqwQ-;*CB(0h zMn`*1>xos@+r#^$+xzhFhn5wp)q?lX={f&JS8iKh^mCPW{z<=p-G}1IX7|fk&tqZO zKuS%rK<&q^w4K58x?QI`5L~^QZQ7*C4CagC4RQ#SjeBtCTf>ehx;D|`JxexL_hB53 zMaR=O!M3F7#AvV-D6p{$wv;Z6@}Q9jns?Q& z+sk0f&~K_DF>;i3Z~q*T@*RK>S&E#c|C?fM zrdx%t_4fE=v&X$}pTVOZWU1(jk*!rpH|MYUE@ld^g9~TBmNcJ#{eV6RA@B22! z+RqsKPNEW7CWOeo4YH1AvW}Ut6((CK8H{CYQIYK@Wl5rY-1pP_(f`5!JiDHp^SaLY zzRq=>^ZmTvUwnXnCSkXhS5RQ7LSLJ+fL$%=u%6SOek^_#Db-SiP13~hjU+-sqr=>p z6#hs0%2|K%9{1QhBoUTEH?Aq&wRIi7CzV33DM-(Hyt&=GYT?lZnwjAk@-zC%Px+h= zxU|4|^%#q@LT0&e+&Mbo$bHYL{vxD35yTVK49^oc>$pzKHFu;JQqfZp`LTo@A~Qdd zDfFXh1_QIT)=Kv-2$JlOefV2>cNo7k4KXW1e+_J@83t~K`}Vn)nKRN-v-Z^4OR_UQ z{7%`WAOotiKebF{a_@}Wk8g;2)P|kZ#f9ne#h}2+F{^v7STsG-7Y8Qok^(-N3(F60 zG;7D7??;B#fh-~4WQ;p2pJ;G3Zn=JON83*>&=t1VI22^~bo-%K&q=R#fCU+j8RZj9 z#&KYB*b;x*`M*a__klT5UFctCzw^ReIBps$8|Y!c1X_IL^J;J-St`{PoBLFb&E1Yg z3AYP?JtgnTMA+t?M^&KqdTry)a0(Cv2m5JQGN#H&ihw^!#A|Z}B<|2KEK>9sBi@Y3 zN%U!nDm8RrRoRA2^&cKHMM>Z*o4-UF{ZwGfReWb-JN;6 zOfT?|C{t9R3vLYo^fQBTOr%_2OVRl?a++H?vrVpVS$_F@6ty+dv2ENS%#el?jT`gZr3v z1*|istUWi1DI7tsOpjsM!e0SQf4#Nsdn8u`hy9C_<*^lEf0o-zCiI1>={s{OQWnYC z>0rq`OT&+MT6N_e4`D>g1VIpv93cZFgXq2;Zs3)`EAxGnxvY=CVExQrk#i}SV|@)c z$W3b-_W-heD1Qy^twFFrmdiX`2AXt`gFjRB2S z=x=0d0Hy+s0%43n;3trW#W<Xok zg#MVTT!YWo6OJTkYbVld(RbBu;b>w;hOnKsI^nrd3-WoKa?>(2o}lS~{$;Uu3X(rn zdLU9f*VPR&L^L5DjdZX=y8@r0L0(aFa}l;uq?M(muGW2v^9l_wj*LMH$z@BOZt~N# z0?$2;CBa^6WJSb$6kqi)d9<^3Wqi`RGkZkefuzfWG;NTb(a+#wt{im3g1Yb$WbB>6 zTs6);+~DN+mbbBwTiG5vznq+oq)A-X2lGcOO~># zipn}696;A!_c(Mc$jEM;<=&m>kx>(1tX!UTswRy#Yhu+b2qG&UQSpFFJSfo&#(`ZE zQ9y@mC`|EQ>uuda#FXM#9T7B!Gg>4zAzSw6B6pjAE2A35yz+RKZ0Tp*xo)%+3C%BP zs3@vOORxuqg#meaDLm5E)c&TOrawpT0gG6BR3$g7rUcur`c`#qR0+4gmC8N8A4?`R zcJD@~5Zq{z)Poy~f@yU>^9R!JCwP^mEJFS26jmb70H@J>%eXTrij|r6I!N2`J^#GC zLoqY9fdH0G75@^02_+*|)r_;tESK>##py*+> zG0JZ-j)?zC9~_Tuc!wc(Be7L#nfMS1g=ADY*+GFuY$R$o zo(i$0O^_q7T%(!mG&jqJ?AhX|2NGyrvIvI1eiYpuPWL&#-XXZg^Pl)rWz~Q3ZT!Tu ztY|ezFLh*gXl@pG1E(Qfl34bt!i~3RADvv$(R3lJ8!R}Z2#g&#7t*-4DF>?3tn6vov5hz=E-Wr&GM=h@dKl`|+^wXgfm_}92mq6S z+5M#+sLpax5Dm_nV_3B3)$W80iINsqY?z5Y$PYaIt|q@Qt}rO&Ps$A#n+P@n${MKo za`kSsb1ffSizx9;T{=EEfKCH7qnQp8gn*gGi0B~y<&FTkqV4T%c;|#5&$if2+mlK~ z7G~z^I(roR!M7=Gh{=@FoN*=Xtnd&wQ`lR@52hmF{b3$hg<1)9`KoX@N8eSb7<*;Jf~~5Elf44B zVJFdk0%`LIrpt8+SUD=NB3(uZw*s*HMmUB2SpT~n$QR=J7sJ;mK{R~NHR(NwZ8wjg zlvVu#T=9nJzeDks05tGqs#^Q{TKCq`yVY!MqNb$*3(PC3i{)`w-; z@p==jEAJAkH{&?6{K<+#QW4y0C2?Lm+Jz+h!sXmb?mi5b@;N!nXnO5)5*DX4*=r~h zp6%UP!06KHp3;)CM4{D$nkoDig8|wkt0G;u_+hd=%5d3tPJ+^*q2N?OPx?D~20pnT zVZ{a7qgQ+t*7;PQs)=@H%W6li+>+P&J^8CD$5~-6$MlJ((L$EjyGUDojsd|1&67{g ztO=su^k#N%Vagf%h3GU9?LI*NbkyZg1@AV0usEi~9mV}Zr{fzs%3|eMFTQ$-ExmJk zGQy;*(vzEYp3-PHbaQi~G-i}|qk_bhxj~d5IoFHQQbsyB6yV-_Im;4%v1Tr$mY3=W z$Nm`o?No8L*_?9B54k7I$sn4vT8Z{QioTqE$hwD*6TA}IQbHB%*_I?^4dJM!MF@mL zr5JZo(4ssX1|JIT6lj?R^`mope|MVZ7D`$p0Ja$Nu~Z+ z>VWEV!Vf_r*zvYNsuA^C!1x#13x%4R&xyY?M#_e-{K0;YA6^G1T4X(jymkzL_2>?4 zI8>dwDF^A|LIB*XjwR#MX?m19w4P%*Hkm=PZ*m=njCBOp%Bpl6p?&tcg;iSSuB5z0 zSW4?XHOMbA7nL~Nr5;~bZ@czYB-1l#f>&b{&dxxqK{+%vZ)n90Tr`V$p<2aa6q($& zUq5x`TTV+FlSlHArg|?pXRwvkv|#nxzJ!(~7DaV|olW6|XSTaYzF`AU5j1z1L+Ub+xQ%7cSrsG*-XK1{X`LM^^V|?4TnFa zZ@B7_&ZRK2=SyFb(yJ6Z;vps=-|7vMgAnWGLyEuaZ(Y&VrZ^{sc>z-qexmdTfS*8Z zEY8)ceu@$uEU~0hEW8Uy6c^ks_o}wPL$#tx`_vlN>P#sTP)^^mTW(_Jh2XAZm|0BL zv1RZ+&bfqF;A2*uLu#r?^bSHpql|}NzRsTHJ|t7r5O^5`CV6}4UNwZT;vY2B3lmkF zgHBvRuF!$X@3byIw)%37wJ5~Jc?&gXlmGitw66AxRJ{bRcX6iiCR_FfdIxYRs0}Tg zU@DSypReEC-_!KUMID5@iSZ)Kjoc8Bs9Oe~Pxiq=%8sM!=)okr#0co#d(_MH^;zmF zr~>CzocLRQ{?_wzo>^i@p&f@=sfAs9^K-{W#&1z-iiGit=+n} zUrcq)K+T!%BhUAFKBps;6s1rQ2@oM5AW&qa#lJy7K*0m&!|+hRE7VbJ83cq#t&F&c zs>jNiucZsoqNf>S2eUgvY8N5#kGCr8A zj)njFuVmO{CQVPNoU;3CbB1fphW;`ori#nxip#DE2NFVHzI5Josx7RQ*R(>)rcx%9 zou#-cHGF<)Qb-QC>?aZzP#?CCwHl$4Z(g#}J-?i&3Luam!3gxq%h+;suG zdOq0b+`^x6t!-^3mYMZh=T}$xzI-8w8&alepl<2gzVzzY+uJJ*NKM6^?@ndZv9hu% zeRO^X2}3ITBx6f-dR!U1yFW}%PyhQz6`40;dTH>8f_Uiir3|EW9D;<$q}SR|Pyp#3 zVrp2u`2k@UWWf=+3i06cB}X!3t02E3ZfBSNCuq%%o1PpUers}wk(|H~vk8hq&DZi) zSS2Z=-@@jxDpu@8JCAR}(Ud}vdO8Fb_Ud3$>^AQG@3#(@p-4TnwddjTXIH_d&9lq# zmX#rBf0}}-s(4gMA z!N}_1OAr3$8!htvAeOECq=<;>naKmi_rtxv2fxW>Tfy+nor)r&v|B9NEmS?tYlZK4 z;n}JpDwnejmG4Znp^6s0sYQH(jaMpd>gQ$1s!zJ_yvi5ha2Vw0t4$X#n;-8zL2wvM zdJolG3{k8`=B}B0k8ykC&=SPw_y}9}IE9b@$f}fDn=S!%2r7fvT zD46RWIMTItPxi>Td?!U1n5~|RF1kz-RUXifb-`1A)j8HeWU#HoQ)%ROvYx+Vq+ow)@b8UNfeA zzE5OwdPtvEhT}2mdhBPI-(PITfivK1{m}^RF@K|o!tfS?8f})LGJo6N5G>gm8}E!~ zu!o@%w|d>tPiDhosD?kF{aBfQhAI54WU8Pr0o-yjG++R^aeXa?Y&I2_h=w=y>Vo@dfK%{TM*`~W2v;SjsHl``o}w>=r$an+XIrcPA^%5{>rrR{$2aGEtyA;XMdNqx2S?$X zD3uJINQAzPDSq^fLlOzqMBV~>N|mEvaNIS$;*8j4U8#wE31h3a7!(u~A1w57Bjg8+ zOT(}#p8m^A7PnY)`<_79n3$MG`uC9}nmnKD5x=)ZKVm|{pCBwN_LiCH!NZJSZ~oLP zD=WgC@ZClQHVc)(-@2amvzXg2MZLZGCh=!jAEQ==>`j{K)t zTr`ho(M5Cl+)g}wo>coB`<}L-nq5XI}G4MP4v#8`|C78QDBOdaOa7qg0bG0Ke z@9FH!PW$s8H^ii=q2X3{0CXu#JS7j3dB}rSI|qkN1i|t)iIN;* zs0h3W)$M&*BWv|W&w0)@i8$PQN7}8O*)Jc!d6$(*mVHsxZFMTi^WC*of(;#nIg`trvhYO#x+&-Ve+$80l$BgooPs zAYhPyMh8dydp}#j(LDGchhT~kV`TMl_y@`n66J$JLqnAiE?If-OQBHebMNZJ5XiXZ zP4QwRYaua=ZGV>mmw){IFW&pRxu0+KMfCBg2o6sR@0aa;Pjnnu znqlf^-EIv=p&ue#Pst3^N%ZF+zv|0yn1VBXo!hHHxy6} zY%APsX^((U@3q8DfCQfb^aNrTNZv9Got@^p`xO^ zJkm{fnzg-myD!Y>K#ub!yw@3hZf`6tD=SM!TRT$gtfu3BC5pK-{5Nqla*fg}0j)*f z))rYg)QZwLHD{^v*RN9rn8(@){=&32A-B>m%H-{Wt3OBfjT+w^&d@!JSbTeQ;n>;0-+VVY3E-C~^StJSaV%2AW+bD5t)I3|8CNzw2Yj2nKVCgB_StvPFWPS= z>!$>xlsYWl5W65aXpxGyS2y3?9PJ>8_TYpbA?Fh$m(v<=k^;?O;Np+3uC8{7Tx@J? zjE$jyu~HCRFN2PyR4yWo9b6vlxvdFyi5`;j^V)&4^)M5q_%>a?7aMT z!al&eQxCGi`IRl;eGdo}K~b6tG!7P)%h#K!rlzJp)68}mwDc?tx*<8O!eQ>7Mz3z9vJ*;2+aJRA=wZnS}!PB>}wyx)}8pQH= ze|_TK@CX78E}8x^ED%9Zu9tA0MCyJoLqW;5NXnMr2*=X+H^IHxK!GvF8P`?*Ef!I; zNQqYU`YDChRZ9zh5@r!LG-5WLU6u@aM)e<{V$SnU7fL8rsXqmrVyTJnt^$iuBVLu@ z-!bMcpV!AL8!qdnsP)y=m!G6>@LZd-T*1(AsNIdLwmA^-CiE#@L;gi@fOb~}7I&2B z+OJo1lvtm5o05r?N6*33TgO=B+AouWXeWl2-QnG9->y4EW{%I#8^Z~H>sU+`h=tiSdm*D3o}HXPvwvs9 zkBSWx051CKkxQnw{i%u%!Fn8l$4ONaW<;=rQ~`(QjK%!H%`#0AF_XX~4H$W6xxdBn zs~AEsdCC69Ie%eI4FrYTaz$yK#(3#bHY?VrQ^ zB*)xgs?1E}=KXlNZSZ?mG2+72WRy@9a>sUtd@_d*?(9j4fdRYzkz?fi@oE>B7zz?D z9WT)zeqEi@zfNVRHyCpN%@|3H1IP1VlvThe0mVEi-0MW03g7aKH)TW%lamb0>-+37 z1A^5j?MA}F!m76`trf%0X4_lla>iG*@$hKw=va@0G+ClS#;@WqoOOI7maT;oI zJDS44^-ykNVv;;(`_~d9nw^u=Z1vNMOsz1Ao}L~hC1ri5pY-J6AuW9)JbplR7LhVS zvm{WZ)OR{#6P4%FBC7U;atikf(~KmoM=~PQR1>i~DZ}5(Ta>y-jP;uO6gn>@epe4J zRA-6BDK`2GS49CIqK7Wn?Q~zX0P4|X9f{l*JWXP|Sz2ZZAQg$t$;nX%Q)^Sfl^gaE z93m(9ZS=?M z?Trht>#S7l5i_NqkoNrv_WMs|86+zM@giBOo(I(+!^J7o<%RkM*)yUg#?U7ycxPk2 zoOllshe&6u2mP*R`G?GMhqu5QEgtH6|HpRxSIsr`FXyAO;7@ajbQ3jiHLW30Gqd4}1%+u+LSfk2j}M$nd-qg}Hk|3}MGFS>$4Mna2kgvc=6vg+SN za%-g!-Wi{W_~l4tnFglFH@xvtaQfYP@toxnbym}_nIkQX&MlDem8~E(iV_OY4mEJy zAd3`1CsW`;nX+e;SK0F^qko#gY?5=fKJ#0svVbkl z#&X^%ZlWz`)b)LttCny-%2w*Hge$WkUU#`n(T)D%txFWUFzJT>l{eLIGSj` z>KJ(u*yoSa_Qy{SHYXQHBl4d*yWwixYFDlG4@9wHjp`4RgKAh=DX>2dE9Z+A&*Hen%pPOa`9?bW~_@|>auNHE?r#?#V0xFVwn%c zJ)Dqk1lkFs5KwiM{K8PVxVK;J zv25nx;g*f=nKw`!`dw~RMUt}WHecvyC-QZ4-rHY`mj);q0=92*F>m{5o;`F8LTb>c5t<6K0bcM1Eux(ZnlQGAWm9k zPPFDPME{W87QTz!bJuoH25Q;>uT!6qhx2vo1Qs%I*KRCdxS#ECw2S(0PV2vwwTI}| zi`B5~EA=@!lZc$ZZCAOXP$7-F1^j>Z?>g!%_!rXhe6oP9p3DYw^K1r-r2booIpOBA z$Hi7q0MuZEe8vvO6kTt}{dG{no~a1!{vRPNlL0N{ZCj zoiKWTAIC}y4yz<4i(zs_(6^WqHX6yKsjo(tt*`FYt?mlDRZ6hy97_R2sv;4VipzhT z2LuRp8nt~nl=^Z7yls|}BOKlVA!7lIqI2}6r)s@6z#aTv(ZlP)#?!=i-fS`uiIYlV z{dB!oYOa0PLp>Wlm%otisQ0%@$GnWCJ32Kj&6}S@{E(-V*b0I|fR#0%G+Z%Sri-ID zKP<+~m9*_F>4&+}K#Wn)Zy6a&2V^9A0>O^6dO%RtydT$4@cc=!golC3d+evl%*?D5 zRC0E{VSbxsp6NZ|vQ+A|+|u^1b2OIVSvy~EBNyGG%;G39Wy8-#u7>AmgC7qs&5jfj z6x4T`gW&DA6fSg7S0A@BHF{(r`iF3?@46Yg*A|iuZ%b<%ip*G1#;Slz9B2P=cNb;H zFe$=qxAyon<+mYN3@Jh(ZFI5GA(8GEHgs{`b|Hxp&yvjly`R@VSLsrU#MAU>wn&0! z2k6@8?Kg_j7>~oKm+2XJW}YZa#OLAON;j#6r!30JMZcT_&MaEo0q85@FlmehDe)? zwdbZ_A0Gf8ud=45Bqd6=6s2L~*WA$>P`3F#tZOvvih{||I0Q?A6|86l`w@Ehst3-R zHtl9C8XgKOE0I?qEQv@+n2eGLMg@6z!hceJHf*~rAQQUk$4WibNMwLki!9eYwU46N zE&LpgT04C5U=b;Z3EUhxt5m-y6TjAWJ2lq0*l>h-2S9tx%*@Q{@0ORBPx+oZ=e^&S zFrMk9BLo-0Ph&=i1Fp@TXX-Dt7)go%A|rzzFHL@{k^JZva80WyY{#dk;`5)u>+b_K zkl3UtaTO4X?GGE?i`9BM4ftKOpa1hghJ>p$O9LqIgpx*XA0CE`S#{xcy>icNkc`l8 z^({z!#5gz?SRLq6WTQ|;lA}scGRsA9=7ZJoDnHg=J}#@(9&m(;jK##n^z_zeeo93U z%LW>&cRa)%$cZ~j+wM1|amT{uJrD>~TwJVVwFbfU zRnoy3A?Td8qhQcs&cUVB`calThcT1OBC>e!P9vn|*l**ei*(~QeN`)PUjiLc9@=hV zcPMTbgYg}~9~nzwq~;`Bf(w6a(KE`VNtHlPjqyFe>7U`97rXN+eCN7D9zeoLU~&8e9`82 zf|cb5`%IN;fp2vQ)c|Sq0$6xal_(z67o9KX%zjT}CyO=AYEaLkqq6JPm34)x|DLn?L@aGmw$HKM3`}3maDd%aTGjy{1v$N?>cFb$akD=`D|lR>3jI%) z32%uvL3+z4U#*#@%5Ju&HXrd4kw;xlE(!+_(JbRoRLbSZsx?-ce3*nsB*kZTFE@ zIf@dj63Z}#)LN(S3p5%(gc|L3D~BpH%LFZ-B61{bM#FieI7LE0K!63u@y!!1v;KIw zp@9*ZZRurL6Vp2WR6q0mpQ1T@M#}UF*?Jj-z{F`M421~`IV*La?EoR4$Ht++OT?m1 zb_XaAO!XRll#}Vdf4TVibzy2Qt-J26{q8jULM%G|MNsv~UZRkd0cCp>9`iT*-#91d z-!#}gLtIb(`tC6pEVnqDk4VvCvWpf8f13u0gBmCTaVBJwA0Y#H!#$>Q1<(W^$xyYg z7e2nhsLpMttJK%j^>zk$*O*tk zpJN?L%rC0j&Y$arUfBD`?#Hn~=XSQXZ&_VWgu~D�LmY?Fr`Tx=Xv{au>cpU5KhIxILow(@4OjwXPJ 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 aI229925Y*>Ip7%%5Hb>q;?<&tf&UjedG&k% literal 0 HcmV?d00001 diff --git a/wp-content/plugins/tinymce-advanced/plugin-assets/images/toolbar-actions-rtl.png b/wp-content/plugins/tinymce-advanced/plugin-assets/images/toolbar-actions-rtl.png new file mode 100644 index 0000000000000000000000000000000000000000..95f4a8acf8336a8adc6f9867d7347ebe5f36b98e GIT binary patch literal 1379 zcmV-p1)TbcP)D^MTY^Hs=JJ7!%}rtqG3K&`V-mpO4o4{@6i85@3R3A2g%S~khC&eulpEU+ z4A{ntZA|-GMrgYx4QH}m{~o(PFgorjruXLcv%9}tzqpa~!zKsaeDMs!7|nHJ zY32=)EKV#>RpeTl+B^({rWd&QzNbSslhVJrm39&->Dj|CeiCq-y4>!cUyfCnYHk;o zUwLTthUSj$#pPALi_g~RzD_&=tm=^3xX`ic9ZvMRoduWfk5>G8KxmF-@c^0lQ7$4-=pzi(;YcI;e9d{|hFB=JW_M{DaFdV^UcQ76l@&9#kI zyPXQ7M11|FC*u>gK5j>n_>gB)pKfHkWss|63R#rQ{@1^VB zf#;{*uQ!-E>v$n#_4F^Cs>or#Qp~=iTU}e{xp=?d|7_?*sOCnq#lE?9_MK+7_#}B& zp0-q?3U0{A)CF3-F+4;PwE)E*9v)83%ogem327>^EVIH?Gy8u2vnwJ#;B>i+)fRc? z?diYf=qWC?fpgvvj`)y!>M<*;>oiMI?a$SSUzgVtZ+{#aJ@40{Z1E+P_r_kosi|+J z>!!A@rRCM|pye({e2Kx#-Zi380XuhJ6iVYg40GP`>GE?t_Ua=Nw)prI1x@gY5>?Qj zRGpr6Cp>N@r$fBZ#9wTVhxmvWUumkDnVqBAovync_c@)e@F*^;;)r*--0U0ZC&WjX z_~>276ONr-S{EH3p=xg5-E&5d_}D~AoLCn6+M52xiRIzJ{t7vC-sn>iN#YrXF;rV< z1%G^mN*O#tb#QQiIbPs<^#g;$?5s6(go+l&0v7-0%xox)zowurM5zPc#TRJHI0q_d z=&LZ*3RpZ%#%*0sQsmj!VLeVH)7-5bpP1ykcvaZjxf_X69lzhsU6Mc`;B>jIwoS^^ zt~}N^Y+D~4Uaybu;w?>&V#AJ5b$0h6`Tx4ae1UQAzelK~1x01TK0*cYL4rr9Hmv$e zbCN78MUi8!ZM4}p1%H?Z;*Z@&)e$O)2M`Y+9zZ;RcmVML;sL}1hzAf4ARa(GfOr7$ l0OA3}Lp*?Z0P#SW{0kU?e^afVAFKcX002ovPDHLkV1iA}wdMc- literal 0 HcmV?d00001 diff --git a/wp-content/plugins/tinymce-advanced/plugin-assets/images/toolbar-actions.png b/wp-content/plugins/tinymce-advanced/plugin-assets/images/toolbar-actions.png new file mode 100644 index 0000000000000000000000000000000000000000..2e7acbb0b618b1b2340e622d0290b1b792ea7bde GIT binary patch literal 625 zcmeAS@N?(olHy`uVBq!ia0vp^D}dOGg9%73SlW@rz`$hT>EaktaqI1DYyU$5A`L$$ z_wgkKO=PK*IMt@j&38+pqtn8A#}8#6505{bdlt>MY1%Az#KgnfIYatg=6?P141L`x zbp_S$EOVbp2YI#yH&i&-D98!$cd#E}e#H0@le;I#PW|$+t&?r_y(hCqy4HM()Y-R& z`}d0*MYBU!crCy9X!qXjL2tAEE?AuV>Ded2lVbJd|6lxlrW3F3w|LtF^6y-i#dgO zS(P6+bNBM+)7xsFs+MxfM9w|?yyN~$rJzl(?T*^+&ij|}dW-cv<^8#~3U%rq*WaC2 z?*7swzQ!#6qukDtRf6~Bdwv}b+_36y={rHQJeSI-B&*ZwtJMmjNiEI$d0|Pst;wc#wYOD| 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; +} + +.advanced-editor-tools label { + vertical-align: baseline; +} + +.advanced-editor-tools 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: middle; + 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; +} diff --git a/wp-content/plugins/tinymce-advanced/plugin-assets/tadv.js b/wp-content/plugins/tinymce-advanced/plugin-assets/tadv.js new file mode 100644 index 00000000..89531f21 --- /dev/null +++ b/wp-content/plugins/tinymce-advanced/plugin-assets/tadv.js @@ -0,0 +1,249 @@ +/** + * Scripts for the settings screen in wp-admin. + * @package advanced-editor-tools + */ + +jQuery( document ).ready( function( $ ) { + var $importElement = $('#tadv-import'); + var $importError = $('#tadv-import-error'); + + function sortClassic() { + var container = $('.container'); + + if ( container.sortable( 'instance' ) ) { + container.sortable( 'destroy' ); + } + + container.sortable({ + connectWith: '.container', + items: '> 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 ) ); + } + }); + } +}); diff --git a/wp-content/plugins/tinymce-advanced/readme.txt b/wp-content/plugins/tinymce-advanced/readme.txt index ebff9916..d3282702 100644 --- a/wp-content/plugins/tinymce-advanced/readme.txt +++ b/wp-content/plugins/tinymce-advanced/readme.txt @@ -1,29 +1,45 @@ -=== TinyMCE Advanced === -Contributors: azaozz -Tags: wysiwyg, formatting, tinymce, write, editor -Requires at least: 4.9 -Tested up to: 4.9 -Stable tag: 4.6.7 +=== Advanced Editor Tools (previously TinyMCE Advanced) === +Contributors: automattic, azaozz +Tags: block editor, classic editor, editor, Gutenberg, formatting, tinymce, write +Requires at least: 5.6 +Tested up to: 5.7 +Stable tag: 5.6.0 +Requires PHP: 5.6 License: GPLv2 License URI: http://www.gnu.org/licenses/gpl-2.0.html -Extends and enhances TinyMCE, the WordPress Visual Editor. +Extends and enhances the block editor (Gutenberg) and the classic editor (TinyMCE). == Description == -This plugin will let you add, remove and arrange the buttons that are shown on the Visual Editor toolbar. You can configure up to four rows of buttons including Font Sizes, Font Family, text and background colors, tables, etc. It will also let you enable the editor menu, see the [screenshots](screenshots). +Advanced Editor Tools (previously 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. -It includes 15 plugins for [TinyMCE](http://tinymce.com/) that are automatically enabled or disabled depending on the buttons you have chosen. In addition this plugin adds some commonly used options as keeping the paragraph tags in the Text editor and importing the CSS classes from the theme's editor-style.css. +Version 5.5 continues to improve and enhance the new features introduced in version 5.0 of the plugin. 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/). Advanced Editor Tools 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 = -* Support for creating and editing tables. -* More options when inserting lists. -* Search and Replace in the editor. -* Ability to set Font Family and Font Sizes. +* "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. -With this plugin you can also enable the TinyMCE menu above the toolbars. This will make the editor even more powerful and convenient. += Privacy = + +Advanced Editor Tools 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 Advanced Editor Tools does not affect your website's user privacy in any way. == Installation == @@ -31,6 +47,73 @@ Best is to install directly from WordPress. If manual installation is required, == Changelog == += 5.6.0 = +* Updated for WordPress 5.6 and TinyMCE 4.9.11. + += 5.5.1 = +* Renamed the plugin to Advanced Editor Tools to comply with trademark requirements. + += 5.5.0 = +* Updated for WordPress 5.5 and TinyMCE 4.9.10. +* Updated/renamed the subscript and superscript buttons as these are now in Gutenberg. +* Minor CSS fixes and enhancements. + += 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. @@ -53,7 +136,7 @@ Best is to install directly from WordPress. If manual installation is required, * 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 autop off. +* 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 = @@ -75,11 +158,11 @@ Best is to install directly from WordPress. If manual installation is required, * Fixed text domain and plugin headers. = 4.2.3.1 = -* Fix error with removing the 'textpattern' plugin. +* 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. +* Removed the `textpattern` plugin as WordPress 4.3 includes similar functionality by default. * French translation by Nicolas Schneider. = 4.1.9 = @@ -97,14 +180,14 @@ Best is to install directly from WordPress. If manual installation is required, = 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 `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. +* 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. +* 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 = @@ -140,7 +223,7 @@ Compatibility with WordPress 3.2 and TinyMCE 3.4.2, removed the options for supp = 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. +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. @@ -155,10 +238,10 @@ Compatibility with WordPress 2.8 and TinyMCE 3.2.4, minor bug fixes. 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). +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 (autop), added two more buttons to the HTML editor: autop and undo, fixed the removal of non-default TinyMCE buttons. +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. @@ -172,48 +255,56 @@ Improved language selection, improved compatibility with WordPress 2.3 and TinyM = 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. -== Upgrade Notice == - -= 4.2.3 = -Updated for WordPress 4.3 and TinyMCE 4.2.3. - -= 4.1.9 = -Updated for WordPress 4.2 and TinyMCE 4.1.9. - -= 4.1 = -Includes the 'textpattern' plugin that supports some of the markdown syntax while typing, and the updated 'table' plugin that supports background and border color for tables. == Frequently Asked Questions == -= No styles are imported in the Formats sub-menu. = += I see an error like: "Failed to load plugin from url..." = -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. +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. -= I have just installed this plugin, but it does not do anything. = +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). -Change some buttons on one of the toolbars, save your changes, clear your browser cache, and try again. If that does not work try reloding the Edit page several times while holding down Shift or Ctrl. 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. +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. -= When I add "Smilies", they do not show in the editor. = +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 Advanced Editor Tools 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. = += 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 = -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/). - +Re-save the settings or click the "Restore Default Settings" button on the plugin settings page and then set the buttons again and save. == Screenshots == -1. The WordPress editor after installing this plugin (default plugin settings). -2. The TinyMCE Advanced settings page, toolbars options. -3. The TinyMCE Advanced settings page, user options. -4. The TinyMCE Advanced settings page, advanced options. -5. The TinyMCE Advanced settings page, admin options. +1. Rich-text toolbar. +2. Rich-text toolbar and extra formatting buttons in the Inspector (sidebar). +3. Many of the buttons can be moved to the Formatting section in the Inspector. +4. Converting the content of the Classic Paragraph block into separate blocks. +5. Converting several paragraph blocks into a Classic Paragraph block. +6. Settings for the Rich-text toolbar and the optional Formatting section in the Inspector. +7. Settings for the toolbars in Classic Paragraph and Classic blocks. +8. Additional options. +9. Advanced options for tables. + +== 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. diff --git a/wp-content/plugins/tinymce-advanced/screenshot-1.png b/wp-content/plugins/tinymce-advanced/screenshot-1.png deleted file mode 100644 index e715c1841b0c8fa990fdf7883b15a45a030d9727..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14418 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 diff --git a/wp-content/plugins/tinymce-advanced/screenshot-3.png b/wp-content/plugins/tinymce-advanced/screenshot-3.png deleted file mode 100644 index f53bf4bdae41c4f21058effc6c0669a7a95913df..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21412 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 ak-4<1`qfSlbnx|s%gorqsK)Tl<9`BV7Ap_{ diff --git a/wp-content/plugins/tinymce-advanced/screenshot-4.png b/wp-content/plugins/tinymce-advanced/screenshot-4.png deleted file mode 100644 index f57be4c1cfd9dd5f8e85da300550deb225a36745..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 27424 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�h@Y=8R6&xsE~;kilyl-ZQzuIMCx z9zXA3M5)s+K~3mbgJmG)Q`$ zv<#>LfBlBM8`?t|kNt=ba?=@iS{;J$ICQrESQ>X8l)wG4qx;+O8IS!&A)vzl%c^Q& z$42(b7%OUjZJS43Y1On~(*p4Z2gkIJ*aT8+DtA##YJ=ye8cWaQ>3!;=w%X~4^lR(9 z3`a4@`EkT{J5^TS9GydoSqSMqh80e;>%p;=HLR5cURd$1!WP%jC({aRn*%)k!dp2yp8y6Vi zSY(zI{Wposn5K#T7P4Oj7221Y08=1?CjDExwm10VFS_T5t_-Ho8`%Hs5bR$D>;DU@ z{Qr<-`rrPtM^X^zYD~MqaZnHeLJtMwciA8eeVjJ=rslym+rKt*EekN=d7J%Uq~q=m zjQMjDp{%33uT!;I-a3LV+Xfs{n!i9AluEG63hHBkI{$-bzku#-a8i4Sv#h^h( zhb_~WXfKqnfBzZrL%B)<+Q%9CV_AMb9mN?#@Z0x+b!4jad!(SAa2FhBq@m5pn zcT@5Wby@T}Ld+5FQUe%z86zLs8Z=pj7NEM_ANQXe^(tC*%>1X5fe(!k4 z8RI+WJ3r39Jw~$k$ewHMmAU4;?t3HCj9)d22z($!SP1Ts`jr}jH!TU}o=l7`^tPj6 z=av@mM-g!sbdVw~MzTm|oIB8-AE{q_5qB^>(!Tz#USm@B9H?>^7LqXB)Y>d&mvp_; zDh=p={emE9C9guttr^H!!#+RJN5e#;!4i{HMe2Vzd7~8heC|B$nBwB)kgb_jW#$h?_ z%sQufocLOtDTTHl&gz-VW!b1LY@C~Z;L9jIySo(mUABOZ)fNrghBcM@^C{sMOgY&7 zN!FnIa`s|=k$g2Rq1=Q21!7zh%|r*A!*c5QriN2kq%th>gv;&W`IKZk=> zc|FQT?C9fWxYmk?w2hd3jky41MbjI?#D7 z(TtSe7uu!EQ+sX3Uf(&|j)np}y-#YvVDB2gfSuUW6}!)1RG0?eEmd~!jkQ;xh#p!5RNGY?|FLZW5?>?{ zQd}8HG{bg2eq8g4tJb7qg3}94`WK+a6kA#qsx3m~x1H2cR1|8(noiQ@TA10J8BM$k z^6D6aF{^4bP~4e425z8Y%s>)6!Y#Pjc%fO<@nPC`$x689{;9HpcdH3<`GH1X9g-&- zwA0|uKaYmpJZH#-UlXtuD4p>~MKk+IpMH_$D{p$Ir{WY zK+cmbL2$P%z~73p+k+^A$I$rdPrzKB&dg88<&!$a%)gKl!Nht`oOy5PEI6HOy7%^Q zJt)`h9@wLAoaW1V7Qm{DYNQz2MfAll4cbbqERlisS}P670B4x~sERa^Jg~4Mu#UcS zYNsJ3A85=t5rFc%`^pJjQ~BCnsK{Yh=I8q<>%7g-zOB)-wJ--1IJ^9r{0z5d{)6c9 zMgWs_2Hdl*o$i~&y0J~0zIzk=?owV+Yt?F5>t533mD}}#`>`SL0liQ5>CeB+4{oH& z%EhN%8QZ%h-?ifaMRMlXZJ-YOomvf>i5=-qpFLUw85pUi-B!@#MPx0R4NnQn1lV^X~q7?(OB@A z_s5^HnSg-PjN*Hj4QnlzHIsDz1h5K+tpGSBoJxY(Z%H?K6$*zqj%Lq;@HauN5ng_H9T;i(6Yoq zgxla9MTwH7!fkjSCeZ!#wPG9>k|IIbS!V_(CjBxfPa5;tMvH^{^w-ES?0w;ectUj- zenctSv7~ewX*f_wZ%q6*#<7y~f z(i3$RW2BWs)-X_Utl_+fhreg*IJi6`@?IV9^^Zv>HH?su+yiKIr1Vy;HP+=ZR(X_y zJZ`suQpL&pxs6!MOM~6#=DBL=PqmzjuG$~6U;nT?v}M;cCvu;sju;i6P~T2`j%&`Z zdjMKZU_{g#OP3y<2&F7NPdTRX&5>32N}cp6jLyio_ z7He<|mJBo9OK@M6;HqM+WSaKLAD^%^Nwi&)3-;B8dd+nYVY;?9)iW)TIMu*UA= zd$nKWgtuXpV_ZlZ84QWs_rS!x5(QeVkLU zQ69NL?$7kkK+&Fc3%xrhpknMiaq}1%%c0Kbk)^Re6yRWVPMnZ%p_RA_$-Bn-w{LQgo$|6(b9Ep z$76wmYnd-?U0D@q{;>Rnp%=~+;n{1824;93U6}x4Qxt}YLhP;|yksQEB%+JW6Z*E3 zX9QUnD6%|-2G)5U;zKKY2hN0$b)<<}2OddwLM((PtM)dE&iN5P^IhLB6i;(BMAZTTw?W07TStl6LMC73)$MR10@`%2iE7c@F;9v4JcHEwwdBQmEkl*Z z<-h``zJz<*`wf`DVB_;g@?39)Nus4zss`0{NrxXcX6kzPDT^O+&DOF9&cW8sJaQv5gsdJBIlr7H`}#EjTAaYeHsk zJGzQBvo$`HU!OQ zr#Lzftg2iQJj0AM9P@g>Dc=d_ScCb>gSO*}0?eyU5+H+UK<)D(h^+6{sq1n!+ z0~VEI-hvAC!+mjne9!q6jI=f&hsP&x7d@<;%mWE}N!z*BT)78}8A2v)WqD7uCWE8v zmLa)W{_Dt7sc@KVl}uv?4aG}6jEZ?|24H!mz~(S{U;1r7!`bDuoVieND)f~y@~K%Mca{-Zj*~?H zIZ7Jxom*J220pT90B(5h?f>LCOFPcqFc?a1!M zUElD=T(oJa=*Br;q|XDjr}i$E8EOH)e6+10vUGC(A+vHSL$EKTE_5_N5M31@vRa+E zKAN-i-ogEmksBrPD&U5J=uuZ)b(&EBcvw7)7!8ZOjJT+=zBuRtO@H*@oHTzZJ{MaT z0b3<49AuNf(E_9v*d%?4CUQ`@cmi3cxR?r2t-f8__Vy*hS5-11$XP-7+$dP_dm*Ti zyP!3#0Uod@c@|qs&1*ptGPSu|J=mgCmc+PZlI198;Sd^ZHv1<8#EaNHD?ZKy#q-e~-5!Kb#+?w+>66#WSkJhcvni#Uq4p03ss;A

    =kG|HC0E$XZF#R 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 = $this->get_default_user_settings(); update_option( 'tadv_settings', $this->get_default_user_settings() ); - $message = '

    '; -} elseif ( isset( $_POST['tadv-export-settings'] ) ) { - check_admin_referer( 'tadv-save-buttons-order' ); - - $this->load_settings(); - $output = array( 'settings' => $this->user_settings ); - - // TODO: only admin || SA - $output['admin_settings'] = $this->admin_settings; - - ?> - -

    ' . __( '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' ) . '

    '; + $message = '

    ' . __( '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']; -if ( empty( $_POST ) ) { - $this->check_plugin_version(); + 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(); @@ -124,34 +113,490 @@ if ( empty( $this->toolbar_1 ) && empty( $this->toolbar_2 ) && empty( $this->too $all_buttons = $this->get_all_buttons(); ?> -
    -

    +
    +

    warn_if_unsupported(); +// Add a notice that the plugin was renamed. +// Remove in the bnext version. +?> +

    + +

    +

    -
    +$dashicons_arrow = is_rtl() ? 'dashicons-arrow-left' : 'dashicons-arrow-right'; -

    - +?> + + +

    +

    + +

    +

    + + + +

    +

    + + + +

    +
    + +
    +

    +
    +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"'; } ?>> + +

    + +
    @@ -201,7 +646,8 @@ if ( isset( $_POST['tadv-save'] ) && empty( $message ) ) { " class="container"> $toolbar as $button ) { - if ( strpos( $button, 'separator' ) !== false || in_array( $button, array( 'moveforward', 'movebackward', 'absolute' ) ) ) { + foreach( $this->$toolbar as $button_id ) { + if ( strpos( $button_id, 'separator' ) !== false || in_array( $button_id, array( 'moveforward', 'movebackward', 'absolute' ) ) ) { continue; } - if ( isset( $all_buttons[$button] ) ) { - $name = $all_buttons[$button]; - unset( $all_buttons[$button] ); + if ( isset( $all_buttons_classic[ $button_id ] ) ) { + $name = $all_buttons_classic[ $button_id ]; + unset( $all_buttons_classic[ $button_id ] ); } else { - // error?.. continue; } - ?>
  • + ?> +
  • - +
    - + - +
    -
  • +
    -

    +

    -
    -

    -
      - $name ) { - if ( strpos( $button, 'separator' ) !== false ) { - 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 ); ?>

    @@ -339,68 +796,153 @@ if ( ! is_multisite() || current_user_can( 'manage_sites' ) ) { ?>

    +
    + 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 === 'not-supporetd' || $has_editor_style === 'not-present' ) { + if ( $has_editor_style === false ) { add_editor_style(); + $has_editor_style = $this->has_editor_style(); } - if ( $this->has_editor_style() === 'present' ) { + if ( $has_editor_style ) { $disabled = ''; - $has_editor_style = 'present'; } ?>
    - + 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'; ?> /> + +

    + +

    +

    + + +

    +
    @@ -409,6 +951,11 @@ if ( ! is_multisite() || current_user_can( 'manage_sites' ) ) {

    + + +

    +

    +  

    @@ -416,16 +963,16 @@ if ( ! is_multisite() || current_user_can( 'manage_sites' ) ) {

    - + 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'; ?> /> +

    @@ -434,6 +981,8 @@ if ( ! is_multisite() || current_user_can( 'manage_sites' ) ) { } ?> +
    +

    @@ -444,4 +993,4 @@ if ( ! is_multisite() || current_user_can( 'manage_sites' ) ) {

    -
    +
    diff --git a/wp-content/plugins/tinymce-advanced/tinymce-advanced.php b/wp-content/plugins/tinymce-advanced/tinymce-advanced.php index 707cc2b7..c50c216c 100644 --- a/wp-content/plugins/tinymce-advanced/tinymce-advanced.php +++ b/wp-content/plugins/tinymce-advanced/tinymce-advanced.php @@ -1,38 +1,50 @@ 'menubar,advlist', + 'options' => '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' => '', - 'plugins' => 'anchor,code,insertdatetime,nonbreaking,print,searchreplace,table,visualblocks,visualchars,advlist,wptadv', + + 'toolbar_classic_block' => 'formatselect,bold,italic,blockquote,bullist,numlist,alignleft,aligncenter,alignright,' . + 'link,forecolor,backcolor,table,wp_help', + + 'toolbar_block' => 'core/code,core/image,core/strikethrough,tadv/mark,tadv/removeformat', + 'toolbar_block_side' => 'core/superscript,core/subscript,core/underline', + 'panels_block' => 'tadv/color-panel,tadv/background-color-panel', ); } private function get_default_admin_settings() { return array( - 'options' => array(), + 'options' => 'classic_paragraph_block,table_resize_bars,table_grid,table_tab_navigation,table_advtab', ); } @@ -95,7 +124,9 @@ class Tinymce_Advanced { 'advlink', 'contextmenu', 'menubar', + 'menubar_block', 'fontsize_formats', + 'merge_toolbars', ); } @@ -103,7 +134,14 @@ class Tinymce_Advanced { return array( 'importcss', 'no_autop', - 'paste_images', + 'hybrid_mode', + 'classic_paragraph_block', + 'replace_block_editor', + 'table_resize_bars', + 'table_default_attributes', + 'table_grid', + 'table_tab_navigation', + 'table_advtab', ); } @@ -115,34 +153,69 @@ class Tinymce_Advanced { ); } + 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' => '' ), + 'core/superscript' => array( 'name' => 'Superscript', 'icon' => '' ), + 'core/subscript' => 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() { - if ( ! defined('ABSPATH') ) { - return; - } - - register_activation_hook( __FILE__, array( $this, 'check_plugin_version' ) ); - - add_action( 'plugins_loaded', array( $this, 'set_paths' ), 50 ); - 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 ); - add_filter( 'mce_buttons_3', array( $this, 'mce_buttons_3' ), 999 ); - add_filter( 'mce_buttons_4', array( $this, 'mce_buttons_4' ), 999 ); + 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' ) ); + 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( 'after_wp_tiny_mce', array( $this, 'after_wp_tiny_mce' ) ); + + 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 ) { @@ -173,7 +246,7 @@ class Tinymce_Advanced { } if ( ! $this->disabled_for_editor && ! $editor_style_added ) { - if ( $this->check_admin_setting( 'importcss' ) && $this->has_editor_style() !== 'present' ) { + if ( $this->check_admin_setting( 'importcss' ) && $this->has_editor_style() === false ) { add_editor_style(); } @@ -189,7 +262,7 @@ class Tinymce_Advanced { private function has_editor_style() { if ( ! current_theme_supports( 'editor-style' ) ) { - return 'not-supporetd'; + return false; } $editor_stylesheets = get_editor_stylesheets(); @@ -197,21 +270,12 @@ class Tinymce_Advanced { if ( is_array( $editor_stylesheets ) ) { foreach ( $editor_stylesheets as $url ) { if ( strpos( $url, 'editor-style.css' ) !== false ) { - return 'present'; + return $url; } } } - return 'not-present'; - } - - // When using a plugin that changes the paths dinamically, set these earlier than 'plugins_loaded' 50. - public function set_paths() { - if ( ! defined( 'TADV_URL' ) ) - define( 'TADV_URL', plugin_dir_url( __FILE__ ) ); - - if ( ! defined( 'TADV_PATH' ) ) - define( 'TADV_PATH', plugin_dir_path( __FILE__ ) ); + return ''; } public function load_textdomain() { @@ -219,10 +283,12 @@ class Tinymce_Advanced { } public function enqueue_scripts( $page ) { - if ( 'settings_page_tinymce-advanced' == $page ) { - wp_enqueue_script( 'tadv-js', TADV_URL . 'js/tadv.js', array( 'jquery-ui-sortable' ), '4.0', true ); - wp_enqueue_style( 'tadv-mce-skin', includes_url( 'js/tinymce/skins/lightgray/skin.min.css' ), array(), '4.0' ); - wp_enqueue_style( 'tadv-css', TADV_URL . 'css/tadv-styles.css', array( 'editor-buttons' ), '4.0' ); + 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' ) ); } @@ -254,8 +320,22 @@ class Tinymce_Advanced { $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 = $this->get_default_user_settings(); + $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(); @@ -264,8 +344,14 @@ class Tinymce_Advanced { $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->used_buttons = array_merge( $this->toolbar_1, $this->toolbar_2, $this->toolbar_3, $this->toolbar_4 ); + $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. @@ -282,21 +368,23 @@ class Tinymce_Advanced { public function warn_if_unsupported() { if ( ! $this->check_minimum_supported_version() ) { - $wp_ver = ! empty( $GLOBALS['wp_version'] ) ? $GLOBALS['wp_version'] : '(undefined)'; + $wp_version = ! empty( $GLOBALS['wp_version'] ) ? $GLOBALS['wp_version'] : '(undefined)'; ?>

    required_version, - esc_html( $wp_ver ) + printf( + __( 'Advanced Editor Tools requires WordPress version %1$s or newer. It appears that you are running %2$s. This can make the editor unstable.', 'tinymce-advanced' ), + $this->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/' + 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' ); ?> @@ -310,24 +398,26 @@ class Tinymce_Advanced { include( ABSPATH . WPINC . '/version.php' ); // get an unmodified $wp_version $wp_version = str_replace( '-src', '', $wp_version ); - return ( version_compare( $wp_version, $this->required_version, '>=' ) ); + return ( version_compare( $wp_version, $this->required_wp_version, '>=' ) ); } - public function check_plugin_version() { - $version = get_option( 'tadv_version', 0 ); + public function update_settings() { + $version = (int) get_option( 'tadv_version', 0 ); - if ( ! $version || $version < 4000 ) { + if ( $version >= $this->plugin_version ) { + return; + } + + if ( $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 ); - update_option( 'tadv_version', 4000 ); - } + update_option( 'tadv_version', $this->plugin_version ); - if ( $version < 4000 ) { - // Upgrade to TinyMCE 4.0, clean options + // Clean out old options delete_option('tadv_options'); delete_option('tadv_toolbars'); delete_option('tadv_plugins'); @@ -336,12 +426,120 @@ class Tinymce_Advanced { delete_option('tadv_btns3'); delete_option('tadv_btns4'); delete_option('tadv_allbtns'); + + return; } + + $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'; + } + } + } + + // Fix/rename 'tadv/sup', 'tadv/sub' to 'core/superscript', 'core/subscript' as these were added to Gutenberg in WP 5.5. + if ( $version < 5500 ) { + $replace = array( + 'tadv/sup', + 'tadv/sub', + ); + + $with = array( + 'core/superscript', + 'core/subscript', + ); + + if ( ! empty( $user_settings['toolbar_block'] ) ) { + $user_settings['toolbar_block'] = str_replace( $replace, $with, $user_settings['toolbar_block'] ); + } + + if ( ! empty( $user_settings['toolbar_block_side'] ) ) { + $user_settings['toolbar_block_side'] = str_replace( $replace, $with, $user_settings['toolbar_block_side'] ); + } + } + + 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 ) ) + if ( ! empty( $this->all_buttons ) ) { return $this->all_buttons; + } $buttons = array( // Core @@ -396,9 +594,6 @@ class Tinymce_Advanced { 'forecolor' => 'Text color', 'backcolor' => 'Background color', - // Layer plugin ? - // 'insertlayer' => 'Layer', - // WP 'wp_adv' => 'Toolbar Toggle', 'wp_help' => 'Keyboard Shortcuts', @@ -452,9 +647,6 @@ class Tinymce_Advanced { if ( in_array( 'code', $this->used_buttons, true ) ) $plugins[] = 'code'; - // if ( in_array( 'insertlayer', $this->used_buttons, true ) ) - // $plugins[] = 'layer'; - // From options if ( $this->check_user_setting( 'advlist' ) ) $plugins[] = 'advlist'; @@ -484,6 +676,14 @@ class Tinymce_Advanced { 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 ); } @@ -509,7 +709,11 @@ class Tinymce_Advanced { $this->load_settings(); } - $buttons_1 = $this->toolbar_1; + 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 ); @@ -519,7 +723,7 @@ class Tinymce_Advanced { return $buttons_1; } - public function mce_buttons_2( $original ) { + public function mce_buttons_2( $original, $editor_id ) { if ( $this->is_disabled() ) { return $original; } @@ -528,7 +732,11 @@ class Tinymce_Advanced { $this->load_settings(); } - $buttons_2 = $this->toolbar_2; + 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 ); @@ -538,7 +746,7 @@ class Tinymce_Advanced { return $buttons_2; } - public function mce_buttons_3( $original ) { + public function mce_buttons_3( $original, $editor_id ) { if ( $this->is_disabled() ) { return $original; } @@ -547,7 +755,11 @@ class Tinymce_Advanced { $this->load_settings(); } - $buttons_3 = $this->toolbar_3; + 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 ); @@ -557,7 +769,7 @@ class Tinymce_Advanced { return $buttons_3; } - public function mce_buttons_4( $original ) { + public function mce_buttons_4( $original, $editor_id ) { if ( $this->is_disabled() ) { return $original; } @@ -566,7 +778,11 @@ class Tinymce_Advanced { $this->load_settings(); } - $buttons_4 = $this->toolbar_4; + 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 ); @@ -576,13 +792,15 @@ class Tinymce_Advanced { return $buttons_4; } - public function mce_options( $init ) { + 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"}]'; + $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; @@ -590,8 +808,33 @@ class Tinymce_Advanced { $init['tadv_noautop'] = true; } - if ( $this->check_user_setting('menubar') ) { - $init['menubar'] = 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 ) ) { @@ -599,7 +842,6 @@ class Tinymce_Advanced { } if ( $this->check_admin_setting( 'importcss' ) ) { - // $init['importcss_selector_filter'] = 'function(sel){return /^\.[a-z0-9]+$/i.test(sel);}'; $init['importcss_file_filter'] = 'editor-style.css'; } @@ -607,37 +849,130 @@ class Tinymce_Advanced { $init['fontsize_formats'] = $this->fontsize_formats; } - if ( $this->check_user_setting( 'paste_images' ) ) { - $init['paste_data_images'] = true; - } - 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 after_wp_tiny_mce() { - if ( $this->is_disabled() ) { - return; + public function block_editor_assets() { + $plugin_url = plugins_url( 'block-editor', __FILE__ ); + + if ( ! is_array( $this->admin_options ) ) { + $this->load_settings(); } - ?> - - 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 htmledit( $content ) { - return $content; + 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 ) { @@ -655,14 +990,18 @@ class Tinymce_Advanced { $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() ); - $plugpath = TADV_URL . 'mce/'; + $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"] = $plugpath . $plugin . "/plugin{$suffix}.js"; + $mce_plugins["$plugin"] = $plugin_url . $plugin . "/plugin{$suffix}.js"; } return $mce_plugins; @@ -725,6 +1064,13 @@ class Tinymce_Advanced { 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 ''; @@ -747,6 +1093,7 @@ class Tinymce_Advanced { 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(); @@ -756,8 +1103,8 @@ class Tinymce_Advanced { $user_settings = $all_settings['settings']; } - for ( $i = 1; $i < 5; $i++ ) { - $toolbar_name = 'toolbar_' . $i; + 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 ] ); @@ -767,13 +1114,61 @@ class Tinymce_Advanced { $toolbar = array(); } - if ( $i > 1 && ( $wp_adv = array_search( 'wp_adv', $toolbar ) ) !== false ) { - unset( $toolbar[ $wp_adv ] ); + 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'] ) ) { @@ -784,14 +1179,17 @@ class Tinymce_Advanced { $settings['options'] = $this->validate_settings( $options, $this->get_all_user_options() ); + if ( ! empty( $user_settings['plugins'] ) ) { $plugins = explode( ',', $user_settings['plugins'] ); - } elseif ( ! empty( $_POST['options']['menubar'] ) ) { - $plugins = array( 'anchor', 'code', 'insertdatetime', 'nonbreaking', 'print', 'searchreplace', 'table', 'visualblocks', 'visualchars' ); } 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(); @@ -847,30 +1245,110 @@ class Tinymce_Advanced { 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( TADV_PATH . 'tadv_admin.php' ); + 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' ) ); + $page_title = __( 'Advanced Editor Tools', 'tinymce-advanced' ); + $menu_item_label = __( 'Advanced Editor Tools (TinyMCE Advanced)', 'tinymce-advanced' ); + add_options_page( $page_title, $menu_item_label, 'manage_options', 'tinymce-advanced', array( $this, 'settings_page' ) ); } /** * Add a link to the settings page */ public function add_settings_link( $links, $file ) { - if ( $file === 'tinymce-advanced/tinymce-advanced.php' && current_user_can( 'manage_options' ) ) { + if ( + strrpos( $file, '/tinymce-advanced.php' ) === ( strlen( $file ) - 21 ) && + current_user_can( 'manage_options' ) + ) { $settings_link = sprintf( '%s', admin_url( 'options-general.php?page=tinymce-advanced' ), __( 'Settings', 'tinymce-advanced' ) ); - array_unshift( $links, $settings_link ); + $links = (array) $links; + $links['tma_settings_link'] = $settings_link; } return $links; } } -new Tinymce_Advanced; +new Advanced_Editor_Tools; endif; diff --git a/wp-content/plugins/tinymce-advanced/uninstall.php b/wp-content/plugins/tinymce-advanced/uninstall.php index b63b4278..cdeb26ee 100644 --- a/wp-content/plugins/tinymce-advanced/uninstall.php +++ b/wp-content/plugins/tinymce-advanced/uninstall.php @@ -1,7 +1,14 @@