瀏覽代碼

More tests to ImageCaptioningEngine.

Szymon Kupś 8 年之前
父節點
當前提交
55b323818e

+ 0 - 40
packages/ckeditor5-image/src/imagecaptioning/converters.js

@@ -1,40 +0,0 @@
-/**
- * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved.
- * For licensing, see LICENSE.md.
- */
-
-/**
- * @module image/imagecaptioning/converters
- */
-
-import { isImage } from '../utils';
-import ViewPosition from '@ckeditor/ckeditor5-engine/src/view/position';
-import ViewElement from '@ckeditor/ckeditor5-engine/src/view/element';
-import viewWriter from '@ckeditor/ckeditor5-engine/src/view/writer';
-
-/**
- * Creates a converter that converts image caption model element to view element.
- *
- * @param {Function|module:engine/view/element~Element} elementCreator
- * @return {Function}
- */
-export function captionModelToView( elementCreator ) {
-	return ( evt, data, consumable, conversionApi ) => {
-		const captionElement = data.item;
-
-		if ( isImage( captionElement.parent ) && ( captionElement.childCount > 0 ) ) {
-			if ( !consumable.consume( data.item, 'insert' ) ) {
-				return;
-			}
-
-			const imageFigure = conversionApi.mapper.toViewElement( data.range.start.parent );
-			const viewElement = ( elementCreator instanceof ViewElement ) ?
-				elementCreator.clone( true ) :
-				elementCreator( data, consumable, conversionApi );
-
-			const viewPosition = ViewPosition.createAt( imageFigure, 'end' );
-			conversionApi.mapper.bindElements( data.item, viewElement );
-			viewWriter.insert( viewPosition, viewElement );
-		}
-	};
-}

+ 27 - 1
packages/ckeditor5-image/src/imagecaptioning/imagecaptioningengine.js

@@ -11,6 +11,7 @@ import Plugin from '@ckeditor/ckeditor5-core/src/plugin';
 import ModelTreeWalker from '@ckeditor/ckeditor5-engine/src/model/treewalker';
 import ModelElement from '@ckeditor/ckeditor5-engine/src/model/element';
 import ViewContainerElement from '@ckeditor/ckeditor5-engine/src/view/containerelement';
+import ViewElement from '@ckeditor/ckeditor5-engine/src/view/element';
 import ViewPosition from '@ckeditor/ckeditor5-engine/src/view/position';
 import ViewRange from '@ckeditor/ckeditor5-engine/src/view/range';
 import viewWriter from '@ckeditor/ckeditor5-engine/src/view/writer';
@@ -18,7 +19,6 @@ import ModelPosition from '@ckeditor/ckeditor5-engine/src/model/position';
 import buildViewConverter from '@ckeditor/ckeditor5-engine/src/conversion/buildviewconverter';
 import ViewMatcher from '@ckeditor/ckeditor5-engine/src/view/matcher';
 import { isImage, isImageWidget } from '../utils';
-import { captionModelToView } from './converters';
 import { captionEditableCreator, isCaptionEditable, getCaptionFromImage } from './utils';
 
 export default class ImageCaptioningEngine extends Plugin {
@@ -184,3 +184,29 @@ function insertCaptionElement( evt, changeType, data, batch ) {
 		}
 	}
 }
+
+// Creates a converter that converts image caption model element to view element.
+//
+// @private
+// @param {Function|module:engine/view/element~Element} elementCreator
+// @return {Function}
+function captionModelToView( elementCreator ) {
+	return ( evt, data, consumable, conversionApi ) => {
+		const captionElement = data.item;
+
+		if ( isImage( captionElement.parent ) && ( captionElement.childCount > 0 ) ) {
+			if ( !consumable.consume( data.item, 'insert' ) ) {
+				return;
+			}
+
+			const imageFigure = conversionApi.mapper.toViewElement( data.range.start.parent );
+			const viewElement = ( elementCreator instanceof ViewElement ) ?
+				elementCreator.clone( true ) :
+				elementCreator( data, consumable, conversionApi );
+
+			const viewPosition = ViewPosition.createAt( imageFigure, 'end' );
+			conversionApi.mapper.bindElements( data.item, viewElement );
+			viewWriter.insert( viewPosition, viewElement );
+		}
+	};
+}

+ 26 - 0
packages/ckeditor5-image/tests/imagecaptioning/imagecaptioningengine.js

@@ -4,6 +4,9 @@
  */
 
 import VirtualTestEditor from '@ckeditor/ckeditor5-core/tests/_utils/virtualtesteditor';
+import ViewAttributeElement from '@ckeditor/ckeditor5-engine/src/view/attributeelement';
+import ViewPosition from '@ckeditor/ckeditor5-engine/src/view/position';
+import viewWriter from '@ckeditor/ckeditor5-engine/src/view/writer';
 import ModelElement from '@ckeditor/ckeditor5-engine/src/model/element';
 import ModelRange from '@ckeditor/ckeditor5-engine/src/model/range';
 import ModelPosition from '@ckeditor/ckeditor5-engine/src/model/position';
@@ -113,6 +116,29 @@ describe( 'ImageCaptioningEngine', () => {
 				setModelData( document, '<widget>foo bar<caption></caption></widget>' );
 				expect( getViewData( viewDocument, { withoutSelection: true } ) ).to.equal( '<widget>foo bar</widget>' );
 			} );
+
+			it( 'should not convert when element is already consumed', () => {
+				editor.editing.modelToView.on(
+					'insert:caption',
+					( evt, data, consumable, conversionApi ) => {
+						consumable.consume( data.item, 'insert' );
+
+						const imageFigure = conversionApi.mapper.toViewElement( data.range.start.parent );
+						const viewElement = new ViewAttributeElement( 'span' );
+
+						const viewPosition = ViewPosition.createAt( imageFigure, 'end' );
+						conversionApi.mapper.bindElements( data.item, viewElement );
+						viewWriter.insert( viewPosition, viewElement );
+					},
+					{ priority: 'high' }
+				);
+
+				setModelData( document, '<image src="img.png"><caption>Foo bar baz.</caption></image>' );
+
+				expect( getViewData( viewDocument, { withoutSelection: true } ) ).to.equal(
+					'<figure class="image ck-widget" contenteditable="false"><img src="img.png"></img><span></span>Foo bar baz.</figure>'
+				);
+			} );
 		} );
 	} );