| | 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 | } |