codemirror-rails 4.3 → 4.4
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 +321 -158
- data/vendor/assets/javascripts/codemirror/addons/comment/comment.js +11 -0
- data/vendor/assets/javascripts/codemirror/addons/edit/closebrackets.js +20 -5
- data/vendor/assets/javascripts/codemirror/addons/hint/show-hint.js +2 -2
- data/vendor/assets/javascripts/codemirror/addons/lint/lint.js +2 -3
- data/vendor/assets/javascripts/codemirror/addons/search/search.js +1 -0
- data/vendor/assets/javascripts/codemirror/addons/search/searchcursor.js +1 -1
- data/vendor/assets/javascripts/codemirror/keymaps/sublime.js +23 -5
- data/vendor/assets/javascripts/codemirror/keymaps/vim.js +425 -118
- data/vendor/assets/javascripts/codemirror/modes/clike.js +1 -0
- data/vendor/assets/javascripts/codemirror/modes/css.js +3 -3
- data/vendor/assets/javascripts/codemirror/modes/javascript.js +2 -0
- data/vendor/assets/javascripts/codemirror/modes/kotlin.js +280 -0
- data/vendor/assets/javascripts/codemirror/modes/puppet.js +1 -1
- data/vendor/assets/javascripts/codemirror/modes/ruby.js +18 -4
- data/vendor/assets/javascripts/codemirror/modes/smartymixed.js +17 -12
- data/vendor/assets/javascripts/codemirror/modes/vbscript.js +1 -1
- data/vendor/assets/javascripts/codemirror/modes/yaml.js +1 -1
- metadata +2 -1
@@ -461,13 +461,13 @@ CodeMirror.defineMode("css", function(config, parserConfig) {
|
|
461
461
|
"glyph-orientation-vertical", "text-anchor", "writing-mode"
|
462
462
|
], propertyKeywords = keySet(propertyKeywords_);
|
463
463
|
|
464
|
-
var
|
464
|
+
var nonStandardPropertyKeywords_ = [
|
465
465
|
"scrollbar-arrow-color", "scrollbar-base-color", "scrollbar-dark-shadow-color",
|
466
466
|
"scrollbar-face-color", "scrollbar-highlight-color", "scrollbar-shadow-color",
|
467
467
|
"scrollbar-3d-light-color", "scrollbar-track-color", "shape-inside",
|
468
468
|
"searchfield-cancel-button", "searchfield-decoration", "searchfield-results-button",
|
469
469
|
"searchfield-results-decoration", "zoom"
|
470
|
-
], nonStandardPropertyKeywords = keySet(
|
470
|
+
], nonStandardPropertyKeywords = keySet(nonStandardPropertyKeywords_);
|
471
471
|
|
472
472
|
var colorKeywords_ = [
|
473
473
|
"aliceblue", "antiquewhite", "aqua", "aquamarine", "azure", "beige",
|
@@ -589,7 +589,7 @@ CodeMirror.defineMode("css", function(config, parserConfig) {
|
|
589
589
|
], fontProperties = keySet(fontProperties_);
|
590
590
|
|
591
591
|
var allWords = mediaTypes_.concat(mediaFeatures_).concat(propertyKeywords_)
|
592
|
-
.concat(
|
592
|
+
.concat(nonStandardPropertyKeywords_).concat(colorKeywords_).concat(valueKeywords_);
|
593
593
|
CodeMirror.registerHelper("hintWords", "css", allWords);
|
594
594
|
|
595
595
|
function tokenCComment(stream, state) {
|
@@ -298,6 +298,8 @@ CodeMirror.defineMode("javascript", function(config, parserConfig) {
|
|
298
298
|
var result = function() {
|
299
299
|
var state = cx.state, indent = state.indented;
|
300
300
|
if (state.lexical.type == "stat") indent = state.lexical.indented;
|
301
|
+
else for (var outer = state.lexical; outer && outer.type == ")" && outer.align; outer = outer.prev)
|
302
|
+
indent = outer.indented;
|
301
303
|
state.lexical = new JSLexical(indent, cx.stream.column(), type, null, state.lexical, info);
|
302
304
|
};
|
303
305
|
result.lex = true;
|
@@ -0,0 +1,280 @@
|
|
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.defineMode("kotlin", function (config, parserConfig) {
|
15
|
+
function words(str) {
|
16
|
+
var obj = {}, words = str.split(" ");
|
17
|
+
for (var i = 0; i < words.length; ++i) obj[words[i]] = true;
|
18
|
+
return obj;
|
19
|
+
}
|
20
|
+
|
21
|
+
var multiLineStrings = parserConfig.multiLineStrings;
|
22
|
+
|
23
|
+
var keywords = words(
|
24
|
+
"package continue return object while break class data trait throw super" +
|
25
|
+
" when type this else This try val var fun for is in if do as true false null get set");
|
26
|
+
var softKeywords = words("import" +
|
27
|
+
" where by get set abstract enum open annotation override private public internal" +
|
28
|
+
" protected catch out vararg inline finally final ref");
|
29
|
+
var blockKeywords = words("catch class do else finally for if where try while enum");
|
30
|
+
var atoms = words("null true false this");
|
31
|
+
|
32
|
+
var curPunc;
|
33
|
+
|
34
|
+
function tokenBase(stream, state) {
|
35
|
+
var ch = stream.next();
|
36
|
+
if (ch == '"' || ch == "'") {
|
37
|
+
return startString(ch, stream, state);
|
38
|
+
}
|
39
|
+
// Wildcard import w/o trailing semicolon (import smth.*)
|
40
|
+
if (ch == "." && stream.eat("*")) {
|
41
|
+
return "word";
|
42
|
+
}
|
43
|
+
if (/[\[\]{}\(\),;\:\.]/.test(ch)) {
|
44
|
+
curPunc = ch;
|
45
|
+
return null;
|
46
|
+
}
|
47
|
+
if (/\d/.test(ch)) {
|
48
|
+
if (stream.eat(/eE/)) {
|
49
|
+
stream.eat(/\+\-/);
|
50
|
+
stream.eatWhile(/\d/);
|
51
|
+
}
|
52
|
+
return "number";
|
53
|
+
}
|
54
|
+
if (ch == "/") {
|
55
|
+
if (stream.eat("*")) {
|
56
|
+
state.tokenize.push(tokenComment);
|
57
|
+
return tokenComment(stream, state);
|
58
|
+
}
|
59
|
+
if (stream.eat("/")) {
|
60
|
+
stream.skipToEnd();
|
61
|
+
return "comment";
|
62
|
+
}
|
63
|
+
if (expectExpression(state.lastToken)) {
|
64
|
+
return startString(ch, stream, state);
|
65
|
+
}
|
66
|
+
}
|
67
|
+
// Commented
|
68
|
+
if (ch == "-" && stream.eat(">")) {
|
69
|
+
curPunc = "->";
|
70
|
+
return null;
|
71
|
+
}
|
72
|
+
if (/[\-+*&%=<>!?|\/~]/.test(ch)) {
|
73
|
+
stream.eatWhile(/[\-+*&%=<>|~]/);
|
74
|
+
return "operator";
|
75
|
+
}
|
76
|
+
stream.eatWhile(/[\w\$_]/);
|
77
|
+
|
78
|
+
var cur = stream.current();
|
79
|
+
if (atoms.propertyIsEnumerable(cur)) {
|
80
|
+
return "atom";
|
81
|
+
}
|
82
|
+
if (softKeywords.propertyIsEnumerable(cur)) {
|
83
|
+
if (blockKeywords.propertyIsEnumerable(cur)) curPunc = "newstatement";
|
84
|
+
return "softKeyword";
|
85
|
+
}
|
86
|
+
|
87
|
+
if (keywords.propertyIsEnumerable(cur)) {
|
88
|
+
if (blockKeywords.propertyIsEnumerable(cur)) curPunc = "newstatement";
|
89
|
+
return "keyword";
|
90
|
+
}
|
91
|
+
return "word";
|
92
|
+
}
|
93
|
+
|
94
|
+
tokenBase.isBase = true;
|
95
|
+
|
96
|
+
function startString(quote, stream, state) {
|
97
|
+
var tripleQuoted = false;
|
98
|
+
if (quote != "/" && stream.eat(quote)) {
|
99
|
+
if (stream.eat(quote)) tripleQuoted = true;
|
100
|
+
else return "string";
|
101
|
+
}
|
102
|
+
function t(stream, state) {
|
103
|
+
var escaped = false, next, end = !tripleQuoted;
|
104
|
+
|
105
|
+
while ((next = stream.next()) != null) {
|
106
|
+
if (next == quote && !escaped) {
|
107
|
+
if (!tripleQuoted) {
|
108
|
+
break;
|
109
|
+
}
|
110
|
+
if (stream.match(quote + quote)) {
|
111
|
+
end = true;
|
112
|
+
break;
|
113
|
+
}
|
114
|
+
}
|
115
|
+
|
116
|
+
if (quote == '"' && next == "$" && !escaped && stream.eat("{")) {
|
117
|
+
state.tokenize.push(tokenBaseUntilBrace());
|
118
|
+
return "string";
|
119
|
+
}
|
120
|
+
|
121
|
+
if (next == "$" && !escaped && !stream.eat(" ")) {
|
122
|
+
state.tokenize.push(tokenBaseUntilSpace());
|
123
|
+
return "string";
|
124
|
+
}
|
125
|
+
escaped = !escaped && next == "\\";
|
126
|
+
}
|
127
|
+
if (multiLineStrings)
|
128
|
+
state.tokenize.push(t);
|
129
|
+
if (end) state.tokenize.pop();
|
130
|
+
return "string";
|
131
|
+
}
|
132
|
+
|
133
|
+
state.tokenize.push(t);
|
134
|
+
return t(stream, state);
|
135
|
+
}
|
136
|
+
|
137
|
+
function tokenBaseUntilBrace() {
|
138
|
+
var depth = 1;
|
139
|
+
|
140
|
+
function t(stream, state) {
|
141
|
+
if (stream.peek() == "}") {
|
142
|
+
depth--;
|
143
|
+
if (depth == 0) {
|
144
|
+
state.tokenize.pop();
|
145
|
+
return state.tokenize[state.tokenize.length - 1](stream, state);
|
146
|
+
}
|
147
|
+
} else if (stream.peek() == "{") {
|
148
|
+
depth++;
|
149
|
+
}
|
150
|
+
return tokenBase(stream, state);
|
151
|
+
}
|
152
|
+
|
153
|
+
t.isBase = true;
|
154
|
+
return t;
|
155
|
+
}
|
156
|
+
|
157
|
+
function tokenBaseUntilSpace() {
|
158
|
+
function t(stream, state) {
|
159
|
+
if (stream.eat(/[\w]/)) {
|
160
|
+
var isWord = stream.eatWhile(/[\w]/);
|
161
|
+
if (isWord) {
|
162
|
+
state.tokenize.pop();
|
163
|
+
return "word";
|
164
|
+
}
|
165
|
+
}
|
166
|
+
state.tokenize.pop();
|
167
|
+
return "string";
|
168
|
+
}
|
169
|
+
|
170
|
+
t.isBase = true;
|
171
|
+
return t;
|
172
|
+
}
|
173
|
+
|
174
|
+
function tokenComment(stream, state) {
|
175
|
+
var maybeEnd = false, ch;
|
176
|
+
while (ch = stream.next()) {
|
177
|
+
if (ch == "/" && maybeEnd) {
|
178
|
+
state.tokenize.pop();
|
179
|
+
break;
|
180
|
+
}
|
181
|
+
maybeEnd = (ch == "*");
|
182
|
+
}
|
183
|
+
return "comment";
|
184
|
+
}
|
185
|
+
|
186
|
+
function expectExpression(last) {
|
187
|
+
return !last || last == "operator" || last == "->" || /[\.\[\{\(,;:]/.test(last) ||
|
188
|
+
last == "newstatement" || last == "keyword" || last == "proplabel";
|
189
|
+
}
|
190
|
+
|
191
|
+
function Context(indented, column, type, align, prev) {
|
192
|
+
this.indented = indented;
|
193
|
+
this.column = column;
|
194
|
+
this.type = type;
|
195
|
+
this.align = align;
|
196
|
+
this.prev = prev;
|
197
|
+
}
|
198
|
+
|
199
|
+
function pushContext(state, col, type) {
|
200
|
+
return state.context = new Context(state.indented, col, type, null, state.context);
|
201
|
+
}
|
202
|
+
|
203
|
+
function popContext(state) {
|
204
|
+
var t = state.context.type;
|
205
|
+
if (t == ")" || t == "]" || t == "}")
|
206
|
+
state.indented = state.context.indented;
|
207
|
+
return state.context = state.context.prev;
|
208
|
+
}
|
209
|
+
|
210
|
+
// Interface
|
211
|
+
|
212
|
+
return {
|
213
|
+
startState: function (basecolumn) {
|
214
|
+
return {
|
215
|
+
tokenize: [tokenBase],
|
216
|
+
context: new Context((basecolumn || 0) - config.indentUnit, 0, "top", false),
|
217
|
+
indented: 0,
|
218
|
+
startOfLine: true,
|
219
|
+
lastToken: null
|
220
|
+
};
|
221
|
+
},
|
222
|
+
|
223
|
+
token: function (stream, state) {
|
224
|
+
var ctx = state.context;
|
225
|
+
if (stream.sol()) {
|
226
|
+
if (ctx.align == null) ctx.align = false;
|
227
|
+
state.indented = stream.indentation();
|
228
|
+
state.startOfLine = true;
|
229
|
+
// Automatic semicolon insertion
|
230
|
+
if (ctx.type == "statement" && !expectExpression(state.lastToken)) {
|
231
|
+
popContext(state);
|
232
|
+
ctx = state.context;
|
233
|
+
}
|
234
|
+
}
|
235
|
+
if (stream.eatSpace()) return null;
|
236
|
+
curPunc = null;
|
237
|
+
var style = state.tokenize[state.tokenize.length - 1](stream, state);
|
238
|
+
if (style == "comment") return style;
|
239
|
+
if (ctx.align == null) ctx.align = true;
|
240
|
+
if ((curPunc == ";" || curPunc == ":") && ctx.type == "statement") popContext(state);
|
241
|
+
// Handle indentation for {x -> \n ... }
|
242
|
+
else if (curPunc == "->" && ctx.type == "statement" && ctx.prev.type == "}") {
|
243
|
+
popContext(state);
|
244
|
+
state.context.align = false;
|
245
|
+
}
|
246
|
+
else if (curPunc == "{") pushContext(state, stream.column(), "}");
|
247
|
+
else if (curPunc == "[") pushContext(state, stream.column(), "]");
|
248
|
+
else if (curPunc == "(") pushContext(state, stream.column(), ")");
|
249
|
+
else if (curPunc == "}") {
|
250
|
+
while (ctx.type == "statement") ctx = popContext(state);
|
251
|
+
if (ctx.type == "}") ctx = popContext(state);
|
252
|
+
while (ctx.type == "statement") ctx = popContext(state);
|
253
|
+
}
|
254
|
+
else if (curPunc == ctx.type) popContext(state);
|
255
|
+
else if (ctx.type == "}" || ctx.type == "top" || (ctx.type == "statement" && curPunc == "newstatement"))
|
256
|
+
pushContext(state, stream.column(), "statement");
|
257
|
+
state.startOfLine = false;
|
258
|
+
state.lastToken = curPunc || style;
|
259
|
+
return style;
|
260
|
+
},
|
261
|
+
|
262
|
+
indent: function (state, textAfter) {
|
263
|
+
if (!state.tokenize[state.tokenize.length - 1].isBase) return 0;
|
264
|
+
var firstChar = textAfter && textAfter.charAt(0), ctx = state.context;
|
265
|
+
if (ctx.type == "statement" && !expectExpression(state.lastToken)) ctx = ctx.prev;
|
266
|
+
var closing = firstChar == ctx.type;
|
267
|
+
if (ctx.type == "statement") {
|
268
|
+
return ctx.indented + (firstChar == "{" ? 0 : config.indentUnit);
|
269
|
+
}
|
270
|
+
else if (ctx.align) return ctx.column + (closing ? 0 : 1);
|
271
|
+
else return ctx.indented + (closing ? 0 : config.indentUnit);
|
272
|
+
},
|
273
|
+
|
274
|
+
electricChars: "{}"
|
275
|
+
};
|
276
|
+
});
|
277
|
+
|
278
|
+
CodeMirror.defineMIME("text/x-kotlin", "kotlin");
|
279
|
+
|
280
|
+
});
|
@@ -176,7 +176,7 @@ CodeMirror.defineMode("puppet", function () {
|
|
176
176
|
// Match characters that we are going to assume
|
177
177
|
// are trying to be regex
|
178
178
|
if (ch == '/') {
|
179
|
-
stream.match(
|
179
|
+
stream.match(/.*?\//);
|
180
180
|
return 'variable-3';
|
181
181
|
}
|
182
182
|
// Match all the numbers
|
@@ -46,16 +46,30 @@ CodeMirror.defineMode("ruby", function(config) {
|
|
46
46
|
var ch = stream.next(), m;
|
47
47
|
if (ch == "`" || ch == "'" || ch == '"') {
|
48
48
|
return chain(readQuoted(ch, "string", ch == '"' || ch == "`"), stream, state);
|
49
|
-
} else if (ch == "/"
|
50
|
-
|
51
|
-
|
49
|
+
} else if (ch == "/") {
|
50
|
+
var currentIndex = stream.current().length;
|
51
|
+
if (stream.skipTo("/")) {
|
52
|
+
var search_till = stream.current().length;
|
53
|
+
stream.backUp(stream.current().length - currentIndex);
|
54
|
+
var balance = 0; // balance brackets
|
55
|
+
while (stream.current().length < search_till) {
|
56
|
+
var chchr = stream.next();
|
57
|
+
if (chchr == "(") balance += 1;
|
58
|
+
else if (chchr == ")") balance -= 1;
|
59
|
+
if (balance < 0) break;
|
60
|
+
}
|
61
|
+
stream.backUp(stream.current().length - currentIndex);
|
62
|
+
if (balance == 0)
|
63
|
+
return chain(readQuoted(ch, "string-2", true), stream, state);
|
64
|
+
}
|
65
|
+
return "operator";
|
52
66
|
} else if (ch == "%") {
|
53
67
|
var style = "string", embed = true;
|
54
68
|
if (stream.eat("s")) style = "atom";
|
55
69
|
else if (stream.eat(/[WQ]/)) style = "string";
|
56
70
|
else if (stream.eat(/[r]/)) style = "string-2";
|
57
71
|
else if (stream.eat(/[wxq]/)) { style = "string"; embed = false; }
|
58
|
-
var delim = stream.eat(/[^\w\s]/);
|
72
|
+
var delim = stream.eat(/[^\w\s=]/);
|
59
73
|
if (!delim) return "operator";
|
60
74
|
if (matching.propertyIsEnumerable(delim)) delim = matching[delim];
|
61
75
|
return chain(readQuoted(delim, style, embed, true), stream, state);
|
@@ -9,6 +9,9 @@
|
|
9
9
|
* @date 05.07.2013
|
10
10
|
*/
|
11
11
|
|
12
|
+
// Warning: Don't base other modes on this one. This here is a
|
13
|
+
// terrible way to write a mixed mode.
|
14
|
+
|
12
15
|
(function(mod) {
|
13
16
|
if (typeof exports == "object" && typeof module == "object") // CommonJS
|
14
17
|
mod(require("../../lib/codemirror"), require("../htmlmixed/htmlmixed"), require("../smarty/smarty"));
|
@@ -20,11 +23,10 @@
|
|
20
23
|
"use strict";
|
21
24
|
|
22
25
|
CodeMirror.defineMode("smartymixed", function(config) {
|
23
|
-
var
|
24
|
-
|
25
|
-
smartyMode = CodeMirror.getMode(config, "smarty"),
|
26
|
+
var htmlMixedMode = CodeMirror.getMode(config, "htmlmixed");
|
27
|
+
var smartyMode = CodeMirror.getMode(config, "smarty");
|
26
28
|
|
27
|
-
settings = {
|
29
|
+
var settings = {
|
28
30
|
rightDelimiter: '}',
|
29
31
|
leftDelimiter: '{'
|
30
32
|
};
|
@@ -36,15 +38,18 @@ CodeMirror.defineMode("smartymixed", function(config) {
|
|
36
38
|
settings.rightDelimiter = config.rightDelimiter;
|
37
39
|
}
|
38
40
|
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
41
|
+
function reEsc(str) { return str.replace(/[^\s\w]/g, "\\$&"); }
|
42
|
+
|
43
|
+
var reLeft = reEsc(settings.leftDelimiter), reRight = reEsc(settings.rightDelimiter);
|
44
|
+
var regs = {
|
45
|
+
smartyComment: new RegExp("^" + reRight + "\\*"),
|
46
|
+
literalOpen: new RegExp(reLeft + "literal" + reRight),
|
47
|
+
literalClose: new RegExp(reLeft + "\/literal" + reRight),
|
48
|
+
hasLeftDelimeter: new RegExp(".*" + reLeft),
|
49
|
+
htmlHasLeftDelimeter: new RegExp("[^<>]*" + reLeft)
|
45
50
|
};
|
46
51
|
|
47
|
-
helpers = {
|
52
|
+
var helpers = {
|
48
53
|
chain: function(stream, state, parser) {
|
49
54
|
state.tokenize = parser;
|
50
55
|
return parser(stream, state);
|
@@ -70,7 +75,7 @@ CodeMirror.defineMode("smartymixed", function(config) {
|
|
70
75
|
}
|
71
76
|
};
|
72
77
|
|
73
|
-
parsers = {
|
78
|
+
var parsers = {
|
74
79
|
html: function(stream, state) {
|
75
80
|
if (!state.inLiteral && stream.match(regs.htmlHasLeftDelimeter, false) && state.htmlMixedState.htmlState.tagName === null) {
|
76
81
|
state.tokenize = parsers.smarty;
|
@@ -291,7 +291,7 @@ CodeMirror.defineMode("vbscript", function(conf, parserConf) {
|
|
291
291
|
style = state.tokenize(stream, state);
|
292
292
|
|
293
293
|
current = stream.current();
|
294
|
-
if (style.substr(0, 8) === 'variable' || style==='builtin' || style==='keyword'){//|| knownWords.indexOf(current.substring(1)) > -1) {
|
294
|
+
if (style && (style.substr(0, 8) === 'variable' || style==='builtin' || style==='keyword')){//|| knownWords.indexOf(current.substring(1)) > -1) {
|
295
295
|
if (style === 'builtin' || style === 'keyword') style='variable';
|
296
296
|
if (knownWords.indexOf(current.substr(1)) > -1) style='variable-2';
|
297
297
|
|
@@ -80,7 +80,7 @@ CodeMirror.defineMode("yaml", function() {
|
|
80
80
|
}
|
81
81
|
|
82
82
|
/* pairs (associative arrays) -> key */
|
83
|
-
if (!state.pair && stream.match(/^\s
|
83
|
+
if (!state.pair && stream.match(/^\s*(?:[,\[\]{}&*!|>'"%@`][^\s'":]|[^,\[\]{}#&*!|>'"%@`])[^#]*?(?=\s*:($|\s))/)) {
|
84
84
|
state.pair = true;
|
85
85
|
state.keyCol = stream.indentation();
|
86
86
|
return "atom";
|