/* ============================================================================= * app_settings_find.ts * ☰ [설정] 단축키 탭 셈(PLAN 588-1) — CAD 명령 묶음 · 찾기 판정. 화면 · 저장소 안 씀. * * - 묶음 = 리본 탭 › 패널 이름 그대로(`openwebcad/src/ribbon/ribbon.config.ts` · 순수 자료) · 두 패널에 있으면 앞 패널 · 리본에 없는 명령 = 기타 * - 찾기 = 띄어 나눈 낱말이 모두 어느 글에든 들면 맞음 · 대소문자 무시 * 시험 = `resources/tester/test_588_key_registry.py` * ========================================================================== */ import { RIBBON_TABS } from "../B07_DesignDetail/openwebcad/src/ribbon/ribbon.config"; export interface CadGroup { /** 「홈 › 그리기」 · 기타는 빈 글 */ label: string; ids: string[]; } /** 명령 id 들 → 리본 묶음(리본 차례) + 끝에 기타(`label` 빈 글) */ export function cadCommandGroups(ids: string[]): CadGroup[] { const known = new Set(ids); const seen = new Set(); const groups: CadGroup[] = []; for (const tab of RIBBON_TABS) { for (const panel of tab.panels) { const mine = [...(panel.big ?? []), ...(panel.commands ?? []), ...(panel.overflow ?? [])] .filter((id) => known.has(id) && !seen.has(id)) .filter((id) => seen.add(id)); if (mine.length) groups.push({ label: `${tab.label} › ${panel.label}`, ids: mine }); } } const rest = ids.filter((id) => !seen.has(id)); if (rest.length) groups.push({ label: "", ids: rest }); return groups; } /** 찾기 — 빈 찾기 = 맞음 · 낱말마다 어느 글에든 들어야 */ export function matchesFind(query: string, texts: string[]): boolean { const hay = texts.join("\n").toLowerCase(); return query .toLowerCase() .split(/\s+/) .filter(Boolean) .every((word) => hay.includes(word)); }