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.
Files changed (41) hide show
  1. checksums.yaml +4 -4
  2. data/lib/codemirror/rails/version.rb +2 -2
  3. data/vendor/assets/javascripts/codemirror.js +24 -25
  4. data/vendor/assets/javascripts/codemirror/addons/comment/comment.js +1 -1
  5. data/vendor/assets/javascripts/codemirror/addons/dialog/dialog.js +4 -1
  6. data/vendor/assets/javascripts/codemirror/addons/edit/closebrackets.js +7 -6
  7. data/vendor/assets/javascripts/codemirror/addons/edit/continuelist.js +21 -8
  8. data/vendor/assets/javascripts/codemirror/addons/hint/sql-hint.js +54 -20
  9. data/vendor/assets/javascripts/codemirror/addons/lint/lint.js +10 -15
  10. data/vendor/assets/javascripts/codemirror/addons/mode/simple.js +210 -0
  11. data/vendor/assets/javascripts/codemirror/addons/runmode/runmode-standalone.js +5 -1
  12. data/vendor/assets/javascripts/codemirror/addons/runmode/runmode.node.js +2 -4
  13. data/vendor/assets/javascripts/codemirror/keymaps/vim.js +425 -554
  14. data/vendor/assets/javascripts/codemirror/modes/clike.js +28 -5
  15. data/vendor/assets/javascripts/codemirror/modes/clojure.js +5 -3
  16. data/vendor/assets/javascripts/codemirror/modes/coffeescript.js +8 -7
  17. data/vendor/assets/javascripts/codemirror/modes/d.js +1 -1
  18. data/vendor/assets/javascripts/codemirror/modes/dtd.js +1 -1
  19. data/vendor/assets/javascripts/codemirror/modes/gherkin.js +1 -1
  20. data/vendor/assets/javascripts/codemirror/modes/go.js +1 -1
  21. data/vendor/assets/javascripts/codemirror/modes/haskell.js +1 -1
  22. data/vendor/assets/javascripts/codemirror/modes/javascript.js +3 -3
  23. data/vendor/assets/javascripts/codemirror/modes/julia.js +1 -1
  24. data/vendor/assets/javascripts/codemirror/modes/markdown.js +4 -3
  25. data/vendor/assets/javascripts/codemirror/modes/octave.js +1 -1
  26. data/vendor/assets/javascripts/codemirror/modes/perl.js +2 -2
  27. data/vendor/assets/javascripts/codemirror/modes/php.js +37 -44
  28. data/vendor/assets/javascripts/codemirror/modes/python.js +17 -4
  29. data/vendor/assets/javascripts/codemirror/modes/ruby.js +12 -11
  30. data/vendor/assets/javascripts/codemirror/modes/rust.js +2 -2
  31. data/vendor/assets/javascripts/codemirror/modes/smartymixed.js +5 -1
  32. data/vendor/assets/javascripts/codemirror/modes/sql.js +2 -1
  33. data/vendor/assets/javascripts/codemirror/modes/stex.js +2 -1
  34. data/vendor/assets/javascripts/codemirror/modes/tcl.js +1 -1
  35. data/vendor/assets/javascripts/codemirror/modes/textile.js +553 -0
  36. data/vendor/assets/javascripts/codemirror/modes/tornado.js +68 -0
  37. data/vendor/assets/javascripts/codemirror/modes/verilog.js +14 -9
  38. data/vendor/assets/stylesheets/codemirror.css +1 -1
  39. data/vendor/assets/stylesheets/codemirror/themes/base16-dark.css +2 -2
  40. data/vendor/assets/stylesheets/codemirror/themes/mdn-like.css +1 -1
  41. metadata +4 -1
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: c0dc163906cdde80e53bf37feab12977c1e7b2b2
4
- data.tar.gz: b0873a8e31d2bf4de51277bf0f0905cb5ca513cc
3
+ metadata.gz: 926ba7eaf6d3a5946a51a9edd1dc6d99ed211cb8
4
+ data.tar.gz: e2c1f08a582fd76a0ecc35be5a393b1d2c0f25ff
5
5
  SHA512:
