Skip to content
This repository has been archived by the owner on Jun 26, 2020. It is now read-only.

Commit

Permalink
Remove Conversion#register() method.
Browse files Browse the repository at this point in the history
  • Loading branch information
jodator committed Feb 7, 2019
1 parent 0a7e029 commit bdc0f97
Show file tree
Hide file tree
Showing 2 changed files with 96 additions and 17 deletions.
60 changes: 43 additions & 17 deletions src/conversion/conversion.js
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@
*/

import CKEditorError from '@ckeditor/ckeditor5-utils/src/ckeditorerror';
import UpcastHelpers from './upcasthelpers';
import DowncastHelpers from './downcasthelpers';

/**
* A utility class that helps add converters to upcast and downcast dispatchers.
Expand Down Expand Up @@ -57,37 +59,59 @@ export default class Conversion {
/**
* Creates a new conversion instance.
*/
constructor() {
constructor( downcastDispatchers, upcastDispatchers ) {
/**
* @private
* @member {Map}
*/
this._conversionHelpers = new Map();
this._helpers = new Map();
this._groups = new Map();

this._defineGroup( 'downcast', downcastDispatchers, DowncastHelpers );
this._defineGroup( 'upcast', upcastDispatchers, UpcastHelpers );
}

/**
* Registers one or more converters under a given group name. The group name can then be used to assign a converter
* to multiple dispatchers at once.
* Define an alias for registered dispatcher.
*
* const conversion = new Conversion( [ dataDowncastDispatcher, editingDowncastDispatcher ], upcastDispatcher );
*
* If a given group name is used for the second time, the
* {@link module:utils/ckeditorerror~CKEditorError `conversion-register-group-exists` error} is thrown.
* conversion.addAlias( 'dataDowncast', dataDowncastDispatcher );
*
* @param {String} name The name for dispatchers group.
* @param {module:engine/conversion/downcasthelpers~DowncastHelpers|
* module:engine/conversion/upcasthelpers~UpcastHelpers} conversionHelpers
* @param {String} alias An alias of a dispatcher.
* @param {module:engine/conversion/downcastdispatcher~DowncastDispatcher|
* module:engine/conversion/upcastdispatcher~UpcastDispatcher} dispatcher Dispatcher which should have an alias.
*/
register( name, conversionHelpers ) {
if ( this._conversionHelpers.has( name ) ) {
addAlias( alias, dispatcher ) {
const groupEntry = [ ...this._groups.entries() ].find( ( [ , dispatchers ] ) => dispatchers.includes( dispatcher ) );

const groupName = groupEntry ? groupEntry[ 0 ] : null;

const helper = this._helpers.get( groupName );

this._defineGroup( alias, dispatcher, helper );
}

_defineGroup( name, dispatcher, helpers ) {
if ( this._groups.has( name ) ) {
/**
* Trying to register a group name that has already been registered.
*
* @error conversion-register-group-exists
*/
throw new CKEditorError( 'conversion-register-group-exists: Trying to register' +
'a group name that has already been registered.' );
throw new CKEditorError( 'conversion-group-exists: Trying to register a group name that has already been registered.' );
}

const group = [];

const dispatchers = Array.isArray( dispatcher ) ? dispatcher : [ dispatcher ];

for ( const dispatcher of dispatchers ) {
group.push( dispatcher );
}

this._conversionHelpers.set( name, conversionHelpers );
this._groups.set( name, group );
this._helpers.set( name, helpers );
}

/**
Expand Down Expand Up @@ -149,7 +173,9 @@ export default class Conversion {
* @returns {module:engine/conversion/downcasthelpers~DowncastHelpers|module:engine/conversion/upcasthelpers~UpcastHelpers}
*/
for( groupName ) {
return this._getConversionHelpers( groupName );
const ConversionHelper = this._getConversionHelpers( groupName );

return new ConversionHelper( this._groups.get( groupName ) );
}

/**
Expand Down Expand Up @@ -545,7 +571,7 @@ export default class Conversion {
* @returns {module:engine/conversion/downcasthelpers~DowncastHelpers|module:engine/conversion/upcasthelpers~UpcastHelpers}
*/
_getConversionHelpers( groupName ) {
if ( !this._conversionHelpers.has( groupName ) ) {
if ( !this._helpers.has( groupName ) ) {
/**
* Trying to add a converter to an unknown dispatchers group.
*
Expand All @@ -554,7 +580,7 @@ export default class Conversion {
throw new CKEditorError( 'conversion-for-unknown-group: Trying to add a converter to an unknown dispatchers group.' );
}

return this._conversionHelpers.get( groupName );
return this._helpers.get( groupName );
}
}

Expand Down
53 changes: 53 additions & 0 deletions src/conversion/conversionhelpers.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
/**
* @license Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
* For licensing, see LICENSE.md.
*/

/**
* @module engine/conversion/conversionhelpers
*/

/**
* Base class for conversion helpers.
*/
export default class ConversionHelpers {
/**
* Creates a conversion helpers instance.
*
* @param {Array.<module:engine/conversion/downcastdispatcher~DowncastDispatcher|
* module:engine/conversion/upcastdispatcher~UpcastDispatcher>} dispatcher
*/
constructor( dispatcher ) {
this._dispatchers = Array.isArray( dispatcher ) ? dispatcher : [ dispatcher ];
}

/**
* Registers a conversion helper.
*
* **Note**: See full usage example in the `{@link module:engine/conversion/conversion~Conversion#for conversion.for()}`
* method description.
*
* @param {Function} conversionHelper The function to be called on event.
* @returns {module:engine/conversion/downcasthelpers~DowncastHelpers|module:engine/conversion/upcasthelpers~UpcastHelpers}
*/
add( conversionHelper ) {
this._addToDispatchers( conversionHelper );

return this;
}

/**
* Helper function for the `Conversion` `.add()` method.
*
* Calls `conversionHelper` on each dispatcher from the group specified earlier in the `.for()` call, effectively
* adding converters to all specified dispatchers.
*
* @private
* @param {Function} conversionHelper
*/
_addToDispatchers( conversionHelper ) {
for ( const dispatcher of this._dispatchers ) {
conversionHelper( dispatcher );
}
}
}

0 comments on commit bdc0f97

Please sign in to comment.