codemirror-rails 3.18 → 3.19
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/codemirror/rails/version.rb +2 -2
- data/vendor/assets/javascripts/codemirror.js +42 -19
- data/vendor/assets/javascripts/codemirror/addons/edit/closetag.js +1 -1
- data/vendor/assets/javascripts/codemirror/addons/edit/continuelist.js +1 -1
- data/vendor/assets/javascripts/codemirror/addons/fold/foldcode.js +6 -4
- data/vendor/assets/javascripts/codemirror/addons/fold/foldgutter.js +2 -0
- data/vendor/assets/javascripts/codemirror/addons/fold/indent-fold.js +21 -7
- data/vendor/assets/javascripts/codemirror/addons/hint/javascript-hint.js +3 -19
- data/vendor/assets/javascripts/codemirror/addons/hint/sql-hint.js +105 -0
- data/vendor/assets/javascripts/codemirror/addons/hint/xml-hint.js +1 -0
- data/vendor/assets/javascripts/codemirror/addons/search/search.js +2 -0
- data/vendor/assets/javascripts/codemirror/addons/tern/tern.js +1 -1
- data/vendor/assets/javascripts/codemirror/addons/wrap/hardwrap.js +99 -0
- data/vendor/assets/javascripts/codemirror/keymaps/vim.js +55 -17
- data/vendor/assets/javascripts/codemirror/modes/coffeescript.js +314 -313
- data/vendor/assets/javascripts/codemirror/modes/css.js +19 -7
- data/vendor/assets/javascripts/codemirror/modes/eiffel.js +147 -0
- data/vendor/assets/javascripts/codemirror/modes/gfm.js +2 -1
- data/vendor/assets/javascripts/codemirror/modes/gherkin.js +168 -0
- data/vendor/assets/javascripts/codemirror/modes/less.js +110 -22
- data/vendor/assets/javascripts/codemirror/modes/php.js +4 -4
- data/vendor/assets/javascripts/codemirror/modes/smartymixed.js +6 -1
- data/vendor/assets/javascripts/codemirror/modes/sql.js +15 -2
- data/vendor/assets/javascripts/codemirror/modes/xml.js +7 -3
- data/vendor/assets/stylesheets/codemirror.css +1 -1
- data/vendor/assets/stylesheets/codemirror/addons/fold/foldgutter.css +21 -0
- data/vendor/assets/stylesheets/codemirror/addons/lint/lint.css +1 -0
- data/vendor/assets/stylesheets/codemirror/themes/3024-day.css +1 -1
- data/vendor/assets/stylesheets/codemirror/themes/3024-night.css +1 -1
- data/vendor/assets/stylesheets/codemirror/themes/ambiance.css +1 -1
- data/vendor/assets/stylesheets/codemirror/themes/base16-dark.css +1 -1
- data/vendor/assets/stylesheets/codemirror/themes/base16-light.css +1 -1
- data/vendor/assets/stylesheets/codemirror/themes/blackboard.css +1 -1
- data/vendor/assets/stylesheets/codemirror/themes/cobalt.css +1 -1
- data/vendor/assets/stylesheets/codemirror/themes/eclipse.css +1 -1
- data/vendor/assets/stylesheets/codemirror/themes/elegant.css +1 -1
- data/vendor/assets/stylesheets/codemirror/themes/erlang-dark.css +1 -1
- data/vendor/assets/stylesheets/codemirror/themes/lesser-dark.css +1 -1
- data/vendor/assets/stylesheets/codemirror/themes/mbo.css +35 -0
- data/vendor/assets/stylesheets/codemirror/themes/midnight.css +1 -1
- data/vendor/assets/stylesheets/codemirror/themes/monokai.css +1 -1
- data/vendor/assets/stylesheets/codemirror/themes/night.css +1 -1
- data/vendor/assets/stylesheets/codemirror/themes/paraiso-dark.css +1 -1
- data/vendor/assets/stylesheets/codemirror/themes/paraiso-light.css +1 -1
- data/vendor/assets/stylesheets/codemirror/themes/rubyblue.css +1 -1
- data/vendor/assets/stylesheets/codemirror/themes/solarized.css +7 -7
- data/vendor/assets/stylesheets/codemirror/themes/the-matrix.css +1 -1
- data/vendor/assets/stylesheets/codemirror/themes/tomorrow-night-eighties.css +1 -1
- data/vendor/assets/stylesheets/codemirror/themes/twilight.css +1 -1
- data/vendor/assets/stylesheets/codemirror/themes/vibrant-ink.css +1 -1
- data/vendor/assets/stylesheets/codemirror/themes/xq-dark.css +1 -1
- data/vendor/assets/stylesheets/codemirror/themes/xq-light.css +1 -1
- metadata +7 -1
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA1:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 9386202ed77c77960e25b33dfc99951976f4fae4
|
|
4
|
+
data.tar.gz: b0e5fb1cb06211914a2fcd09e97d2fd05c419cc2
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: b5f1e8a81e9800c2cc7718b3f2dd3ea07fa13a7ca9db1c35719569da67fc32d1cb2e3dccce1c206250b24b421b5600505724ac236bd423c54b70b8de58ab6537
|
|
7
|
+
data.tar.gz: 414b29b5373f82921da9abe9f169d9de4728031c6193a60638bff52b751b90f283aa8149da0d8992b97ec4fb1e2dbffb8e0601b545f7dc748350a1b27d9cad69
|
|
@@ -353,8 +353,10 @@ window.CodeMirror = (function() {
|
|
|
353
353
|
d.gutterFiller.style.width = d.gutters.offsetWidth + "px";
|
|
354
354
|
} else d.gutterFiller.style.display = "";
|
|
355
355
|
|
|
356
|
-
if (mac_geLion && scrollbarWidth(d.measure) === 0)
|
|
356
|
+
if (mac_geLion && scrollbarWidth(d.measure) === 0) {
|
|
357
357
|
d.scrollbarV.style.minWidth = d.scrollbarH.style.minHeight = mac_geMountainLion ? "18px" : "12px";
|
|
358
|
+
d.scrollbarV.style.pointerEvents = d.scrollbarH.style.pointerEvents = "none";
|
|
359
|
+
}
|
|
358
360
|
}
|
|
359
361
|
|
|
360
362
|
function visibleLines(display, doc, viewPort) {
|
|
@@ -935,8 +937,9 @@ window.CodeMirror = (function() {
|
|
|
935
937
|
// smallest indentation, which tends to need the least context to
|
|
936
938
|
// parse correctly.
|
|
937
939
|
function findStartLine(cm, n, precise) {
|
|
938
|
-
var minindent, minline, doc = cm.doc
|
|
939
|
-
|
|
940
|
+
var minindent, minline, doc = cm.doc;
|
|
941
|
+
var lim = precise ? -1 : n - (cm.doc.mode.innerMode ? 1000 : 100);
|
|
942
|
+
for (var search = n; search > lim; --search) {
|
|
940
943
|
if (search <= doc.first) return doc.first;
|
|
941
944
|
var line = getLine(doc, search - 1);
|
|
942
945
|
if (line.stateAfter && (!precise || search <= doc.frontier)) return search;
|
|
@@ -961,6 +964,7 @@ window.CodeMirror = (function() {
|
|
|
961
964
|
line.stateAfter = save ? copyState(doc.mode, state) : null;
|
|
962
965
|
++pos;
|
|
963
966
|
});
|
|
967
|
+
if (precise) doc.frontier = pos;
|
|
964
968
|
return state;
|
|
965
969
|
}
|
|
966
970
|
|
|
@@ -1383,7 +1387,8 @@ window.CodeMirror = (function() {
|
|
|
1383
1387
|
display.scroller.scrollLeft = display.scrollbarH.scrollLeft = doc.scrollLeft = newScrollPos.scrollLeft;
|
|
1384
1388
|
alignHorizontally(cm);
|
|
1385
1389
|
if (op.scrollToPos)
|
|
1386
|
-
scrollPosIntoView(cm, clipPos(cm.doc, op.scrollToPos),
|
|
1390
|
+
scrollPosIntoView(cm, clipPos(cm.doc, op.scrollToPos.from),
|
|
1391
|
+
clipPos(cm.doc, op.scrollToPos.to), op.scrollToPos.margin);
|
|
1387
1392
|
} else if (newScrollPos) {
|
|
1388
1393
|
scrollCursorIntoView(cm);
|
|
1389
1394
|
}
|
|
@@ -2179,7 +2184,11 @@ window.CodeMirror = (function() {
|
|
|
2179
2184
|
|
|
2180
2185
|
var pos = posFromMouse(cm, e), scrollPos = display.scroller.scrollTop;
|
|
2181
2186
|
if (!pos || opera) return; // Opera is difficult.
|
|
2182
|
-
|
|
2187
|
+
|
|
2188
|
+
// Reset the current text selection only if the click is done outside of the selection
|
|
2189
|
+
// and 'resetSelectionOnContextMenu' option is true.
|
|
2190
|
+
var reset = cm.options.resetSelectionOnContextMenu;
|
|
2191
|
+
if (reset && (posEq(sel.from, sel.to) || posLess(pos, sel.from) || !posLess(pos, sel.to)))
|
|
2183
2192
|
operation(cm, setSelection)(cm.doc, pos, pos);
|
|
2184
2193
|
|
|
2185
2194
|
var oldCSS = display.input.style.cssText;
|
|
@@ -2630,7 +2639,7 @@ window.CodeMirror = (function() {
|
|
|
2630
2639
|
// SCROLLING
|
|
2631
2640
|
|
|
2632
2641
|
function scrollCursorIntoView(cm) {
|
|
2633
|
-
var coords = scrollPosIntoView(cm, cm.doc.sel.head, cm.options.cursorScrollMargin);
|
|
2642
|
+
var coords = scrollPosIntoView(cm, cm.doc.sel.head, null, cm.options.cursorScrollMargin);
|
|
2634
2643
|
if (!cm.state.focused) return;
|
|
2635
2644
|
var display = cm.display, box = getRect(display.sizer), doScroll = null;
|
|
2636
2645
|
if (coords.top + box.top < 0) doScroll = true;
|
|
@@ -2647,11 +2656,15 @@ window.CodeMirror = (function() {
|
|
|
2647
2656
|
}
|
|
2648
2657
|
}
|
|
2649
2658
|
|
|
2650
|
-
function scrollPosIntoView(cm, pos, margin) {
|
|
2659
|
+
function scrollPosIntoView(cm, pos, end, margin) {
|
|
2651
2660
|
if (margin == null) margin = 0;
|
|
2652
2661
|
for (;;) {
|
|
2653
2662
|
var changed = false, coords = cursorCoords(cm, pos);
|
|
2654
|
-
var
|
|
2663
|
+
var endCoords = !end || end == pos ? coords : cursorCoords(cm, end);
|
|
2664
|
+
var scrollPos = calculateScrollPos(cm, Math.min(coords.left, endCoords.left),
|
|
2665
|
+
Math.min(coords.top, endCoords.top) - margin,
|
|
2666
|
+
Math.max(coords.left, endCoords.left),
|
|
2667
|
+
Math.max(coords.bottom, endCoords.bottom) + margin);
|
|
2655
2668
|
var startTop = cm.doc.scrollTop, startLeft = cm.doc.scrollLeft;
|
|
2656
2669
|
if (scrollPos.scrollTop != null) {
|
|
2657
2670
|
setScrollTop(cm, scrollPos.scrollTop);
|
|
@@ -3169,17 +3182,23 @@ window.CodeMirror = (function() {
|
|
|
3169
3182
|
clientHeight: scroller.clientHeight - co, clientWidth: scroller.clientWidth - co};
|
|
3170
3183
|
},
|
|
3171
3184
|
|
|
3172
|
-
scrollIntoView: operation(null, function(
|
|
3173
|
-
if (
|
|
3185
|
+
scrollIntoView: operation(null, function(range, margin) {
|
|
3186
|
+
if (range == null) range = {from: this.doc.sel.head, to: null};
|
|
3187
|
+
else if (typeof range == "number") range = {from: Pos(range, 0), to: null};
|
|
3188
|
+
else if (range.from == null) range = {from: range, to: null};
|
|
3189
|
+
if (!range.to) range.to = range.from;
|
|
3174
3190
|
if (!margin) margin = 0;
|
|
3175
|
-
var coords = pos;
|
|
3176
3191
|
|
|
3177
|
-
|
|
3178
|
-
|
|
3179
|
-
this.curOp.
|
|
3180
|
-
coords = cursorCoords(this,
|
|
3192
|
+
var coords = range;
|
|
3193
|
+
if (range.from.line != null) {
|
|
3194
|
+
this.curOp.scrollToPos = {from: range.from, to: range.to, margin: margin};
|
|
3195
|
+
coords = {from: cursorCoords(this, range.from),
|
|
3196
|
+
to: cursorCoords(this, range.to)};
|
|
3181
3197
|
}
|
|
3182
|
-
var sPos = calculateScrollPos(this, coords.left, coords.
|
|
3198
|
+
var sPos = calculateScrollPos(this, Math.min(coords.from.left, coords.to.left),
|
|
3199
|
+
Math.min(coords.from.top, coords.to.top) - margin,
|
|
3200
|
+
Math.max(coords.from.right, coords.to.right),
|
|
3201
|
+
Math.max(coords.from.bottom, coords.to.bottom) + margin);
|
|
3183
3202
|
updateScrollPos(this, sPos.scrollLeft, sPos.scrollTop);
|
|
3184
3203
|
}),
|
|
3185
3204
|
|
|
@@ -3211,6 +3230,7 @@ window.CodeMirror = (function() {
|
|
|
3211
3230
|
clearCaches(this);
|
|
3212
3231
|
resetInput(this, true);
|
|
3213
3232
|
updateScrollPos(this, doc.scrollLeft, doc.scrollTop);
|
|
3233
|
+
signalLater(this, "swapDoc", this, old);
|
|
3214
3234
|
return old;
|
|
3215
3235
|
}),
|
|
3216
3236
|
|
|
@@ -3285,6 +3305,8 @@ window.CodeMirror = (function() {
|
|
|
3285
3305
|
option("lineNumberFormatter", function(integer) {return integer;}, guttersChanged, true);
|
|
3286
3306
|
option("showCursorWhenSelecting", false, updateSelection, true);
|
|
3287
3307
|
|
|
3308
|
+
option("resetSelectionOnContextMenu", true);
|
|
3309
|
+
|
|
3288
3310
|
option("readOnly", false, function(cm, val) {
|
|
3289
3311
|
if (val == "nocursor") {onBlur(cm); cm.display.input.blur();}
|
|
3290
3312
|
else if (!val) resetInput(cm, true);
|
|
@@ -3521,7 +3543,8 @@ window.CodeMirror = (function() {
|
|
|
3521
3543
|
keyMap.basic = {
|
|
3522
3544
|
"Left": "goCharLeft", "Right": "goCharRight", "Up": "goLineUp", "Down": "goLineDown",
|
|
3523
3545
|
"End": "goLineEnd", "Home": "goLineStartSmart", "PageUp": "goPageUp", "PageDown": "goPageDown",
|
|
3524
|
-
"Delete": "delCharAfter", "Backspace": "delCharBefore", "
|
|
3546
|
+
"Delete": "delCharAfter", "Backspace": "delCharBefore", "Shift-Backspace": "delCharBefore",
|
|
3547
|
+
"Tab": "defaultTab", "Shift-Tab": "indentAuto",
|
|
3525
3548
|
"Enter": "newlineAndIndent", "Insert": "toggleOverwrite"
|
|
3526
3549
|
};
|
|
3527
3550
|
// Note that the save and find-related commands aren't defined by
|
|
@@ -4461,7 +4484,7 @@ window.CodeMirror = (function() {
|
|
|
4461
4484
|
return out;
|
|
4462
4485
|
}
|
|
4463
4486
|
return function(builder, text, style, startStyle, endStyle, title) {
|
|
4464
|
-
return inner(builder, text.replace(/ {3,}
|
|
4487
|
+
return inner(builder, text.replace(/ {3,}/g, split), style, startStyle, endStyle, title);
|
|
4465
4488
|
};
|
|
4466
4489
|
}
|
|
4467
4490
|
|
|
@@ -5879,7 +5902,7 @@ window.CodeMirror = (function() {
|
|
|
5879
5902
|
|
|
5880
5903
|
// THE END
|
|
5881
5904
|
|
|
5882
|
-
CodeMirror.version = "3.
|
|
5905
|
+
CodeMirror.version = "3.19.0";
|
|
5883
5906
|
|
|
5884
5907
|
return CodeMirror;
|
|
5885
5908
|
})();
|
|
@@ -72,7 +72,7 @@
|
|
|
72
72
|
function autoCloseSlash(cm) {
|
|
73
73
|
var pos = cm.getCursor(), tok = cm.getTokenAt(pos);
|
|
74
74
|
var inner = CodeMirror.innerMode(cm.getMode(), tok.state), state = inner.state;
|
|
75
|
-
if (tok.string.charAt(0) != "<" || inner.mode.name != "xml") return CodeMirror.Pass;
|
|
75
|
+
if (tok.string.charAt(0) != "<" || tok.start != pos.ch - 1 || inner.mode.name != "xml") return CodeMirror.Pass;
|
|
76
76
|
|
|
77
77
|
var tagName = state.context && state.context.tagName;
|
|
78
78
|
if (tagName) cm.replaceSelection("/" + tagName + ">", "end");
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
|
|
7
7
|
CodeMirror.commands.newlineAndIndentContinueMarkdownList = function(cm) {
|
|
8
8
|
var pos = cm.getCursor(),
|
|
9
|
-
inList = cm.getStateAfter(pos.line).list,
|
|
9
|
+
inList = cm.getStateAfter(pos.line).list !== false,
|
|
10
10
|
match;
|
|
11
11
|
|
|
12
12
|
if (!inList || !(match = cm.getLine(pos.line).match(listRE))) {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
(function() {
|
|
2
2
|
"use strict";
|
|
3
3
|
|
|
4
|
-
function doFold(cm, pos, options) {
|
|
4
|
+
function doFold(cm, pos, options, force) {
|
|
5
5
|
var finder = options && (options.call ? options : options.rangeFinder);
|
|
6
6
|
if (!finder) finder = cm.getHelper(pos, "fold");
|
|
7
7
|
if (!finder) return;
|
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
if (!range || range.to.line - range.from.line < minSize) return null;
|
|
14
14
|
var marks = cm.findMarksAt(range.from);
|
|
15
15
|
for (var i = 0; i < marks.length; ++i) {
|
|
16
|
-
if (marks[i].__isFold) {
|
|
16
|
+
if (marks[i].__isFold && force !== "fold") {
|
|
17
17
|
if (!allowFolded) return null;
|
|
18
18
|
range.cleared = true;
|
|
19
19
|
marks[i].clear();
|
|
@@ -27,7 +27,7 @@
|
|
|
27
27
|
pos = CodeMirror.Pos(pos.line - 1, 0);
|
|
28
28
|
range = getRange(false);
|
|
29
29
|
}
|
|
30
|
-
if (!range || range.cleared) return;
|
|
30
|
+
if (!range || range.cleared || force === "unfold") return;
|
|
31
31
|
|
|
32
32
|
var myWidget = makeWidget(options);
|
|
33
33
|
CodeMirror.on(myWidget, "mousedown", function() { myRange.clear(); });
|
|
@@ -59,7 +59,9 @@
|
|
|
59
59
|
};
|
|
60
60
|
|
|
61
61
|
// New-style interface
|
|
62
|
-
CodeMirror.defineExtension("foldCode", function(pos, options
|
|
62
|
+
CodeMirror.defineExtension("foldCode", function(pos, options, force) {
|
|
63
|
+
doFold(this, pos, options, force);
|
|
64
|
+
});
|
|
63
65
|
|
|
64
66
|
CodeMirror.registerHelper("fold", "combine", function() {
|
|
65
67
|
var funcs = Array.prototype.slice.call(arguments, 0);
|
|
@@ -10,6 +10,7 @@
|
|
|
10
10
|
cm.off("viewportChange", onViewportChange);
|
|
11
11
|
cm.off("fold", onFold);
|
|
12
12
|
cm.off("unfold", onFold);
|
|
13
|
+
cm.off("swapDoc", updateInViewport);
|
|
13
14
|
}
|
|
14
15
|
if (val) {
|
|
15
16
|
cm.state.foldGutter = new State(parseOptions(val));
|
|
@@ -19,6 +20,7 @@
|
|
|
19
20
|
cm.on("viewportChange", onViewportChange);
|
|
20
21
|
cm.on("fold", onFold);
|
|
21
22
|
cm.on("unfold", onFold);
|
|
23
|
+
cm.on("swapDoc", updateInViewport);
|
|
22
24
|
}
|
|
23
25
|
});
|
|
24
26
|
|
|
@@ -1,12 +1,26 @@
|
|
|
1
1
|
CodeMirror.registerHelper("fold", "indent", function(cm, start) {
|
|
2
|
-
var
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
2
|
+
var lastLine = cm.lastLine(),
|
|
3
|
+
tabSize = cm.getOption("tabSize"),
|
|
4
|
+
firstLine = cm.getLine(start.line),
|
|
5
|
+
myIndent = CodeMirror.countColumn(firstLine, null, tabSize);
|
|
6
|
+
|
|
7
|
+
function foldEnded(curColumn, prevColumn) {
|
|
8
|
+
return curColumn < myIndent ||
|
|
9
|
+
(curColumn == myIndent && prevColumn >= myIndent) ||
|
|
10
|
+
(curColumn > myIndent && i == lastLine);
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
for (var i = start.line + 1; i <= lastLine; i++) {
|
|
14
|
+
var curColumn = CodeMirror.countColumn(cm.getLine(i), null, tabSize);
|
|
15
|
+
var prevColumn = CodeMirror.countColumn(cm.getLine(i-1), null, tabSize);
|
|
16
|
+
|
|
17
|
+
if (foldEnded(curColumn, prevColumn)) {
|
|
18
|
+
var lastFoldLineNumber = curColumn > myIndent && i == lastLine ? i : i-1;
|
|
19
|
+
var lastFoldLine = cm.getLine(lastFoldLineNumber);
|
|
8
20
|
return {from: CodeMirror.Pos(start.line, firstLine.length),
|
|
9
|
-
to: CodeMirror.Pos(
|
|
21
|
+
to: CodeMirror.Pos(lastFoldLineNumber, lastFoldLine.length)};
|
|
22
|
+
}
|
|
10
23
|
}
|
|
11
24
|
});
|
|
25
|
+
|
|
12
26
|
CodeMirror.indentRangeFinder = CodeMirror.fold.indent; // deprecated
|
|
@@ -33,21 +33,6 @@
|
|
|
33
33
|
tprop = getToken(editor, Pos(cur.line, tprop.start));
|
|
34
34
|
if (tprop.string != ".") return;
|
|
35
35
|
tprop = getToken(editor, Pos(cur.line, tprop.start));
|
|
36
|
-
if (tprop.string == ')') {
|
|
37
|
-
var level = 1;
|
|
38
|
-
do {
|
|
39
|
-
tprop = getToken(editor, Pos(cur.line, tprop.start));
|
|
40
|
-
switch (tprop.string) {
|
|
41
|
-
case ')': level++; break;
|
|
42
|
-
case '(': level--; break;
|
|
43
|
-
default: break;
|
|
44
|
-
}
|
|
45
|
-
} while (level > 0);
|
|
46
|
-
tprop = getToken(editor, Pos(cur.line, tprop.start));
|
|
47
|
-
if (tprop.type.indexOf("variable") === 0)
|
|
48
|
-
tprop.type = "function";
|
|
49
|
-
else return; // no clue
|
|
50
|
-
}
|
|
51
36
|
if (!context) var context = [];
|
|
52
37
|
context.push(tprop);
|
|
53
38
|
}
|
|
@@ -110,11 +95,11 @@
|
|
|
110
95
|
for (var name in obj) maybeAdd(name);
|
|
111
96
|
}
|
|
112
97
|
|
|
113
|
-
if (context) {
|
|
98
|
+
if (context && context.length) {
|
|
114
99
|
// If this is a property, see if it belongs to some object we can
|
|
115
100
|
// find in the current environment.
|
|
116
101
|
var obj = context.pop(), base;
|
|
117
|
-
if (obj.type.indexOf("variable") === 0) {
|
|
102
|
+
if (obj.type && obj.type.indexOf("variable") === 0) {
|
|
118
103
|
if (options && options.additionalContext)
|
|
119
104
|
base = options.additionalContext[obj.string];
|
|
120
105
|
base = base || window[obj.string];
|
|
@@ -132,8 +117,7 @@
|
|
|
132
117
|
while (base != null && context.length)
|
|
133
118
|
base = base[context.pop().string];
|
|
134
119
|
if (base != null) gatherCompletions(base);
|
|
135
|
-
}
|
|
136
|
-
else {
|
|
120
|
+
} else {
|
|
137
121
|
// If not, just look in the window object and any local scope
|
|
138
122
|
// (reading into JS mode internals to get at the local and global variables)
|
|
139
123
|
for (var v = token.state.localVars; v; v = v.next) maybeAdd(v.name);
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
(function () {
|
|
2
|
+
"use strict";
|
|
3
|
+
|
|
4
|
+
var tables;
|
|
5
|
+
var keywords;
|
|
6
|
+
|
|
7
|
+
function getKeywords(editor) {
|
|
8
|
+
var mode = editor.doc.modeOption;
|
|
9
|
+
if(mode === "sql") mode = "text/x-sql";
|
|
10
|
+
return CodeMirror.resolveMode(mode).keywords;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
function match(string, word) {
|
|
14
|
+
var len = string.length;
|
|
15
|
+
var sub = word.substr(0, len);
|
|
16
|
+
return string.toUpperCase() === sub.toUpperCase();
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
function addMatches(result, search, wordlist, formatter) {
|
|
20
|
+
for(var word in wordlist) {
|
|
21
|
+
if(!wordlist.hasOwnProperty(word)) continue;
|
|
22
|
+
if(Array.isArray(wordlist)) {
|
|
23
|
+
word = wordlist[word];
|
|
24
|
+
}
|
|
25
|
+
if(match(search, word)) {
|
|
26
|
+
result.push(formatter(word));
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
function columnCompletion(result, editor) {
|
|
32
|
+
var cur = editor.getCursor();
|
|
33
|
+
var token = editor.getTokenAt(cur);
|
|
34
|
+
var string = token.string.substr(1);
|
|
35
|
+
var prevCur = CodeMirror.Pos(cur.line, token.start);
|
|
36
|
+
var table = editor.getTokenAt(prevCur).string;
|
|
37
|
+
var columns = tables[table];
|
|
38
|
+
if(!columns) {
|
|
39
|
+
table = findTableByAlias(table, editor);
|
|
40
|
+
}
|
|
41
|
+
columns = tables[table];
|
|
42
|
+
if(!columns) {
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
addMatches(result, string, columns,
|
|
46
|
+
function(w) {return "." + w;});
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
function eachWord(line, f) {
|
|
50
|
+
var words = line.text.split(" ");
|
|
51
|
+
for(var i = 0; i < words.length; i++) {
|
|
52
|
+
f(words[i]);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
// Tries to find possible table name from alias.
|
|
57
|
+
function findTableByAlias(alias, editor) {
|
|
58
|
+
var aliasUpperCase = alias.toUpperCase();
|
|
59
|
+
var previousWord = "";
|
|
60
|
+
var table = "";
|
|
61
|
+
|
|
62
|
+
editor.eachLine(function(line) {
|
|
63
|
+
eachWord(line, function(word) {
|
|
64
|
+
var wordUpperCase = word.toUpperCase();
|
|
65
|
+
if(wordUpperCase === aliasUpperCase) {
|
|
66
|
+
if(tables.hasOwnProperty(previousWord)) {
|
|
67
|
+
table = previousWord;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
if(wordUpperCase !== "AS") {
|
|
71
|
+
previousWord = word;
|
|
72
|
+
}
|
|
73
|
+
});
|
|
74
|
+
});
|
|
75
|
+
return table;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
function sqlHint(editor, options) {
|
|
79
|
+
tables = (options && options.tables) || {};
|
|
80
|
+
keywords = keywords || getKeywords(editor);
|
|
81
|
+
var cur = editor.getCursor();
|
|
82
|
+
var token = editor.getTokenAt(cur);
|
|
83
|
+
|
|
84
|
+
var result = [];
|
|
85
|
+
|
|
86
|
+
var search = token.string.trim();
|
|
87
|
+
|
|
88
|
+
addMatches(result, search, keywords,
|
|
89
|
+
function(w) {return w.toUpperCase();});
|
|
90
|
+
|
|
91
|
+
addMatches(result, search, tables,
|
|
92
|
+
function(w) {return w;});
|
|
93
|
+
|
|
94
|
+
if(search.lastIndexOf('.') === 0) {
|
|
95
|
+
columnCompletion(result, editor);
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
return {
|
|
99
|
+
list: result,
|
|
100
|
+
from: CodeMirror.Pos(cur.line, token.start),
|
|
101
|
+
to: CodeMirror.Pos(cur.line, token.end)
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
CodeMirror.registerHelper("hint", "sql", sqlHint);
|
|
105
|
+
})();
|
|
@@ -37,6 +37,7 @@
|
|
|
37
37
|
Pos(cur.line, token.type == "string" ? token.start : token.end));
|
|
38
38
|
var atName = before.match(/([^\s\u00a0=<>\"\']+)=$/), atValues;
|
|
39
39
|
if (!atName || !attrs.hasOwnProperty(atName[1]) || !(atValues = attrs[atName[1]])) return;
|
|
40
|
+
if (typeof atValues == 'function') atValues = atValues.call(this, cm); // Functions can be used to supply values for autocomplete widget
|
|
40
41
|
if (token.type == "string") {
|
|
41
42
|
prefix = token.string;
|
|
42
43
|
if (/['"]/.test(token.string.charAt(0))) {
|
|
@@ -70,6 +70,7 @@
|
|
|
70
70
|
if (!cursor.find(rev)) return;
|
|
71
71
|
}
|
|
72
72
|
cm.setSelection(cursor.from(), cursor.to());
|
|
73
|
+
cm.scrollIntoView({from: cursor.from(), to: cursor.to()});
|
|
73
74
|
state.posFrom = cursor.from(); state.posTo = cursor.to();
|
|
74
75
|
});}
|
|
75
76
|
function clearSearch(cm) {cm.operation(function() {
|
|
@@ -108,6 +109,7 @@
|
|
|
108
109
|
(start && cursor.from().line == start.line && cursor.from().ch == start.ch)) return;
|
|
109
110
|
}
|
|
110
111
|
cm.setSelection(cursor.from(), cursor.to());
|
|
112
|
+
cm.scrollIntoView({from: cursor.from(), to: cursor.to()});
|
|
111
113
|
confirmDialog(cm, doReplaceConfirm, "Replace?",
|
|
112
114
|
[function() {doReplace(match);}, advance]);
|
|
113
115
|
};
|