1

codemirror 用の独自のスクリプト言語用に、owm モジュールを作成しようとしています。

私はこのテストコードを持っています:

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) ]
}

そして、私たちのキーワードのいくつかは次のとおりです。

  • SELECT_MULTIPLE
  • NO_SIZE
  • 促す
  • 日にち
  • ボタン
  • 選択する
  • SystemObject
  • 電話
  • 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」も強調表示されます。

4

1 に答える 1

2

解決する方法を見つけたようです。Code Mirror ではアンカーはサポートされていません。

( ^JavaScript の 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';

更新されたプランカーを参照してください

于 2015-10-02T10:12:14.710 に答える