Răsfoiți Sursa

Changed: Pass all `ConverterDefinition`s to modelAttributeToViewAttributeElement as an array.

Maciej Gołaszewski 8 ani în urmă
părinte
comite
17f02c010e

+ 36 - 17
packages/ckeditor5-engine/src/conversion/definition-based-converters.js

@@ -119,39 +119,58 @@ export function viewToModelElement( definition, dispatchers ) {
  *
  * By defining conversion as simple model element to view element conversion using simplified definition:
  *
- *		modelAttributeToViewAttributeElement( 'bold', {
- *			model: 'true',
- *			view: 'strong',
- *		}, [ editor.editing.modelToView, editor.data.modelToView ] );
+ *        modelAttributeToViewAttributeElement( 'bold', [
+ *            {
+ *				model: 'true',
+ *				view: 'strong'
+ *			}
+ *        ], [ editor.editing.modelToView, editor.data.modelToView ] );
  *
- * Or defining full-flavored view object:
+ * Or defining full-flavored view objects:
  *
- *		modelAttributeToViewAttributeElement( 'fontSize', {
- *			model: 'big',
- *			view: {
- *				name: 'span',
- *				style: {
- *					'font-size': '1.2em'
- *				}
+ *        modelAttributeToViewAttributeElement( 'fontSize', [
+ *            {
+ *				model: 'big',
+ *				view: {
+ *					name: 'span',
+ *					style: { 'font-size': '1.2em' }
+ *				},
  *			},
- *		}, [ editor.editing.modelToView, editor.data.modelToView ] );
+ *            {
+ *				model: 'small',
+ *				view: {
+ *					name: 'span',
+ *					style: { 'font-size': '0.8em' }
+ *				},
+ *			}
+ *        ], [ editor.editing.modelToView, editor.data.modelToView ] );
  *
  * Above will generate the following view element for model's attribute `fontSize` with a `big` value set:
  *
  *		<span style="font-size:1.2em;">...</span>
  *
  * @param {String} attributeName The name of the model attribute which should be converted.
- * @param {module:engine/conversion/definition-based-converters~ConverterDefinition} definition A conversion configuration.
+ * @param {Array.<module:engine/conversion/definition-based-converters~ConverterDefinition>} definitions A conversion configuration objects
+ * for each possible attribute value.
  * @param {Array.<module:engine/conversion/modelconversiondispatcher~ModelConversionDispatcher>} dispatchers
  */
-export function modelAttributeToViewAttributeElement( attributeName, definition, dispatchers ) {
-	const { model: attributeValue, targetView } = normalizeConverterDefinition( definition );
+export function modelAttributeToViewAttributeElement( attributeName, definitions, dispatchers ) {
+	// Create a map of attributeValue - to - ViewElementDefinition.
+	const valueToTargetViewMap = definitions
+		.map( normalizeConverterDefinition )
+		.reduce( ( mapObject, normalizedDefinition ) => {
+			mapObject[ normalizedDefinition.model ] = normalizedDefinition.targetView;
+
+			return mapObject;
+		}, {} );
 
 	buildModelConverter()
 		.for( ...dispatchers )
 		.fromAttribute( attributeName )
 		.toElement( value => {
-			if ( value != attributeValue ) {
+			const targetView = valueToTargetViewMap[ value ];
+
+			if ( !targetView ) {
 				return;
 			}
 

+ 23 - 2
packages/ckeditor5-engine/tests/conversion/definition-based-converters.js

@@ -121,7 +121,7 @@ describe( 'definition-based-converters', () => {
 
 	describe( 'Attribute converters', () => {
 		function testModelConversion( definition, expectedConversion ) {
-			modelAttributeToViewAttributeElement( 'foo', definition, [ dispatcher ] );
+			modelAttributeToViewAttributeElement( 'foo', [ definition ], [ dispatcher ] );
 
 			const modelElement = new ModelText( 'foo', { foo: 'bar' } );
 
@@ -176,8 +176,29 @@ describe( 'definition-based-converters', () => {
 				}, '<div><span data-foo="bar">foo</span></div>' );
 			} );
 
+			it( 'should convert when changing attribute', () => {
+				const definition1 = { model: 'bar', view: { name: 'span', class: 'bar' } };
+				const definition2 = { model: 'baz', view: { name: 'span', class: 'baz' } };
+
+				modelAttributeToViewAttributeElement( 'foo', [ definition1, definition2 ], [ dispatcher ] );
+
+				const modelElement = new ModelText( 'foo', { foo: 'bar' } );
+
+				model.change( writer => {
+					writer.insert( modelElement, ModelPosition.createAt( modelRoot, 0 ) );
+				} );
+
+				expect( viewToString( viewRoot ) ).to.equal( '<div><span class="bar">foo</span></div>' );
+
+				model.change( writer => {
+					writer.setAttribute( 'foo', 'baz', modelElement );
+				} );
+
+				expect( viewToString( viewRoot ) ).to.equal( '<div><span class="baz">foo</span></div>' );
+			} );
+
 			it( 'should do nothing for undefined value', () => {
-				modelAttributeToViewAttributeElement( 'foo', { model: 'bar', view: 'strong' }, [ dispatcher ] );
+				modelAttributeToViewAttributeElement( 'foo', [ { model: 'bar', view: 'strong' } ], [ dispatcher ] );
 
 				const modelElement = new ModelText( 'foo', { foo: 'baz' } );