feat: 新增了代码编辑插件的主题选择(当然样式还是没改)

This commit is contained in:
539943419 committed 2024-08-29 17:58:35 +08:00
1 parent 2d401f7a17
commit f8ca6dba67
4 files changed
+91 -33

No files matched your search

+58 -25
View File
@@ -1,9 +1,18 @@
<template>
<div class="codemirror-container" ref="rootRef">
<button @click="handleSave">保存</button>
<NScrollbar>
<codemirror v-model="codeData" :extensions="extensions" />
</NScrollbar>
<div
class="codemirror-container"
ref="rootRef"
:class="`codemirror-container-${theme}`">
<div class="codemirror-container-top">
<button @click="handleSave">保存</button>
<button @click="switchTheme">切换主题</button>
</div>
<!-- <NScrollbar :key="_key"> -->
<codemirror
v-model="codeData"
:extensions="extensions"
:style="{ height: '100%' }" />
<!-- </NScrollbar> -->
</div>
</template>
@@ -13,6 +22,7 @@ import useMiaoFetchApi from '@/hooks/useMiaoFetchApi'
import { onMounted, ref } from 'vue'
import { Codemirror } from 'vue-codemirror'
import { NScrollbar } from 'naive-ui'
import { vscodeDark, vscodeLight } from '@uiw/codemirror-theme-vscode'
const miaoFetchApi = useMiaoFetchApi()
@@ -20,30 +30,43 @@ const currentFiles = defineModel<VirtualFile[]>('currentFiles', {
required: true
})
let vFile: VirtualFile
const vFile = ref<VirtualFile>()
const rootRef = ref<HTMLDivElement>()
const _key = ref(Math.random())
const codeData = ref<string>()
// 第一次点击保存时自动备份data,暂时懒得做
const bakData = ref<string>()
const extensions = ref<any[]>([])
const theme = ref<'light' | 'dark'>('light')
const handleSave = async () => {
if (bakData.value === codeData.value) {
if (bakData.value === codeData.value || !vFile.value) {
return
}
const parentDir = vFile.parent
const parentDir = vFile.value?.parent
const file_bak = new File(
[new Blob([bakData.value ?? ''])],
`${vFile.name}.bak`
`${vFile.value?.name}.bak`
)
const file = new File([new Blob([codeData.value ?? ''])], vFile.name)
const file = new File([new Blob([codeData.value ?? ''])], vFile.value.name)
bakData.value = codeData.value
miaoFetchApi.upload(file, parentDir)
false && miaoFetchApi.upload(file_bak, parentDir)
}
const setExtensions = async (fileName: string) => {
const switchTheme = async () => {
if (!vFile.value) {
return
}
theme.value = theme.value === 'dark' ? 'light' : 'dark'
extensions.value = [
...(await getLangExtensions(vFile.value?.name)),
theme.value === 'dark' ? vscodeDark : vscodeLight
]
_key.value = Math.random()
}
const getLangExtensions = async (fileName: string) => {
const ext = fileName.split('.').pop()?.toLocaleLowerCase()
switch (ext) {
case 'js':
@@ -51,52 +74,52 @@ const setExtensions = async (fileName: string) => {
case 'ts':
case 'tsx':
const { javascript } = await import('@codemirror/lang-javascript')
extensions.value = [javascript()]
return [javascript()]
break
case 'css':
case 'scss':
const { sass } = await import('@codemirror/lang-sass')
extensions.value = [sass()]
return [sass()]
break
case 'html':
const { html } = await import('@codemirror/lang-html')
extensions.value = [html()]
return [html()]
break
case 'py':
const { python } = await import('@codemirror/lang-python')
extensions.value = [python()]
return [python()]
break
case 'go':
const { go } = await import('@codemirror/lang-go')
extensions.value = [go()]
return [go()]
break
case 'json':
const { json } = await import('@codemirror/lang-json')
extensions.value = [json()]
return [json()]
break
case 'md':
const { markdown } = await import('@codemirror/lang-markdown')
extensions.value = [markdown()]
return [markdown()]
break
case 'yaml':
const { yaml } = await import('@codemirror/lang-yaml')
extensions.value = [yaml()]
return [yaml()]
break
case 'vue':
const { vue } = await import('@codemirror/lang-vue')
extensions.value = [vue()]
return [vue()]
break
case 'xml':
const { xml } = await import('@codemirror/lang-xml')
extensions.value = [xml()]
return [xml()]
break
default:
extensions.value = []
return []
}
}
onMounted(async () => {
vFile = currentFiles.value[0]
vFile.value = currentFiles.value[0]
const fileName = currentFiles.value[0].name
codeData.value = (
await miaoFetchApi.getFile(currentFiles.value[0], {
@@ -104,7 +127,8 @@ onMounted(async () => {
})
).toString()
bakData.value = codeData.value
await setExtensions(fileName)
extensions.value = [...(await getLangExtensions(fileName)), vscodeLight]
rootRef.value?.addEventListener('keydown', (event) => {
if (event.ctrlKey && event.key === 's') {
event.preventDefault()
@@ -118,5 +142,14 @@ onMounted(async () => {
.codemirror-container {
width: 100%;
height: 100%;
&-top {
background-color: aqua;
}
}
.codemirror-container-dark {
background-color: rgb(30, 30, 30);
}
.codemirror-container-light {
background-color: rgb(255, 255, 255);
}
</style>