summaryrefslogtreecommitdiffstats
path: root/lib/config/plugins.js
blob: 24f00411f9231668c20a668d5a8978ba240ff8ef (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
var _ = require('lodash');

// Default plugins added to each books
var DEFAULT_PLUGINS = ['highlight', 'search', 'lunr', '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.slice(1).join('@');
        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
};