// highly adapted for codemiror jshint (function () { "use strict"; function forEach(arr, f) { for (var i = 0, e = arr.length; i < e; ++i) f(arr[i]); } function arrayContains(arr, item) { if (!Array.prototype.indexOf) { var i = arr.length; while (i--) { if (arr[i] === item) {return true;} } return false; } return arr.indexOf(item) != -1; } CodeMirror.contextHint = function(editor) { // Find the token at the cursor var cur = editor.getCursor(), token = editor.getTokenAt(cur), tprop = token; // If it's not a 'word-style' token, ignore the token. // If it is a property, find out what it is a property of. var list = new Array(); var clist = getCompletions(token,editor); for(var i = 0 ; i < clist.length ; i++) { list.push( { str : clist[i], type : "context", from : {line: cur.line, ch: token.start}, to : {line: cur.line, ch: token.end} }) } return list; } // find all 'words' of current cell var getAllTokens = function(editor) { var found = []; // add to found if not already in it function maybeAdd(str) { if (!arrayContains(found, str)) found.push(str); } // loop through all token on all lines var lineCount = editor.lineCount(); // loop on line for( var l=0; l< lineCount ; l++) { var line = editor.getLine(l); //loop on char for( var c = 1 ; c < line.length ; c++) { var tk = editor.getTokenAt({line:l,ch:c}); // if token has a class, it has geat chances of beeing // of interest. Add it to the list of possible completions. // we could skip token of ClassName 'comment' // or 'number' and 'operator' if(tk.className != null){ maybeAdd(tk.string); } // jump to char after end of current token c = tk.end; } } return found; } function getCompletions(token,editor) { var candidates = getAllTokens(editor); // filter all token that have a common start (but nox exactly) the lenght of the current token var lambda = function(x){ return (x.indexOf(token.string)==0 && x != token.string) }; var filterd = candidates.filter(lambda); return filterd; } })();