65 lines
1.2 KiB
TypeScript
65 lines
1.2 KiB
TypeScript
/**
|
|
* 代码块语言支持
|
|
* 提供多语言代码块支持
|
|
*/
|
|
|
|
import { parser } from "./parser.js";
|
|
import { configureNesting } from "./nested-parser";
|
|
|
|
import {
|
|
LRLanguage,
|
|
LanguageSupport,
|
|
foldNodeProp,
|
|
} from "@codemirror/language";
|
|
import { styleTags, tags as t } from "@lezer/highlight";
|
|
|
|
import { json } from "@codemirror/lang-json";
|
|
|
|
/**
|
|
* 折叠节点函数
|
|
*/
|
|
function foldNode(node: any) {
|
|
return { from: node.from, to: node.to - 1 };
|
|
}
|
|
|
|
/**
|
|
* 代码块语言定义
|
|
*/
|
|
export const CodeBlockLanguage = LRLanguage.define({
|
|
parser: parser.configure({
|
|
props: [
|
|
styleTags({
|
|
BlockDelimiter: t.tagName,
|
|
}),
|
|
|
|
foldNodeProp.add({
|
|
BlockContent(node: any) {
|
|
return { from: node.from, to: node.to - 1 };
|
|
},
|
|
}),
|
|
],
|
|
wrap: configureNesting(),
|
|
}),
|
|
languageData: {
|
|
commentTokens: { line: ";" }
|
|
}
|
|
});
|
|
|
|
/**
|
|
* 创建代码块语言支持
|
|
*/
|
|
export function codeBlockLang() {
|
|
let wrap = configureNesting();
|
|
let lang = CodeBlockLanguage.configure({ dialect: "", wrap: wrap });
|
|
|
|
return [
|
|
new LanguageSupport(lang, [json().support]),
|
|
];
|
|
}
|
|
|
|
/**
|
|
* 获取代码块语言扩展
|
|
*/
|
|
export function getCodeBlockLanguageExtension() {
|
|
return codeBlockLang();
|
|
}
|