-
Notifications
You must be signed in to change notification settings - Fork 0
/
auto_complete.js
88 lines (84 loc) · 2.75 KB
/
auto_complete.js
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
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
module.exports = (function() {
var fs = require("fs");
var yaml = require("js-yaml");
var providers = require("./plugins/providers");
var commandline = require("./commandline");
function filterInput(input, filter, caseSensitive) {
// return match level:
// 0: do not match
// 1: file contains filter
// 2: file starts with filter
if (filter === undefined) return 1;
if (!caseSensitive) {
input = input.toLowerCase();
filter = filter.toLowerCase();
}
if (input.slice(0, filter.length) == filter) return 2;
if (input.indexOf(filter) >= 0) return 1;
return 0;
}
function update(list, filter, context, caseSensitive) {
var matched = false;
context.beginUpdate();
list.forEach(function(item) {
switch (filterInput(item, filter, caseSensitive)) {
case 1:
context.update(item);
break;
case 2:
context.update(item, !matched);
matched = true;
break;
}
});
context.endUpdate();
}
var currentUpdaters = null;
var completes = {};
var complete = yaml.safeLoad(fs.readFileSync("plugins/auto_complete.yml"));
if (typeof complete.name === "string" && Array.isArray(complete.auto_completes)) {
completes[complete.name] = complete.auto_completes.filter(function(c) {
return typeof c.prefix === "object" && typeof c.prefix.regex === "string" && c.prefix.regex !== "";
}).map(function(c) {
var provider = Array.isArray(c.values) ? function(env, context, param) {
return function(cmd) {
update(c.values, cmd.args[cmd.current], context, c.case_sensitive);
};
} : providers[c.provider];
return {
prefix: new RegExp(c.prefix.regex + "$", c.prefix.case_sensitive ? "" : "i"),
provider: provider
};
});
var pos = complete.name.lastIndexOf(".");
if (pos > 0) completes[complete.name.slice(0, pos)] = completes[complete.name];
}
function getProviders(cmd) {
var complete = completes[cmd.arg0];
var prefix = cmd.args.slice(1, cmd.current).join(" ");
if (complete) {
return complete.filter(function(c) {
return c.prefix.test(prefix);
}).map(function(c) {
return c.provider;
});
}
}
return {
init: function(cmd, env, context) {
var currentProviders = getProviders(cmd);
if (!currentProviders || currentProviders.length == 0) currentProviders = [providers.file];
currentUpdaters = currentProviders.map(function(p) {
return p(env, context, update);
});
},
update: function(cmd, index) {
if (currentUpdaters !== null) {
var parsed = commandline.parse(cmd, index);
currentUpdaters.forEach(function(u) {
u(parsed);
});
}
}
};
})();