Codemirror:自己的模块关键字
Codemirror: Own Module Keywords
我尝试编写我的 owm 模块,用于我们自己的脚本语言 codemirror.Right 知道我挂在我们的关键字上。
我有这个测试代码:
Window(EditWin, SELECT_MULTIPLE, NO_SIZE, 310, 87, 500, 60, T("Sitzungsdatum", "Session date"))
{
Prompt(SessionDatePmt, 11, 4, T("Sitzungsdatum", "Session date"))
Date(SessionDate, 175, 4, 88)
Button(SystemDateAsSessionDateBtn, 290, 3, 190, 10, T("Übernehme Systemdatum", "Get system date"))
[ SELECT: SystemObject Call(SystemDate) PutObject(, SessionDate) ]
}
我们的一些关键词是:
- Window
- SELECT_MULTIPLE
- NO_SIZE
- 提示
- 日期
- 按钮
- Select
- 系统对象
- 致电
- PutObject
对于我的正则表达式,我使用一个名为 cons 的数组,其中包含所有关键字。
然后我像这样加入所有数组条目:
var keywordRegex = new RegExp("\b(("+cons.join(")|(")+"))\b");
至此一切正常。我得到的正则表达式在正常 javascript match() 中确实有效。我什至使用 jQuery 获取我网站的文本,然后使用正则表达式,得到了我想要的。
但是,当我这样做时:
if (stream.match(keywordRegex)) return 'keyword';
在Codemirror中,SessionDate的Date也是匹配的
这是我的整个Codemirror模式:
(function(mod) {
if (typeof exports == "object" && typeof module == "object") // CommonJS
mod(require("../../lib/codemirror"));
else if (typeof define == "function" && define.amd) // AMD
define(["../../lib/codemirror"], mod);
else // Plain browser env
mod(CodeMirror);
})(function(CodeMirror) {
"use strict";
CodeMirror.defineMode("testmode", function() {
var cons = ['Window', 'SELECT_MULTIPLE', 'NO_SIZE', 'PROMPT', 'Date', 'Button', 'Select', 'SystemObject', 'Call', 'PutObject'];
var keywordRegex = new RegExp("\b(("+cons.join(")|(")+"))\b");
var numLiteral = /(-|\+)?([0-9]+(\.[0-9]*)?|0x[0-9a-f]+)/;
return {
token: function(stream, state) {
if (stream.match(/^('([^']|\.)*'?|"([^"]|\.)*"?)/))
return "string";
if (stream.match(keywordRegex)) return 'keyword';
if (stream.match(/({|})/)) return "bracket";
if (stream.match(numLiteral)) return "number";
if (stream.match(/(->)/)) return "arrow";
stream.next();
return null;
},
startState: function() {
return {
pair: false,
pairStart: false,
keyCol: 0,
inlinePairs: 0,
inlineList: 0,
literal: false,
escaped: false
};
}
};
});
CodeMirror.defineMIME("application/testmode", "testmode");
});
编辑:
正如所要求的,这是一个有效的插件:
http://plnkr.co/edit/bPyuJd?p=preview
你可以看到,我没有关键字 "SessionDate",但是由于关键字 "Date","SessionDate" 的 "Date" 也被突出显示。
看来我找到了解决方法。有no support for anchors in Code Mirror:
(The ^
regexp marker doesn't work as you'd expect in
this context because of limitations in JavaScript's RegExp
API.)
因此,对字符串条件的开头和字符串中间位置使用 2 个正则表达式,对于字符串开头位置,请使用 stream.sol()
:
检查位置
var keywordRegex = new RegExp("("+cons.join("|")+")(?=\W)");
var midkeywordRegex = new RegExp("\W("+cons.join("|")+")(?=\W)");
...
if (stream.sol() && stream.match(/('([^']|\.)*'?|"([^"]|\.)*"?)/))
return "iv-string";
if (stream.sol() && stream.match(keywordRegex)) return 'keyword';
if (stream.match(midkeywordRegex)) return 'keyword';
我尝试编写我的 owm 模块,用于我们自己的脚本语言 codemirror.Right 知道我挂在我们的关键字上。
我有这个测试代码:
Window(EditWin, SELECT_MULTIPLE, NO_SIZE, 310, 87, 500, 60, T("Sitzungsdatum", "Session date"))
{
Prompt(SessionDatePmt, 11, 4, T("Sitzungsdatum", "Session date"))
Date(SessionDate, 175, 4, 88)
Button(SystemDateAsSessionDateBtn, 290, 3, 190, 10, T("Übernehme Systemdatum", "Get system date"))
[ SELECT: SystemObject Call(SystemDate) PutObject(, SessionDate) ]
}
我们的一些关键词是:
- Window
- SELECT_MULTIPLE
- NO_SIZE
- 提示
- 日期
- 按钮
- Select
- 系统对象
- 致电
- PutObject
对于我的正则表达式,我使用一个名为 cons 的数组,其中包含所有关键字。
然后我像这样加入所有数组条目:
var keywordRegex = new RegExp("\b(("+cons.join(")|(")+"))\b");
至此一切正常。我得到的正则表达式在正常 javascript match() 中确实有效。我什至使用 jQuery 获取我网站的文本,然后使用正则表达式,得到了我想要的。
但是,当我这样做时:
if (stream.match(keywordRegex)) return 'keyword';
在Codemirror中,SessionDate的Date也是匹配的
这是我的整个Codemirror模式:
(function(mod) {
if (typeof exports == "object" && typeof module == "object") // CommonJS
mod(require("../../lib/codemirror"));
else if (typeof define == "function" && define.amd) // AMD
define(["../../lib/codemirror"], mod);
else // Plain browser env
mod(CodeMirror);
})(function(CodeMirror) {
"use strict";
CodeMirror.defineMode("testmode", function() {
var cons = ['Window', 'SELECT_MULTIPLE', 'NO_SIZE', 'PROMPT', 'Date', 'Button', 'Select', 'SystemObject', 'Call', 'PutObject'];
var keywordRegex = new RegExp("\b(("+cons.join(")|(")+"))\b");
var numLiteral = /(-|\+)?([0-9]+(\.[0-9]*)?|0x[0-9a-f]+)/;
return {
token: function(stream, state) {
if (stream.match(/^('([^']|\.)*'?|"([^"]|\.)*"?)/))
return "string";
if (stream.match(keywordRegex)) return 'keyword';
if (stream.match(/({|})/)) return "bracket";
if (stream.match(numLiteral)) return "number";
if (stream.match(/(->)/)) return "arrow";
stream.next();
return null;
},
startState: function() {
return {
pair: false,
pairStart: false,
keyCol: 0,
inlinePairs: 0,
inlineList: 0,
literal: false,
escaped: false
};
}
};
});
CodeMirror.defineMIME("application/testmode", "testmode");
});
编辑:
正如所要求的,这是一个有效的插件:
http://plnkr.co/edit/bPyuJd?p=preview
你可以看到,我没有关键字 "SessionDate",但是由于关键字 "Date","SessionDate" 的 "Date" 也被突出显示。
看来我找到了解决方法。有no support for anchors in Code Mirror:
(The
^
regexp marker doesn't work as you'd expect in this context because of limitations in JavaScript's RegExp API.)
因此,对字符串条件的开头和字符串中间位置使用 2 个正则表达式,对于字符串开头位置,请使用 stream.sol()
:
var keywordRegex = new RegExp("("+cons.join("|")+")(?=\W)");
var midkeywordRegex = new RegExp("\W("+cons.join("|")+")(?=\W)");
...
if (stream.sol() && stream.match(/('([^']|\.)*'?|"([^"]|\.)*"?)/))
return "iv-string";
if (stream.sol() && stream.match(keywordRegex)) return 'keyword';
if (stream.match(midkeywordRegex)) return 'keyword';