codemirror-rails 4.4 → 4.5
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/codemirror/rails/version.rb +2 -2
- data/vendor/assets/javascripts/codemirror.js +77 -47
- data/vendor/assets/javascripts/codemirror/addons/comment/comment.js +2 -2
- data/vendor/assets/javascripts/codemirror/addons/dialog/dialog.js +26 -14
- data/vendor/assets/javascripts/codemirror/addons/edit/closetag.js +4 -0
- data/vendor/assets/javascripts/codemirror/addons/fold/xml-fold.js +2 -1
- data/vendor/assets/javascripts/codemirror/addons/hint/sql-hint.js +53 -57
- data/vendor/assets/javascripts/codemirror/addons/merge/merge.js +39 -16
- data/vendor/assets/javascripts/codemirror/addons/search/search.js +3 -3
- data/vendor/assets/javascripts/codemirror/keymaps/sublime.js +6 -3
- data/vendor/assets/javascripts/codemirror/keymaps/vim.js +333 -90
- data/vendor/assets/javascripts/codemirror/modes/clike.js +11 -0
- data/vendor/assets/javascripts/codemirror/modes/clojure.js +1 -1
- data/vendor/assets/javascripts/codemirror/modes/javascript.js +5 -4
- data/vendor/assets/javascripts/codemirror/modes/perl.js +1 -1
- data/vendor/assets/javascripts/codemirror/modes/php.js +2 -2
- data/vendor/assets/javascripts/codemirror/modes/ruby.js +15 -9
- data/vendor/assets/javascripts/codemirror/modes/sass.js +91 -110
- data/vendor/assets/javascripts/codemirror/modes/slim.js +575 -0
- data/vendor/assets/javascripts/codemirror/modes/verilog.js +5 -0
- data/vendor/assets/stylesheets/codemirror/addons/merge/merge.css +6 -0
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3e059cb95f28ccd6359e88ac0b4ff11c1051ac03
|
4
|
+
data.tar.gz: d8ee9576a123228b1ca810588700a3af42dbfbc0
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 429201482a115f18936a9e2950a9ee0e4b26e3c851e31fe124d5fc1949247b7b90b50ba98626a5e223c5479c8e49ebc1b6a6d555b95f566211b776d9a36987d6
|
7
|
+
data.tar.gz: 861ebb1342b708ee8c82d675f82da91f14f63a54d484e94ad07c2ea2d044da39a9f17591036677924f7c7fba6223674570cec78284b38c9009f35a29b7bc7008
|
@@ -662,6 +662,7 @@
|
|
662
662
|
function updateDisplaySimple(cm, viewport) {
|
663
663
|
var update = new DisplayUpdate(cm, viewport);
|
664
664
|
if (updateDisplayIfNeeded(cm, update)) {
|
665
|
+
updateHeightsInViewport(cm);
|
665
666
|
postUpdateDisplay(cm, update);
|
666
667
|
var barMeasure = measureForScrollbars(cm);
|
667
668
|
updateSelection(cm);
|
@@ -1280,8 +1281,7 @@
|
|
1280
1281
|
return result;
|
1281
1282
|
}
|
1282
1283
|
|
1283
|
-
function
|
1284
|
-
if (!drawn) drawn = drawSelection(cm);
|
1284
|
+
function showSelection(cm, drawn) {
|
1285
1285
|
removeChildrenAndAdd(cm.display.cursorDiv, drawn.cursors);
|
1286
1286
|
removeChildrenAndAdd(cm.display.selectionDiv, drawn.selection);
|
1287
1287
|
if (drawn.teTop != null) {
|
@@ -1290,6 +1290,10 @@
|
|
1290
1290
|
}
|
1291
1291
|
}
|
1292
1292
|
|
1293
|
+
function updateSelection(cm) {
|
1294
|
+
showSelection(cm, drawSelection(cm));
|
1295
|
+
}
|
1296
|
+
|
1293
1297
|
// Draws a cursor for the given range
|
1294
1298
|
function drawSelectionCursor(cm, range, output) {
|
1295
1299
|
var pos = cursorCoords(cm, range.head, "div", null, null, !cm.options.singleCursorHeightPerLine);
|
@@ -1642,18 +1646,24 @@
|
|
1642
1646
|
|
1643
1647
|
var rect;
|
1644
1648
|
if (node.nodeType == 3) { // If it is a text node, use a range to retrieve the coordinates.
|
1645
|
-
|
1646
|
-
|
1647
|
-
|
1648
|
-
|
1649
|
-
|
1650
|
-
|
1651
|
-
|
1652
|
-
|
1653
|
-
|
1654
|
-
|
1655
|
-
|
1656
|
-
|
1649
|
+
for (;;) {
|
1650
|
+
while (start && isExtendingChar(prepared.line.text.charAt(mStart + start))) --start;
|
1651
|
+
while (mStart + end < mEnd && isExtendingChar(prepared.line.text.charAt(mStart + end))) ++end;
|
1652
|
+
if (ie && ie_version < 9 && start == 0 && end == mEnd - mStart) {
|
1653
|
+
rect = node.parentNode.getBoundingClientRect();
|
1654
|
+
} else if (ie && cm.options.lineWrapping) {
|
1655
|
+
var rects = range(node, start, end).getClientRects();
|
1656
|
+
if (rects.length)
|
1657
|
+
rect = rects[bias == "right" ? rects.length - 1 : 0];
|
1658
|
+
else
|
1659
|
+
rect = nullRect;
|
1660
|
+
} else {
|
1661
|
+
rect = range(node, start, end).getBoundingClientRect() || nullRect;
|
1662
|
+
}
|
1663
|
+
if (rect.left || rect.right || start == 0) break;
|
1664
|
+
end = start;
|
1665
|
+
start = start - 1;
|
1666
|
+
collapse = "right";
|
1657
1667
|
}
|
1658
1668
|
} else { // If it is a widget, simply get the box for the whole widget.
|
1659
1669
|
if (start > 0) collapse = bias = "right";
|
@@ -2029,16 +2039,17 @@
|
|
2029
2039
|
var cm = op.cm, display = cm.display;
|
2030
2040
|
if (op.updatedDisplay) updateHeightsInViewport(cm);
|
2031
2041
|
|
2042
|
+
op.barMeasure = measureForScrollbars(cm);
|
2043
|
+
|
2032
2044
|
// If the max line changed since it was last measured, measure it,
|
2033
2045
|
// and ensure the document's width matches it.
|
2034
|
-
//
|
2046
|
+
// updateDisplay_W2 will use these properties to do the actual resizing
|
2035
2047
|
if (display.maxLineChanged && !cm.options.lineWrapping) {
|
2036
|
-
op.adjustWidthTo = measureChar(cm, display.maxLine, display.maxLine.text.length).left;
|
2048
|
+
op.adjustWidthTo = measureChar(cm, display.maxLine, display.maxLine.text.length).left + 3;
|
2037
2049
|
op.maxScrollLeft = Math.max(0, display.sizer.offsetLeft + op.adjustWidthTo +
|
2038
2050
|
scrollerCutOff - display.scroller.clientWidth);
|
2039
2051
|
}
|
2040
2052
|
|
2041
|
-
op.barMeasure = measureForScrollbars(cm);
|
2042
2053
|
if (op.updatedDisplay || op.selectionChanged)
|
2043
2054
|
op.newSelectionNodes = drawSelection(cm);
|
2044
2055
|
}
|
@@ -2050,10 +2061,11 @@
|
|
2050
2061
|
cm.display.sizer.style.minWidth = op.adjustWidthTo + "px";
|
2051
2062
|
if (op.maxScrollLeft < cm.doc.scrollLeft)
|
2052
2063
|
setScrollLeft(cm, Math.min(cm.display.scroller.scrollLeft, op.maxScrollLeft), true);
|
2064
|
+
cm.display.maxLineChanged = false;
|
2053
2065
|
}
|
2054
2066
|
|
2055
2067
|
if (op.newSelectionNodes)
|
2056
|
-
|
2068
|
+
showSelection(cm, op.newSelectionNodes);
|
2057
2069
|
if (op.updatedDisplay)
|
2058
2070
|
setDocumentHeight(cm, op.barMeasure);
|
2059
2071
|
if (op.updatedDisplay || op.startHeight != cm.doc.height)
|
@@ -2068,6 +2080,9 @@
|
|
2068
2080
|
function endOperation_finish(op) {
|
2069
2081
|
var cm = op.cm, display = cm.display, doc = cm.doc;
|
2070
2082
|
|
2083
|
+
if (op.adjustWidthTo != null && Math.abs(op.barMeasure.scrollWidth - cm.display.scroller.scrollWidth) > 1)
|
2084
|
+
updateScrollbars(cm);
|
2085
|
+
|
2071
2086
|
if (op.updatedDisplay) postUpdateDisplay(cm, op.update);
|
2072
2087
|
|
2073
2088
|
// Abort mouse wheel delta measurement, when scrolling explicitly
|
@@ -3553,7 +3568,7 @@
|
|
3553
3568
|
|
3554
3569
|
var after = i ? computeSelAfterChange(doc, change) : lst(source);
|
3555
3570
|
makeChangeSingleDoc(doc, change, after, mergeOldSpans(doc, change));
|
3556
|
-
if (!i && doc.cm) doc.cm.scrollIntoView(change);
|
3571
|
+
if (!i && doc.cm) doc.cm.scrollIntoView({from: change.from, to: changeEnd(change)});
|
3557
3572
|
var rebased = [];
|
3558
3573
|
|
3559
3574
|
// Propagate to the linked documents
|
@@ -3742,6 +3757,7 @@
|
|
3742
3757
|
if (y1 < 0) y1 = 0;
|
3743
3758
|
var screentop = cm.curOp && cm.curOp.scrollTop != null ? cm.curOp.scrollTop : display.scroller.scrollTop;
|
3744
3759
|
var screen = display.scroller.clientHeight - scrollerCutOff, result = {};
|
3760
|
+
if (y2 - y1 > screen) y2 = y1 + screen;
|
3745
3761
|
var docBottom = cm.doc.height + paddingVert(display);
|
3746
3762
|
var atTop = y1 < snapMargin, atBottom = y2 > docBottom - snapMargin;
|
3747
3763
|
if (y1 < screentop) {
|
@@ -3752,16 +3768,16 @@
|
|
3752
3768
|
}
|
3753
3769
|
|
3754
3770
|
var screenleft = cm.curOp && cm.curOp.scrollLeft != null ? cm.curOp.scrollLeft : display.scroller.scrollLeft;
|
3755
|
-
var screenw = display.scroller.clientWidth - scrollerCutOff;
|
3756
|
-
|
3757
|
-
|
3758
|
-
|
3759
|
-
|
3760
|
-
|
3761
|
-
result.scrollLeft = Math.max(0, x1 -
|
3762
|
-
|
3763
|
-
result.scrollLeft = x2 + 10 - screenw;
|
3764
|
-
|
3771
|
+
var screenw = display.scroller.clientWidth - scrollerCutOff - display.gutters.offsetWidth;
|
3772
|
+
var tooWide = x2 - x1 > screenw;
|
3773
|
+
if (tooWide) x2 = y1 + screen;
|
3774
|
+
if (x1 < 10)
|
3775
|
+
result.scrollLeft = 0;
|
3776
|
+
else if (x1 < screenleft)
|
3777
|
+
result.scrollLeft = Math.max(0, x1 - (tooWide ? 0 : 10));
|
3778
|
+
else if (x2 > screenw + screenleft - 3)
|
3779
|
+
result.scrollLeft = x2 + (tooWide ? 0 : 10) - screenw;
|
3780
|
+
|
3765
3781
|
return result;
|
3766
3782
|
}
|
3767
3783
|
|
@@ -4070,11 +4086,14 @@
|
|
4070
4086
|
for (var i = 0; i < ranges.length; i++) {
|
4071
4087
|
var range = ranges[i];
|
4072
4088
|
if (!range.empty()) {
|
4073
|
-
var
|
4074
|
-
var
|
4089
|
+
var from = range.from(), to = range.to();
|
4090
|
+
var start = Math.max(end, from.line);
|
4075
4091
|
end = Math.min(this.lastLine(), to.line - (to.ch ? 0 : 1)) + 1;
|
4076
4092
|
for (var j = start; j < end; ++j)
|
4077
4093
|
indentLine(this, j, how);
|
4094
|
+
var newRanges = this.doc.sel.ranges;
|
4095
|
+
if (from.ch == 0 && ranges.length == newRanges.length && newRanges[i].from().ch > 0)
|
4096
|
+
replaceOneSelection(this.doc, i, new Range(from, newRanges[i].to()), sel_dontScroll);
|
4078
4097
|
} else if (range.head.line > end) {
|
4079
4098
|
indentLine(this, range.head.line, how, true);
|
4080
4099
|
end = range.head.line;
|
@@ -4470,7 +4489,7 @@
|
|
4470
4489
|
clearCaches(cm);
|
4471
4490
|
regChange(cm);
|
4472
4491
|
}, true);
|
4473
|
-
option("specialChars", /[\t\u0000-\u0019\u00ad\u200b\u2028\u2029\ufeff]/g, function(cm, val) {
|
4492
|
+
option("specialChars", /[\t\u0000-\u0019\u00ad\u200b-\u200f\u2028\u2029\ufeff]/g, function(cm, val) {
|
4474
4493
|
cm.options.specialChars = new RegExp(val.source + (val.test("\t") ? "" : "|\t"), "g");
|
4475
4494
|
cm.refresh();
|
4476
4495
|
}, true);
|
@@ -4731,15 +4750,7 @@
|
|
4731
4750
|
},
|
4732
4751
|
goLineStartSmart: function(cm) {
|
4733
4752
|
cm.extendSelectionsBy(function(range) {
|
4734
|
-
|
4735
|
-
var line = cm.getLineHandle(start.line);
|
4736
|
-
var order = getOrder(line);
|
4737
|
-
if (!order || order[0].level == 0) {
|
4738
|
-
var firstNonWS = Math.max(0, line.text.search(/\S/));
|
4739
|
-
var inWS = range.head.line == start.line && range.head.ch <= firstNonWS && range.head.ch;
|
4740
|
-
return Pos(start.line, inWS ? 0 : firstNonWS);
|
4741
|
-
}
|
4742
|
-
return start;
|
4753
|
+
return lineStartSmart(cm, range.head);
|
4743
4754
|
}, {origin: "+move", bias: 1});
|
4744
4755
|
},
|
4745
4756
|
goLineEnd: function(cm) {
|
@@ -4758,6 +4769,14 @@
|
|
4758
4769
|
return cm.coordsChar({left: 0, top: top}, "div");
|
4759
4770
|
}, sel_move);
|
4760
4771
|
},
|
4772
|
+
goLineLeftSmart: function(cm) {
|
4773
|
+
cm.extendSelectionsBy(function(range) {
|
4774
|
+
var top = cm.charCoords(range.head, "div").top + 5;
|
4775
|
+
var pos = cm.coordsChar({left: 0, top: top}, "div");
|
4776
|
+
if (pos.ch < cm.getLine(pos.line).search(/\S/)) return lineStartSmart(cm, range.head);
|
4777
|
+
return pos;
|
4778
|
+
}, sel_move);
|
4779
|
+
},
|
4761
4780
|
goLineUp: function(cm) {cm.moveV(-1, "line");},
|
4762
4781
|
goLineDown: function(cm) {cm.moveV(1, "line");},
|
4763
4782
|
goPageUp: function(cm) {cm.moveV(-1, "page");},
|
@@ -6495,7 +6514,7 @@
|
|
6495
6514
|
},
|
6496
6515
|
changeGeneration: function(forceSplit) {
|
6497
6516
|
if (forceSplit)
|
6498
|
-
this.history.lastOp = this.history.lastOrigin = null;
|
6517
|
+
this.history.lastOp = this.history.lastSelOp = this.history.lastOrigin = null;
|
6499
6518
|
return this.history.generation;
|
6500
6519
|
},
|
6501
6520
|
isClean: function (gen) {
|
@@ -6812,7 +6831,7 @@
|
|
6812
6831
|
// Used to track when changes can be merged into a single undo
|
6813
6832
|
// event
|
6814
6833
|
this.lastModTime = this.lastSelTime = 0;
|
6815
|
-
this.lastOp = null;
|
6834
|
+
this.lastOp = this.lastSelOp = null;
|
6816
6835
|
this.lastOrigin = this.lastSelOrigin = null;
|
6817
6836
|
// Used by the isClean() method
|
6818
6837
|
this.generation = this.maxGeneration = startGen || 1;
|
@@ -6890,7 +6909,7 @@
|
|
6890
6909
|
hist.done.push(selAfter);
|
6891
6910
|
hist.generation = ++hist.maxGeneration;
|
6892
6911
|
hist.lastModTime = hist.lastSelTime = time;
|
6893
|
-
hist.lastOp = opId;
|
6912
|
+
hist.lastOp = hist.lastSelOp = opId;
|
6894
6913
|
hist.lastOrigin = hist.lastSelOrigin = change.origin;
|
6895
6914
|
|
6896
6915
|
if (!last) signal(doc, "historyAdded");
|
@@ -6916,7 +6935,7 @@
|
|
6916
6935
|
// the current, or the origins don't allow matching. Origins
|
6917
6936
|
// starting with * are always merged, those starting with + are
|
6918
6937
|
// merged when similar and close together in time.
|
6919
|
-
if (opId == hist.
|
6938
|
+
if (opId == hist.lastSelOp ||
|
6920
6939
|
(origin && hist.lastSelOrigin == origin &&
|
6921
6940
|
(hist.lastModTime == hist.lastSelTime && hist.lastOrigin == origin ||
|
6922
6941
|
selectionEventCanBeMerged(doc, origin, lst(hist.done), sel))))
|
@@ -6926,7 +6945,7 @@
|
|
6926
6945
|
|
6927
6946
|
hist.lastSelTime = +new Date;
|
6928
6947
|
hist.lastSelOrigin = origin;
|
6929
|
-
hist.
|
6948
|
+
hist.lastSelOp = opId;
|
6930
6949
|
if (options && options.clearRedo !== false)
|
6931
6950
|
clearSelectionEvents(hist.undone);
|
6932
6951
|
}
|
@@ -7556,6 +7575,17 @@
|
|
7556
7575
|
var ch = !order ? line.text.length : order[0].level % 2 ? lineLeft(line) : lineRight(line);
|
7557
7576
|
return Pos(lineN == null ? lineNo(line) : lineN, ch);
|
7558
7577
|
}
|
7578
|
+
function lineStartSmart(cm, pos) {
|
7579
|
+
var start = lineStart(cm, pos.line);
|
7580
|
+
var line = getLine(cm.doc, start.line);
|
7581
|
+
var order = getOrder(line);
|
7582
|
+
if (!order || order[0].level == 0) {
|
7583
|
+
var firstNonWS = Math.max(0, line.text.search(/\S/));
|
7584
|
+
var inWS = pos.line == start.line && pos.ch <= firstNonWS && pos.ch;
|
7585
|
+
return Pos(start.line, inWS ? 0 : firstNonWS);
|
7586
|
+
}
|
7587
|
+
return start;
|
7588
|
+
}
|
7559
7589
|
|
7560
7590
|
function compareBidiLevel(order, a, b) {
|
7561
7591
|
var linedir = order[0].level;
|
@@ -7795,7 +7825,7 @@
|
|
7795
7825
|
|
7796
7826
|
// THE END
|
7797
7827
|
|
7798
|
-
CodeMirror.version = "4.
|
7828
|
+
CodeMirror.version = "4.5.0";
|
7799
7829
|
|
7800
7830
|
return CodeMirror;
|
7801
7831
|
});
|
@@ -157,12 +157,12 @@
|
|
157
157
|
// Positions of the last startString before the start of the selection, and the first endString after it.
|
158
158
|
var lastStart = startLine.lastIndexOf(startString, from.ch);
|
159
159
|
var firstEnd = lastStart == -1 ? -1 : startLine.slice(0, from.ch).indexOf(endString, lastStart + startString.length);
|
160
|
-
if (lastStart != -1 && firstEnd != -1) return false;
|
160
|
+
if (lastStart != -1 && firstEnd != -1 && firstEnd + endString.length != from.ch) return false;
|
161
161
|
// Positions of the first endString after the end of the selection, and the last startString before it.
|
162
162
|
firstEnd = endLine.indexOf(endString, to.ch);
|
163
163
|
var almostLastStart = endLine.slice(to.ch).lastIndexOf(startString, firstEnd - to.ch);
|
164
164
|
lastStart = (firstEnd == -1 || almostLastStart == -1) ? -1 : to.ch + almostLastStart;
|
165
|
-
if (firstEnd != -1 && lastStart != -1) return false;
|
165
|
+
if (firstEnd != -1 && lastStart != -1 && lastStart != to.ch) return false;
|
166
166
|
|
167
167
|
self.operation(function() {
|
168
168
|
self.replaceRange("", Pos(end, close - (pad && endLine.slice(close - pad.length, close) == pad ? pad.length : 0)),
|
@@ -15,11 +15,11 @@
|
|
15
15
|
var wrap = cm.getWrapperElement();
|
16
16
|
var dialog;
|
17
17
|
dialog = wrap.appendChild(document.createElement("div"));
|
18
|
-
if (bottom)
|
18
|
+
if (bottom)
|
19
19
|
dialog.className = "CodeMirror-dialog CodeMirror-dialog-bottom";
|
20
|
-
|
20
|
+
else
|
21
21
|
dialog.className = "CodeMirror-dialog CodeMirror-dialog-top";
|
22
|
-
|
22
|
+
|
23
23
|
if (typeof template == "string") {
|
24
24
|
dialog.innerHTML = template;
|
25
25
|
} else { // Assuming it's a detached DOM element.
|
@@ -35,8 +35,11 @@
|
|
35
35
|
}
|
36
36
|
|
37
37
|
CodeMirror.defineExtension("openDialog", function(template, callback, options) {
|
38
|
+
if (!options) options = {};
|
39
|
+
|
38
40
|
closeNotification(this, null);
|
39
|
-
|
41
|
+
|
42
|
+
var dialog = dialogDiv(this, template, options.bottom);
|
40
43
|
var closed = false, me = this;
|
41
44
|
function close(newVal) {
|
42
45
|
if (typeof newVal == 'string') {
|
@@ -45,34 +48,43 @@
|
|
45
48
|
if (closed) return;
|
46
49
|
closed = true;
|
47
50
|
dialog.parentNode.removeChild(dialog);
|
51
|
+
me.focus();
|
52
|
+
|
53
|
+
if (options.onClose) options.onClose(dialog);
|
48
54
|
}
|
49
55
|
}
|
56
|
+
|
50
57
|
var inp = dialog.getElementsByTagName("input")[0], button;
|
51
58
|
if (inp) {
|
52
|
-
if (options
|
59
|
+
if (options.value) inp.value = options.value;
|
60
|
+
|
61
|
+
if (options.onInput)
|
62
|
+
CodeMirror.on(inp, "input", function(e) { options.onInput(e, inp.value, close);});
|
63
|
+
if (options.onKeyUp)
|
64
|
+
CodeMirror.on(inp, "keyup", function(e) {options.onKeyUp(e, inp.value, close);});
|
65
|
+
|
53
66
|
CodeMirror.on(inp, "keydown", function(e) {
|
54
67
|
if (options && options.onKeyDown && options.onKeyDown(e, inp.value, close)) { return; }
|
55
|
-
if (e.keyCode ==
|
68
|
+
if (e.keyCode == 27 || (options.closeOnEnter !== false && e.keyCode == 13)) {
|
56
69
|
inp.blur();
|
57
70
|
CodeMirror.e_stop(e);
|
58
71
|
close();
|
59
|
-
me.focus();
|
60
|
-
if (e.keyCode == 13) callback(inp.value);
|
61
72
|
}
|
73
|
+
if (e.keyCode == 13) callback(inp.value);
|
62
74
|
});
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
if (options && options.value) inp.value = options.value;
|
75
|
+
|
76
|
+
if (options.closeOnBlur !== false) CodeMirror.on(inp, "blur", close);
|
77
|
+
|
67
78
|
inp.focus();
|
68
|
-
CodeMirror.on(inp, "blur", close);
|
69
79
|
} else if (button = dialog.getElementsByTagName("button")[0]) {
|
70
80
|
CodeMirror.on(button, "click", function() {
|
71
81
|
close();
|
72
82
|
me.focus();
|
73
83
|
});
|
84
|
+
|
85
|
+
if (options.closeOnBlur !== false) CodeMirror.on(button, "blur", close);
|
86
|
+
|
74
87
|
button.focus();
|
75
|
-
CodeMirror.on(button, "blur", close);
|
76
88
|
}
|
77
89
|
return close;
|
78
90
|
});
|
@@ -109,6 +109,10 @@
|
|
109
109
|
replacements[i] = "/" + state.context.tagName + ">";
|
110
110
|
}
|
111
111
|
cm.replaceSelections(replacements);
|
112
|
+
ranges = cm.listSelections();
|
113
|
+
for (var i = 0; i < ranges.length; i++)
|
114
|
+
if (i == ranges.length - 1 || ranges[i].head.line < ranges[i + 1].head.line)
|
115
|
+
cm.indentLine(ranges[i].head.line);
|
112
116
|
}
|
113
117
|
|
114
118
|
function indexOf(collection, elt) {
|
@@ -151,8 +151,9 @@
|
|
151
151
|
if (iter.text.indexOf(">") == -1 && iter.text.indexOf("<") == -1) return;
|
152
152
|
var end = toTagEnd(iter), to = end && Pos(iter.line, iter.ch);
|
153
153
|
var start = end && toTagStart(iter);
|
154
|
-
if (!end ||
|
154
|
+
if (!end || !start || cmp(iter, pos) > 0) return;
|
155
155
|
var here = {from: Pos(iter.line, iter.ch), to: to, tag: start[2]};
|
156
|
+
if (end == "selfClose") return {open: here, close: null, at: "open"};
|
156
157
|
|
157
158
|
if (start[1]) { // closing tag
|
158
159
|
return {open: findMatchingOpen(iter, start[2]), close: here, at: "close"};
|
@@ -21,7 +21,7 @@
|
|
21
21
|
|
22
22
|
function getKeywords(editor) {
|
23
23
|
var mode = editor.doc.modeOption;
|
24
|
-
if(mode === "sql") mode = "text/x-sql";
|
24
|
+
if (mode === "sql") mode = "text/x-sql";
|
25
25
|
return CodeMirror.resolveMode(mode).keywords;
|
26
26
|
}
|
27
27
|
|
@@ -32,12 +32,12 @@
|
|
32
32
|
}
|
33
33
|
|
34
34
|
function addMatches(result, search, wordlist, formatter) {
|
35
|
-
for(var word in wordlist) {
|
36
|
-
if(!wordlist.hasOwnProperty(word)) continue;
|
37
|
-
if(Array.isArray(wordlist)) {
|
35
|
+
for (var word in wordlist) {
|
36
|
+
if (!wordlist.hasOwnProperty(word)) continue;
|
37
|
+
if (Array.isArray(wordlist)) {
|
38
38
|
word = wordlist[word];
|
39
39
|
}
|
40
|
-
if(match(search, word)) {
|
40
|
+
if (match(search, word)) {
|
41
41
|
result.push(formatter(word));
|
42
42
|
}
|
43
43
|
}
|
@@ -49,33 +49,30 @@
|
|
49
49
|
var string = token.string.substr(1);
|
50
50
|
var prevCur = Pos(cur.line, token.start);
|
51
51
|
var table = editor.getTokenAt(prevCur).string;
|
52
|
-
if(
|
52
|
+
if (!tables.hasOwnProperty(table))
|
53
53
|
table = findTableByAlias(table, editor);
|
54
|
-
}
|
55
54
|
var columns = tables[table];
|
56
|
-
if(!columns)
|
57
|
-
|
58
|
-
}
|
59
|
-
addMatches(result, string, columns,
|
60
|
-
function(w) {return "." + w;});
|
55
|
+
if (!columns) return;
|
56
|
+
|
57
|
+
addMatches(result, string, columns, function(w) {return "." + w;});
|
61
58
|
}
|
62
59
|
|
63
60
|
function eachWord(lineText, f) {
|
64
|
-
if(
|
61
|
+
if (!lineText) return;
|
65
62
|
var excepted = /[,;]/g;
|
66
|
-
var words = lineText.split(
|
67
|
-
for(
|
68
|
-
f(
|
63
|
+
var words = lineText.split(" ");
|
64
|
+
for (var i = 0; i < words.length; i++) {
|
65
|
+
f(words[i]?words[i].replace(excepted, '') : '');
|
69
66
|
}
|
70
67
|
}
|
71
68
|
|
72
|
-
function convertCurToNumber(
|
69
|
+
function convertCurToNumber(cur) {
|
73
70
|
// max characters of a line is 999,999.
|
74
|
-
return cur.line + cur.ch / Math.pow(
|
71
|
+
return cur.line + cur.ch / Math.pow(10, 6);
|
75
72
|
}
|
76
73
|
|
77
|
-
function convertNumberToCur(
|
78
|
-
return Pos(Math.floor(
|
74
|
+
function convertNumberToCur(num) {
|
75
|
+
return Pos(Math.floor(num), +num.toString().split('.').pop());
|
79
76
|
}
|
80
77
|
|
81
78
|
function findTableByAlias(alias, editor) {
|
@@ -86,26 +83,26 @@
|
|
86
83
|
var table = "";
|
87
84
|
var separator = [];
|
88
85
|
var validRange = {
|
89
|
-
start: Pos(
|
90
|
-
end: Pos(
|
86
|
+
start: Pos(0, 0),
|
87
|
+
end: Pos(editor.lastLine(), editor.getLineHandle(editor.lastLine()).length)
|
91
88
|
};
|
92
89
|
|
93
90
|
//add separator
|
94
|
-
var indexOfSeparator = fullQuery.indexOf(
|
95
|
-
while(
|
96
|
-
separator.push(
|
97
|
-
indexOfSeparator = fullQuery.indexOf(
|
91
|
+
var indexOfSeparator = fullQuery.indexOf(CONS.QUERY_DIV);
|
92
|
+
while(indexOfSeparator != -1) {
|
93
|
+
separator.push(doc.posFromIndex(indexOfSeparator));
|
94
|
+
indexOfSeparator = fullQuery.indexOf(CONS.QUERY_DIV, indexOfSeparator+1);
|
98
95
|
}
|
99
|
-
separator.unshift(
|
100
|
-
separator.push(
|
96
|
+
separator.unshift(Pos(0, 0));
|
97
|
+
separator.push(Pos(editor.lastLine(), editor.getLineHandle(editor.lastLine()).text.length));
|
101
98
|
|
102
|
-
//find
|
99
|
+
//find valid range
|
103
100
|
var prevItem = 0;
|
104
|
-
var current = convertCurToNumber(
|
105
|
-
for(
|
106
|
-
var _v = convertCurToNumber(
|
107
|
-
if(
|
108
|
-
validRange = { start: convertNumberToCur(
|
101
|
+
var current = convertCurToNumber(editor.getCursor());
|
102
|
+
for (var i=0; i< separator.length; i++) {
|
103
|
+
var _v = convertCurToNumber(separator[i]);
|
104
|
+
if (current > prevItem && current <= _v) {
|
105
|
+
validRange = { start: convertNumberToCur(prevItem), end: convertNumberToCur(_v) };
|
109
106
|
break;
|
110
107
|
}
|
111
108
|
prevItem = _v;
|
@@ -113,52 +110,51 @@
|
|
113
110
|
|
114
111
|
var query = doc.getRange(validRange.start, validRange.end, false);
|
115
112
|
|
116
|
-
for(var i=0; i < query.length; i++){
|
113
|
+
for (var i = 0; i < query.length; i++) {
|
117
114
|
var lineText = query[i];
|
118
|
-
eachWord(
|
115
|
+
eachWord(lineText, function(word) {
|
119
116
|
var wordUpperCase = word.toUpperCase();
|
120
|
-
if(
|
117
|
+
if (wordUpperCase === aliasUpperCase && tables.hasOwnProperty(previousWord)) {
|
121
118
|
table = previousWord;
|
122
119
|
}
|
123
|
-
if(
|
120
|
+
if (wordUpperCase !== CONS.ALIAS_KEYWORD) {
|
124
121
|
previousWord = word;
|
125
122
|
}
|
126
123
|
});
|
127
|
-
if(
|
124
|
+
if (table) break;
|
128
125
|
}
|
129
126
|
return table;
|
130
127
|
}
|
131
128
|
|
132
|
-
function
|
129
|
+
CodeMirror.registerHelper("hint", "sql", function(editor, options) {
|
133
130
|
tables = (options && options.tables) || {};
|
134
131
|
keywords = keywords || getKeywords(editor);
|
135
132
|
var cur = editor.getCursor();
|
136
|
-
var token = editor.getTokenAt(cur), end = token.end;
|
137
133
|
var result = [];
|
138
|
-
var
|
139
|
-
|
134
|
+
var token = editor.getTokenAt(cur), start, end, search;
|
135
|
+
if (token.string.match(/^[.\w@]\w*$/)) {
|
136
|
+
search = token.string;
|
137
|
+
start = token.start;
|
138
|
+
end = token.end;
|
139
|
+
} else {
|
140
|
+
start = end = cur.ch;
|
141
|
+
search = "";
|
142
|
+
}
|
140
143
|
if (search.charAt(0) == ".") {
|
141
144
|
columnCompletion(result, editor);
|
142
145
|
if (!result.length) {
|
143
|
-
while (
|
146
|
+
while (start && search.charAt(0) == ".") {
|
144
147
|
token = editor.getTokenAt(Pos(cur.line, token.start - 1));
|
148
|
+
start = token.start;
|
145
149
|
search = token.string + search;
|
146
150
|
}
|
147
|
-
addMatches(result, search, tables,
|
148
|
-
function(w) {return w;});
|
151
|
+
addMatches(result, search, tables, function(w) {return w;});
|
149
152
|
}
|
150
153
|
} else {
|
151
|
-
addMatches(result, search,
|
152
|
-
|
153
|
-
addMatches(result, search, tables,
|
154
|
-
function(w) {return w;});
|
154
|
+
addMatches(result, search, tables, function(w) {return w;});
|
155
|
+
addMatches(result, search, keywords, function(w) {return w.toUpperCase();});
|
155
156
|
}
|
156
157
|
|
157
|
-
return {
|
158
|
-
|
159
|
-
from: Pos(cur.line, token.start),
|
160
|
-
to: Pos(cur.line, end)
|
161
|
-
};
|
162
|
-
}
|
163
|
-
CodeMirror.registerHelper("hint", "sql", sqlHint);
|
158
|
+
return {list: result, from: Pos(cur.line, start), to: Pos(cur.line, end)};
|
159
|
+
});
|
164
160
|
});
|