Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Avatar for KuCalc : devops.
Download
50654 views
1
// highly adapted for codemiror jshint
2
(function () {
3
"use strict";
4
5
function forEach(arr, f) {
6
for (var i = 0, e = arr.length; i < e; ++i) f(arr[i]);
7
}
8
9
function arrayContains(arr, item) {
10
if (!Array.prototype.indexOf) {
11
var i = arr.length;
12
while (i--) {
13
if (arr[i] === item) {
14
return true;
15
}
16
}
17
return false;
18
}
19
return arr.indexOf(item) != -1;
20
}
21
22
CodeMirror.contextHint = function (editor) {
23
// Find the token at the cursor
24
var cur = editor.getCursor(),
25
token = editor.getTokenAt(cur),
26
tprop = token;
27
// If it's not a 'word-style' token, ignore the token.
28
// If it is a property, find out what it is a property of.
29
var list = new Array();
30
var clist = getCompletions(token, editor);
31
for (var i = 0; i < clist.length; i++) {
32
list.push({
33
str: clist[i],
34
type: "context",
35
from: {
36
line: cur.line,
37
ch: token.start
38
},
39
to: {
40
line: cur.line,
41
ch: token.end
42
}
43
})
44
}
45
return list;
46
}
47
48
// find all 'words' of current cell
49
var getAllTokens = function (editor) {
50
var found = [];
51
52
// add to found if not already in it
53
54
55
function maybeAdd(str) {
56
if (!arrayContains(found, str)) found.push(str);
57
}
58
59
// loop through all token on all lines
60
var lineCount = editor.lineCount();
61
// loop on line
62
for (var l = 0; l < lineCount; l++) {
63
var line = editor.getLine(l);
64
//loop on char
65
for (var c = 1; c < line.length; c++) {
66
var tk = editor.getTokenAt({
67
line: l,
68
ch: c
69
});
70
// if token has a class, it has geat chances of beeing
71
// of interest. Add it to the list of possible completions.
72
// we could skip token of ClassName 'comment'
73
// or 'number' and 'operator'
74
if (tk.className != null) {
75
maybeAdd(tk.string);
76
}
77
// jump to char after end of current token
78
c = tk.end;
79
}
80
}
81
return found;
82
}
83
84
85
function getCompletions(token, editor) {
86
var candidates = getAllTokens(editor);
87
// filter all token that have a common start (but nox exactly) the lenght of the current token
88
var lambda = function (x) {
89
return (x.indexOf(token.string) == 0 && x != token.string)
90
};
91
var filterd = candidates.filter(lambda);
92
return filterd;
93
}
94
})();
95
96