codemirror-rails 4.12 → 4.13

Sign up to get free protection for your applications and to get access to all the features.
Files changed (27) hide show
  1. checksums.yaml +4 -4
  2. data/lib/codemirror/rails/version.rb +2 -2
  3. data/vendor/assets/javascripts/codemirror.js +45 -22
  4. data/vendor/assets/javascripts/codemirror/addons/edit/closebrackets.js +6 -4
  5. data/vendor/assets/javascripts/codemirror/addons/edit/closetag.js +1 -1
  6. data/vendor/assets/javascripts/codemirror/addons/fold/foldgutter.js +12 -4
  7. data/vendor/assets/javascripts/codemirror/addons/hint/show-hint.js +14 -9
  8. data/vendor/assets/javascripts/codemirror/addons/hint/sql-hint.js +94 -51
  9. data/vendor/assets/javascripts/codemirror/addons/lint/lint.js +2 -1
  10. data/vendor/assets/javascripts/codemirror/addons/merge/merge.js +211 -123
  11. data/vendor/assets/javascripts/codemirror/addons/scroll/annotatescrollbar.js +36 -12
  12. data/vendor/assets/javascripts/codemirror/addons/search/matchesonscrollbar.js +9 -4
  13. data/vendor/assets/javascripts/codemirror/addons/selection/selection-pointer.js +3 -0
  14. data/vendor/assets/javascripts/codemirror/addons/tern/tern.js +31 -4
  15. data/vendor/assets/javascripts/codemirror/keymaps/vim.js +46 -7
  16. data/vendor/assets/javascripts/codemirror/modes/clike.js +5 -1
  17. data/vendor/assets/javascripts/codemirror/modes/css.js +104 -55
  18. data/vendor/assets/javascripts/codemirror/modes/cypher.js +1 -1
  19. data/vendor/assets/javascripts/codemirror/modes/forth.js +180 -0
  20. data/vendor/assets/javascripts/codemirror/modes/go.js +1 -0
  21. data/vendor/assets/javascripts/codemirror/modes/idl.js +1 -1
  22. data/vendor/assets/javascripts/codemirror/modes/javascript.js +1 -1
  23. data/vendor/assets/javascripts/codemirror/modes/sql.js +1 -1
  24. data/vendor/assets/javascripts/codemirror/modes/stylus.js +444 -0
  25. data/vendor/assets/javascripts/codemirror/modes/verilog.js +192 -19
  26. data/vendor/assets/stylesheets/codemirror/themes/colorforth.css +33 -0
  27. metadata +4 -1
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 755dac8f6301821554cd558571336d2c8181b574
4
- data.tar.gz: d4833e17c60976e47d8a2f88cf9e379e32c21939
3
+ metadata.gz: 893503095237028fea620f11e8cc5a6eca7873b5
4
+ data.tar.gz: 97b7ef4412832ae76014e97a63b6b213b00e57be
5
5
  SHA512:
6
- metadata.gz: d0ae3d0e459db75b2e02b13a8277f2717221f0677f6ccd25ad942480b6f39262a81d7a11f0c75982ce97a83ba6de79f9930755423b684f8c5340585698f77870
7
- data.tar.gz: 266211c02fe70825f9df0643b7fae07692e9668b4d86885804a98e750001dd4ca2257febe6bae520421c0f162942c070f93a92dcd96423eb608bf6cf54040766
6
+ metadata.gz: 43a90310c194f85795aeede4d02fbfab6a34b3ae68523925fa3073ea1479cbabf1d87610abb4cb475dc327f18fd03c407142907167a02950772e9a2548829e0b
7
+ data.tar.gz: 2ffd75777cb370c1fbd861214816b89cb06b9b00e6e1833058b667dc0dfa14df482c212926e90e85867f3f9032897ad5130ee2c97758de8b5af0f3a888500353
@@ -1,6 +1,6 @@
1
1
  module Codemirror
2
2
  module Rails
3
- VERSION = '4.12'
4
- CODEMIRROR_VERSION = '4.12'
3
+ VERSION = '4.13'
4
+ CODEMIRROR_VERSION = '4.13'
5
5
  end
6
6
  end
@@ -110,6 +110,7 @@
110
110
  for (var opt in optionHandlers) if (optionHandlers.hasOwnProperty(opt))
