From e0f9df9ba922d42965256df77a88e288ae08438d Mon Sep 17 00:00:00 2001 From: umsangdon Date: Mon, 28 Sep 2026 13:35:18 +0900 Subject: [PATCH] =?UTF-8?q?fix(spreadsheet):=20=EC=97=91=EC=85=80=20?= =?UTF-8?q?=ED=9A=8C=EA=B3=84=20=EC=88=AB=EC=9E=90=20=ED=98=95=EC=8B=9D=20?= =?UTF-8?q?=EB=81=9D=20=EC=97=AD=EC=8A=AC=EB=9E=98=EC=8B=9C=20=EB=82=A8?= =?UTF-8?q?=EB=8D=98=20=EA=B2=83=20=EA=B3=A0=EC=B9=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - mso-number-format 처럼 값 안에 이스케이프된 `\;`(구역 나눔 자리표시, 회계·통화 형식처럼 구역이 여럿인 형식에 흔함)를 선언 나눔 `parseStyleAttr` 가 진짜 `;` 로 착각해 값을 그 자리서 잘라 버리던 것 고침 — `\` 뒤 글자는 통째로 건너뛰고 이스케이프 안 된 `;` 에서만 나누는 `splitDecls` 로 바꿈 - 잘리면 값 끝에 역슬래시 하나만 남고 뒤 구역이 통째로 날아가던 것(사용자 저장본 material/rv.json 서식 형식 끝 '\' 로 나타남)이었음 — 고친 뒤 4구역 회계 형식 (양수·음수·0·글자)이 통째로 살아 들어옴 - resources/tester/spreadsheet/fixture_excel_accounting_fmt.html 새 견본으로 ORCA 실 엔진 확인 — 형식이 `_-* #,##0.00_-;-* #,##0.00_-;_-* "-"??_-;_-@_-` 로 온전히 들어옴(역슬래시 없음), 기존 fixture_excel_style_paste.html 회귀 없음 확인 - 수식 흔적(x:fmla) 확인 — 기존 견본엔 x:str/x:num 만 있고 x:fmla 없음(수식 칸도 x:str 이 `=...` 글 그대로 담아 기존 「=」 앞머리 잡기로 이미 됨). 사용자 실제 클립보드 견본(main_desktop_1)은 아직 안 옴 — 오면 그걸로 다시 봄 Co-Authored-By: Claude Sonnet 5 Claude-Session: https://claude.ai/code/session_01AeeQRLknEpP4SFjVkjDWDs --- .../spreadsheet/spreadsheet_clipboard.ts | 9 ++++++- .../fixture_excel_accounting_fmt.html | 24 +++++++++++++++++++ 2 files changed, 32 insertions(+), 1 deletion(-) create mode 100644 resources/tester/spreadsheet/fixture_excel_accounting_fmt.html diff --git a/A00_Common/spreadsheet/spreadsheet_clipboard.ts b/A00_Common/spreadsheet/spreadsheet_clipboard.ts index 2c03858b..06c25067 100644 --- a/A00_Common/spreadsheet/spreadsheet_clipboard.ts +++ b/A00_Common/spreadsheet/spreadsheet_clipboard.ts @@ -219,10 +219,17 @@ function walkTable(table: HTMLTableElement): TableWalk { return { rows: rows.length, cols, owner, merges }; } +/** 선언 나눔 — `mso-number-format:"...\;..."` 안 이스케이프된 `\;`(구역 나눔 자리표시)는 진짜 + * 선언 끝이 아님(엑셀 회계 형식처럼 구역이 여럿인 값을 여기서 잘라 버리면 값 끝에 떨어진 `\` 만 + * 남아 형식이 깨짐) — `\` 뒤 글자는 통째로 건너뛰어 그 안 `;` 는 안 자름. */ +function splitDecls(s: string): string[] { + return s.split(/(? { const out: Record = {}; - for (const decl of styleAttr.split(";")) { + for (const decl of splitDecls(styleAttr)) { const i = decl.indexOf(":"); if (i < 0) continue; const key = decl.slice(0, i).trim().toLowerCase(); diff --git a/resources/tester/spreadsheet/fixture_excel_accounting_fmt.html b/resources/tester/spreadsheet/fixture_excel_accounting_fmt.html new file mode 100644 index 00000000..a186afc3 --- /dev/null +++ b/resources/tester/spreadsheet/fixture_excel_accounting_fmt.html @@ -0,0 +1,24 @@ + + + + + + + + + + +
1234.5
+ +