123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228 |
- /**
- * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
- * For licensing, see LICENSE.md or http://ckeditor.com/license
- */
- /**
- * @fileOverview Defines the {@link CKEDITOR.resourceManager} class, which is
- * the base for resource managers, like plugins.
- */
- /**
- * Base class for resource managers, like plugins. This class is not
- * intended to be used out of the CKEditor core code.
- *
- * @class
- * @constructor Creates a resourceManager class instance.
- * @param {String} basePath The path for the resources folder.
- * @param {String} fileName The name used for resource files.
- */
- CKEDITOR.resourceManager = function( basePath, fileName ) {
- /**
- * The base directory containing all resources.
- *
- * @property {String}
- */
- this.basePath = basePath;
- /**
- * The name used for resource files.
- *
- * @property {String}
- */
- this.fileName = fileName;
- /**
- * Contains references to all resources that have already been registered
- * with {@link #add}.
- */
- this.registered = {};
- /**
- * Contains references to all resources that have already been loaded
- * with {@link #load}.
- */
- this.loaded = {};
- /**
- * Contains references to all resources that have already been registered
- * with {@link #addExternal}.
- */
- this.externals = {};
- /**
- * @private
- */
- this._ = {
- // List of callbacks waiting for plugins to be loaded.
- waitingList: {}
- };
- };
- CKEDITOR.resourceManager.prototype = {
- /**
- * Registers a resource.
- *
- * CKEDITOR.plugins.add( 'sample', { ... plugin definition ... } );
- *
- * @param {String} name The resource name.
- * @param {Object} [definition] The resource definition.
- * @see CKEDITOR.pluginDefinition
- */
- add: function( name, definition ) {
- if ( this.registered[ name ] )
- throw '[CKEDITOR.resourceManager.add] The resource name "' + name + '" is already registered.';
- var resource = this.registered[ name ] = definition || {};
- resource.name = name;
- resource.path = this.getPath( name );
- CKEDITOR.fire( name + CKEDITOR.tools.capitalize( this.fileName ) + 'Ready', resource );
- return this.get( name );
- },
- /**
- * Gets the definition of a specific resource.
- *
- * var definition = CKEDITOR.plugins.get( 'sample' );
- *
- * @param {String} name The resource name.
- * @returns {Object} The registered object.
- */
- get: function( name ) {
- return this.registered[ name ] || null;
- },
- /**
- * Get the folder path for a specific loaded resource.
- *
- * alert( CKEDITOR.plugins.getPath( 'sample' ) ); // '<editor path>/plugins/sample/'
- *
- * @param {String} name The resource name.
- * @returns {String}
- */
- getPath: function( name ) {
- var external = this.externals[ name ];
- return CKEDITOR.getUrl( ( external && external.dir ) || this.basePath + name + '/' );
- },
- /**
- * Get the file path for a specific loaded resource.
- *
- * alert( CKEDITOR.plugins.getFilePath( 'sample' ) ); // '<editor path>/plugins/sample/plugin.js'
- *
- * @param {String} name The resource name.
- * @returns {String}
- */
- getFilePath: function( name ) {
- var external = this.externals[ name ];
- return CKEDITOR.getUrl( this.getPath( name ) + ( external ? external.file : this.fileName + '.js' ) );
- },
- /**
- * Registers one or more resources to be loaded from an external path
- * instead of the core base path.
- *
- * // Loads a plugin from '/myplugin/samples/plugin.js'.
- * CKEDITOR.plugins.addExternal( 'sample', '/myplugins/sample/' );
- *
- * // Loads a plugin from '/myplugin/samples/my_plugin.js'.
- * CKEDITOR.plugins.addExternal( 'sample', '/myplugins/sample/', 'my_plugin.js' );
- *
- * // Loads a plugin from '/myplugin/samples/my_plugin.js'.
- * CKEDITOR.plugins.addExternal( 'sample', '/myplugins/sample/my_plugin.js', '' );
- *
- * @param {String} names The resource names, separated by commas.
- * @param {String} path The path of the folder containing the resource.
- * @param {String} [fileName] The resource file name. If not provided, the
- * default name is used. If provided with a empty string, will implicitly indicates that `path` argument
- * is already the full path.
- */
- addExternal: function( names, path, fileName ) {
- names = names.split( ',' );
- for ( var i = 0; i < names.length; i++ ) {
- var name = names[ i ];
- // If "fileName" is not provided, we assume that it may be available
- // in "path". Try to extract it in this case.
- if ( !fileName ) {
- path = path.replace( /[^\/]+$/, function( match ) {
- fileName = match;
- return '';
- } );
- }
- this.externals[ name ] = {
- dir: path,
- // Use the default file name if there is no "fileName" and it
- // was not found in "path".
- file: fileName || ( this.fileName + '.js' )
- };
- }
- },
- /**
- * Loads one or more resources.
- *
- * CKEDITOR.plugins.load( 'myplugin', function( plugins ) {
- * alert( plugins[ 'myplugin' ] ); // object
- * } );
- *
- * @param {String/Array} name The name of the resource to load. It may be a
- * string with a single resource name, or an array with several names.
- * @param {Function} callback A function to be called when all resources
- * are loaded. The callback will receive an array containing all loaded names.
- * @param {Object} [scope] The scope object to be used for the callback call.
- */
- load: function( names, callback, scope ) {
- // Ensure that we have an array of names.
- if ( !CKEDITOR.tools.isArray( names ) )
- names = names ? [ names ] : [];
- var loaded = this.loaded,
- registered = this.registered,
- urls = [],
- urlsNames = {},
- resources = {};
- // Loop through all names.
- for ( var i = 0; i < names.length; i++ ) {
- var name = names[ i ];
- if ( !name )
- continue;
- // If not available yet.
- if ( !loaded[ name ] && !registered[ name ] ) {
- var url = this.getFilePath( name );
- urls.push( url );
- if ( !( url in urlsNames ) )
- urlsNames[ url ] = [];
- urlsNames[ url ].push( name );
- } else {
- resources[ name ] = this.get( name );
- }
- }
- CKEDITOR.scriptLoader.load( urls, function( completed, failed ) {
- if ( failed.length ) {
- throw '[CKEDITOR.resourceManager.load] Resource name "' + urlsNames[ failed[ 0 ] ].join( ',' ) +
- '" was not found at "' + failed[ 0 ] + '".';
- }
- for ( var i = 0; i < completed.length; i++ ) {
- var nameList = urlsNames[ completed[ i ] ];
- for ( var j = 0; j < nameList.length; j++ ) {
- var name = nameList[ j ];
- resources[ name ] = this.get( name );
- loaded[ name ] = 1;
- }
- }
- callback.call( scope, resources );
- }, this );
- }
- };
|