mirror of
https://github.com/GitbookIO/gitbook.git
synced 2026-09-17 16:15:22 +00:00
108 lines
2.6 KiB
JavaScript
108 lines
2.6 KiB
JavaScript
var _ = require('lodash');
|
|
|
|
var Promise = require('../utils/promise');
|
|
var BookPlugin = require('./plugin');
|
|
var registry = require('./registry');
|
|
|
|
/*
|
|
PluginsManager is an interface to work with multiple plugins at once:
|
|
- Extract assets from plugins
|
|
- Call hooks for all plugins, etc
|
|
*/
|
|
|
|
function PluginsManager(book) {
|
|
this.book = book;
|
|
this.log = this.book.log;
|
|
this.plugins = [];
|
|
|
|
_.bindAll(this);
|
|
}
|
|
|
|
// Return count of plugins loaded
|
|
PluginsManager.prototype.count = function() {
|
|
return _.size(this.plugins);
|
|
};
|
|
|
|
// Returns a plugin by its name
|
|
PluginsManager.prototype.get = function(name) {
|
|
return _.find(this.plugins, {
|
|
id: name
|
|
});
|
|
};
|
|
|
|
// Load a plugin, or a list of plugins
|
|
PluginsManager.prototype.load = function(name) {
|
|
var that = this;
|
|
|
|
if (_.isArray(name)) {
|
|
return Promise.serie(name, function(_name) {
|
|
return that.load(_name);
|
|
});
|
|
}
|
|
|
|
return Promise()
|
|
|
|
// Initiate and load the plugin
|
|
.then(function() {
|
|
var plugin;
|
|
|
|
if (!_.isString(name)) plugin = name;
|
|
else plugin = new BookPlugin(that.book, name);
|
|
|
|
if (that.get(plugin.id)) {
|
|
throw new Error('Plugin "'+plugin.id+'" is already loaded');
|
|
}
|
|
|
|
|
|
if (plugin.isLoaded()) return plugin;
|
|
else return plugin.load()
|
|
.thenResolve(plugin);
|
|
})
|
|
|
|
// Setup the plugin
|
|
.then(this._setup);
|
|
};
|
|
|
|
// Load all plugins from the book's configuration
|
|
PluginsManager.prototype.loadAll = function() {
|
|
var plugins = _.pluck(this.book.config.get('plugins'), 'name');
|
|
|
|
this.log.info.ln('installing', plugins.length, 'plugins');
|
|
return this.load(plugins);
|
|
};
|
|
|
|
// Setup a plugin
|
|
// Register its filter, blocks, etc
|
|
PluginsManager.prototype._setup = function(plugin) {
|
|
this.plugins.push(plugin);
|
|
};
|
|
|
|
// Install all plugins for the book
|
|
PluginsManager.prototype.install = function() {
|
|
var that = this;
|
|
var plugins = _.filter(this.book.config.get('plugins'), {
|
|
isDefault: false
|
|
});
|
|
|
|
if (plugins.length == 0) {
|
|
this.log.info.ln('nothing to install!');
|
|
return Promise(0);
|
|
}
|
|
|
|
this.log.info.ln('installing', plugins.length, 'plugins');
|
|
|
|
return Promise.serie(plugins, function(plugin) {
|
|
return registry.install(that.book, plugin.name, plugin.version);
|
|
})
|
|
.thenResolve(plugins.length);
|
|
};
|
|
|
|
// Call a hook on all plugins to transform an input
|
|
PluginsManager.prototype.hook = function(name, input) {
|
|
return Promise.reduce(this.plugins, function(current, plugin) {
|
|
return plugin.hook(name, current);
|
|
}, input);
|
|
};
|
|
|
|
module.exports = PluginsManager;
|