如何在Monaco编辑器中为内联CSS创建自定义语言(没有选择器或括号)

tvokkenx  于 5个月前  发布在  其他
关注(0)|答案(1)|浏览(92)

我正在将Monaco Editor集成到一个项目中,需要为特定用例自定义CSS语言支持。我的目标是将CSS语言模式调整为内联样式,类似于HTML的style属性中使用的内容。这意味着我需要配置语言模式以接受CSS属性和值,而不需要选择器或花括号。

**具体问题:**我正在寻找一种方法来修改摩纳哥编辑器中现有的CSS语言配置,以便它直接接受CSS属性和值(而不需要将它们括在花括号{}中),并保留其他功能,如语法突出显示和自动完成。
我尝试过的:

  • 我研究了Monaco Editor的文档和示例,但大多数都集中在从头开始定义新语言或对现有语言进行简单修改。
  • 我尝试使用monaco.languages.setMonarchTokensProvider来定义一个自定义的标记器,但是我正在努力修改现有的CSS标记器以有效地满足我的需求。
languages.register({ id: "inlineStyle" });

languages.onLanguage("inlineStyle", () => {
    languages.setLanguageConfiguration("inlineStyle", conf);
    languages.setMonarchTokensProvider("inlineStyle", {tokenizer: {
        root: [
            [/([a-zA-Z\-]+)\s*:/, "property"],
            [/([a-zA-Z\-]+)\s*$/, "property"],
            [/([a-zA-Z\-]+)\s*;\s*$/, "property"],
            [/([a-zA-Z0-9\s\.\#\-\(\)]+)(?=;|$)/, "value"],
        ]
    }});

    function fetchCssProperties() {
        // This is a simplified example. In a real application, you might fetch these properties from a server or a file.
        return [
            { name: "color", values: ["red", "green", "blue"] },
            { name: "background-color", values: ["yellow", "cyan", "magenta"] },
            { name: "width", values: ["100px", "50%", "auto"] },
            { name: "height", values: ["200px", "75%", "auto"] },
            // Add more properties as needed...
        ];
    }

    languages.registerCompletionItemProvider("inlineStyle", {
        provideCompletionItems: function(model, position) {
            // Fetch CSS properties and their values from a data source
            const cssProperties = fetchCssProperties();

            // Map CSS properties and their values to Monaco Editor completion items
            const completionItems = cssProperties.flatMap(property => {
                const propertyCompletionItem = {
                    label: property.name,
                    kind: languages.CompletionItemKind.Property,
                    insertText: property.name + ": ",
                    detail: "CSS Property",
                    documentation: "Inserts a CSS property"
                };

                const valueCompletionItems = property.values.map(value => {
                    return {
                        label: value,
                        kind: languages.CompletionItemKind.Value,
                        insertText: value,
                        detail: "CSS Value",
                        documentation: `Inserts the value "${value}" for the CSS property "${property.name}"`
                    };
                });

                return [propertyCompletionItem, ...valueCompletionItems];
            });

            return { suggestions: completionItems };
        }
    });

});

字符串
上面的代码可以工作(有点),但只依赖于我在fetchCssProperties中编写的属性。此外,整个CSS属性和值列表可能相当广泛,我不认为每次输入时都解析它是一个好主意。我很确定Monaco有一个更好的方法来处理他们的基本CSS语言。

我的问题: 有人能提供指导或例子,说明如何修改摩纳哥编辑器中现有的CSS语言配置,以支持直接输入CSS属性和值,而无需选择器和花括号吗?*

任何帮助或指向摩纳哥编辑器API或类似实现的相关部分的指针都将不胜感激。
谢谢你,谢谢

bwitn5fc

bwitn5fc1#

没有办法修改现有的语言配置或突出显示或代码完成提供程序等。
你所能做的就是创建你自己的语言。某些部分,比如语言配置(大括号,关键字等),可以从现有的定义中导入,并用于创建一个新的定义,但仅此而已。
在你问如何做到这一点之前:这不是一个简单的事情,可以用一个单一的答案来回答。

相关问题