]> git.immae.eu Git - perso/Immae/Projets/packagist/ludivine-ckeditor-component.git/blobdiff - sources/plugins/link/dialogs/link.js
Update to 4.7.3
[perso/Immae/Projets/packagist/ludivine-ckeditor-component.git] / sources / plugins / link / dialogs / link.js
index 914471fd1a0e8591d62e0a66897d2af5032d784f..4c609289a559c19fbfd207cedac9b8875cb674eb 100644 (file)
                var plugin = CKEDITOR.plugins.link,\r
                        initialLinkText;\r
 \r
+               function createRangeForLink( editor, link ) {\r
+                       var range = editor.createRange();\r
+\r
+                       range.setStartBefore( link );\r
+                       range.setEndAfter( link );\r
+\r
+                       return range;\r
+               }\r
+\r
+               function insertLinksIntoSelection( editor, data ) {\r
+                       var attributes = plugin.getLinkAttributes( editor, data ),\r
+                               ranges = editor.getSelection().getRanges(),\r
+                               style = new CKEDITOR.style( {\r
+                                       element: 'a',\r
+                                       attributes: attributes.set\r
+                               } ),\r
+                               rangesToSelect = [],\r
+                               range,\r
+                               text,\r
+                               nestedLinks,\r
+                               i,\r
+                               j;\r
+\r
+                       style.type = CKEDITOR.STYLE_INLINE; // need to override... dunno why.\r
+\r
+                       for ( i = 0; i < ranges.length; i++ ) {\r
+                               range = ranges[ i ];\r
+\r
+                               // Use link URL as text with a collapsed cursor.\r
+                               if ( range.collapsed ) {\r
+                                       // Short mailto link text view (http://dev.ckeditor.com/ticket/5736).\r
+                                       text = new CKEDITOR.dom.text( data.linkText || ( data.type == 'email' ?\r
+                                               data.email.address : attributes.set[ 'data-cke-saved-href' ] ), editor.document );\r
+                                       range.insertNode( text );\r
+                                       range.selectNodeContents( text );\r
+                               } else if ( initialLinkText !== data.linkText ) {\r
+                                       text = new CKEDITOR.dom.text( data.linkText, editor.document );\r
+\r
+                                       // Shrink range to preserve block element.\r
+                                       range.shrink( CKEDITOR.SHRINK_TEXT );\r
+\r
+                                       // Use extractHtmlFromRange to remove markup within the selection. Also this method is a little\r
+                                       // smarter than range#deleteContents as it plays better e.g. with table cells.\r
+                                       editor.editable().extractHtmlFromRange( range );\r
+\r
+                                       range.insertNode( text );\r
+                               }\r
+\r
+                               // Editable links nested within current range should be removed, so that the link is applied to whole selection.\r
+                               nestedLinks = range._find( 'a' );\r
+\r
+                               for     ( j = 0; j < nestedLinks.length; j++ ) {\r
+                                       nestedLinks[ j ].remove( true );\r
+                               }\r
+\r
+\r
+                               // Apply style.\r
+                               style.applyToRange( range, editor );\r
+\r
+                               rangesToSelect.push( range );\r
+                       }\r
+\r
+                       editor.getSelection().selectRanges( rangesToSelect );\r
+               }\r
+\r
+               function editLinksInSelection( editor, selectedElements, data ) {\r
+                       var attributes = plugin.getLinkAttributes( editor, data ),\r
+                               ranges = [],\r
+                               element,\r
+                               href,\r
+                               textView,\r
+                               newText,\r
+                               i;\r
+\r
+                       for ( i = 0; i < selectedElements.length; i++ ) {\r
+                               // We're only editing an existing link, so just overwrite the attributes.\r
+                               element = selectedElements[ i ];\r
+                               href = element.data( 'cke-saved-href' );\r
+                               textView = element.getHtml();\r
+\r
+                               element.setAttributes( attributes.set );\r
+                               element.removeAttributes( attributes.removed );\r
+\r
+\r
+                               if ( data.linkText && initialLinkText != data.linkText ) {\r
+                                       // Display text has been changed.\r
+                                       newText = data.linkText;\r
+                               } else if ( href == textView || data.type == 'email' && textView.indexOf( '@' ) != -1 ) {\r
+                                       // Update text view when user changes protocol (http://dev.ckeditor.com/ticket/4612).\r
+                                       // Short mailto link text view (http://dev.ckeditor.com/ticket/5736).\r
+                                       newText = data.type == 'email' ? data.email.address : attributes.set[ 'data-cke-saved-href' ];\r
+                               }\r
+\r
+                               if ( newText ) {\r
+                                       element.setText( newText );\r
+                               }\r
+\r
+                               ranges.push( createRangeForLink( editor, element ) );\r
+                       }\r
+\r
+                       // We changed the content, so need to select it again.\r
+                       editor.getSelection().selectRanges( ranges );\r
+               }\r
+\r
                // Handles the event when the "Target" selection box is changed.\r
                var targetChanged = function() {\r
                                var dialog = this.getDialog(),\r
                                                        label: commonLang.protocol,\r
                                                        'default': 'http://',\r
                                                        items: [\r
-                                                               // Force 'ltr' for protocol names in BIDI. (#5433)\r
+                                                               // Force 'ltr' for protocol names in BIDI. (http://dev.ckeditor.com/ticket/5433)\r
                                                                [ 'http://\u200E', 'http://' ],\r
                                                                [ 'https://\u200E', 'https://' ],\r
                                                                [ 'ftp://\u200E', 'ftp://' ],\r
                                                        },\r
                                                        commit: function( data ) {\r
                                                                // IE will not trigger the onChange event if the mouse has been used\r
-                                                               // to carry all the operations #4724\r
+                                                               // to carry all the operations http://dev.ckeditor.com/ticket/4724\r
                                                                this.onChange();\r
 \r
                                                                if ( !data.url )\r
                        onShow: function() {\r
                                var editor = this.getParentEditor(),\r
                                        selection = editor.getSelection(),\r
-                                       selectedElement = selection.getSelectedElement(),\r
                                        displayTextField = this.getContentElement( 'info', 'linkDisplayText' ).getElement().getParent().getParent(),\r
-                                       element = null;\r
+                                       elements = plugin.getSelectedLink( editor, true ),\r
+                                       firstLink = elements[ 0 ] || null;\r
 \r
                                // Fill in all the relevant fields if there's already one link selected.\r
-                               if ( ( element = plugin.getSelectedLink( editor ) ) && element.hasAttribute( 'href' ) ) {\r
+                               if ( firstLink && firstLink.hasAttribute( 'href' ) ) {\r
                                        // Don't change selection if some element is already selected.\r
                                        // For example - don't destroy fake selection.\r
-                                       if ( !selectedElement ) {\r
-                                               selection.selectElement( element );\r
-                                               selectedElement = element;\r
+                                       if ( !selection.getSelectedElement() && !selection.isInTable() ) {\r
+                                               selection.selectElement( firstLink );\r
                                        }\r
-                               } else {\r
-                                       element = null;\r
                                }\r
 \r
+                               var data = plugin.parseLinkAttributes( editor, firstLink );\r
+\r
                                // Here we'll decide whether or not we want to show Display Text field.\r
-                               if ( plugin.showDisplayTextForElement( selectedElement, editor ) ) {\r
+                               if ( elements.length <= 1 && plugin.showDisplayTextForElement( firstLink, editor ) ) {\r
                                        displayTextField.show();\r
                                } else {\r
                                        displayTextField.hide();\r
                                }\r
 \r
-                               var data = plugin.parseLinkAttributes( editor, element );\r
-\r
                                // Record down the selected element in the dialog.\r
-                               this._.selectedElement = element;\r
+                               this._.selectedElements = elements;\r
 \r
                                this.setupContent( data );\r
                        },\r
                                // Collect data from fields.\r
                                this.commitContent( data );\r
 \r
-                               var selection = editor.getSelection(),\r
-                                       attributes = plugin.getLinkAttributes( editor, data ),\r
-                                       bm,\r
-                                       nestedLinks;\r
-\r
-                               if ( !this._.selectedElement ) {\r
-                                       var range = selection.getRanges()[ 0 ],\r
-                                               text;\r
-\r
-                                       // Use link URL as text with a collapsed cursor.\r
-                                       if ( range.collapsed ) {\r
-                                               // Short mailto link text view (#5736).\r
-                                               text = new CKEDITOR.dom.text( data.linkText || ( data.type == 'email' ?\r
-                                                       data.email.address : attributes.set[ 'data-cke-saved-href' ] ), editor.document );\r
-                                               range.insertNode( text );\r
-                                               range.selectNodeContents( text );\r
-                                       } else if ( initialLinkText !== data.linkText ) {\r
-                                               text = new CKEDITOR.dom.text( data.linkText, editor.document );\r
-\r
-                                               // Shrink range to preserve block element.\r
-                                               range.shrink( CKEDITOR.SHRINK_TEXT );\r
-\r
-                                               // Use extractHtmlFromRange to remove markup within the selection. Also this method is a little\r
-                                               // smarter than range#deleteContents as it plays better e.g. with table cells.\r
-                                               editor.editable().extractHtmlFromRange( range );\r
-\r
-                                               range.insertNode( text );\r
-                                       }\r
-\r
-                                       // Editable links nested within current range should be removed, so that the link is applied to whole selection.\r
-                                       nestedLinks = range._find( 'a' );\r
-\r
-                                       for     ( var i = 0; i < nestedLinks.length; i++ ) {\r
-                                               nestedLinks[ i ].remove( true );\r
-                                       }\r
-\r
-                                       // Apply style.\r
-                                       var style = new CKEDITOR.style( {\r
-                                               element: 'a',\r
-                                               attributes: attributes.set\r
-                                       } );\r
-\r
-                                       style.type = CKEDITOR.STYLE_INLINE; // need to override... dunno why.\r
-                                       style.applyToRange( range, editor );\r
-                                       range.select();\r
+                               if ( !this._.selectedElements.length ) {\r
+                                       insertLinksIntoSelection( editor, data );\r
                                } else {\r
-                                       // We're only editing an existing link, so just overwrite the attributes.\r
-                                       var element = this._.selectedElement,\r
-                                               href = element.data( 'cke-saved-href' ),\r
-                                               textView = element.getHtml(),\r
-                                               newText;\r
-\r
-                                       element.setAttributes( attributes.set );\r
-                                       element.removeAttributes( attributes.removed );\r
-\r
-                                       if ( data.linkText && initialLinkText != data.linkText ) {\r
-                                               // Display text has been changed.\r
-                                               newText = data.linkText;\r
-                                       } else if ( href == textView || data.type == 'email' && textView.indexOf( '@' ) != -1 ) {\r
-                                               // Update text view when user changes protocol (#4612).\r
-                                               // Short mailto link text view (#5736).\r
-                                               newText = data.type == 'email' ? data.email.address : attributes.set[ 'data-cke-saved-href' ];\r
-                                       }\r
-\r
-                                       if ( newText ) {\r
-                                               element.setText( newText );\r
-                                               // We changed the content, so need to select it again.\r
-                                               selection.selectElement( element );\r
-                                       }\r
+                                       editLinksInSelection( editor, this._.selectedElements, data );\r
 \r
-                                       delete this._.selectedElement;\r
+                                       delete this._.selectedElements;\r
                                }\r
                        },\r
                        onLoad: function() {\r