147 lines
4.3 KiB
JavaScript
147 lines
4.3 KiB
JavaScript
// 文件 / 文件夹类型图标(彩色 SVG),用于在文件路径前渲染。
|
||
// 注意:仅用于「渲染文件/文件夹名称前的类型图标」,按钮图标请勿使用此处的资源。
|
||
import archiveIcon from '@/assets/icons/files/archive.svg?url'
|
||
import audioIcon from '@/assets/icons/files/audio.svg?url'
|
||
import cadIcon from '@/assets/icons/files/cad.svg?url'
|
||
import codeIcon from '@/assets/icons/files/code.svg?url'
|
||
import fileIcon from '@/assets/icons/files/file.svg?url'
|
||
import imageIcon from '@/assets/icons/files/image.svg?url'
|
||
import markdownIcon from '@/assets/icons/files/markdown.svg?url'
|
||
import pdfIcon from '@/assets/icons/files/pdf.svg?url'
|
||
import pptIcon from '@/assets/icons/files/ppt.svg?url'
|
||
import psdIcon from '@/assets/icons/files/psd.svg?url'
|
||
import pythonIcon from '@/assets/icons/files/python.svg?url'
|
||
import spreadsheetIcon from '@/assets/icons/files/spreadsheet.svg?url'
|
||
import textIcon from '@/assets/icons/files/text.svg?url'
|
||
import videoIcon from '@/assets/icons/files/video.svg?url'
|
||
import webIcon from '@/assets/icons/files/web.svg?url'
|
||
import wordIcon from '@/assets/icons/files/word.svg?url'
|
||
import folderIcon from '@/assets/icons/files/folder.svg?url'
|
||
import folderAgentIcon from '@/assets/icons/files/folder-agent.svg?url'
|
||
import folderEnterpriseIcon from '@/assets/icons/files/folder-enterprise.svg?url'
|
||
import folderFavoriteIcon from '@/assets/icons/files/folder-favorite.svg?url'
|
||
import folderKnowledgeIcon from '@/assets/icons/files/folder-knowledge.svg?url'
|
||
import folderPersonalIcon from '@/assets/icons/files/folder-personal.svg?url'
|
||
import folderTrashIcon from '@/assets/icons/files/folder-trash.svg?url'
|
||
|
||
export const FOLDER_ICONS = {
|
||
default: folderIcon,
|
||
agent: folderAgentIcon,
|
||
enterprise: folderEnterpriseIcon,
|
||
favorite: folderFavoriteIcon,
|
||
knowledge: folderKnowledgeIcon,
|
||
personal: folderPersonalIcon,
|
||
trash: folderTrashIcon
|
||
}
|
||
|
||
const EXTENSION_ICONS = {
|
||
// 文档
|
||
pdf: pdfIcon,
|
||
doc: wordIcon,
|
||
docx: wordIcon,
|
||
rtf: wordIcon,
|
||
ppt: pptIcon,
|
||
pptx: pptIcon,
|
||
xls: spreadsheetIcon,
|
||
xlsx: spreadsheetIcon,
|
||
csv: spreadsheetIcon,
|
||
// 文本 / Markdown
|
||
txt: textIcon,
|
||
text: textIcon,
|
||
log: textIcon,
|
||
md: markdownIcon,
|
||
markdown: markdownIcon,
|
||
mdx: markdownIcon,
|
||
// 代码
|
||
py: pythonIcon,
|
||
js: codeIcon,
|
||
mjs: codeIcon,
|
||
cjs: codeIcon,
|
||
jsx: codeIcon,
|
||
ts: codeIcon,
|
||
tsx: codeIcon,
|
||
vue: codeIcon,
|
||
json: codeIcon,
|
||
yaml: codeIcon,
|
||
yml: codeIcon,
|
||
toml: codeIcon,
|
||
ini: codeIcon,
|
||
conf: codeIcon,
|
||
env: codeIcon,
|
||
sh: codeIcon,
|
||
bash: codeIcon,
|
||
bat: codeIcon,
|
||
go: codeIcon,
|
||
rs: codeIcon,
|
||
c: codeIcon,
|
||
h: codeIcon,
|
||
cpp: codeIcon,
|
||
java: codeIcon,
|
||
css: codeIcon,
|
||
less: codeIcon,
|
||
scss: codeIcon,
|
||
sql: codeIcon,
|
||
xml: codeIcon,
|
||
// 网页
|
||
html: webIcon,
|
||
htm: webIcon,
|
||
// 图片
|
||
png: imageIcon,
|
||
jpg: imageIcon,
|
||
jpeg: imageIcon,
|
||
gif: imageIcon,
|
||
bmp: imageIcon,
|
||
webp: imageIcon,
|
||
svg: imageIcon,
|
||
apng: imageIcon,
|
||
avif: imageIcon,
|
||
ico: imageIcon,
|
||
// 设计 / 工程
|
||
psd: psdIcon,
|
||
dwg: cadIcon,
|
||
dxf: cadIcon,
|
||
// 音视频
|
||
mp3: audioIcon,
|
||
wav: audioIcon,
|
||
flac: audioIcon,
|
||
aac: audioIcon,
|
||
ogg: audioIcon,
|
||
m4a: audioIcon,
|
||
mp4: videoIcon,
|
||
mov: videoIcon,
|
||
avi: videoIcon,
|
||
mkv: videoIcon,
|
||
webm: videoIcon,
|
||
flv: videoIcon,
|
||
// 压缩包
|
||
zip: archiveIcon,
|
||
rar: archiveIcon,
|
||
'7z': archiveIcon,
|
||
tar: archiveIcon,
|
||
gz: archiveIcon
|
||
}
|
||
|
||
const getExtension = (name) => {
|
||
const cleanName = String(name || '')
|
||
.trim()
|
||
.toLowerCase()
|
||
.split(/[?#]/)[0]
|
||
const fileName = cleanName.split('/').pop() || ''
|
||
const dotIndex = fileName.lastIndexOf('.')
|
||
if (dotIndex <= 0) return ''
|
||
return fileName.slice(dotIndex + 1)
|
||
}
|
||
|
||
/**
|
||
* 解析文件 / 文件夹对应的彩色图标 URL。
|
||
* @param {string} name 文件名或路径(目录可以 `/` 结尾)
|
||
* @param {object} [options]
|
||
* @param {boolean} [options.isDir] 是否为目录
|
||
* @param {string} [options.folderVariant] 文件夹图标变体:default | agent | enterprise | favorite | knowledge | personal | trash
|
||
*/
|
||
export const resolveFileIconUrl = (name, { isDir = false, folderVariant = 'default' } = {}) => {
|
||
const isDirectory = isDir || String(name || '').endsWith('/')
|
||
if (isDirectory) return FOLDER_ICONS[folderVariant] || FOLDER_ICONS.default
|
||
return EXTENSION_ICONS[getExtension(name)] || fileIcon
|
||
}
|