- 추적 화살표(spreadsheet_trace.ts): 누를 때마다 한 단계 · 범위는 상자 · 오류 칸 화살 빨강 · 다른 시트 점선 · 지우기 - 수식 계산 창(spreadsheet_eval_steps.ts): 왼쪽부터 한 마디씩 값으로 · 밑줄 · IF 류 첫 인자만 먼저 · 값은 엔진 풀이 - 오류 검사(spreadsheet_errcheck.ts): 순환 · 식 오류 · 숫자처럼 보이는 글 까닭 · ⚠ 메뉴(숫자로 변환 · 계산 단계 · 선행 추적 · 오류 무시) - 격자 초록 세모는 C(sub6) · 잇기는 sub7 — 머리 주석에 잇는 법 - 엔진: evalSafe 내보냄 · formulaToText 에 갈음 · 밑줄 자리 · 계약 파일 목록 줄만 더함 - 시험: test_spreadsheet_analysis.py(3 묶음) · harness_analysis(ORCA) · 시험 틀은 inspect 로 문맥 꺼냄 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01TULoa94ZFL26KU6ZqVpjkF
73 lines
2.4 KiB
TypeScript
73 lines
2.4 KiB
TypeScript
/* 수식 분석 화면 시험 틀 — 진짜 부품(createSpreadsheet)에 추적 화살 · 수식 계산 창 · 오류 ⚠ 를 붙임.
|
|
* sub7 잇기 전이라 `inspect` 로 문맥(ctx)을 꺼내고, grid.render 뒤 refresh 를 부름.
|
|
* 번들: node harness_analysis_bundle.cjs → tmp/spreadsheet_analysis/harness.js (git 밖) */
|
|
import { createSpreadsheet } from "../../../A00_Common/spreadsheet/spreadsheet";
|
|
import { attachTrace } from "../../../A00_Common/spreadsheet/spreadsheet_trace";
|
|
import { openEvalSteps } from "../../../A00_Common/spreadsheet/spreadsheet_eval_steps";
|
|
import { attachErrorTip } from "../../../A00_Common/spreadsheet/spreadsheet_errcheck";
|
|
import type { SpreadsheetContext } from "../../../A00_Common/spreadsheet/spreadsheet_view_types";
|
|
import type { Workbook } from "../../../A00_Common/spreadsheet/spreadsheet_types";
|
|
|
|
const w = window as unknown as Record<string, unknown>;
|
|
|
|
const book: Workbook = {
|
|
종류: "통합문서",
|
|
판: 1,
|
|
이름: "harness",
|
|
서식: [{}],
|
|
시트: [
|
|
{
|
|
id: "s1",
|
|
이름: "분석",
|
|
칸: {
|
|
A1: { 값: "단가" },
|
|
B1: { 값: "수량" },
|
|
C1: { 값: "금액" },
|
|
A2: { 값: 1200 },
|
|
B2: { 값: 3 },
|
|
C2: { 식: "A2*B2" },
|
|
A3: { 값: 800 },
|
|
B3: { 값: "5" },
|
|
C3: { 식: "A3*B3" },
|
|
A4: { 값: 50 },
|
|
B4: { 값: 0 },
|
|
C4: { 식: "A4/B4" },
|
|
C6: { 식: "SUM(C2:C3)+IF(B2>2,C2*10%,0)" },
|
|
D6: { 식: "C6*2" },
|
|
E2: { 식: "E3+1" },
|
|
E3: { 식: "E2+1" },
|
|
},
|
|
},
|
|
{ id: "s2", 이름: "요약", 칸: { A1: { 식: "분석!D6" } } },
|
|
],
|
|
활성: "s1",
|
|
};
|
|
|
|
const host = document.getElementById("host")!;
|
|
w.ss = createSpreadsheet(host, book, { inspect: true });
|
|
const c = w.__aisloSheet as SpreadsheetContext;
|
|
const trace = attachTrace(c);
|
|
const tip = attachErrorTip(c, trace);
|
|
const render = c.grid.render.bind(c.grid);
|
|
c.grid.render = () => {
|
|
render();
|
|
trace.refresh();
|
|
tip.refresh();
|
|
};
|
|
const renderSel = c.grid.renderSelection.bind(c.grid);
|
|
c.grid.renderSelection = () => {
|
|
renderSel();
|
|
tip.refresh();
|
|
};
|
|
w.ssCtx = c;
|
|
w.ssTrace = trace;
|
|
w.ssTip = tip;
|
|
w.ssSteps = () => openEvalSteps(c);
|
|
for (const [id, run] of [
|
|
["btn-prec", () => trace.precedents()],
|
|
["btn-dep", () => trace.dependents()],
|
|
["btn-clear", () => trace.clear()],
|
|
["btn-steps", () => openEvalSteps(c)],
|
|
] as const)
|
|
document.getElementById(id)!.addEventListener("click", run);
|