- filesystem_service 简化文件元数据处理 - viewer_filesystem_service 移除冗余逻辑 - 新增 upload_utils 上传工具模块 - filesystem_router 移除废弃端点 - 前端 viewer_filesystem.js 接口重构,新增 upload_limits.js 上传限制 - file_preview、file_utils 更新预览与工具函数
107 lines
2.4 KiB
JavaScript
107 lines
2.4 KiB
JavaScript
const MARKDOWN_EXTENSIONS = new Set(['.md', '.markdown', '.mdx'])
|
|
const IMAGE_EXTENSIONS = new Set([
|
|
'.apng',
|
|
'.avif',
|
|
'.png',
|
|
'.jpg',
|
|
'.jpeg',
|
|
'.gif',
|
|
'.bmp',
|
|
'.webp',
|
|
'.svg'
|
|
])
|
|
const PDF_EXTENSIONS = new Set(['.pdf'])
|
|
const HTML_EXTENSIONS = new Set(['.html', '.htm'])
|
|
const CODE_LANGUAGE_ALIASES = {
|
|
js: 'javascript',
|
|
ts: 'typescript',
|
|
py: 'python',
|
|
sh: 'bash',
|
|
shell: 'bash',
|
|
yml: 'yaml',
|
|
docker: 'dockerfile'
|
|
}
|
|
|
|
export const normalizeCodeLanguage = (lang) => {
|
|
const language = String(lang || '')
|
|
.trim()
|
|
.split(/[\s:,]/)[0]
|
|
.toLowerCase()
|
|
|
|
return CODE_LANGUAGE_ALIASES[language] || language
|
|
}
|
|
|
|
const CODE_LANGUAGE_MAP = {
|
|
'.py': 'python',
|
|
'.js': 'javascript',
|
|
'.mjs': 'javascript',
|
|
'.cjs': 'javascript',
|
|
'.ts': 'typescript',
|
|
'.tsx': 'tsx',
|
|
'.jsx': 'jsx',
|
|
'.vue': 'xml',
|
|
'.html': 'xml',
|
|
'.htm': 'xml',
|
|
'.xml': 'xml',
|
|
'.css': 'css',
|
|
'.less': 'less',
|
|
'.scss': 'scss',
|
|
'.json': 'json',
|
|
'.yaml': 'yaml',
|
|
'.yml': 'yaml',
|
|
'.toml': 'ini',
|
|
'.ini': 'ini',
|
|
'.cfg': 'ini',
|
|
'.conf': 'ini',
|
|
'.sh': 'bash',
|
|
'.bash': 'bash',
|
|
'.zsh': 'bash',
|
|
'.fish': 'bash',
|
|
'.sql': 'sql',
|
|
'.java': 'java',
|
|
'.kt': 'kotlin',
|
|
'.go': 'go',
|
|
'.rs': 'rust',
|
|
'.php': 'php',
|
|
'.rb': 'ruby',
|
|
'.c': 'c',
|
|
'.h': 'c',
|
|
'.cpp': 'cpp',
|
|
'.cc': 'cpp',
|
|
'.cxx': 'cpp',
|
|
'.hpp': 'cpp',
|
|
'.cs': 'csharp',
|
|
'.swift': 'swift',
|
|
'.dockerfile': 'dockerfile'
|
|
}
|
|
|
|
export const getPreviewFileExtension = (path) => {
|
|
const normalizedPath = String(path || '')
|
|
.trim()
|
|
.toLowerCase()
|
|
if (!normalizedPath) return ''
|
|
|
|
const fileName = normalizedPath.split('/').pop() || ''
|
|
const dotIndex = fileName.lastIndexOf('.')
|
|
if (dotIndex <= 0) return ''
|
|
return fileName.slice(dotIndex)
|
|
}
|
|
|
|
export const isMarkdownPreview = (path, previewType) => {
|
|
if (previewType === 'markdown') return true
|
|
return MARKDOWN_EXTENSIONS.has(getPreviewFileExtension(path))
|
|
}
|
|
|
|
export const getPreviewTypeByPath = (path) => {
|
|
const extension = getPreviewFileExtension(path)
|
|
if (IMAGE_EXTENSIONS.has(extension)) return 'image'
|
|
if (PDF_EXTENSIONS.has(extension)) return 'pdf'
|
|
if (MARKDOWN_EXTENSIONS.has(extension)) return 'markdown'
|
|
return 'text'
|
|
}
|
|
|
|
export const getCodeLanguageByPath = (path) =>
|
|
normalizeCodeLanguage(CODE_LANGUAGE_MAP[getPreviewFileExtension(path)] || '')
|
|
|
|
export const isHtmlPreview = (path) => HTML_EXTENSIONS.has(getPreviewFileExtension(path))
|