JasonWoof Got questions, comments, patches, etc.? Contact Jason Woofenden
vanilla ckeditor-3.6.1
[ckeditor.git] / _source / plugins / enterkey / plugin.js
index 1a79c51..59a4f82 100644 (file)
@@ -11,9 +11,21 @@ For licensing, see LICENSE.html or http://ckeditor.com/license
 \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
@@ -31,18 +43,35 @@ For licensing, see LICENSE.html or http://ckeditor.com/license
 \r
                        var doc = range.document;\r
 \r
+                       var atBlockStart = range.checkStartOfBlock(),\r
+                               atBlockEnd = range.checkEndOfBlock(),\r
+                               path = new CKEDITOR.dom.elementPath( range.startContainer ),\r
+                               block = path.block;\r
+\r
                        // Exit the list when we're inside an empty list item block. (#5376)\r
-                       if ( range.checkStartOfBlock() && range.checkEndOfBlock() )\r
+                       if ( atBlockStart && atBlockEnd )\r
                        {\r
-                               var path = new CKEDITOR.dom.elementPath( range.startContainer ),\r
-                                               block = path.block;\r
-\r
                                if ( block && ( block.is( 'li' ) || block.getParent().is( 'li' ) ) )\r
                                {\r
                                        editor.execCommand( 'outdent' );\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
                        var blockTag = ( mode == CKEDITOR.ENTER_DIV ? 'div' : 'p' );\r
@@ -107,12 +136,11 @@ For licensing, see LICENSE.html or http://ckeditor.com/license
                                        // 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
@@ -162,6 +190,10 @@ For licensing, see LICENSE.html or http://ckeditor.com/license
                                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
@@ -336,14 +368,7 @@ For licensing, see LICENSE.html or http://ckeditor.com/license
                // 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
@@ -361,7 +386,7 @@ For licensing, see LICENSE.html or http://ckeditor.com/license
                setTimeout( function()\r
                        {\r
                                editor.fire( 'saveSnapshot' );  // Save undo step.\r
-                               if ( mode == CKEDITOR.ENTER_BR || editor.getSelection().getStartElement().hasAscendant( 'pre', 1 ) )\r
+                               if ( mode == CKEDITOR.ENTER_BR )\r
                                        enterBr( editor, mode, null, forceMode );\r
                                else\r
                                        enterBlock( editor, mode, null, forceMode );\r