From bb00c66c6a65b2fc031c749df2e90c2d9c063d82 Mon Sep 17 00:00:00 2001 From: Andrew Ozz Date: Fri, 7 Mar 2014 02:01:07 +0000 Subject: [PATCH] TinyMCE: - Restore the "link" button state to disabled by default and enabled when text or image is selected. - Remove the (recently added) default `link` plugin, not needed for `wpLink`. See #27309 git-svn-id: https://develop.svn.wordpress.org/trunk@27447 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-includes/class-wp-editor.php | 3 +- .../js/tinymce/plugins/link/plugin.js | 352 ------------------ .../js/tinymce/plugins/link/plugin.min.js | 1 - .../js/tinymce/plugins/wplink/plugin.js | 17 + 4 files changed, 18 insertions(+), 355 deletions(-) delete mode 100644 src/wp-includes/js/tinymce/plugins/link/plugin.js delete mode 100644 src/wp-includes/js/tinymce/plugins/link/plugin.min.js diff --git a/src/wp-includes/class-wp-editor.php b/src/wp-includes/class-wp-editor.php index d6d262aee0..416d683730 100644 --- a/src/wp-includes/class-wp-editor.php +++ b/src/wp-includes/class-wp-editor.php @@ -211,7 +211,7 @@ final class _WP_Editors { $ext_plugins = ''; if ( $set['teeny'] ) { - self::$plugins = $plugins = apply_filters( 'teeny_mce_plugins', array( 'fullscreen', 'link', 'image', 'wordpress', 'wpeditimage', 'wplink' ), $editor_id ); + self::$plugins = $plugins = apply_filters( 'teeny_mce_plugins', array( 'fullscreen', 'image', 'wordpress', 'wpeditimage', 'wplink' ), $editor_id ); } else { /** * TinyMCE external plugins filter @@ -232,7 +232,6 @@ final class _WP_Editors { $plugins = array_unique( apply_filters( 'tiny_mce_plugins', array( 'charmap', 'hr', - 'link', 'media', 'paste', 'tabfocus', diff --git a/src/wp-includes/js/tinymce/plugins/link/plugin.js b/src/wp-includes/js/tinymce/plugins/link/plugin.js deleted file mode 100644 index 78e316782e..0000000000 --- a/src/wp-includes/js/tinymce/plugins/link/plugin.js +++ /dev/null @@ -1,352 +0,0 @@ -/** - * plugin.js - * - * Copyright, Moxiecode Systems AB - * Released under LGPL License. - * - * License: http://www.tinymce.com/license - * Contributing: http://www.tinymce.com/contributing - */ - -/*global tinymce:true */ - -tinymce.PluginManager.add('link', function(editor) { - function createLinkList(callback) { - return function() { - var linkList = editor.settings.link_list; - - if (typeof(linkList) == "string") { - tinymce.util.XHR.send({ - url: linkList, - success: function(text) { - callback(tinymce.util.JSON.parse(text)); - } - }); - } else { - callback(linkList); - } - }; - } - - function showDialog(linkList) { - var data = {}, selection = editor.selection, dom = editor.dom, selectedElm, anchorElm, initialText; - var win, onlyText, textListCtrl, linkListCtrl, relListCtrl, targetListCtrl, classListCtrl; - - function linkListChangeHandler(e) { - var textCtrl = win.find('#text'); - - if (!textCtrl.value() || (e.lastControl && textCtrl.value() == e.lastControl.text())) { - textCtrl.value(e.control.text()); - } - - win.find('#href').value(e.control.value()); - } - - function buildLinkList() { - var linkListItems = [{text: 'None', value: ''}]; - - tinymce.each(linkList, function(link) { - linkListItems.push({ - text: link.text || link.title, - value: editor.convertURL(link.value || link.url, 'href'), - menu: link.menu - }); - }); - - return linkListItems; - } - - function buildValues(listSettingName, dataItemName, defaultItems) { - var selectedItem, items = []; - - tinymce.each(editor.settings[listSettingName] || defaultItems, function(target) { - var item = { - text: target.text || target.title, - value: target.value - }; - - items.push(item); - - if (data[dataItemName] === target.value || (!selectedItem && target.selected)) { - selectedItem = item; - } - }); - - if (selectedItem && !data[dataItemName]) { - data[dataItemName] = selectedItem.value; - selectedItem.selected = true; - } - - return items; - } - - function buildAnchorListControl(url) { - var anchorList = []; - - tinymce.each(editor.dom.select('a:not([href])'), function(anchor) { - var id = anchor.name || anchor.id; - - if (id) { - anchorList.push({ - text: id, - value: '#' + id, - selected: url.indexOf('#' + id) != -1 - }); - } - }); - - if (anchorList.length) { - anchorList.unshift({text: 'None', value: ''}); - - return { - name: 'anchor', - type: 'listbox', - label: 'Anchors', - values: anchorList, - onselect: linkListChangeHandler - }; - } - } - - function urlChange() { - if (linkListCtrl) { - linkListCtrl.value(editor.convertURL(this.value(), 'href')); - } - - if (!initialText && data.text.length === 0 && onlyText) { - this.parent().parent().find('#text')[0].value(this.value()); - } - } - - function isOnlyTextSelected(anchorElm) { - var html = selection.getContent(); - - // Partial html and not a fully selected anchor element - if (/]+>[^<]+<\/a>$/.test(html) || html.indexOf('href=') == -1)) { - return false; - } - - if (anchorElm) { - var nodes = anchorElm.childNodes, i; - - if (nodes.length === 0) { - return false; - } - - for (i = nodes.length - 1; i >= 0; i--) { - if (nodes[i].nodeType != 3) { - return false; - } - } - } - - return true; - } - - selectedElm = selection.getNode(); - anchorElm = dom.getParent(selectedElm, 'a[href]'); - onlyText = isOnlyTextSelected(); - - data.text = initialText = anchorElm ? (anchorElm.innerText || anchorElm.textContent) : selection.getContent({format: 'text'}); - data.href = anchorElm ? dom.getAttrib(anchorElm, 'href') : ''; - data.target = anchorElm ? dom.getAttrib(anchorElm, 'target') : (editor.settings.default_link_target || null); - data.rel = anchorElm ? dom.getAttrib(anchorElm, 'rel') : null; - data['class'] = anchorElm ? dom.getAttrib(anchorElm, 'class') : null; - - if (onlyText) { - textListCtrl = { - name: 'text', - type: 'textbox', - size: 40, - label: 'Text to display', - onchange: function() { - data.text = this.value(); - } - }; - } - - if (linkList) { - linkListCtrl = { - type: 'listbox', - label: 'Link list', - values: buildLinkList(), - onselect: linkListChangeHandler, - value: editor.convertURL(data.href, 'href'), - onPostRender: function() { - linkListCtrl = this; - } - }; - } - - if (editor.settings.target_list !== false) { - targetListCtrl = { - name: 'target', - type: 'listbox', - label: 'Target', - values: buildValues('target_list', 'target', [{text: 'None', value: ''}, {text: 'New window', value: '_blank'}]) - }; - } - - if (editor.settings.rel_list) { - relListCtrl = { - name: 'rel', - type: 'listbox', - label: 'Rel', - values: buildValues('rel_list', 'rel', [{text: 'None', value: ''}]) - }; - } - - if (editor.settings.link_class_list) { - classListCtrl = { - name: 'class', - type: 'listbox', - label: 'Class', - values: buildValues('link_class_list', 'class') - }; - } - - win = editor.windowManager.open({ - title: 'Insert link', - data: data, - body: [ - { - name: 'href', - type: 'filepicker', - filetype: 'file', - size: 40, - autofocus: true, - label: 'Url', - onchange: urlChange, - onkeyup: urlChange - }, - textListCtrl, - buildAnchorListControl(data.href), - linkListCtrl, - relListCtrl, - targetListCtrl, - classListCtrl - ], - onSubmit: function(e) { - var href; - - data = tinymce.extend(data, e.data); - href = data.href; - - // Delay confirm since onSubmit will move focus - function delayedConfirm(message, callback) { - var rng = editor.selection.getRng(); - - window.setTimeout(function() { - editor.windowManager.confirm(message, function(state) { - editor.selection.setRng(rng); - callback(state); - }); - }, 0); - } - - function insertLink() { - if (anchorElm) { - editor.focus(); - - if (onlyText && data.text != initialText) { - anchorElm.innerText = data.text; - } - - dom.setAttribs(anchorElm, { - href: href, - target: data.target ? data.target : null, - rel: data.rel ? data.rel : null, - "class": data["class"] ? data["class"] : null - }); - - selection.select(anchorElm); - editor.undoManager.add(); - } else { - if (onlyText) { - editor.insertContent(dom.createHTML('a', { - href: href, - target: data.target ? data.target : null, - rel: data.rel ? data.rel : null, - "class": data["class"] ? data["class"] : null - }, dom.encode(data.text))); - } else { - editor.execCommand('mceInsertLink', false, { - href: href, - target: data.target, - rel: data.rel ? data.rel : null - }); - } - } - } - - if (!href) { - editor.execCommand('unlink'); - return; - } - - // Is email and not //user@domain.com - if (href.indexOf('@') > 0 && href.indexOf('//') == -1 && href.indexOf('mailto:') == -1) { - delayedConfirm( - 'The URL you entered seems to be an email address. Do you want to add the required mailto: prefix?', - function(state) { - if (state) { - href = 'mailto:' + href; - } - - insertLink(); - } - ); - - return; - } - - // Is www. prefixed - if (/^\s*www\./i.test(href)) { - delayedConfirm( - 'The URL you entered seems to be an external link. Do you want to add the required http:// prefix?', - function(state) { - if (state) { - href = 'http://' + href; - } - - insertLink(); - } - ); - - return; - } - - insertLink(); - } - }); - } - - editor.addButton('link', { - icon: 'link', - tooltip: 'Insert/edit link', - shortcut: 'Ctrl+K', - onclick: createLinkList(showDialog), - stateSelector: 'a[href]' - }); - - editor.addButton('unlink', { - icon: 'unlink', - tooltip: 'Remove link', - cmd: 'unlink', - stateSelector: 'a[href]' - }); - - editor.addShortcut('Ctrl+K', '', createLinkList(showDialog)); - - this.showDialog = showDialog; - - editor.addMenuItem('link', { - icon: 'link', - text: 'Insert link', - shortcut: 'Ctrl+K', - onclick: createLinkList(showDialog), - stateSelector: 'a[href]', - context: 'insert', - prependToContext: true - }); -}); diff --git a/src/wp-includes/js/tinymce/plugins/link/plugin.min.js b/src/wp-includes/js/tinymce/plugins/link/plugin.min.js deleted file mode 100644 index 89cdcd13e2..0000000000 --- a/src/wp-includes/js/tinymce/plugins/link/plugin.min.js +++ /dev/null @@ -1 +0,0 @@ -tinymce.PluginManager.add("link",function(e){function t(t){return function(){var n=e.settings.link_list;"string"==typeof n?tinymce.util.XHR.send({url:n,success:function(e){t(tinymce.util.JSON.parse(e))}}):t(n)}}function n(t){function n(e){var t=f.find("#text");(!t.value()||e.lastControl&&t.value()==e.lastControl.text())&&t.value(e.control.text()),f.find("#href").value(e.control.value())}function l(){var n=[{text:"None",value:""}];return tinymce.each(t,function(t){n.push({text:t.text||t.title,value:e.convertURL(t.value||t.url,"href"),menu:t.menu})}),n}function i(t,n,l){var i,a=[];return tinymce.each(e.settings[t]||l,function(e){var t={text:e.text||e.title,value:e.value};a.push(t),(p[n]===e.value||!i&&e.selected)&&(i=t)}),i&&!p[n]&&(p[n]=i.value,i.selected=!0),a}function a(t){var l=[];return tinymce.each(e.dom.select("a:not([href])"),function(e){var n=e.name||e.id;n&&l.push({text:n,value:"#"+n,selected:-1!=t.indexOf("#"+n)})}),l.length?(l.unshift({text:"None",value:""}),{name:"anchor",type:"listbox",label:"Anchors",values:l,onselect:n}):void 0}function r(){v&&v.value(e.convertURL(this.value(),"href")),!c&&0===p.text.length&&d&&this.parent().parent().find("#text")[0].value(this.value())}function o(e){var t=k.getContent();if(/]+>[^<]+<\/a>$/.test(t)||-1==t.indexOf("href=")))return!1;if(e){var n,l=e.childNodes;if(0===l.length)return!1;for(n=l.length-1;n>=0;n--)if(3!=l[n].nodeType)return!1}return!0}var s,u,c,f,d,h,v,x,g,m,p={},k=e.selection,y=e.dom;s=k.getNode(),u=y.getParent(s,"a[href]"),d=o(),p.text=c=u?u.innerText||u.textContent:k.getContent({format:"text"}),p.href=u?y.getAttrib(u,"href"):"",p.target=u?y.getAttrib(u,"target"):e.settings.default_link_target||null,p.rel=u?y.getAttrib(u,"rel"):null,p["class"]=u?y.getAttrib(u,"class"):null,d&&(h={name:"text",type:"textbox",size:40,label:"Text to display",onchange:function(){p.text=this.value()}}),t&&(v={type:"listbox",label:"Link list",values:l(),onselect:n,value:e.convertURL(p.href,"href"),onPostRender:function(){v=this}}),e.settings.target_list!==!1&&(g={name:"target",type:"listbox",label:"Target",values:i("target_list","target",[{text:"None",value:""},{text:"New window",value:"_blank"}])}),e.settings.rel_list&&(x={name:"rel",type:"listbox",label:"Rel",values:i("rel_list","rel",[{text:"None",value:""}])}),e.settings.link_class_list&&(m={name:"class",type:"listbox",label:"Class",values:i("link_class_list","class")}),f=e.windowManager.open({title:"Insert link",data:p,body:[{name:"href",type:"filepicker",filetype:"file",size:40,autofocus:!0,label:"Url",onchange:r,onkeyup:r},h,a(p.href),v,x,g,m],onSubmit:function(t){function n(t,n){var l=e.selection.getRng();window.setTimeout(function(){e.windowManager.confirm(t,function(t){e.selection.setRng(l),n(t)})},0)}function l(){u?(e.focus(),d&&p.text!=c&&(u.innerText=p.text),y.setAttribs(u,{href:i,target:p.target?p.target:null,rel:p.rel?p.rel:null,"class":p["class"]?p["class"]:null}),k.select(u),e.undoManager.add()):d?e.insertContent(y.createHTML("a",{href:i,target:p.target?p.target:null,rel:p.rel?p.rel:null,"class":p["class"]?p["class"]:null},y.encode(p.text))):e.execCommand("mceInsertLink",!1,{href:i,target:p.target,rel:p.rel?p.rel:null})}var i;return p=tinymce.extend(p,t.data),(i=p.href)?i.indexOf("@")>0&&-1==i.indexOf("//")&&-1==i.indexOf("mailto:")?void n("The URL you entered seems to be an email address. Do you want to add the required mailto: prefix?",function(e){e&&(i="mailto:"+i),l()}):/^\s*www\./i.test(i)?void n("The URL you entered seems to be an external link. Do you want to add the required http:// prefix?",function(e){e&&(i="http://"+i),l()}):void l():void e.execCommand("unlink")}})}e.addButton("link",{icon:"link",tooltip:"Insert/edit link",shortcut:"Ctrl+K",onclick:t(n),stateSelector:"a[href]"}),e.addButton("unlink",{icon:"unlink",tooltip:"Remove link",cmd:"unlink",stateSelector:"a[href]"}),e.addShortcut("Ctrl+K","",t(n)),this.showDialog=n,e.addMenuItem("link",{icon:"link",text:"Insert link",shortcut:"Ctrl+K",onclick:t(n),stateSelector:"a[href]",context:"insert",prependToContext:!0})}); \ No newline at end of file diff --git a/src/wp-includes/js/tinymce/plugins/wplink/plugin.js b/src/wp-includes/js/tinymce/plugins/wplink/plugin.js index aa0738039e..4129950ffc 100644 --- a/src/wp-includes/js/tinymce/plugins/wplink/plugin.js +++ b/src/wp-includes/js/tinymce/plugins/wplink/plugin.js @@ -12,6 +12,23 @@ tinymce.PluginManager.add( 'wplink', function( editor ) { tooltip: 'Insert/edit link', shortcut: 'Alt+Shift+A', cmd: 'WP_Link', + + onPostRender: function() { + var ctrl = this; + + editor.on( 'nodechange', function( event ) { + var node = event.element; + + ctrl.disabled( editor.selection.isCollapsed() && node.nodeName !== 'A' ); + ctrl.active( node.nodeName === 'A' && ! node.name ); + }); + } + }); + + editor.addButton( 'unlink', { + icon: 'unlink', + tooltip: 'Remove link', + cmd: 'unlink', stateSelector: 'a[href]' });