111
111
  optionHandlers[opt](this, options[opt], Init);
112
112
  maybeUpdateLineNumberWidth(this);
113
+ if (options.finishInit) options.finishInit(this);
113
114
  for (var i = 0; i < initHooks.length; ++i) initHooks[i](this);
114
115
  endOperation(this);
115
116
  // Suppress optimizelegibility in Webkit, since it breaks text
@@ -649,8 +650,18 @@
649
650
  this.oldDisplayWidth = displayWidth(cm);
650
651
  this.force = force;
651
652
  this.dims = getDimensions(cm);
653
+ this.events = [];
652
654
  }
653
655
 
656
+ DisplayUpdate.prototype.signal = function(emitter, type) {
657
+ if (hasHandler(emitter, type))
658
+ this.events.push(arguments);
659
+ };
660
+ DisplayUpdate.prototype.finish = function() {
661
+ for (var i = 0; i < this.events.length; i++)
662
+ signal.apply(null, this.events[i]);
663
+ };
664
+
654
665
  function maybeClipScrollbars(cm) {
655
666
  var display = cm.display;
656
667
  if (!display.scrollbarsClipped && display.scroller.offsetWidth) {
@@ -761,9 +772,9 @@
761
772
  updateScrollbars(cm, barMeasure);
762
773
  }
763
774
 
764
- signalLater(cm, "update", cm);
775
+ update.signal(cm, "update", cm);
765
776
  if (cm.display.viewFrom != cm.display.reportedViewFrom || cm.display.viewTo != cm.display.reportedViewTo) {
766
- signalLater(cm, "viewportChange", cm, cm.display.viewFrom, cm.display.viewTo);
777
+ update.signal(cm, "viewportChange", cm, cm.display.viewFrom, cm.display.viewTo);
767
778
  cm.display.reportedViewFrom = cm.display.viewFrom; cm.display.reportedViewTo = cm.display.viewTo;
768
779
  }
769
780
  }
@@ -777,6 +788,7 @@
777
788
  updateSelection(cm);
778
789
  setDocumentHeight(cm, barMeasure);
779
790
  updateScrollbars(cm, barMeasure);
791
+ update.finish();
780
792
  }
781
793
  }
782
794
 
@@ -2237,6 +2249,8 @@
2237
2249
  // Fire change events, and delayed event handlers
2238
2250
  if (op.changeObjs)
2239
2251
  signal(cm, "changes", cm, op.changeObjs);
2252
+ if (op.update)
2253
+ op.update.finish();
2240
2254
  }
2241
2255
 
2242
2256
  // Run the given function in an operation
@@ -2611,8 +2625,10 @@
2611
2625
  }
2612
2626
 
2613
2627
  function focusInput(cm) {
2614
- if (cm.options.readOnly != "nocursor" && (!mobile || activeElt() != cm.display.input))
2615
- cm.display.input.focus();
2628
+ if (cm.options.readOnly != "nocursor" && (!mobile || activeElt() != cm.display.input)) {
2629
+ try { cm.display.input.focus(); }
2630
+ catch (e) {} // IE8 will throw if the textarea is display: none or not in DOM
2631
+ }
2616
2632
  }
2617
2633
 
2618
2634
  function ensureFocus(cm) {
@@ -5121,7 +5137,7 @@
5121
5137
  // FROMTEXTAREA
5122
5138
 
5123
5139
  CodeMirror.fromTextArea = function(textarea, options) {
5124
- if (!options) options = {};
5140
+ options = options ? copyObj(options) : {};
5125
5141
  options.value = textarea.value;
5126
5142
  if (!options.tabindex && textarea.tabindex)
5127
5143
  options.tabindex = textarea.tabindex;
@@ -5152,23 +5168,26 @@
5152
5168
  }
5153
5169
  }
5154
5170
 
5171
+ options.finishInit = function(cm) {
5172
+ cm.save = save;
5173
+ cm.getTextArea = function() { return textarea; };
5174
+ cm.toTextArea = function() {
5175
+ cm.toTextArea = isNaN; // Prevent this from being ran twice
5176
+ save();
5177
+ textarea.parentNode.removeChild(cm.getWrapperElement());
5178
+ textarea.style.display = "";
5179
+ if (textarea.form) {
5180
+ off(textarea.form, "submit", save);
5181
+ if (typeof textarea.form.submit == "function")
5182
+ textarea.form.submit = realSubmit;
5183
+ }
5184
+ };
5185
+ };
5186
+
5155
5187
  textarea.style.display = "none";
