summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lib/generate/plugin.js70
-rw-r--r--package.json4
-rw-r--r--test/plugin.js21
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);
+ });
+});