我正在尝试制作适用于颜色代码的 CodeMirror 模式。颜色代码标记定义为&x
,x
为数字或字母 (af)。标记之后的所有东西都应该是那种颜色,直到它遇到另一个标记。
着色工作,但整个输入是着色的,而不是仅在颜色代码标记之后。整个输入用输入中最后出现的颜色着色。
这是我的代码:
CodeMirror.defineMode("colorCodes", function () {
return {
startState: () => {
return {
color: null
};
},
token: function (stream, state) {
if (!state.color) {
console.log(stream.peek());
if (stream.skipTo('&0')) {
stream.next();
stream.next();
state.color = 'black';
} else if (stream.skipTo('&1')) {
stream.next();
stream.next();
state.color = 'dark_blue';
} else if (stream.skipTo('&2')) {
stream.next();
stream.next();
state.color = 'dark_green';
} else if (stream.skipTo('&3')) {
stream.next();
stream.next();
state.color = 'dark_aqua';
} else if (stream.skipTo('&4')) {
stream.next();
stream.next();
state.color = 'dark_red';
} else if (stream.skipTo('&5')) {
stream.next();
stream.next();
state.color = 'dark_purple';
} else if (stream.skipTo('&6')) {
stream.next();
stream.next();
state.color = 'gold';
} else if (stream.skipTo('&7')) {
stream.next();
stream.next();
state.color = 'gray';
} else if (stream.skipTo('&8')) {
stream.next();
stream.next();
state.color = 'dark_gray';
} else if (stream.skipTo('&9')) {
stream.next();
stream.next();
state.color = 'blue';
} else if (stream.skipTo('&a')) {
stream.next();
stream.next();
state.color = 'green';
} else if (stream.skipTo('&b')) {
stream.next();
stream.next();
state.color = 'aqua';
} else if (stream.skipTo('&c')) {
stream.skipTo('&c');
stream.next();
stream.next();
state.color = 'red';
} else if (stream.skipTo('&d')) {
stream.next();
stream.next();
state.color = 'light_purple';
} else if (stream.skipTo('&e')) {
stream.next();
stream.next();
state.color = 'yellow';
} else if (stream.skipTo('&f')) {
stream.next();
stream.next();
state.color = 'white';
}
}
if (state.color) {
if (stream.skipTo('&0')) {
stream.next();
stream.next();
state.color = 'black';
} else if (stream.skipTo('&1')) {
stream.next();
stream.next();
state.color = 'dark_blue';
} else if (stream.skipTo('&2')) {
stream.next();
stream.next();
state.color = 'dark_green';
} else if (stream.skipTo('&3')) {
stream.next();
stream.next();
state.color = 'dark_aqua';
} else if (stream.skipTo('&4')) {
stream.next();
stream.next();
state.color = 'dark_red';
} else if (stream.skipTo('&5')) {
stream.next();
stream.next();
state.color = 'dark_purple';
} else if (stream.skipTo('&6')) {
stream.next();
stream.next();
state.color = 'gold';
} else if (stream.skipTo('&7')) {
stream.next();
stream.next();
state.color = 'gray';
} else if (stream.skipTo('&8')) {
stream.next();
stream.next();
state.color = 'dark_gray';
} else if (stream.skipTo('&9')) {
stream.next();
stream.next();
state.color = 'blue';
} else if (stream.skipTo('&a')) {
stream.next();
stream.next();
state.color = 'green';
} else if (stream.skipTo('&b')) {
stream.next();
stream.next();
state.color = 'aqua';
} else if (stream.skipTo('&c')) {
stream.next();
stream.next();
state.color = 'red';
} else if (stream.skipTo('&d')) {
stream.next();
stream.next();
state.color = 'light_purple';
} else if (stream.skipTo('&e')) {
stream.next();
stream.next();
state.color = 'yellow';
} else if (stream.skipTo('&f')) {
stream.next();
stream.next();
state.color = 'white';
} else {
stream.skipToEnd();
}
return state.color;
} else {
return null;
}
}
};
});
var editor = CodeMirror.fromTextArea(document.getElementById('editor-name'), {
mode: "colorCodes",
});