Files
Aislo/resources/tester/spreadsheet/test_spreadsheet_clipboard_text.mjs
T
eomsangdon bfd7123829 feat(spreadsheet): E 도구 모음 · 시트 탭 · 우클릭 메뉴 · 클립보드 구현
- 도구 모음: 글꼴 · 크기 · 굵게 · 기울임 · 밑줄 · 취소선 · 글자색 · 채움색 · 가로/세로 정렬 · 줄 바꿈 · 병합 · 테두리 · 숫자 형식 · 되돌리기
- 시트 탭: 더하기 · 이름 바꾸기 · 지우기 · 복사 · 끌어 옮기기
- 우클릭 메뉴: 칸 · 행 머리 · 열 머리별 명령(공용 `ui_template_context_menu` 재사용)
- 클립보드: 안 → 안 서식 · 병합 · 수식 상대 이동 왕복 · 밖 → 안(엑셀 값 + 「수식 표시」 · 구글 R1C1) · 안 → 밖(TSV + 인라인 서식 HTML)
- E 화면 시험 틀(A · B 몫 가짜 대역) · TSV 파싱 Node 시험 추가
2026-09-27 20:33:26 +09:00

64 lines
2.2 KiB
JavaScript

/* spreadsheet_clipboard.ts 의 TSV(밖 → 안, DOM 없이 되는 부분)만 — 값 · 참거짓 · 「엑셀 수식
표시」 식 잡기(끝수 · 「=」 한 글자는 글). HTML(DOMParser) 쪽은 ORCA 화면 시험으로.
진짜 앱 별칭(`@ui` 등)까지 그대로 vite 로 번들해 Node 로 돌린다(`build:formula` 방식) —
A(주소) · B(형식) 는 부르지 않는 길만 시험하므로 0 계약 몸(던짐)이어도 됨. */
import assert from "node:assert/strict";
import { execFileSync } from "node:child_process";
import { mkdtempSync } from "node:fs";
import { tmpdir } from "node:os";
import { join } from "node:path";
import { pathToFileURL } from "node:url";
const out = mkdtempSync(join(tmpdir(), "aislo-ss-clip-"));
execFileSync(
process.execPath,
[
"./config/node_modules/vite/bin/vite.js",
"build",
"--configLoader",
"runner",
"--ssr",
"spreadsheet/spreadsheet_clipboard.ts",
"--outDir",
out,
],
{ stdio: "inherit" },
);
const { parseClipboard } = await import(pathToFileURL(join(out, "spreadsheet_clipboard.js")).href);
const at = { r: 0, c: 0 };
// 값 · 참거짓 잡기
{
const block = parseClipboard("", "10\t20\nTRUE\t3.5", at);
assert.equal(block.rows, 2);
assert.equal(block.cols, 2);
assert.deepEqual(block.칸["0,0"], { 값: 10 });
assert.deepEqual(block.칸["1,0"], { 값: true });
assert.deepEqual(block.칸["1,1"], { 값: 3.5 });
assert.equal(block.출처, "text");
assert.equal(block.원점, null);
}
// 「=」 뒤에 글이 있으면 식 · 한 글자 「=」 는 글(엑셀 「수식 표시」 대응)
{
const block = parseClipboard("", "=SUM(A1:A2)\t=", at);
assert.deepEqual(block.칸["0,0"], { 식: "SUM(A1:A2)" });
assert.deepEqual(block.칸["0,1"], { 값: "=" });
}
// 빈 칸은 안 적음(성긴 모양) · 끝 빈 줄 버림
{
const block = parseClipboard("", "a\t\tb\n\n", at);
assert.equal(Object.keys(block.칸).length, 2);
assert.equal(block.rows, 1);
assert.equal(block.cols, 3);
}
// 읽을 것 없으면 null
{
assert.equal(parseClipboard("", "", at), null);
}
console.log("OK — 클립보드 TSV 값 · 참거짓 · 「수식 표시」 식 잡기");