summaryrefslogtreecommitdiffstats
path: root/lib/generate/plugin.js
diff options
context:
space:
mode:
Diffstat (limited to 'lib/generate/plugin.js')
-rw-r--r--lib/generate/plugin.js25
1 files changed, 16 insertions, 9 deletions
diff --git a/lib/generate/plugin.js b/lib/generate/plugin.js
index 202d4df..c5f4187 100644
--- a/lib/generate/plugin.js
+++ b/lib/generate/plugin.js
@@ -4,13 +4,15 @@ var semver = require("semver");
var path = require("path");
var url = require("url");
var fs = require("./fs");
+var resolve = require('resolve');
var pkg = require("../../package.json");
var RESOURCES = ["js", "css"];
-var Plugin = function(name) {
+var Plugin = function(name, root) {
this.name = name;
+ this.root = root;
this.packageInfos = {};
this.infos = {};
@@ -20,16 +22,21 @@ var Plugin = function(name) {
"gitbook-"+name,
name,
], function(_name) {
- if (this.load(_name)) return false;
- }.bind(this));
+ if (this.load(_name, __dirname)) return false;
+ if (this.load(_name, path.resolve(root))) return false;
+ }, this);
};
// Load from a name
-Plugin.prototype.load = function(name) {
+Plugin.prototype.load = function(name, baseDir) {
try {
- this.packageInfos = require(name+"/package.json");
- this.infos = require(name);
+ var res = resolve.sync(name+"/package.json", { basedir: baseDir });
+
+ this.baseDir = path.dirname(res);
+ this.packageInfos = require(res);
+ this.infos = require(resolve.sync(name, { basedir: baseDir }));
this.name = name;
+
return true;
} catch (e) {
return false;
@@ -63,7 +70,7 @@ Plugin.prototype.isValid = function() {
// Resolve file path
Plugin.prototype.resolveFile = function(filename) {
- return path.resolve(path.dirname(require.resolve(this.name)), filename);
+ return path.resolve(this.baseDir, filename);
};
// Resolve file path
@@ -121,12 +128,12 @@ Plugin.normalizeNames = function(names) {
};
// Extract data from a list of plugin
-Plugin.fromList = function(names) {
+Plugin.fromList = function(names, root) {
var failed = [];
// Load plugins
var plugins = _.map(names, function(name) {
- var plugin = new Plugin(name);
+ var plugin = new Plugin(name, root);
if (!plugin.isValid()) failed.push(name);
return plugin;
});