fix(단축키): 전역 Ctrl 단축키 한글 자판 대응 · 공용 판정 함수(214-2)
- A00_Common/key_shortcut.ts 새로 — 영문이면 글자 · 아니면 자판 자리(code) · CAD 와 페이지가 같이 씀 - CAD input-shortcut.ts 는 공용을 다시 내보냄 · tsconfig.app.json 에 공용 파일 포함 - B05 종단 Ctrl+Z · 노선 편집 Ctrl+Z · Y · M02 흐름도 Ctrl+Z · 카드 Ctrl+S · 나무 Ctrl+C · V · 시트 Ctrl+글자 - 시트 키는 한글 조합 중에도 Ctrl+글자 판정 - 새 시험 ctrl-shortcut-hangul · ctrl-shortcut-sheet Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01STqEqztUthVFBmEP18wBSz
This commit is contained in:
@@ -1,6 +1,6 @@
|
||||
/**
|
||||
* Ctrl 단축키 — 한글 자판에서도 되돌리기 · 다시 하기가 먹는다(PLAN 214-1).
|
||||
* 한글 자판은 key 가 「ㅋ」·「ㅛ」 · Shift 는 대문자 — 자판 자리(code)로 판정한다.
|
||||
* Ctrl 단축키 — 한글 자판에서도 먹는다(PLAN 214-1 CAD · 214-2 페이지 공용 `A00_Common/key_shortcut.ts`).
|
||||
* 한글 자판은 key 가 「ㅋ」·「ㅛ」 · Shift 는 대문자 — 영문이 아니면 자판 자리(code)로 판정한다.
|
||||
* 실행: cd B07_DesignDetail/openwebcad && npx vitest run --dir ../../resources/tester/cad ctrl-shortcut-hangul
|
||||
*/
|
||||
import { beforeEach, describe, expect, it, vi } from "vitest";
|
||||
@@ -111,3 +111,39 @@ describe("키 입력 — 한글 자판", () => {
|
||||
expect(prevented).not.toHaveBeenCalled();
|
||||
});
|
||||
});
|
||||
|
||||
// ---- 공용 판정 · 페이지(214-2) — 같은 함수를 B05 · M02 · 시트 키가 씀 ----
|
||||
import { isCtrlKey, keyLetter } from "../../../A00_Common/key_shortcut";
|
||||
|
||||
describe("keyLetter · isCtrlKey — 페이지 공용", () => {
|
||||
it("한글 자판 key 「ㅋ」 + KeyZ = z · 영문 · 대문자도 소문자 · 숫자", () => {
|
||||
expect(keyLetter({ key: "ㅋ", code: "KeyZ" })).toBe("z");
|
||||
expect(keyLetter({ key: "ㅊ", code: "KeyC" })).toBe("c");
|
||||
expect(keyLetter({ key: "ㅍ", code: "KeyV" })).toBe("v");
|
||||
expect(keyLetter({ key: "ㄴ", code: "KeyS" })).toBe("s");
|
||||
expect(keyLetter({ key: "Z", code: "KeyZ" })).toBe("z");
|
||||
expect(keyLetter({ key: "1", code: "Digit1" })).toBe("1");
|
||||
expect(keyLetter({ key: "Process", code: "Digit1" })).toBe("1");
|
||||
});
|
||||
it("다른 자판 배열(key 가 영문)은 key 를 따름 · 글자 아닌 키는 빈 글", () => {
|
||||
expect(keyLetter({ key: "z", code: "KeyY" })).toBe("z"); // 독일식 자리 바뀜
|
||||
expect(keyLetter({ key: "Enter", code: "Enter" })).toBe("");
|
||||
expect(keyLetter({ key: "Escape", code: "Escape" })).toBe("");
|
||||
});
|
||||
it("code 없는 합성 사건은 key 로", () => {
|
||||
expect(keyLetter({ key: "Z", code: "" })).toBe("z");
|
||||
});
|
||||
it("isCtrlKey — Ctrl · ⌘ 만 · 글자 맞아야", () => {
|
||||
const e = (extra: object) => ({
|
||||
key: "ㅋ",
|
||||
code: "KeyZ",
|
||||
ctrlKey: false,
|
||||
metaKey: false,
|
||||
...extra,
|
||||
});
|
||||
expect(isCtrlKey(e({ ctrlKey: true }), "z")).toBe(true);
|
||||
expect(isCtrlKey(e({ metaKey: true }), "z")).toBe(true);
|
||||
expect(isCtrlKey(e({}), "z")).toBe(false);
|
||||
expect(isCtrlKey(e({ ctrlKey: true }), "y")).toBe(false);
|
||||
});
|
||||
});
|
||||
|
||||
@@ -0,0 +1,60 @@
|
||||
/**
|
||||
* 시트 키 — 한글 자판에서도 Ctrl 단축키(PLAN 214-2).
|
||||
* 실행: cd B07_DesignDetail/openwebcad && npx vitest run --config ../../resources/tester/cad/vitest.ui.config.ts
|
||||
*/
|
||||
import { describe, expect, it } from "vitest";
|
||||
import { attachKeys } from "../../../A00_Common/spreadsheet/spreadsheet_keys";
|
||||
|
||||
describe("시트 키 — 한글 자판 Ctrl 단축키", () => {
|
||||
const setup = () => {
|
||||
const log: string[] = [];
|
||||
const handlers: ((e: KeyboardEvent) => void)[] = [];
|
||||
const ed = {
|
||||
ta: {
|
||||
addEventListener: (_: string, fn: (e: KeyboardEvent) => void) => handlers.push(fn),
|
||||
removeEventListener: () => {},
|
||||
},
|
||||
formula: { addEventListener: () => {}, removeEventListener: () => {} },
|
||||
editing: () => false,
|
||||
};
|
||||
const ctx = {
|
||||
undo: () => log.push("undo"),
|
||||
redo: () => log.push("redo"),
|
||||
readOnly: false,
|
||||
sheet: () => ({}),
|
||||
selection: {},
|
||||
};
|
||||
attachKeys(ctx as never, ed as never, {
|
||||
find: (replace: boolean) => log.push(replace ? "replace" : "find"),
|
||||
});
|
||||
const press = (extra: object) =>
|
||||
handlers[0]({
|
||||
key: "",
|
||||
code: "",
|
||||
keyCode: 0,
|
||||
isComposing: false,
|
||||
ctrlKey: true,
|
||||
metaKey: false,
|
||||
shiftKey: false,
|
||||
altKey: false,
|
||||
target: null,
|
||||
preventDefault: () => {},
|
||||
stopPropagation: () => {},
|
||||
...extra,
|
||||
} as unknown as KeyboardEvent);
|
||||
return { log, press };
|
||||
};
|
||||
it("「ㅋ」 = 되돌리기 · 「ㅛ」 = 다시 하기 · Shift+「ㅋ」 = 다시 하기", () => {
|
||||
const { log, press } = setup();
|
||||
press({ key: "ㅋ", code: "KeyZ" });
|
||||
press({ key: "ㅛ", code: "KeyY" });
|
||||
press({ key: "ㅋ", code: "KeyZ", shiftKey: true });
|
||||
expect(log).toEqual(["undo", "redo", "redo"]);
|
||||
});
|
||||
it("「ㄹ」(KeyF) = 찾기 · 「ㅗ」(KeyH) = 바꾸기 · 조합 중에도", () => {
|
||||
const { log, press } = setup();
|
||||
press({ key: "ㄹ", code: "KeyF" });
|
||||
press({ key: "Process", code: "KeyH", keyCode: 229, isComposing: true });
|
||||
expect(log).toEqual(["find", "replace"]);
|
||||
});
|
||||
});
|
||||
@@ -0,0 +1,8 @@
|
||||
/** 페이지 코드(`@ui` 별칭을 쓰는 것)를 시험하는 vitest 설정 — 시험은 `ctrl-shortcut-sheet.test.ts`. */
|
||||
const root = new URL("../../..", import.meta.url).pathname.replace(/^\/(\w:)/, "$1");
|
||||
|
||||
export default {
|
||||
root,
|
||||
resolve: { alias: { "@ui": `${root}ui_template` } },
|
||||
test: { include: ["resources/tester/cad/ctrl-shortcut-sheet.test.ts"] },
|
||||
};
|
||||
Reference in New Issue
Block a user