Asp.Net Core 使用Monaco Editor 实现代码编辑器功能

 更新时间:2022年01月05日 10:40:17   作者:寻找无名的特质  
在项目中经常有代码在线编辑的需求,比如修改基于Xml的配置文件,编辑Json格式的测试数据等。这篇文章主要介绍了Asp.Net Core 使用Monaco Editor 实现代码编辑器功能,需要的朋友可以参考下

在项目中经常有代码在线编辑的需求,比如修改基于Xml的配置文件,编辑Json格式的测试数据等。我们可以使用微软开源的在线代码编辑器Monaco Editor实现这些功能。Monaco Editor是著名的VSCode的前身,项目地址:https://microsoft.github.io/monaco-editor/。本文介绍在Asp.Net Core项目中使用Monaco Editor实现代码编辑器功能。

安装

可以使用npm下载moaco-editor:

npm install monaco-editor@0.31.1

我们需要的文件在node_modules/monaco-editor/min/vs目录中,将整个vs目录拷贝到Asp.Net Core Web项目的wwwroot/lib目录下:

在Program.cs中需要启动静态文件:

app.UseStaticFiles();

在布局页面中引入如下css和js:

<link data-name="vs/editor/editor.main" rel="stylesheet" href="~/lib/vs/editor/editor.main.css" rel="external nofollow"  />
    <script  src="~/lib/vs/loader.js"></script>
    <script  src="~/lib/vs/editor/editor.main.nls.js"></script>
    <script src="~/lib/vs/editor/editor.main.js"></script>

基本的环境设置就完成了。

基本功能

现在可以在页面中实现编辑器的基本功能,在页面中增加一个div,作为编辑器容器:

<div id="container" style="width:800px;height:600px;border:1px solid grey"></div>

然后增加编辑器的js代码:

<script>
    $(document).ready(function () {
        require.config({ paths: { 'vs': '/lib/vs' } });
        monaco.editor.create(document.getElementById('container'), {
            value: "function sayHello(){\n console.write('Hello World');\n}",
            language: 'javascript'
        });
    })
</script>

设置

编辑器有多种设置,比如是否显示代码行、显示样式等等,设置完成后,可以使用updateOptions修改设置,示例代码如下:

        var editor = monaco.editor.create(document.getElementById('container'), {
            value: "function sayHello(){\n console.write('Hello World');\n}",
            language: 'javascript',
            lineNumbers: 'on',
            roundedSelection: false,
            scrollBeyondLastLine: false,
            readOnly: false,
            theme: 'vs-dark'
        });

代码比较

monaco editor的一个强大的功能是文字比较功能,可以将两段文字进行比较:

<script>
    require.config({ paths: { 'vs': '/lib/vs' } });
    var originalModel = monaco.editor.createModel(
        '删除行\n行一\n行二\n行三内容\n更多内容',
        'text/plain'
    );
    var modifiedModel = monaco.editor.createModel(
        '\n行一\n行二\n行三\n更多内容\n增加行',
        'text/plain'
    );
    var diffEditor = monaco.editor.createDiffEditor(document.getElementById('container'), {
        // You can optionally disable the resizing
        enableSplitViewResizing: false
    });
    diffEditor.setModel({
        original: originalModel,
        modified: modifiedModel
    });
</script>

效果如下:

自定义语言

monaco editor 支持常见的几乎所有编程语言,在编辑这些语言的代码时可以高亮显示关键字,同时也支持对自定义语言的扩展。其功能非常强大,同时配置起来也比较复杂,这里只举个简单的例子,说明如何使用。

这里使用的“语言”很简单,目的是记录中国象棋的棋谱,关键字只有代表“车马炮”等棋子的大写汉语拼音,运算符只有代表向前、向后和平行移动的“++”、“--”和“==”,还有就是注释。
使用自定义语言,首先要注册这个语言的id:

        monaco.languages.register({ id: 'mylang' });

然后设置语言的Token Provider:

 monaco.languages.setMonarchTokensProvider('mylang', getlang());

这样就可以在编辑器中使用这种自定义语言了,下面是完整的代码:

@page
@model CustomLanguageModel
@{
    ViewData["Title"] = "自定义语言";
}
<h1>@ViewData["Title"]</h1>
<div id="container" style="height: 800px"></div>
<script>
    var require = { paths: { vs: '/lib/vs' } };
