- 도구 모음: 글꼴 · 크기 · 굵게 · 기울임 · 밑줄 · 취소선 · 글자색 · 채움색 · 가로/세로 정렬 · 줄 바꿈 · 병합 · 테두리 · 숫자 형식 · 되돌리기 - 시트 탭: 더하기 · 이름 바꾸기 · 지우기 · 복사 · 끌어 옮기기 - 우클릭 메뉴: 칸 · 행 머리 · 열 머리별 명령(공용 `ui_template_context_menu` 재사용) - 클립보드: 안 → 안 서식 · 병합 · 수식 상대 이동 왕복 · 밖 → 안(엑셀 값 + 「수식 표시」 · 구글 R1C1) · 안 → 밖(TSV + 인라인 서식 HTML) - E 화면 시험 틀(A · B 몫 가짜 대역) · TSV 파싱 Node 시험 추가
42 lines
1.6 KiB
TypeScript
42 lines
1.6 KiB
TypeScript
/* =============================================================================
|
|
* fake_refshift.ts — E 시험 전용 가짜(A 몫 `spreadsheet_refshift.ts` 대역).
|
|
* 클립보드 붙여넣기 시험이 상대 참조 옮김 · 구글 R1C1 을 확인할 수 있도록 아주 단순히 흉내.
|
|
* ========================================================================== */
|
|
|
|
import { colIndex, colName } from "./fake_address";
|
|
import type { CellAddress } from "../../../../A00_Common/spreadsheet/spreadsheet_types";
|
|
|
|
/** 복사 · 붙여넣기 — `$` 없는 A1 참조만 (dr, dc) 옮김. */
|
|
export function moveFormula(formula: string, dr: number, dc: number): string {
|
|
return formula.replace(/(\$?)([A-Za-z]{1,3})(\$?)(\d+)/g, (_m, absCol, col, absRow, row) => {
|
|
let c = colIndex(col);
|
|
let r = Number(row) - 1;
|
|
if (!absCol) c += dc;
|
|
if (!absRow) r += dr;
|
|
if (c < 0 || r < 0) return "#REF!";
|
|
return `${absCol}${colName(c)}${absRow}${r + 1}`;
|
|
});
|
|
}
|
|
|
|
/** 구글 `R[0]C[-1]` 꼴 → 붙일 자리(`at`) 기준 A1 식. */
|
|
export function r1c1ToA1(formula: string, at: CellAddress): string {
|
|
return formula.replace(
|
|
/R(\[-?\d+\]|\d+)?C(\[-?\d+\]|\d+)?/g,
|
|
(_m, rp: string | undefined, cp: string | undefined) => {
|
|
const row =
|
|
rp === undefined
|
|
? at.r + 1
|
|
: rp.startsWith("[")
|
|
? at.r + 1 + Number(rp.slice(1, -1))
|
|
: Number(rp);
|
|
const col =
|
|
cp === undefined
|
|
? at.c + 1
|
|
: cp.startsWith("[")
|
|
? at.c + 1 + Number(cp.slice(1, -1))
|
|
: Number(cp);
|
|
return `${colName(col - 1)}${row}`;
|
|
},
|
|
);
|
|
}
|