PluginProbe ʕ •ᴥ•ʔ
SiteOrigin CSS / 1.0.2
SiteOrigin CSS v1.0.2
1.2.1 1.2.10 1.2.11 1.2.12 1.2.13 1.2.14 1.2.2 1.2.3 1.2.4 1.2.5 1.2.6 1.2.7 1.2.8 1.2.9 1.3.0 1.3.1 1.3.2 1.4.0 1.4.1 1.4.2 1.4.3 1.5.0 1.5.1 1.5.10 1.5.11 1.5.2 1.5.3 1.5.4 1.5.5 1.5.6 1.5.7 1.5.8 1.5.9 1.6.0 1.6.1 1.6.2 1.6.3 1.6.4 1.6.5 1.6.6 trunk 1.0 1.0.1 1.0.2 1.0.3 1.0.4 1.0.5 1.0.6 1.0.7 1.0.8 1.1 1.1.1 1.1.2 1.1.3 1.1.4 1.1.5 1.2.0
so-css / lib / codemirror / addon / hint / sql-hint.js
so-css / lib / codemirror / addon / hint Last commit date
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.js
246 lines
1 // CodeMirror, copyright (c) by Marijn Haverbeke and others
2 // Distributed under an MIT license: http://codemirror.net/LICENSE
3
4 (function(mod) {
5 if (typeof exports == "object" && typeof module == "object") // CommonJS
6 mod(require("../../lib/codemirror"), require("../../mode/sql/sql"));
7 else if (typeof define == "function" && define.amd) // AMD
8 define(["../../lib/codemirror", "../../mode/sql/sql"], mod);
9 else // Plain browser env
10 mod(CodeMirror);
11 })(function(CodeMirror) {
12 "use strict";
13
14 var tables;
15 var defaultTable;
16 var keywords;
17 var CONS = {
18 QUERY_DIV: ";",
19 ALIAS_KEYWORD: "AS"
20 };
21 var Pos = CodeMirror.Pos;
22
23 function getKeywords(editor) {
24 var mode = editor.doc.modeOption;
25 if (mode === "sql") mode = "text/x-sql";
26 return CodeMirror.resolveMode(mode).keywords;
27 }
28
29 function getText(item) {
30 return typeof item == "string" ? item : item.text;
31 }
32
33 function getItem(list, item) {
34 if (!list.slice) return list[item];
35 for (var i = list.length - 1; i >= 0; i--) if (getText(list[i]) == item)
36 return list[i];
37 }
38
39 function shallowClone(object) {
40 var result = {};
41 for (var key in object) if (object.hasOwnProperty(key))
42 result[key] = object[key];
43 return result;
44 }
45
46 function match(string, word) {
47 var len = string.length;
48 var sub = getText(word).substr(0, len);
49 return string.toUpperCase() === sub.toUpperCase();
50 }
51
52 function addMatches(result, search, wordlist, formatter) {
53 for (var word in wordlist) {
54 if (!wordlist.hasOwnProperty(word)) continue;
55 if (wordlist.slice) word = wordlist[word];
56
57 if (match(search, word)) result.push(formatter(word));
58 }
59 }
60
61 function cleanName(name) {
62 // Get rid name from backticks(`) and preceding dot(.)
63 if (name.charAt(0) == ".") {
64 name = name.substr(1);
65 }
66 return name.replace(/`/g, "");
67 }
68
69 function insertBackticks(name) {
70 var nameParts = getText(name).split(".");
71 for (var i = 0; i < nameParts.length; i++)
72 nameParts[i] = "`" + nameParts[i] + "`";
73 var escaped = nameParts.join(".");
74 if (typeof name == "string") return escaped;
75 name = shallowClone(name);
76 name.text = escaped;
77 return name;
78 }
79
80 function nameCompletion(cur, token, result, editor) {
81 // Try to complete table, colunm names and return start position of completion
82 var useBacktick = false;
83 var nameParts = [];
84 var start = token.start;
85 var cont = true;
86 while (cont) {
87 cont = (token.string.charAt(0) == ".");
88 useBacktick = useBacktick || (token.string.charAt(0) == "`");
89
90 start = token.start;
91 nameParts.unshift(cleanName(token.string));
92
93 token = editor.getTokenAt(Pos(cur.line, token.start));
94 if (token.string == ".") {
95 cont = true;
96 token = editor.getTokenAt(Pos(cur.line, token.start));
97 }
98 }
99
100 // Try to complete table names
101 var string = nameParts.join(".");
102 addMatches(result, string, tables, function(w) {
103 return useBacktick ? insertBackticks(w) : w;
104 });
105
106 // Try to complete columns from defaultTable
107 addMatches(result, string, defaultTable, function(w) {
108 return useBacktick ? insertBackticks(w) : w;
109 });
110
111 // Try to complete columns
112 string = nameParts.pop();
113 var table = nameParts.join(".");
114
115 // Check if table is available. If not, find table by Alias
116 if (!getItem(tables, table))
117 table = findTableByAlias(table, editor);
118
119 var columns = getItem(tables, table);
120 if (columns && columns.columns)
121 columns = columns.columns;
122
123 if (columns) {
124 addMatches(result, string, columns, function(w) {
125 if (typeof w == "string") {
126 w = table + "." + w;
127 } else {
128 w = shallowClone(w);
129 w.text = table + "." + w.text;
130 }
131 return useBacktick ? insertBackticks(w) : w;
132 });
133 }
134
135 return start;
136 }
137
138 function eachWord(lineText, f) {
139 if (!lineText) return;
140 var excepted = /[,;]/g;
141 var words = lineText.split(" ");
142 for (var i = 0; i < words.length; i++) {
143 f(words[i]?words[i].replace(excepted, '') : '');
144 }
145 }
146
147 function convertCurToNumber(cur) {
148 // max characters of a line is 999,999.
149 return cur.line + cur.ch / Math.pow(10, 6);
150 }
151
152 function convertNumberToCur(num) {
153 return Pos(Math.floor(num), +num.toString().split('.').pop());
154 }
155
156 function findTableByAlias(alias, editor) {
157 var doc = editor.doc;
158 var fullQuery = doc.getValue();
159 var aliasUpperCase = alias.toUpperCase();
160 var previousWord = "";
161 var table = "";
162 var separator = [];
163 var validRange = {
164 start: Pos(0, 0),
165 end: Pos(editor.lastLine(), editor.getLineHandle(editor.lastLine()).length)
166 };
167
168 //add separator
169 var indexOfSeparator = fullQuery.indexOf(CONS.QUERY_DIV);
170 while(indexOfSeparator != -1) {
171 separator.push(doc.posFromIndex(indexOfSeparator));
172 indexOfSeparator = fullQuery.indexOf(CONS.QUERY_DIV, indexOfSeparator+1);
173 }
174 separator.unshift(Pos(0, 0));
175 separator.push(Pos(editor.lastLine(), editor.getLineHandle(editor.lastLine()).text.length));
176
177 //find valid range
178 var prevItem = 0;
179 var current = convertCurToNumber(editor.getCursor());
180 for (var i=0; i< separator.length; i++) {
181 var _v = convertCurToNumber(separator[i]);
182 if (current > prevItem && current <= _v) {
183 validRange = { start: convertNumberToCur(prevItem), end: convertNumberToCur(_v) };
184 break;
185 }
186 prevItem = _v;
187 }
188
189 var query = doc.getRange(validRange.start, validRange.end, false);
190
191 for (var i = 0; i < query.length; i++) {
192 var lineText = query[i];
193 eachWord(lineText, function(word) {
194 var wordUpperCase = word.toUpperCase();
195 if (wordUpperCase === aliasUpperCase && getItem(tables, previousWord))
196 table = previousWord;
197 if (wordUpperCase !== CONS.ALIAS_KEYWORD)
198 previousWord = word;
199 });
200 if (table) break;
201 }
202 return table;
203 }
204
205 CodeMirror.registerHelper("hint", "sql", function(editor, options) {
206 tables = (options && options.tables) || {};
207 var defaultTableName = options && options.defaultTable;
208 defaultTable = defaultTableName && getItem(tables, defaultTableName);
209 keywords = keywords || getKeywords(editor);
210
211 if (defaultTableName && !defaultTable)
212 defaultTable = findTableByAlias(defaultTableName, editor);
213
214 defaultTable = defaultTable || [];
215
216 if (defaultTable.columns)
217 defaultTable = defaultTable.columns;
218
219 var cur = editor.getCursor();
220 var result = [];
221 var token = editor.getTokenAt(cur), start, end, search;
222 if (token.end > cur.ch) {
223 token.end = cur.ch;
224 token.string = token.string.slice(0, cur.ch - token.start);
225 }
226
227 if (token.string.match(/^[.`\w@]\w*$/)) {
228 search = token.string;
229 start = token.start;
230 end = token.end;
231 } else {
232 start = end = cur.ch;
233 search = "";
234 }
235 if (search.charAt(0) == "." || search.charAt(0) == "`") {
236 start = nameCompletion(cur, token, result, editor);
237 } else {
238 addMatches(result, search, tables, function(w) {return w;});
239 addMatches(result, search, defaultTable, function(w) {return w;});
240 addMatches(result, search, keywords, function(w) {return w.toUpperCase();});
241 }
242
243 return {list: result, from: Pos(cur.line, start), to: Pos(cur.line, end)};
244 });
245 });
246