|
|
@@ -454,6 +454,82 @@ describe( 'DataController', () => {
|
|
|
data.get( { rootName: 'nonexistent' } );
|
|
|
}, /datacontroller-get-non-existent-root:/ );
|
|
|
} );
|
|
|
+
|
|
|
+ it( 'should allow to provide additional conversion options - insert conversion', () => {
|
|
|
+ schema.register( 'paragraph', { inheritAllFrom: '$block' } );
|
|
|
+
|
|
|
+ data.downcastDispatcher.on( 'insert:paragraph', ( evt, data, conversionApi ) => {
|
|
|
+ conversionApi.consumable.consume( data.item, 'insert' );
|
|
|
+
|
|
|
+ const viewPosition = conversionApi.mapper.toViewPosition( data.range.start );
|
|
|
+ const viewElement = conversionApi.writer.createContainerElement( 'p', {
|
|
|
+ attribute: conversionApi.options.attributeValue
|
|
|
+ } );
|
|
|
+
|
|
|
+ conversionApi.mapper.bindElements( data.item, viewElement );
|
|
|
+ conversionApi.writer.insert( viewPosition, viewElement );
|
|
|
+ }, { priority: 'high' } );
|
|
|
+
|
|
|
+ setData( model, '<paragraph>foo</paragraph>' );
|
|
|
+
|
|
|
+ expect( data.get( { conversionOptions: { attributeValue: 'foo' } } ) ).to.equal( '<p attribute="foo">foo</p>' );
|
|
|
+ expect( data.get( { conversionOptions: { attributeValue: 'bar' } } ) ).to.equal( '<p attribute="bar">foo</p>' );
|
|
|
+ } );
|
|
|
+
|
|
|
+ it( 'should allow to provide additional conversion options - attribute conversion', () => {
|
|
|
+ schema.register( 'paragraph', { inheritAllFrom: '$block', allowAttributes: [ 'foo' ] } );
|
|
|
+ downcastHelpers.elementToElement( { model: 'paragraph', view: 'p' } );
|
|
|
+
|
|
|
+ data.downcastDispatcher.on( 'attribute:foo', ( evt, data, conversionApi ) => {
|
|
|
+ if ( data.attributeNewValue === conversionApi.options.skipAttribute ) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ const viewRange = conversionApi.mapper.toViewRange( data.range );
|
|
|
+ const viewElement = conversionApi.writer.createAttributeElement( data.attributeNewValue );
|
|
|
+
|
|
|
+ conversionApi.writer.wrap( viewRange, viewElement );
|
|
|
+ } );
|
|
|
+
|
|
|
+ setData( model, '<paragraph>f<$text foo="a">o</$text>ob<$text foo="b">a</$text>r</paragraph>' );
|
|
|
+
|
|
|
+ expect( data.get() ).to.equal( '<p>f<a>o</a>ob<b>a</b>r</p>' );
|
|
|
+ expect( data.get( { conversionOptions: { skipAttribute: 'a' } } ) ).to.equal( '<p>foob<b>a</b>r</p>' );
|
|
|
+ expect( data.get( { conversionOptions: { skipAttribute: 'b' } } ) ).to.equal( '<p>f<a>o</a>obar</p>' );
|
|
|
+ } );
|
|
|
+
|
|
|
+ it( 'should allow to provide additional conversion options - addMarker conversion', () => {
|
|
|
+ schema.register( 'paragraph', { inheritAllFrom: '$block' } );
|
|
|
+ downcastHelpers.elementToElement( { model: 'paragraph', view: 'p' } );
|
|
|
+
|
|
|
+ data.downcastDispatcher.on( 'addMarker', ( evt, data, conversionApi ) => {
|
|
|
+ if ( conversionApi.options.skipMarker ) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ const viewElement = conversionApi.writer.createAttributeElement( 'marker' );
|
|
|
+ const viewRange = conversionApi.mapper.toViewRange( data.markerRange );
|
|
|
+
|
|
|
+ conversionApi.writer.wrap( viewRange, viewElement );
|
|
|
+ } );
|
|
|
+
|
|
|
+ setData( model, '<paragraph>foo</paragraph>' );
|
|
|
+
|
|
|
+ const root = model.document.getRoot();
|
|
|
+
|
|
|
+ model.change( writer => {
|
|
|
+ const start = writer.createPositionFromPath( root, [ 0, 1 ] );
|
|
|
+ const end = writer.createPositionFromPath( root, [ 0, 2 ] );
|
|
|
+
|
|
|
+ writer.addMarker( 'marker', {
|
|
|
+ range: writer.createRange( start, end ),
|
|
|
+ usingOperation: false
|
|
|
+ } );
|
|
|
+ } );
|
|
|
+
|
|
|
+ expect( data.get( { conversionOptions: { skipMarker: false } } ) ).to.equal( '<p>f<marker>o</marker>o</p>' );
|
|
|
+ expect( data.get( { conversionOptions: { skipMarker: true } } ) ).to.equal( '<p>foo</p>' );
|
|
|
+ } );
|
|
|
} );
|
|
|
|
|
|
describe( 'stringify()', () => {
|
|
|
@@ -478,6 +554,22 @@ describe( 'DataController', () => {
|
|
|
|
|
|
expect( data.stringify( modelDocumentFragment ) ).to.equal( '<p>foo</p><p>bar</p>' );
|
|
|
} );
|
|
|
+
|
|
|
+ it( 'should allow to provide additional options to the conversion process', () => {
|
|
|
+ const spy = sinon.spy();
|
|
|
+
|
|
|
+ data.downcastDispatcher.on( 'insert:paragraph', ( evt, data, conversionApi ) => {
|
|
|
+ spy( conversionApi.options );
|
|
|
+ }, { priority: 'high' } );
|
|
|
+
|
|
|
+ const modelDocumentFragment = parseModel( '<paragraph>foo</paragraph><paragraph>bar</paragraph>', schema );
|
|
|
+
|
|
|
+ data.stringify( modelDocumentFragment );
|
|
|
+ expect( spy.lastCall.args[ 0 ] ).to.deep.equal( {} );
|
|
|
+
|
|
|
+ data.stringify( modelDocumentFragment, { foo: 'bar' } );
|
|
|
+ expect( spy.lastCall.args[ 0 ] ).to.deep.equal( { foo: 'bar' } );
|
|
|
+ } );
|
|
|
} );
|
|
|
|
|
|
describe( 'toView()', () => {
|
|
|
@@ -590,6 +682,22 @@ describe( 'DataController', () => {
|
|
|
expect( mappedViewRange.end.nodeBefore ).to.equal( firstViewElement );
|
|
|
expect( mappedViewRange.end.nodeAfter ).to.equal( viewDocumentFragment.getChild( 1 ) );
|
|
|
} );
|
|
|
+
|
|
|
+ it( 'should allow to provide additional options to the conversion process', () => {
|
|
|
+ const spy = sinon.spy();
|
|
|
+
|
|
|
+ data.downcastDispatcher.on( 'insert:paragraph', ( evt, data, conversionApi ) => {
|
|
|
+ spy( conversionApi.options );
|
|
|
+ }, { priority: 'high' } );
|
|
|
+
|
|
|
+ const modelDocumentFragment = parseModel( '<paragraph>foo</paragraph><paragraph>bar</paragraph>', schema );
|
|
|
+
|
|
|
+ data.toView( modelDocumentFragment );
|
|
|
+ expect( spy.lastCall.args[ 0 ] ).to.deep.equal( {} );
|
|
|
+
|
|
|
+ data.toView( modelDocumentFragment, { foo: 'bar' } );
|
|
|
+ expect( spy.lastCall.args[ 0 ] ).to.deep.equal( { foo: 'bar' } );
|
|
|
+ } );
|
|
|
} );
|
|
|
|
|
|
describe( 'destroy()', () => {
|