From 4ab84aa493cd15b82bd1c84ba7f42a5db35a434d Mon Sep 17 00:00:00 2001 From: Aleksander Nowodzinski Date: Thu, 12 Mar 2020 11:21:04 +0100 Subject: [PATCH] Created a single DataController#viewDocument. Used the document in DataController#toView. --- src/controller/datacontroller.js | 27 ++++++++++++++++++++++----- tests/controller/datacontroller.js | 14 ++++++++++++++ 2 files changed, 36 insertions(+), 5 deletions(-) diff --git a/src/controller/datacontroller.js b/src/controller/datacontroller.js index 848444769..50428d2eb 100644 --- a/src/controller/datacontroller.js +++ b/src/controller/datacontroller.js @@ -104,6 +104,24 @@ export default class DataController { schema: model.schema } ); + /** + * The view document used by the data controller. + * + * @readonly + * @member {module:engine/view/document~Document} + */ + this.viewDocument = new ViewDocument( stylesProcessor ); + + /** + * The view downcast writer just for data conversion purposes, i.e. to modify + * the {@link #viewDocument}. + * + * @private + * @readonly + * @member {module:engine/view/downcastwriter~DowncastWriter} + */ + this._viewWriter = new ViewDowncastWriter( this.viewDocument ); + // Define default converters for text and elements. // // Note that if there is no default converter for the element it will be skipped, for instance `foo` will be @@ -188,20 +206,19 @@ export default class DataController { * @returns {module:engine/view/documentfragment~DocumentFragment} Output view DocumentFragment. */ toView( modelElementOrFragment ) { + const viewDocument = this.viewDocument; + const viewWriter = this._viewWriter; + // Clear bindings so the call to this method gives correct results. this.mapper.clearBindings(); // First, convert elements. const modelRange = ModelRange._createIn( modelElementOrFragment ); - const viewDocument = new ViewDocument( this.stylesProcessor ); - const viewDocumentFragment = new ViewDocumentFragment( viewDocument ); - // Create separate ViewDowncastWriter just for data conversion purposes. - // We have no view controller and rendering do DOM in DataController so view.change() block is not used here. - const viewWriter = new ViewDowncastWriter( viewDocument ); this.mapper.bindElements( modelElementOrFragment, viewDocumentFragment ); + // We have no view controller and rendering do DOM in DataController so view.change() block is not used here. this.downcastDispatcher.convertInsert( modelRange, viewWriter ); if ( !modelElementOrFragment.is( 'documentFragment' ) ) { diff --git a/tests/controller/datacontroller.js b/tests/controller/datacontroller.js index 3fad2844d..f2cf0c892 100644 --- a/tests/controller/datacontroller.js +++ b/tests/controller/datacontroller.js @@ -56,6 +56,13 @@ describe( 'DataController', () => { expect( data.model ).to.equal( model ); expect( data.stylesProcessor ).to.equal( stylesProcessor ); } ); + + it( 'should create the #viewDocument property', () => { + const stylesProcessor = new StylesProcessor(); + const data = new DataController( model, stylesProcessor ); + + expect( data.viewDocument ).to.be.instanceOf( ViewDocument ); + } ); } ); describe( 'parse()', () => { @@ -474,6 +481,13 @@ describe( 'DataController', () => { downcastHelpers.elementToElement( { model: 'paragraph', view: 'p' } ); } ); + it( 'should use #viewDocument as a parent for returned document fragments', () => { + const modelElement = parseModel( '
foo
', schema ); + const viewDocumentFragment = data.toView( modelElement ); + + expect( viewDocumentFragment.document ).to.equal( data.viewDocument ); + } ); + it( 'should convert a content of an element', () => { const modelElement = parseModel( '
foo
', schema );