codemirror-rails 3.20 → 3.21
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 +240 -135
- data/vendor/assets/javascripts/codemirror/addons/comment/comment.js +6 -2
- data/vendor/assets/javascripts/codemirror/addons/comment/continuecomment.js +1 -1
- data/vendor/assets/javascripts/codemirror/addons/dialog/dialog.js +1 -0
- data/vendor/assets/javascripts/codemirror/addons/edit/closebrackets.js +5 -3
- data/vendor/assets/javascripts/codemirror/addons/edit/closetag.js +10 -6
- data/vendor/assets/javascripts/codemirror/addons/edit/continuelist.js +2 -0
- data/vendor/assets/javascripts/codemirror/addons/edit/matchbrackets.js +1 -1
- data/vendor/assets/javascripts/codemirror/addons/fold/comment-fold.js +3 -1
- data/vendor/assets/javascripts/codemirror/addons/fold/foldcode.js +13 -2
- data/vendor/assets/javascripts/codemirror/addons/fold/foldgutter.js +1 -1
- data/vendor/assets/javascripts/codemirror/addons/fold/indent-fold.js +2 -2
- data/vendor/assets/javascripts/codemirror/addons/fold/xml-fold.js +6 -0
- data/vendor/assets/javascripts/codemirror/addons/hint/anyword-hint.js +3 -5
- data/vendor/assets/javascripts/codemirror/addons/hint/css-hint.js +29 -33
- data/vendor/assets/javascripts/codemirror/addons/hint/javascript-hint.js +1 -1
- data/vendor/assets/javascripts/codemirror/addons/hint/pig-hint.js +1 -1
- data/vendor/assets/javascripts/codemirror/addons/hint/python-hint.js +1 -5
- data/vendor/assets/javascripts/codemirror/addons/hint/show-hint.js +58 -9
- data/vendor/assets/javascripts/codemirror/addons/hint/sql-hint.js +58 -17
- data/vendor/assets/javascripts/codemirror/addons/hint/xml-hint.js +5 -5
- data/vendor/assets/javascripts/codemirror/addons/lint/lint.js +1 -1
- data/vendor/assets/javascripts/codemirror/addons/merge/merge.js +6 -1
- data/vendor/assets/javascripts/codemirror/addons/mode/multiplex.js +5 -3
- data/vendor/assets/javascripts/codemirror/addons/runmode/runmode-standalone.js +26 -11
- data/vendor/assets/javascripts/codemirror/addons/runmode/runmode.js +1 -1
- data/vendor/assets/javascripts/codemirror/addons/runmode/runmode.node.js +22 -11
- data/vendor/assets/javascripts/codemirror/addons/search/search.js +22 -9
- data/vendor/assets/javascripts/codemirror/addons/search/searchcursor.js +48 -24
- data/vendor/assets/javascripts/codemirror/addons/selection/active-line.js +15 -9
- data/vendor/assets/javascripts/codemirror/addons/tern/tern.js +3 -3
- data/vendor/assets/javascripts/codemirror/addons/wrap/hardwrap.js +21 -9
- data/vendor/assets/javascripts/codemirror/keymaps/emacs.js +12 -1
- data/vendor/assets/javascripts/codemirror/keymaps/vim.js +110 -28
- data/vendor/assets/javascripts/codemirror/modes/clike.js +28 -9
- data/vendor/assets/javascripts/codemirror/modes/coffeescript.js +3 -4
- data/vendor/assets/javascripts/codemirror/modes/css.js +341 -297
- data/vendor/assets/javascripts/codemirror/modes/erlang.js +302 -179
- data/vendor/assets/javascripts/codemirror/modes/gfm.js +10 -5
- data/vendor/assets/javascripts/codemirror/modes/gherkin.js +45 -50
- data/vendor/assets/javascripts/codemirror/modes/haml.js +0 -4
- data/vendor/assets/javascripts/codemirror/modes/haskell.js +5 -3
- data/vendor/assets/javascripts/codemirror/modes/htmlembedded.js +0 -2
- data/vendor/assets/javascripts/codemirror/modes/htmlmixed.js +0 -2
- data/vendor/assets/javascripts/codemirror/modes/javascript.js +43 -30
- data/vendor/assets/javascripts/codemirror/modes/jinja2.js +13 -3
- data/vendor/assets/javascripts/codemirror/modes/less.js +7 -6
- data/vendor/assets/javascripts/codemirror/modes/markdown.js +231 -45
- data/vendor/assets/javascripts/codemirror/modes/{ocaml.js → mllike.js} +88 -13
- data/vendor/assets/javascripts/codemirror/modes/pegjs.js +5 -9
- data/vendor/assets/javascripts/codemirror/modes/php.js +6 -7
- data/vendor/assets/javascripts/codemirror/modes/python.js +6 -0
- data/vendor/assets/javascripts/codemirror/modes/r.js +5 -1
- data/vendor/assets/javascripts/codemirror/modes/rpm-spec.js +1 -1
- data/vendor/assets/javascripts/codemirror/modes/ruby.js +3 -1
- data/vendor/assets/javascripts/codemirror/modes/smalltalk.js +4 -2
- data/vendor/assets/javascripts/codemirror/modes/smartymixed.js +0 -2
- data/vendor/assets/javascripts/codemirror/modes/sql.js +5 -4
- data/vendor/assets/javascripts/codemirror/modes/xml.js +87 -100
- data/vendor/assets/stylesheets/codemirror/themes/mbo.css +1 -1
- data/vendor/assets/stylesheets/codemirror/themes/midnight.css +1 -1
- data/vendor/assets/stylesheets/codemirror/themes/pastel-on-dark.css +49 -0
- data/vendor/assets/stylesheets/codemirror/themes/the-matrix.css +1 -1
- metadata +3 -2
@@ -203,18 +203,34 @@ CodeMirror.defineMode("clike", function(config, parserConfig) {
|
|
203
203
|
return "string";
|
204
204
|
}
|
205
205
|
|
206
|
-
function mimes
|
207
|
-
|
206
|
+
function def(mimes, mode) {
|
207
|
+
var words = [];
|
208
|
+
function add(obj) {
|
209
|
+
if (obj) for (var prop in obj) if (obj.hasOwnProperty(prop))
|
210
|
+
words.push(prop);
|
211
|
+
}
|
212
|
+
add(mode.keywords);
|
213
|
+
add(mode.builtin);
|
214
|
+
add(mode.atoms);
|
215
|
+
if (words.length) {
|
216
|
+
mode.helperType = mimes[0];
|
217
|
+
CodeMirror.registerHelper("hintWords", mimes[0], words);
|
218
|
+
}
|
219
|
+
|
220
|
+
for (var i = 0; i < mimes.length; ++i)
|
221
|
+
CodeMirror.defineMIME(mimes[i], mode);
|
208
222
|
}
|
209
223
|
|
210
|
-
|
224
|
+
def(["text/x-csrc", "text/x-c", "text/x-chdr"], {
|
211
225
|
name: "clike",
|
212
226
|
keywords: words(cKeywords),
|
213
227
|
blockKeywords: words("case do else for if switch while struct"),
|
214
228
|
atoms: words("null"),
|
215
|
-
hooks: {"#": cppHook}
|
229
|
+
hooks: {"#": cppHook},
|
230
|
+
modeProps: {fold: ["brace", "include"]}
|
216
231
|
});
|
217
|
-
|
232
|
+
|
233
|
+
def(["text/x-c++src", "text/x-c++hdr"], {
|
218
234
|
name: "clike",
|
219
235
|
keywords: words(cKeywords + " asm dynamic_cast namespace reinterpret_cast try bool explicit new " +
|
220
236
|
"static_cast typeid catch operator template typename class friend private " +
|
@@ -222,7 +238,8 @@ CodeMirror.defineMode("clike", function(config, parserConfig) {
|
|
222
238
|
"wchar_t"),
|
223
239
|
blockKeywords: words("catch class do else finally for if struct switch try while"),
|
224
240
|
atoms: words("true false null"),
|
225
|
-
hooks: {"#": cppHook}
|
241
|
+
hooks: {"#": cppHook},
|
242
|
+
modeProps: {fold: ["brace", "include"]}
|
226
243
|
});
|
227
244
|
CodeMirror.defineMIME("text/x-java", {
|
228
245
|
name: "clike",
|
@@ -238,7 +255,8 @@ CodeMirror.defineMode("clike", function(config, parserConfig) {
|
|
238
255
|
stream.eatWhile(/[\w\$_]/);
|
239
256
|
return "meta";
|
240
257
|
}
|
241
|
-
}
|
258
|
+
},
|
259
|
+
modeProps: {fold: ["brace", "import"]}
|
242
260
|
});
|
243
261
|
CodeMirror.defineMIME("text/x-csharp", {
|
244
262
|
name: "clike",
|
@@ -303,7 +321,7 @@ CodeMirror.defineMode("clike", function(config, parserConfig) {
|
|
303
321
|
}
|
304
322
|
}
|
305
323
|
});
|
306
|
-
|
324
|
+
def(["x-shader/x-vertex", "x-shader/x-fragment"], {
|
307
325
|
name: "clike",
|
308
326
|
keywords: words("float int bool void " +
|
309
327
|
"vec2 vec3 vec4 ivec2 ivec3 ivec4 bvec2 bvec3 bvec4 " +
|
@@ -357,6 +375,7 @@ CodeMirror.defineMode("clike", function(config, parserConfig) {
|
|
357
375
|
"gl_MaxVertexTextureImageUnits gl_MaxTextureImageUnits " +
|
358
376
|
"gl_MaxFragmentUniformComponents gl_MaxCombineTextureImageUnits " +
|
359
377
|
"gl_MaxDrawBuffers"),
|
360
|
-
hooks: {"#": cppHook}
|
378
|
+
hooks: {"#": cppHook},
|
379
|
+
modeProps: {fold: ["brace", "include"]}
|
361
380
|
});
|
362
381
|
}());
|
@@ -119,13 +119,13 @@ CodeMirror.defineMode("coffeescript", function(conf) {
|
|
119
119
|
|
120
120
|
// Handle strings
|
121
121
|
if (stream.match(stringPrefixes)) {
|
122
|
-
state.tokenize = tokenFactory(stream.current(), "string");
|
122
|
+
state.tokenize = tokenFactory(stream.current(), false, "string");
|
123
123
|
return state.tokenize(stream, state);
|
124
124
|
}
|
125
125
|
// Handle regex literals
|
126
126
|
if (stream.match(regexPrefixes)) {
|
127
127
|
if (stream.current() != "/" || stream.match(/^.*\//, false)) { // prevent highlight of division
|
128
|
-
state.tokenize = tokenFactory(stream.current(), "string-2");
|
128
|
+
state.tokenize = tokenFactory(stream.current(), true, "string-2");
|
129
129
|
return state.tokenize(stream, state);
|
130
130
|
} else {
|
131
131
|
stream.backUp(1);
|
@@ -161,8 +161,7 @@ CodeMirror.defineMode("coffeescript", function(conf) {
|
|
161
161
|
return ERRORCLASS;
|
162
162
|
}
|
163
163
|
|
164
|
-
function tokenFactory(delimiter, outclass) {
|
165
|
-
var singleline = delimiter.length == 1;
|
164
|
+
function tokenFactory(delimiter, singleline, outclass) {
|
166
165
|
return function(stream, state) {
|
167
166
|
while (!stream.eol()) {
|
168
167
|
stream.eatWhile(/[^'"\/\\]/);
|
@@ -3,87 +3,80 @@ CodeMirror.defineMode("css", function(config, parserConfig) {
|
|
3
3
|
|
4
4
|
if (!parserConfig.propertyKeywords) parserConfig = CodeMirror.resolveMode("text/css");
|
5
5
|
|
6
|
-
var indentUnit = config.indentUnit
|
7
|
-
|
8
|
-
|
9
|
-
|
6
|
+
var indentUnit = config.indentUnit,
|
7
|
+
tokenHooks = parserConfig.tokenHooks,
|
8
|
+
mediaTypes = parserConfig.mediaTypes || {},
|
9
|
+
mediaFeatures = parserConfig.mediaFeatures || {},
|
10
10
|
propertyKeywords = parserConfig.propertyKeywords || {},
|
11
11
|
colorKeywords = parserConfig.colorKeywords || {},
|
12
12
|
valueKeywords = parserConfig.valueKeywords || {},
|
13
|
-
|
14
|
-
|
13
|
+
fontProperties = parserConfig.fontProperties || {},
|
14
|
+
allowNested = parserConfig.allowNested;
|
15
15
|
|
16
|
+
var type, override;
|
16
17
|
function ret(style, tp) { type = tp; return style; }
|
17
18
|
|
19
|
+
// Tokenizers
|
20
|
+
|
18
21
|
function tokenBase(stream, state) {
|
19
22
|
var ch = stream.next();
|
20
|
-
if (
|
21
|
-
|
22
|
-
var result = hooks[ch](stream, state);
|
23
|
+
if (tokenHooks[ch]) {
|
24
|
+
var result = tokenHooks[ch](stream, state);
|
23
25
|
if (result !== false) return result;
|
24
26
|
}
|
25
|
-
if (ch == "@") {
|
26
|
-
|
27
|
-
|
28
|
-
else if (ch == "
|
27
|
+
if (ch == "@") {
|
28
|
+
stream.eatWhile(/[\w\\\-]/);
|
29
|
+
return ret("def", stream.current());
|
30
|
+
} else if (ch == "=" || (ch == "~" || ch == "|") && stream.eat("=")) {
|
31
|
+
return ret(null, "compare");
|
32
|
+
} else if (ch == "\"" || ch == "'") {
|
29
33
|
state.tokenize = tokenString(ch);
|
30
34
|
return state.tokenize(stream, state);
|
31
|
-
}
|
32
|
-
else if (ch == "#") {
|
35
|
+
} else if (ch == "#") {
|
33
36
|
stream.eatWhile(/[\w\\\-]/);
|
34
37
|
return ret("atom", "hash");
|
35
|
-
}
|
36
|
-
else if (ch == "!") {
|
38
|
+
} else if (ch == "!") {
|
37
39
|
stream.match(/^\s*\w*/);
|
38
40
|
return ret("keyword", "important");
|
39
|
-
}
|
40
|
-
else if (/\d/.test(ch) || ch == "." && stream.eat(/\d/)) {
|
41
|
+
} else if (/\d/.test(ch) || ch == "." && stream.eat(/\d/)) {
|
41
42
|
stream.eatWhile(/[\w.%]/);
|
42
43
|
return ret("number", "unit");
|
43
|
-
}
|
44
|
-
|
45
|
-
if (/\d/.test(stream.peek())) {
|
44
|
+
} else if (ch === "-") {
|
45
|
+
if (/[\d.]/.test(stream.peek())) {
|
46
46
|
stream.eatWhile(/[\w.%]/);
|
47
47
|
return ret("number", "unit");
|
48
48
|
} else if (stream.match(/^[^-]+-/)) {
|
49
49
|
return ret("meta", "meta");
|
50
50
|
}
|
51
|
-
}
|
52
|
-
else if (/[,+>*\/]/.test(ch)) {
|
51
|
+
} else if (/[,+>*\/]/.test(ch)) {
|
53
52
|
return ret(null, "select-op");
|
54
|
-
}
|
55
|
-
else if (ch == "." && stream.match(/^-?[_a-z][_a-z0-9-]*/i)) {
|
53
|
+
} else if (ch == "." && stream.match(/^-?[_a-z][_a-z0-9-]*/i)) {
|
56
54
|
return ret("qualifier", "qualifier");
|
57
|
-
}
|
58
|
-
else if (ch == ":") {
|
59
|
-
return ret("operator", ch);
|
60
|
-
}
|
61
|
-
else if (/[;{}\[\]\(\)]/.test(ch)) {
|
55
|
+
} else if (/[:;{}\[\]\(\)]/.test(ch)) {
|
62
56
|
return ret(null, ch);
|
63
|
-
}
|
64
|
-
else if (ch == "u" && stream.match("rl(")) {
|
57
|
+
} else if (ch == "u" && stream.match("rl(")) {
|
65
58
|
stream.backUp(1);
|
66
59
|
state.tokenize = tokenParenthesized;
|
67
|
-
return ret("property", "
|
68
|
-
}
|
69
|
-
else {
|
60
|
+
return ret("property", "word");
|
61
|
+
} else if (/[\w\\\-]/.test(ch)) {
|
70
62
|
stream.eatWhile(/[\w\\\-]/);
|
71
|
-
return ret("property", "
|
63
|
+
return ret("property", "word");
|
64
|
+
} else {
|
65
|
+
return ret(null, null);
|
72
66
|
}
|
73
67
|
}
|
74
68
|
|
75
|
-
function tokenString(quote
|
69
|
+
function tokenString(quote) {
|
76
70
|
return function(stream, state) {
|
77
71
|
var escaped = false, ch;
|
78
72
|
while ((ch = stream.next()) != null) {
|
79
|
-
if (ch == quote && !escaped)
|
73
|
+
if (ch == quote && !escaped) {
|
74
|
+
if (quote == ")") stream.backUp(1);
|
80
75
|
break;
|
76
|
+
}
|
81
77
|
escaped = !escaped && ch == "\\";
|
82
78
|
}
|
83
|
-
if (!escaped)
|
84
|
-
if (nonInclusive) stream.backUp(1);
|
85
|
-
state.tokenize = tokenBase;
|
86
|
-
}
|
79
|
+
if (ch == quote || !escaped && quote != ")") state.tokenize = null;
|
87
80
|
return ret("string", "string");
|
88
81
|
};
|
89
82
|
}
|
@@ -91,218 +84,238 @@ CodeMirror.defineMode("css", function(config, parserConfig) {
|
|
91
84
|
function tokenParenthesized(stream, state) {
|
92
85
|
stream.next(); // Must be '('
|
93
86
|
if (!stream.match(/\s*[\"\']/, false))
|
94
|
-
state.tokenize = tokenString(")"
|
87
|
+
state.tokenize = tokenString(")");
|
95
88
|
else
|
96
|
-
state.tokenize =
|
89
|
+
state.tokenize = null;
|
97
90
|
return ret(null, "(");
|
98
91
|
}
|
99
92
|
|
93
|
+
// Context management
|
94
|
+
|
95
|
+
function Context(type, indent, prev) {
|
96
|
+
this.type = type;
|
97
|
+
this.indent = indent;
|
98
|
+
this.prev = prev;
|
99
|
+
}
|
100
|
+
|
101
|
+
function pushContext(state, stream, type) {
|
102
|
+
state.context = new Context(type, stream.indentation() + indentUnit, state.context);
|
103
|
+
return type;
|
104
|
+
}
|
105
|
+
|
106
|
+
function popContext(state) {
|
107
|
+
state.context = state.context.prev;
|
108
|
+
return state.context.type;
|
109
|
+
}
|
110
|
+
|
111
|
+
function pass(type, stream, state) {
|
112
|
+
return states[state.context.type](type, stream, state);
|
113
|
+
}
|
114
|
+
function popAndPass(type, stream, state, n) {
|
115
|
+
for (var i = n || 1; i > 0; i--)
|
116
|
+
state.context = state.context.prev;
|
117
|
+
return pass(type, stream, state);
|
118
|
+
}
|
119
|
+
|
120
|
+
// Parser
|
121
|
+
|
122
|
+
function wordAsValue(stream) {
|
123
|
+
var word = stream.current().toLowerCase();
|
124
|
+
if (valueKeywords.hasOwnProperty(word))
|
125
|
+
override = "atom";
|
126
|
+
else if (colorKeywords.hasOwnProperty(word))
|
127
|
+
override = "keyword";
|
128
|
+
else
|
129
|
+
override = "variable";
|
130
|
+
}
|
131
|
+
|
132
|
+
var states = {};
|
133
|
+
|
134
|
+
states.top = function(type, stream, state) {
|
135
|
+
if (type == "{") {
|
136
|
+
return pushContext(state, stream, "block");
|
137
|
+
} else if (type == "}" && state.context.prev) {
|
138
|
+
return popContext(state);
|
139
|
+
} else if (type == "@media") {
|
140
|
+
return pushContext(state, stream, "media");
|
141
|
+
} else if (type == "@font-face") {
|
142
|
+
return "font_face_before";
|
143
|
+
} else if (type && type.charAt(0) == "@") {
|
144
|
+
return pushContext(state, stream, "at");
|
145
|
+
} else if (type == "hash") {
|
146
|
+
override = "builtin";
|
147
|
+
} else if (type == "word") {
|
148
|
+
override = "tag";
|
149
|
+
} else if (type == "variable-definition") {
|
150
|
+
return "maybeprop";
|
151
|
+
} else if (type == "interpolation") {
|
152
|
+
return pushContext(state, stream, "interpolation");
|
153
|
+
} else if (type == ":") {
|
154
|
+
return "pseudo";
|
155
|
+
} else if (allowNested && type == "(") {
|
156
|
+
return pushContext(state, stream, "params");
|
157
|
+
}
|
158
|
+
return state.context.type;
|
159
|
+
};
|
160
|
+
|
161
|
+
states.block = function(type, stream, state) {
|
162
|
+
if (type == "word") {
|
163
|
+
if (propertyKeywords.hasOwnProperty(stream.current().toLowerCase())) {
|
164
|
+
override = "property";
|
165
|
+
return "maybeprop";
|
166
|
+
} else if (allowNested) {
|
167
|
+
override = stream.match(/^\s*:/, false) ? "property" : "tag";
|
168
|
+
return "block";
|
169
|
+
} else {
|
170
|
+
override += " error";
|
171
|
+
return "maybeprop";
|
172
|
+
}
|
173
|
+
} else if (type == "meta") {
|
174
|
+
return "block";
|
175
|
+
} else if (!allowNested && (type == "hash" || type == "qualifier")) {
|
176
|
+
override = "error";
|
177
|
+
return "block";
|
178
|
+
} else {
|
179
|
+
return states.top(type, stream, state);
|
180
|
+
}
|
181
|
+
};
|
182
|
+
|
183
|
+
states.maybeprop = function(type, stream, state) {
|
184
|
+
if (type == ":") return pushContext(state, stream, "prop");
|
185
|
+
return pass(type, stream, state);
|
186
|
+
};
|
187
|
+
|
188
|
+
states.prop = function(type, stream, state) {
|
189
|
+
if (type == ";") return popContext(state);
|
190
|
+
if (type == "{" && allowNested) return pushContext(state, stream, "propBlock");
|
191
|
+
if (type == "}" || type == "{") return popAndPass(type, stream, state);
|
192
|
+
if (type == "(") return pushContext(state, stream, "parens");
|
193
|
+
|
194
|
+
if (type == "hash" && !/^#([0-9a-fA-f]{3}|[0-9a-fA-f]{6})$/.test(stream.current())) {
|
195
|
+
override += " error";
|
196
|
+
} else if (type == "word") {
|
197
|
+
wordAsValue(stream);
|
198
|
+
} else if (type == "interpolation") {
|
199
|
+
return pushContext(state, stream, "interpolation");
|
200
|
+
}
|
201
|
+
return "prop";
|
202
|
+
};
|
203
|
+
|
204
|
+
states.propBlock = function(type, _stream, state) {
|
205
|
+
if (type == "}") return popContext(state);
|
206
|
+
if (type == "word") { override = "property"; return "maybeprop"; }
|
207
|
+
return state.context.type;
|
208
|
+
};
|
209
|
+
|
210
|
+
states.parens = function(type, stream, state) {
|
211
|
+
if (type == "{" || type == "}") return popAndPass(type, stream, state);
|
212
|
+
if (type == ")") return popContext(state);
|
213
|
+
return "parens";
|
214
|
+
};
|
215
|
+
|
216
|
+
states.pseudo = function(type, stream, state) {
|
217
|
+
if (type == "word") {
|
218
|
+
override = "variable-3";
|
219
|
+
return state.context.type;
|
220
|
+
}
|
221
|
+
return pass(type, stream, state);
|
222
|
+
};
|
223
|
+
|
224
|
+
states.media = function(type, stream, state) {
|
225
|
+
if (type == "(") return pushContext(state, stream, "media_parens");
|
226
|
+
if (type == "}") return popAndPass(type, stream, state);
|
227
|
+
if (type == "{") return popContext(state) && pushContext(state, stream, allowNested ? "block" : "top");
|
228
|
+
|
229
|
+
if (type == "word") {
|
230
|
+
var word = stream.current().toLowerCase();
|
231
|
+
if (word == "only" || word == "not" || word == "and")
|
232
|
+
override = "keyword";
|
233
|
+
else if (mediaTypes.hasOwnProperty(word))
|
234
|
+
override = "attribute";
|
235
|
+
else if (mediaFeatures.hasOwnProperty(word))
|
236
|
+
override = "property";
|
237
|
+
else
|
238
|
+
override = "error";
|
239
|
+
}
|
240
|
+
return state.context.type;
|
241
|
+
};
|
242
|
+
|
243
|
+
states.media_parens = function(type, stream, state) {
|
244
|
+
if (type == ")") return popContext(state);
|
245
|
+
if (type == "{" || type == "}") return popAndPass(type, stream, state, 2);
|
246
|
+
return states.media(type, stream, state);
|
247
|
+
};
|
248
|
+
|
249
|
+
states.font_face_before = function(type, stream, state) {
|
250
|
+
if (type == "{")
|
251
|
+
return pushContext(state, stream, "font_face");
|
252
|
+
return pass(type, stream, state);
|
253
|
+
};
|
254
|
+
|
255
|
+
states.font_face = function(type, stream, state) {
|
256
|
+
if (type == "}") return popContext(state);
|
257
|
+
if (type == "word") {
|
258
|
+
if (!fontProperties.hasOwnProperty(stream.current().toLowerCase()))
|
259
|
+
override = "error";
|
260
|
+
else
|
261
|
+
override = "property";
|
262
|
+
return "maybeprop";
|
263
|
+
}
|
264
|
+
return "font_face";
|
265
|
+
};
|
266
|
+
|
267
|
+
states.at = function(type, stream, state) {
|
268
|
+
if (type == ";") return popContext(state);
|
269
|
+
if (type == "{" || type == "}") return popAndPass(type, stream, state);
|
270
|
+
if (type == "word") override = "tag";
|
271
|
+
else if (type == "hash") override = "builtin";
|
272
|
+
return "at";
|
273
|
+
};
|
274
|
+
|
275
|
+
states.interpolation = function(type, stream, state) {
|
276
|
+
if (type == "}") return popContext(state);
|
277
|
+
if (type == "{" || type == ";") return popAndPass(type, stream, state);
|
278
|
+
if (type != "variable") override = "error";
|
279
|
+
return "interpolation";
|
280
|
+
};
|
281
|
+
|
282
|
+
states.params = function(type, stream, state) {
|
283
|
+
if (type == ")") return popContext(state);
|
284
|
+
if (type == "{" || type == "}") return popAndPass(type, stream, state);
|
285
|
+
if (type == "word") wordAsValue(stream);
|
286
|
+
return "params";
|
287
|
+
};
|
288
|
+
|
100
289
|
return {
|
101
290
|
startState: function(base) {
|
102
|
-
return {tokenize:
|
103
|
-
|
104
|
-
|
105
|
-
lastToken: null};
|
291
|
+
return {tokenize: null,
|
292
|
+
state: "top",
|
293
|
+
context: new Context("top", base || 0, null)};
|
106
294
|
},
|
107
295
|
|
108
296
|
token: function(stream, state) {
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
//
|
115
|
-
// declaration block:
|
116
|
-
// A sequence of declarations.
|
117
|
-
//
|
118
|
-
// declaration:
|
119
|
-
// A property + colon + value combo.
|
120
|
-
//
|
121
|
-
// property value:
|
122
|
-
// The entire value of a property.
|
123
|
-
//
|
124
|
-
// component value:
|
125
|
-
// A single piece of a property value. Like the 5px in
|
126
|
-
// text-shadow: 0 0 5px blue;. Can also refer to things that are
|
127
|
-
// multiple terms, like the 1-4 terms that make up the background-size
|
128
|
-
// portion of the background shorthand.
|
129
|
-
//
|
130
|
-
// term:
|
131
|
-
// The basic unit of author-facing CSS, like a single number (5),
|
132
|
-
// dimension (5px), string ("foo"), or function. Officially defined
|
133
|
-
// by the CSS 2.1 grammar (look for the 'term' production)
|
134
|
-
//
|
135
|
-
//
|
136
|
-
// simple selector:
|
137
|
-
// A single atomic selector, like a type selector, an attr selector, a
|
138
|
-
// class selector, etc.
|
139
|
-
//
|
140
|
-
// compound selector:
|
141
|
-
// One or more simple selectors without a combinator. div.example is
|
142
|
-
// compound, div > .example is not.
|
143
|
-
//
|
144
|
-
// complex selector:
|
145
|
-
// One or more compound selectors chained with combinators.
|
146
|
-
//
|
147
|
-
// combinator:
|
148
|
-
// The parts of selectors that express relationships. There are four
|
149
|
-
// currently - the space (descendant combinator), the greater-than
|
150
|
-
// bracket (child combinator), the plus sign (next sibling combinator),
|
151
|
-
// and the tilda (following sibling combinator).
|
152
|
-
//
|
153
|
-
// sequence of selectors:
|
154
|
-
// One or more of the named type of selector chained with commas.
|
155
|
-
|
156
|
-
state.tokenize = state.tokenize || tokenBase;
|
157
|
-
if (state.tokenize == tokenBase && stream.eatSpace()) return null;
|
158
|
-
var style = state.tokenize(stream, state);
|
159
|
-
if (style && typeof style != "string") style = ret(style[0], style[1]);
|
160
|
-
|
161
|
-
// Changing style returned based on context
|
162
|
-
var context = state.stack[state.stack.length-1];
|
163
|
-
if (style == "variable") {
|
164
|
-
if (type == "variable-definition") state.stack.push("propertyValue");
|
165
|
-
return state.lastToken = "variable-2";
|
166
|
-
} else if (style == "property") {
|
167
|
-
var word = stream.current().toLowerCase();
|
168
|
-
if (context == "propertyValue") {
|
169
|
-
if (valueKeywords.hasOwnProperty(word)) {
|
170
|
-
style = "string-2";
|
171
|
-
} else if (colorKeywords.hasOwnProperty(word)) {
|
172
|
-
style = "keyword";
|
173
|
-
} else {
|
174
|
-
style = "variable-2";
|
175
|
-
}
|
176
|
-
} else if (context == "rule") {
|
177
|
-
if (!propertyKeywords.hasOwnProperty(word)) {
|
178
|
-
style += " error";
|
179
|
-
}
|
180
|
-
} else if (context == "block") {
|
181
|
-
// if a value is present in both property, value, or color, the order
|
182
|
-
// of preference is property -> color -> value
|
183
|
-
if (propertyKeywords.hasOwnProperty(word)) {
|
184
|
-
style = "property";
|
185
|
-
} else if (colorKeywords.hasOwnProperty(word)) {
|
186
|
-
style = "keyword";
|
187
|
-
} else if (valueKeywords.hasOwnProperty(word)) {
|
188
|
-
style = "string-2";
|
189
|
-
} else {
|
190
|
-
style = "tag";
|
191
|
-
}
|
192
|
-
} else if (!context || context == "@media{") {
|
193
|
-
style = "tag";
|
194
|
-
} else if (context == "@media") {
|
195
|
-
if (atMediaTypes[stream.current()]) {
|
196
|
-
style = "attribute"; // Known attribute
|
197
|
-
} else if (/^(only|not)$/.test(word)) {
|
198
|
-
style = "keyword";
|
199
|
-
} else if (word == "and") {
|
200
|
-
style = "error"; // "and" is only allowed in @mediaType
|
201
|
-
} else if (atMediaFeatures.hasOwnProperty(word)) {
|
202
|
-
style = "error"; // Known property, should be in @mediaType(
|
203
|
-
} else {
|
204
|
-
// Unknown, expecting keyword or attribute, assuming attribute
|
205
|
-
style = "attribute error";
|
206
|
-
}
|
207
|
-
} else if (context == "@mediaType") {
|
208
|
-
if (atMediaTypes.hasOwnProperty(word)) {
|
209
|
-
style = "attribute";
|
210
|
-
} else if (word == "and") {
|
211
|
-
style = "operator";
|
212
|
-
} else if (/^(only|not)$/.test(word)) {
|
213
|
-
style = "error"; // Only allowed in @media
|
214
|
-
} else {
|
215
|
-
// Unknown attribute or property, but expecting property (preceded
|
216
|
-
// by "and"). Should be in parentheses
|
217
|
-
style = "error";
|
218
|
-
}
|
219
|
-
} else if (context == "@mediaType(") {
|
220
|
-
if (propertyKeywords.hasOwnProperty(word)) {
|
221
|
-
// do nothing, remains "property"
|
222
|
-
} else if (atMediaTypes.hasOwnProperty(word)) {
|
223
|
-
style = "error"; // Known property, should be in parentheses
|
224
|
-
} else if (word == "and") {
|
225
|
-
style = "operator";
|
226
|
-
} else if (/^(only|not)$/.test(word)) {
|
227
|
-
style = "error"; // Only allowed in @media
|
228
|
-
} else {
|
229
|
-
style += " error";
|
230
|
-
}
|
231
|
-
} else if (context == "@import") {
|
232
|
-
style = "tag";
|
233
|
-
} else {
|
234
|
-
style = "error";
|
235
|
-
}
|
236
|
-
} else if (style == "atom") {
|
237
|
-
if(!context || context == "@media{" || context == "block") {
|
238
|
-
style = "builtin";
|
239
|
-
} else if (context == "propertyValue") {
|
240
|
-
if (!/^#([0-9a-fA-f]{3}|[0-9a-fA-f]{6})$/.test(stream.current())) {
|
241
|
-
style += " error";
|
242
|
-
}
|
243
|
-
} else {
|
244
|
-
style = "error";
|
245
|
-
}
|
246
|
-
} else if (context == "@media" && type == "{") {
|
247
|
-
style = "error";
|
248
|
-
}
|
249
|
-
|
250
|
-
// Push/pop context stack
|
251
|
-
if (type == "{") {
|
252
|
-
if (context == "@media" || context == "@mediaType") {
|
253
|
-
state.stack[state.stack.length-1] = "@media{";
|
254
|
-
}
|
255
|
-
else {
|
256
|
-
var newContext = allowNested ? "block" : "rule";
|
257
|
-
state.stack.push(newContext);
|
258
|
-
}
|
259
|
-
}
|
260
|
-
else if (type == "}") {
|
261
|
-
if (context == "interpolation") style = "operator";
|
262
|
-
// Pop off end of array until { is reached
|
263
|
-
while(state.stack.length){
|
264
|
-
var removed = state.stack.pop();
|
265
|
-
if(removed.indexOf("{") > -1 || removed == "block" || removed == "rule"){
|
266
|
-
break;
|
267
|
-
}
|
268
|
-
}
|
269
|
-
}
|
270
|
-
else if (type == "interpolation") state.stack.push("interpolation");
|
271
|
-
else if (type == "@media") state.stack.push("@media");
|
272
|
-
else if (type == "@import") state.stack.push("@import");
|
273
|
-
else if (context == "@media" && /\b(keyword|attribute)\b/.test(style))
|
274
|
-
state.stack[state.stack.length-1] = "@mediaType";
|
275
|
-
else if (context == "@mediaType" && stream.current() == ",")
|
276
|
-
state.stack[state.stack.length-1] = "@media";
|
277
|
-
else if (type == "(") {
|
278
|
-
if (context == "@media" || context == "@mediaType") {
|
279
|
-
// Make sure @mediaType is used to avoid error on {
|
280
|
-
state.stack[state.stack.length-1] = "@mediaType";
|
281
|
-
state.stack.push("@mediaType(");
|
282
|
-
}
|
283
|
-
else state.stack.push("(");
|
297
|
+
if (!state.tokenize && stream.eatSpace()) return null;
|
298
|
+
var style = (state.tokenize || tokenBase)(stream, state);
|
299
|
+
if (style && typeof style == "object") {
|
300
|
+
type = style[1];
|
301
|
+
style = style[0];
|
284
302
|
}
|
285
|
-
|
286
|
-
|
287
|
-
|
288
|
-
var removed = state.stack.pop();
|
289
|
-
if(removed.indexOf("(") > -1){
|
290
|
-
break;
|
291
|
-
}
|
292
|
-
}
|
293
|
-
}
|
294
|
-
else if (type == ":" && state.lastToken == "property") state.stack.push("propertyValue");
|
295
|
-
else if (context == "propertyValue" && type == ";") state.stack.pop();
|
296
|
-
else if (context == "@import" && type == ";") state.stack.pop();
|
297
|
-
|
298
|
-
return state.lastToken = style;
|
303
|
+
override = style;
|
304
|
+
state.state = states[state.state](type, stream, state);
|
305
|
+
return override;
|
299
306
|
},
|
300
307
|
|
301
308
|
indent: function(state, textAfter) {
|
302
|
-
var
|
303
|
-
|
304
|
-
|
305
|
-
|
309
|
+
var cx = state.context, ch = textAfter && textAfter.charAt(0);
|
310
|
+
var indent = cx.indent;
|
311
|
+
if (cx.prev &&
|
312
|
+
(ch == "}" && (cx.type == "block" || cx.type == "top" || cx.type == "interpolation" || cx.type == "font_face") ||
|
313
|
+
ch == ")" && (cx.type == "parens" || cx.type == "params" || cx.type == "media_parens") ||
|
314
|
+
ch == "{" && (cx.type == "at" || cx.type == "media"))) {
|
315
|
+
indent = cx.indent - indentUnit;
|
316
|
+
cx = cx.prev;
|
317
|
+
}
|
318
|
+
return indent;
|
306
319
|
},
|
307
320
|
|
308
321
|
electricChars: "}",
|
@@ -321,12 +334,12 @@ CodeMirror.defineMode("css", function(config, parserConfig) {
|
|
321
334
|
return keys;
|
322
335
|
}
|
323
336
|
|
324
|
-
var
|
337
|
+
var mediaTypes_ = [
|
325
338
|
"all", "aural", "braille", "handheld", "print", "projection", "screen",
|
326
339
|
"tty", "tv", "embossed"
|
327
|
-
]);
|
340
|
+
], mediaTypes = keySet(mediaTypes_);
|
328
341
|
|
329
|
-
var
|
342
|
+
var mediaFeatures_ = [
|
330
343
|
"width", "min-width", "max-width", "height", "min-height", "max-height",
|
331
344
|
"device-width", "min-device-width", "max-device-width", "device-height",
|
332
345
|
"min-device-height", "max-device-height", "aspect-ratio",
|
@@ -335,9 +348,9 @@ CodeMirror.defineMode("css", function(config, parserConfig) {
|
|
335
348
|
"max-color", "color-index", "min-color-index", "max-color-index",
|
336
349
|
"monochrome", "min-monochrome", "max-monochrome", "resolution",
|
337
350
|
"min-resolution", "max-resolution", "scan", "grid"
|
338
|
-
]);
|
351
|
+
], mediaFeatures = keySet(mediaFeatures_);
|
339
352
|
|
340
|
-
var
|
353
|
+
var propertyKeywords_ = [
|
341
354
|
"align-content", "align-items", "align-self", "alignment-adjust",
|
342
355
|
"alignment-baseline", "anchor-point", "animation", "animation-delay",
|
343
356
|
"animation-direction", "animation-duration", "animation-iteration-count",
|
@@ -425,9 +438,9 @@ CodeMirror.defineMode("css", function(config, parserConfig) {
|
|
425
438
|
"stroke-miterlimit", "stroke-opacity", "stroke-width", "text-rendering",
|
426
439
|
"baseline-shift", "dominant-baseline", "glyph-orientation-horizontal",
|
427
440
|
"glyph-orientation-vertical", "kerning", "text-anchor", "writing-mode"
|
428
|
-
]);
|
441
|
+
], propertyKeywords = keySet(propertyKeywords_);
|
429
442
|
|
430
|
-
var
|
443
|
+
var colorKeywords_ = [
|
431
444
|
"aliceblue", "antiquewhite", "aqua", "aquamarine", "azure", "beige",
|
432
445
|
"bisque", "black", "blanchedalmond", "blue", "blueviolet", "brown",
|
433
446
|
"burlywood", "cadetblue", "chartreuse", "chocolate", "coral", "cornflowerblue",
|
@@ -454,9 +467,9 @@ CodeMirror.defineMode("css", function(config, parserConfig) {
|
|
454
467
|
"slateblue", "slategray", "snow", "springgreen", "steelblue", "tan",
|
455
468
|
"teal", "thistle", "tomato", "turquoise", "violet", "wheat", "white",
|
456
469
|
"whitesmoke", "yellow", "yellowgreen"
|
457
|
-
]);
|
470
|
+
], colorKeywords = keySet(colorKeywords_);
|
458
471
|
|
459
|
-
var
|
472
|
+
var valueKeywords_ = [
|
460
473
|
"above", "absolute", "activeborder", "activecaption", "afar",
|
461
474
|
"after-white-space", "ahead", "alias", "all", "all-scroll", "alternate",
|
462
475
|
"always", "amharic", "amharic-abegede", "antialiased", "appworkspace",
|
@@ -539,7 +552,15 @@ CodeMirror.defineMode("css", function(config, parserConfig) {
|
|
539
552
|
"visibleStroke", "visual", "w-resize", "wait", "wave", "wider",
|
540
553
|
"window", "windowframe", "windowtext", "x-large", "x-small", "xor",
|
541
554
|
"xx-large", "xx-small"
|
542
|
-
]);
|
555
|
+
], valueKeywords = keySet(valueKeywords_);
|
556
|
+
|
557
|
+
var fontProperties_ = [
|
558
|
+
"font-family", "src", "unicode-range", "font-variant", "font-feature-settings",
|
559
|
+
"font-stretch", "font-weight", "font-style"
|
560
|
+
], fontProperties = keySet(fontProperties_);
|
561
|
+
|
562
|
+
var allWords = mediaTypes_.concat(mediaFeatures_).concat(propertyKeywords_).concat(colorKeywords_).concat(valueKeywords_);
|
563
|
+
CodeMirror.registerHelper("hintWords", "css", allWords);
|
543
564
|
|
544
565
|
function tokenCComment(stream, state) {
|
545
566
|
var maybeEnd = false, ch;
|
@@ -553,67 +574,87 @@ CodeMirror.defineMode("css", function(config, parserConfig) {
|
|
553
574
|
return ["comment", "comment"];
|
554
575
|
}
|
555
576
|
|
577
|
+
function tokenSGMLComment(stream, state) {
|
578
|
+
if (stream.skipTo("-->")) {
|
579
|
+
stream.match("-->");
|
580
|
+
state.tokenize = null;
|
581
|
+
} else {
|
582
|
+
stream.skipToEnd();
|
583
|
+
}
|
584
|
+
return ["comment", "comment"];
|
585
|
+
}
|
586
|
+
|
556
587
|
CodeMirror.defineMIME("text/css", {
|
557
|
-
|
558
|
-
|
588
|
+
mediaTypes: mediaTypes,
|
589
|
+
mediaFeatures: mediaFeatures,
|
559
590
|
propertyKeywords: propertyKeywords,
|
560
591
|
colorKeywords: colorKeywords,
|
561
592
|
valueKeywords: valueKeywords,
|
562
|
-
|
593
|
+
fontProperties: fontProperties,
|
594
|
+
tokenHooks: {
|
563
595
|
"<": function(stream, state) {
|
564
|
-
|
565
|
-
|
566
|
-
|
567
|
-
if (dashes >= 2 && ch == ">") {
|
568
|
-
state.tokenize = null;
|
569
|
-
break;
|
570
|
-
}
|
571
|
-
dashes = (ch == "-") ? dashes + 1 : 0;
|
572
|
-
}
|
573
|
-
return ["comment", "comment"];
|
574
|
-
}
|
575
|
-
if (stream.eat("!")) {
|
576
|
-
state.tokenize = tokenSGMLComment;
|
577
|
-
return tokenSGMLComment(stream, state);
|
578
|
-
}
|
596
|
+
if (!stream.match("!--")) return false;
|
597
|
+
state.tokenize = tokenSGMLComment;
|
598
|
+
return tokenSGMLComment(stream, state);
|
579
599
|
},
|
580
600
|
"/": function(stream, state) {
|
581
|
-
if (stream.eat("*"))
|
582
|
-
|
583
|
-
|
584
|
-
}
|
585
|
-
return false;
|
601
|
+
if (!stream.eat("*")) return false;
|
602
|
+
state.tokenize = tokenCComment;
|
603
|
+
return tokenCComment(stream, state);
|
586
604
|
}
|
587
605
|
},
|
588
606
|
name: "css"
|
589
607
|
});
|
590
608
|
|
591
609
|
CodeMirror.defineMIME("text/x-scss", {
|
592
|
-
|
593
|
-
|
610
|
+
mediaTypes: mediaTypes,
|
611
|
+
mediaFeatures: mediaFeatures,
|
594
612
|
propertyKeywords: propertyKeywords,
|
595
613
|
colorKeywords: colorKeywords,
|
596
614
|
valueKeywords: valueKeywords,
|
615
|
+
fontProperties: fontProperties,
|
597
616
|
allowNested: true,
|
598
|
-
|
617
|
+
tokenHooks: {
|
618
|
+
"/": function(stream, state) {
|
619
|
+
if (stream.eat("/")) {
|
620
|
+
stream.skipToEnd();
|
621
|
+
return ["comment", "comment"];
|
622
|
+
} else if (stream.eat("*")) {
|
623
|
+
state.tokenize = tokenCComment;
|
624
|
+
return tokenCComment(stream, state);
|
625
|
+
} else {
|
626
|
+
return ["operator", "operator"];
|
627
|
+
}
|
628
|
+
},
|
599
629
|
":": function(stream) {
|
600
|
-
if (stream.match(/\s*{/))
|
630
|
+
if (stream.match(/\s*{/))
|
601
631
|
return [null, "{"];
|
602
|
-
}
|
603
632
|
return false;
|
604
633
|
},
|
605
634
|
"$": function(stream) {
|
606
635
|
stream.match(/^[\w-]+/);
|
607
|
-
if (stream.
|
608
|
-
return ["variable", "variable-definition"];
|
609
|
-
|
610
|
-
return ["variable", "variable"];
|
611
|
-
},
|
612
|
-
",": function(stream, state) {
|
613
|
-
if (state.stack[state.stack.length - 1] == "propertyValue" && stream.match(/^ *\$/, false)) {
|
614
|
-
return ["operator", ";"];
|
615
|
-
}
|
636
|
+
if (stream.match(/^\s*:/, false))
|
637
|
+
return ["variable-2", "variable-definition"];
|
638
|
+
return ["variable-2", "variable"];
|
616
639
|
},
|
640
|
+
"#": function(stream) {
|
641
|
+
if (!stream.eat("{")) return false;
|
642
|
+
return [null, "interpolation"];
|
643
|
+
}
|
644
|
+
},
|
645
|
+
name: "css",
|
646
|
+
helperType: "scss"
|
647
|
+
});
|
648
|
+
|
649
|
+
CodeMirror.defineMIME("text/x-less", {
|
650
|
+
mediaTypes: mediaTypes,
|
651
|
+
mediaFeatures: mediaFeatures,
|
652
|
+
propertyKeywords: propertyKeywords,
|
653
|
+
colorKeywords: colorKeywords,
|
654
|
+
valueKeywords: valueKeywords,
|
655
|
+
fontProperties: fontProperties,
|
656
|
+
allowNested: true,
|
657
|
+
tokenHooks: {
|
617
658
|
"/": function(stream, state) {
|
618
659
|
if (stream.eat("/")) {
|
619
660
|
stream.skipToEnd();
|
@@ -625,15 +666,18 @@ CodeMirror.defineMode("css", function(config, parserConfig) {
|
|
625
666
|
return ["operator", "operator"];
|
626
667
|
}
|
627
668
|
},
|
628
|
-
"
|
629
|
-
if (stream.
|
630
|
-
|
631
|
-
|
632
|
-
|
633
|
-
|
634
|
-
|
669
|
+
"@": function(stream) {
|
670
|
+
if (stream.match(/^(charset|document|font-face|import|keyframes|media|namespace|page|supports)\b/, false)) return false;
|
671
|
+
stream.eatWhile(/[\w\\\-]/);
|
672
|
+
if (stream.match(/^\s*:/, false))
|
673
|
+
return ["variable-2", "variable-definition"];
|
674
|
+
return ["variable-2", "variable"];
|
675
|
+
},
|
676
|
+
"&": function() {
|
677
|
+
return ["atom", "atom"];
|
635
678
|
}
|
636
679
|
},
|
637
|
-
name: "css"
|
680
|
+
name: "css",
|
681
|
+
helperType: "less"
|
638
682
|
});
|
639
683
|
})();
|