|
150 | 150 | data: function() {
|
151 | 151 | var widget = this,
|
152 | 152 | editor = widget.editor,
|
| 153 | + doc = editor.document, |
| 154 | + editable = editor.editable(), |
153 | 155 | oldState = widget.oldData,
|
154 | 156 | newState = widget.data;
|
155 | 157 |
|
|
181 | 183 | if ( this.destroyed ) {
|
182 | 184 | widget = editor.widgets.initOn( element, 'image2', widget.data );
|
183 | 185 |
|
| 186 | + // Once widget was re-created, it may become an inline element without |
| 187 | + // block wrapper (i.e. when unaligned, end not captioned). Let's do some |
| 188 | + // sort of autoparagraphing here (#10853). |
| 189 | + if ( widget.inline && !( new CKEDITOR.dom.elementPath( widget.wrapper, editable ).block ) ) { |
| 190 | + var block = doc.createElement( editor.activeEnterMode == CKEDITOR.ENTER_P ? 'p' : 'div' ); |
| 191 | + block.replace( widget.wrapper ); |
| 192 | + widget.wrapper.move( block ); |
| 193 | + } |
| 194 | + |
184 | 195 | // The focus must be transferred from the old one (destroyed)
|
185 | 196 | // to the new one (just created).
|
186 | 197 | if ( this.focused ) {
|
|
195 | 206 | // According to the new state.
|
196 | 207 | else
|
197 | 208 | setWrapperAlign( widget );
|
| 209 | + |
198 | 210 | }
|
199 | 211 | } );
|
200 | 212 |
|
|
266 | 278 | CKEDITOR.plugins.image2 = {
|
267 | 279 | stateShifter: function( editor ) {
|
268 | 280 | // Tag name used for centering non-captioned widgets.
|
269 |
| - var centerElement = editor.config.enterMode == CKEDITOR.ENTER_P ? 'p' : 'div', |
270 |
| - |
271 |
| - doc = editor.document, |
| 281 | + var doc = editor.document, |
272 | 282 | editable = editor.editable(),
|
273 | 283 |
|
274 | 284 | // The order that stateActions get executed. It matters!
|
|
287 | 297 | // Changed to "center" (non-captioned).
|
288 | 298 | if ( newValue == 'center' ) {
|
289 | 299 | data.destroy();
|
290 |
| - data.element = wrapInCentering( element ); |
| 300 | + data.element = wrapInCentering( editor, element ); |
291 | 301 | }
|
292 | 302 |
|
293 | 303 | // Changed to "non-center" from "center" while caption removed.
|
|
301 | 311 | // Alignment remains and "center" removed caption.
|
302 | 312 | else if ( newValue == 'center' && changed( data, 'hasCaption' ) && !hasCaptionAfter ) {
|
303 | 313 | data.destroy();
|
304 |
| - data.element = wrapInCentering( element ); |
| 314 | + data.element = wrapInCentering( editor, element ); |
305 | 315 | }
|
306 | 316 |
|
307 | 317 | // Finally set display for figure.
|
|
369 | 379 | return data.oldState[ name ] !== data.newState[ name ];
|
370 | 380 | }
|
371 | 381 |
|
372 |
| - function wrapInCentering( element ) { |
| 382 | + function wrapInCentering( editor, element ) { |
373 | 383 | // When widget gets centered. Wrapper must be created.
|
374 | 384 | // Create new <p|div> with text-align:center.
|
375 |
| - var center = doc.createElement( centerElement, { |
| 385 | + var center = doc.createElement( editor.activeEnterMode == CKEDITOR.ENTER_P ? 'p' : 'div', { |
376 | 386 | styles: { 'text-align': 'center' }
|
377 | 387 | } );
|
378 | 388 |
|
|
395 | 405 | if ( replaced.getParent() ) {
|
396 | 406 | var range = editor.createRange();
|
397 | 407 |
|
398 |
| - // Move the range before old element and insert element into it. |
399 | 408 | range.moveToPosition( replaced, CKEDITOR.POSITION_BEFORE_START );
|
400 |
| - editable.insertElementIntoRange( replacing, range ); |
401 | 409 |
|
402 |
| - // Remove old element. |
| 410 | + // Remove old element. Do it before insertion to avoid a case when |
| 411 | + // element is moved from 'replaced' element before it, what creates |
| 412 | + // a tricky case which insertElementIntorRange does not handle. |
403 | 413 | replaced.remove();
|
| 414 | + |
| 415 | + editable.insertElementIntoRange( replacing, range ); |
404 | 416 | }
|
405 | 417 | else
|
406 | 418 | replacing.replace( replaced );
|
|
0 commit comments