Procházet zdrojové kódy

Changes to conversion after view refactoring.

Szymon Kupś před 8 roky
rodič
revize
2a2aa74c01

+ 15 - 6
packages/ckeditor5-image/src/image/imageengine.js

@@ -20,8 +20,7 @@ import { toImageWidget } from './utils';
 import { downcastElementToElement } from '@ckeditor/ckeditor5-engine/src/conversion/downcast-converters';
 import { upcastElementToElement, upcastAttributeToAttribute } from '@ckeditor/ckeditor5-engine/src/conversion/upcast-converters';
 
-import ViewContainerElement from '@ckeditor/ckeditor5-engine/src/view/containerelement';
-import ViewEmptyElement from '@ckeditor/ckeditor5-engine/src/view/emptyelement';
+import ViewPosition from '@ckeditor/ckeditor5-engine/src/view/position';
 
 /**
  * The image engine plugin.
@@ -48,14 +47,18 @@ export default class ImageEngine extends Plugin {
 			allowAttributes: [ 'alt', 'src', 'srcset' ]
 		} );
 
+		const dataElementCreator = ( item, consumable, api ) => createImageViewElement( api.writer );
 		editor.conversion.for( 'dataDowncast' ).add( downcastElementToElement( {
 			model: 'image',
-			view: () => createImageViewElement()
+			view: dataElementCreator
 		} ) );
 
+		const editingElementCreator = ( item, consumable, api ) =>
+			toImageWidget( createImageViewElement( api.writer ), t( 'image widget' ) );
+
 		editor.conversion.for( 'editingDowncast' ).add( downcastElementToElement( {
 			model: 'image',
-			view: () => toImageWidget( createImageViewElement(), t( 'image widget' ) )
+			view: editingElementCreator
 		} ) );
 
 		conversion.for( 'downcast' )
@@ -111,7 +114,13 @@ export default class ImageEngine extends Plugin {
 // Note that `alt` and `src` attributes are converted separately, so they are not included.
 //
 // @private
+// @param {module:engine/view/writer~Writer} writer
 // @return {module:engine/view/containerelement~ContainerElement}
-export function createImageViewElement() {
-	return new ViewContainerElement( 'figure', { class: 'image' }, new ViewEmptyElement( 'img' ) );
+export function createImageViewElement( writer ) {
+	const emptyElement = writer.createEmptyElement( 'img' );
+	const figure = writer.createContainerElement( 'figure', { class: 'image' } );
+
+	writer.insert( ViewPosition.createAt( figure ), emptyElement );
+
+	return figure;
 }

+ 6 - 16
packages/ckeditor5-image/src/imagecaption/imagecaptionengine.js

@@ -8,8 +8,6 @@
  */
 
 import Plugin from '@ckeditor/ckeditor5-core/src/plugin';
-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 { upcastElementToElement } from '@ckeditor/ckeditor5-engine/src/conversion/upcast-converters';
 import { isImage } from '../image/utils';
@@ -47,14 +45,6 @@ export default class ImageCaptionEngine extends Plugin {
 		 * @member {module:engine/view/editableelement~EditableElement} #_lastSelectedCaption
 		 */
 
-		/**
-		 * A function used to create the editable caption element in the editing view.
-		 *
-		 * @private
-		 * @member {Function}
-		 */
-		this._createCaption = captionElementCreator( view, t( 'Enter image caption' ) );
-
 		// Schema configuration.
 		schema.register( 'caption', {
 			allowIn: 'image',
@@ -72,10 +62,12 @@ export default class ImageCaptionEngine extends Plugin {
 		} ) );
 
 		// Model to view converter for the data pipeline.
-		data.downcastDispatcher.on( 'insert:caption', captionModelToView( new ViewContainerElement( 'figcaption' ), false ) );
+		const createCaptionForData = writer => writer.createContainerElement( 'figcaption' );
+		data.downcastDispatcher.on( 'insert:caption', captionModelToView( createCaptionForData, false ) );
 
 		// Model to view converter for the editing pipeline.
-		editing.downcastDispatcher.on( 'insert:caption', captionModelToView( this._createCaption ) );
+		const createCaptionForEditing = captionElementCreator( view, t( 'Enter image caption' ) );
+		editing.downcastDispatcher.on( 'insert:caption', captionModelToView( createCaptionForEditing ) );
 
 		// Always show caption in view when something is inserted in model.
 		editing.downcastDispatcher.on( 'insert', ( evt, data ) => this._fixCaptionVisibility( data.item ), { priority: 'high' } );
@@ -182,7 +174,7 @@ export default class ImageCaptionEngine extends Plugin {
 // Creates a converter that converts image caption model element to view element.
 //
 // @private
-// @param {Function|module:engine/view/element~Element} elementCreator
+// @param {Function} elementCreator
 // @param {Boolean} [hide=true] When set to `false` view element will not be inserted when it's empty.
 // @return {Function}
 function captionModelToView( elementCreator, hide = true ) {
@@ -200,9 +192,7 @@ function captionModelToView( elementCreator, hide = true ) {
 			}
 
 			const viewImage = conversionApi.mapper.toViewElement( data.range.start.parent );
-			const viewCaption = ( elementCreator instanceof ViewElement ) ?
-				elementCreator.clone( true ) :
-				elementCreator();
+			const viewCaption = elementCreator( conversionApi.writer );
 
 			// Hide if empty.
 			if ( !captionElement.childCount ) {

+ 2 - 4
packages/ckeditor5-image/src/imagecaption/utils.js

@@ -8,7 +8,6 @@
  */
 
 import ModelElement from '@ckeditor/ckeditor5-engine/src/model/element';
-import ViewEditableElement from '@ckeditor/ckeditor5-engine/src/view/editableelement';
 import { attachPlaceholder } from '@ckeditor/ckeditor5-engine/src/view/placeholder';
 import { toWidgetEditable } from '@ckeditor/ckeditor5-widget/src/utils';
 
@@ -22,9 +21,8 @@ const captionSymbol = Symbol( 'imageCaption' );
  * @return {Function}
  */
 export function captionElementCreator( view, placeholderText ) {
-	return () => {
-		const editable = new ViewEditableElement( 'figcaption' );
-		editable.document = view.document;
+	return writer => {
+		const editable = writer.createEditableElement( 'figcaption' );
 		editable.setCustomProperty( captionSymbol, true );
 		attachPlaceholder( view, editable, placeholderText );
 

+ 4 - 1
packages/ckeditor5-image/tests/image/converters.js

@@ -39,9 +39,12 @@ describe( 'Image converters', () => {
 					isBlock: true
 				} );
 
+				const editingElementCreator = ( item, consumable, api ) =>
+					toImageWidget( createImageViewElement( api.writer ), '' );
+
 				editor.conversion.for( 'editingDowncast' ).add( downcastElementToElement( {
 					model: 'image',
-					view: () => toImageWidget( createImageViewElement() )
+					view: editingElementCreator
 				} ) );
 
 				editor.conversion.for( 'downcast' )

+ 4 - 1
packages/ckeditor5-image/tests/imagecaption/utils.js

@@ -21,7 +21,10 @@ describe( 'image captioning utils', () => {
 		view = new View();
 		document = view.document;
 		const creator = captionElementCreator( view, 'placeholder text' );
-		element = creator();
+
+		view.change( writer => {
+			element = creator( writer );
+		} );
 	} );
 
 	describe( 'captionElementCreator', () => {