Ticket #4513: 4513_4.patch

File 4513_4.patch, 7.3 KB (added by Garry Yao, 9 years ago)
  • _source/plugins/link/dialogs/link.js

     
    1 /*
     1/*
    22Copyright (c) 2003-2010, CKSource - Frederico Knabben. All rights reserved.
    33For licensing, see LICENSE.html or http://ckeditor.com/license
    44*/
    55
    66CKEDITOR.dialog.add( 'link', function( editor )
    77{
     8        var plugin = CKEDITOR.plugins.link;
    89        // Handles the event when the "Target" selection box is changed.
    910        var targetChanged = function()
    1011        {
     
    9394
    9495        var parseLink = function( editor, element )
    9596        {
    96                 var href = element ? ( element.getAttribute( '_cke_saved_href' ) || element.getAttribute( 'href' ) ) : '',
     97                var href = ( element  && ( element.getAttribute( '_cke_saved_href' ) || element.getAttribute( 'href' ) ) ) || '',
    9798                        javascriptMatch,
    9899                        emailMatch,
    99100                        anchorMatch,
     
    11361137
    11371138                        var editor = this.getParentEditor(),
    11381139                                selection = editor.getSelection(),
    1139                                 ranges = selection.getRanges(),
    1140                                 element = null,
    1141                                 me = this;
    1142                         // Fill in all the relevant fields if there's already one link selected.
    1143                         if ( ranges.length == 1 )
    1144                         {
     1140                                element = null;
    11451141
    1146                                 var rangeRoot = ranges[0].getCommonAncestor( true );
    1147                                 element = rangeRoot.getAscendant( 'a', true );
    1148                                 if ( element && element.getAttribute( 'href' ) )
    1149                                 {
    1150                                         selection.selectElement( element );
    1151                                 }
    1152                                 else if ( ( element = rangeRoot.getAscendant( 'img', true ) ) &&
    1153                                                  element.getAttribute( '_cke_real_element_type' ) &&
    1154                                                  element.getAttribute( '_cke_real_element_type' ) == 'anchor' )
    1155                                 {
    1156                                         this.fakeObj = element;
    1157                                         element = editor.restoreRealElement( this.fakeObj );
    1158                                         selection.selectElement( this.fakeObj );
    1159                                 }
    1160                                 else
    1161                                         element = null;
    1162                         }
     1142                        // Fill in all the relevant fields if there's already one link selected.
     1143                        if ( ( element = plugin.getSelectedLink( editor ) ) && element.hasAttribute( 'href' ) )
     1144                                selection.selectElement( element );
     1145                        else if ( ( element = selection.getSelectedElement() ) && element.is( 'img' )
     1146                                        && element.getAttribute( '_cke_real_element_type' )
     1147                                        && element.getAttribute( '_cke_real_element_type' ) == 'anchor' )
     1148                        {
     1149                                this.fakeObj = element;
     1150                                element = editor.restoreRealElement( this.fakeObj );
     1151                                selection.selectElement( this.fakeObj );
     1152                        }
     1153                        else
     1154                                element = null;
    11631155
    11641156                        this.setupContent( parseLink.apply( this, [ editor, element ] ) );
    11651157                },
  • _source/plugins/link/plugin.js

     
    107107
    108108                                        if ( !isAnchor )
    109109                                        {
    110                                                 if ( !( element = element.getAscendant( 'a', true ) ) )
     110                                                if ( !( element = CKEDITOR.plugins.link.getSelectedLink( editor ) ) )
    111111                                                        return null;
    112112
    113113                                                isAnchor = ( element.getAttribute( 'name' ) && !element.getAttribute( 'href' ) );
     
    147147        requires : [ 'fakeobjects' ]
    148148} );
    149149
     150CKEDITOR.plugins.link =
     151{
     152        /**
     153         *  Get the surrounding link element of current selection.
     154         * @param editor
     155         * @example CKEDITOR.plugins.link.getSelectedLink( editor );
     156         * The following selection will all return the link element.   
     157         *       <pre>
     158         *  <a href="#">li^nk</a>
     159         *  <a href="#">[link]</a>
     160         *  text[<a href="#">link]</a>
     161         *  <a href="#">li[nk</a>]
     162         *  [<b><a href="#">li]nk</a></b>]
     163         *  [<a href="#"><b>li]nk</b></a>
     164         * </pre>
     165         */
     166        getSelectedLink : function( editor )
     167        {
     168                var range;
     169                try { range  = editor.getSelection().getRanges()[ 0 ]; }
     170                catch( e ) { return null; }
     171
     172                range.shrink();
     173                var root = range.getCommonAncestor();
     174                return root.getAscendant( 'a', true );
     175        }
     176
     177};
     178
    150179CKEDITOR.unlinkCommand = function(){};
    151180CKEDITOR.unlinkCommand.prototype =
    152181{
  • _source/core/dom/range.js

     
    12361236                },
    12371237
    12381238                /**
     1239                 *  Descrease the range to make sure that boundaries
     1240                 *  always anchor beside text nodes.
     1241                 */
     1242                shrink : function()
     1243                {
     1244                        // Unable to shrink a collapsed range.
     1245                        if( !this.collapsed )
     1246                        {
     1247                                var walkerRange = this.clone();
     1248
     1249                                var startContainer = this.startContainer,
     1250                                        endContainer = this.endContainer,
     1251                                        startOffset = this.startOffset,
     1252                                        endOffset = this.endOffset;
     1253
     1254                                // Whether the start/end boundary is moveable.
     1255                                var moveStart = 1,
     1256                                                moveEnd = 1;
     1257
     1258                                if ( startContainer && startContainer.type == CKEDITOR.NODE_TEXT )
     1259                                {
     1260                                        if ( !startOffset )
     1261                                                walkerRange.setStartBefore( startContainer );
     1262                                        else if ( startOffset >= startContainer.getLength() )
     1263                                                walkerRange.setStartAfter( startContainer );
     1264                                        else
     1265                                        {
     1266                                                // Enlarge the range properly to avoid walker making
     1267                                                // DOM changes caused by triming the text nodes later.
     1268                                                walkerRange.setStartBefore( startContainer );
     1269                                                moveStart = 0;
     1270                                        }
     1271                                }
     1272                               
     1273                                if ( endContainer && endContainer.type == CKEDITOR.NODE_TEXT )
     1274                                {
     1275                                        if ( !endOffset )
     1276                                                walkerRange.setEndBefore( endContainer );
     1277                                        else if ( endOffset >= endContainer.getLength() )
     1278                                                walkerRange.setEndAfter( endContainer );
     1279                                        else
     1280                                        {
     1281                                                walkerRange.setEndAfter( endContainer );
     1282                                                moveEnd = 0;
     1283                                        }
     1284                                }
     1285
     1286                                var walker = new CKEDITOR.dom.walker( walkerRange );
     1287                                walker.evaluator = function( node )
     1288                                {
     1289                                        return node.type == CKEDITOR.NODE_TEXT;
     1290                                };
     1291
     1292                                var currentElement;
     1293                                walker.guard = function( node, movingOut )
     1294                                {
     1295                                        // Stop when we've walked "through" an element.
     1296                                        if ( movingOut && node.equals( currentElement ) )
     1297                                                return false;
     1298
     1299                                        if ( !movingOut && node.type == CKEDITOR.NODE_ELEMENT )
     1300                                                currentElement = node;
     1301                                };
     1302
     1303                                if( moveStart )
     1304                                {
     1305                                        var textStart = walker.next();
     1306                                        textStart && this.setStartBefore( textStart );
     1307                                }
     1308
     1309                                if ( moveEnd )
     1310                                {
     1311                                        walker.reset();
     1312                                        var textEnd = walker.previous();
     1313                                        textEnd && this.setEndAfter( textEnd );
     1314                                }
     1315                               
     1316                                return !!( moveStart || moveEnd );
     1317                        }
     1318                },
     1319
     1320                /**
    12391321                 * Inserts a node at the start of the range. The range will be expanded
    12401322                 * the contain the node.
    12411323                 */
  • _source/core/dom/walker.js

     
    101101                                                node = null;
    102102                                }
    103103                                else
    104                                         node = ( guard ( node ) === false ) ?
     104                                        node = ( guard ( node, true ) === false ) ?
    105105                                                null : node.getPreviousSourceNode( true, type, guard );
    106106                        }
    107107                        else
     
    115115                                                node = null;
    116116                                }
    117117                                else
    118                                         node = ( guard ( range.startContainer ) === false ) ?
     118                                        node = ( guard ( range.startContainer, true ) === false ) ?
    119119                                                null : range.startContainer.getNextSourceNode( true, type, guard ) ;
    120120                        }
    121121                }
© 2003 – 2019 CKSource – Frederico Knabben. All rights reserved. | Terms of use | Privacy policy