\r
init : function( editor )\r
{\r
- var specialKeys = editor.specialKeys;\r
- specialKeys[ 13 ] = enter;\r
- specialKeys[ CKEDITOR.SHIFT + 13 ] = shiftEnter;\r
+ editor.addCommand( 'enter', {\r
+ modes : { wysiwyg:1 },\r
+ editorFocus : false,\r
+ exec : function( editor ){ enter( editor ); }\r
+ });\r
+\r
+ editor.addCommand( 'shiftEnter', {\r
+ modes : { wysiwyg:1 },\r
+ editorFocus : false,\r
+ exec : function( editor ){ shiftEnter( editor ); }\r
+ });\r
+\r
+ var keystrokes = editor.keystrokeHandler.keystrokes;\r
+ keystrokes[ 13 ] = 'enter';\r
+ keystrokes[ CKEDITOR.SHIFT + 13 ] = 'shiftEnter';\r
}\r
});\r
\r
\r
var doc = range.document;\r
\r
- // Exit the list when we're inside an empty list item block. (#5376)\r
- if ( range.checkStartOfBlock() && range.checkEndOfBlock() )\r
- {\r
- var path = new CKEDITOR.dom.elementPath( range.startContainer ),\r
- block = path.block;\r
+ var atBlockStart = range.checkStartOfBlock(),\r
+ atBlockEnd = range.checkEndOfBlock(),\r
+ path = new CKEDITOR.dom.elementPath( range.startContainer ),\r
+ block = path.block;\r
\r
+ if ( atBlockStart && atBlockEnd )\r
+ {\r
+ // Exit the list when we're inside an empty list item block. (#5376)\r
if ( block && ( block.is( 'li' ) || block.getParent().is( 'li' ) ) )\r
{\r
editor.execCommand( 'outdent' );\r
return;\r
}\r
+\r
+ if ( block && block.getParent().is( 'blockquote' ) )\r
+ {\r
+ block.breakParent( block.getParent() );\r
+\r
+ // If we were at the start of <blockquote>, there will be an empty element before it now.\r
+ if ( !block.getPrevious().getFirst( CKEDITOR.dom.walker.invisible(1) ) )\r
+ block.getPrevious().remove();\r
+\r
+ // If we were at the end of <blockquote>, there will be an empty element after it now.\r
+ if ( !block.getNext().getFirst( CKEDITOR.dom.walker.invisible(1) ) )\r
+ block.getNext().remove();\r
+\r
+ range.moveToElementEditStart( block );\r
+ range.select();\r
+ return;\r
+ }\r
+ }\r
+ // Don't split <pre> if we're in the middle of it, act as shift enter key.\r
+ else if ( block && block.is( 'pre' ) )\r
+ {\r
+ if ( !atBlockEnd )\r
+ {\r
+ enterBr( editor, mode, range, forceMode );\r
+ return;\r
+ }\r
+ }\r
+ // Don't split caption blocks. (#7944)\r
+ else if ( block && CKEDITOR.dtd.$captionBlock[ block.getName() ] )\r
+ {\r
+ enterBr( editor, mode, range, forceMode );\r
+ return;\r
}\r
\r
// Determine the block element to be used.\r
// Do not enter this block if it's a header tag, or we are in\r
// a Shift+Enter (#77). Create a new block element instead\r
// (later in the code).\r
- if ( previousBlock.is( 'li' ) || !headerTagRegex.test( previousBlock.getName() ) )\r
+ if ( previousBlock.is( 'li' ) ||\r
+ ! ( headerTagRegex.test( previousBlock.getName() ) || previousBlock.is( 'pre' ) ) )\r
{\r
// Otherwise, duplicate the previous block.\r
newBlock = previousBlock.clone();\r
- // Value attribute of list item should not be duplicated (#7330).\r
- newBlock.is( 'li' ) && newBlock.removeAttribute( 'value' );\r
}\r
}\r
else if ( nextBlock )\r
if ( !newBlock.getParent() )\r
range.insertNode( newBlock );\r
\r
+ // list item start number should not be duplicated (#7330), but we need\r
+ // to remove the attribute after it's onto the DOM tree because of old IEs (#7581).\r
+ newBlock.is( 'li' ) && newBlock.removeAttribute( 'value' );\r
+\r
// This is tricky, but to make the new block visible correctly\r
// we must select it.\r
// The previousBlock check has been included because it may be\r
// On SHIFT+ENTER:\r
// 1. We want to enforce the mode to be respected, instead\r
// of cloning the current block. (#77)\r
- // 2. Always perform a block break when inside <pre> (#5402).\r
- if ( editor.getSelection().getStartElement().hasAscendant( 'pre', true ) )\r
- {\r
- setTimeout( function() { enterBlock( editor, editor.config.enterMode, null, true ); }, 0 );\r
- return true;\r
- }\r
- else\r
- return enter( editor, editor.config.shiftEnterMode, 1 );\r
+ return enter( editor, editor.config.shiftEnterMode, 1 );\r
}\r
\r
function enter( editor, mode, forceMode )\r
setTimeout( function()\r
{\r
editor.fire( 'saveSnapshot' ); // Save undo step.\r
- if ( mode == CKEDITOR.ENTER_BR || editor.getSelection().getStartElement().hasAscendant( 'pre', 1 ) )\r
+\r
+ if ( mode == CKEDITOR.ENTER_BR )\r
enterBr( editor, mode, null, forceMode );\r
else\r
enterBlock( editor, mode, null, forceMode );\r
\r
+ editor.fire( 'saveSnapshot' );\r
+\r
}, 0 );\r
\r
return true;\r