| 117 | |
| 118 | /** |
| 119 | * Auto-fixing block-less content by wrapping paragraph, prevent |
| 120 | * non-exitable-block by padding extra nodes. |
| 121 | */ |
| 122 | function onSelectionChangeFixBody( evt ) |
| 123 | { |
| 124 | var editor = evt.editor, |
| 125 | path = evt.data.path, |
| 126 | blockLimit = path.blockLimit, |
| 127 | selection = evt.data.selection, |
| 128 | bms = selection.createBookmarks(), |
| 129 | ranges = selection.getRanges(), |
| 130 | range = ranges[ 0 ], |
| 131 | body = editor.document.getBody(), |
| 132 | enterMode = editor.config.enterMode; |
| 133 | |
| 134 | // When enterMode set to block, we'll establing new paragraph if the |
| 135 | // current range is block-less within body. |
| 136 | if ( enterMode != CKEDITOR.ENTER_BR |
| 137 | && blockLimit.getName() == 'body' |
| 138 | && !path.block ) |
| 139 | { |
| 140 | var fixedBlock = range.fixBlock( true, |
| 141 | editor.config.enterMode == CKEDITOR.ENTER_DIV ? 'div' : 'p' ); |
| 142 | |
| 143 | // For IE, if there's only a padding br inside, we'll drop it since now |
| 144 | // we have a block. |
| 145 | if ( CKEDITOR.env.ie && !CKEDITOR.tools.trim( fixedBlock.getText() ) ) |
| 146 | { |
| 147 | var children = fixedBlock.getChildren(), child; |
| 148 | for ( var i = 0 ; i < children.count() ; i++ ) { |
| 149 | if ( ( child = children.getItem( i ) ) && child.is && child.is( 'br' ) ) |
| 150 | child.remove(); |
| 151 | } |
| 152 | } |
| 153 | } |
| 154 | |
| 155 | // Fixing non-exitable blocks when selection inside. |
| 156 | if ( path.elements ) |
| 157 | { |
| 158 | var blockToFix, |
| 159 | blockNext, // The block following 'blockToFix'. |
| 160 | unexitableBlock = CKEDITOR.tools.clone( CKEDITOR.dtd.$block ); |
| 161 | |
| 162 | // Exlude block tag already defined by enterMode, since 'enterkey' behavior |
| 163 | // will help to exit. |
| 164 | if ( enterMode != CKEDITOR.ENTER_BR ) |
| 165 | delete unexitableBlock[ enterMode == CKEDITOR.ENTER_P ? 'p' : 'div' ]; |
| 166 | |
| 167 | // Find the target block on the path. |
| 168 | var elements = path.elements, |
| 169 | l = elements.length, |
| 170 | element; |
| 171 | for ( var i = 0; i < l ; i++) { |
| 172 | element = elements[ i ]; |
| 173 | if ( element.getName && ( element.getName() in unexitableBlock ) ) |
| 174 | { |
| 175 | blockToFix = element; |
| 176 | break; |
| 177 | } |
| 178 | } |
| 179 | |
| 180 | // Inserting the padding-block-node if it's followed by another |
| 181 | // non-exitable-block OR it reachs document end. |
| 182 | if ( blockToFix && |
| 183 | typeof ( blockNext = blockToFix.getNext( CKEDITOR.env.ie? false : true ) ) != 'undefined' |
| 184 | && ( !blockNext ||( blockNext.getName && blockNext.getName() in unexitableBlock ) ) ) |
| 185 | { |
| 186 | var paddingBlock = editor.document.createElement( 'br' ); |
| 187 | paddingBlock.insertAfter( blockToFix ); |
| 188 | } |
| 189 | } |
| 190 | |
| 191 | selection.selectBookmarks( bms ); |
| 192 | } |