6
- metadata.gz: 79b85436b6af48c0b30b94449c633b645150b52c43a9bed89a491e899cd66edfbc785f37438f67521a7197990ea9daca9d2734ac2342d60c0a8afe2faef23f73
7
- data.tar.gz: 3c7ddbd04956e5297f60d017c3da1ab6155b88e8ebf34bc5829ec36941b79a338d2b909a865ad813f3872b70c716f9b12b5919bd1a103491e03f9f4631fb8df7
6
+ metadata.gz: ac13c0485f7879662c60063b1e4cc13b8e7b8e4c733806c14a5099f6a506c6c7b735b99ace5f6596c3f5225a3816db098d1878d48ce2ec640c5d985d8458a649
7
+ data.tar.gz: ca0484ab6b9734f44a2a160d471a6584867b3d22f374485ea5c1810b898fd6859a9e86be18f762e3e1ec99d383d291dd8dbdc2c6a5f870157c90978de28d1325
@@ -1,6 +1,6 @@
1
1
  module Codemirror
2
2
  module Rails
3
- VERSION = '4.6'
4
- CODEMIRROR_VERSION = '4.6'
3
+ VERSION = '4.7'
4
+ CODEMIRROR_VERSION = '4.7'
5
5
  end
6
6
  end
@@ -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
- var cm = this;
100
- runInOp(this, function() {
101
- cm.curOp.forceUpdate = true;
102
- attachDoc(cm, doc);
99
+ startOperation(this);
100
+ this.curOp.forceUpdate = true;
101
+ attachDoc(this, doc);
103
102
 
104
- if ((options.autofocus && !mobile) || activeElt() == display.input)
105
- setTimeout(bind(onFocus, cm), 20);
106
- else
107
- onBlur(cm);
103
+ if ((options.autofocus && !mobile) || activeElt() == display.input)
104
+ setTimeout(bind(onFocus, this), 20);
105
+ else
106
+ onBlur(this);
108
107
 
109
- for (var opt in optionHandlers) if (optionHandlers.hasOwnProperty(opt))
110
- optionHandlers[opt](cm, options[opt], Init);
111
- maybeUpdateLineNumberWidth(cm);
112
- for (var i = 0; i < initHooks.length; ++i) initHooks[i](cm);
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.offsetWidth;
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 = y1 + screen;
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-Up": "goDocStart", "Ctrl-End": "goDocEnd", "Ctrl-Down": "goDocEnd",
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.6.0";
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) inp.value = 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 inList = cm.getStateAfter(pos.line).list !== false;
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
- var indent = match[1], after = match[4];
29
- var bullet = unorderedBullets.indexOf(match[2]) >= 0
30
- ? match[2]
31
- : (parseInt(match[3], 10) + 1) + ".";
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
- replacements[i] = "\n" + indent + bullet + after;
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 columnCompletion(result, editor) {
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 prevCur = Pos(cur.line, token.start);
51
- var table = editor.getTokenAt(prevCur).string;
52
- if (!tables.hasOwnProperty(table))
53
- table = findTableByAlias(table, editor);
54
- var columns = tables[table];
55
- if (!columns) return;
56
-
57
- addMatches(result, string, columns, function(w) {return "." + w;});
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(/^[.\w@]\w*$/)) {
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
- columnCompletion(result, editor);
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, options);
123
+ options.getAnnotations(cm.getValue(), updateLinting, passOptions, cm);
123
124
  else
124
- updateLinting(cm, options.getAnnotations(cm.getValue(), options.options));
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
- if (!/\bCodeMirror-lint-mark-/.test((e.target || e.srcElement).className)) return;
180
- for (var i = 0; i < nearby.length; i += 2) {
181
- var spans = cm.findMarksAt(cm.coordsChar({left: e.clientX + nearby[i],
182
- top: e.clientY + nearby[i + 1]}, "client"));
183
- for (var j = 0; j < spans.length; ++j) {
184
- var span = spans[j], ann = span.__annotation;
185
- if (ann) return popupSpanTooltip(ann, e);
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
+ });