feat(spreadsheet): 2단계 — 셀 서식 대화상자(Ctrl+1)
엑셀과 같은 탭 여섯 — 표시 형식(범주·소수 자리·천 단위·음수 모양·사용자 지정 코드·미리보기, B의 numfmt로 실제 그림) · 맞춤(가로·세로·줄 바꿈·셀 병합·들여쓰기는 자리만) · 글꼴(실시간 미리보기) · 테두리(선 모양·색·위치별 적용·미리보기) · 채우기 · 보호(브레인 지시대로 자리만). [확인] 누를 때 서식 명령 하나(+ 병합 바뀌면 병합·병합풀기)로 나감 — 도구 모음처럼 바로 안 바꿈. 표시 형식 코드 짓기는 DOM 없는 별도 파일(spreadsheet_format_code.ts)로 빼서 시험 가능하게 함 (대화상자 자체는 이 저장소에 jsdom 이 없어 단위 시험 밖 — Ctrl+1 을 이은 뒤 ORCA 로 확인할 것). Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01K7JS47SacjPxZ718QsZKyr
This commit is contained in:
@@ -0,0 +1,58 @@
|
||||
/* =============================================================================
|
||||
* spreadsheet_format_code.ts (2단계 · 주인 sub_laptop_1)
|
||||
* 셀 서식 대화상자(표시 형식 탭)의 범주 → 형식 코드 짓기 — DOM · CSS 없음(시험이 바로 부름).
|
||||
* 실무 자주 쓰는 모양만(일반 · 숫자 · 통화 · 회계 · 백분율 · 텍스트 · 사용자 지정).
|
||||
* ========================================================================== */
|
||||
|
||||
export const CATEGORIES = [
|
||||
"일반",
|
||||
"숫자",
|
||||
"통화",
|
||||
"회계",
|
||||
"백분율",
|
||||
"텍스트",
|
||||
"사용자 지정",
|
||||
] as const;
|
||||
export type Category = (typeof CATEGORIES)[number];
|
||||
export type NegStyle = "minus" | "paren" | "red-minus" | "red-paren";
|
||||
|
||||
/** 범주 · 소수 자릿수 · 천단위 · 음수 표시로 형식 코드를 지음. */
|
||||
export function buildCode(
|
||||
cat: Category,
|
||||
decimals: number,
|
||||
thousands: boolean,
|
||||
neg: NegStyle,
|
||||
): string {
|
||||
if (cat === "일반") return "";
|
||||
if (cat === "텍스트") return "@";
|
||||
const digits = decimals > 0 ? `0.${"0".repeat(decimals)}` : "0";
|
||||
const grouped = thousands ? `#,##${digits}` : digits;
|
||||
if (cat === "백분율") return `${grouped}%`;
|
||||
const prefix = cat === "통화" ? '"₩"' : "";
|
||||
const positive = `${prefix}${grouped}`;
|
||||
if (cat === "회계") {
|
||||
const acc = decimals > 0 ? "0.00" : "0";
|
||||
return `_-* #,##${acc}_-;-* #,##${acc}_-;_-* "-"_-;_-@_-`;
|
||||
}
|
||||
switch (neg) {
|
||||
case "minus":
|
||||
return positive;
|
||||
case "paren":
|
||||
return `${positive};(${positive})`;
|
||||
case "red-minus":
|
||||
return `${positive};[Red]-${positive}`;
|
||||
case "red-paren":
|
||||
return `${positive};[Red](${positive})`;
|
||||
}
|
||||
}
|
||||
|
||||
/** 있는 형식 코드를 보고 범주를 어림(대화상자를 열 때 초기 범주 고르기). */
|
||||
export function guessCategory(code: string | undefined): Category {
|
||||
if (!code) return "일반";
|
||||
if (code === "@") return "텍스트";
|
||||
if (code.includes("%")) return "백분율";
|
||||
if (code.includes("_-*")) return "회계";
|
||||
if (code.includes("₩")) return "통화";
|
||||
if (/[0#]/.test(code)) return "숫자";
|
||||
return "사용자 지정";
|
||||
}
|
||||
Reference in New Issue
Block a user