Files
UI/packages/tools/cli/lib/synonyms.mjs
T
2026-10-27 01:53:55 +08:00

85 lines
6.4 KiB
JavaScript

/*** 中文口语词 → 组件 id 同义词表:人(与 Agent)习惯说「弹窗」「下拉」「转圈」,而库内 id 是英文(modal / select / spinner)。
* search 全部落空时按本表回退一次,避免「库里有组件却搜不到」。ids 必须真实存在于清单(ua verify 校验),
* 同一个词只允许归一组(歧义会让回退结果随表序漂移)。新增只要追加一行即可,无需改命令实现。 ***/
export const SYNONYMS = [
{ words: ['弹窗', '对话框', '模态框', '模态弹窗'], ids: ['modal', 'popconfirm', 'drawer'] },
{ words: ['抽屉', '侧滑', '侧边面板'], ids: ['drawer'] },
{ words: ['下拉', '下拉框', '选择器', '选择框'], ids: ['select', 'multiSelect', 'cascader', 'treeSelect', 'autoComplete'] },
{ words: ['下拉菜单', '菜单', '导航菜单'], ids: ['menu', 'select'] },
{ words: ['日期', '日期选择', '日历'], ids: ['datePicker', 'calendar'] },
{ words: ['时间', '时刻', '时钟'], ids: ['timePicker', 'relativeTime'] },
{ words: ['开关', '切换开关', '布尔开关'], ids: ['switchButton', 'segmented'] },
{ words: ['单选', '单选框', '单选组'], ids: ['radioGroup', 'select'] },
{ words: ['多选', '复选框', '勾选'], ids: ['checkbox', 'checkboxGroup', 'multiSelect'] },
{ words: ['输入框', '文本框', '输入'], ids: ['textField', 'textarea', 'inputNumber', 'inputTag'] },
{ words: ['表格', '数据表', '表格排序'], ids: ['dataTable'] },
{ words: ['分页', '翻页', '页码'], ids: ['pagination'] },
{ words: ['标签', '小标签', '标记'], ids: ['tag'] },
{ words: ['徽标', '角标', '红点'], ids: ['badge', 'avatarGroup'] },
{ words: ['头像', '用户头像'], ids: ['avatar', 'avatarGroup'] },
{ words: ['气泡', '浮层', '提示浮层'], ids: ['tooltip', 'popover', 'popconfirm'] },
{ words: ['通知', '消息提示', '提示条'], ids: ['toast', 'notification', 'noticeBar', 'alert'] },
{ words: ['加载', '载入', '转圈', '等待'], ids: ['spinner', 'loading', 'progressRing', 'skeleton'] },
{ words: ['骨架屏', '骨架', '占位块'], ids: ['skeleton', 'empty'] },
{ words: ['空态', '空状态', '无数据'], ids: ['empty', 'result'] },
{ words: ['进度', '进度条', '完成度'], ids: ['progress', 'progressRing'] },
{ words: ['步骤', '步骤条', '流程条'], ids: ['stepper', 'timeline'] },
{ words: ['折叠', '手风琴', '折叠面板'], ids: ['accordion', 'tree'] },
{ words: ['树', '树形', '层级树'], ids: ['tree', 'treeSelect', 'cascader'] },
{ words: ['上传', '文件上传', '附件'], ids: ['upload'] },
{ words: ['轮播', '走马灯', '幻灯片'], ids: ['carousel'] },
{ words: ['穿梭', '穿梭框', '转移'], ids: ['transfer'] },
{ words: ['锚点', '目录导航', '页内导航'], ids: ['anchor', 'affix', 'backTop'] },
{ words: ['返回顶部', '回顶'], ids: ['backTop', 'affix'] },
{ words: ['面包屑', '路径导航'], ids: ['breadcrumb'] },
{ words: ['时间线', '时间轴', '事件流'], ids: ['timeline'] },
{ words: ['评分', '星级', '打分'], ids: ['rate'] },
{ words: ['滑块', '滑动条', '拖拽条'], ids: ['slider', 'splitter'] },
{ words: ['分割', '分栏', '左右分栏'], ids: ['splitter', 'grid', 'layout'] },
{ words: ['统计', '数值统计', '指标'], ids: ['statistic', 'inputNumber'] },
{ words: ['倒计时', '剩余时间'], ids: ['countdown', 'relativeTime'] },
{ words: ['复制', '复制按钮', '一键复制'], ids: ['copyButton'] },
{ words: ['快捷键', '按键', '键盘键'], ids: ['kbd'] },
{ words: ['高亮', '关键词高亮', '标红'], ids: ['highlight'] },
{ words: ['搜索', '命令面板', '快捷搜索'], ids: ['commandPalette', 'autoComplete', 'mentions'] },
{ words: ['代码', '代码块', '源码'], ids: ['codeBlock', 'diffView', 'jsonViewer'] },
{ words: ['差异', '对比', '差异对比'], ids: ['diffView'] },
{ words: ['签名', '手写', '签字'], ids: ['signaturePad'] },
{ words: ['热力图', '日历热图', '活跃图'], ids: ['heatmap'] },
{ words: ['折线', '迷你图', '走势'], ids: ['sparkline'] },
{ words: ['水印'], ids: ['watermark'] },
{ words: ['引导', '新手引导', '导览'], ids: ['tour', 'popover'] },
{ words: ['拖拽排序', '排序列表', '拖动'], ids: ['sortableList'] },
{ words: ['瀑布流', '不规则网格', '卡片墙'], ids: ['masonry', 'grid'] },
{ words: ['虚拟列表', '长列表', '海量列表'], ids: ['virtualList', 'list'] },
{ words: ['图片', '图片预览', '大图'], ids: ['image', 'avatar'] },
{ words: ['验证码', '密码框', '分格输入'], ids: ['pinInput'] },
{ words: ['标签输入', '多值输入', '输入标签'], ids: ['inputTag', 'mentions'] },
{ words: ['描述列表', '详情列表', '键值对'], ids: ['descriptions'] },
{ words: ['结果页', '成功页', '失败页'], ids: ['result'] },
{ words: ['卡片', '面板'], ids: ['card'] },
{ words: ['按钮', '操作按钮'], ids: ['button', 'floatButton'] },
{ words: ['悬浮按钮', '浮动按钮', '快速操作'], ids: ['floatButton'] },
{ words: ['排版', '标题', '文本'], ids: ['typography'] },
{ words: ['链接', '超链接', '跳转'], ids: ['link'] },
{ words: ['分段控制器', '分段', '分段控制'], ids: ['segmented', 'tabs'] },
{ words: ['页签', '标签页', '选项卡'], ids: ['tabs'] },
{ words: ['取色', '颜色选择', '调色'], ids: ['colorPicker'] },
{ words: ['布局', '页面框架', '骨架布局'], ids: ['layout', 'grid'] },
{ words: ['间距', '空隙', '间隔'], ids: ['space', 'divider'] },
{ words: ['分割线', '分隔线'], ids: ['divider'] },
{ words: ['二次确认', '确认气泡'], ids: ['popconfirm'] },
{ words: ['自动补全', '联想', '输入联想'], ids: ['autoComplete'] },
{ words: ['树选择', '树形选择'], ids: ['treeSelect'] },
{ words: ['级联', '级联选择', '省市'], ids: ['cascader'] },
{ words: ['筛选', '过滤'], ids: ['dataTable'] },
{ words: ['表单', '表单校验'], ids: ['form', 'textField', 'checkboxGroup'] },
];
/*** 查一个词的同义组件 id 集合;未收录返回 null——与「收录但命中为空」区分,调用方据此判断能否整组回退 ***/
export function synonymIds(word) {
const w = String(word ?? '').toLowerCase().trim();
const hit = SYNONYMS.find((g) => g.words.includes(w));
return hit ? new Set(hit.ids) : null;
}