Asp.Net?Core?使用Monaco?Editor?實(shí)現(xiàn)代碼編輯器功能
在項(xiàng)目中經(jīng)常有代碼在線編輯的需求,比如修改基于Xml的配置文件,編輯Json格式的測(cè)試數(shù)據(jù)等。我們可以使用微軟開(kāi)源的在線代碼編輯器Monaco Editor實(shí)現(xiàn)這些功能。Monaco Editor是著名的VSCode的前身,項(xiàng)目地址:https://microsoft.github.io/monaco-editor/。本文介紹在Asp.Net Core項(xiàng)目中使用Monaco Editor實(shí)現(xiàn)代碼編輯器功能。
安裝
可以使用npm下載moaco-editor:
npm install monaco-editor@0.31.1
我們需要的文件在node_modules/monaco-editor/min/vs目錄中,將整個(gè)vs目錄拷貝到Asp.Net Core Web項(xiàng)目的wwwroot/lib目錄下:

在Program.cs中需要啟動(dòng)靜態(tài)文件:
app.UseStaticFiles();
在布局頁(yè)面中引入如下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>基本的環(huán)境設(shè)置就完成了。
基本功能
現(xiàn)在可以在頁(yè)面中實(shí)現(xiàn)編輯器的基本功能,在頁(yè)面中增加一個(gè)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>

設(shè)置
編輯器有多種設(shè)置,比如是否顯示代碼行、顯示樣式等等,設(shè)置完成后,可以使用updateOptions修改設(shè)置,示例代碼如下:
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的一個(gè)強(qiáng)大的功能是文字比較功能,可以將兩段文字進(jìn)行比較:
<script>
require.config({ paths: { 'vs': '/lib/vs' } });
var originalModel = monaco.editor.createModel(
'刪除行\(zhòng)n行一\n行二\n行三內(nèi)容\n更多內(nèi)容',
'text/plain'
);
var modifiedModel = monaco.editor.createModel(
'\n行一\n行二\n行三\n更多內(nèi)容\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>
效果如下:

自定義語(yǔ)言
monaco editor 支持常見(jiàn)的幾乎所有編程語(yǔ)言,在編輯這些語(yǔ)言的代碼時(shí)可以高亮顯示關(guān)鍵字,同時(shí)也支持對(duì)自定義語(yǔ)言的擴(kuò)展。其功能非常強(qiáng)大,同時(shí)配置起來(lái)也比較復(fù)雜,這里只舉個(gè)簡(jiǎn)單的例子,說(shuō)明如何使用。
這里使用的“語(yǔ)言”很簡(jiǎn)單,目的是記錄中國(guó)象棋的棋譜,關(guān)鍵字只有代表“車馬炮”等棋子的大寫(xiě)漢語(yǔ)拼音,運(yùn)算符只有代表向前、向后和平行移動(dòng)的“++”、“--”和“==”,還有就是注釋。
使用自定義語(yǔ)言,首先要注冊(cè)這個(gè)語(yǔ)言的id:
monaco.languages.register({ id: 'mylang' });
然后設(shè)置語(yǔ)言的Token Provider:
monaco.languages.setMonarchTokensProvider('mylang', getlang());這樣就可以在編輯器中使用這種自定義語(yǔ)言了,下面是完整的代碼:
@page
@model CustomLanguageModel
@{
ViewData["Title"] = "自定義語(yǔ)言";
}
<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//馬八進(jìn)七 \nMA 8 ++ 7', 'mylang');
sampleEditor.setModel(model);
},1);
});
function getlang(){
return {
//車馬炮相士將帥兵卒
keywords: [ 'JU', 'MA', 'PAO', 'XIANG', 'SHI', 'JIANG', 'SHUAI', 'BING', 'ZU' ],
//++ 進(jìn) --退 ==平
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>
}}效果如下:

本文的示例項(xiàng)目已經(jīng)上傳到github: https://github.com/zhenl/monacoEditorDotNet
到此這篇關(guān)于Asp.Net Core 使用Monaco Editor 實(shí)現(xiàn)代碼編輯器的文章就介紹到這了,更多相關(guān)Asp.Net Core代碼編輯器內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
.NET Core 1.0創(chuàng)建Self-Contained控制臺(tái)應(yīng)用
這篇文章主要為大家詳細(xì)介紹了.NET Core 1.0創(chuàng)建Self-Contained控制臺(tái)應(yīng)用的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-04-04
WebService出現(xiàn)"因 URL 意外地以 結(jié)束,請(qǐng)求格式無(wú)法識(shí)別"的解決方法
因 URL 意外地以“/GetReceivedInvoices”結(jié)束,請(qǐng)求格式無(wú)法識(shí)別。2009-01-01
Asp.net內(nèi)置對(duì)象之Server對(duì)象(概述及應(yīng)用)
Server對(duì)象提供對(duì)服務(wù)器上的方法和屬性的訪問(wèn)以及進(jìn)行HTML編碼的功能,本文主要圍繞server對(duì)象介紹詳細(xì)功能及常用屬性和主要方法,感興趣的朋友可以了解下,或許對(duì)你學(xué)習(xí)server對(duì)象有所幫助2013-02-02
集合類Array List HashTable實(shí)例操作練習(xí)
集合常用操作添加、遍歷、移除;本文將詳細(xì)介紹下ArrayList對(duì)值類型的操作/ArrayList對(duì)引用類型的操作及HashTable的使用,感興趣的你可不要錯(cuò)過(guò)了哈2013-02-02
asp.net 簡(jiǎn)單實(shí)現(xiàn)禁用或啟用頁(yè)面中的某一類型的控件
最近在一個(gè)winform項(xiàng)目中碰到的一個(gè)功能,勾選一個(gè)checkbox后窗體中的其他控件不可用。由此想到asp.net項(xiàng)目中有時(shí)候也要用到這種功能。2009-11-11
asp.NET開(kāi)發(fā)中正則表達(dá)式中BUG分析
又發(fā)現(xiàn)了一個(gè) .net的bug!最近在使用正則表達(dá)式的時(shí)候發(fā)現(xiàn):在忽略大小寫(xiě)的時(shí)候,匹配值從 0xff 到 0xffff 之間的所有字符,正則表達(dá)式竟然也能匹配兩個(gè) ASCII 字符:i(code: 0x69) 和 I(code: 0x49);但是仍然不能匹配其他的 ASCII 字母和數(shù)字。2008-10-10
支持Ajax跨域訪問(wèn)ASP.NET Web Api 2(Cors)的示例教程
這篇文章主要介紹了支持Ajax跨域訪問(wèn)ASP.NET Web Api 2(Cors)的示例教程,需要的朋友可以參考下2016-04-04

