import { store, event } from '@wisdom-utils/utils'; import BaseDirective from './BaseDirective'; import Utils from '../utils/Utils'; class CloseMenuDirective extends BaseDirective { static name = '关闭菜单或者模糊匹配关闭菜单'; match() { const { text } = this; let result = null; if (this.getBeforeLastGroupDirective()) { result = text.match(/第([一|二|三|四|五|六|七|八|九|十]+)个/); if (result && result.length >= 2) { this.matchResult = Utils.chineseToNumber(result[1]); } else if (!result) { result = text.match(/第[\u4e00-\u9fa5]?(\d+)个/); if (result && result.length >= 2) { this.matchResult = Number(result[1]); } } } result = text.match(/关闭(所有).*(?=(?:,|,|。))/); if (!result) { result = text.match(/关闭(当前).*(?=(?:,|,|。))/); } if (!result) { result = text.match(/关闭(.*)(?=(?:菜单|功能|路径))/); } if (!result) { result = text.match(/关闭(.*)(?=(?:,|,|。))/); } if (result && result.length >= 2 && !this.matchResult) { this.matchResult = result[1]; } return !!this.matchResult; } getBeforeLastGroupDirective() { const lastMenu = this.directives.at(-1); if (!lastMenu) return false; if (!(lastMenu instanceof CloseMenuDirective)) return false; if (!lastMenu.data || lastMenu.data.type != 'widgets' || lastMenu.data.widgets.length == 0) return false; return true; } async excute() { let widgets = null; if (typeof this.matchResult === 'number') { const widgets = this.getOpenedMenus(); if (this.matchResult == 0 || this.matchResult > widgets.length) { this.data = {}; this.data.type = 'widgets'; this.data.widgets = widgets; return `索引超出了界限,请重新语音选择关闭第几个菜单`; } const menu = widgets[this.matchResult]; event.emit('event:closeMenuByName', menu.name); return `关闭${menu.name}菜单成功`; } if (this.matchResult == '所有') { return this.closeAllMenu(); } if (this.matchResult == '当前') { return this.closeCurrentMenu(); } widgets = this.getIsOneWdiget(); if (!widgets) { widgets = this.getCompleteMenus(); } if (!widgets) { return '已打开菜单中没有查找到此菜单,请检查语音是否正确'; } if (widgets.length == 1) { event.emit('event:closeMenuByName', widgets[0].name); return `关闭${widgets[0].name}菜单成功`; } this.data = {}; this.data.type = 'widgets'; this.data.widgets = widgets; return this.widgetsToMsg(widgets); } widgetsToMsg(widgets) { return `有以下${widgets.length}个菜单打开\n${widgets .map((widget, index) => `${index + 1}.${widget.name}`) .join('\n')},\n请语音确认一下关闭第几个菜单`; } closeAllMenu() { event.emit('event:closeAllMenu', true); return `成功关闭所有菜单`; } closeCurrentMenu() { console.log(store); console.log(window.location); const menus = this.getOpenedMenus(); const menu = location.pathname.match(/\/civbase(.*)/); if (!menu || menu.length <= 1) { return '系统发生匹配错误'; } const currentMenu = menus.find(item => item.location.pathname == decodeURI(menu[1])); if (!currentMenu) { return '系统发生异常'; } const isHome = currentMenu.name == '首页'; if (isHome) { return `当前菜单为首页,不能被关闭`; } event.emit('event:closeMenuByName', currentMenu.name); return `关闭${currentMenu.name}菜单成功`; } getCompleteMenus() { const widgets = this.getOpenedMenus(); const reg = new RegExp(this.matchResult); const results = widgets.filter(i => reg.test(i.name)); return results.length > 0 ? results : null; } getIsOneWdiget() { const widgets = this.getOpenedMenus(); const widget = widgets.find(i => i.name == this.matchResult); return widget ? [widget] : null; } getOpenedMenus() { const menus = store.get('event:openedMenus'); return Array.from(menus.current.values()); } } export default CloseMenuDirective;