Skip to content

Commit 0f371f4

Browse files
committed
[simple mode addon] Add support for pushed/popped states
1 parent b27ca62 commit 0f371f4

File tree

1 file changed

+16
-6
lines changed

1 file changed

+16
-6
lines changed

addon/mode/simple.js

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,8 @@
4040
indent: state.indent && state.indent.slice(0)};
4141
if (state.localState)
4242
s.localState = CodeMirror.copyState(state.local.mode, state.localState);
43+
if (state.stack)
44+
s.stack = state.stack.slice(0);
4345
for (var pers = state.persistentStates; pers; pers = pers.next)
4446
s.persistentStates = {mode: pers.mode,
4547
spec: pers.spec,
@@ -83,7 +85,7 @@
8385
}
8486

8587
function Rule(data, states) {
86-
if (data.next) ensureState(states, data.next);
88+
if (data.next || data.push) ensureState(states, data.next || data.push);
8789
this.regex = toRegex(data.regex);
8890
this.token = asToken(data.token);
8991
this.data = data;
@@ -116,8 +118,15 @@
116118
var rule = curState[i];
117119
var matches = stream.match(rule.regex);
118120
if (matches) {
119-
if (rule.data.next)
121+
if (rule.data.next) {
120122
state.state = rule.data.next;
123+
} else if (rule.data.push) {
124+
(state.stack || (state.stack = [])).push(state.state);
125+
state.state = rule.data.push;
126+
} else if (rule.data.pop && state.stack && state.stack.length) {
127+
state.state = state.stack.pop();
128+
}
129+
121130
if (rule.data.mode)
122131
enterLocalMode(config, state, rule.data.mode, rule.token);
123132
if (rule.data.indent)
@@ -127,8 +136,9 @@
127136
if (matches.length > 2) {
128137
state.pending = [];
129138
for (var j = 2; j < matches.length; j++)
130-
state.pending.push({text: matches[j], token: rule.token[j - 1]});
131-
stream.backUp(matches[0].length - matches[1].length);
139+
if (matches[j])
140+
state.pending.push({text: matches[j], token: rule.token[j - 1]});
141+
stream.backUp(matches[0].length - (matches[1] ? matches[1].length : 0));
132142
return rule.token[0];
133143
} else if (rule.token && rule.token.join) {
134144
return rule.token[0];
@@ -185,9 +195,9 @@
185195
scan: for (;;) {
186196
for (var i = 0; i < rules.length; i++) {
187197
var rule = rules[i], m = rule.regex.exec(textAfter);
188-
if (m) {
198+
if (m && m[0]) {
189199
if (rule.data.dedent && rule.data.dedentIfLineStart !== false) pos--;
190-
if (rule.next) rules = states[rule.next];
200+
if (rule.next || rule.push) rules = states[rule.next || rule.push];
191201
textAfter = textAfter.slice(m[0].length);
192202
continue scan;
193203
}

0 commit comments

Comments
 (0)