You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
typesetting/pitfall/pdfkit/node_modules/codemirror/addon/hint/sql-hint.js

106 lines
2.6 KiB
JavaScript

(function () {
"use strict";
var tables;
var keywords;
function getKeywords(editor) {
var mode = editor.doc.modeOption;
if(mode === "sql") mode = "text/x-sql";
return CodeMirror.resolveMode(mode).keywords;
}
function match(string, word) {
var len = string.length;
var sub = word.substr(0, len);
return string.toUpperCase() === sub.toUpperCase();
}
function addMatches(result, search, wordlist, formatter) {
for(var word in wordlist) {
if(!wordlist.hasOwnProperty(word)) continue;
if(Array.isArray(wordlist)) {
word = wordlist[word];
}
if(match(search, word)) {
result.push(formatter(word));
}
}
}
function columnCompletion(result, editor) {
var cur = editor.getCursor();
var token = editor.getTokenAt(cur);
var string = token.string.substr(1);
var prevCur = CodeMirror.Pos(cur.line, token.start);
var table = editor.getTokenAt(prevCur).string;
var columns = tables[table];
if(!columns) {
table = findTableByAlias(table, editor);
}
columns = tables[table];
if(!columns) {
return;
}
addMatches(result, string, columns,
function(w) {return "." + w;});
}
function eachWord(line, f) {
var words = line.text.split(" ");
for(var i = 0; i < words.length; i++) {
f(words[i]);
}
}
// Tries to find possible table name from alias.
function findTableByAlias(alias, editor) {
var aliasUpperCase = alias.toUpperCase();
var previousWord = "";
var table = "";
editor.eachLine(function(line) {
eachWord(line, function(word) {
var wordUpperCase = word.toUpperCase();
if(wordUpperCase === aliasUpperCase) {
if(tables.hasOwnProperty(previousWord)) {
table = previousWord;
}
}
if(wordUpperCase !== "AS") {
previousWord = word;
}
});
});
return table;
}
function sqlHint(editor, options) {
tables = (options && options.tables) || {};
keywords = keywords || getKeywords(editor);
var cur = editor.getCursor();
var token = editor.getTokenAt(cur);
var result = [];
var search = token.string.trim();
addMatches(result, search, keywords,
function(w) {return w.toUpperCase();});
addMatches(result, search, tables,
function(w) {return w;});
if(search.lastIndexOf('.') === 0) {
columnCompletion(result, editor);
}
return {
list: result,
from: CodeMirror.Pos(cur.line, token.start),
to: CodeMirror.Pos(cur.line, token.end)
};
}
CodeMirror.registerHelper("hint", "sql", sqlHint);
})();