fix(spreadsheet): 엑셀 회계 숫자 형식 끝 역슬래시 남던 것 고침

- 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 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AeeQRLknEpP4SFjVkjDWDs
This commit is contained in:
2026-09-28 13:35:18 +09:00
co-authored by Claude Sonnet 5
parent 91cc795102
commit e0f9df9ba9
2 changed files with 32 additions and 1 deletions
@@ -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(/(?<!\\);/);
}
/** 엑셀 · 구글이 `td style="..."` 에 싣는 인라인 서식 → `CellStyle`(읽을 것 없으면 undefined). */
function parseStyleAttr(styleAttr: string): Record<string, string> {
const out: Record<string, string> = {};
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();
@@ -0,0 +1,24 @@
<!-- fixture_excel_accounting_fmt.html — 사용자 실제 저장본(material/rv.json)에서 형식 끝에 역슬래시가
남던 흠 재현(브레인 9-28 두 번째 지시). 엑셀 회계 형식은 구역이 넷(양수·음수·0·글자)이라 CSS 로
내보낼 때 구역 나눔 `;` 도 `\;` 로 이스케이프됨 — 선언을 단순히 `;` 로 나누면 이 `\;` 에서 잘려
값 끝에 `\` 만 남고 뒤 구역이 통째로 날아감. `parseStyleAttr`(=`splitDecls`)가 이스케이프된
`;` 를 진짜 선언 나눔과 구별하는지 이 견본으로 시험(실제 엑셀처럼 <style> 클래스에 담음 —
인라인 style 속성에 겹따옴표 낀 값을 두면 prettier 가 CSS 로 다시 찍으며 따옴표 얼개를 바꿔
이 흠 재현 자체가 깨짐). -->
<html>
<head>
<style>
<!--.xl_acct
{mso-number-format:"_-* \#\,\#\#0\.00_-\;\-* \#\,\#\#0\.00_-\;_-* \"-\"??_-\;_-@_-";
text-align:right;}
-->
</style>
</head>
<body>
<table>
<tr>
<td class="xl_acct" x:num>1234.5</td>
</tr>
</table>
</body>
</html>