diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 1d465a7..22f5d72 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -41,6 +41,7 @@ "@lezer/highlight": "^1.2.1", "@lezer/lr": "^1.4.2", "@prettier/plugin-xml": "^3.4.2", + "@replit/codemirror-lang-svelte": "^6.0.0", "@toml-tools/lexer": "^1.0.0", "@toml-tools/parser": "^1.0.0", "codemirror": "^6.0.2", @@ -1875,6 +1876,25 @@ "prettier": "^3.0.0" } }, + "node_modules/@replit/codemirror-lang-svelte": { + "version": "6.0.0", + "resolved": "https://registry.npmmirror.com/@replit/codemirror-lang-svelte/-/codemirror-lang-svelte-6.0.0.tgz", + "integrity": "sha512-U2OqqgMM6jKelL0GNWbAmqlu1S078zZNoBqlJBW+retTc5M4Mha6/Y2cf4SVg6ddgloJvmcSpt4hHrVoM4ePRA==", + "license": "MIT", + "peerDependencies": { + "@codemirror/autocomplete": "^6.0.0", + "@codemirror/lang-css": "^6.0.1", + "@codemirror/lang-html": "^6.2.0", + "@codemirror/lang-javascript": "^6.1.1", + "@codemirror/language": "^6.0.0", + "@codemirror/state": "^6.0.0", + "@codemirror/view": "^6.0.0", + "@lezer/common": "^1.0.0", + "@lezer/highlight": "^1.0.0", + "@lezer/javascript": "^1.2.0", + "@lezer/lr": "^1.0.0" + } + }, "node_modules/@rolldown/pluginutils": { "version": "1.0.0-beta.29", "resolved": "https://registry.npmmirror.com/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.29.tgz", diff --git a/frontend/package.json b/frontend/package.json index e4e6b8f..6687203 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -9,7 +9,8 @@ "build": "cross-env NODE_OPTIONS=\"--max-old-space-size=8192\" vue-tsc && cross-env NODE_OPTIONS=\"--max-old-space-size=8192\" vite build --mode production", "preview": "vite preview", "lint": "eslint", - "lint:fix": "eslint --fix" + "lint:fix": "eslint --fix", + "build:lang-parser": "node src/views/editor/extensions/codeblock/lang-parser/build-parser.js" }, "dependencies": { "@codemirror/autocomplete": "^6.18.7", @@ -45,6 +46,7 @@ "@lezer/highlight": "^1.2.1", "@lezer/lr": "^1.4.2", "@prettier/plugin-xml": "^3.4.2", + "@replit/codemirror-lang-svelte": "^6.0.0", "@toml-tools/lexer": "^1.0.0", "@toml-tools/parser": "^1.0.0", "codemirror": "^6.0.2", diff --git a/frontend/src/views/editor/extensions/codeblock/lang-parser/codeblock.grammar b/frontend/src/views/editor/extensions/codeblock/lang-parser/codeblock.grammar index d59b73b..f4513ff 100644 --- a/frontend/src/views/editor/extensions/codeblock/lang-parser/codeblock.grammar +++ b/frontend/src/views/editor/extensions/codeblock/lang-parser/codeblock.grammar @@ -16,7 +16,8 @@ BlockLanguage { "text" | "json" | "py" | "html" | "sql" | "md" | "java" | "php" | "css" | "xml" | "cpp" | "rs" | "cs" | "rb" | "sh" | "yaml" | "toml" | "go" | "clj" | "ex" | "erl" | "js" | "ts" | "swift" | "kt" | "groovy" | - "ps1" | "dart" | "scala" | "math" | "dockerfile" | "lua" + "ps1" | "dart" | "scala" | "math" | "dockerfile" | "lua" | "vue" | "lezer" | + "liquid" | "wast" | "sass" | "less" | "angular" | "svelte" } @tokens { diff --git a/frontend/src/views/editor/extensions/codeblock/lang-parser/languages.ts b/frontend/src/views/editor/extensions/codeblock/lang-parser/languages.ts index 01d24c4..c90ae97 100644 --- a/frontend/src/views/editor/extensions/codeblock/lang-parser/languages.ts +++ b/frontend/src/views/editor/extensions/codeblock/lang-parser/languages.ts @@ -15,6 +15,14 @@ import {cppLanguage} from "@codemirror/lang-cpp"; import {xmlLanguage} from "@codemirror/lang-xml"; import {rustLanguage} from "@codemirror/lang-rust"; import {yamlLanguage} from "@codemirror/lang-yaml"; +import {vueLanguage} from "@codemirror/lang-vue"; +import {lezerLanguage} from "@codemirror/lang-lezer"; +import {liquidLanguage} from "@codemirror/lang-liquid"; +import {wastLanguage} from "@codemirror/lang-wast"; +import {sassLanguage} from "@codemirror/lang-sass"; +import {lessLanguage} from "@codemirror/lang-less"; +import {angularLanguage} from "@codemirror/lang-angular"; +import { svelteLanguage } from "@replit/codemirror-lang-svelte"; import {StreamLanguage} from "@codemirror/language"; import {ruby} from "@codemirror/legacy-modes/mode/ruby"; @@ -53,6 +61,7 @@ import clangPrettierPlugin from "@/common/prettier/plugins/clang"; import pythonPrettierPlugin from "@/common/prettier/plugins/python"; import dartPrettierPlugin from "@/common/prettier/plugins/dart"; import luaPrettierPlugin from "@/common/prettier/plugins/lua"; +import webPrettierPlugin from "@/common/prettier/plugins/web"; import * as prettierPluginEstree from "prettier/plugins/estree"; /** @@ -73,7 +82,7 @@ export class LanguageInfo { } /** - * 支持的语言列表(与 Worker 中的 LANGUAGES 对应) + * 支持的语言列表 */ export const LANGUAGES: LanguageInfo[] = [ new LanguageInfo("text", "Plain Text", null), @@ -89,6 +98,13 @@ export const LANGUAGES: LanguageInfo[] = [ parser: "html", plugins: [htmlPrettierPlugin] }), + new LanguageInfo("vue", "Vue", vueLanguage.parser, ["vue"], { + parser: "web-fmt", + plugins: [webPrettierPlugin], + options: { + filename: "index.vue" + } + }), new LanguageInfo("sql", "SQL", StandardSQL.language.parser, ["sql"], { parser: "sql", plugins: [sqlPrettierPlugin] @@ -124,7 +140,7 @@ export const LANGUAGES: LanguageInfo[] = [ parser: "rust", plugins: [rustPrettierPlugin] }), - new LanguageInfo("cs", "C#", StreamLanguage.define(csharp).parser, ["cs"],{ + new LanguageInfo("cs", "C#", StreamLanguage.define(csharp).parser, ["cs"], { parser: "clang-format", plugins: [clangPrettierPlugin], options: { @@ -183,6 +199,32 @@ export const LANGUAGES: LanguageInfo[] = [ plugins: [luaPrettierPlugin] }), new LanguageInfo("math", "Math", null, ["math"]), + new LanguageInfo("lezer", "Lezer", lezerLanguage.parser, ["lezer"]), + new LanguageInfo("liquid", "Liquid", liquidLanguage.parser, ["liquid"]), + new LanguageInfo("wast", "WebAssembly", wastLanguage.parser, ["wast"]), + new LanguageInfo("sass", "Sass", sassLanguage.parser, ["sass"], { + parser: "web-fmt", + plugins: [webPrettierPlugin], + options: { + filename: "index.sass" + } + }), + new LanguageInfo("less", "Less", lessLanguage.parser, ["less"], { + parser: "web-fmt", + plugins: [webPrettierPlugin], + options: { + filename: "index.less" + } + }), + new LanguageInfo("angular", "Angular", angularLanguage.parser, ["angular"]), + new LanguageInfo("svelte", "Svelte", svelteLanguage.parser, ["svelte"], { + parser: "web-fmt", + plugins: [webPrettierPlugin], + options: { + filename: "index.svelte" + } + }), + ]; /** diff --git a/frontend/src/views/editor/extensions/codeblock/lang-parser/parser.js b/frontend/src/views/editor/extensions/codeblock/lang-parser/parser.js index eeb85fb..2d9fe78 100644 --- a/frontend/src/views/editor/extensions/codeblock/lang-parser/parser.js +++ b/frontend/src/views/editor/extensions/codeblock/lang-parser/parser.js @@ -3,14 +3,14 @@ import {LRParser} from "@lezer/lr" import {blockContent} from "./external-tokens.js" export const parser = LRParser.deserialize({ version: 14, - states: "!jQQOQOOOVOQO'#C`O#]OPO'#C_OOOO'#Cc'#CcQQOQOOOOOO'#Ca'#CaO#bOSO,58zOOOO,58y,58yOOOO-E6a-E6aOOOP1G.f1G.fO#jOSO1G.fOOOP7+$Q7+$Q", - stateData: "#o~OXPO~OYTOZTO[TO]TO^TO_TO`TOaTObTOcTOdTOeTOfTOgTOhTOiTOjTOkTOlTOmTOnTOoTOpTOqTOrTOsTOtTOuTOvTOwTOxTOyTO~OPVO~OUYOzXO~OzZO~O", + states: "!jQQOQOOOVOQO'#C`O#uOPO'#C_OOOO'#Cc'#CcQQOQOOOOOO'#Ca'#CaO#zOSO,58zOOOO,58y,58yOOOO-E6a-E6aOOOP1G.f1G.fO$SOSO1G.fOOOP7+$Q7+$Q", + stateData: "$X~OXPO~OYTOZTO[TO]TO^TO_TO`TOaTObTOcTOdTOeTOfTOgTOhTOiTOjTOkTOlTOmTOnTOoTOpTOqTOrTOsTOtTOuTOvTOwTOxTOyTOzTO{TO|TO}TO!OTO!PTO!QTO!RTO~OPVO~OUYO!SXO~O!SZO~O", goto: "jWPPPX]aPdTROSTQOSRUPQSORWS", nodeNames: "⚠ BlockContent Document Block BlockDelimiter BlockLanguage Auto", - maxTerm: 42, + maxTerm: 50, skippedNodes: [0], repeatNodeCount: 1, - tokenData: ".w~RaYZ!W}!O!q#V#W!|#W#X#}#X#Y%p#Z#[&Z#[#]'W#^#_'o#_#`(n#`#a(y#a#b)[#d#e){#f#g*t#g#h+X#h#i,x#l#m-}#m#n.`R!]PzQ%&x%&y!`P!cP%&x%&y!fP!iP%&x%&y!lP!qOXP~!tP#T#U!w~!|OU~~#PR#`#a#Y#d#e#e#g#h#p~#]P#^#_#`~#eOl~~#hP#d#e#k~#pOd~~#uPf~#g#h#x~#}Ob~~$QQ#T#U$W#c#d$i~$ZP#f#g$^~$aP#h#i$d~$iOu~~$lP#V#W$o~$rP#_#`$u~$xP#X#Y${~%OP#f#g%R~%UP#Y#Z%X~%[P#]#^%_~%bP#`#a%e~%hP#X#Y%k~%pOx~~%sQ#f#g%y#l#m&U~%|P#`#a&P~&UOn~~&ZOm~~&^Q#c#d&d#f#g&i~&iOk~~&lP#c#d&o~&rP#c#d&u~&xP#j#k&{~'OP#m#n'R~'WOs~~'ZP#h#i'^~'aP#a#b'd~'gP#`#a'j~'oO]~~'rQ#T#U'x#g#h(Z~'{P#j#k(O~(RP#T#U(U~(ZO`~~(`Po~#c#d(c~(fP#b#c(i~(nOZ~~(qP#h#i(t~(yOr~~(|P#i#j)P~)SP#T#U)V~)[Oy~~)_Q#T#U)e#W#X)v~)hP#h#i)k~)nP#[#])q~)vOw~~){O_~~*OR#[#]*X#g#h*d#m#n*o~*[P#d#e*_~*dOa~~*gP!R!S*j~*oOt~~*tO[~~*wQ#U#V*}#g#h+S~+SOg~~+XOe~~+[S#V#W+h#[#],P#e#f,U#k#l,a~+kP#T#U+n~+qP#`#a+t~+wP#T#U+z~,POv~~,UOh~~,XP#`#a,[~,aO^~~,dP#]#^,g~,jP#Y#Z,m~,pP#h#i,s~,xOq~~,{R#X#Y-U#c#d-g#g#h-x~-XP#l#m-[~-_P#h#i-b~-gOY~~-jP#a#b-m~-pP#`#a-s~-xOj~~-}Op~~.QP#a#b.T~.WP#`#a.Z~.`Oc~~.cP#T#U.f~.iP#a#b.l~.oP#`#a.r~.wOi~", + tokenData: "3g~RdYZ!a}!O!z#T#U#V#V#W$Q#W#X%R#X#Y&t#Z#['_#[#]([#^#_(s#_#`)r#`#a)}#a#b+z#d#e,k#f#g-d#g#h-w#h#i0n#j#k1s#k#l2U#l#m2m#m#n3OR!fP!SQ%&x%&y!iP!lP%&x%&y!oP!rP%&x%&y!uP!zOXP~!}P#T#U#Q~#VOU~~#YP#b#c#]~#`P#Z#[#c~#fP#i#j#i~#lP#`#a#o~#rP#T#U#u~#xP#f#g#{~$QO!Q~~$TR#`#a$^#d#e$i#g#h$t~$aP#^#_$d~$iOl~~$lP#d#e$o~$tOd~~$yPf~#g#h$|~%ROb~~%UQ#T#U%[#c#d%m~%_P#f#g%b~%eP#h#i%h~%mOu~~%pP#V#W%s~%vP#_#`%y~%|P#X#Y&P~&SP#f#g&V~&YP#Y#Z&]~&`P#]#^&c~&fP#`#a&i~&lP#X#Y&o~&tOx~~&wQ#f#g&}#l#m'Y~'QP#`#a'T~'YOn~~'_Om~~'bQ#c#d'h#f#g'm~'mOk~~'pP#c#d's~'vP#c#d'y~'|P#j#k(P~(SP#m#n(V~([Os~~(_P#h#i(b~(eP#a#b(h~(kP#`#a(n~(sO]~~(vQ#T#U(|#g#h)_~)PP#j#k)S~)VP#T#U)Y~)_O`~~)dPo~#c#d)g~)jP#b#c)m~)rOZ~~)uP#h#i)x~)}Or~~*QR#X#Y*Z#]#^+Q#i#j+o~*^Q#g#h*d#n#o*o~*gP#g#h*j~*oO!P~~*rP#X#Y*u~*xP#f#g*{~+QO{~~+TP#e#f+W~+ZP#i#j+^~+aP#]#^+d~+gP#W#X+j~+oO|~~+rP#T#U+u~+zOy~~+}Q#T#U,T#W#X,f~,WP#h#i,Z~,^P#[#],a~,fOw~~,kO_~~,nR#[#],w#g#h-S#m#n-_~,zP#d#e,}~-SOa~~-VP!R!S-Y~-_Ot~~-dO[~~-gQ#U#V-m#g#h-r~-rOg~~-wOe~~-zU#T#U.^#V#W.o#[#]/W#e#f/]#j#k/h#k#l0V~.aP#g#h.d~.gP#g#h.j~.oO!O~~.rP#T#U.u~.xP#`#a.{~/OP#T#U/R~/WOv~~/]Oh~~/`P#`#a/c~/hO^~~/kP#X#Y/n~/qP#`#a/t~/wP#h#i/z~/}P#X#Y0Q~0VO!R~~0YP#]#^0]~0`P#Y#Z0c~0fP#h#i0i~0nOq~~0qR#X#Y0z#c#d1]#g#h1n~0}P#l#m1Q~1TP#h#i1W~1]OY~~1`P#a#b1c~1fP#`#a1i~1nOj~~1sOp~~1vP#i#j1y~1|P#X#Y2P~2UOz~~2XP#T#U2[~2_P#g#h2b~2eP#h#i2h~2mO}~~2pP#a#b2s~2vP#`#a2y~3OOc~~3RP#T#U3U~3XP#a#b3[~3_P#`#a3b~3gOi~", tokenizers: [blockContent, 0, 1], topRules: {"Document":[0,2]}, tokenPrec: 0 diff --git a/frontend/src/views/editor/extensions/codeblock/types.ts b/frontend/src/views/editor/extensions/codeblock/types.ts index a162f44..0199668 100644 --- a/frontend/src/views/editor/extensions/codeblock/types.ts +++ b/frontend/src/views/editor/extensions/codeblock/types.ts @@ -57,6 +57,14 @@ export type SupportedLanguage = | 'dockerfile' | 'lua' | 'math' + | 'vue' + | 'lezer' + | 'liquid' + | 'wast' + | 'sass' + | 'less' + | 'angular' + | 'svelte' /** * 创建块的选项 diff --git a/version.txt b/version.txt index 54d1bfd..da8c768 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -VERSION=1.4.1 +VERSION=1.4.2