8
0
Просмотр исходного кода

Further refactor the _insertMissingModelCaptionElement() method.

Maciej Gołaszewski 7 лет назад
Родитель
Сommit
fa12400145
1 измененных файлов с 15 добавлено и 20 удалено
  1. 15 20
      packages/ckeditor5-image/src/imagecaption/imagecaptionediting.js

+ 15 - 20
packages/ckeditor5-image/src/imagecaption/imagecaptionediting.js

@@ -9,11 +9,7 @@
 
 
 import Plugin from '@ckeditor/ckeditor5-core/src/plugin';
 import Plugin from '@ckeditor/ckeditor5-core/src/plugin';
 import { isImage } from '../image/utils';
 import { isImage } from '../image/utils';
-import {
-	captionElementCreator,
-	getCaptionFromImage,
-	matchImageCaption
-} from './utils';
+import { captionElementCreator, getCaptionFromImage, matchImageCaption } from './utils';
 
 
 /**
 /**
  * The image caption engine plugin.
  * The image caption engine plugin.
@@ -182,40 +178,39 @@ export default class ImageCaptionEditing extends Plugin {
 		const model = this.editor.model;
 		const model = this.editor.model;
 		const changes = model.document.differ.getChanges();
 		const changes = model.document.differ.getChanges();
 
 
-		let wasFixed = false;
+		const imagesWithoutCaption = [];
 
 
 		for ( const entry of changes ) {
 		for ( const entry of changes ) {
-			const images = [];
-
 			if ( entry.type == 'insert' && entry.name != '$text' ) {
 			if ( entry.type == 'insert' && entry.name != '$text' ) {
 				const item = entry.position.nodeAfter;
 				const item = entry.position.nodeAfter;
 
 
-				if ( item.is( 'image' ) ) {
-					images.push( item );
-				} else if ( item.childCount ) {
+				if ( item.is( 'image' ) && !getCaptionFromImage( item ) ) {
+					imagesWithoutCaption.push( item );
+				}
+
+				// Check elements with children for nested images.
+				if ( !item.is( 'image' ) && item.childCount ) {
+					// Use the walker to find all nested images despite of their nest level.
 					const walker = model.createRangeOn( item ).getWalker();
 					const walker = model.createRangeOn( item ).getWalker();
 
 
 					for ( const walkerValue of walker ) {
 					for ( const walkerValue of walker ) {
 						if ( walkerValue.type === 'elementStart' ) {
 						if ( walkerValue.type === 'elementStart' ) {
 							const walkerItem = walkerValue.item;
 							const walkerItem = walkerValue.item;
 
 
-							if ( walkerItem.is( 'image' ) ) {
-								images.push( walkerItem );
+							if ( walkerItem.is( 'image' ) && !getCaptionFromImage( walkerItem ) ) {
+								imagesWithoutCaption.push( walkerItem );
 							}
 							}
 						}
 						}
 					}
 					}
 				}
 				}
 			}
 			}
+		}
 
 
-			for ( const image of images.filter( image => !getCaptionFromImage( image ) ) ) {
-				writer.appendElement( 'caption', image );
-			}
-
-			// TODO: infinite loop :/
-			wasFixed = false;
+		for ( const image of imagesWithoutCaption ) {
+			writer.appendElement( 'caption', image );
 		}
 		}
 
 
-		return wasFixed;
+		return !!imagesWithoutCaption.length;
 	}
 	}
 }
 }