%PDF- %PDF-
Direktori : /www/varak.net/wiki.varak.net/extensions/VisualEditor/lib/ve/src/ui/ |
Current File : /www/varak.net/wiki.varak.net/extensions/VisualEditor/lib/ve/src/ui/ve.ui.ModeledFactory.js |
/*! * VisualEditor UserInterface ModeledFactory class. * * @copyright 2011-2016 VisualEditor Team and others; see http://ve.mit-license.org */ /** * Mixin for factories whose items associate with specific models. * * Classes registered with the factory should have a static method named `isCompatibleWith` that * accepts a model and returns a boolean. * * @class * * @constructor */ ve.ui.ModeledFactory = function VeUiModeledFactory() {}; /* Inheritance */ OO.initClass( ve.ui.ModeledFactory ); /* Methods */ /** * Get a list of symbolic names for classes related to a list of models. * * The lowest compatible item in each inheritance chain will be used. * * @param {Object[]} models Models to find relationships with * @return {Object[]} List of objects containing `name` and `model` properties, representing * each compatible class's symbolic name and the model it is compatible with */ ve.ui.ModeledFactory.prototype.getRelatedItems = function ( models ) { var i, iLen, j, jLen, name, classes, model, registry = this.registry, names = {}, matches = []; /** * Collect the most specific compatible classes for a model. * * @private * @param {Object} model Model to find compatibility with * @return {Function[]} List of compatible classes */ function collect( model ) { var i, len, name, candidate, add, candidates = []; for ( name in registry ) { candidate = registry[ name ]; if ( candidate.static.isCompatibleWith( model ) ) { add = true; for ( i = 0, len = candidates.length; i < len; i++ ) { if ( candidate.prototype instanceof candidates[ i ] ) { candidates.splice( i, 1, candidate ); add = false; break; } else if ( candidates[ i ].prototype instanceof candidate ) { add = false; break; } } if ( add ) { candidates.push( candidate ); } } } return candidates; } // Collect compatible classes and the models they are specifically compatible with, // discarding class's with duplicate symbolic names for ( i = 0, iLen = models.length; i < iLen; i++ ) { model = models[ i ]; classes = collect( model ); for ( j = 0, jLen = classes.length; j < jLen; j++ ) { name = classes[ j ].static.name; if ( !names[ name ] ) { matches.push( { name: name, model: model } ); } names[ name ] = true; } } return matches; };