77 lines
2.2 KiB
JavaScript
77 lines
2.2 KiB
JavaScript
define( [
|
|
"underscore",
|
|
"extensions/notifications",
|
|
"extensions/markdown-extra",
|
|
"extensions/math-jax",
|
|
"extensions/scroll-link"
|
|
], function() {
|
|
|
|
var extensionManager = {};
|
|
|
|
// Create a map with providerId: providerObject
|
|
var extensionList = _.chain(arguments)
|
|
.map(function(argument) {
|
|
return argument && argument.extensionId && argument;
|
|
}).compact().value();
|
|
|
|
// Return every named callbacks implemented in extensions
|
|
function getExtensionCallbackList(callbackName) {
|
|
return _.chain(extensionList)
|
|
.map(function(extension) {
|
|
return extension[callbackName];
|
|
}).compact().value();
|
|
}
|
|
|
|
// Return a function that calls every callbacks from extensions
|
|
function createCallback(callbackName) {
|
|
var callbackList = getExtensionCallbackList(callbackName);
|
|
return function() {
|
|
var callbackArguments = arguments;
|
|
_.each(callbackList, function(callback) {
|
|
callback.apply(null, callbackArguments);
|
|
});
|
|
};
|
|
}
|
|
|
|
// Add a callback to the extensionManager
|
|
function addCallback(callbackName) {
|
|
extensionManager[callbackName] = createCallback(callbackName);
|
|
}
|
|
|
|
extensionManager.init = function(extensionConfigMap) {
|
|
// Set the extension configuration
|
|
extensionConfigMap = extensionConfigMap || {};
|
|
_.each(extensionList, function(extension) {
|
|
extension.config = _.extend({}, extension.defaultConfig, extensionConfigMap[extension.extensionId]);
|
|
});
|
|
};
|
|
|
|
addCallback("onReady");
|
|
addCallback("onMessage");
|
|
addCallback("onError");
|
|
addCallback("onOfflineChanged");
|
|
addCallback("onLayoutConfigure");
|
|
addCallback("onLayoutCreated");
|
|
addCallback("onEditorConfigure");
|
|
|
|
var onPreviewFinished = createCallback("onPreviewFinished");
|
|
var onAsyncPreviewCallbackList = getExtensionCallbackList("onAsyncPreview");
|
|
extensionManager["onAsyncPreview"] = function() {
|
|
// Call onPreviewFinished callbacks when all async preview are finished
|
|
var counter = 0;
|
|
function tryFinished() {
|
|
if(counter === onAsyncPreviewCallbackList.length) {
|
|
onPreviewFinished();
|
|
}
|
|
}
|
|
_.each(onAsyncPreviewCallbackList, function(asyncPreviewCallback) {
|
|
asyncPreviewCallback(function() {
|
|
counter++;
|
|
tryFinished();
|
|
});
|
|
});
|
|
tryFinished();
|
|
};
|
|
|
|
return extensionManager;
|
|
}); |