5156
5188
  var cm = CodeMirror(function(node) {
5157
5189
  textarea.parentNode.insertBefore(node, textarea.nextSibling);
5158
5190
  }, options);
5159
- cm.save = save;
5160
- cm.getTextArea = function() { return textarea; };
5161
- cm.toTextArea = function() {
5162
- cm.toTextArea = isNaN; // Prevent this from being ran twice
5163
- save();
5164
- textarea.parentNode.removeChild(cm.getWrapperElement());
5165
- textarea.style.display = "";
5166
- if (textarea.form) {
5167
- off(textarea.form, "submit", save);
5168
- if (typeof textarea.form.submit == "function")
5169
- textarea.form.submit = realSubmit;
5170
- }
5171
- };
5172
5191
  return cm;
5173
5192
  };
5174
5193
 
@@ -6179,6 +6198,7 @@
6179
6198
  function defaultSpecialCharPlaceholder(ch) {
6180
6199
  var token = elt("span", "\u2022", "cm-invalidchar");
6181
6200
  token.title = "\\u" + ch.charCodeAt(0).toString(16);
6201
+ token.setAttribute("aria-label", token.title);
6182
6202
  return token;
6183
6203
  }
6184
6204
 
@@ -6212,6 +6232,7 @@
6212
6232
  if (m[0] == "\t") {
6213
6233
  var tabSize = builder.cm.options.tabSize, tabWidth = tabSize - builder.col % tabSize;
6214
6234
  var txt = content.appendChild(elt("span", spaceStr(tabWidth), "cm-tab"));
6235
+ txt.setAttribute("role", "presentation");
6215
6236
  builder.col += tabWidth;
6216
6237
  } else {
6217
6238
  var txt = builder.cm.options.specialCharPlaceholder(m[0]);
@@ -7576,12 +7597,14 @@
7576
7597
  return removeChildren(parent).appendChild(e);
7577
7598
  }
7578
7599
 
7579
- function contains(parent, child) {
7600
+ var contains = CodeMirror.contains = function(parent, child) {
7580
7601
  if (parent.contains)
7581
7602
  return parent.contains(child);
7582
- while (child = child.parentNode)
7603
+ while (child = child.parentNode) {
7604
+ if (child.nodeType == 11) child = child.host;
7583
7605
  if (child == parent) return true;
7584
- }
7606
+ }
7607
+ };
7585
7608
 
7586
7609
  function activeElt() { return document.activeElement; }
7587
7610
  // Older versions of IE throws unspecified error when touching
@@ -8039,7 +8062,7 @@
8039
8062
 
8040
8063
  // THE END
8041
8064
 
8042
- CodeMirror.version = "4.12.0";
8065
+ CodeMirror.version = "4.13.0";
8043
8066
 
8044
8067
  return CodeMirror;
8045
8068
  });
@@ -10,6 +10,7 @@
10
10
  mod(CodeMirror);
11
11
  })(function(CodeMirror) {
12
12
  var DEFAULT_BRACKETS = "()[]{}''\"\"";
13
+ var DEFAULT_TRIPLES = "'\"";
13
14
  var DEFAULT_EXPLODE_ON_ENTER = "[]{}";
14
15
  var SPACE_CHAR_REGEX = /\s/;
15
16
 
@@ -19,13 +20,14 @@
19
20
  if (old != CodeMirror.Init && old)
20
21
  cm.removeKeyMap("autoCloseBrackets");
21
22
  if (!val) return;
22
- var pairs = DEFAULT_BRACKETS, explode = DEFAULT_EXPLODE_ON_ENTER;
23
+ var pairs = DEFAULT_BRACKETS, triples = DEFAULT_TRIPLES, explode = DEFAULT_EXPLODE_ON_ENTER;
23
24
  if (typeof val == "string") pairs = val;
24
25
  else if (typeof val == "object") {
25
26
  if (val.pairs != null) pairs = val.pairs;
27
+ if (val.triples != null) triples = val.triples;
26
28
  if (val.explode != null) explode = val.explode;
27
29
  }
28
- var map = buildKeymap(pairs);
30
+ var map = buildKeymap(pairs, triples);
29
31
  if (explode) map.Enter = buildExplodeHandler(explode);
30
32
  cm.addKeyMap(map);
31
33
  });
