diff --git a/src/composables/analyse.ts b/src/composables/analyse.ts new file mode 100644 index 0000000..849e93f --- /dev/null +++ b/src/composables/analyse.ts @@ -0,0 +1,49 @@ +import { reactive } from "vue" +import { code, output } from "./code" + +export const analyse = reactive({ + line: -1, + message: "", +}) + +function findError(line: string) { + const regex: any = { + "EOFError: EOF when reading a line": "需要在输入框填写输入信息", + "SyntaxError: invalid character in identifier": + "可能是单词拼写错误,可能是括号、引号写成中文的了", + "SyntaxError: invalid syntax": "语法错误,不合法的语法", + "SyntaxError: EOL while scanning string literal": + "可能是这一行最后一个符号是中文的,或者引号、括号不匹配", + "NameError: name '(.*?)' is not defined": (name: string) => + `命名错误,${name} 不知道是什么东西`, + "IndentationError: expected an indented block": "缩进错误:这一行需要缩进", + } + let message = "" + for (let r in regex) { + const err = line.match(r) + if (err) { + if (typeof regex[r] === "function") { + message = regex[r](err[1]) + } else { + message = regex[r] + } + break + } + } + return message +} + +export function showAnalyse() { + if (code.language === "python") { + const line = output.value.match(/File "script.py", line (\d+)/) + if (line) { + analyse.line = parseInt(line[1]) + } + const lines = output.value.split("\n") + const lastLine = lines[lines.length - 1] + analyse.message = findError(lastLine) + } + if (code.language === "c") { + analyse.message = "C语言的正在制作中..." + } +} diff --git a/src/composables/code.ts b/src/composables/code.ts index 10ab3a1..4dd3cf1 100644 --- a/src/composables/code.ts +++ b/src/composables/code.ts @@ -1,5 +1,4 @@ -import { computed, ref, watch } from "vue" -import copyTextToClipboard from "copy-text-to-clipboard" +import { computed, reactive, ref, watch } from "vue" import { Code, LANGUAGE, Cache, Status } from "../types" import { sources } from "../templates" import { submit } from "../api" @@ -17,7 +16,7 @@ const cache: Cache = { }, } -export const code = ref({ +export const code = reactive({ value: cache.code[defaultLanguage].value, language: cache.language.value, }) @@ -36,18 +35,19 @@ watch(size, (value: number) => { }) watch( - () => code.value.language, + () => code.language, (value: LANGUAGE) => { cache.language.value = value - code.value.value = cache.code[value].value + code.value = cache.code[value].value output.value = "" + status.value = Status.NotStarted }, ) watch( - () => code.value.value, + () => code.value, (value: string) => { - cache.code[code.value.language].value = value + cache.code[code.language].value = value }, ) @@ -56,35 +56,32 @@ watch(input, (value: string) => { }) export function init() { - code.value.language = cache.language.value - code.value.value = cache.code[code.value.language].value + code.language = cache.language.value + code.value = cache.code[code.language].value input.value = cache.input.value size.value = cache.fontsize.value status.value = Status.NotStarted } -export function copy() { - copyTextToClipboard(code.value.value) -} - export function clearInput() { input.value = "" } export function reset() { - code.value.value = sources[code.value.language] - cache.code[code.value.language].value = sources[code.value.language] + code.value = sources[code.language] + cache.code[code.language].value = sources[code.language] output.value = "" status.value = Status.NotStarted } export async function run() { loading.value = true - const cleanCode = code.value.value.trim() + const cleanCode = code.value.trim() if (!cleanCode) return output.value = "" + status.value = Status.NotStarted const result = await submit( - { value: cleanCode, language: code.value.language }, + { value: cleanCode, language: code.language }, input.value.trim(), ) output.value = result.output || "" diff --git a/src/desktop/Content.vue b/src/desktop/Content.vue index f5f80a5..3aa32fa 100644 --- a/src/desktop/Content.vue +++ b/src/desktop/Content.vue @@ -1,4 +1,5 @@ @@ -35,9 +37,7 @@ function copyAndNotify() { :language="code.language" > @@ -52,7 +52,12 @@ function copyAndNotify() { diff --git a/src/main.ts b/src/main.ts index ea43b62..4fdc193 100644 --- a/src/main.ts +++ b/src/main.ts @@ -14,6 +14,8 @@ import { NIcon, NMessageProvider, NInputNumber, + NPopover, + NTag, } from "naive-ui" import App from "./App.vue" import "normalize.css" @@ -32,7 +34,9 @@ const naive = create({ NSplit, NFlex, NIcon, - NInputNumber + NInputNumber, + NPopover, + NTag, ], })