fix: 文件图标按类型区分,统一两个组件的图标映射

This commit is contained in:
Metona
2026-04-04 21:20:20 +08:00
parent 5259b8017a
commit 35a3b5815f
2 changed files with 49 additions and 11 deletions
+18 -10
View File
@@ -11,24 +11,32 @@ let chatAreaEl, messagesContainerEl, emptyStateEl;
/** 根据文件名返回合适的图标 */ /** 根据文件名返回合适的图标 */
function getFileIcon(filename) { function getFileIcon(filename) {
const name = filename.toLowerCase();
if (name === 'dockerfile') return '🐳';
if (name === 'makefile' || name === 'gnumakefile') return '🔨';
const ext = filename.split('.').pop().toLowerCase(); const ext = filename.split('.').pop().toLowerCase();
const iconMap = { const map = {
py: '🐍', pyw: '🐍', pyi: '🐍', py: '🐍', pyw: '🐍', pyi: '🐍',
js: '💛', mjs: '💛', cjs: '💛', js: '💛', mjs: '💛', cjs: '💛',
ts: '🔷', tsx: '⚛️', jsx: '⚛️', ts: '🔷', tsx: '⚛️', jsx: '⚛️',
java: '☕', go: '🐹', rs: '🦀', rb: '💎', java: '☕', go: '🐹', rs: '🦀', rb: '💎',
php: '🐘', sh: '🐚', bash: '🐚', zsh: '🐚', php: '🐘', swift: '🍎', kt: '🤖', scala: '🔴',
lua: '🌙', pl: '🐪', r: '📐', m: '📐',
cs: '🟪', fs: '🔵', vb: '🔷',
ex: '💧', exs: '💧', erl: '📞', hs: '🟣',
clj: '🟢', lisp: '🟢',
cpp: '⚙️', cc: '⚙️', cxx: '⚙️', hpp: '⚙️',
c: '⚙️', h: '⚙️',
sh: '🐚', bash: '🐚', zsh: '🐚', fish: '🐚',
html: '🌐', htm: '🌐', css: '🎨', svg: '🎨', html: '🌐', htm: '🌐', css: '🎨', svg: '🎨',
json: '📋', yaml: '📋', yml: '📋', toml: '📋', json: '📋', yaml: '📋', yml: '📋', toml: '📋',
xml: '📰', sql: '🗃️', md: '📝', markdown: '📝', ini: '📋', cfg: '📋', conf: '📋',
txt: '📄', log: '📜', csv: '📊', tsv: '📊', xml: '📰', sql: '🗃️',
cpp: '⚙️', c: '⚙️', h: '⚙️', hpp: '⚙️', md: '📝', markdown: '📝', rst: '📝', txt: '📄',
swift: '🍎', kt: '🤖', lua: '🌙', log: '📜', csv: '📊', tsv: '📊',
dockerfile: '🐳', makefile: '🔨', diff: '🔀', patch: '🔀',
}; };
if (filename.toLowerCase() === 'dockerfile') return '🐳'; return map[ext] || '📄';
if (filename.toLowerCase() === 'makefile') return '🔨';
return iconMap[ext] || '📄';
} }
export function initChatArea() { export function initChatArea() {
+31 -1
View File
@@ -32,6 +32,36 @@ const TEXT_EXTENSIONS = new Set([
/** 最大文件大小 500KB */ /** 最大文件大小 500KB */
const MAX_FILE_SIZE = 500 * 1024; const MAX_FILE_SIZE = 500 * 1024;
/** 根据文件名返回图标 */
function getFileIcon(filename) {
const name = filename.toLowerCase();
if (name === 'dockerfile') return '🐳';
if (name === 'makefile' || name === 'gnumakefile') return '🔨';
const ext = filename.split('.').pop().toLowerCase();
const map = {
py: '🐍', pyw: '🐍', pyi: '🐍',
js: '💛', mjs: '💛', cjs: '💛',
ts: '🔷', tsx: '⚛️', jsx: '⚛️',
java: '☕', go: '🐹', rs: '🦀', rb: '💎',
php: '🐘', swift: '🍎', kt: '🤖', scala: '🔴',
lua: '🌙', pl: '🐪', r: '📐', m: '📐',
cs: '🟪', fs: '🔵', vb: '🔷',
ex: '💧', exs: '💧', erl: '📞', hs: '🟣',
clj: '🟢', lisp: '🟢',
cpp: '⚙️', cc: '⚙️', cxx: '⚙️', hpp: '⚙️',
c: '⚙️', h: '⚙️',
sh: '🐚', bash: '🐚', zsh: '🐚', fish: '🐚',
html: '🌐', htm: '🌐', css: '🎨', svg: '🎨',
json: '📋', yaml: '📋', yml: '📋', toml: '📋',
ini: '📋', cfg: '📋', conf: '📋',
xml: '📰', sql: '🗃️',
md: '📝', markdown: '📝', rst: '📝', txt: '📄',
log: '📜', csv: '📊', tsv: '📊',
diff: '🔀', patch: '🔀',
};
return map[ext] || '📄';
}
/** 判断是否为文本/代码文件 */ /** 判断是否为文本/代码文件 */
function isTextFile(file) { function isTextFile(file) {
// 无扩展名的特殊文件名 // 无扩展名的特殊文件名
@@ -182,7 +212,7 @@ function renderFilePreviews() {
filePreviewEl.style.display = ''; filePreviewEl.style.display = '';
filePreviewEl.innerHTML = pendingFiles.map((f, i) => ` filePreviewEl.innerHTML = pendingFiles.map((f, i) => `
<div class="file-chip"> <div class="file-chip">
<span class="file-icon">📄</span> <span class="file-icon">${getFileIcon(f.name)}</span>
<span class="file-name">${escapeHtml(f.name)}</span> <span class="file-name">${escapeHtml(f.name)}</span>
<span class="file-size">${formatSize(f.size)}</span> <span class="file-size">${formatSize(f.size)}</span>
<button class="remove-file" data-index="${i}" title="移除">×</button> <button class="remove-file" data-index="${i}" title="移除">×</button>