jingrowtools/generate-icons.js
2026-01-02 18:33:52 +08:00

185 lines
7.6 KiB
JavaScript

import fs from 'fs';
import icons from '@vicons/tabler';
const iconNames = Object.keys(icons);
console.log(`Total icons: ${iconNames.length}`);
// 生成导入语句
const imports = iconNames.map(name => name).join(',\n ');
// 生成映射对象
const mappings = iconNames.map(name => {
const displayName = name.replace(/^Icon/, '') + 'Outlined';
return ` ${displayName}: ${name}`;
}).join(',\n');
const output = `import {
${imports}
} from '@vicons/tabler'
import type { Component } from 'vue'
// 静态图标映射 - 所有Tabler图标
const tablerIconMap: Record<string, Component> = {
${mappings}
}
// 获取图标组件
export function getIconComponent(name?: string): Component | null {
if (!name) return null
return tablerIconMap[name] || null
}
// 获取所有可用的图标名称
export function getAvailableIcons(): string[] {
return Object.keys(tablerIconMap)
}
// 图标分类定义
export const iconCategories = {
common: {
name: '常用',
icons: [
{ name: 'DashboardOutlined', label: '仪表板', keywords: ['dashboard', '控制台'] },
{ name: 'HomeOutlined', label: '首页', keywords: ['home', '首页'] },
{ name: 'SettingOutlined', label: '设置', keywords: ['setting', '设置'] },
{ name: 'MenuOutlined', label: '菜单', keywords: ['menu', '菜单'] },
{ name: 'UserOutlined', label: '用户', keywords: ['user', '用户'] },
{ name: 'FileOutlined', label: '文件', keywords: ['file', '文件'] },
{ name: 'FolderOutlined', label: '文件夹', keywords: ['folder', '文件夹'] },
{ name: 'SearchOutlined', label: '搜索', keywords: ['search', '搜索'] }
]
},
user: {
name: '用户',
icons: [
{ name: 'UserOutlined', label: '用户', keywords: ['user', '用户'] },
{ name: 'UsersOutlined', label: '团队', keywords: ['team', '团队'] },
{ name: 'LockOutlined', label: '锁定', keywords: ['lock', '锁定'] },
{ name: 'KeyOutlined', label: '钥匙', keywords: ['key', '钥匙'] },
{ name: 'ShieldOutlined', label: '安全', keywords: ['safety', '安全'] },
{ name: 'CrownOutlined', label: '皇冠', keywords: ['crown', '皇冠'] },
{ name: 'TrophyOutlined', label: '奖杯', keywords: ['trophy', '奖杯'] },
{ name: 'GiftOutlined', label: '礼物', keywords: ['gift', '礼物'] }
]
},
file: {
name: '文件',
icons: [
{ name: 'FileOutlined', label: '文件', keywords: ['file', '文件'] },
{ name: 'FolderOutlined', label: '文件夹', keywords: ['folder', '文件夹'] },
{ name: 'FolderOpenOutlined', label: '打开文件夹', keywords: ['folder-open', '打开文件夹'] },
{ name: 'DownloadOutlined', label: '下载', keywords: ['download', '下载'] },
{ name: 'UploadOutlined', label: '上传', keywords: ['upload', '上传'] },
{ name: 'ExportOutlined', label: '导出', keywords: ['export', '导出'] },
{ name: 'ImportOutlined', label: '导入', keywords: ['import', '导入'] },
{ name: 'PrinterOutlined', label: '打印', keywords: ['printer', '打印'] }
]
},
data: {
name: '数据',
icons: [
{ name: 'BarChartOutlined', label: '柱状图', keywords: ['bar-chart', '柱状图'] },
{ name: 'PieChartOutlined', label: '饼图', keywords: ['pie-chart', '饼图'] },
{ name: 'LineChartOutlined', label: '折线图', keywords: ['line-chart', '折线图'] },
{ name: 'TableOutlined', label: '表格', keywords: ['table', '表格'] },
{ name: 'DatabaseOutlined', label: '数据库', keywords: ['database', '数据库'] },
{ name: 'CloudOutlined', label: '云', keywords: ['cloud', '云'] },
{ name: 'ApiOutlined', label: 'API', keywords: ['api', '接口'] },
{ name: 'MonitorOutlined', label: '监控', keywords: ['monitor', '监控'] }
]
},
system: {
name: '系统',
icons: [
{ name: 'ToolOutlined', label: '工具', keywords: ['tool', '工具'] },
{ name: 'BugOutlined', label: 'Bug', keywords: ['bug', '错误'] },
{ name: 'CodeOutlined', label: '代码', keywords: ['code', '代码'] },
{ name: 'ApiOutlined', label: 'API', keywords: ['api', '接口'] },
{ name: 'ExperimentOutlined', label: '实验', keywords: ['experiment', '实验'] },
{ name: 'BulbOutlined', label: '灯泡', keywords: ['bulb', '灯泡'] },
{ name: 'SettingOutlined', label: '设置', keywords: ['setting', '设置'] },
{ name: 'ControlOutlined', label: '控制', keywords: ['control', '控制'] }
]
},
media: {
name: '媒体',
icons: [
{ name: 'CameraOutlined', label: '相机', keywords: ['camera', '相机'] },
{ name: 'PictureOutlined', label: '图片', keywords: ['picture', '图片'] },
{ name: 'VideoCameraOutlined', label: '视频', keywords: ['video', '视频'] },
{ name: 'AudioOutlined', label: '音频', keywords: ['audio', '音频'] },
{ name: 'PlayCircleOutlined', label: '播放', keywords: ['play', '播放'] },
{ name: 'PauseCircleOutlined', label: '暂停', keywords: ['pause', '暂停'] },
{ name: 'StopOutlined', label: '停止', keywords: ['stop', '停止'] },
{ name: 'SoundOutlined', label: '声音', keywords: ['sound', '声音'] }
]
},
navigation: {
name: '导航',
icons: [
{ name: 'ArrowUpOutlined', label: '上箭头', keywords: ['arrow-up', '上箭头'] },
{ name: 'ArrowDownOutlined', label: '下箭头', keywords: ['arrow-down', '下箭头'] },
{ name: 'ArrowLeftOutlined', label: '左箭头', keywords: ['arrow-left', '左箭头'] },
{ name: 'ArrowRightOutlined', label: '右箭头', keywords: ['arrow-right', '右箭头'] },
{ name: 'UpOutlined', label: '向上', keywords: ['up', '向上'] },
{ name: 'DownOutlined', label: '向下', keywords: ['down', '向下'] },
{ name: 'LeftOutlined', label: '向左', keywords: ['left', '向左'] },
{ name: 'RightOutlined', label: '向右', keywords: ['right', '向右'] }
]
},
action: {
name: '操作',
icons: [
{ name: 'EditOutlined', label: '编辑', keywords: ['edit', '编辑'] },
{ name: 'DeleteOutlined', label: '删除', keywords: ['delete', '删除'] },
{ name: 'PlusOutlined', label: '添加', keywords: ['plus', '添加'] },
{ name: 'MinusOutlined', label: '减少', keywords: ['minus', '减少'] },
{ name: 'CheckOutlined', label: '确认', keywords: ['check', '确认'] },
{ name: 'CloseOutlined', label: '关闭', keywords: ['close', '关闭'] },
{ name: 'ReloadOutlined', label: '刷新', keywords: ['reload', '刷新'] },
{ name: 'SyncOutlined', label: '同步', keywords: ['sync', '同步'] }
]
}
}
// 图标选项接口
export interface IconOption {
name: string
label: string
category: string
keywords?: string[]
}
// 获取所有图标选项
export function getAllIconOptions(): IconOption[] {
const allIcons: IconOption[] = []
Object.entries(iconCategories).forEach(([, category]) => {
category.icons.forEach(icon => {
allIcons.push({
name: icon.name,
label: icon.label,
category: category.name,
keywords: icon.keywords
})
})
})
return allIcons
}
// 搜索图标
export function searchIcons(query: string): IconOption[] {
const allIcons = getAllIconOptions()
const lowerQuery = query.toLowerCase()
return allIcons.filter(icon =>
icon.name.toLowerCase().includes(lowerQuery) ||
icon.label.toLowerCase().includes(lowerQuery) ||
icon.keywords?.some(keyword => keyword.toLowerCase().includes(lowerQuery))
)
}`;
fs.writeFileSync('/tmp/tabler-icons-full.ts', output);
console.log('Generated full tabler-icons.ts file');