codemirror-rails 4.6 → 4.7

Sign up to get free protection for your applications and to get access to all the features.
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
+ });