codemirror-rails 3.00 → 3.02
Sign up to get free protection for your applications and to get access to all the features.
- data/README.md +5 -2
- data/lib/codemirror/rails/version.rb +2 -2
- data/test/dummy/config/database.yml +25 -0
- data/test/dummy/db/.gitkeep +0 -0
- data/test/integration/codemirror_rails_integration_test.rb +1 -1
- data/vendor/assets/javascripts/codemirror.js +385 -152
- data/vendor/assets/javascripts/codemirror/keymaps/vim.js +279 -66
- data/vendor/assets/javascripts/codemirror/modes/apl.js +160 -0
- data/vendor/assets/javascripts/codemirror/modes/asterisk.js +183 -0
- data/vendor/assets/javascripts/codemirror/modes/clike.js +2 -0
- data/vendor/assets/javascripts/codemirror/modes/clojure.js +3 -3
- data/vendor/assets/javascripts/codemirror/modes/css.js +2 -2
- data/vendor/assets/javascripts/codemirror/modes/d.js +205 -0
- data/vendor/assets/javascripts/codemirror/modes/gfm.js +2 -1
- data/vendor/assets/javascripts/codemirror/modes/javascript.js +13 -2
- data/vendor/assets/javascripts/codemirror/modes/markdown.js +8 -7
- data/vendor/assets/javascripts/codemirror/modes/properties.js +0 -0
- data/vendor/assets/javascripts/codemirror/modes/sass.js +349 -0
- data/vendor/assets/javascripts/codemirror/modes/sieve.js +37 -10
- data/vendor/assets/javascripts/codemirror/modes/sql.js +268 -0
- data/vendor/assets/javascripts/codemirror/modes/xquery.js +8 -8
- data/vendor/assets/javascripts/codemirror/utils/collapserange.js +68 -0
- data/vendor/assets/javascripts/codemirror/utils/dialog.js +1 -0
- data/vendor/assets/javascripts/codemirror/utils/foldcode.js +2 -1
- data/vendor/assets/javascripts/codemirror/utils/formatting.js +9 -3
- data/vendor/assets/javascripts/codemirror/utils/javascript-hint.js +5 -4
- data/vendor/assets/javascripts/codemirror/utils/python-hint.js +93 -0
- data/vendor/assets/javascripts/codemirror/utils/runmode-standalone.js +51 -10
- data/vendor/assets/javascripts/codemirror/utils/search.js +20 -8
- data/vendor/assets/javascripts/codemirror/utils/searchcursor.js +17 -10
- data/vendor/assets/stylesheets/codemirror.css +10 -9
- metadata +47 -15
- data/vendor/assets/javascripts/codemirror/modes/xmlpure.js +0 -490
- data/vendor/assets/stylesheets/codemirror/modes/diff.css +0 -3
@@ -75,9 +75,10 @@ CodeMirror.defineMode("gfm", function(config) {
|
|
75
75
|
return "link";
|
76
76
|
}
|
77
77
|
}
|
78
|
-
if (stream.match(/^((?:[a-z][\w-]+:(?:\/{1,3}|[a-z0-9%])|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}\/)(?:[^\s()<>]+|\(
|
78
|
+
if (stream.match(/^((?:[a-z][\w-]+:(?:\/{1,3}|[a-z0-9%])|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}\/)(?:[^\s()<>]+|\([^\s()<>]*\))+(?:\([^\s()<>]*\)|[^\s`!()\[\]{};:'".,<>?«»“”‘’]))/i)) {
|
79
79
|
// URLs
|
80
80
|
// Taken from http://daringfireball.net/2010/07/improved_regex_for_matching_urls
|
81
|
+
// And then (issue #1160) simplified to make it not crash the Chrome Regexp engine
|
81
82
|
return "link";
|
82
83
|
}
|
83
84
|
stream.next();
|
@@ -196,12 +196,19 @@ CodeMirror.defineMode("javascript", function(config, parserConfig) {
|
|
196
196
|
return true;
|
197
197
|
}
|
198
198
|
function register(varname) {
|
199
|
+
function inList(list) {
|
200
|
+
for (var v = list; v; v = v.next)
|
201
|
+
if (v.name == varname) return true;
|
202
|
+
return false;
|
203
|
+
}
|
199
204
|
var state = cx.state;
|
200
205
|
if (state.context) {
|
201
206
|
cx.marked = "def";
|
202
|
-
|
203
|
-
if (v.name == varname) return;
|
207
|
+
if (inList(state.localVars)) return;
|
204
208
|
state.localVars = {name: varname, next: state.localVars};
|
209
|
+
} else {
|
210
|
+
if (inList(state.globalVars)) return;
|
211
|
+
state.globalVars = {name: varname, next: state.globalVars};
|
205
212
|
}
|
206
213
|
}
|
207
214
|
|
@@ -364,6 +371,7 @@ CodeMirror.defineMode("javascript", function(config, parserConfig) {
|
|
364
371
|
cc: [],
|
365
372
|
lexical: new JSLexical((basecolumn || 0) - indentUnit, 0, "block", false),
|
366
373
|
localVars: parserConfig.localVars,
|
374
|
+
globalVars: parserConfig.globalVars,
|
367
375
|
context: parserConfig.localVars && {vars: parserConfig.localVars},
|
368
376
|
indented: 0
|
369
377
|
};
|
@@ -406,6 +414,9 @@ CodeMirror.defineMode("javascript", function(config, parserConfig) {
|
|
406
414
|
});
|
407
415
|
|
408
416
|
CodeMirror.defineMIME("text/javascript", "javascript");
|
417
|
+
CodeMirror.defineMIME("text/ecmascript", "javascript");
|
418
|
+
CodeMirror.defineMIME("application/javascript", "javascript");
|
419
|
+
CodeMirror.defineMIME("application/ecmascript", "javascript");
|
409
420
|
CodeMirror.defineMIME("application/json", {name: "javascript", json: true});
|
410
421
|
CodeMirror.defineMIME("text/typescript", { name: "javascript", typescript: true });
|
411
422
|
CodeMirror.defineMIME("application/typescript", { name: "javascript", typescript: true });
|
@@ -10,7 +10,8 @@ CodeMirror.defineMode("markdown", function(cmCfg, modeCfg) {
|
|
10
10
|
"c++": "text/x-c++src",
|
11
11
|
java: "text/x-java",
|
12
12
|
csharp: "text/x-csharp",
|
13
|
-
"c#": "text/x-csharp"
|
13
|
+
"c#": "text/x-csharp",
|
14
|
+
scala: "text/x-scala"
|
14
15
|
};
|
15
16
|
|
16
17
|
var getMode = (function () {
|
@@ -246,8 +247,8 @@ CodeMirror.defineMode("markdown", function(cmCfg, modeCfg) {
|
|
246
247
|
return getType(state);
|
247
248
|
}
|
248
249
|
|
249
|
-
if (ch === '!' && stream.match(/\[
|
250
|
-
stream.match(/\[
|
250
|
+
if (ch === '!' && stream.match(/\[[^\]]*\] ?(?:\(|\[)/, false)) {
|
251
|
+
stream.match(/\[[^\]]*\]/);
|
251
252
|
state.inline = state.f = linkHref;
|
252
253
|
return image;
|
253
254
|
}
|
@@ -456,10 +457,10 @@ CodeMirror.defineMode("markdown", function(cmCfg, modeCfg) {
|
|
456
457
|
var indentation = stream.match(/^\s*/, true)[0].replace(/\t/g, ' ').length;
|
457
458
|
var difference = Math.floor((indentation - state.indentation) / 4) * 4;
|
458
459
|
if (difference > 4) difference = 4;
|
459
|
-
|
460
|
-
state.indentationDiff =
|
461
|
-
state.indentation =
|
462
|
-
if (indentation > 0)
|
460
|
+
var adjustedIndentation = state.indentation + difference;
|
461
|
+
state.indentationDiff = adjustedIndentation - state.indentation;
|
462
|
+
state.indentation = adjustedIndentation;
|
463
|
+
if (indentation > 0) return null;
|
463
464
|
}
|
464
465
|
return state.f(stream, state);
|
465
466
|
},
|
File without changes
|
@@ -0,0 +1,349 @@
|
|
1
|
+
CodeMirror.defineMode("sass", function(config) {
|
2
|
+
var tokenRegexp = function(words){
|
3
|
+
return new RegExp("^" + words.join("|"));
|
4
|
+
};
|
5
|
+
|
6
|
+
var tags = ["&", "a","abbr","acronym","address","applet","area","article","aside","audio","b","base","basefont","bdi","bdo","big","blockquote","body","br","button","canvas","caption","cite","code","col","colgroup","command","datalist","dd","del","details","dfn","dir","div","dl","dt","em","embed","fieldset","figcaption","figure","font","footer","form","frame","frameset","h1","h2","h3","h4","h5","h6","head","header","hgroup","hr","html","i","iframe","img","input","ins","keygen","kbd","label","legend","li","link","map","mark","menu","meta","meter","nav","noframes","noscript","object","ol","optgroup","option","output","p","param","pre","progress","q","rp","rt","ruby","s","samp","script","section","select","small","source","span","strike","strong","style","sub","summary","sup","table","tbody","td","textarea","tfoot","th","thead","time","title","tr","track","tt","u","ul","var","video","wbr"];
|
7
|
+
var keywords = ["true", "false", "null", "auto"];
|
8
|
+
var keywordsRegexp = new RegExp("^" + keywords.join("|"));
|
9
|
+
|
10
|
+
var operators = ["\\(", "\\)", "=", ">", "<", "==", ">=", "<=", "\\+", "-", "\\!=", "/", "\\*", "%", "and", "or", "not"];
|
11
|
+
var opRegexp = tokenRegexp(operators);
|
12
|
+
|
13
|
+
function htmlTag(val){
|
14
|
+
for(var i=0; i<tags.length; i++){
|
15
|
+
if(val === tags[i]){
|
16
|
+
return true;
|
17
|
+
}
|
18
|
+
}
|
19
|
+
}
|
20
|
+
|
21
|
+
|
22
|
+
var pseudoElements = [':first-line', ':hover', ':first-letter', ':active', ':visited', ':before', ':after', ':link', ':focus', ':first-child', ':lang'];
|
23
|
+
var pseudoElementsRegexp = new RegExp("^(" + pseudoElements.join("\\b|") + ")");
|
24
|
+
|
25
|
+
var urlTokens = function(stream, state){
|
26
|
+
var ch = stream.peek();
|
27
|
+
|
28
|
+
if (ch === ")"){
|
29
|
+
stream.next();
|
30
|
+
state.tokenizer = tokenBase;
|
31
|
+
return "operator";
|
32
|
+
}else if (ch === "("){
|
33
|
+
stream.next();
|
34
|
+
stream.eatSpace();
|
35
|
+
|
36
|
+
return "operator";
|
37
|
+
}else if (ch === "'" || ch === '"'){
|
38
|
+
state.tokenizer = buildStringTokenizer(stream.next());
|
39
|
+
return "string";
|
40
|
+
}else{
|
41
|
+
state.tokenizer = buildStringTokenizer(")", false);
|
42
|
+
return "string";
|
43
|
+
}
|
44
|
+
};
|
45
|
+
var multilineComment = function(stream, state) {
|
46
|
+
if (stream.skipTo("*/")){
|
47
|
+
stream.next();
|
48
|
+
stream.next();
|
49
|
+
state.tokenizer = tokenBase;
|
50
|
+
}else {
|
51
|
+
stream.next();
|
52
|
+
}
|
53
|
+
|
54
|
+
return "comment";
|
55
|
+
};
|
56
|
+
|
57
|
+
var buildStringTokenizer = function(quote, greedy){
|
58
|
+
if(greedy == null){ greedy = true; }
|
59
|
+
|
60
|
+
function stringTokenizer(stream, state){
|
61
|
+
var nextChar = stream.next();
|
62
|
+
var peekChar = stream.peek();
|
63
|
+
var previousChar = stream.string.charAt(stream.pos-2);
|
64
|
+
|
65
|
+
var endingString = ((nextChar !== "\\" && peekChar === quote) || (nextChar === quote && previousChar !== "\\"));
|
66
|
+
|
67
|
+
/*
|
68
|
+
console.log("previousChar: " + previousChar);
|
69
|
+
console.log("nextChar: " + nextChar);
|
70
|
+
console.log("peekChar: " + peekChar);
|
71
|
+
console.log("ending: " + endingString);
|
72
|
+
*/
|
73
|
+
|
74
|
+
if (endingString){
|
75
|
+
if (nextChar !== quote && greedy) { stream.next(); }
|
76
|
+
state.tokenizer = tokenBase;
|
77
|
+
return "string";
|
78
|
+
}else if (nextChar === "#" && peekChar === "{"){
|
79
|
+
state.tokenizer = buildInterpolationTokenizer(stringTokenizer);
|
80
|
+
stream.next();
|
81
|
+
return "operator";
|
82
|
+
}else {
|
83
|
+
return "string";
|
84
|
+
}
|
85
|
+
}
|
86
|
+
|
87
|
+
return stringTokenizer;
|
88
|
+
};
|
89
|
+
|
90
|
+
var buildInterpolationTokenizer = function(currentTokenizer){
|
91
|
+
return function(stream, state){
|
92
|
+
if (stream.peek() === "}"){
|
93
|
+
stream.next();
|
94
|
+
state.tokenizer = currentTokenizer;
|
95
|
+
return "operator";
|
96
|
+
}else{
|
97
|
+
return tokenBase(stream, state);
|
98
|
+
}
|
99
|
+
};
|
100
|
+
};
|
101
|
+
|
102
|
+
var indent = function(state){
|
103
|
+
if (state.indentCount == 0){
|
104
|
+
state.indentCount++;
|
105
|
+
var lastScopeOffset = state.scopes[0].offset;
|
106
|
+
var currentOffset = lastScopeOffset + config.indentUnit;
|
107
|
+
state.scopes.unshift({ offset:currentOffset });
|
108
|
+
}
|
109
|
+
};
|
110
|
+
|
111
|
+
var dedent = function(state){
|
112
|
+
if (state.scopes.length == 1) { return; }
|
113
|
+
|
114
|
+
state.scopes.shift();
|
115
|
+
};
|
116
|
+
|
117
|
+
var tokenBase = function(stream, state) {
|
118
|
+
var ch = stream.peek();
|
119
|
+
|
120
|
+
// Single line Comment
|
121
|
+
if (stream.match('//')) {
|
122
|
+
stream.skipToEnd();
|
123
|
+
return "comment";
|
124
|
+
}
|
125
|
+
|
126
|
+
// Multiline Comment
|
127
|
+
if (stream.match('/*')){
|
128
|
+
state.tokenizer = multilineComment;
|
129
|
+
return state.tokenizer(stream, state);
|
130
|
+
}
|
131
|
+
|
132
|
+
// Interpolation
|
133
|
+
if (stream.match('#{')){
|
134
|
+
state.tokenizer = buildInterpolationTokenizer(tokenBase);
|
135
|
+
return "operator";
|
136
|
+
}
|
137
|
+
|
138
|
+
if (ch === "."){
|
139
|
+
stream.next();
|
140
|
+
|
141
|
+
// Match class selectors
|
142
|
+
if (stream.match(/^[\w-]+/)){
|
143
|
+
indent(state);
|
144
|
+
return "atom";
|
145
|
+
}else if (stream.peek() === "#"){
|
146
|
+
indent(state);
|
147
|
+
return "atom";
|
148
|
+
}else{
|
149
|
+
return "operator";
|
150
|
+
}
|
151
|
+
}
|
152
|
+
|
153
|
+
if (ch === "#"){
|
154
|
+
stream.next();
|
155
|
+
|
156
|
+
// Hex numbers
|
157
|
+
if (stream.match(/[0-9a-fA-F]{6}|[0-9a-fA-F]{3}/)){
|
158
|
+
return "number";
|
159
|
+
}
|
160
|
+
|
161
|
+
// ID selectors
|
162
|
+
if (stream.match(/^[\w-]+/)){
|
163
|
+
indent(state);
|
164
|
+
return "atom";
|
165
|
+
}
|
166
|
+
|
167
|
+
if (stream.peek() === "#"){
|
168
|
+
indent(state);
|
169
|
+
return "atom";
|
170
|
+
}
|
171
|
+
}
|
172
|
+
|
173
|
+
// Numbers
|
174
|
+
if (stream.match(/^-?[0-9\.]+/)){
|
175
|
+
return "number";
|
176
|
+
}
|
177
|
+
|
178
|
+
// Units
|
179
|
+
if (stream.match(/^(px|em|in)\b/)){
|
180
|
+
return "unit";
|
181
|
+
}
|
182
|
+
|
183
|
+
if (stream.match(keywordsRegexp)){
|
184
|
+
return "keyword";
|
185
|
+
}
|
186
|
+
|
187
|
+
if (stream.match(/^url/) && stream.peek() === "("){
|
188
|
+
state.tokenizer = urlTokens;
|
189
|
+
return "atom";
|
190
|
+
}
|
191
|
+
|
192
|
+
// Variables
|
193
|
+
if (ch === "$"){
|
194
|
+
stream.next();
|
195
|
+
stream.eatWhile(/[\w-]/);
|
196
|
+
|
197
|
+
if (stream.peek() === ":"){
|
198
|
+
stream.next();
|
199
|
+
return "variable-2";
|
200
|
+
}else{
|
201
|
+
return "variable-3";
|
202
|
+
}
|
203
|
+
}
|
204
|
+
|
205
|
+
if (ch === "!"){
|
206
|
+
stream.next();
|
207
|
+
|
208
|
+
if (stream.match(/^[\w]+/)){
|
209
|
+
return "keyword";
|
210
|
+
}
|
211
|
+
|
212
|
+
return "operator";
|
213
|
+
}
|
214
|
+
|
215
|
+
if (ch === "="){
|
216
|
+
stream.next();
|
217
|
+
|
218
|
+
// Match shortcut mixin definition
|
219
|
+
if (stream.match(/^[\w-]+/)){
|
220
|
+
indent(state);
|
221
|
+
return "meta";
|
222
|
+
}else {
|
223
|
+
return "operator";
|
224
|
+
}
|
225
|
+
}
|
226
|
+
|
227
|
+
if (ch === "+"){
|
228
|
+
stream.next();
|
229
|
+
|
230
|
+
// Match shortcut mixin definition
|
231
|
+
if (stream.match(/^[\w-]+/)){
|
232
|
+
return "variable-3";
|
233
|
+
}else {
|
234
|
+
return "operator";
|
235
|
+
}
|
236
|
+
}
|
237
|
+
|
238
|
+
// Indent Directives
|
239
|
+
if (stream.match(/^@(else if|if|media|else|for|each|while|mixin|function)/)){
|
240
|
+
indent(state);
|
241
|
+
return "meta";
|
242
|
+
}
|
243
|
+
|
244
|
+
// Other Directives
|
245
|
+
if (ch === "@"){
|
246
|
+
stream.next();
|
247
|
+
stream.eatWhile(/[\w-]/);
|
248
|
+
return "meta";
|
249
|
+
}
|
250
|
+
|
251
|
+
// Strings
|
252
|
+
if (ch === '"' || ch === "'"){
|
253
|
+
stream.next();
|
254
|
+
state.tokenizer = buildStringTokenizer(ch);
|
255
|
+
return "string";
|
256
|
+
}
|
257
|
+
|
258
|
+
// Pseudo element selectors
|
259
|
+
if (stream.match(pseudoElementsRegexp)){
|
260
|
+
return "keyword";
|
261
|
+
}
|
262
|
+
|
263
|
+
// atoms
|
264
|
+
if (stream.eatWhile(/[\w-&]/)){
|
265
|
+
|
266
|
+
var current = stream.current();
|
267
|
+
// matches a property definition
|
268
|
+
if (stream.peek() === ":"){
|
269
|
+
// if this is an html tag and it has a pseudo selector, then it's an atom
|
270
|
+
if (htmlTag(current) && stream.match(pseudoElementsRegexp, false)){
|
271
|
+
return "atom";
|
272
|
+
}else{
|
273
|
+
stream.next();
|
274
|
+
return "property";
|
275
|
+
}
|
276
|
+
}
|
277
|
+
return "atom";
|
278
|
+
}
|
279
|
+
|
280
|
+
if (stream.match(opRegexp)){
|
281
|
+
return "operator";
|
282
|
+
}
|
283
|
+
|
284
|
+
// If we haven't returned by now, we move 1 character
|
285
|
+
// and return an error
|
286
|
+
stream.next();
|
287
|
+
return 'error';
|
288
|
+
};
|
289
|
+
|
290
|
+
var tokenLexer = function(stream, state) {
|
291
|
+
if (stream.sol()){
|
292
|
+
state.indentCount = 0;
|
293
|
+
}
|
294
|
+
var style = state.tokenizer(stream, state);
|
295
|
+
var current = stream.current();
|
296
|
+
|
297
|
+
if (current === "@return"){
|
298
|
+
dedent(state);
|
299
|
+
}
|
300
|
+
|
301
|
+
if (style === "atom" && htmlTag(current)){
|
302
|
+
indent(state);
|
303
|
+
}
|
304
|
+
|
305
|
+
if (style !== "error"){
|
306
|
+
var startOfToken = stream.pos - current.length;
|
307
|
+
var withCurrentIndent = startOfToken + (config.indentUnit * state.indentCount);
|
308
|
+
|
309
|
+
var newScopes = [];
|
310
|
+
|
311
|
+
for (var i = 0; i < state.scopes.length; i++){
|
312
|
+
var scope = state.scopes[i];
|
313
|
+
|
314
|
+
if (scope.offset <= withCurrentIndent){
|
315
|
+
newScopes.push(scope);
|
316
|
+
}
|
317
|
+
}
|
318
|
+
|
319
|
+
state.scopes = newScopes;
|
320
|
+
}
|
321
|
+
|
322
|
+
|
323
|
+
return style;
|
324
|
+
};
|
325
|
+
|
326
|
+
return {
|
327
|
+
startState: function() {
|
328
|
+
return {
|
329
|
+
tokenizer: tokenBase,
|
330
|
+
scopes: [{offset: 0, type: 'sass'}],
|
331
|
+
definedVars: [],
|
332
|
+
definedMixins: [],
|
333
|
+
};
|
334
|
+
},
|
335
|
+
token: function(stream, state) {
|
336
|
+
var style = tokenLexer(stream, state);
|
337
|
+
|
338
|
+
state.lastToken = { style: style, content: stream.current() };
|
339
|
+
|
340
|
+
return style;
|
341
|
+
},
|
342
|
+
|
343
|
+
indent: function(state) {
|
344
|
+
return state.scopes[0].offset;
|
345
|
+
}
|
346
|
+
};
|
347
|
+
});
|
348
|
+
|
349
|
+
CodeMirror.defineMIME("text/x-sass", "sass");
|
@@ -31,19 +31,37 @@ CodeMirror.defineMode("sieve", function(config) {
|
|
31
31
|
state.tokenize = tokenString(ch);
|
32
32
|
return state.tokenize(stream, state);
|
33
33
|
}
|
34
|
-
|
35
|
-
if (ch
|
36
|
-
|
37
|
-
|
34
|
+
|
35
|
+
if (ch == "(") {
|
36
|
+
state._indent.push("(");
|
37
|
+
// add virtual angel wings so that editor behaves...
|
38
|
+
// ...more sane incase of broken brackets
|
39
|
+
state._indent.push("{");
|
38
40
|
return null;
|
39
41
|
}
|
40
42
|
|
41
|
-
if (ch === "
|
42
|
-
|
43
|
-
state._indent--;
|
43
|
+
if (ch === "{") {
|
44
|
+
state._indent.push("{");
|
44
45
|
return null;
|
45
46
|
}
|
47
|
+
|
48
|
+
if (ch == ")") {
|
49
|
+
state._indent.pop();
|
50
|
+
state._indent.pop();
|
51
|
+
}
|
46
52
|
|
53
|
+
if (ch === "}") {
|
54
|
+
state._indent.pop();
|
55
|
+
return null;
|
56
|
+
}
|
57
|
+
|
58
|
+
if (ch == ",")
|
59
|
+
return null;
|
60
|
+
|
61
|
+
if (ch == ";")
|
62
|
+
return null;
|
63
|
+
|
64
|
+
|
47
65
|
if (/[{}\(\),;]/.test(ch))
|
48
66
|
return null;
|
49
67
|
|
@@ -62,7 +80,7 @@ CodeMirror.defineMode("sieve", function(config) {
|
|
62
80
|
return "operator";
|
63
81
|
}
|
64
82
|
|
65
|
-
stream.eatWhile(
|
83
|
+
stream.eatWhile(/\w/);
|
66
84
|
var cur = stream.current();
|
67
85
|
|
68
86
|
// "text:" *(SP / HTAB) (hash-comment / CRLF)
|
@@ -79,6 +97,8 @@ CodeMirror.defineMode("sieve", function(config) {
|
|
79
97
|
|
80
98
|
if (atoms.propertyIsEnumerable(cur))
|
81
99
|
return "atom";
|
100
|
+
|
101
|
+
return null;
|
82
102
|
}
|
83
103
|
|
84
104
|
function tokenMultiLineString(stream, state)
|
@@ -135,7 +155,7 @@ CodeMirror.defineMode("sieve", function(config) {
|
|
135
155
|
startState: function(base) {
|
136
156
|
return {tokenize: tokenBase,
|
137
157
|
baseIndent: base || 0,
|
138
|
-
_indent:
|
158
|
+
_indent: []};
|
139
159
|
},
|
140
160
|
|
141
161
|
token: function(stream, state) {
|
@@ -146,7 +166,14 @@ CodeMirror.defineMode("sieve", function(config) {
|
|
146
166
|
},
|
147
167
|
|
148
168
|
indent: function(state, _textAfter) {
|
149
|
-
|
169
|
+
var length = state._indent.length;
|
170
|
+
if (_textAfter && (_textAfter[0] == "}"))
|
171
|
+
length--;
|
172
|
+
|
173
|
+
if (length <0)
|
174
|
+
length = 0;
|
175
|
+
|
176
|
+
return length * indentUnit;
|
150
177
|
},
|
151
178
|
|
152
179
|
electricChars: "}"
|