codemirror-rails 4.6 → 4.7
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 +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
|
+
});
|