Kaynağa Gözat

Introduced DataCotroller methods: stringify, toView and optional context parameter to parse.

Piotr Jasiun 9 yıl önce
ebeveyn
işleme
297e9f48ad

+ 34 - 9
packages/ckeditor5-engine/src/datacontroller.js

@@ -115,19 +115,44 @@ export default class DataController {
 	 */
 	get( rootName = 'main' ) {
 		// Get model range.
-		const modelRoot = this.model.getRoot( rootName );
-		const modelRange = ModelRange.createIn( modelRoot );
+		return this.stringify( this.model.getRoot( rootName ) );
+	}
 
+	/**
+	 * Returns the content of the given {@link engine.model.Element model's element} converted by the
+	 * {@link engine.DataController#modelToView model to view converters} and formatted by the
+	 * {@link engine.DataController#processor data processor}.
+	 *
+	 * @param {engine.model.Element} modelElement Element which content will be stringified.
+	 * @returns {String} Output data.
+	 */
+	stringify( modelElement ) {
 		// model -> view
+		const viewDocumentFragment = this.toView( modelElement );
+
+		// view -> data
+		return this.processor.toData( viewDocumentFragment );
+	}
+
+	/**
+	 * Returns the content of the given {@link engine.model.Element model's element} converted by the
+	 * {@link engine.DataController#modelToView model to view converters} to the
+	 * {@link engine.view.DocumentFragment view DocumentFragment}.
+	 *
+	 * @param {engine.model.Element} modelElement Element which content will be stringified.
+	 * @returns {engine.view.DocumentFragment} Output view DocumentFragment.
+	 */
+	toView( modelElement ) {
+		const modelRange = ModelRange.createIn( modelElement );
+
 		const viewDocumentFragment = new ViewDocumentFragment();
-		this.mapper.bindElements( modelRoot, viewDocumentFragment );
+		this.mapper.bindElements( modelElement, viewDocumentFragment );
 
 		this.modelToView.convertInsertion( modelRange );
 
 		this.mapper.clearBindings();
 
-		// view -> data
-		return this.processor.toData( viewDocumentFragment );
+		return viewDocumentFragment;
 	}
 
 	/**
@@ -163,16 +188,16 @@ export default class DataController {
 	 *
 	 * @see engine.DataController#set
 	 * @param {String} data Data to parse.
+	 * @param {String} [context='$root''] Base context in which view will be converted to the model. See:
+	 * {@link engine.conversion.ViewConversionDispatcher#convert}.
 	 * @returns {engine.model.DocumentFragment} Parsed data.
 	 */
-	parse( data ) {
+	parse( data, context = '$root' ) {
 		// data -> view
 		const viewDocumentFragment = this.processor.toView( data );
 
 		// view -> model
-		const modelDocumentFragment = this.viewToModel.convert( viewDocumentFragment, { context: [ '$root' ] } );
-
-		return modelDocumentFragment;
+		return this.viewToModel.convert( viewDocumentFragment, { context: [ context ] } );
 	}
 
 	/**

+ 40 - 1
packages/ckeditor5-engine/tests/datacontroller.js

@@ -12,7 +12,8 @@ import HtmlDataProcessor from '/ckeditor5/engine/dataprocessor/htmldataprocessor
 import buildViewConverter  from '/ckeditor5/engine/conversion/buildviewconverter.js';
 import buildModelConverter  from '/ckeditor5/engine/conversion/buildmodelconverter.js';
 
-import { getData, setData, stringify } from '/tests/engine/_utils/model.js';
+import { getData, setData, stringify, parse } from '/tests/engine/_utils/model.js';
+import { stringify as stringifyView } from '/tests/engine/_utils/view.js';
 
 import count from '/ckeditor5/utils/count.js';
 
@@ -80,6 +81,18 @@ describe( 'DataController', () => {
 			expect( stringify( model ) ).to.equal(
 				'<paragraph>foo<$text bold="true">bar</$text></paragraph>' );
 		} );
+
+		it( 'should parse in the root context by default', () => {
+			const model = data.parse( 'foo' );
+
+			expect( stringify( model ) ).to.equal( '' );
+		} );
+
+		it( 'should accept parsing context', () => {
+			const model = data.parse( 'foo', '$block' );
+
+			expect( stringify( model ) ).to.equal( 'foo' );
+		} );
 	} );
 
 	describe( 'set', () => {
@@ -204,6 +217,32 @@ describe( 'DataController', () => {
 		} );
 	} );
 
+	describe( 'stringify', () => {
+		it( 'should get paragraph with text', () => {
+			modelDocument.schema.registerItem( 'paragraph', '$block' );
+			modelDocument.schema.registerItem( 'div', '$block' );
+			const modelElement = parse( '<div><paragraph>foo</paragraph></div>', modelDocument.schema );
+
+			buildModelConverter().for( data.modelToView ).fromElement( 'paragraph' ).toElement( 'p' );
+
+			expect( data.stringify( modelElement ) ).to.equal( '<p>foo</p>' );
+		} );
+	} );
+
+	describe( 'toView', () => {
+		it( 'should get paragraph with text', () => {
+			modelDocument.schema.registerItem( 'paragraph', '$block' );
+			modelDocument.schema.registerItem( 'div', '$block' );
+			const modelElement = parse( '<div><paragraph>foo</paragraph></div>', modelDocument.schema );
+
+			buildModelConverter().for( data.modelToView ).fromElement( 'paragraph' ).toElement( 'p' );
+
+			const viewElement = data.toView( modelElement );
+
+			expect( stringifyView( viewElement ) ).to.equal( '<p>foo</p>' );
+		} );
+	} );
+
 	describe( 'destroy', () => {
 		it( 'should be there for you', () => {
 			// Should not throw.