X-Git-Url: https://jasonwoof.com/gitweb/?a=blobdiff_plain;f=_source%2Fplugins%2Flink%2Fdialogs%2Flink.js;h=238113a5584bb90085675f08e9b6db4538ef779d;hb=2f22c0c38f17e75be5541089076885442aaa2377;hp=5362b16e3c2612aafd036bae6f5db6dd1f8f41a3;hpb=9afde8772159bd3436f1f5b7862960307710ae5a;p=ckeditor.git diff --git a/_source/plugins/link/dialogs/link.js b/_source/plugins/link/dialogs/link.js index 5362b16..238113a 100644 --- a/_source/plugins/link/dialogs/link.js +++ b/_source/plugins/link/dialogs/link.js @@ -1,5 +1,5 @@ /* -Copyright (c) 2003-2010, CKSource - Frederico Knabben. All rights reserved. +Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved. For licensing, see LICENSE.html or http://ckeditor.com/license */ @@ -196,7 +196,8 @@ CKEDITOR.dialog.add( 'link', function( editor ) var featureMatch; while ( ( featureMatch = popupFeaturesRegex.exec( onclickMatch[2] ) ) ) { - if ( featureMatch[2] == 'yes' || featureMatch[2] == '1' ) + // Some values should remain numbers (#7300) + if ( ( featureMatch[2] == 'yes' || featureMatch[2] == '1' ) && !( featureMatch[1] in { height:1, width:1, top:1, left:1 } ) ) retval.target[ featureMatch[1] ] = true; else if ( isFinite( featureMatch[2] ) ) retval.target[ featureMatch[1] ] = featureMatch[2]; @@ -225,41 +226,60 @@ CKEDITOR.dialog.add( 'link', function( editor ) advAttr( 'advId', 'id' ); advAttr( 'advLangDir', 'dir' ); advAttr( 'advAccessKey', 'accessKey' ); - advAttr( 'advName', 'name' ); + + retval.adv.advName = + element.data( 'cke-saved-name' ) + || element.getAttribute( 'name' ) + || ''; advAttr( 'advLangCode', 'lang' ); advAttr( 'advTabIndex', 'tabindex' ); advAttr( 'advTitle', 'title' ); advAttr( 'advContentType', 'type' ); - advAttr( 'advCSSClasses', 'class' ); + CKEDITOR.plugins.link.synAnchorSelector ? + retval.adv.advCSSClasses = getLinkClass( element ) + : advAttr( 'advCSSClasses', 'class' ); advAttr( 'advCharset', 'charset' ); advAttr( 'advStyles', 'style' ); + advAttr( 'advRel', 'rel' ); } // Find out whether we have any anchors in the editor. - // Get all IMG elements in CK document. - var elements = editor.document.getElementsByTag( 'img' ), - realAnchors = new CKEDITOR.dom.nodeList( editor.document.$.anchors ), - anchors = retval.anchors = []; + var anchors = retval.anchors = [], + i, count, item; - for ( var i = 0; i < elements.count() ; i++ ) + // For some browsers we set contenteditable="false" on anchors, making document.anchors not to include them, so we must traverse the links manually (#7893). + if ( CKEDITOR.plugins.link.emptyAnchorFix ) { - var item = elements.getItem( i ); - if ( item.data( 'cke-realelement' ) && item.data( 'cke-real-element-type' ) == 'anchor' ) - anchors.push( editor.restoreRealElement( item ) ); + var links = editor.document.getElementsByTag( 'a' ); + for ( i = 0, count = links.count(); i < count; i++ ) + { + item = links.getItem( i ); + if ( item.data( 'cke-saved-name' ) || item.hasAttribute( 'name' ) ) + anchors.push( { name : item.data( 'cke-saved-name' ) || item.getAttribute( 'name' ), id : item.getAttribute( 'id' ) } ); + } + } + else + { + var anchorList = new CKEDITOR.dom.nodeList( editor.document.$.anchors ); + for ( i = 0, count = anchorList.count(); i < count; i++ ) + { + item = anchorList.getItem( i ); + anchors[ i ] = { name : item.getAttribute( 'name' ), id : item.getAttribute( 'id' ) }; + } } - for ( i = 0 ; i < realAnchors.count() ; i++ ) - anchors.push( realAnchors.getItem( i ) ); - - for ( i = 0 ; i < anchors.length ; i++ ) + if ( CKEDITOR.plugins.link.fakeAnchor ) { - item = anchors[ i ]; - anchors[ i ] = { name : item.getAttribute( 'name' ), id : item.getAttribute( 'id' ) }; + var imgs = editor.document.getElementsByTag( 'img' ); + for ( i = 0, count = imgs.count(); i < count; i++ ) + { + if ( ( item = CKEDITOR.plugins.link.tryRestoreFakeAnchor( editor, imgs.getItem( i ) ) ) ) + anchors.push( { name : item.getAttribute( 'name' ), id : item.getAttribute( 'id' ) } ); + } } // Record down the selected element in the dialog. this._.selectedElement = element; - return retval; }; @@ -363,6 +383,12 @@ CKEDITOR.dialog.add( 'link', function( editor ) return 'String.fromCharCode(' + encodedChars.join( ',' ) + ')'; } + function getLinkClass( ele ) + { + var className = ele.getAttribute( 'class' ); + return className ? className.replace( /\s*(?:cke_anchor_empty|cke_anchor)(?:\s*$)?/g, '' ) : ''; + } + var commonLang = editor.lang.common, linkLang = editor.lang.link; @@ -450,8 +476,8 @@ CKEDITOR.dialog.add( 'link', function( editor ) this.allowOnChange = false; var protocolCmb = this.getDialog().getContentElement( 'info', 'protocol' ), url = this.getValue(), - urlOnChangeProtocol = /^(http|https|ftp|news):\/\/(?=.)/gi, - urlOnChangeTestOther = /^((javascript:)|[#\/\.\?])/gi; + urlOnChangeProtocol = /^(http|https|ftp|news):\/\/(?=.)/i, + urlOnChangeTestOther = /^((javascript:)|[#\/\.\?])/i; var protocol = urlOnChangeProtocol.exec( url ); if ( protocol ) @@ -627,7 +653,7 @@ CKEDITOR.dialog.add( 'link', function( editor ) type : 'html', id : 'noAnchors', style : 'text-align: center;', - html : '
' + CKEDITOR.tools.htmlEncode( linkLang.noAnchors ) + '
', + html : '
' + CKEDITOR.tools.htmlEncode( linkLang.noAnchors ) + '
', // Focus the first element defined in above html. focus : true, setup : function( data ) @@ -760,7 +786,7 @@ CKEDITOR.dialog.add( 'link', function( editor ) setup : function( data ) { if ( data.target ) - this.setValue( data.target.type ); + this.setValue( data.target.type || 'notSet' ); targetChanged.call( this ); }, commit : function( data ) @@ -1117,16 +1143,25 @@ CKEDITOR.dialog.add( 'link', function( editor ) }, { type : 'hbox', + widths : [ '45%', '55%' ], children : [ { type : 'text', + label : linkLang.rel, + 'default' : '', + id : 'advRel', + setup : setupAdvParams, + commit : commitAdvParams + }, + { + type : 'text', label : linkLang.styles, 'default' : '', id : 'advStyles', + validate : CKEDITOR.dialog.validate.inlineStyle( editor.lang.common.invalidInlineStyle ), setup : setupAdvParams, commit : commitAdvParams - } ] } @@ -1137,8 +1172,6 @@ CKEDITOR.dialog.add( 'link', function( editor ) ], onShow : function() { - this.fakeObj = false; - var editor = this.getParentEditor(), selection = editor.getSelection(), element = null; @@ -1146,14 +1179,6 @@ CKEDITOR.dialog.add( 'link', function( editor ) // Fill in all the relevant fields if there's already one link selected. if ( ( element = plugin.getSelectedLink( editor ) ) && element.hasAttribute( 'href' ) ) selection.selectElement( element ); - else if ( ( element = selection.getSelectedElement() ) && element.is( 'img' ) - && element.data( 'cke-real-element-type' ) - && element.data( 'cke-real-element-type' ) == 'anchor' ) - { - this.fakeObj = element; - element = editor.restoreRealElement( this.fakeObj ); - selection.selectElement( this.fakeObj ); - } else element = null; @@ -1161,9 +1186,9 @@ CKEDITOR.dialog.add( 'link', function( editor ) }, onOk : function() { - var attributes = { href : 'javascript:void(0)/*' + CKEDITOR.tools.getNextNumber() + '*/' }, + var attributes = {}, removeAttributes = [], - data = { href : attributes.href }, + data = {}, me = this, editor = this.getParentEditor(); @@ -1174,7 +1199,7 @@ CKEDITOR.dialog.add( 'link', function( editor ) { case 'url': var protocol = ( data.url && data.url.protocol != undefined ) ? data.url.protocol : 'http://', - url = ( data.url && data.url.url ) || ''; + url = ( data.url && CKEDITOR.tools.trim( data.url.url ) ) || ''; attributes[ 'data-cke-saved-href' ] = ( url.indexOf( '/' ) === 0 ) ? url : protocol + url; break; case 'anchor': @@ -1283,11 +1308,15 @@ CKEDITOR.dialog.add( 'link', function( editor ) removeAttributes.push( attrName ); }; - if ( this._.selectedElement ) - advAttr( 'advId', 'id' ); + advAttr( 'advId', 'id' ); advAttr( 'advLangDir', 'dir' ); advAttr( 'advAccessKey', 'accessKey' ); - advAttr( 'advName', 'name' ); + + if ( data.adv[ 'advName' ] ) + attributes[ 'name' ] = attributes[ 'data-cke-saved-name' ] = data.adv[ 'advName' ]; + else + removeAttributes = removeAttributes.concat( [ 'data-cke-saved-name', 'name' ] ); + advAttr( 'advLangCode', 'lang' ); advAttr( 'advTabIndex', 'tabindex' ); advAttr( 'advTitle', 'title' ); @@ -1295,13 +1324,19 @@ CKEDITOR.dialog.add( 'link', function( editor ) advAttr( 'advCSSClasses', 'class' ); advAttr( 'advCharset', 'charset' ); advAttr( 'advStyles', 'style' ); + advAttr( 'advRel', 'rel' ); } + + var selection = editor.getSelection(); + + // Browser need the "href" fro copy/paste link to work. (#6641) + attributes.href = attributes[ 'data-cke-saved-href' ]; + if ( !this._.selectedElement ) { // Create element if current selection is collapsed. - var selection = editor.getSelection(), - ranges = selection.getRanges( true ); + var ranges = selection.getRanges( true ); if ( ranges.length == 1 && ranges[0].collapsed ) { // Short mailto link text view (#5736). @@ -1316,20 +1351,6 @@ CKEDITOR.dialog.add( 'link', function( editor ) var style = new CKEDITOR.style( { element : 'a', attributes : attributes } ); style.type = CKEDITOR.STYLE_INLINE; // need to override... dunno why. style.apply( editor.document ); - - // Id. Apply only to the first link. - if ( data.adv && data.adv.advId ) - { - var links = this.getParentEditor().document.$.getElementsByTagName( 'a' ); - for ( i = 0 ; i < links.length ; i++ ) - { - if ( links[i].href == attributes.href ) - { - links[i].id = data.adv.advId; - break; - } - } - } } else { @@ -1338,25 +1359,12 @@ CKEDITOR.dialog.add( 'link', function( editor ) href = element.data( 'cke-saved-href' ), textView = element.getHtml(); - // IE BUG: Setting the name attribute to an existing link doesn't work. - // Must re-create the link from weired syntax to workaround. - if ( CKEDITOR.env.ie && attributes.name != element.getAttribute( 'name' ) ) - { - var newElement = new CKEDITOR.dom.element( '', - editor.document ); - - selection = editor.getSelection(); - - element.moveChildren( newElement ); - element.copyAttributes( newElement, { name : 1 } ); - newElement.replace( element ); - element = newElement; - - selection.selectElement( element ); - } - element.setAttributes( attributes ); element.removeAttributes( removeAttributes ); + + if ( data.adv && data.adv.advName && CKEDITOR.plugins.link.synAnchorSelector ) + element.addClass( element.getChildCount() ? 'cke_anchor' : 'cke_anchor_empty' ); + // Update text view when user changes protocol (#4612). if ( href == textView || data.type == 'email' && textView.indexOf( '@' ) != -1 ) { @@ -1364,15 +1372,8 @@ CKEDITOR.dialog.add( 'link', function( editor ) element.setHtml( data.type == 'email' ? data.email.address : attributes[ 'data-cke-saved-href' ] ); } - // Make the element display as an anchor if a name has been set. - if ( element.getAttribute( 'name' ) ) - element.addClass( 'cke_anchor' ); - else - element.removeClass( 'cke_anchor' ); - - if ( this.fakeObj ) - editor.createFakeElement( element, 'cke_anchor', 'anchor' ).replace( this.fakeObj ); + selection.selectElement( element ); delete this._.selectedElement; } },