+ 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