summaryrefslogtreecommitdiffstats
path: root/lib/config/plugins.js
diff options
context:
space:
mode:
Diffstat (limited to 'lib/config/plugins.js')
-rw-r--r--lib/config/plugins.js67
1 files changed, 67 insertions, 0 deletions
diff --git a/lib/config/plugins.js b/lib/config/plugins.js
new file mode 100644
index 0000000..5d98736
--- /dev/null
+++ b/lib/config/plugins.js
@@ -0,0 +1,67 @@
+var _ = require('lodash');
+
+// Default plugins added to each books
+var DEFAULT_PLUGINS = ['highlight', 'search', 'sharing', 'fontsettings', 'theme-default'];
+
+// Return true if a plugin is a default plugin
+function isDefaultPlugin(name, version) {
+ return _.contains(DEFAULT_PLUGINS, name);
+}
+
+// Normalize a list of plugins to use
+function normalizePluginsList(plugins) {
+ // Normalize list to an array
+ plugins = _.isString(plugins) ? plugins.split(',') : (plugins || []);
+
+ // Remove empty parts
+ plugins = _.compact(plugins);
+
+ // Divide as {name, version} to handle format like 'myplugin@1.0.0'
+ plugins = _.map(plugins, function(plugin) {
+ if (plugin.name) return plugin;
+
+ var parts = plugin.split('@');
+ var name = parts[0];
+ var version = parts[1];
+ return {
+ 'name': name,
+ 'version': version // optional
+ };
+ });
+
+ // List plugins to remove
+ var toremove = _.chain(plugins)
+ .filter(function(plugin) {
+ return plugin.name.length > 0 && plugin.name[0] == '-';
+ })
+ .map(function(plugin) {
+ return plugin.name.slice(1);
+ })
+ .value();
+
+ // Merge with defaults
+ _.each(DEFAULT_PLUGINS, function(plugin) {
+ if (_.find(plugins, { name: plugin })) {
+ return;
+ }
+
+ plugins.push({
+ 'name': plugin
+ });
+ });
+ // Remove plugin that start with '-'
+ plugins = _.filter(plugins, function(plugin) {
+ return !_.contains(toremove, plugin.name) && !(plugin.name.length > 0 && plugin.name[0] == '-');
+ });
+
+ // Remove duplicates
+ plugins = _.uniq(plugins, 'name');
+
+ return plugins;
+}
+
+module.exports = {
+ isDefaultPlugin: isDefaultPlugin,
+ toList: normalizePluginsList
+};
+