From 2db58b8dbefcb1e5bb7caa9b026427fabfa23ef2 Mon Sep 17 00:00:00 2001 From: Ryan Cramer Date: Sun, 1 Aug 2021 11:55:57 -0400 Subject: [PATCH] Additional updates related to processwire/processwire-issues#1098 --- .../plugins/pwlink/plugin.js | 22 +++++++++++++------ .../plugins/pwlink/plugin.min.js | 2 +- 2 files changed, 16 insertions(+), 8 deletions(-) diff --git a/wire/modules/Inputfield/InputfieldCKEditor/plugins/pwlink/plugin.js b/wire/modules/Inputfield/InputfieldCKEditor/plugins/pwlink/plugin.js index 161004d0..0214a491 100644 --- a/wire/modules/Inputfield/InputfieldCKEditor/plugins/pwlink/plugin.js +++ b/wire/modules/Inputfield/InputfieldCKEditor/plugins/pwlink/plugin.js @@ -117,20 +117,28 @@ var selectionHtml = editor.getSelectedHtml(true); // true=return string var $existingLink = null; var anchors = CKEDITOR.plugins.link.getEditorAnchors(editor); + var inlineNodeNames = '/em/strong/i/b/u/s/span/small/abbr/cite/figcaption/'; if(nodeName != 'a' && nodeName != 'img') { - // if there is a parent element then expand selection to include all of it - // this prevents double click on the part of foo bar baz from - // just including the 'bar' as the link text var parentNodes = node.getParents(); for(var n = 0; n < parentNodes.length; n++) { var parentNode = parentNodes[n]; - if(parentNode.getName() !== 'a') continue; - node = parentNode; - nodeName = parentNode.getName(); - break; + var parentNodeName = parentNode.getName(); + if(parentNodeName === 'a') { + // if there is a parent element then expand selection to include all of it + // this prevents double click on the part of foo bar baz from + // just including the 'bar' as the link text + node = parentNode; + break; + } else if(inlineNodeNames.indexOf('/' + parentNodeName + '/') > -1 && node.getText() === selectionText) { + // include certain wrapping inline elements for formatting in the selection text + node = parentNode; + selection.selectElement(node); + } } } + + nodeName = node.getName(); // in case it changed above if(nodeName == 'a') { // existing link diff --git a/wire/modules/Inputfield/InputfieldCKEditor/plugins/pwlink/plugin.min.js b/wire/modules/Inputfield/InputfieldCKEditor/plugins/pwlink/plugin.min.js index 39fa1d09..057ef486 100644 --- a/wire/modules/Inputfield/InputfieldCKEditor/plugins/pwlink/plugin.min.js +++ b/wire/modules/Inputfield/InputfieldCKEditor/plugins/pwlink/plugin.min.js @@ -1 +1 @@ -(function(){CKEDITOR.plugins.add("pwlink",{requires:"dialog,fakeobjects",init:function(editor){var allowed="a[!href,target,name,title,rel]";var required="a[href]";var classOptions=ProcessWire.config.InputfieldCKEditor.pwlink.classOptions;if(classOptions.length)allowed+="("+classOptions+")";editor.addCommand("pwlink",{allowedContent:allowed,requiredContent:required,exec:loadIframeLinkPicker});editor.addCommand("anchor",new CKEDITOR.dialogCommand("anchor",{allowedContent:"a[!name,id]",requiredContent:"a[name]"}));editor.addCommand("unlink",new CKEDITOR.unlinkCommand);editor.addCommand("removeAnchor",new CKEDITOR.removeAnchorCommand);editor.setKeystroke(CKEDITOR.CTRL+76,"pwlink");if(editor.ui.addButton){editor.ui.addButton("PWLink",{label:editor.lang.link.toolbar,command:"pwlink",toolbar:"links,10",hidpi:true,icon:CKEDITOR.env.hidpi?this.path+"images/hidpi/pwlink.png":this.path+"images/pwlink.png"});editor.ui.addButton("Unlink",{label:editor.lang.link.unlink,command:"unlink",toolbar:"links,20"});editor.ui.addButton("Anchor",{label:editor.lang.link.anchor.toolbar,command:"anchor",toolbar:"links,30"})}editor.on("doubleclick",function(evt){var element=CKEDITOR.plugins.link.getSelectedLink(editor)||evt.data.element;if(element.is("a")&&!element.getAttribute("name")&&!element.isReadOnly()){var $a=jQuery(element.$);if($a.children("img").length==0){evt.cancel();editor.commands.pwlink.exec()}}});editor.on("instanceReady",function(ck){ck.editor.removeMenuItem("link")});if(editor.contextMenu){editor.addMenuItem("pwlinkitem",{label:ProcessWire.config.InputfieldCKEditor.pwlink.edit,command:"pwlink",group:"link",icon:CKEDITOR.env.hidpi?this.path+"images/hidpi/pwlink.png":this.path+"images/pwlink.png"});editor.contextMenu.addListener(function(element){if(!element||element.isReadOnly())return null;var anchor=CKEDITOR.plugins.link.tryRestoreFakeAnchor(editor,element);var menu={};if(!anchor&&!(anchor=CKEDITOR.plugins.link.getSelectedLink(editor)))return null;if(anchor.getAttribute("href")&&anchor.getChildCount())menu={pwlinkitem:CKEDITOR.TRISTATE_OFF};return menu})}}});function loadIframeLinkPicker(editor){var $in=jQuery("#Inputfield_id");var pageID;if($in.length){pageID=$in.val()}else{pageID=jQuery("#"+editor.name).closest(".Inputfield").attr("data-pid")}var $textarea=jQuery("#"+editor.name);var selection=editor.getSelection(true);var node=selection.getStartElement();var nodeName=node.getName();var selectionText=selection.getSelectedText();var selectionHtml=editor.getSelectedHtml(true);var $existingLink=null;var anchors=CKEDITOR.plugins.link.getEditorAnchors(editor);if(nodeName!="a"&&nodeName!="img"){var parentNodes=node.getParents();for(var n=0;n0){for(var n=0;n").append($a).html();var el=CKEDITOR.dom.element.createFromHtml(html);editor.insertElement(el)}$iframe.dialog("close")}var modalSettings={title:" "+insertLinkLabel,open:function(){if(jQuery(".cke_maximized").length>0){jQuery(".ui-dialog").css("z-index",9999);jQuery(".ui-widget-overlay").css("z-index",9998)}},buttons:[{class:"pw_link_submit_insert",html:" "+insertLinkLabel,click:clickInsert},{html:" "+cancelLabel,click:function(){$iframe.dialog("close")},class:"ui-priority-secondary"}]};var $iframe=pwModalWindow(modalUrl,modalSettings,"medium");$iframe.load(function(){var $i=$iframe.contents();$i.find("#ProcessPageEditLinkForm").data("iframe",$iframe);jQuery("#link_page_url_input",$i).keydown(function(event){var $this=jQuery(this);var val=jQuery.trim($this.val());if(event.keyCode==13){event.preventDefault();if(val.length>0)clickInsert();return false}})})}})(); \ No newline at end of file +(function(){CKEDITOR.plugins.add("pwlink",{requires:"dialog,fakeobjects",init:function(editor){var allowed="a[!href,target,name,title,rel]";var required="a[href]";var classOptions=ProcessWire.config.InputfieldCKEditor.pwlink.classOptions;if(classOptions.length)allowed+="("+classOptions+")";editor.addCommand("pwlink",{allowedContent:allowed,requiredContent:required,exec:loadIframeLinkPicker});editor.addCommand("anchor",new CKEDITOR.dialogCommand("anchor",{allowedContent:"a[!name,id]",requiredContent:"a[name]"}));editor.addCommand("unlink",new CKEDITOR.unlinkCommand);editor.addCommand("removeAnchor",new CKEDITOR.removeAnchorCommand);editor.setKeystroke(CKEDITOR.CTRL+76,"pwlink");if(editor.ui.addButton){editor.ui.addButton("PWLink",{label:editor.lang.link.toolbar,command:"pwlink",toolbar:"links,10",hidpi:true,icon:CKEDITOR.env.hidpi?this.path+"images/hidpi/pwlink.png":this.path+"images/pwlink.png"});editor.ui.addButton("Unlink",{label:editor.lang.link.unlink,command:"unlink",toolbar:"links,20"});editor.ui.addButton("Anchor",{label:editor.lang.link.anchor.toolbar,command:"anchor",toolbar:"links,30"})}editor.on("doubleclick",function(evt){var element=CKEDITOR.plugins.link.getSelectedLink(editor)||evt.data.element;if(element.is("a")&&!element.getAttribute("name")&&!element.isReadOnly()){var $a=jQuery(element.$);if($a.children("img").length==0){evt.cancel();editor.commands.pwlink.exec()}}});editor.on("instanceReady",function(ck){ck.editor.removeMenuItem("link")});if(editor.contextMenu){editor.addMenuItem("pwlinkitem",{label:ProcessWire.config.InputfieldCKEditor.pwlink.edit,command:"pwlink",group:"link",icon:CKEDITOR.env.hidpi?this.path+"images/hidpi/pwlink.png":this.path+"images/pwlink.png"});editor.contextMenu.addListener(function(element){if(!element||element.isReadOnly())return null;var anchor=CKEDITOR.plugins.link.tryRestoreFakeAnchor(editor,element);var menu={};if(!anchor&&!(anchor=CKEDITOR.plugins.link.getSelectedLink(editor)))return null;if(anchor.getAttribute("href")&&anchor.getChildCount())menu={pwlinkitem:CKEDITOR.TRISTATE_OFF};return menu})}}});function loadIframeLinkPicker(editor){var $in=jQuery("#Inputfield_id");var pageID;if($in.length){pageID=$in.val()}else{pageID=jQuery("#"+editor.name).closest(".Inputfield").attr("data-pid")}var $textarea=jQuery("#"+editor.name);var selection=editor.getSelection(true);var node=selection.getStartElement();var nodeName=node.getName();var selectionText=selection.getSelectedText();var selectionHtml=editor.getSelectedHtml(true);var $existingLink=null;var anchors=CKEDITOR.plugins.link.getEditorAnchors(editor);var inlineNodeNames="/em/strong/i/b/u/s/span/small/abbr/cite/figcaption/";if(nodeName!="a"&&nodeName!="img"){var parentNodes=node.getParents();for(var n=0;n-1&&node.getText()===selectionText){node=parentNode;selection.selectElement(node)}}}nodeName=node.getName();if(nodeName=="a"){$existingLink=jQuery(node.$);selectionText=node.getText();selectionHtml=node.getHtml();selection.selectElement(node)}else if(nodeName=="td"||nodeName=="th"||nodeName=="tr"){var firstChar=selectionText.substring(0,1);if(firstChar=="\n"||firstChar=="\r"){ProcessWire.alert("Your selection includes part of the table. Please try selecting the text again.");return}}else if(nodeName=="img"){var $img=jQuery(node.$);$existingLink=$img.parent("a");selectionText=node.$.outerHTML;selectionHtml=selectionText}else if(selectionText.length<1){return}else{}var modalUrl=ProcessWire.config.urls.admin+"page/link/?id="+pageID+"&modal=1";var $langWrapper=$textarea.closest(".LanguageSupport");if($langWrapper.length){modalUrl+="&lang="+$langWrapper.data("language")}else{$langWrapper=$textarea.parents(".InputfieldTable_langTabs").find("li.ui-state-active a");if($langWrapper.length&&typeof $langWrapper.data("lang")!="undefined"){modalUrl+="&lang="+$langWrapper.data("lang")}else if(jQuery("#pw-edit-lang").length){modalUrl+="&lang="+jQuery("#pw-edit-lang").val()}}if($existingLink!=null){var attrs=["href","title","class","rel","target"];for(var n=0;n0){for(var n=0;n").append($a).html();var el=CKEDITOR.dom.element.createFromHtml(html);editor.insertElement(el)}$iframe.dialog("close")}var modalSettings={title:" "+insertLinkLabel,open:function(){if(jQuery(".cke_maximized").length>0){jQuery(".ui-dialog").css("z-index",9999);jQuery(".ui-widget-overlay").css("z-index",9998)}},buttons:[{class:"pw_link_submit_insert",html:" "+insertLinkLabel,click:clickInsert},{html:" "+cancelLabel,click:function(){$iframe.dialog("close")},class:"ui-priority-secondary"}]};var $iframe=pwModalWindow(modalUrl,modalSettings,"medium");$iframe.load(function(){var $i=$iframe.contents();$i.find("#ProcessPageEditLinkForm").data("iframe",$iframe);jQuery("#link_page_url_input",$i).keydown(function(event){var $this=jQuery(this);var val=jQuery.trim($this.val());if(event.keyCode==13){event.preventDefault();if(val.length>0)clickInsert();return false}})})}})(); \ No newline at end of file