codemirror-rails 3.14 → 3.15
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/codemirror/rails/version.rb +2 -2
- data/vendor/assets/javascripts/codemirror.js +178 -94
- data/vendor/assets/javascripts/codemirror/addons/comment/comment.js +3 -3
- data/vendor/assets/javascripts/codemirror/addons/edit/closebrackets.js +3 -1
- data/vendor/assets/javascripts/codemirror/addons/edit/matchtags.js +51 -0
- data/vendor/assets/javascripts/codemirror/addons/fold/brace-fold.js +9 -6
- data/vendor/assets/javascripts/codemirror/addons/fold/foldcode.js +9 -4
- data/vendor/assets/javascripts/codemirror/addons/fold/foldgutter.js +122 -0
- data/vendor/assets/javascripts/codemirror/addons/fold/indent-fold.js +3 -2
- data/vendor/assets/javascripts/codemirror/addons/fold/xml-fold.js +24 -17
- data/vendor/assets/javascripts/codemirror/addons/hint/anyword-hint.js +34 -0
- data/vendor/assets/javascripts/codemirror/addons/hint/html-hint.js +5 -3
- data/vendor/assets/javascripts/codemirror/addons/hint/javascript-hint.js +7 -3
- data/vendor/assets/javascripts/codemirror/addons/hint/pig-hint.js +4 -2
- data/vendor/assets/javascripts/codemirror/addons/hint/python-hint.js +4 -2
- data/vendor/assets/javascripts/codemirror/addons/hint/show-hint.js +6 -2
- data/vendor/assets/javascripts/codemirror/addons/hint/xml-hint.js +5 -2
- data/vendor/assets/javascripts/codemirror/addons/lint/coffeescript-lint.js +3 -2
- data/vendor/assets/javascripts/codemirror/addons/lint/javascript-lint.js +3 -6
- data/vendor/assets/javascripts/codemirror/addons/lint/json-lint.js +3 -2
- data/vendor/assets/javascripts/codemirror/addons/lint/lint.js +12 -6
- data/vendor/assets/javascripts/codemirror/addons/merge/dep/diff_match_patch.js +50 -0
- data/vendor/assets/javascripts/codemirror/addons/merge/merge.js +40 -24
- data/vendor/assets/javascripts/codemirror/addons/runmode/runmode-standalone.js +3 -1
- data/vendor/assets/javascripts/codemirror/addons/runmode/runmode.node.js +3 -1
- data/vendor/assets/javascripts/codemirror/addons/search/match-highlighter.js +11 -9
- data/vendor/assets/javascripts/codemirror/addons/selection/active-line.js +1 -1
- data/vendor/assets/javascripts/codemirror/addons/tern/tern.js +608 -0
- data/vendor/assets/javascripts/codemirror/addons/tern/worker.js +39 -0
- data/vendor/assets/javascripts/codemirror/keymaps/vim.js +120 -101
- data/vendor/assets/javascripts/codemirror/modes/clike.js +2 -1
- data/vendor/assets/javascripts/codemirror/modes/coffeescript.js +2 -1
- data/vendor/assets/javascripts/codemirror/modes/css.js +33 -16
- data/vendor/assets/javascripts/codemirror/modes/groovy.js +2 -1
- data/vendor/assets/javascripts/codemirror/modes/jade.js +90 -0
- data/vendor/assets/javascripts/codemirror/modes/javascript.js +21 -18
- data/vendor/assets/javascripts/codemirror/modes/markdown.js +26 -1
- data/vendor/assets/javascripts/codemirror/modes/nginx.js +163 -0
- data/vendor/assets/javascripts/codemirror/modes/python.js +19 -2
- data/vendor/assets/javascripts/codemirror/modes/rst.js +30 -19
- data/vendor/assets/javascripts/codemirror/modes/ruby.js +4 -4
- data/vendor/assets/javascripts/codemirror/modes/rust.js +2 -1
- data/vendor/assets/javascripts/codemirror/modes/scss_test.js +1 -1
- data/vendor/assets/javascripts/codemirror/modes/smalltalk.js +12 -2
- data/vendor/assets/javascripts/codemirror/modes/smartymixed.js +170 -0
- data/vendor/assets/javascripts/codemirror/modes/sparql.js +4 -2
- data/vendor/assets/javascripts/codemirror/modes/vbscript.js +330 -22
- data/vendor/assets/javascripts/codemirror/modes/xml.js +18 -3
- data/vendor/assets/stylesheets/codemirror.css +10 -0
- data/vendor/assets/stylesheets/codemirror/addons/merge/merge.css +39 -29
- data/vendor/assets/stylesheets/codemirror/addons/tern/tern.css +85 -0
- data/vendor/assets/stylesheets/codemirror/themes/3024-day.css +33 -0
- data/vendor/assets/stylesheets/codemirror/themes/3024-night.css +33 -0
- data/vendor/assets/stylesheets/codemirror/themes/base16-dark.css +33 -0
- data/vendor/assets/stylesheets/codemirror/themes/base16-light.css +33 -0
- data/vendor/assets/stylesheets/codemirror/themes/lesser-dark.css +1 -1
- data/vendor/assets/stylesheets/codemirror/themes/midnight.css +5 -14
- data/vendor/assets/stylesheets/codemirror/themes/tomorrow-night-eighties.css +33 -0
- data/vendor/assets/stylesheets/codemirror/themes/vibrant-ink.css +2 -2
- metadata +17 -2
@@ -103,7 +103,8 @@ CodeMirror.defineMode("css-base", function(config, parserConfig) {
|
|
103
103
|
startState: function(base) {
|
104
104
|
return {tokenize: tokenBase,
|
105
105
|
baseIndent: base || 0,
|
106
|
-
stack: []
|
106
|
+
stack: [],
|
107
|
+
lastToken: null};
|
107
108
|
},
|
108
109
|
|
109
110
|
token: function(stream, state) {
|
@@ -163,7 +164,7 @@ CodeMirror.defineMode("css-base", function(config, parserConfig) {
|
|
163
164
|
var context = state.stack[state.stack.length-1];
|
164
165
|
if (style == "variable") {
|
165
166
|
if (type == "variable-definition") state.stack.push("propertyValue");
|
166
|
-
return "variable-2";
|
167
|
+
return state.lastToken = "variable-2";
|
167
168
|
} else if (style == "property") {
|
168
169
|
var word = stream.current().toLowerCase();
|
169
170
|
if (context == "propertyValue") {
|
@@ -251,7 +252,6 @@ CodeMirror.defineMode("css-base", function(config, parserConfig) {
|
|
251
252
|
// Push/pop context stack
|
252
253
|
if (type == "{") {
|
253
254
|
if (context == "@media" || context == "@mediaType") {
|
254
|
-
state.stack.pop();
|
255
255
|
state.stack[state.stack.length-1] = "@media{";
|
256
256
|
}
|
257
257
|
else {
|
@@ -260,8 +260,7 @@ CodeMirror.defineMode("css-base", function(config, parserConfig) {
|
|
260
260
|
}
|
261
261
|
}
|
262
262
|
else if (type == "}") {
|
263
|
-
|
264
|
-
if (lastState == "interpolation") style = "operator";
|
263
|
+
if (context == "interpolation") style = "operator";
|
265
264
|
state.stack.pop();
|
266
265
|
if (context == "propertyValue") state.stack.pop();
|
267
266
|
}
|
@@ -269,26 +268,44 @@ CodeMirror.defineMode("css-base", function(config, parserConfig) {
|
|
269
268
|
else if (type == "@media") state.stack.push("@media");
|
270
269
|
else if (type == "@import") state.stack.push("@import");
|
271
270
|
else if (context == "@media" && /\b(keyword|attribute)\b/.test(style))
|
272
|
-
state.stack.
|
273
|
-
else if (context == "@mediaType" && stream.current() == ",")
|
274
|
-
|
275
|
-
else if (
|
276
|
-
|
271
|
+
state.stack[state.stack.length-1] = "@mediaType";
|
272
|
+
else if (context == "@mediaType" && stream.current() == ",")
|
273
|
+
state.stack[state.stack.length-1] = "@media";
|
274
|
+
else if (type == "(") {
|
275
|
+
if (context == "@media" || context == "@mediaType") {
|
276
|
+
// Make sure @mediaType is used to avoid error on {
|
277
|
+
state.stack[state.stack.length-1] = "@mediaType";
|
278
|
+
state.stack.push("@mediaType(");
|
279
|
+
}
|
280
|
+
}
|
281
|
+
else if (type == ")") {
|
282
|
+
if (context == "propertyValue" && state.stack[state.stack.length-2] == "@mediaType(") {
|
283
|
+
// In @mediaType( without closing ; after propertyValue
|
284
|
+
state.stack.pop();
|
285
|
+
state.stack.pop();
|
286
|
+
}
|
287
|
+
else if (context == "@mediaType(") {
|
288
|
+
state.stack.pop();
|
289
|
+
}
|
290
|
+
}
|
291
|
+
else if (type == ":" && state.lastToken == "property") state.stack.push("propertyValue");
|
277
292
|
else if (context == "propertyValue" && type == ";") state.stack.pop();
|
278
293
|
else if (context == "@import" && type == ";") state.stack.pop();
|
279
|
-
|
294
|
+
|
295
|
+
return state.lastToken = style;
|
280
296
|
},
|
281
297
|
|
282
298
|
indent: function(state, textAfter) {
|
283
299
|
var n = state.stack.length;
|
284
300
|
if (/^\}/.test(textAfter))
|
285
|
-
n -= state.stack[
|
301
|
+
n -= state.stack[n-1] == "propertyValue" ? 2 : 1;
|
286
302
|
return state.baseIndent + n * indentUnit;
|
287
303
|
},
|
288
304
|
|
289
305
|
electricChars: "}",
|
290
306
|
blockCommentStart: "/*",
|
291
|
-
blockCommentEnd: "*/"
|
307
|
+
blockCommentEnd: "*/",
|
308
|
+
fold: "brace"
|
292
309
|
};
|
293
310
|
});
|
294
311
|
|
@@ -384,15 +401,15 @@ CodeMirror.defineMode("css-base", function(config, parserConfig) {
|
|
384
401
|
"text-decoration-color", "text-decoration-line", "text-decoration-skip",
|
385
402
|
"text-decoration-style", "text-emphasis", "text-emphasis-color",
|
386
403
|
"text-emphasis-position", "text-emphasis-style", "text-height",
|
387
|
-
"text-indent", "text-justify", "text-outline", "text-shadow",
|
388
|
-
"text-space-collapse", "text-transform", "text-underline-position",
|
404
|
+
"text-indent", "text-justify", "text-outline", "text-overflow", "text-shadow",
|
405
|
+
"text-size-adjust", "text-space-collapse", "text-transform", "text-underline-position",
|
389
406
|
"text-wrap", "top", "transform", "transform-origin", "transform-style",
|
390
407
|
"transition", "transition-delay", "transition-duration",
|
391
408
|
"transition-property", "transition-timing-function", "unicode-bidi",
|
392
409
|
"vertical-align", "visibility", "voice-balance", "voice-duration",
|
393
410
|
"voice-family", "voice-pitch", "voice-range", "voice-rate", "voice-stress",
|
394
411
|
"voice-volume", "volume", "white-space", "widows", "width", "word-break",
|
395
|
-
"word-spacing", "word-wrap", "z-index",
|
412
|
+
"word-spacing", "word-wrap", "z-index", "zoom",
|
396
413
|
// SVG-specific
|
397
414
|
"clip-path", "clip-rule", "mask", "enable-background", "filter", "flood-color",
|
398
415
|
"flood-opacity", "lighting-color", "stop-color", "stop-opacity", "pointer-events",
|
@@ -0,0 +1,90 @@
|
|
1
|
+
CodeMirror.defineMode("jade", function () {
|
2
|
+
var symbol_regex1 = /^(?:~|!|%|\^|\*|\+|=|\\|:|;|,|\/|\?|&|<|>|\|)/;
|
3
|
+
var open_paren_regex = /^(\(|\[)/;
|
4
|
+
var close_paren_regex = /^(\)|\])/;
|
5
|
+
var keyword_regex1 = /^(if|else|return|var|function|include|doctype|each)/;
|
6
|
+
var keyword_regex2 = /^(#|{|}|\.)/;
|
7
|
+
var keyword_regex3 = /^(in)/;
|
8
|
+
var html_regex1 = /^(html|head|title|meta|link|script|body|br|div|input|span|a|img)/;
|
9
|
+
var html_regex2 = /^(h1|h2|h3|h4|h5|p|strong|em)/;
|
10
|
+
return {
|
11
|
+
startState: function () {
|
12
|
+
return {
|
13
|
+
inString: false,
|
14
|
+
stringType: "",
|
15
|
+
beforeTag: true,
|
16
|
+
justMatchedKeyword: false,
|
17
|
+
afterParen: false
|
18
|
+
};
|
19
|
+
},
|
20
|
+
token: function (stream, state) {
|
21
|
+
//check for state changes
|
22
|
+
if (!state.inString && ((stream.peek() == '"') || (stream.peek() == "'"))) {
|
23
|
+
state.stringType = stream.peek();
|
24
|
+
stream.next(); // Skip quote
|
25
|
+
state.inString = true; // Update state
|
26
|
+
}
|
27
|
+
|
28
|
+
//return state
|
29
|
+
if (state.inString) {
|
30
|
+
if (stream.skipTo(state.stringType)) { // Quote found on this line
|
31
|
+
stream.next(); // Skip quote
|
32
|
+
state.inString = false; // Clear flag
|
33
|
+
} else {
|
34
|
+
stream.skipToEnd(); // Rest of line is string
|
35
|
+
}
|
36
|
+
state.justMatchedKeyword = false;
|
37
|
+
return "string"; // Token style
|
38
|
+
} else if (stream.sol() && stream.eatSpace()) {
|
39
|
+
if (stream.match(keyword_regex1)) {
|
40
|
+
state.justMatchedKeyword = true;
|
41
|
+
stream.eatSpace();
|
42
|
+
return "keyword";
|
43
|
+
}
|
44
|
+
if (stream.match(html_regex1) || stream.match(html_regex2)) {
|
45
|
+
state.justMatchedKeyword = true;
|
46
|
+
return "variable";
|
47
|
+
}
|
48
|
+
} else if (stream.sol() && stream.match(keyword_regex1)) {
|
49
|
+
state.justMatchedKeyword = true;
|
50
|
+
stream.eatSpace();
|
51
|
+
return "keyword";
|
52
|
+
} else if (stream.sol() && (stream.match(html_regex1) || stream.match(html_regex2))) {
|
53
|
+
state.justMatchedKeyword = true;
|
54
|
+
return "variable";
|
55
|
+
} else if (stream.eatSpace()) {
|
56
|
+
state.justMatchedKeyword = false;
|
57
|
+
if (stream.match(keyword_regex3) && stream.eatSpace()) {
|
58
|
+
state.justMatchedKeyword = true;
|
59
|
+
return "keyword";
|
60
|
+
}
|
61
|
+
} else if (stream.match(symbol_regex1)) {
|
62
|
+
state.justMatchedKeyword = false;
|
63
|
+
return "atom";
|
64
|
+
} else if (stream.match(open_paren_regex)) {
|
65
|
+
state.afterParen = true;
|
66
|
+
state.justMatchedKeyword = true;
|
67
|
+
return "def";
|
68
|
+
} else if (stream.match(close_paren_regex)) {
|
69
|
+
state.afterParen = false;
|
70
|
+
state.justMatchedKeyword = true;
|
71
|
+
return "def";
|
72
|
+
} else if (stream.match(keyword_regex2)) {
|
73
|
+
state.justMatchedKeyword = true;
|
74
|
+
return "keyword";
|
75
|
+
} else if (stream.eatSpace()) {
|
76
|
+
state.justMatchedKeyword = false;
|
77
|
+
} else {
|
78
|
+
stream.next();
|
79
|
+
if (state.justMatchedKeyword) {
|
80
|
+
return "property";
|
81
|
+
} else if (state.afterParen) {
|
82
|
+
return "property";
|
83
|
+
}
|
84
|
+
}
|
85
|
+
return null;
|
86
|
+
}
|
87
|
+
};
|
88
|
+
});
|
89
|
+
|
90
|
+
CodeMirror.defineMIME('text/x-jade', 'jade');
|
@@ -258,17 +258,17 @@ CodeMirror.defineMode("javascript", function(config, parserConfig) {
|
|
258
258
|
if (type == "keyword b") return cont(pushlex("form"), statement, poplex);
|
259
259
|
if (type == "{") return cont(pushlex("}"), block, poplex);
|
260
260
|
if (type == ";") return cont();
|
261
|
-
if (type == "if") return cont(pushlex("form"), expression, statement, poplex, maybeelse
|
261
|
+
if (type == "if") return cont(pushlex("form"), expression, statement, poplex, maybeelse);
|
262
262
|
if (type == "function") return cont(functiondef);
|
263
263
|
if (type == "for") return cont(pushlex("form"), expect("("), pushlex(")"), forspec1, expect(")"),
|
264
|
-
|
264
|
+
poplex, statement, poplex);
|
265
265
|
if (type == "variable") return cont(pushlex("stat"), maybelabel);
|
266
266
|
if (type == "switch") return cont(pushlex("form"), expression, pushlex("}", "switch"), expect("{"),
|
267
|
-
|
267
|
+
block, poplex, poplex);
|
268
268
|
if (type == "case") return cont(expression, expect(":"));
|
269
269
|
if (type == "default") return cont(expect(":"));
|
270
270
|
if (type == "catch") return cont(pushlex("form"), pushcontext, expect("("), funarg, expect(")"),
|
271
|
-
|
271
|
+
statement, poplex, popcontext);
|
272
272
|
return pass(pushlex("stat"), expression, expect(";"), poplex);
|
273
273
|
}
|
274
274
|
function expression(type) {
|
@@ -299,19 +299,20 @@ CodeMirror.defineMode("javascript", function(config, parserConfig) {
|
|
299
299
|
|
300
300
|
function maybeoperatorComma(type, value) {
|
301
301
|
if (type == ",") return cont(expression);
|
302
|
-
return maybeoperatorNoComma(type, value,
|
302
|
+
return maybeoperatorNoComma(type, value, false);
|
303
303
|
}
|
304
|
-
function maybeoperatorNoComma(type, value,
|
305
|
-
|
304
|
+
function maybeoperatorNoComma(type, value, noComma) {
|
305
|
+
var me = noComma == false ? maybeoperatorComma : maybeoperatorNoComma;
|
306
|
+
var expr = noComma == false ? expression : expressionNoComma;
|
306
307
|
if (type == "operator") {
|
307
308
|
if (/\+\+|--/.test(value)) return cont(me);
|
308
|
-
if (value == "?") return cont(expression, expect(":"),
|
309
|
-
return cont(
|
309
|
+
if (value == "?") return cont(expression, expect(":"), expr);
|
310
|
+
return cont(expr);
|
310
311
|
}
|
311
312
|
if (type == ";") return;
|
312
313
|
if (type == "(") return cont(pushlex(")", "call"), commasep(expressionNoComma, ")"), poplex, me);
|
313
314
|
if (type == ".") return cont(property, me);
|
314
|
-
if (type == "[") return cont(pushlex("]"),
|
315
|
+
if (type == "[") return cont(pushlex("]"), maybeexpression, expect("]"), poplex, me);
|
315
316
|
}
|
316
317
|
function maybelabel(type) {
|
317
318
|
if (type == ":") return cont(poplex, statement);
|
@@ -373,14 +374,8 @@ CodeMirror.defineMode("javascript", function(config, parserConfig) {
|
|
373
374
|
if (value == "=") return cont(expressionNoComma, vardef2);
|
374
375
|
if (type == ",") return cont(vardef1);
|
375
376
|
}
|
376
|
-
function maybeelse(
|
377
|
-
|
378
|
-
if (type == "keyword b" && value == "else") {
|
379
|
-
cx.state.lexical = new JSLexical(indent, 0, "form", null, cx.state.lexical);
|
380
|
-
return cont(statement, poplex);
|
381
|
-
}
|
382
|
-
return pass();
|
383
|
-
};
|
377
|
+
function maybeelse(type, value) {
|
378
|
+
if (type == "keyword b" && value == "else") return cont(pushlex("form"), statement, poplex);
|
384
379
|
}
|
385
380
|
function forspec1(type) {
|
386
381
|
if (type == "var") return cont(vardef1, expect(";"), forspec2);
|
@@ -441,6 +436,12 @@ CodeMirror.defineMode("javascript", function(config, parserConfig) {
|
|
441
436
|
if (state.tokenize == jsTokenComment) return CodeMirror.Pass;
|
442
437
|
if (state.tokenize != jsTokenBase) return 0;
|
443
438
|
var firstChar = textAfter && textAfter.charAt(0), lexical = state.lexical;
|
439
|
+
// Kludge to prevent 'maybelse' from blocking lexical scope pops
|
440
|
+
for (var i = state.cc.length - 1; i >= 0; --i) {
|
441
|
+
var c = state.cc[i];
|
442
|
+
if (c == poplex) lexical = lexical.prev;
|
443
|
+
else if (c != maybeelse || /^else\b/.test(textAfter)) break;
|
444
|
+
}
|
444
445
|
if (lexical.type == "stat" && firstChar == "}") lexical = lexical.prev;
|
445
446
|
if (statementIndent && lexical.type == ")" && lexical.prev.type == "stat")
|
446
447
|
lexical = lexical.prev;
|
@@ -461,7 +462,9 @@ CodeMirror.defineMode("javascript", function(config, parserConfig) {
|
|
461
462
|
blockCommentStart: jsonMode ? null : "/*",
|
462
463
|
blockCommentEnd: jsonMode ? null : "*/",
|
463
464
|
lineComment: jsonMode ? null : "//",
|
465
|
+
fold: "brace",
|
464
466
|
|
467
|
+
helperType: jsonMode ? "json" : "javascript",
|
465
468
|
jsonMode: jsonMode
|
466
469
|
};
|
467
470
|
});
|
@@ -103,6 +103,9 @@ CodeMirror.defineMode("markdown", function(cmCfg, modeCfg) {
|
|
103
103
|
state.f = inlineNormal;
|
104
104
|
state.block = blockNormal;
|
105
105
|
}
|
106
|
+
// Reset state.trailingSpace
|
107
|
+
state.trailingSpace = 0;
|
108
|
+
state.trailingSpaceNewLine = false;
|
106
109
|
// Mark this line as blank
|
107
110
|
state.thisLineHasContent = false;
|
108
111
|
return null;
|
@@ -217,6 +220,12 @@ CodeMirror.defineMode("markdown", function(cmCfg, modeCfg) {
|
|
217
220
|
}
|
218
221
|
}
|
219
222
|
|
223
|
+
if (state.trailingSpaceNewLine) {
|
224
|
+
styles.push("trailing-space-new-line");
|
225
|
+
} else if (state.trailingSpace) {
|
226
|
+
styles.push("trailing-space-" + (state.trailingSpace % 2 ? "a" : "b"));
|
227
|
+
}
|
228
|
+
|
220
229
|
return styles.length ? styles.join(' ') : null;
|
221
230
|
}
|
222
231
|
|
@@ -369,6 +378,14 @@ CodeMirror.defineMode("markdown", function(cmCfg, modeCfg) {
|
|
369
378
|
}
|
370
379
|
}
|
371
380
|
|
381
|
+
if (ch === ' ') {
|
382
|
+
if (stream.match(/ +$/, false)) {
|
383
|
+
state.trailingSpace++;
|
384
|
+
} else if (state.trailingSpace) {
|
385
|
+
state.trailingSpaceNewLine = true;
|
386
|
+
}
|
387
|
+
}
|
388
|
+
|
372
389
|
return getType(state);
|
373
390
|
}
|
374
391
|
|
@@ -453,7 +470,9 @@ CodeMirror.defineMode("markdown", function(cmCfg, modeCfg) {
|
|
453
470
|
taskList: false,
|
454
471
|
list: false,
|
455
472
|
listDepth: 0,
|
456
|
-
quote: 0
|
473
|
+
quote: 0,
|
474
|
+
trailingSpace: 0,
|
475
|
+
trailingSpaceNewLine: false
|
457
476
|
};
|
458
477
|
},
|
459
478
|
|
@@ -481,6 +500,8 @@ CodeMirror.defineMode("markdown", function(cmCfg, modeCfg) {
|
|
481
500
|
list: s.list,
|
482
501
|
listDepth: s.listDepth,
|
483
502
|
quote: s.quote,
|
503
|
+
trailingSpace: s.trailingSpace,
|
504
|
+
trailingSpaceNewLine: s.trailingSpaceNewLine,
|
484
505
|
md_inside: s.md_inside
|
485
506
|
};
|
486
507
|
},
|
@@ -504,6 +525,10 @@ CodeMirror.defineMode("markdown", function(cmCfg, modeCfg) {
|
|
504
525
|
// Reset state.code
|
505
526
|
state.code = false;
|
506
527
|
|
528
|
+
// Reset state.trailingSpace
|
529
|
+
state.trailingSpace = 0;
|
530
|
+
state.trailingSpaceNewLine = false;
|
531
|
+
|
507
532
|
state.f = state.block;
|
508
533
|
var indentation = stream.match(/^\s*/, true)[0].replace(/\t/g, ' ').length;
|
509
534
|
var difference = Math.floor((indentation - state.indentation) / 4) * 4;
|
@@ -0,0 +1,163 @@
|
|
1
|
+
CodeMirror.defineMode("nginx", function(config) {
|
2
|
+
|
3
|
+
function words(str) {
|
4
|
+
var obj = {}, words = str.split(" ");
|
5
|
+
for (var i = 0; i < words.length; ++i) obj[words[i]] = true;
|
6
|
+
return obj;
|
7
|
+
}
|
8
|
+
|
9
|
+
var keywords = words(
|
10
|
+
/* ngxDirectiveControl */ "break return rewrite set" +
|
11
|
+
/* ngxDirective */ " accept_mutex accept_mutex_delay access_log add_after_body add_before_body add_header addition_types aio alias allow ancient_browser ancient_browser_value auth_basic auth_basic_user_file auth_http auth_http_header auth_http_timeout autoindex autoindex_exact_size autoindex_localtime charset charset_types client_body_buffer_size client_body_in_file_only client_body_in_single_buffer client_body_temp_path client_body_timeout client_header_buffer_size client_header_timeout client_max_body_size connection_pool_size create_full_put_path daemon dav_access dav_methods debug_connection debug_points default_type degradation degrade deny devpoll_changes devpoll_events directio directio_alignment empty_gif env epoll_events error_log eventport_events expires fastcgi_bind fastcgi_buffer_size fastcgi_buffers fastcgi_busy_buffers_size fastcgi_cache fastcgi_cache_key fastcgi_cache_methods fastcgi_cache_min_uses fastcgi_cache_path fastcgi_cache_use_stale fastcgi_cache_valid fastcgi_catch_stderr fastcgi_connect_timeout fastcgi_hide_header fastcgi_ignore_client_abort fastcgi_ignore_headers fastcgi_index fastcgi_intercept_errors fastcgi_max_temp_file_size fastcgi_next_upstream fastcgi_param fastcgi_pass_header fastcgi_pass_request_body fastcgi_pass_request_headers fastcgi_read_timeout fastcgi_send_lowat fastcgi_send_timeout fastcgi_split_path_info fastcgi_store fastcgi_store_access fastcgi_temp_file_write_size fastcgi_temp_path fastcgi_upstream_fail_timeout fastcgi_upstream_max_fails flv geoip_city geoip_country google_perftools_profiles gzip gzip_buffers gzip_comp_level gzip_disable gzip_hash gzip_http_version gzip_min_length gzip_no_buffer gzip_proxied gzip_static gzip_types gzip_vary gzip_window if_modified_since ignore_invalid_headers image_filter image_filter_buffer image_filter_jpeg_quality image_filter_transparency imap_auth imap_capabilities imap_client_buffer index ip_hash keepalive_requests keepalive_timeout kqueue_changes kqueue_events large_client_header_buffers limit_conn limit_conn_log_level limit_rate limit_rate_after limit_req limit_req_log_level limit_req_zone limit_zone lingering_time lingering_timeout lock_file log_format log_not_found log_subrequest map_hash_bucket_size map_hash_max_size master_process memcached_bind memcached_buffer_size memcached_connect_timeout memcached_next_upstream memcached_read_timeout memcached_send_timeout memcached_upstream_fail_timeout memcached_upstream_max_fails merge_slashes min_delete_depth modern_browser modern_browser_value msie_padding msie_refresh multi_accept open_file_cache open_file_cache_errors open_file_cache_events open_file_cache_min_uses open_file_cache_valid open_log_file_cache output_buffers override_charset perl perl_modules perl_require perl_set pid pop3_auth pop3_capabilities port_in_redirect postpone_gzipping postpone_output protocol proxy proxy_bind proxy_buffer proxy_buffer_size proxy_buffering proxy_buffers proxy_busy_buffers_size proxy_cache proxy_cache_key proxy_cache_methods proxy_cache_min_uses proxy_cache_path proxy_cache_use_stale proxy_cache_valid proxy_connect_timeout proxy_headers_hash_bucket_size proxy_headers_hash_max_size proxy_hide_header proxy_ignore_client_abort proxy_ignore_headers proxy_intercept_errors proxy_max_temp_file_size proxy_method proxy_next_upstream proxy_pass_error_message proxy_pass_header proxy_pass_request_body proxy_pass_request_headers proxy_read_timeout proxy_redirect proxy_send_lowat proxy_send_timeout proxy_set_body proxy_set_header proxy_ssl_session_reuse proxy_store proxy_store_access proxy_temp_file_write_size proxy_temp_path proxy_timeout proxy_upstream_fail_timeout proxy_upstream_max_fails random_index read_ahead real_ip_header recursive_error_pages request_pool_size reset_timedout_connection resolver resolver_timeout rewrite_log rtsig_overflow_events rtsig_overflow_test rtsig_overflow_threshold rtsig_signo satisfy secure_link_secret send_lowat send_timeout sendfile sendfile_max_chunk server_name_in_redirect server_names_hash_bucket_size server_names_hash_max_size server_tokens set_real_ip_from smtp_auth smtp_capabilities smtp_client_buffer smtp_greeting_delay so_keepalive source_charset ssi ssi_ignore_recycled_buffers ssi_min_file_chunk ssi_silent_errors ssi_types ssi_value_length ssl ssl_certificate ssl_certificate_key ssl_ciphers ssl_client_certificate ssl_crl ssl_dhparam ssl_engine ssl_prefer_server_ciphers ssl_protocols ssl_session_cache ssl_session_timeout ssl_verify_client ssl_verify_depth starttls stub_status sub_filter sub_filter_once sub_filter_types tcp_nodelay tcp_nopush thread_stack_size timeout timer_resolution types_hash_bucket_size types_hash_max_size underscores_in_headers uninitialized_variable_warn use user userid userid_domain userid_expires userid_mark userid_name userid_p3p userid_path userid_service valid_referers variables_hash_bucket_size variables_hash_max_size worker_connections worker_cpu_affinity worker_priority worker_processes worker_rlimit_core worker_rlimit_nofile worker_rlimit_sigpending worker_threads working_directory xclient xml_entities xslt_stylesheet xslt_typesdrew@li229-23"
|
12
|
+
);
|
13
|
+
|
14
|
+
var keywords_block = words(
|
15
|
+
/* ngxDirectiveBlock */ "http mail events server types location upstream charset_map limit_except if geo map"
|
16
|
+
);
|
17
|
+
|
18
|
+
var keywords_important = words(
|
19
|
+
/* ngxDirectiveImportant */ "include root server server_name listen internal proxy_pass memcached_pass fastcgi_pass try_files"
|
20
|
+
);
|
21
|
+
|
22
|
+
var indentUnit = config.indentUnit, type;
|
23
|
+
function ret(style, tp) {type = tp; return style;}
|
24
|
+
|
25
|
+
function tokenBase(stream, state) {
|
26
|
+
|
27
|
+
|
28
|
+
stream.eatWhile(/[\w\$_]/);
|
29
|
+
|
30
|
+
var cur = stream.current();
|
31
|
+
|
32
|
+
|
33
|
+
if (keywords.propertyIsEnumerable(cur)) {
|
34
|
+
return "keyword";
|
35
|
+
}
|
36
|
+
else if (keywords_block.propertyIsEnumerable(cur)) {
|
37
|
+
return "variable-2";
|
38
|
+
}
|
39
|
+
else if (keywords_important.propertyIsEnumerable(cur)) {
|
40
|
+
return "string-2";
|
41
|
+
}
|
42
|
+
/**/
|
43
|
+
|
44
|
+
var ch = stream.next();
|
45
|
+
if (ch == "@") {stream.eatWhile(/[\w\\\-]/); return ret("meta", stream.current());}
|
46
|
+
else if (ch == "/" && stream.eat("*")) {
|
47
|
+
state.tokenize = tokenCComment;
|
48
|
+
return tokenCComment(stream, state);
|
49
|
+
}
|
50
|
+
else if (ch == "<" && stream.eat("!")) {
|
51
|
+
state.tokenize = tokenSGMLComment;
|
52
|
+
return tokenSGMLComment(stream, state);
|
53
|
+
}
|
54
|
+
else if (ch == "=") ret(null, "compare");
|
55
|
+
else if ((ch == "~" || ch == "|") && stream.eat("=")) return ret(null, "compare");
|
56
|
+
else if (ch == "\"" || ch == "'") {
|
57
|
+
state.tokenize = tokenString(ch);
|
58
|
+
return state.tokenize(stream, state);
|
59
|
+
}
|
60
|
+
else if (ch == "#") {
|
61
|
+
stream.skipToEnd();
|
62
|
+
return ret("comment", "comment");
|
63
|
+
}
|
64
|
+
else if (ch == "!") {
|
65
|
+
stream.match(/^\s*\w*/);
|
66
|
+
return ret("keyword", "important");
|
67
|
+
}
|
68
|
+
else if (/\d/.test(ch)) {
|
69
|
+
stream.eatWhile(/[\w.%]/);
|
70
|
+
return ret("number", "unit");
|
71
|
+
}
|
72
|
+
else if (/[,.+>*\/]/.test(ch)) {
|
73
|
+
return ret(null, "select-op");
|
74
|
+
}
|
75
|
+
else if (/[;{}:\[\]]/.test(ch)) {
|
76
|
+
return ret(null, ch);
|
77
|
+
}
|
78
|
+
else {
|
79
|
+
stream.eatWhile(/[\w\\\-]/);
|
80
|
+
return ret("variable", "variable");
|
81
|
+
}
|
82
|
+
}
|
83
|
+
|
84
|
+
function tokenCComment(stream, state) {
|
85
|
+
var maybeEnd = false, ch;
|
86
|
+
while ((ch = stream.next()) != null) {
|
87
|
+
if (maybeEnd && ch == "/") {
|
88
|
+
state.tokenize = tokenBase;
|
89
|
+
break;
|
90
|
+
}
|
91
|
+
maybeEnd = (ch == "*");
|
92
|
+
}
|
93
|
+
return ret("comment", "comment");
|
94
|
+
}
|
95
|
+
|
96
|
+
function tokenSGMLComment(stream, state) {
|
97
|
+
var dashes = 0, ch;
|
98
|
+
while ((ch = stream.next()) != null) {
|
99
|
+
if (dashes >= 2 && ch == ">") {
|
100
|
+
state.tokenize = tokenBase;
|
101
|
+
break;
|
102
|
+
}
|
103
|
+
dashes = (ch == "-") ? dashes + 1 : 0;
|
104
|
+
}
|
105
|
+
return ret("comment", "comment");
|
106
|
+
}
|
107
|
+
|
108
|
+
function tokenString(quote) {
|
109
|
+
return function(stream, state) {
|
110
|
+
var escaped = false, ch;
|
111
|
+
while ((ch = stream.next()) != null) {
|
112
|
+
if (ch == quote && !escaped)
|
113
|
+
break;
|
114
|
+
escaped = !escaped && ch == "\\";
|
115
|
+
}
|
116
|
+
if (!escaped) state.tokenize = tokenBase;
|
117
|
+
return ret("string", "string");
|
118
|
+
};
|
119
|
+
}
|
120
|
+
|
121
|
+
return {
|
122
|
+
startState: function(base) {
|
123
|
+
return {tokenize: tokenBase,
|
124
|
+
baseIndent: base || 0,
|
125
|
+
stack: []};
|
126
|
+
},
|
127
|
+
|
128
|
+
token: function(stream, state) {
|
129
|
+
if (stream.eatSpace()) return null;
|
130
|
+
type = null;
|
131
|
+
var style = state.tokenize(stream, state);
|
132
|
+
|
133
|
+
var context = state.stack[state.stack.length-1];
|
134
|
+
if (type == "hash" && context == "rule") style = "atom";
|
135
|
+
else if (style == "variable") {
|
136
|
+
if (context == "rule") style = "number";
|
137
|
+
else if (!context || context == "@media{") style = "tag";
|
138
|
+
}
|
139
|
+
|
140
|
+
if (context == "rule" && /^[\{\};]$/.test(type))
|
141
|
+
state.stack.pop();
|
142
|
+
if (type == "{") {
|
143
|
+
if (context == "@media") state.stack[state.stack.length-1] = "@media{";
|
144
|
+
else state.stack.push("{");
|
145
|
+
}
|
146
|
+
else if (type == "}") state.stack.pop();
|
147
|
+
else if (type == "@media") state.stack.push("@media");
|
148
|
+
else if (context == "{" && type != "comment") state.stack.push("rule");
|
149
|
+
return style;
|
150
|
+
},
|
151
|
+
|
152
|
+
indent: function(state, textAfter) {
|
153
|
+
var n = state.stack.length;
|
154
|
+
if (/^\}/.test(textAfter))
|
155
|
+
n -= state.stack[state.stack.length-1] == "rule" ? 2 : 1;
|
156
|
+
return state.baseIndent + n * indentUnit;
|
157
|
+
},
|
158
|
+
|
159
|
+
electricChars: "}"
|
160
|
+
};
|
161
|
+
});
|
162
|
+
|
163
|
+
CodeMirror.defineMIME("text/nginx", "text/x-nginx-conf");
|