</script>
@section Scripts
{
<script>
    $(document).ready(function () {
        monaco.languages.register({ id: 'mylang' });
        monaco.languages.setMonarchTokensProvider('mylang', getlang());

        var sampleEditor=monaco.editor.create(document.getElementById('container'), {
            model:null
        }
        );
        setTimeout(function(){
             var model=monaco.editor.createModel('// 炮二平五 \nPAO 2 == 5 \n//马八进七 \nMA 8 ++ 7', 'mylang');
             sampleEditor.setModel(model);
        },1);
    });
    function getlang(){
        return {
            //车马炮相士将帅兵卒
          keywords: [ 'JU', 'MA', 'PAO', 'XIANG', 'SHI', 'JIANG', 'SHUAI', 'BING', 'ZU' ],
          //++ 进 --退 ==平 
          operators: [ '++', '--', '=='  ],
          symbols:  /[=><!~?:&|+\-*\/\^%]+/,
          // The main tokenizer for our languages
          tokenizer: {
            root: [
              [/[A-Z][\w\$]*/, {cases: { '@@keywords': 'keyword' }}],
              { include: '@@whitespace' },
              [/@@symbols/, { cases: { '@@operators': 'operator'} } ],
              [/\d./, 'number'],
            ],
            comment: [
              [/[^\/*]+/, 'comment' ],
              [/\/\*/,    'comment', '@@push' ],
              ["\\*/",    'comment', '@@pop'  ],
              [/[\/*]/,   'comment' ]
            ],
            whitespace: [
              [/[ \t\r\n]+/, 'white'],
              [/\/\*/,       'comment', '@@comment' ],
              [/\/\/.*$/,    'comment'],
            ],
          },
        };
    }
</script>
}}

效果如下:

本文的示例项目已经上传到github: https://github.com/zhenl/monacoEditorDotNet

到此这篇关于Asp.Net Core 使用Monaco Editor 实现代码编辑器的文章就介绍到这了,更多相关Asp.Net Core代码编辑器内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 告别ADO.NET实现应用系统无缝切换的烦恼(总结篇)

    告别ADO.NET实现应用系统无缝切换的烦恼(总结篇)

    说起ADO.NET,就扯上了数据库访问类库了,现在的每个项目的数据库访问类应该说都很强的了,经常就听到说我的我们的数据库访问类怎么怎么强大而且支持多数据库,现在的大家做的项目里用的数据库访问类库我想也都是支持多数据库吧,支持到什么程度我就不知道了
    2009-11-11
  • .net实现动态验证码功能

    .net实现动态验证码功能

    这篇文章主要介绍了.net实现动态验证码功能,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-04-04
  • ASP.NET Core MVC 中实现中英文切换的示例代码

    ASP.NET Core MVC 中实现中英文切换的示例代码

    这篇文章主要介绍了ASP.NET Core MVC 中实现中英文切换的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-02-02
  • 在ASP.NET中插入flash代码实例

    在ASP.NET中插入flash代码实例

    这篇文章介绍了在ASP.NET中插入flash代码实例,有需要的朋友可以参考一下
    2013-11-11
  • asp.net多图片上传实现程序代码

    asp.net多图片上传实现程序代码

    下面是一个完整的asp.net同时支持多图片上传一个实现,有需要的朋友可参考一下,本文章限制同时可上传8张图片,当然大可自己可修改更多或更少
    2012-09-09
  • ASP.NET MVC使用异步Action的方法

    ASP.NET MVC使用异步Action的方法

    这篇文章介绍了ASP.NET MVC使用异步Action的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-10-10
  • 详解.Net Core中的日志组件(Logging)

    详解.Net Core中的日志组件(Logging)

    这篇文章主要介绍了详解.Net Core中的日志组件(Logging),小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-07-07
  • 使用grpcui测试ASP.NET core的gRPC服务

    使用grpcui测试ASP.NET core的gRPC服务

    这篇文章介绍了使用grpcui测试ASP.NET core gRPC服务的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-07-07
  • Asp.Net Mvc2 增删改查DEMO代码

    Asp.Net Mvc2 增删改查DEMO代码

    接触mvc也有一段时间了(2.0),也看到园子里很多人在学习,自己也在园子里面看过前辈们写的博客,确实受益匪浅。本文写的都是基础中的基础,仅供想学习MVC的新手们入门之作
    2012-10-10
  • c# static的全部用法收集整理

    c# static的全部用法收集整理

    c# static的全部用法收集整理...
    2007-08-08

最新评论