diff options
-rw-r--r-- | lib/generate/plugin.js | 70 | ||||
-rw-r--r-- | package.json | 4 | ||||
-rw-r--r-- | test/plugin.js | 21 |
3 files changed, 92 insertions, 3 deletions
diff --git a/lib/generate/plugin.js b/lib/generate/plugin.js index bc131c6..a39fc65 100644 --- a/lib/generate/plugin.js +++ b/lib/generate/plugin.js @@ -1,3 +1,5 @@ +var _ = require("lodash"); +var Q = require("q"); var semver = require("semver"); var fs = require("./fs"); @@ -6,14 +8,38 @@ var pkg = require("../../package.json"); var Plugin = function(name) { this.name = name; this.packageInfos = {}; + this.infos = {}; + _.each([ + name, + "gitbook-plugin-"+name, + "gitbook-theme-"+name + ], function(_name) { + if (this.load(_name)) return false; + }.bind(this)); +}; + +// Load from a name +Plugin.prototype.load = function(name) { try { this.packageInfos = require(name+"/package.json"); + this.infos = require(name); + this.name = name; + + return true; } catch (e) { - this.packageInfos = {}; + return false; } }; +// Return resources +Plugin.prototype.getResources = function(resource) { + if (!this.infos.book || !this.infos.book[resource]) { + return []; + } + return this.infos.book[resource]; +}; + // Test if it's a valid plugin Plugin.prototype.isValid = function() { return ( @@ -25,4 +51,46 @@ Plugin.prototype.isValid = function() { ); }; +// Extract data from a list of plugin +Plugin.fromList = function(names) { + var failed = []; + + // Load plugins + var plugins = _.map(names, function(name) { + var plugin = new Plugin(name); + if (!plugin.isValid()) failed.push(name); + return plugin; + }); + + if (_.size(failed) > 0) return Q.reject(new Error("Error loading plugins: "+failed.join(":"))); + + // Get all resources + var resources = _.chain([ + "js", "css" + ]) + .map(function(resource) { + return [ + resource, + _.chain(plugins) + .map(function(plugin) { + return plugin.getResources(resource); + }) + .flatten() + .value() + ]; + }) + .object() + .value(); + + return Q({ + 'plugins': plugins, + 'resources': resources + }); +}; + +// Default plugins +Plugin.defaults = [ + "mixpanel" +]; + module.exports = Plugin;
\ No newline at end of file diff --git a/package.json b/package.json index 42a520c..686bbb7 100644 --- a/package.json +++ b/package.json @@ -18,7 +18,9 @@ "highlight.js": "8.0.0", "tmp": "0.0.23", "semver": "2.2.1", - "gitbook-plugin": "0.0.1" + + "gitbook-plugin": "0.0.1", + "gitbook-plugin-mixpanel": "0.0.1" }, "devDependencies": { "mocha": "1.18.2", diff --git a/test/plugin.js b/test/plugin.js index 62fc039..b4e2102 100644 --- a/test/plugin.js +++ b/test/plugin.js @@ -4,10 +4,29 @@ var assert = require('assert'); var Plugin = require('../').generate.Plugin; -describe('Plugin loading', function () { +describe('Plugin validation', function () { var plugin = new Plugin("gitbook-plugin"); it('should be valid', function() { assert(plugin.isValid()); }); }); + +describe('Plugin defaults loading', function () { + var ret = true; + + beforeEach(function(done){ + Plugin.fromList(Plugin.defaults) + .then(function(_r) { + ret = _r; + }, function(err) { + ret = null; + }) + .fin(done); + }); + + + it('should load defaults addons', function() { + assert(ret != null); + }); +}); |