Explorar o código

Changed format of view -> model converter result.

Oskar Wróbel %!s(int64=9) %!d(string=hai) anos
pai
achega
43d92ceb16

+ 16 - 13
packages/ckeditor5-engine/src/conversion/viewconversiondispatcher.js

@@ -134,20 +134,31 @@ export default class ViewConversionDispatcher {
 	 * viewItem Part of the view to be converted.
 	 * @param {Object} [additionalData] Additional data to be passed in `data` argument when firing `ViewConversionDispatcher`
 	 * events. See also {@link ~ViewConversionDispatcher#event:element element event}.
-	 * @returns {module:engine/conversion/viewconversiondispatcher~ConvertedModelData} Model data that is a result of the conversion process.
+	 * @returns {module:engine/model/documentfragment~DocumentFragment} Model data that is a result of the conversion process
+	 * wrapped by DocumentFragment.
 	 */
 	convert( viewItem, additionalData = {} ) {
 		this.fire( 'viewCleanup', viewItem );
 
 		const consumable = ViewConsumable.createFrom( viewItem );
 		const conversionResult = this._convertItem( viewItem, consumable, additionalData );
-		let markers = new Map();
 
-		if ( conversionResult instanceof ModelNode || conversionResult instanceof ModelDocumentFragment ) {
-			markers = extractMarkersFromModelFragment( conversionResult );
+		// When conversion output is not a Node or Element we just return it.
+		if ( !( conversionResult instanceof ModelNode || conversionResult instanceof ModelDocumentFragment ) ) {
+			return conversionResult;
 		}
 
-		return { conversionResult, markers };
+		let documentFragment = conversionResult;
+
+		// When conversion result is not a DocumentFragment we need to wrap it by DocumentFragment.
+		if ( !documentFragment.is( 'documentFragment' ) ) {
+			documentFragment = new ModelDocumentFragment( [ conversionResult ] );
+		}
+
+		// Extract temporary markers stamp from model and set as static markers collection.
+		conversionResult.markers = extractMarkersFromModelFragment( conversionResult );
+
+		return conversionResult;
 	}
 
 	/**
@@ -280,14 +291,6 @@ function extractMarkersFromModelFragment( modelItem ) {
 	return markers;
 }
 
-/**
- * Model data that is a result of the conversion process.
- *
- * @typedef {ConvertedModelData} module:engine/conversion/viewconversiondispatcher~ConvertedModelData
- * @property {module:engine/model/documentfragment~DocumentFragment|module:engine/model/element~Node} conversionResult Converted model item.
- * @property {Map<String, module:engine/model/range~Range>} markers List of static markers.
- */
-
 /**
  * Conversion interface that is registered for given {@link module:engine/conversion/viewconversiondispatcher~ViewConversionDispatcher}
  * and is passed as one of parameters when {@link module:engine/conversion/viewconversiondispatcher~ViewConversionDispatcher dispatcher}

+ 18 - 33
packages/ckeditor5-engine/tests/conversion/viewconversiondispatcher.js

@@ -9,7 +9,6 @@ import ViewAttributeElement from '../../src/view/attributeelement';
 import ViewDocumentFragment from '../../src/view/documentfragment';
 import ViewText from '../../src/view/text';
 
-import ModelRange from '../../src/model/range';
 import ModelSchema from '../../src/model/schema';
 import buildViewConverter from '../../src/conversion/buildviewconverter';
 import { convertText } from '../../src/conversion/view-to-model-converters';
@@ -82,7 +81,7 @@ describe( 'ViewConversionDispatcher', () => {
 			} );
 
 			// Use `additionalData` parameter to check if it was passed to the event.
-			const { conversionResult } = dispatcher.convert( viewText, { foo: 'bar' } );
+			const conversionResult = dispatcher.convert( viewText, { foo: 'bar' } );
 
 			// Check conversion result.
 			expect( conversionResult ).to.deep.equal( {
@@ -116,7 +115,7 @@ describe( 'ViewConversionDispatcher', () => {
 			} );
 
 			// Use `additionalData` parameter to check if it was passed to the event.
-			const { conversionResult } = dispatcher.convert( viewElement, { foo: 'bar' } );
+			const conversionResult = dispatcher.convert( viewElement, { foo: 'bar' } );
 
 			// Check conversion result.
 			expect( conversionResult ).to.deep.equal( {
@@ -149,7 +148,7 @@ describe( 'ViewConversionDispatcher', () => {
 			} );
 
 			// Use `additionalData` parameter to check if it was passed to the event.
-			const { conversionResult } = dispatcher.convert( viewFragment, { foo: 'bar' } );
+			const conversionResult = dispatcher.convert( viewFragment, { foo: 'bar' } );
 
 			// Check conversion result.
 			expect( conversionResult ).to.deep.equal( {
@@ -181,19 +180,14 @@ describe( 'ViewConversionDispatcher', () => {
 				new ViewText( 'z' )
 			] );
 
-			const { conversionResult, markers } = dispatcher.convert( viewElement, { context: [ '$root' ] } );
+			const documentFragment = dispatcher.convert( viewElement, { context: [ '$root' ] } );
 
-			const markerComment = markers.get( 'comment' );
-			const markerSearch = markers.get( 'search' );
+			const markerComment = documentFragment.markers.get( 'comment' );
+			const markerSearch = documentFragment.markers.get( 'search' );
 
-			expect( stringify( conversionResult ) ).to.equal( '<paragraph>Foo bar biz</paragraph>' );
-			expect( markers.size ).to.equal( 2 );
-
-			expect( markerComment ).to.instanceof( ModelRange );
-			expect( markerComment.isEqual( ModelRange.createFromParentsAndOffsets( conversionResult, 1, conversionResult, 6 ) ) );
-
-			expect( markerSearch ).to.instanceof( ModelRange );
-			expect( markerSearch.isEqual( ModelRange.createFromParentsAndOffsets( conversionResult, 2, conversionResult, 10 ) ) );
+			expect( documentFragment.markers.size ).to.equal( 2 );
+			expect( stringify( documentFragment, markerComment ) ).to.equal( '<paragraph>F[oo ba]r biz</paragraph>' );
+			expect( stringify( documentFragment, markerSearch ) ).to.equal( '<paragraph>Fo[o bar bi]z</paragraph>' );
 		} );
 
 		it( 'should convert markers stamps for collapsed ranges', () => {
@@ -214,19 +208,14 @@ describe( 'ViewConversionDispatcher', () => {
 				new ViewText( 'o' ),
 			] );
 
-			const { conversionResult, markers } = dispatcher.convert( viewElement, { context: [ '$root' ] } );
-
-			const markerComment = markers.get( 'comment' );
-			const markerSearch = markers.get( 'search' );
+			const documentFragment = dispatcher.convert( viewElement, { context: [ '$root' ] } );
 
-			expect( stringify( conversionResult ) ).to.equal( '<paragraph>Foo</paragraph>' );
-			expect( markers.size ).to.equal( 2 );
+			const markerComment = documentFragment.markers.get( 'comment' );
+			const markerSearch = documentFragment.markers.get( 'search' );
 
-			expect( markerComment ).to.instanceof( ModelRange );
-			expect( markerComment.isEqual( ModelRange.createFromParentsAndOffsets( conversionResult, 1, conversionResult, 1 ) ) );
-
-			expect( markerSearch ).to.instanceof( ModelRange );
-			expect( markerSearch.isEqual( ModelRange.createFromParentsAndOffsets( conversionResult, 2, conversionResult, 2 ) ) );
+			expect( documentFragment.markers.size ).to.equal( 2 );
+			expect( stringify( documentFragment, markerComment ) ).to.equal( '<paragraph>F[]oo</paragraph>' );
+			expect( stringify( documentFragment, markerSearch ) ).to.equal( '<paragraph>Fo[]o</paragraph>' );
 		} );
 	} );
 
@@ -253,9 +242,7 @@ describe( 'ViewConversionDispatcher', () => {
 				}
 			} );
 
-			const { conversionResult } = dispatcher.convert( viewFragment );
-
-			expect( conversionResult ).to.deep.equal( [
+			expect( dispatcher.convert( viewFragment ) ).to.deep.equal( [
 				{ name: 'p' },
 				{ text: 'foobar' }
 			] );
@@ -281,9 +268,7 @@ describe( 'ViewConversionDispatcher', () => {
 				data.output = conversionApi.convertChildren( data.input );
 			} );
 
-			const { conversionResult } = dispatcher.convert( viewFragment );
-
-			expect( conversionResult ).to.deep.equal( [
+			expect( dispatcher.convert( viewFragment ) ).to.deep.equal( [
 				{ name: 'p' },
 				{ text: 'foobar' }
 			] );
@@ -318,7 +303,7 @@ describe( 'ViewConversionDispatcher', () => {
 				] )
 			] );
 
-			expect( dispatcher.convert( viewStructure ).conversionResult ).to.deep.equal( [ 'foo', ' bar ', 'xyz', 'aaa ', 'bbb', ' ', 'ccc' ] );
+			expect( dispatcher.convert( viewStructure ) ).to.deep.equal( [ 'foo', ' bar ', 'xyz', 'aaa ', 'bbb', ' ', 'ccc' ] );
 		} );
 	} );
 } );