codemirror-rails 4.6 → 4.7
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 +24 -25
- data/vendor/assets/javascripts/codemirror/addons/comment/comment.js +1 -1
- data/vendor/assets/javascripts/codemirror/addons/dialog/dialog.js +4 -1
- data/vendor/assets/javascripts/codemirror/addons/edit/closebrackets.js +7 -6
- data/vendor/assets/javascripts/codemirror/addons/edit/continuelist.js +21 -8
- data/vendor/assets/javascripts/codemirror/addons/hint/sql-hint.js +54 -20
- data/vendor/assets/javascripts/codemirror/addons/lint/lint.js +10 -15
- data/vendor/assets/javascripts/codemirror/addons/mode/simple.js +210 -0
- data/vendor/assets/javascripts/codemirror/addons/runmode/runmode-standalone.js +5 -1
- data/vendor/assets/javascripts/codemirror/addons/runmode/runmode.node.js +2 -4
- data/vendor/assets/javascripts/codemirror/keymaps/vim.js +425 -554
- data/vendor/assets/javascripts/codemirror/modes/clike.js +28 -5
- data/vendor/assets/javascripts/codemirror/modes/clojure.js +5 -3
- data/vendor/assets/javascripts/codemirror/modes/coffeescript.js +8 -7
- data/vendor/assets/javascripts/codemirror/modes/d.js +1 -1
- data/vendor/assets/javascripts/codemirror/modes/dtd.js +1 -1
- data/vendor/assets/javascripts/codemirror/modes/gherkin.js +1 -1
- data/vendor/assets/javascripts/codemirror/modes/go.js +1 -1
- data/vendor/assets/javascripts/codemirror/modes/haskell.js +1 -1
- data/vendor/assets/javascripts/codemirror/modes/javascript.js +3 -3
- data/vendor/assets/javascripts/codemirror/modes/julia.js +1 -1
- data/vendor/assets/javascripts/codemirror/modes/markdown.js +4 -3
- data/vendor/assets/javascripts/codemirror/modes/octave.js +1 -1
- data/vendor/assets/javascripts/codemirror/modes/perl.js +2 -2
- data/vendor/assets/javascripts/codemirror/modes/php.js +37 -44
- data/vendor/assets/javascripts/codemirror/modes/python.js +17 -4
- data/vendor/assets/javascripts/codemirror/modes/ruby.js +12 -11
- data/vendor/assets/javascripts/codemirror/modes/rust.js +2 -2
- data/vendor/assets/javascripts/codemirror/modes/smartymixed.js +5 -1
- data/vendor/assets/javascripts/codemirror/modes/sql.js +2 -1
- data/vendor/assets/javascripts/codemirror/modes/stex.js +2 -1
- data/vendor/assets/javascripts/codemirror/modes/tcl.js +1 -1
- data/vendor/assets/javascripts/codemirror/modes/textile.js +553 -0
- data/vendor/assets/javascripts/codemirror/modes/tornado.js +68 -0
- data/vendor/assets/javascripts/codemirror/modes/verilog.js +14 -9
- data/vendor/assets/stylesheets/codemirror.css +1 -1
- data/vendor/assets/stylesheets/codemirror/themes/base16-dark.css +2 -2
- data/vendor/assets/stylesheets/codemirror/themes/mdn-like.css +1 -1
- metadata +4 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 926ba7eaf6d3a5946a51a9edd1dc6d99ed211cb8
|
4
|
+
data.tar.gz: e2c1f08a582fd76a0ecc35be5a393b1d2c0f25ff
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ac13c0485f7879662c60063b1e4cc13b8e7b8e4c733806c14a5099f6a506c6c7b735b99ace5f6596c3f5225a3816db098d1878d48ce2ec640c5d985d8458a649
|
7
|
+
data.tar.gz: ca0484ab6b9734f44a2a160d471a6584867b3d22f374485ea5c1810b898fd6859a9e86be18f762e3e1ec99d383d291dd8dbdc2c6a5f870157c90978de28d1325
|
@@ -61,7 +61,7 @@
|
|
61
61
|
function CodeMirror(place, options) {
|
62
62
|
if (!(this instanceof CodeMirror)) return new CodeMirror(place, options);
|
63
63
|
|
64
|
-
this.options = options = options
|
64
|
+
this.options = options = options ? copyObj(options) : {};
|
65
65
|
// Determine effective options based on given values and defaults.
|
66
66
|
copyObj(defaults, options, false);
|
67
67
|
setGuttersForLineNumbers(options);
|
@@ -96,21 +96,20 @@
|
|
96
96
|
registerEventHandlers(this);
|
97
97
|
ensureGlobalHandlers();
|
98
98
|
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
attachDoc(cm, doc);
|
99
|
+
startOperation(this);
|
100
|
+
this.curOp.forceUpdate = true;
|
101
|
+
attachDoc(this, doc);
|
103
102
|
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
103
|
+
if ((options.autofocus && !mobile) || activeElt() == display.input)
|
104
|
+
setTimeout(bind(onFocus, this), 20);
|
105
|
+
else
|
106
|
+
onBlur(this);
|
108
107
|
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
108
|
+
for (var opt in optionHandlers) if (optionHandlers.hasOwnProperty(opt))
|
109
|
+
optionHandlers[opt](this, options[opt], Init);
|
110
|
+
maybeUpdateLineNumberWidth(this);
|
111
|
+
for (var i = 0; i < initHooks.length; ++i) initHooks[i](this);
|
112
|
+
endOperation(this);
|
114
113
|
}
|
115
114
|
|
116
115
|
// DISPLAY CONSTRUCTOR
|
@@ -723,9 +722,10 @@
|
|
723
722
|
// view, so that we don't interleave reading and writing to the DOM.
|
724
723
|
function getDimensions(cm) {
|
725
724
|
var d = cm.display, left = {}, width = {};
|
725
|
+
var gutterLeft = d.gutters.clientLeft;
|
726
726
|
for (var n = d.gutters.firstChild, i = 0; n; n = n.nextSibling, ++i) {
|
727
|
-
left[cm.options.gutters[i]] = n.offsetLeft;
|
728
|
-
width[cm.options.gutters[i]] = n.
|
727
|
+
left[cm.options.gutters[i]] = n.offsetLeft + n.clientLeft + gutterLeft;
|
728
|
+
width[cm.options.gutters[i]] = n.clientWidth;
|
729
729
|
}
|
730
730
|
return {fixedPos: compensateForHScroll(d),
|
731
731
|
gutterTotalWidth: d.gutters.offsetWidth,
|
@@ -3720,7 +3720,7 @@
|
|
3720
3720
|
// measured, the position of something may 'drift' during drawing).
|
3721
3721
|
function scrollPosIntoView(cm, pos, end, margin) {
|
3722
3722
|
if (margin == null) margin = 0;
|
3723
|
-
for (
|
3723
|
+
for (var limit = 0; limit < 5; limit++) {
|
3724
3724
|
var changed = false, coords = cursorCoords(cm, pos);
|
3725
3725
|
var endCoords = !end || end == pos ? coords : cursorCoords(cm, end);
|
3726
3726
|
var scrollPos = calculateScrollPos(cm, Math.min(coords.left, endCoords.left),
|
@@ -3769,7 +3769,7 @@
|
|
3769
3769
|
var screenleft = cm.curOp && cm.curOp.scrollLeft != null ? cm.curOp.scrollLeft : display.scroller.scrollLeft;
|
3770
3770
|
var screenw = display.scroller.clientWidth - scrollerCutOff - display.gutters.offsetWidth;
|
3771
3771
|
var tooWide = x2 - x1 > screenw;
|
3772
|
-
if (tooWide) x2 =
|
3772
|
+
if (tooWide) x2 = x1 + screenw;
|
3773
3773
|
if (x1 < 10)
|
3774
3774
|
result.scrollLeft = 0;
|
3775
3775
|
else if (x1 < screenleft)
|
@@ -4570,10 +4570,8 @@
|
|
4570
4570
|
// load a mode. (Preferred mechanism is the require/define calls.)
|
4571
4571
|
CodeMirror.defineMode = function(name, mode) {
|
4572
4572
|
if (!CodeMirror.defaults.mode && name != "null") CodeMirror.defaults.mode = name;
|
4573
|
-
if (arguments.length > 2)
|
4574
|
-
mode.dependencies =
|
4575
|
-
for (var i = 2; i < arguments.length; ++i) mode.dependencies.push(arguments[i]);
|
4576
|
-
}
|
4573
|
+
if (arguments.length > 2)
|
4574
|
+
mode.dependencies = Array.prototype.slice.call(arguments, 2);
|
4577
4575
|
modes[name] = mode;
|
4578
4576
|
};
|
4579
4577
|
|
@@ -4865,7 +4863,7 @@
|
|
4865
4863
|
// are simply ignored.
|
4866
4864
|
keyMap.pcDefault = {
|
4867
4865
|
"Ctrl-A": "selectAll", "Ctrl-D": "deleteLine", "Ctrl-Z": "undo", "Shift-Ctrl-Z": "redo", "Ctrl-Y": "redo",
|
4868
|
-
"Ctrl-Home": "goDocStart", "Ctrl-
|
4866
|
+
"Ctrl-Home": "goDocStart", "Ctrl-End": "goDocEnd", "Ctrl-Up": "goLineUp", "Ctrl-Down": "goLineDown",
|
4869
4867
|
"Ctrl-Left": "goGroupLeft", "Ctrl-Right": "goGroupRight", "Alt-Left": "goLineStart", "Alt-Right": "goLineEnd",
|
4870
4868
|
"Ctrl-Backspace": "delGroupBefore", "Ctrl-Delete": "delGroupAfter", "Ctrl-S": "save", "Ctrl-F": "find",
|
4871
4869
|
"Ctrl-G": "findNext", "Shift-Ctrl-G": "findPrev", "Shift-Ctrl-F": "replace", "Shift-Ctrl-R": "replaceAll",
|
@@ -4880,7 +4878,7 @@
|
|
4880
4878
|
"Ctrl-Alt-Backspace": "delGroupAfter", "Alt-Delete": "delGroupAfter", "Cmd-S": "save", "Cmd-F": "find",
|
4881
4879
|
"Cmd-G": "findNext", "Shift-Cmd-G": "findPrev", "Cmd-Alt-F": "replace", "Shift-Cmd-Alt-F": "replaceAll",
|
4882
4880
|
"Cmd-[": "indentLess", "Cmd-]": "indentMore", "Cmd-Backspace": "delWrappedLineLeft", "Cmd-Delete": "delWrappedLineRight",
|
4883
|
-
"Cmd-U": "undoSelection", "Shift-Cmd-U": "redoSelection",
|
4881
|
+
"Cmd-U": "undoSelection", "Shift-Cmd-U": "redoSelection", "Ctrl-Up": "goDocStart", "Ctrl-Down": "goDocEnd",
|
4884
4882
|
fallthrough: ["basic", "emacsy"]
|
4885
4883
|
};
|
4886
4884
|
// Very basic readline/emacs-style bindings, which are standard on Mac.
|
@@ -4988,6 +4986,7 @@
|
|
4988
4986
|
cm.save = save;
|
4989
4987
|
cm.getTextArea = function() { return textarea; };
|
4990
4988
|
cm.toTextArea = function() {
|
4989
|
+
cm.toTextArea = isNaN; // Prevent this from being ran twice
|
4991
4990
|
save();
|
4992
4991
|
textarea.parentNode.removeChild(cm.getWrapperElement());
|
4993
4992
|
textarea.style.display = "";
|
@@ -7825,7 +7824,7 @@
|
|
7825
7824
|
|
7826
7825
|
// THE END
|
7827
7826
|
|
7828
|
-
CodeMirror.version = "4.
|
7827
|
+
CodeMirror.version = "4.7.0";
|
7829
7828
|
|
7830
7829
|
return CodeMirror;
|
7831
7830
|
});
|
@@ -109,7 +109,7 @@
|
|
109
109
|
CodeMirror.defineExtension("uncomment", function(from, to, options) {
|
110
110
|
if (!options) options = noOptions;
|
111
111
|
var self = this, mode = self.getModeAt(from);
|
112
|
-
var end = Math.min(to.line, self.lastLine()), start = Math.min(from.line, end);
|
112
|
+
var end = Math.min(to.ch != 0 || to.line == from.line ? to.line : to.line - 1, self.lastLine()), start = Math.min(from.line, end);
|
113
113
|
|
114
114
|
// Try finding line comments
|
115
115
|
var lineString = options.lineComment || mode.lineComment, lines = [];
|
@@ -56,7 +56,10 @@
|
|
56
56
|
|
57
57
|
var inp = dialog.getElementsByTagName("input")[0], button;
|
58
58
|
if (inp) {
|
59
|
-
if (options.value)
|
59
|
+
if (options.value) {
|
60
|
+
inp.value = options.value;
|
61
|
+
inp.select();
|
62
|
+
}
|
60
63
|
|
61
64
|
if (options.onInput)
|
62
65
|
CodeMirror.on(inp, "input", function(e) { options.onInput(e, inp.value, close);});
|
@@ -78,24 +78,25 @@
|
|
78
78
|
for (var i = 0; i < ranges.length; i++) {
|
79
79
|
var range = ranges[i], cur = range.head, curType;
|
80
80
|
var next = cm.getRange(cur, Pos(cur.line, cur.ch + 1));
|
81
|
-
if (!range.empty())
|
81
|
+
if (!range.empty()) {
|
82
82
|
curType = "surround";
|
83
|
-
else if (left == right && next == right) {
|
83
|
+
} else if (left == right && next == right) {
|
84
84
|
if (cm.getRange(cur, Pos(cur.line, cur.ch + 3)) == left + left + left)
|
85
85
|
curType = "skipThree";
|
86
86
|
else
|
87
87
|
curType = "skip";
|
88
88
|
} else if (left == right && cur.ch > 1 &&
|
89
89
|
cm.getRange(Pos(cur.line, cur.ch - 2), cur) == left + left &&
|
90
|
-
(cur.ch <= 2 || cm.getRange(Pos(cur.line, cur.ch - 3), Pos(cur.line, cur.ch - 2)) != left))
|
90
|
+
(cur.ch <= 2 || cm.getRange(Pos(cur.line, cur.ch - 3), Pos(cur.line, cur.ch - 2)) != left)) {
|
91
91
|
curType = "addFour";
|
92
|
-
else if (left == '"' || left == "'") {
|
92
|
+
} else if (left == '"' || left == "'") {
|
93
93
|
if (!CodeMirror.isWordChar(next) && enteringString(cm, cur, left)) curType = "both";
|
94
94
|
else return CodeMirror.Pass;
|
95
|
-
} else if (cm.getLine(cur.line).length == cur.ch || closingBrackets.indexOf(next) >= 0 || SPACE_CHAR_REGEX.test(next))
|
95
|
+
} else if (cm.getLine(cur.line).length == cur.ch || closingBrackets.indexOf(next) >= 0 || SPACE_CHAR_REGEX.test(next)) {
|
96
96
|
curType = "both";
|
97
|
-
else
|
97
|
+
} else {
|
98
98
|
return CodeMirror.Pass;
|
99
|
+
}
|
99
100
|
if (!type) type = curType;
|
100
101
|
else if (type != curType) return CodeMirror.Pass;
|
101
102
|
}
|
@@ -11,7 +11,8 @@
|
|
11
11
|
})(function(CodeMirror) {
|
12
12
|
"use strict";
|
13
13
|
|
14
|
-
var listRE = /^(\s*)([*+-]|(\d+)\.)(\s+)/,
|
14
|
+
var listRE = /^(\s*)([> ]+|[*+-]|(\d+)\.)(\s+)/,
|
15
|
+
emptyListRE = /^(\s*)([> ]+|[*+-]|(\d+)\.)(\s*)$/,
|
15
16
|
unorderedBullets = "*+-";
|
16
17
|
|
17
18
|
CodeMirror.commands.newlineAndIndentContinueMarkdownList = function(cm) {
|
@@ -19,18 +20,30 @@
|
|
19
20
|
var ranges = cm.listSelections(), replacements = [];
|
20
21
|
for (var i = 0; i < ranges.length; i++) {
|
21
22
|
var pos = ranges[i].head, match;
|
22
|
-
var
|
23
|
+
var eolState = cm.getStateAfter(pos.line);
|
24
|
+
var inList = eolState.list !== false;
|
25
|
+
var inQuote = eolState.quote !== false;
|
23
26
|
|
24
|
-
if (!ranges[i].empty() || !inList || !(match = cm.getLine(pos.line).match(listRE))) {
|
27
|
+
if (!ranges[i].empty() || (!inList && !inQuote) || !(match = cm.getLine(pos.line).match(listRE))) {
|
25
28
|
cm.execCommand("newlineAndIndent");
|
26
29
|
return;
|
27
30
|
}
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
31
|
+
if (cm.getLine(pos.line).match(emptyListRE)) {
|
32
|
+
cm.replaceRange("", {
|
33
|
+
line: pos.line, ch: 0
|
34
|
+
}, {
|
35
|
+
line: pos.line, ch: pos.ch + 1
|
36
|
+
});
|
37
|
+
replacements[i] = "\n";
|
32
38
|
|
33
|
-
|
39
|
+
} else {
|
40
|
+
var indent = match[1], after = match[4];
|
41
|
+
var bullet = unorderedBullets.indexOf(match[2]) >= 0 || match[2].indexOf(">") >= 0
|
42
|
+
? match[2]
|
43
|
+
: (parseInt(match[3], 10) + 1) + ".";
|
44
|
+
|
45
|
+
replacements[i] = "\n" + indent + bullet + after;
|
46
|
+
}
|
34
47
|
}
|
35
48
|
|
36
49
|
cm.replaceSelections(replacements);
|
@@ -12,6 +12,7 @@
|
|
12
12
|
"use strict";
|
13
13
|
|
14
14
|
var tables;
|
15
|
+
var defaultTable;
|
15
16
|
var keywords;
|
16
17
|
var CONS = {
|
17
18
|
QUERY_DIV: ";",
|
@@ -43,18 +44,55 @@
|
|
43
44
|
}
|
44
45
|
}
|
45
46
|
|
46
|
-
function
|
47
|
+
function nameCompletion(result, editor) {
|
47
48
|
var cur = editor.getCursor();
|
48
49
|
var token = editor.getTokenAt(cur);
|
50
|
+
var useBacktick = (token.string.charAt(0) == "`");
|
49
51
|
var string = token.string.substr(1);
|
50
|
-
var
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
52
|
+
var prevToken = editor.getTokenAt(Pos(cur.line, token.start));
|
53
|
+
if (token.string.charAt(0) == "." || prevToken.string == "."){
|
54
|
+
//Suggest colunm names
|
55
|
+
if (prevToken.string == ".") {
|
56
|
+
var prevToken = editor.getTokenAt(Pos(cur.line, token.start - 1));
|
57
|
+
}
|
58
|
+
var table = prevToken.string;
|
59
|
+
//Check if backtick is used in table name. If yes, use it for columns too.
|
60
|
+
var useBacktickTable = false;
|
61
|
+
if (table.match(/`/g)) {
|
62
|
+
useBacktickTable = true;
|
63
|
+
table = table.replace(/`/g, "");
|
64
|
+
}
|
65
|
+
//Check if table is available. If not, find table by Alias
|
66
|
+
if (!tables.hasOwnProperty(table))
|
67
|
+
table = findTableByAlias(table, editor);
|
68
|
+
var columns = tables[table];
|
69
|
+
if (!columns) return;
|
70
|
+
|
71
|
+
if (useBacktick) {
|
72
|
+
addMatches(result, string, columns, function(w) {return "`" + w + "`";});
|
73
|
+
}
|
74
|
+
else if(useBacktickTable) {
|
75
|
+
addMatches(result, string, columns, function(w) {return ".`" + w + "`";});
|
76
|
+
}
|
77
|
+
else {
|
78
|
+
addMatches(result, string, columns, function(w) {return "." + w;});
|
79
|
+
}
|
80
|
+
}
|
81
|
+
else {
|
82
|
+
//Suggest table names or colums in defaultTable
|
83
|
+
while (token.start && string.charAt(0) == ".") {
|
84
|
+
token = editor.getTokenAt(Pos(cur.line, token.start - 1));
|
85
|
+
string = token.string + string;
|
86
|
+
}
|
87
|
+
if (useBacktick) {
|
88
|
+
addMatches(result, string, tables, function(w) {return "`" + w + "`";});
|
89
|
+
addMatches(result, string, defaultTable, function(w) {return "`" + w + "`";});
|
90
|
+
}
|
91
|
+
else {
|
92
|
+
addMatches(result, string, tables, function(w) {return w;});
|
93
|
+
addMatches(result, string, defaultTable, function(w) {return w;});
|
94
|
+
}
|
95
|
+
}
|
58
96
|
}
|
59
97
|
|
60
98
|
function eachWord(lineText, f) {
|
@@ -128,11 +166,14 @@
|
|
128
166
|
|
129
167
|
CodeMirror.registerHelper("hint", "sql", function(editor, options) {
|
130
168
|
tables = (options && options.tables) || {};
|
169
|
+
var defaultTableName = options && options.defaultTable;
|
170
|
+
defaultTable = (defaultTableName && tables[defaultTableName] || []);
|
131
171
|
keywords = keywords || getKeywords(editor);
|
172
|
+
|
132
173
|
var cur = editor.getCursor();
|
133
174
|
var result = [];
|
134
175
|
var token = editor.getTokenAt(cur), start, end, search;
|
135
|
-
if (token.string.match(/^[
|
176
|
+
if (token.string.match(/^[.`\w@]\w*$/)) {
|
136
177
|
search = token.string;
|
137
178
|
start = token.start;
|
138
179
|
end = token.end;
|
@@ -140,18 +181,11 @@
|
|
140
181
|
start = end = cur.ch;
|
141
182
|
search = "";
|
142
183
|
}
|
143
|
-
if (search.charAt(0) == ".") {
|
144
|
-
|
145
|
-
if (!result.length) {
|
146
|
-
while (start && search.charAt(0) == ".") {
|
147
|
-
token = editor.getTokenAt(Pos(cur.line, token.start - 1));
|
148
|
-
start = token.start;
|
149
|
-
search = token.string + search;
|
150
|
-
}
|
151
|
-
addMatches(result, search, tables, function(w) {return w;});
|
152
|
-
}
|
184
|
+
if (search.charAt(0) == "." || search.charAt(0) == "`") {
|
185
|
+
nameCompletion(result, editor);
|
153
186
|
} else {
|
154
187
|
addMatches(result, search, tables, function(w) {return w;});
|
188
|
+
addMatches(result, search, defaultTable, function(w) {return w;});
|
155
189
|
addMatches(result, search, keywords, function(w) {return w.toUpperCase();});
|
156
190
|
}
|
157
191
|
|
@@ -118,10 +118,11 @@
|
|
118
118
|
|
119
119
|
function startLinting(cm) {
|
120
120
|
var state = cm.state.lint, options = state.options;
|
121
|
+
var passOptions = options.options || options; // Support deprecated passing of `options` property in options
|
121
122
|
if (options.async)
|
122
|
-
options.getAnnotations(cm, updateLinting,
|
123
|
+
options.getAnnotations(cm.getValue(), updateLinting, passOptions, cm);
|
123
124
|
else
|
124
|
-
updateLinting(cm, options.getAnnotations(cm.getValue(),
|
125
|
+
updateLinting(cm, options.getAnnotations(cm.getValue(), passOptions, cm));
|
125
126
|
}
|
126
127
|
|
127
128
|
function updateLinting(cm, annotationsNotSorted) {
|
@@ -170,20 +171,14 @@
|
|
170
171
|
showTooltipFor(e, annotationTooltip(ann), target);
|
171
172
|
}
|
172
173
|
|
173
|
-
// When the mouseover fires, the cursor might not actually be over
|
174
|
-
// the character itself yet. These pairs of x,y offsets are used to
|
175
|
-
// probe a few nearby points when no suitable marked range is found.
|
176
|
-
var nearby = [0, 0, 0, 5, 0, -5, 5, 0, -5, 0];
|
177
|
-
|
178
174
|
function onMouseOver(cm, e) {
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
}
|
175
|
+
var target = e.target || e.srcElement;
|
176
|
+
if (!/\bCodeMirror-lint-mark-/.test(target.className)) return;
|
177
|
+
var box = target.getBoundingClientRect(), x = (box.left + box.right) / 2, y = (box.top + box.bottom) / 2;
|
178
|
+
var spans = cm.findMarksAt(cm.coordsChar({left: x, top: y}, "client"));
|
179
|
+
for (var i = 0; i < spans.length; ++i) {
|
180
|
+
var ann = spans[i].__annotation;
|
181
|
+
if (ann) return popupSpanTooltip(ann, e);
|
187
182
|
}
|
188
183
|
}
|
189
184
|
|
@@ -0,0 +1,210 @@
|
|
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"));
|
7
|
+
else if (typeof define == "function" && define.amd) // AMD
|
8
|
+
define(["../../lib/codemirror"], mod);
|
9
|
+
else // Plain browser env
|
10
|
+
mod(CodeMirror);
|
11
|
+
})(function(CodeMirror) {
|
12
|
+
"use strict";
|
13
|
+
|
14
|
+
CodeMirror.defineSimpleMode = function(name, states, props) {
|
15
|
+
CodeMirror.defineMode(name, function(config) {
|
16
|
+
return CodeMirror.simpleMode(config, states, props);
|
17
|
+
});
|
18
|
+
};
|
19
|
+
|
20
|
+
CodeMirror.simpleMode = function(config, states) {
|
21
|
+
ensureState(states, "start");
|
22
|
+
var states_ = {}, meta = states.meta || {}, hasIndentation = false;
|
23
|
+
for (var state in states) if (state != meta && states.hasOwnProperty(state)) {
|
24
|
+
var list = states_[state] = [], orig = states[state];
|
25
|
+
for (var i = 0; i < orig.length; i++) {
|
26
|
+
var data = orig[i];
|
27
|
+
list.push(new Rule(data, states));
|
28
|
+
if (data.indent || data.dedent) hasIndentation = true;
|
29
|
+
}
|
30
|
+
}
|
31
|
+
var mode = {
|
32
|
+
startState: function() {
|
33
|
+
return {state: "start", pending: null,
|
34
|
+
local: null, localState: null,
|
35
|
+
indent: hasIndentation ? [] : null};
|
36
|
+
},
|
37
|
+
copyState: function(state) {
|
38
|
+
var s = {state: state.state, pending: state.pending,
|
39
|
+
local: state.local, localState: null,
|
40
|
+
indent: state.indent && state.indent.slice(0)};
|
41
|
+
if (state.localState)
|
42
|
+
s.localState = CodeMirror.copyState(state.local.mode, state.localState);
|
43
|
+
if (state.stack)
|
44
|
+
s.stack = state.stack.slice(0);
|
45
|
+
for (var pers = state.persistentStates; pers; pers = pers.next)
|
46
|
+
s.persistentStates = {mode: pers.mode,
|
47
|
+
spec: pers.spec,
|
48
|
+
state: pers.state == state.localState ? s.localState : CodeMirror.copyState(pers.mode, pers.state),
|
49
|
+
next: s.persistentStates};
|
50
|
+
return s;
|
51
|
+
},
|
52
|
+
token: tokenFunction(states_, config),
|
53
|
+
innerMode: function(state) { return state.local && {mode: state.local.mode, state: state.localState}; },
|
54
|
+
indent: indentFunction(states_, meta)
|
55
|
+
};
|
56
|
+
if (meta) for (var prop in meta) if (meta.hasOwnProperty(prop))
|
57
|
+
mode[prop] = meta[prop];
|
58
|
+
return mode;
|
59
|
+
};
|
60
|
+
|
61
|
+
function ensureState(states, name) {
|
62
|
+
if (!states.hasOwnProperty(name))
|
63
|
+
throw new Error("Undefined state " + name + "in simple mode");
|
64
|
+
}
|
65
|
+
|
66
|
+
function toRegex(val, caret) {
|
67
|
+
if (!val) return /(?:)/;
|
68
|
+
var flags = "";
|
69
|
+
if (val instanceof RegExp) {
|
70
|
+
if (val.ignoreCase) flags = "i";
|
71
|
+
val = val.source;
|
72
|
+
} else {
|
73
|
+
val = String(val);
|
74
|
+
}
|
75
|
+
return new RegExp((caret === false ? "" : "^") + "(?:" + val + ")", flags);
|
76
|
+
}
|
77
|
+
|
78
|
+
function asToken(val) {
|
79
|
+
if (!val) return null;
|
80
|
+
if (typeof val == "string") return val.replace(/\./g, " ");
|
81
|
+
var result = [];
|
82
|
+
for (var i = 0; i < val.length; i++)
|
83
|
+
result.push(val[i] && val[i].replace(/\./g, " "));
|
84
|
+
return result;
|
85
|
+
}
|
86
|
+
|
87
|
+
function Rule(data, states) {
|
88
|
+
if (data.next || data.push) ensureState(states, data.next || data.push);
|
89
|
+
this.regex = toRegex(data.regex);
|
90
|
+
this.token = asToken(data.token);
|
91
|
+
this.data = data;
|
92
|
+
}
|
93
|
+
|
94
|
+
function tokenFunction(states, config) {
|
95
|
+
return function(stream, state) {
|
96
|
+
if (state.pending) {
|
97
|
+
var pend = state.pending.shift();
|
98
|
+
if (state.pending.length == 0) state.pending = null;
|
99
|
+
stream.pos += pend.text.length;
|
100
|
+
return pend.token;
|
101
|
+
}
|
102
|
+
|
103
|
+
if (state.local) {
|
104
|
+
if (state.local.end && stream.match(state.local.end)) {
|
105
|
+
var tok = state.local.endToken || null;
|
106
|
+
state.local = state.localState = null;
|
107
|
+
return tok;
|
108
|
+
} else {
|
109
|
+
var tok = state.local.mode.token(stream, state.localState), m;
|
110
|
+
if (state.local.endScan && (m = state.local.endScan.exec(stream.current())))
|
111
|
+
stream.pos = stream.start + m.index;
|
112
|
+
return tok;
|
113
|
+
}
|
114
|
+
}
|
115
|
+
|
116
|
+
var curState = states[state.state];
|
117
|
+
for (var i = 0; i < curState.length; i++) {
|
118
|
+
var rule = curState[i];
|
119
|
+
var matches = stream.match(rule.regex);
|
120
|
+
if (matches) {
|
121
|
+
if (rule.data.next) {
|
122
|
+
state.state = rule.data.next;
|
123
|
+
} else if (rule.data.push) {
|
124
|
+
(state.stack || (state.stack = [])).push(state.state);
|
125
|
+
state.state = rule.data.push;
|
126
|
+
} else if (rule.data.pop && state.stack && state.stack.length) {
|
127
|
+
state.state = state.stack.pop();
|
128
|
+
}
|
129
|
+
|
130
|
+
if (rule.data.mode)
|
131
|
+
enterLocalMode(config, state, rule.data.mode, rule.token);
|
132
|
+
if (rule.data.indent)
|
133
|
+
state.indent.push(stream.indentation() + config.indentUnit);
|
134
|
+
if (rule.data.dedent)
|
135
|
+
state.indent.pop();
|
136
|
+
if (matches.length > 2) {
|
137
|
+
state.pending = [];
|
138
|
+
for (var j = 2; j < matches.length; j++)
|
139
|
+
if (matches[j])
|
140
|
+
state.pending.push({text: matches[j], token: rule.token[j - 1]});
|
141
|
+
stream.backUp(matches[0].length - (matches[1] ? matches[1].length : 0));
|
142
|
+
return rule.token[0];
|
143
|
+
} else if (rule.token && rule.token.join) {
|
144
|
+
return rule.token[0];
|
145
|
+
} else {
|
146
|
+
return rule.token;
|
147
|
+
}
|
148
|
+
}
|
149
|
+
}
|
150
|
+
stream.next();
|
151
|
+
return null;
|
152
|
+
};
|
153
|
+
}
|
154
|
+
|
155
|
+
function cmp(a, b) {
|
156
|
+
if (a === b) return true;
|
157
|
+
if (!a || typeof a != "object" || !b || typeof b != "object") return false;
|
158
|
+
var props = 0;
|
159
|
+
for (var prop in a) if (a.hasOwnProperty(prop)) {
|
160
|
+
if (!b.hasOwnProperty(prop) || !cmp(a[prop], b[prop])) return false;
|
161
|
+
props++;
|
162
|
+
}
|
163
|
+
for (var prop in b) if (b.hasOwnProperty(prop)) props--;
|
164
|
+
return props == 0;
|
165
|
+
}
|
166
|
+
|
167
|
+
function enterLocalMode(config, state, spec, token) {
|
168
|
+
var pers;
|
169
|
+
if (spec.persistent) for (var p = state.persistentStates; p && !pers; p = p.next)
|
170
|
+
if (spec.spec ? cmp(spec.spec, p.spec) : spec.mode == p.mode) pers = p;
|
171
|
+
var mode = pers ? pers.mode : spec.mode || CodeMirror.getMode(config, spec.spec);
|
172
|
+
var lState = pers ? pers.state : CodeMirror.startState(mode);
|
173
|
+
if (spec.persistent && !pers)
|
174
|
+
state.persistentStates = {mode: mode, spec: spec.spec, state: lState, next: state.persistentStates};
|
175
|
+
|
176
|
+
state.localState = lState;
|
177
|
+
state.local = {mode: mode,
|
178
|
+
end: spec.end && toRegex(spec.end),
|
179
|
+
endScan: spec.end && spec.forceEnd !== false && toRegex(spec.end, false),
|
180
|
+
endToken: token && token.join ? token[token.length - 1] : token};
|
181
|
+
}
|
182
|
+
|
183
|
+
function indexOf(val, arr) {
|
184
|
+
for (var i = 0; i < arr.length; i++) if (arr[i] === val) return true;
|
185
|
+
}
|
186
|
+
|
187
|
+
function indentFunction(states, meta) {
|
188
|
+
return function(state, textAfter, line) {
|
189
|
+
if (state.local && state.local.mode.indent)
|
190
|
+
return state.local.mode.indent(state.localState, textAfter, line);
|
191
|
+
if (state.indent == null || state.local || meta.dontIndentStates && indexOf(state.state, meta.dontIndentStates) > -1)
|
192
|
+
return CodeMirror.Pass;
|
193
|
+
|
194
|
+
var pos = state.indent.length - 1, rules = states[state.state];
|
195
|
+
scan: for (;;) {
|
196
|
+
for (var i = 0; i < rules.length; i++) {
|
197
|
+
var rule = rules[i], m = rule.regex.exec(textAfter);
|
198
|
+
if (m && m[0]) {
|
199
|
+
if (rule.data.dedent && rule.data.dedentIfLineStart !== false) pos--;
|
200
|
+
if (rule.next || rule.push) rules = states[rule.next || rule.push];
|
201
|
+
textAfter = textAfter.slice(m[0].length);
|
202
|
+
continue scan;
|
203
|
+
}
|
204
|
+
}
|
205
|
+
break;
|
206
|
+
}
|
207
|
+
return pos < 0 ? 0 : state.indent[pos];
|
208
|
+
};
|
209
|
+
}
|
210
|
+
});
|