@@ -52,7 +54,7 @@
52
54
  }
53
55
  }
54
56
 
55
- function buildKeymap(pairs) {
57
+ function buildKeymap(pairs, triples) {
56
58
  var map = {
57
59
  name : "autoCloseBrackets",
58
60
  Backspace: function(cm) {
@@ -85,7 +87,7 @@
85
87
  curType = "skipThree";
86
88
  else
87
89
  curType = "skip";
88
- } else if (left == right && cur.ch > 1 &&
90
+ } else if (left == right && cur.ch > 1 && triples.indexOf(left) >= 0 &&
89
91
  cm.getRange(Pos(cur.line, cur.ch - 2), cur) == left + left &&
90
92
  (cur.ch <= 2 || cm.getRange(Pos(cur.line, cur.ch - 3), Pos(cur.line, cur.ch - 2)) != left)) {
91
93
  curType = "addFour";
@@ -131,7 +131,7 @@
131
131
 
132
132
  function autoCloseSlash(cm) {
133
133
  if (cm.getOption("disableInput")) return CodeMirror.Pass;
134
- autoCloseCurrent(cm, true);
134
+ return autoCloseCurrent(cm, true);
135
135
  }
136
136
 
137
137
  CodeMirror.commands.closeTag = function(cm) { return autoCloseCurrent(cm); };
@@ -94,20 +94,26 @@
94
94
  }
95
95
 
96
96
  function onGutterClick(cm, line, gutter) {
97
- var opts = cm.state.foldGutter.options;
97
+ var state = cm.state.foldGutter;
98
+ if (!state) return;
99
+ var opts = state.options;
98
100
  if (gutter != opts.gutter) return;
99
101
  cm.foldCode(Pos(line, 0), opts.rangeFinder);
100
102
  }
101
103
 
102
104
  function onChange(cm) {
103
- var state = cm.state.foldGutter, opts = cm.state.foldGutter.options;
105
+ var state = cm.state.foldGutter;
106
+ if (!state) return;
107
+ var opts = state.options;
104
108
  state.from = state.to = 0;
105
109
  clearTimeout(state.changeUpdate);
106
110
  state.changeUpdate = setTimeout(function() { updateInViewport(cm); }, opts.foldOnChangeTimeSpan || 600);
107
111
  }
108
112
 
109
113
  function onViewportChange(cm) {
110
- var state = cm.state.foldGutter, opts = cm.state.foldGutter.options;
114
+ var state = cm.state.foldGutter;
115
+ if (!state) return;
116
+ var opts = state.options;
111
117
  clearTimeout(state.changeUpdate);
112
118
  state.changeUpdate = setTimeout(function() {
113
119
  var vp = cm.getViewport();
@@ -129,7 +135,9 @@
129
135
  }
130
136
 
131
137
  function onFold(cm, from) {
132
- var state = cm.state.foldGutter, line = from.line;
138
+ var state = cm.state.foldGutter;
139
+ if (!state) return;
140
+ var line = from.line;
133
141
  if (line >= state.from && line < state.to)
134
142
  updateFoldInfo(cm, line, line + 1);
135
143
  }
@@ -24,6 +24,18 @@
24
24
  return cm.showHint(newOpts);
25
25
  };
26
26
 
27
+ var asyncRunID = 0;
28
+ function retrieveHints(getter, cm, options, then) {
29
+ if (getter.async) {
30
+ var id = ++asyncRunID;
31
+ getter(cm, function(hints) {
32
+ if (asyncRunID == id) then(hints);
33
+ }, options);
34
+ } else {
35
+ then(getter(cm, options));
36
+ }
37
+ }
38
+
27
39
  CodeMirror.defineExtension("showHint", function(options) {
28
40
  // We want a single cursor position.
29
41
  if (this.listSelections().length > 1 || this.somethingSelected()) return;
@@ -34,10 +46,7 @@
34
46
  if (!getHints) return;
35
47
 
36
48
  CodeMirror.signal(this, "startCompletion", this);
37
- if (getHints.async)
38
- getHints(this, function(hints) { completion.showHints(hints); }, completion.options);
39
- else
40
- return completion.showHints(getHints(this, completion.options));
49
+ return retrieveHints(getHints, this, completion.options, function(hints) { completion.showHints(hints); });
41
50
  });
42
51
 
43
52
  function Completion(cm, options) {
@@ -102,11 +111,7 @@
102
111
  function update() {
103
112
  if (finished) return;
104
113
  CodeMirror.signal(data, "update");
105
- var getHints = completion.options.hint;
106
- if (getHints.async)
107
- getHints(completion.cm, finishUpdate, completion.options);
108
- else
109
- finishUpdate(getHints(completion.cm, completion.options));
114
+ retrieveHints(completion.options.hint, completion.cm, completion.options, finishUpdate);
110
115
  }
111
116
  function finishUpdate(data_) {
112
117
  data = data_;
@@ -26,9 +26,26 @@
26
26
  return CodeMirror.resolveMode(mode).keywords;
27
27
  }
28
28
 
29
+ function getText(item) {
30
+ return typeof item == "string" ? item : item.text;
31
+ }
32
+
33
+ function getItem(list, item) {
34
+ if (!list.slice) return list[item];
35
+ for (var i = list.length - 1; i >= 0; i--) if (getText(list[i]) == item)
36
+ return list[i];
37
+ }
38
+
39
+ function shallowClone(object) {
40
+ var result = {};
41
+ for (var key in object) if (object.hasOwnProperty(key))
42
+ result[key] = object[key];
43
+ return result;
44
+ }
45
+
29
46
  function match(string, word) {
30
47
  var len = string.length;
31
- var sub = word.substr(0, len);
48
+ var sub = getText(word).substr(0, len);
32
49
  return string.toUpperCase() === sub.toUpperCase();
33
50
  }
34
51
 
@@ -44,53 +61,81 @@
44
61
  }
45
62
  }
46
63
 
64
+ function cleanName(name) {
65
+ // Get rid name from backticks(`) and preceding dot(.)
66
+ if (name.charAt(0) == ".") {
67
+ name = name.substr(1);
68
+ }
69
+ return name.replace(/`/g, "");
70
+ }
71
+
72
+ function insertBackticks(name) {
73
+ var nameParts = getText(name).split(".");
74
+ for (var i = 0; i < nameParts.length; i++)
75
+ nameParts[i] = "`" + nameParts[i] + "`";
76
+ var escaped = nameParts.join(".");
77
+ if (typeof name == "string") return escaped;
78
+ name = shallowClone(name);
79
+ name.text = escaped;
80
+ return name;
81
+ }
82
+
47
83
  function nameCompletion(cur, token, result, editor) {
48
- var useBacktick = (token.string.charAt(0) == "`");
49
- var string = token.string.substr(1);
50
- var prevToken = editor.getTokenAt(Pos(cur.line, token.start));
51
- if (token.string.charAt(0) == "." || prevToken.string == "."){
52
- //Suggest colunm names
53
- if (prevToken.string == ".") {
54
- var prevToken = editor.getTokenAt(Pos(cur.line, token.start - 1));
55
- }
56
- var table = prevToken.string;
57
- //Check if backtick is used in table name. If yes, use it for columns too.
58
- var useBacktickTable = false;
59
- if (table.match(/`/g)) {
60
- useBacktickTable = true;
61
- table = table.replace(/`/g, "");
62
- }
63
- //Check if table is available. If not, find table by Alias
64
- if (!tables.hasOwnProperty(table))
65
- table = findTableByAlias(table, editor);
66
- var columns = tables[table];
67
- if (!columns) return;
68
-
69
- if (useBacktick) {
70
- addMatches(result, string, columns, function(w) {return "`" + w + "`";});
71
- }
72
- else if(useBacktickTable) {
73
- addMatches(result, string, columns, function(w) {return ".`" + w + "`";});
74
- }
75
- else {
76
- addMatches(result, string, columns, function(w) {return "." + w;});
84
+ // Try to complete table, colunm names and return start position of completion
85
+ var useBacktick = false;
86
+ var nameParts = [];
87
+ var start = token.start;
88
+ var cont = true;
89
+ while (cont) {
90
+ cont = (token.string.charAt(0) == ".");
91
+ useBacktick = useBacktick || (token.string.charAt(0) == "`");
92
+
93
+ start = token.start;
94
+ nameParts.unshift(cleanName(token.string));
95
+
96
+ token = editor.getTokenAt(Pos(cur.line, token.start));
97
+ if (token.string == ".") {
98
+ cont = true;
99
+ token = editor.getTokenAt(Pos(cur.line, token.start));
77
100
  }
78
101
  }
79
- else {
80
- //Suggest table names or colums in defaultTable
81
- while (token.start && string.charAt(0) == ".") {
82
- token = editor.getTokenAt(Pos(cur.line, token.start - 1));
83
- string = token.string + string;
84
- }
85
- if (useBacktick) {
86
- addMatches(result, string, tables, function(w) {return "`" + w + "`";});
87
- addMatches(result, string, defaultTable, function(w) {return "`" + w + "`";});
88
- }
89
- else {
90
- addMatches(result, string, tables, function(w) {return w;});
91
- addMatches(result, string, defaultTable, function(w) {return w;});
92
- }
102
+
103
+ // Try to complete table names
104
+ var string = nameParts.join(".");
105
+ addMatches(result, string, tables, function(w) {
106
+ return useBacktick ? insertBackticks(w) : w;
107
+ });
108
+
109
+ // Try to complete columns from defaultTable
110
+ addMatches(result, string, defaultTable, function(w) {
111
+ return useBacktick ? insertBackticks(w) : w;
112
+ });
113
+
114
+ // Try to complete columns
115
+ string = nameParts.pop();
116
+ var table = nameParts.join(".");
117
+
118
+ // Check if table is available. If not, find table by Alias
119
+ if (!getItem(tables, table))
120
+ table = findTableByAlias(table, editor);
121
+
122
+ var columns = getItem(tables, table);
123
+ if (columns && Array.isArray(tables) && columns.columns)
124
+ columns = columns.columns;
125
+
126
+ if (columns) {
127
+ addMatches(result, string, columns, function(w) {
128
+ if (typeof w == "string") {
129
+ w = table + "." + w;
130
+ } else {
131
+ w = shallowClone(w);
132
+ w.text = table + "." + w.text;
133
+ }
134
+ return useBacktick ? insertBackticks(w) : w;
135
+ });
93
136
  }
137
+
138
+ return start;
94
139
  }
95
140
 
96
141
  function eachWord(lineText, f) {
@@ -150,12 +195,10 @@
150
195
  var lineText = query[i];
151
196
  eachWord(lineText, function(word) {
152
197
  var wordUpperCase = word.toUpperCase();
153
- if (wordUpperCase === aliasUpperCase && tables.hasOwnProperty(previousWord)) {
154
- table = previousWord;
155
- }
156
- if (wordUpperCase !== CONS.ALIAS_KEYWORD) {
198
+ if (wordUpperCase === aliasUpperCase && getItem(tables, previousWord))
199
+ table = previousWord;
200
+ if (wordUpperCase !== CONS.ALIAS_KEYWORD)
157
201
  previousWord = word;
158
- }
159
202
  });
160
203
  if (table) break;
161
204
  }
@@ -165,7 +208,7 @@
165
208
  CodeMirror.registerHelper("hint", "sql", function(editor, options) {
166
209
  tables = (options && options.tables) || {};
167
210
  var defaultTableName = options && options.defaultTable;
168
- defaultTable = (defaultTableName && tables[defaultTableName] || []);
211
+ defaultTable = (defaultTableName && getItem(tables, defaultTableName)) || [];
169
212
  keywords = keywords || getKeywords(editor);
170
213
 
171
214
  var cur = editor.getCursor();
@@ -185,7 +228,7 @@
185
228
  search = "";
186
229
  }
187
230
  if (search.charAt(0) == "." || search.charAt(0) == "`") {
188
- nameCompletion(cur, token, result, editor);
231
+ start = nameCompletion(cur, token, result, editor);
189
232
  } else {
190
233
  addMatches(result, search, tables, function(w) {return w;});
191
234
  addMatches(result, search, defaultTable, function(w) {return w;});