Procházet zdrojové kódy

Introduced "engine/view/elementdefinition~ElementDefinition#priority" property.

Kamil Piechaczek před 7 roky
rodič
revize
5d6c81f91e

+ 8 - 3
packages/ckeditor5-engine/src/conversion/downcast-converters.js

@@ -370,14 +370,19 @@ function _createViewElementFromDefinition( viewElementDefinition, viewWriter, vi
 	}
 
 	let element;
+	const attributes = Object.assign( {}, viewElementDefinition.attributes );
 
 	if ( viewElementType == 'container' ) {
-		element = viewWriter.createContainerElement( viewElementDefinition.name, Object.assign( {}, viewElementDefinition.attributes ) );
+		element = viewWriter.createContainerElement( viewElementDefinition.name, attributes );
 	} else if ( viewElementType == 'attribute' ) {
-		element = viewWriter.createAttributeElement( viewElementDefinition.name, Object.assign( {}, viewElementDefinition.attributes ) );
+		const options = {
+			priority: viewElementDefinition.priority || ViewAttributeElement.DEFAULT_PRIORITY
+		};
+
+		element = viewWriter.createAttributeElement( viewElementDefinition.name, attributes, options );
 	} else {
 		// 'ui'.
-		element = viewWriter.createUIElement( viewElementDefinition.name, Object.assign( {}, viewElementDefinition.attributes ) );
+		element = viewWriter.createUIElement( viewElementDefinition.name, attributes );
 	}
 
 	if ( viewElementDefinition.styles ) {

+ 1 - 0
packages/ckeditor5-engine/src/view/elementdefinition.jsdoc

@@ -55,4 +55,5 @@
  * Value under that key must be a string.
  * @property {Object} [attributes] Object with key-value pairs representing attributes. Each object key represents
  * attribute name. Value under that key must be a string.
+ * @property {Number} [priority] Element's {@link module:engine/view/attributeelement~AttributeElement#priority priority}.
  */

+ 26 - 3
packages/ckeditor5-engine/tests/conversion/downcast-converters.js

@@ -14,6 +14,7 @@ import ModelRange from '../../src/model/range';
 import ModelPosition from '../../src/model/position';
 
 import ViewElement from '../../src/view/element';
+import ViewAttributeElement from '../../src/view/attributeelement';
 import ViewContainerElement from '../../src/view/containerelement';
 import ViewUIElement from '../../src/view/uielement';
 import ViewText from '../../src/view/text';
@@ -148,6 +149,25 @@ describe( 'downcast-helpers', () => {
 			} );
 
 			expectResult( '<span class="bg-dark font-light">foo</span>' );
+			expect( viewRoot.getChild( 0 ).priority ).to.equal( ViewAttributeElement.DEFAULT_PRIORITY );
+		} );
+
+		it( 'config.view allows specifying the element\'s priority', () => {
+			const helper = downcastAttributeToElement( {
+				model: 'invert',
+				view: {
+					name: 'span',
+					priority: 5
+				}
+			} );
+
+			conversion.for( 'downcast' ).add( helper );
+
+			model.change( writer => {
+				writer.insertText( 'foo', { invert: true }, modelRoot, 0 );
+			} );
+
+			expect( viewRoot.getChild( 0 ).priority ).to.equal( 5 );
 		} );
 
 		it( 'model attribute value is enum', () => {
@@ -167,7 +187,8 @@ describe( 'downcast-helpers', () => {
 						name: 'span',
 						styles: {
 							'font-size': '0.8em'
-						}
+						},
+						priority: 5
 					}
 				}
 			} );
@@ -178,6 +199,7 @@ describe( 'downcast-helpers', () => {
 				writer.insertText( 'foo', { fontSize: 'big' }, modelRoot, 0 );
 			} );
 
+			expect( viewRoot.getChild( 0 ).priority ).to.equal( ViewAttributeElement.DEFAULT_PRIORITY );
 			expectResult( '<span style="font-size:1.2em">foo</span>' );
 
 			model.change( writer => {
@@ -185,6 +207,7 @@ describe( 'downcast-helpers', () => {
 			} );
 
 			expectResult( '<span style="font-size:0.8em">foo</span>' );
+			expect( viewRoot.getChild( 0 ).priority ).to.equal( 5 );
 
 			model.change( writer => {
 				writer.removeAttribute( 'fontSize', modelRoot.getChild( 0 ) );
@@ -1602,7 +1625,7 @@ describe( 'downcast-converters', () => {
 				dispatcher.on( 'removeMarker:marker2', removeHighlight( () => null ) );
 
 				viewDiv._setCustomProperty( 'addHighlight', ( element, descriptor ) => {
-					expect( descriptor.priority ).to.equal( 10 );
+					expect( descriptor.priority ).to.equal( ViewAttributeElement.DEFAULT_PRIORITY );
 					expect( descriptor.id ).to.equal( 'marker:foo-bar-baz' );
 				} );
 
@@ -1698,7 +1721,7 @@ describe( 'downcast-converters', () => {
 
 			expect( element.is( 'attributeElement' ) ).to.be.true;
 			expect( element.name ).to.equal( 'span' );
-			expect( element.priority ).to.equal( 10 );
+			expect( element.priority ).to.equal( ViewAttributeElement.DEFAULT_PRIORITY );
 			expect( element.hasClass( 'foo-class' ) ).to.be.true;
 
 			for ( const key of Object.keys( descriptor.attributes ) ) {