codemirror-rails 2.33 → 2.34
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.
- data/lib/codemirror/rails/version.rb +2 -2
- data/vendor/assets/javascripts/codemirror.js +359 -453
- data/vendor/assets/javascripts/codemirror/keymaps/vim.js +4 -1
- data/vendor/assets/javascripts/codemirror/modes/clojure.js +7 -8
- data/vendor/assets/javascripts/codemirror/modes/commonlisp.js +101 -0
- data/vendor/assets/javascripts/codemirror/modes/css.js +336 -62
- data/vendor/assets/javascripts/codemirror/modes/gfm.js +6 -1
- data/vendor/assets/javascripts/codemirror/modes/haxe.js +0 -3
- data/vendor/assets/javascripts/codemirror/modes/htmlembedded.js +5 -1
- data/vendor/assets/javascripts/codemirror/modes/htmlmixed.js +11 -12
- data/vendor/assets/javascripts/codemirror/modes/javascript.js +1 -1
- data/vendor/assets/javascripts/codemirror/modes/markdown.js +131 -17
- data/vendor/assets/javascripts/codemirror/modes/php.js +4 -6
- data/vendor/assets/javascripts/codemirror/modes/shell.js +1 -1
- data/vendor/assets/javascripts/codemirror/modes/tiki.js +0 -7
- data/vendor/assets/javascripts/codemirror/modes/vb.js +2 -2
- data/vendor/assets/javascripts/codemirror/modes/xml.js +0 -8
- data/vendor/assets/javascripts/codemirror/utils/closetag.js +35 -35
- data/vendor/assets/javascripts/codemirror/utils/formatting.js +147 -253
- data/vendor/assets/javascripts/codemirror/utils/multiplex.js +4 -8
- data/vendor/assets/javascripts/codemirror/utils/overlay.js +3 -1
- data/vendor/assets/javascripts/codemirror/utils/runmode-standalone.js +90 -0
- data/vendor/assets/javascripts/codemirror/utils/simple-hint.js +1 -1
- data/vendor/assets/stylesheets/codemirror.css +2 -2
- metadata +14 -12
@@ -96,7 +96,7 @@ CodeMirror.defineMode("gfm", function(config, parserConfig) {
|
|
96
96
|
},
|
97
97
|
|
98
98
|
copyState: function(state) {
|
99
|
-
return {token: state.token,
|
99
|
+
return {token: state.token, mdState: CodeMirror.copyState(mdMode, state.mdState),
|
100
100
|
localMode: state.localMode,
|
101
101
|
localState: state.localMode ? CodeMirror.copyState(state.localMode, state.localState) : null};
|
102
102
|
},
|
@@ -140,6 +140,11 @@ CodeMirror.defineMode("gfm", function(config, parserConfig) {
|
|
140
140
|
}
|
141
141
|
|
142
142
|
return state.token(stream, state);
|
143
|
+
},
|
144
|
+
|
145
|
+
innerMode: function(state) {
|
146
|
+
if (state.token == markdown) return {state: state.mdState, mode: mdMode};
|
147
|
+
else return {state: state.localState, mode: state.localMode};
|
143
148
|
}
|
144
149
|
};
|
145
150
|
}, "markdown");
|
@@ -421,9 +421,6 @@ CodeMirror.defineMode("haxe", function(config, parserConfig) {
|
|
421
421
|
else if (lexical.align) return lexical.column + (closing ? 0 : 1);
|
422
422
|
else return lexical.indented + (closing ? 0 : indentUnit);
|
423
423
|
},
|
424
|
-
compareStates: function(state1, state2) {
|
425
|
-
return (state1.localVars == state2.localVars) && (state1.context == state2.context);
|
426
|
-
},
|
427
424
|
|
428
425
|
electricChars: "{}"
|
429
426
|
};
|
@@ -58,8 +58,12 @@ CodeMirror.defineMode("htmlembedded", function(config, parserConfig) {
|
|
58
58
|
};
|
59
59
|
},
|
60
60
|
|
61
|
+
electricChars: "/{}:",
|
61
62
|
|
62
|
-
|
63
|
+
innerMode: function(state) {
|
64
|
+
if (state.token == scriptingDispatch) return {state: state.scriptState, mode: scriptingMode};
|
65
|
+
else return {state: state.htmlState, mode: htmlMixedMode};
|
66
|
+
}
|
63
67
|
};
|
64
68
|
}, "htmlmixed");
|
65
69
|
|
@@ -1,4 +1,4 @@
|
|
1
|
-
CodeMirror.defineMode("htmlmixed", function(config
|
1
|
+
CodeMirror.defineMode("htmlmixed", function(config) {
|
2
2
|
var htmlMode = CodeMirror.getMode(config, {name: "xml", htmlMode: true});
|
3
3
|
var jsMode = CodeMirror.getMode(config, "javascript");
|
4
4
|
var cssMode = CodeMirror.getMode(config, "css");
|
@@ -9,27 +9,28 @@ CodeMirror.defineMode("htmlmixed", function(config, parserConfig) {
|
|
9
9
|
if (/^script$/i.test(state.htmlState.context.tagName)) {
|
10
10
|
state.token = javascript;
|
11
11
|
state.localState = jsMode.startState(htmlMode.indent(state.htmlState, ""));
|
12
|
-
state.mode = "javascript";
|
13
12
|
}
|
14
13
|
else if (/^style$/i.test(state.htmlState.context.tagName)) {
|
15
14
|
state.token = css;
|
16
15
|
state.localState = cssMode.startState(htmlMode.indent(state.htmlState, ""));
|
17
|
-
state.mode = "css";
|
18
16
|
}
|
19
17
|
}
|
20
18
|
return style;
|
21
19
|
}
|
22
20
|
function maybeBackup(stream, pat, style) {
|
23
21
|
var cur = stream.current();
|
24
|
-
var close = cur.search(pat);
|
22
|
+
var close = cur.search(pat), m;
|
25
23
|
if (close > -1) stream.backUp(cur.length - close);
|
24
|
+
else if (m = cur.match(/<\/?$/)) {
|
25
|
+
stream.backUp(cur[0].length);
|
26
|
+
if (!stream.match(pat, false)) stream.match(cur[0]);
|
27
|
+
}
|
26
28
|
return style;
|
27
29
|
}
|
28
30
|
function javascript(stream, state) {
|
29
31
|
if (stream.match(/^<\/\s*script\s*>/i, false)) {
|
30
32
|
state.token = html;
|
31
33
|
state.localState = null;
|
32
|
-
state.mode = "html";
|
33
34
|
return html(stream, state);
|
34
35
|
}
|
35
36
|
return maybeBackup(stream, /<\/\s*script\s*>/,
|
@@ -39,7 +40,6 @@ CodeMirror.defineMode("htmlmixed", function(config, parserConfig) {
|
|
39
40
|
if (stream.match(/^<\/\s*style\s*>/i, false)) {
|
40
41
|
state.token = html;
|
41
42
|
state.localState = null;
|
42
|
-
state.mode = "html";
|
43
43
|
return html(stream, state);
|
44
44
|
}
|
45
45
|
return maybeBackup(stream, /<\/\s*style\s*>/,
|
@@ -72,13 +72,12 @@ CodeMirror.defineMode("htmlmixed", function(config, parserConfig) {
|
|
72
72
|
return cssMode.indent(state.localState, textAfter);
|
73
73
|
},
|
74
74
|
|
75
|
-
|
76
|
-
if (a.mode != b.mode) return false;
|
77
|
-
if (a.localState) return CodeMirror.Pass;
|
78
|
-
return htmlMode.compareStates(a.htmlState, b.htmlState);
|
79
|
-
},
|
75
|
+
electricChars: "/{}:",
|
80
76
|
|
81
|
-
|
77
|
+
innerMode: function(state) {
|
78
|
+
var mode = state.token == html ? htmlMode : state.token == javascript ? jsMode : cssMode;
|
79
|
+
return {state: state.localState || state.htmlState, mode: mode};
|
80
|
+
}
|
82
81
|
};
|
83
82
|
}, "xml", "javascript", "css");
|
84
83
|
|
@@ -175,8 +175,8 @@ CodeMirror.defineMode("javascript", function(config, parserConfig) {
|
|
175
175
|
|
176
176
|
var defaultVars = {name: "this", next: {name: "arguments"}};
|
177
177
|
function pushcontext() {
|
178
|
-
if (!cx.state.context) cx.state.localVars = defaultVars;
|
179
178
|
cx.state.context = {prev: cx.state.context, vars: cx.state.localVars};
|
179
|
+
cx.state.localVars = defaultVars;
|
180
180
|
}
|
181
181
|
function popcontext() {
|
182
182
|
cx.state.localVars = cx.state.context.vars;
|
@@ -2,12 +2,18 @@ CodeMirror.defineMode("markdown", function(cmCfg, modeCfg) {
|
|
2
2
|
|
3
3
|
var htmlFound = CodeMirror.mimeModes.hasOwnProperty("text/html");
|
4
4
|
var htmlMode = CodeMirror.getMode(cmCfg, htmlFound ? "text/html" : "text/plain");
|
5
|
+
|
6
|
+
var codeDepth = 0;
|
7
|
+
var prevLineHasContent = false
|
8
|
+
, thisLineHasContent = false;
|
5
9
|
|
6
10
|
var header = 'header'
|
7
11
|
, code = 'comment'
|
8
12
|
, quote = 'quote'
|
9
13
|
, list = 'string'
|
10
14
|
, hr = 'hr'
|
15
|
+
, linkinline = 'link'
|
16
|
+
, linkemail = 'link'
|
11
17
|
, linktext = 'link'
|
12
18
|
, linkhref = 'string'
|
13
19
|
, em = 'em'
|
@@ -17,8 +23,8 @@ CodeMirror.defineMode("markdown", function(cmCfg, modeCfg) {
|
|
17
23
|
var hrRE = /^([*\-=_])(?:\s*\1){2,}\s*$/
|
18
24
|
, ulRE = /^[*\-+]\s+/
|
19
25
|
, olRE = /^[0-9]+\.\s+/
|
20
|
-
, headerRE = /^(?:\={
|
21
|
-
, textRE = /^[^\[*_\\<>`]+/;
|
26
|
+
, headerRE = /^(?:\={1,}|-{1,})$/
|
27
|
+
, textRE = /^[^\[*_\\<>` "'(]+/;
|
22
28
|
|
23
29
|
function switchInline(stream, state, f) {
|
24
30
|
state.f = state.inline = f;
|
@@ -34,6 +40,10 @@ CodeMirror.defineMode("markdown", function(cmCfg, modeCfg) {
|
|
34
40
|
// Blocks
|
35
41
|
|
36
42
|
function blankLine(state) {
|
43
|
+
// Reset linkTitle state
|
44
|
+
state.linkTitle = false;
|
45
|
+
// Reset CODE state
|
46
|
+
state.code = false;
|
37
47
|
// Reset EM state
|
38
48
|
state.em = false;
|
39
49
|
// Reset STRONG state
|
@@ -49,13 +59,23 @@ CodeMirror.defineMode("markdown", function(cmCfg, modeCfg) {
|
|
49
59
|
|
50
60
|
function blockNormal(stream, state) {
|
51
61
|
var match;
|
62
|
+
|
63
|
+
if (state.list !== false && state.indentationDiff >= 0) { // Continued list
|
64
|
+
if (state.indentationDiff < 4) { // Only adjust indentation if *not* a code block
|
65
|
+
state.indentation -= state.indentationDiff;
|
66
|
+
}
|
67
|
+
state.list = null;
|
68
|
+
} else { // No longer a list
|
69
|
+
state.list = false;
|
70
|
+
}
|
71
|
+
|
52
72
|
if (state.indentationDiff >= 4) {
|
53
|
-
state.indentation -=
|
73
|
+
state.indentation -= 4;
|
54
74
|
stream.skipToEnd();
|
55
75
|
return code;
|
56
76
|
} else if (stream.eatSpace()) {
|
57
77
|
return null;
|
58
|
-
} else if (stream.peek() === '#' || stream.match(headerRE)) {
|
78
|
+
} else if (stream.peek() === '#' || (prevLineHasContent && stream.match(headerRE)) ) {
|
59
79
|
state.header = true;
|
60
80
|
} else if (stream.eat('>')) {
|
61
81
|
state.indentation++;
|
@@ -65,8 +85,8 @@ CodeMirror.defineMode("markdown", function(cmCfg, modeCfg) {
|
|
65
85
|
} else if (stream.match(hrRE, true)) {
|
66
86
|
return hr;
|
67
87
|
} else if (match = stream.match(ulRE, true) || stream.match(olRE, true)) {
|
68
|
-
state.indentation +=
|
69
|
-
|
88
|
+
state.indentation += 4;
|
89
|
+
state.list = true;
|
70
90
|
}
|
71
91
|
|
72
92
|
return switchInline(stream, state, state.inline);
|
@@ -94,8 +114,11 @@ CodeMirror.defineMode("markdown", function(cmCfg, modeCfg) {
|
|
94
114
|
if (state.strong) { styles.push(state.em ? emstrong : strong); }
|
95
115
|
else if (state.em) { styles.push(em); }
|
96
116
|
|
117
|
+
if (state.code) { styles.push(code); }
|
118
|
+
|
97
119
|
if (state.header) { styles.push(header); }
|
98
120
|
if (state.quote) { styles.push(quote); }
|
121
|
+
if (state.list !== false) { styles.push(list); }
|
99
122
|
|
100
123
|
return styles.length ? styles.join(' ') : null;
|
101
124
|
}
|
@@ -112,18 +135,64 @@ CodeMirror.defineMode("markdown", function(cmCfg, modeCfg) {
|
|
112
135
|
if (typeof style !== 'undefined')
|
113
136
|
return style;
|
114
137
|
|
138
|
+
if (state.list) { // List marker (*, +, -, 1., etc)
|
139
|
+
state.list = null;
|
140
|
+
return list;
|
141
|
+
}
|
142
|
+
|
115
143
|
var ch = stream.next();
|
116
144
|
|
117
145
|
if (ch === '\\') {
|
118
146
|
stream.next();
|
119
147
|
return getType(state);
|
120
148
|
}
|
149
|
+
|
150
|
+
// Matches link titles present on next line
|
151
|
+
if (state.linkTitle) {
|
152
|
+
state.linkTitle = false;
|
153
|
+
var matchCh = ch;
|
154
|
+
if (ch === '(') {
|
155
|
+
matchCh = ')';
|
156
|
+
}
|
157
|
+
matchCh = (matchCh+'').replace(/([.?*+^$[\]\\(){}|-])/g, "\\$1");
|
158
|
+
var regex = '^\\s*(?:[^' + matchCh + '\\\\]+|\\\\\\\\|\\\\.)' + matchCh;
|
159
|
+
if (stream.match(new RegExp(regex), true)) {
|
160
|
+
return linkhref;
|
161
|
+
}
|
162
|
+
}
|
163
|
+
|
121
164
|
if (ch === '`') {
|
122
|
-
|
165
|
+
var t = getType(state);
|
166
|
+
var before = stream.pos;
|
167
|
+
stream.eatWhile('`');
|
168
|
+
var difference = 1 + stream.pos - before;
|
169
|
+
if (!state.code) {
|
170
|
+
codeDepth = difference;
|
171
|
+
state.code = true;
|
172
|
+
return getType(state);
|
173
|
+
} else {
|
174
|
+
if (difference === codeDepth) { // Must be exact
|
175
|
+
state.code = false;
|
176
|
+
return t;
|
177
|
+
}
|
178
|
+
return getType(state);
|
179
|
+
}
|
180
|
+
} else if (state.code) {
|
181
|
+
return getType(state);
|
123
182
|
}
|
124
|
-
|
183
|
+
|
184
|
+
if (ch === '[' && stream.match(/.*\] ?(?:\(|\[)/, false)) {
|
125
185
|
return switchInline(stream, state, linkText);
|
126
186
|
}
|
187
|
+
|
188
|
+
if (ch === '<' && stream.match(/^(https?|ftps?):\/\/(?:[^\\>]|\\.)+>/, true)) {
|
189
|
+
return switchInline(stream, state, inlineElement(linkinline, '>'));
|
190
|
+
}
|
191
|
+
|
192
|
+
if (ch === '<' && stream.match(/^[^> \\]+@(?:[^\\>]|\\.)+>/, true)) {
|
193
|
+
return switchInline(stream, state, inlineElement(linkemail, '>'));
|
194
|
+
}
|
195
|
+
|
127
196
|
if (ch === '<' && stream.match(/^\w/, false)) {
|
128
197
|
var md_inside = false;
|
129
198
|
if (stream.string.indexOf(">")!=-1) {
|
@@ -143,10 +212,27 @@ CodeMirror.defineMode("markdown", function(cmCfg, modeCfg) {
|
|
143
212
|
|
144
213
|
var t = getType(state);
|
145
214
|
if (ch === '*' || ch === '_') {
|
146
|
-
if (stream.eat(ch)) {
|
147
|
-
|
215
|
+
if (state.strong === ch && stream.eat(ch)) { // Remove STRONG
|
216
|
+
state.strong = false;
|
217
|
+
return t;
|
218
|
+
} else if (!state.strong && stream.eat(ch)) { // Add STRONG
|
219
|
+
state.strong = ch;
|
220
|
+
return getType(state);
|
221
|
+
} else if (state.em === ch) { // Remove EM
|
222
|
+
state.em = false;
|
223
|
+
return t;
|
224
|
+
} else if (!state.em) { // Add EM
|
225
|
+
state.em = ch;
|
226
|
+
return getType(state);
|
227
|
+
}
|
228
|
+
} else if (ch === ' ') {
|
229
|
+
if (stream.eat('*') || stream.eat('_')) { // Probably surrounded by spaces
|
230
|
+
if (stream.peek() === ' ') { // Surrounded by spaces, ignore
|
231
|
+
return getType(state);
|
232
|
+
} else { // Not surrounded by spaces, back up pointer
|
233
|
+
stream.backUp(1);
|
234
|
+
}
|
148
235
|
}
|
149
|
-
return (state.em = !state.em) ? getType(state) : t;
|
150
236
|
}
|
151
237
|
|
152
238
|
return getType(state);
|
@@ -165,7 +251,10 @@ CodeMirror.defineMode("markdown", function(cmCfg, modeCfg) {
|
|
165
251
|
}
|
166
252
|
|
167
253
|
function linkHref(stream, state) {
|
168
|
-
|
254
|
+
// Check if space, and return NULL if so (to avoid marking the space)
|
255
|
+
if(stream.eatSpace()){
|
256
|
+
return null;
|
257
|
+
}
|
169
258
|
var ch = stream.next();
|
170
259
|
if (ch === '(' || ch === '[') {
|
171
260
|
return switchInline(stream, state, inlineElement(linkhref, ch === '(' ? ')' : ']'));
|
@@ -182,17 +271,29 @@ CodeMirror.defineMode("markdown", function(cmCfg, modeCfg) {
|
|
182
271
|
}
|
183
272
|
|
184
273
|
function footnoteUrl(stream, state) {
|
185
|
-
|
274
|
+
// Check if space, and return NULL if so (to avoid marking the space)
|
275
|
+
if(stream.eatSpace()){
|
276
|
+
return null;
|
277
|
+
}
|
278
|
+
// Match URL
|
186
279
|
stream.match(/^[^\s]+/, true);
|
280
|
+
// Check for link title
|
281
|
+
if (stream.peek() === undefined) { // End of line, set flag to check next line
|
282
|
+
state.linkTitle = true;
|
283
|
+
} else { // More content on line, check if link title
|
284
|
+
stream.match(/^(?:\s+(?:"(?:[^"\\]|\\\\|\\.)+"|'(?:[^'\\]|\\\\|\\.)+'|\((?:[^)\\]|\\\\|\\.)+\)))?/, true);
|
285
|
+
}
|
187
286
|
state.f = state.inline = inlineNormal;
|
188
287
|
return linkhref;
|
189
288
|
}
|
190
289
|
|
191
290
|
function inlineRE(endChar) {
|
192
291
|
if (!inlineRE[endChar]) {
|
193
|
-
//
|
194
|
-
|
195
|
-
|
292
|
+
// Escape endChar for RegExp (taken from http://stackoverflow.com/a/494122/526741)
|
293
|
+
endChar = (endChar+'').replace(/([.?*+^$[\]\\(){}|-])/g, "\\$1");
|
294
|
+
// Match any non-endChar, escaped character, as well as the closing
|
295
|
+
// endChar.
|
296
|
+
inlineRE[endChar] = new RegExp('^(?:[^\\\\]+?|\\\\.)*?(' + endChar + ')');
|
196
297
|
}
|
197
298
|
return inlineRE[endChar];
|
198
299
|
}
|
@@ -217,9 +318,11 @@ CodeMirror.defineMode("markdown", function(cmCfg, modeCfg) {
|
|
217
318
|
|
218
319
|
inline: inlineNormal,
|
219
320
|
text: handleText,
|
321
|
+
linkTitle: false,
|
220
322
|
em: false,
|
221
323
|
strong: false,
|
222
324
|
header: false,
|
325
|
+
list: false,
|
223
326
|
quote: false
|
224
327
|
};
|
225
328
|
},
|
@@ -234,9 +337,11 @@ CodeMirror.defineMode("markdown", function(cmCfg, modeCfg) {
|
|
234
337
|
|
235
338
|
inline: s.inline,
|
236
339
|
text: s.text,
|
340
|
+
linkTitle: s.linkTitle,
|
237
341
|
em: s.em,
|
238
342
|
strong: s.strong,
|
239
343
|
header: s.header,
|
344
|
+
list: s.list,
|
240
345
|
quote: s.quote,
|
241
346
|
md_inside: s.md_inside
|
242
347
|
};
|
@@ -244,7 +349,16 @@ CodeMirror.defineMode("markdown", function(cmCfg, modeCfg) {
|
|
244
349
|
|
245
350
|
token: function(stream, state) {
|
246
351
|
if (stream.sol()) {
|
247
|
-
if (stream.match(/^\s*$/, true)) {
|
352
|
+
if (stream.match(/^\s*$/, true)) {
|
353
|
+
prevLineHasContent = false;
|
354
|
+
return blankLine(state);
|
355
|
+
} else {
|
356
|
+
if(thisLineHasContent){
|
357
|
+
prevLineHasContent = true;
|
358
|
+
thisLineHasContent = false;
|
359
|
+
}
|
360
|
+
thisLineHasContent = true;
|
361
|
+
}
|
248
362
|
|
249
363
|
// Reset state.header
|
250
364
|
state.header = false;
|
@@ -56,14 +56,13 @@
|
|
56
56
|
var phpMode = CodeMirror.getMode(config, phpConfig);
|
57
57
|
|
58
58
|
function dispatch(stream, state) { // TODO open PHP inside text/css
|
59
|
-
var isPHP = state.
|
59
|
+
var isPHP = state.curMode == phpMode;
|
60
60
|
if (stream.sol() && state.pending != '"') state.pending = null;
|
61
61
|
if (state.curMode == htmlMode) {
|
62
62
|
if (stream.match(/^<\?\w*/)) {
|
63
63
|
state.curMode = phpMode;
|
64
64
|
state.curState = state.php;
|
65
65
|
state.curClose = "?>";
|
66
|
-
state.mode = "php";
|
67
66
|
return "meta";
|
68
67
|
}
|
69
68
|
if (state.pending == '"') {
|
@@ -86,13 +85,11 @@
|
|
86
85
|
state.curMode = jsMode;
|
87
86
|
state.curState = jsMode.startState(htmlMode.indent(state.curState, ""));
|
88
87
|
state.curClose = /^<\/\s*script\s*>/i;
|
89
|
-
state.mode = "javascript";
|
90
88
|
}
|
91
89
|
else if (/^style$/i.test(state.curState.context.tagName)) {
|
92
90
|
state.curMode = cssMode;
|
93
91
|
state.curState = cssMode.startState(htmlMode.indent(state.curState, ""));
|
94
92
|
state.curClose = /^<\/\s*style\s*>/i;
|
95
|
-
state.mode = "css";
|
96
93
|
}
|
97
94
|
}
|
98
95
|
return style;
|
@@ -101,7 +98,6 @@
|
|
101
98
|
state.curMode = htmlMode;
|
102
99
|
state.curState = state.html;
|
103
100
|
state.curClose = null;
|
104
|
-
state.mode = "html";
|
105
101
|
if (isPHP) return "meta";
|
106
102
|
else return dispatch(stream, state);
|
107
103
|
} else {
|
@@ -141,7 +137,9 @@
|
|
141
137
|
return state.curMode.indent(state.curState, textAfter);
|
142
138
|
},
|
143
139
|
|
144
|
-
electricChars: "/{}:"
|
140
|
+
electricChars: "/{}:",
|
141
|
+
|
142
|
+
innerMode: function(state) { return {state: state.curState, mode: state.curMode}; }
|
145
143
|
};
|
146
144
|
}, "xml", "clike", "javascript", "css");
|
147
145
|
CodeMirror.defineMIME("application/x-httpd-php", "php");
|
@@ -60,7 +60,7 @@ CodeMirror.defineMode('shell', function(config) {
|
|
60
60
|
stream.eatWhile(/\w/);
|
61
61
|
var cur = stream.current();
|
62
62
|
if (stream.peek() === '=' && /\w+/.test(cur)) return 'def';
|
63
|
-
return words[cur]
|
63
|
+
return words.hasOwnProperty(cur) ? words[cur] : null;
|
64
64
|
}
|
65
65
|
|
66
66
|
function tokenString(quote) {
|