X-Git-Url: https://jasonwoof.com/gitweb/?a=blobdiff_plain;f=_source%2Fplugins%2Fenterkey%2Fplugin.js;h=1a79c516db4e03c42ebe6dc82043f032638899cd;hb=refs%2Ftags%2Fv3.5.3;hp=10b7e621004e3056502b2c8e43d1ff4792272bf6;hpb=8665a7c6c60586526e32e8941fe2896739b6ebfb;p=ckeditor.git diff --git a/_source/plugins/enterkey/plugin.js b/_source/plugins/enterkey/plugin.js index 10b7e62..1a79c51 100644 --- a/_source/plugins/enterkey/plugin.js +++ b/_source/plugins/enterkey/plugin.js @@ -1,5 +1,5 @@ /* -Copyright (c) 2003-2010, CKSource - Frederico Knabben. All rights reserved. +Copyright (c) 2003-2011, CKSource - Frederico Knabben. All rights reserved. For licensing, see LICENSE.html or http://ckeditor.com/license */ @@ -24,6 +24,11 @@ For licensing, see LICENSE.html or http://ckeditor.com/license // Get the range for the current selection. range = range || getRange( editor ); + // We may not have valid ranges to work on, like when inside a + // contenteditable=false element. + if ( !range ) + return; + var doc = range.document; // Exit the list when we're inside an empty list item block. (#5376) @@ -64,13 +69,14 @@ For licensing, see LICENSE.html or http://ckeditor.com/license if ( node.is( 'li' ) ) { nextBlock.breakParent( node ); - nextBlock.move( nextBlock.getNext(), true ); + nextBlock.move( nextBlock.getNext(), 1 ); } } else if ( previousBlock && ( node = previousBlock.getParent() ) && node.is( 'li' ) ) { previousBlock.breakParent( node ); - range.moveToElementEditStart( previousBlock.getNext() ); + node = previousBlock.getNext(); + range.moveToElementEditStart( node ); previousBlock.move( previousBlock.getPrevious() ); } @@ -93,7 +99,8 @@ For licensing, see LICENSE.html or http://ckeditor.com/license } else { - var newBlock; + var newBlock, + newBlockDir; if ( previousBlock ) { @@ -104,13 +111,25 @@ For licensing, see LICENSE.html or http://ckeditor.com/license { // Otherwise, duplicate the previous block. newBlock = previousBlock.clone(); + // Value attribute of list item should not be duplicated (#7330). + newBlock.is( 'li' ) && newBlock.removeAttribute( 'value' ); } } else if ( nextBlock ) newBlock = nextBlock.clone(); if ( !newBlock ) - newBlock = doc.createElement( blockTag ); + { + // We have already created a new list item. (#6849) + if ( node && node.is( 'li' ) ) + newBlock = node; + else + { + newBlock = doc.createElement( blockTag ); + if ( previousBlock && ( newBlockDir = previousBlock.getDirection() ) ) + newBlock.setAttribute( 'dir', newBlockDir ); + } + } // Force the enter block unless we're talking of a list item. else if ( forceMode && !newBlock.is( 'li' ) ) newBlock.renameNode( blockTag ); @@ -140,7 +159,8 @@ For licensing, see LICENSE.html or http://ckeditor.com/license if ( !CKEDITOR.env.ie ) newBlock.appendBogus(); - range.insertNode( newBlock ); + if ( !newBlock.getParent() ) + range.insertNode( newBlock ); // This is tricky, but to make the new block visible correctly // we must select it. @@ -189,6 +209,11 @@ For licensing, see LICENSE.html or http://ckeditor.com/license // Get the range for the current selection. range = range || getRange( editor ); + // We may not have valid ranges to work on, like when inside a + // contenteditable=false element. + if ( !range ) + return; + var doc = range.document; // Determine the block element to be used. @@ -212,15 +237,28 @@ For licensing, see LICENSE.html or http://ckeditor.com/license // If we are at the end of a header block. if ( !forceMode && isEndOfBlock && headerTagRegex.test( startBlockTag ) ) { - // Insert a
after the current paragraph. - doc.createElement( 'br' ).insertAfter( startBlock ); + var newBlock, + newBlockDir; - // A text node is required by Gecko only to make the cursor blink. - if ( CKEDITOR.env.gecko ) - doc.createText( '' ).insertAfter( startBlock ); + if ( ( newBlockDir = startBlock.getDirection() ) ) + { + newBlock = doc.createElement( 'div' ); + newBlock.setAttribute( 'dir', newBlockDir ); + newBlock.insertAfter( startBlock ); + range.setStart( newBlock, 0 ); + } + else + { + // Insert a
after the current paragraph. + doc.createElement( 'br' ).insertAfter( startBlock ); + + // A text node is required by Gecko only to make the cursor blink. + if ( CKEDITOR.env.gecko ) + doc.createText( '' ).insertAfter( startBlock ); - // IE has different behaviors regarding position. - range.setStartAt( startBlock.getNext(), CKEDITOR.env.ie ? CKEDITOR.POSITION_BEFORE_START : CKEDITOR.POSITION_AFTER_START ); + // IE has different behaviors regarding position. + range.setStartAt( startBlock.getNext(), CKEDITOR.env.ie ? CKEDITOR.POSITION_BEFORE_START : CKEDITOR.POSITION_AFTER_START ); + } } else { @@ -237,29 +275,27 @@ For licensing, see LICENSE.html or http://ckeditor.com/license range.deleteContents(); range.insertNode( lineBreak ); - // A text node is required by Gecko only to make the cursor blink. - // We need some text inside of it, so the bogus
is properly - // created. - if ( !CKEDITOR.env.ie ) - doc.createText( '\ufeff' ).insertAfter( lineBreak ); - - // If we are at the end of a block, we must be sure the bogus node is available in that block. - if ( isEndOfBlock && !CKEDITOR.env.ie ) - lineBreak.getParent().appendBogus(); - - // Now we can remove the text node contents, so the caret doesn't - // stop on it. - if ( !CKEDITOR.env.ie ) - lineBreak.getNext().$.nodeValue = ''; // IE has different behavior regarding position. if ( CKEDITOR.env.ie ) range.setStartAt( lineBreak, CKEDITOR.POSITION_AFTER_END ); else + { + // A text node is required by Gecko only to make the cursor blink. + // We need some text inside of it, so the bogus
is properly + // created. + doc.createText( '\ufeff' ).insertAfter( lineBreak ); + + // If we are at the end of a block, we must be sure the bogus node is available in that block. + if ( isEndOfBlock ) + lineBreak.getParent().appendBogus(); + + // Now we can remove the text node contents, so the caret doesn't + // stop on it. + lineBreak.getNext().$.nodeValue = ''; + range.setStartAt( lineBreak.getNext(), CKEDITOR.POSITION_AFTER_START ); - // Scroll into view, for non IE. - if ( !CKEDITOR.env.ie ) - { + // Scroll into view, for non IE. var dummy = null; // BR is not positioned in Opera and Webkit. @@ -307,7 +343,7 @@ For licensing, see LICENSE.html or http://ckeditor.com/license return true; } else - return enter( editor, editor.config.shiftEnterMode, true ); + return enter( editor, editor.config.shiftEnterMode, 1 ); } function enter( editor, mode, forceMode ) @@ -325,7 +361,7 @@ For licensing, see LICENSE.html or http://ckeditor.com/license setTimeout( function() { editor.fire( 'saveSnapshot' ); // Save undo step. - if ( mode == CKEDITOR.ENTER_BR || editor.getSelection().getStartElement().hasAscendant( 'pre', true ) ) + if ( mode == CKEDITOR.ENTER_BR || editor.getSelection().getStartElement().hasAscendant( 'pre', 1 ) ) enterBr( editor, mode, null, forceMode ); else enterBlock( editor, mode, null, forceMode ); @@ -335,11 +371,10 @@ For licensing, see LICENSE.html or http://ckeditor.com/license return true; } - function getRange( editor ) { // Get the selection ranges. - var ranges = editor.getSelection().getRanges(); + var ranges = editor.getSelection().getRanges( true ); // Delete the contents of all ranges except the first one. for ( var i = ranges.length - 1 ; i > 0 ; i-- )