anyword-hint.js
11 years ago
anyword-hint.min.js
11 years ago
css-hint.js
11 years ago
css-hint.min.js
11 years ago
html-hint.js
11 years ago
html-hint.min.js
11 years ago
javascript-hint.js
11 years ago
javascript-hint.min.js
11 years ago
show-hint.css
11 years ago
show-hint.js
11 years ago
show-hint.min.js
11 years ago
sql-hint.js
11 years ago
sql-hint.min.js
11 years ago
xml-hint.js
11 years ago
xml-hint.min.js
11 years ago
sql-hint.min.js
38 lines
| 1 | |
| 2 | (function(mod){if(typeof exports=="object"&&typeof module=="object") |
| 3 | mod(require("../../lib/codemirror"),require("../../mode/sql/sql"));else if(typeof define=="function"&&define.amd) |
| 4 | define(["../../lib/codemirror","../../mode/sql/sql"],mod);else |
| 5 | mod(CodeMirror);})(function(CodeMirror){"use strict";var tables;var defaultTable;var keywords;var CONS={QUERY_DIV:";",ALIAS_KEYWORD:"AS"};var Pos=CodeMirror.Pos;function getKeywords(editor){var mode=editor.doc.modeOption;if(mode==="sql")mode="text/x-sql";return CodeMirror.resolveMode(mode).keywords;} |
| 6 | function getText(item){return typeof item=="string"?item:item.text;} |
| 7 | function getItem(list,item){if(!list.slice)return list[item];for(var i=list.length-1;i>=0;i--)if(getText(list[i])==item) |
| 8 | return list[i];} |
| 9 | function shallowClone(object){var result={};for(var key in object)if(object.hasOwnProperty(key)) |
| 10 | result[key]=object[key];return result;} |
| 11 | function match(string,word){var len=string.length;var sub=getText(word).substr(0,len);return string.toUpperCase()===sub.toUpperCase();} |
| 12 | function addMatches(result,search,wordlist,formatter){for(var word in wordlist){if(!wordlist.hasOwnProperty(word))continue;if(wordlist.slice)word=wordlist[word];if(match(search,word))result.push(formatter(word));}} |
| 13 | function cleanName(name){if(name.charAt(0)=="."){name=name.substr(1);} |
| 14 | return name.replace(/`/g,"");} |
| 15 | function insertBackticks(name){var nameParts=getText(name).split(".");for(var i=0;i<nameParts.length;i++) |
| 16 | nameParts[i]="`"+nameParts[i]+"`";var escaped=nameParts.join(".");if(typeof name=="string")return escaped;name=shallowClone(name);name.text=escaped;return name;} |
| 17 | function nameCompletion(cur,token,result,editor){var useBacktick=false;var nameParts=[];var start=token.start;var cont=true;while(cont){cont=(token.string.charAt(0)==".");useBacktick=useBacktick||(token.string.charAt(0)=="`");start=token.start;nameParts.unshift(cleanName(token.string));token=editor.getTokenAt(Pos(cur.line,token.start));if(token.string=="."){cont=true;token=editor.getTokenAt(Pos(cur.line,token.start));}} |
| 18 | var string=nameParts.join(".");addMatches(result,string,tables,function(w){return useBacktick?insertBackticks(w):w;});addMatches(result,string,defaultTable,function(w){return useBacktick?insertBackticks(w):w;});string=nameParts.pop();var table=nameParts.join(".");if(!getItem(tables,table)) |
| 19 | table=findTableByAlias(table,editor);var columns=getItem(tables,table);if(columns&&columns.columns) |
| 20 | columns=columns.columns;if(columns){addMatches(result,string,columns,function(w){if(typeof w=="string"){w=table+"."+w;}else{w=shallowClone(w);w.text=table+"."+w.text;} |
| 21 | return useBacktick?insertBackticks(w):w;});} |
| 22 | return start;} |
| 23 | function eachWord(lineText,f){if(!lineText)return;var excepted=/[,;]/g;var words=lineText.split(" ");for(var i=0;i<words.length;i++){f(words[i]?words[i].replace(excepted,''):'');}} |
| 24 | function convertCurToNumber(cur){return cur.line+cur.ch/Math.pow(10,6);} |
| 25 | function convertNumberToCur(num){return Pos(Math.floor(num),+num.toString().split('.').pop());} |
| 26 | function findTableByAlias(alias,editor){var doc=editor.doc;var fullQuery=doc.getValue();var aliasUpperCase=alias.toUpperCase();var previousWord="";var table="";var separator=[];var validRange={start:Pos(0,0),end:Pos(editor.lastLine(),editor.getLineHandle(editor.lastLine()).length)};var indexOfSeparator=fullQuery.indexOf(CONS.QUERY_DIV);while(indexOfSeparator!=-1){separator.push(doc.posFromIndex(indexOfSeparator));indexOfSeparator=fullQuery.indexOf(CONS.QUERY_DIV,indexOfSeparator+1);} |
| 27 | separator.unshift(Pos(0,0));separator.push(Pos(editor.lastLine(),editor.getLineHandle(editor.lastLine()).text.length));var prevItem=0;var current=convertCurToNumber(editor.getCursor());for(var i=0;i<separator.length;i++){var _v=convertCurToNumber(separator[i]);if(current>prevItem&¤t<=_v){validRange={start:convertNumberToCur(prevItem),end:convertNumberToCur(_v)};break;} |
| 28 | prevItem=_v;} |
| 29 | var query=doc.getRange(validRange.start,validRange.end,false);for(var i=0;i<query.length;i++){var lineText=query[i];eachWord(lineText,function(word){var wordUpperCase=word.toUpperCase();if(wordUpperCase===aliasUpperCase&&getItem(tables,previousWord)) |
| 30 | table=previousWord;if(wordUpperCase!==CONS.ALIAS_KEYWORD) |
| 31 | previousWord=word;});if(table)break;} |
| 32 | return table;} |
| 33 | CodeMirror.registerHelper("hint","sql",function(editor,options){tables=(options&&options.tables)||{};var defaultTableName=options&&options.defaultTable;defaultTable=defaultTableName&&getItem(tables,defaultTableName);keywords=keywords||getKeywords(editor);if(defaultTableName&&!defaultTable) |
| 34 | defaultTable=findTableByAlias(defaultTableName,editor);defaultTable=defaultTable||[];if(defaultTable.columns) |
| 35 | defaultTable=defaultTable.columns;var cur=editor.getCursor();var result=[];var token=editor.getTokenAt(cur),start,end,search;if(token.end>cur.ch){token.end=cur.ch;token.string=token.string.slice(0,cur.ch-token.start);} |
| 36 | if(token.string.match(/^[.`\w@]\w*$/)){search=token.string;start=token.start;end=token.end;}else{start=end=cur.ch;search="";} |
| 37 | if(search.charAt(0)=="."||search.charAt(0)=="`"){start=nameCompletion(cur,token,result,editor);}else{addMatches(result,search,tables,function(w){return w;});addMatches(result,search,defaultTable,function(w){return w;});addMatches(result,search,keywords,function(w){return w.toUpperCase();});} |
| 38 | return{list:result,from:Pos(cur.line,start),to:Pos(cur.line,end)};});}); |