4dab1d70ecb4f997f74c2d3f715b76b7f6f44c2b
2 Copyright (c) 2003-2011, CKSource - Frederico Knabben. All rights reserved.
3 For licensing, see LICENSE.html or http://ckeditor.com/license
7 * @fileOverview Defines the {@link CKEDITOR.resourceManager} class, which is
8 * the base for resource managers, like plugins and themes.
12 * Base class for resource managers, like plugins and themes. This class is not
13 * intended to be used out of the CKEditor core code.
14 * @param {String} basePath The path for the resources folder.
15 * @param {String} fileName The name used for resource files.
19 CKEDITOR
.resourceManager = function( basePath
, fileName
)
22 * The base directory containing all resources.
23 * @name CKEDITOR.resourceManager.prototype.basePath
27 this.basePath
= basePath
;
30 * The name used for resource files.
31 * @name CKEDITOR.resourceManager.prototype.fileName
35 this.fileName
= fileName
;
38 * Contains references to all resources that have already been registered
40 * @name CKEDITOR.resourceManager.prototype.registered
47 * Contains references to all resources that have already been loaded
49 * @name CKEDITOR.resourceManager.prototype.loaded
56 * Contains references to all resources that have already been registered
57 * with {@link #addExternal}.
58 * @name CKEDITOR.resourceManager.prototype.externals
69 // List of callbacks waiting for plugins to be loaded.
74 CKEDITOR
.resourceManager
.prototype =
77 * Registers a resource.
78 * @param {String} name The resource name.
79 * @param {Object} [definition] The resource definition.
81 * CKEDITOR.plugins.add( 'sample', { ... plugin definition ... } );
82 * @see CKEDITOR.pluginDefinition
84 add : function( name
, definition
)
86 if ( this.registered
[ name
] )
87 throw '[CKEDITOR.resourceManager.add] The resource name "' + name
+ '" is already registered.';
89 CKEDITOR
.fire( name
+ CKEDITOR
.tools
.capitalize( this.fileName
) + 'Ready',
90 this.registered
[ name
] = definition
|| {} );
94 * Gets the definition of a specific resource.
95 * @param {String} name The resource name.
98 * var definition = <b>CKEDITOR.plugins.get( 'sample' )</b>;
100 get : function( name
)
102 return this.registered
[ name
] || null;
106 * Get the folder path for a specific loaded resource.
107 * @param {String} name The resource name.
110 * alert( <b>CKEDITOR.plugins.getPath( 'sample' )</b> ); // "<editor path>/plugins/sample/"
112 getPath : function( name
)
114 var external
= this.externals
[ name
];
115 return CKEDITOR
.getUrl( ( external
&& external
.dir
) || this.basePath
+ name
+ '/' );
119 * Get the file path for a specific loaded resource.
120 * @param {String} name The resource name.
123 * alert( <b>CKEDITOR.plugins.getFilePath( 'sample' )</b> ); // "<editor path>/plugins/sample/plugin.js"
125 getFilePath : function( name
)
127 var external
= this.externals
[ name
];
128 return CKEDITOR
.getUrl(
129 this.getPath( name
) +
130 ( ( external
&& ( typeof external
.file
== 'string' ) ) ? external
.file
: this.fileName
+ '.js' ) );
134 * Registers one or more resources to be loaded from an external path
135 * instead of the core base path.
136 * @param {String} names The resource names, separated by commas.
137 * @param {String} path The path of the folder containing the resource.
138 * @param {String} [fileName] The resource file name. If not provided, the
139 * default name is used; If provided with a empty string, will implicitly indicates that {@param path}
140 * is already the full path.
142 * // Loads a plugin from '/myplugin/samples/plugin.js'.
143 * CKEDITOR.plugins.addExternal( 'sample', '/myplugins/sample/' );
145 * // Loads a plugin from '/myplugin/samples/my_plugin.js'.
146 * CKEDITOR.plugins.addExternal( 'sample', '/myplugins/sample/', 'my_plugin.js' );
148 * // Loads a plugin from '/myplugin/samples/my_plugin.js'.
149 * CKEDITOR.plugins.addExternal( 'sample', '/myplugins/sample/my_plugin.js', '' );
151 addExternal : function( names
, path
, fileName
)
153 names
= names
.split( ',' );
154 for ( var i
= 0 ; i
< names
.length
; i
++ )
156 var name
= names
[ i
];
158 this.externals
[ name
] =
167 * Loads one or more resources.
168 * @param {String|Array} name The name of the resource to load. It may be a
169 * string with a single resource name, or an array with several names.
170 * @param {Function} callback A function to be called when all resources
171 * are loaded. The callback will receive an array containing all
173 * @param {Object} [scope] The scope object to be used for the callback
176 * <b>CKEDITOR.plugins.load</b>( 'myplugin', function( plugins )
178 * alert( plugins['myplugin'] ); // "object"
181 load : function( names
, callback
, scope
)
183 // Ensure that we have an array of names.
184 if ( !CKEDITOR
.tools
.isArray( names
) )
185 names
= names
? [ names
] : [];
187 var loaded
= this.loaded
,
188 registered
= this.registered
,
193 // Loop through all names.
194 for ( var i
= 0 ; i
< names
.length
; i
++ )
196 var name
= names
[ i
];
201 // If not available yet.
202 if ( !loaded
[ name
] && !registered
[ name
] )
204 var url
= this.getFilePath( name
);
206 if ( !( url
in urlsNames
) )
207 urlsNames
[ url
] = [];
208 urlsNames
[ url
].push( name
);
211 resources
[ name
] = this.get( name
);
214 CKEDITOR
.scriptLoader
.load( urls
, function( completed
, failed
)
218 throw '[CKEDITOR.resourceManager.load] Resource name "' + urlsNames
[ failed
[ 0 ] ].join( ',' )
219 + '" was not found at "' + failed
[ 0 ] + '".';
222 for ( var i
= 0 ; i
< completed
.length
; i
++ )
224 var nameList
= urlsNames
[ completed
[ i
] ];
225 for ( var j
= 0 ; j
< nameList
.length
; j
++ )
227 var name
= nameList
[ j
];
228 resources
[ name
] = this.get( name
);
234 callback
.call( scope
, resources
);