Codemirror,双引号内的defineMode
Codemirror, defineMode inside doublequotes
我正在编写一个自定义叠加层来为某些自定义 functionality/styling.
创建 engage
类型的标记
我目前正在创建双引号内的标记,例如 "EXP=SOMETHING"
我只需要获取双引号之间的内容:EXP=SOMETHING
,我可以轻松跳过第一个引号并获得类似于 EXP=SOMETHING"
但我似乎无法找到一种可行的方法来跳过最后一个引用,我一直在这个问题上苦苦思索了很长时间,我开始认为这实际上是不可能的,因为有一个角色支持returns 一个 EXCEPTION: Uncaught (in promise): Error: Mode engage failed to advance stream.
这是有道理的。我确定我遗漏了一些东西,我会喜欢一些输入。
遵循生成 EXP=SOMETHING"
的代码
感谢您的帮助:-)
CodeMirror.defineMode("engage", function(config, parserConfig) {
var engageOverlay = {
startState: function() {return {inString: false};},
token: function(stream, state) {
// If we are not inside the engage token and we are peeking a "
if (!state.inString && stream.peek() == '"') {
// We move the stream to the next char
// Then mark the start of the string
// Then return null to avoid including the first " as part of the token
stream.next();
state.inString = true;
return null;
}
// We are inside the target token
if (state.inString)
{
if (stream.skipTo('"'))
{
stream.next();
state.inString = false;
}
else
{
stream.skipToEnd();
}
return "engage";
}
else
{
stream.skipTo('"') || stream.skipToEnd();
return null;
}
}
};
return CodeMirror.overlayMode(CodeMirror.getMode(config, parserConfig.backdrop || "xml"), engageOverlay);
});
如果有人偶然发现了这个问题,这里是上述问题的解决方案:
// If we are not inside the engage token and we are peeking a "
if ( !state.inString && stream.match(/="/, true) ) {
state.inString = true;
return null;
}
// We are inside the target token
if (state.inString)
{
if (stream.skipTo('"'))
{
state.inString = false;
return "engage";
}
else
{
stream.skipToEnd();
return null;
}
}
stream.next();
return null;
我们基本上只是区分双引号的开始和结束,在我的特殊情况下,我总是在第一个 " 之前有一个 =,如果不是这样,您可以轻松设置另一个标志。
我正在编写一个自定义叠加层来为某些自定义 functionality/styling.
创建engage
类型的标记
我目前正在创建双引号内的标记,例如 "EXP=SOMETHING"
我只需要获取双引号之间的内容:EXP=SOMETHING
,我可以轻松跳过第一个引号并获得类似于 EXP=SOMETHING"
但我似乎无法找到一种可行的方法来跳过最后一个引用,我一直在这个问题上苦苦思索了很长时间,我开始认为这实际上是不可能的,因为有一个角色支持returns 一个 EXCEPTION: Uncaught (in promise): Error: Mode engage failed to advance stream.
这是有道理的。我确定我遗漏了一些东西,我会喜欢一些输入。
遵循生成 EXP=SOMETHING"
的代码
感谢您的帮助:-)
CodeMirror.defineMode("engage", function(config, parserConfig) {
var engageOverlay = {
startState: function() {return {inString: false};},
token: function(stream, state) {
// If we are not inside the engage token and we are peeking a "
if (!state.inString && stream.peek() == '"') {
// We move the stream to the next char
// Then mark the start of the string
// Then return null to avoid including the first " as part of the token
stream.next();
state.inString = true;
return null;
}
// We are inside the target token
if (state.inString)
{
if (stream.skipTo('"'))
{
stream.next();
state.inString = false;
}
else
{
stream.skipToEnd();
}
return "engage";
}
else
{
stream.skipTo('"') || stream.skipToEnd();
return null;
}
}
};
return CodeMirror.overlayMode(CodeMirror.getMode(config, parserConfig.backdrop || "xml"), engageOverlay);
});
如果有人偶然发现了这个问题,这里是上述问题的解决方案:
// If we are not inside the engage token and we are peeking a "
if ( !state.inString && stream.match(/="/, true) ) {
state.inString = true;
return null;
}
// We are inside the target token
if (state.inString)
{
if (stream.skipTo('"'))
{
state.inString = false;
return "engage";
}
else
{
stream.skipToEnd();
return null;
}
}
stream.next();
return null;
我们基本上只是区分双引号的开始和结束,在我的特殊情况下,我总是在第一个 " 之前有一个 =,如果不是这样,您可以轻松设置另一个标志。