【问题标题】:How to set multiline rule in Monaco Editor如何在摩纳哥编辑器中设置多行规则
【发布时间】:2021-02-20 18:16:05
【问题描述】:

我在这里查看 Monaco Editor 的沙盒:https://microsoft.github.io/monaco-editor/playground.html#extending-language-services-custom-languages

我正在尝试支持以下案例:

"A single line quote"
"But also a slightly weird
multi line quote"

我需要同时支持这两种语言,因为我使用的语言同时支持这两种语言。现在,我设置的规则如下所示:

// Register a tokens provider for the language
monaco.languages.setMonarchTokensProvider('mySpecialLanguage', {
    tokenizer: {
        root: [
            [/"(?:[^"\\]|\\.\n{0,})*"/gi, 'my-string'],
        ]
    }
});

// Define a new theme that contains only rules that match this language
monaco.editor.defineTheme('myCoolTheme', {
    base: 'vs',
    inherit: false,
    rules: [
        { token: 'my-string', foreground: '0000FF' },
    ]
});

问题是多行引号不起作用。我怀疑摩纳哥会逐行解析导致问题的文本/代码,但我肯定不能独自解决这个问题。 有没有我必须设置的标志或其他东西?

【问题讨论】:

    标签: javascript monaco-editor


    【解决方案1】:

    诀窍是使用标记器状态和标记器堆栈。查看 https://microsoft.github.io/monaco-editor/monarch.html 的 Monarch 文档。

    在我的标记器中,我为 3 种可能的 (MySQL) 字符串类型设置了 3 条规则,它们是单引号、双引号和反引号:

            stringsSql: [
                [/'/, { token: "string.quoted.single.sql", next: "@stringSingleSql" }],
                [/"/, { token: "string.quoted.double.sql", next: "@stringDoubleSql" }],
                [/`/, { token: "string.quoted.other.sql", next: "@stringBacktickSql" }],
            ],
            stringSingleSql: [
                [/[^']+/, "string.quoted.single.sql"],
                [/(''|\\')/, "string.quoted.single.sql"],
                [/'/, { token: "string.quoted.single.sql", next: "@pop" }],
            ],
            stringDoubleSql: [
                [/[^"]+/, "string.quoted.double.sql"],
                [/(''|\\")/, "string.quoted.double.sql"],
                [/"/, { token: "string.quoted.double.sql", next: "@pop" }],
            ],
            stringBacktickSql: [
                [/[^`]+/, "string.quoted.other.sql"],
                [/``/, "string.quoted.other.sql"],
                [/`/, { token: "string.quoted.other.sql", next: "@pop" }],
            ],
    

    当找到一个引号字符时,它的相关标记类型被设置,我在标记器堆栈上推送一个新状态。分词器继续保持这种状态(例如stringSingelSql),直到找到另一个引用。不管它处理了多少行,它们都获得了分配的字符串标记类型。一旦找到结束引号,标记器堆栈就会返回到之前的状态。

    您还可以处理引号字符和双引号字符的转义(如示例所示)。

    【讨论】:

    • 太棒了,非常感谢@mike-lischke,它完成了这项工作!我完全误解了整个状态是如何与标记器一起工作的。
    猜你喜欢
    • 2018-08-02
    • 2018-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-22
    • 1970-01-01
    • 1970-01-01
    • 2018-01-21
    相关资源
    最近更新 更多