annotate .cms/lib/codemirror/addon/hint/sql-hint.js @ 1:1d486627aa1e draft default tip

24.10
author Coffee CMS <info@coffee-cms.ru>
date Sat, 12 Oct 2024 02:51:39 +0000
parents 78edf6b517a0
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
1 // CodeMirror, copyright (c) by Marijn Haverbeke and others
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
2 // Distributed under an MIT license: https://codemirror.net/5/LICENSE
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
3
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
4 (function(mod) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
5 if (typeof exports == "object" && typeof module == "object") // CommonJS
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
6 mod(require("../../lib/codemirror"), require("../../mode/sql/sql"));
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
7 else if (typeof define == "function" && define.amd) // AMD
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
8 define(["../../lib/codemirror", "../../mode/sql/sql"], mod);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
9 else // Plain browser env
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
10 mod(CodeMirror);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
11 })(function(CodeMirror) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
12 "use strict";
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
13
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
14 var tables;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
15 var defaultTable;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
16 var keywords;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
17 var identifierQuote;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
18 var CONS = {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
19 QUERY_DIV: ";",
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
20 ALIAS_KEYWORD: "AS"
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
21 };
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
22 var Pos = CodeMirror.Pos, cmpPos = CodeMirror.cmpPos;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
23
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
24 function isArray(val) { return Object.prototype.toString.call(val) == "[object Array]" }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
25
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
26 function getModeConf(editor, field) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
27 return editor.getModeAt(editor.getCursor()).config[field] || CodeMirror.resolveMode("text/x-sql")[field]
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
28 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
29
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
30 function getKeywords(editor) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
31 return getModeConf(editor, "keywords") || []
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
32 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
33
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
34 function getIdentifierQuote(editor) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
35 return getModeConf(editor, "identifierQuote") || "`";
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
36 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
37
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
38 function getText(item) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
39 return typeof item == "string" ? item : item.text;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
40 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
41
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
42 function wrapTable(name, value) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
43 if (isArray(value)) value = {columns: value}
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
44 if (!value.text) value.text = name
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
45 return value
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
46 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
47
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
48 function parseTables(input) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
49 var result = {}
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
50 if (isArray(input)) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
51 for (var i = input.length - 1; i >= 0; i--) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
52 var item = input[i]
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
53 result[getText(item).toUpperCase()] = wrapTable(getText(item), item)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
54 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
55 } else if (input) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
56 for (var name in input)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
57 result[name.toUpperCase()] = wrapTable(name, input[name])
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
58 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
59 return result
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
60 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
61
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
62 function getTable(name) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
63 return tables[name.toUpperCase()]
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
64 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
65
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
66 function shallowClone(object) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
67 var result = {};
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
68 for (var key in object) if (object.hasOwnProperty(key))
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
69 result[key] = object[key];
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
70 return result;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
71 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
72
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
73 function match(string, word) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
74 var len = string.length;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
75 var sub = getText(word).substr(0, len);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
76 return string.toUpperCase() === sub.toUpperCase();
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
77 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
78
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
79 function addMatches(result, search, wordlist, formatter) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
80 if (isArray(wordlist)) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
81 for (var i = 0; i < wordlist.length; i++)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
82 if (match(search, wordlist[i])) result.push(formatter(wordlist[i]))
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
83 } else {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
84 for (var word in wordlist) if (wordlist.hasOwnProperty(word)) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
85 var val = wordlist[word]
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
86 if (!val || val === true)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
87 val = word
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
88 else
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
89 val = val.displayText ? {text: val.text, displayText: val.displayText} : val.text
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
90 if (match(search, val)) result.push(formatter(val))
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
91 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
92 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
93 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
94
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
95 function cleanName(name) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
96 // Get rid name from identifierQuote and preceding dot(.)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
97 if (name.charAt(0) == ".") {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
98 name = name.substr(1);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
99 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
100 // replace duplicated identifierQuotes with single identifierQuotes
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
101 // and remove single identifierQuotes
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
102 var nameParts = name.split(identifierQuote+identifierQuote);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
103 for (var i = 0; i < nameParts.length; i++)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
104 nameParts[i] = nameParts[i].replace(new RegExp(identifierQuote,"g"), "");
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
105 return nameParts.join(identifierQuote);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
106 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
107
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
108 function insertIdentifierQuotes(name) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
109 var nameParts = getText(name).split(".");
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
110 for (var i = 0; i < nameParts.length; i++)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
111 nameParts[i] = identifierQuote +
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
112 // duplicate identifierQuotes
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
113 nameParts[i].replace(new RegExp(identifierQuote,"g"), identifierQuote+identifierQuote) +
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
114 identifierQuote;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
115 var escaped = nameParts.join(".");
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
116 if (typeof name == "string") return escaped;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
117 name = shallowClone(name);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
118 name.text = escaped;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
119 return name;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
120 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
121
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
122 function nameCompletion(cur, token, result, editor) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
123 // Try to complete table, column names and return start position of completion
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
124 var useIdentifierQuotes = false;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
125 var nameParts = [];
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
126 var start = token.start;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
127 var cont = true;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
128 while (cont) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
129 cont = (token.string.charAt(0) == ".");
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
130 useIdentifierQuotes = useIdentifierQuotes || (token.string.charAt(0) == identifierQuote);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
131
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
132 start = token.start;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
133 nameParts.unshift(cleanName(token.string));
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
134
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
135 token = editor.getTokenAt(Pos(cur.line, token.start));
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
136 if (token.string == ".") {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
137 cont = true;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
138 token = editor.getTokenAt(Pos(cur.line, token.start));
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
139 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
140 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
141
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
142 // Try to complete table names
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
143 var string = nameParts.join(".");
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
144 addMatches(result, string, tables, function(w) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
145 return useIdentifierQuotes ? insertIdentifierQuotes(w) : w;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
146 });
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
147
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
148 // Try to complete columns from defaultTable
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
149 addMatches(result, string, defaultTable, function(w) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
150 return useIdentifierQuotes ? insertIdentifierQuotes(w) : w;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
151 });
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
152
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
153 // Try to complete columns
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
154 string = nameParts.pop();
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
155 var table = nameParts.join(".");
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
156
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
157 var alias = false;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
158 var aliasTable = table;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
159 // Check if table is available. If not, find table by Alias
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
160 if (!getTable(table)) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
161 var oldTable = table;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
162 table = findTableByAlias(table, editor);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
163 if (table !== oldTable) alias = true;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
164 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
165
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
166 var columns = getTable(table);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
167 if (columns && columns.columns)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
168 columns = columns.columns;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
169
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
170 if (columns) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
171 addMatches(result, string, columns, function(w) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
172 var tableInsert = table;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
173 if (alias == true) tableInsert = aliasTable;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
174 if (typeof w == "string") {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
175 w = tableInsert + "." + w;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
176 } else {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
177 w = shallowClone(w);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
178 w.text = tableInsert + "." + w.text;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
179 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
180 return useIdentifierQuotes ? insertIdentifierQuotes(w) : w;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
181 });
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
182 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
183
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
184 return start;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
185 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
186
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
187 function eachWord(lineText, f) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
188 var words = lineText.split(/\s+/)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
189 for (var i = 0; i < words.length; i++)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
190 if (words[i]) f(words[i].replace(/[`,;]/g, ''))
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
191 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
192
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
193 function findTableByAlias(alias, editor) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
194 var doc = editor.doc;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
195 var fullQuery = doc.getValue();
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
196 var aliasUpperCase = alias.toUpperCase();
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
197 var previousWord = "";
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
198 var table = "";
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
199 var separator = [];
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
200 var validRange = {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
201 start: Pos(0, 0),
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
202 end: Pos(editor.lastLine(), editor.getLineHandle(editor.lastLine()).length)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
203 };
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
204
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
205 //add separator
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
206 var indexOfSeparator = fullQuery.indexOf(CONS.QUERY_DIV);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
207 while(indexOfSeparator != -1) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
208 separator.push(doc.posFromIndex(indexOfSeparator));
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
209 indexOfSeparator = fullQuery.indexOf(CONS.QUERY_DIV, indexOfSeparator+1);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
210 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
211 separator.unshift(Pos(0, 0));
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
212 separator.push(Pos(editor.lastLine(), editor.getLineHandle(editor.lastLine()).text.length));
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
213
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
214 //find valid range
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
215 var prevItem = null;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
216 var current = editor.getCursor()
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
217 for (var i = 0; i < separator.length; i++) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
218 if ((prevItem == null || cmpPos(current, prevItem) > 0) && cmpPos(current, separator[i]) <= 0) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
219 validRange = {start: prevItem, end: separator[i]};
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
220 break;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
221 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
222 prevItem = separator[i];
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
223 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
224
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
225 if (validRange.start) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
226 var query = doc.getRange(validRange.start, validRange.end, false);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
227
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
228 for (var i = 0; i < query.length; i++) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
229 var lineText = query[i];
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
230 eachWord(lineText, function(word) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
231 var wordUpperCase = word.toUpperCase();
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
232 if (wordUpperCase === aliasUpperCase && getTable(previousWord))
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
233 table = previousWord;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
234 if (wordUpperCase !== CONS.ALIAS_KEYWORD)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
235 previousWord = word;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
236 });
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
237 if (table) break;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
238 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
239 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
240 return table;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
241 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
242
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
243 CodeMirror.registerHelper("hint", "sql", function(editor, options) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
244 tables = parseTables(options && options.tables)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
245 var defaultTableName = options && options.defaultTable;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
246 var disableKeywords = options && options.disableKeywords;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
247 defaultTable = defaultTableName && getTable(defaultTableName);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
248 keywords = getKeywords(editor);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
249 identifierQuote = getIdentifierQuote(editor);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
250
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
251 if (defaultTableName && !defaultTable)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
252 defaultTable = findTableByAlias(defaultTableName, editor);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
253
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
254 defaultTable = defaultTable || [];
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
255
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
256 if (defaultTable.columns)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
257 defaultTable = defaultTable.columns;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
258
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
259 var cur = editor.getCursor();
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
260 var result = [];
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
261 var token = editor.getTokenAt(cur), start, end, search;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
262 if (token.end > cur.ch) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
263 token.end = cur.ch;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
264 token.string = token.string.slice(0, cur.ch - token.start);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
265 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
266
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
267 if (token.string.match(/^[.`"'\w@][\w$#]*$/g)) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
268 search = token.string;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
269 start = token.start;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
270 end = token.end;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
271 } else {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
272 start = end = cur.ch;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
273 search = "";
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
274 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
275 if (search.charAt(0) == "." || search.charAt(0) == identifierQuote) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
276 start = nameCompletion(cur, token, result, editor);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
277 } else {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
278 var objectOrClass = function(w, className) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
279 if (typeof w === "object") {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
280 w.className = className;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
281 } else {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
282 w = { text: w, className: className };
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
283 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
284 return w;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
285 };
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
286 addMatches(result, search, defaultTable, function(w) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
287 return objectOrClass(w, "CodeMirror-hint-table CodeMirror-hint-default-table");
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
288 });
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
289 addMatches(
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
290 result,
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
291 search,
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
292 tables, function(w) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
293 return objectOrClass(w, "CodeMirror-hint-table");
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
294 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
295 );
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
296 if (!disableKeywords)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
297 addMatches(result, search, keywords, function(w) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
298 return objectOrClass(w.toUpperCase(), "CodeMirror-hint-keyword");
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
299 });
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
300 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
301
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
302 return {list: result, from: Pos(cur.line, start), to: Pos(cur.line, end)};
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
303 });
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
304 });