크라우니워드프로세서 기초도구 — 목차생성.한선
개요
크라우니워드프로세서 기초도구 시리즈의 "목차생성" 도메인을 완전 한선씨로 작성.
문단(줄)+스타일 배열에서 제목을 수집해 들여쓰기+점선+페이지번호 형식의 목차 텍스트를
생성하고, 역으로 파싱·갱신·검증까지 지원.
무엇을 했는지
파일: /Users/ef/crowny-word/도구/목차생성.한선
데이터 표현:
문단배열/스타일배열: 같은 인덱스로 병렬(스타일="제목N[,기타토큰]" 또는 "본문")
목차항목: "레벨|텍스트|줄번호" 파이프 구분 직렬화 문자열 (텍스트에 | 미지원 — 이스케이프 없음, word-processor 헤딩 관례상 안전 가정)
항목들: 항목 문자열 배열, 직렬화()로 ; 결합
공개 함수 10종(명세) + 신규 헬퍼(배열복사·정수내림나눗셈·레벨추출·항목필드/레벨/텍스트/줄·들여쓰기·앞공백수·목차파싱줄) + 이식 헬퍼(나누기·합치기 ← 서식런.한선, 줄분할 ← 문서파일.한선, 글자폭·표시폭 ← 문단배치.한선)
1. 제목수집(문단배열,스타일배열) — 제목 스타일(레벨>0)만 수집
2. 점선채움(좌측,우측,총폭) — 표시폭 기준 "." 채움(최소1점 클램프)
3. 줄페이지변환(줄번호,줄당페이지수) — floor(줄/줄당)+1
4. 목차텍스트(항목들,총폭,줄당페이지수) — 들여쓰기+점선+페이지 줄 조립
5. 레벨필터(항목들,최대레벨) — 표시 깊이 제한
6. 목차갱신(문단배열,스타일배열,기존직렬화) — 재수집 비교,
"변경여부|새직렬화" 반환
7. 목차파싱(목차텍스트문자열) — 목차텍스트()의 역,
"레벨|텍스트|페이지" 추출
8. 빈제목검증(항목들) — 빈 텍스트 개수(0=전부유효)
9. 직렬화/역직렬화(항목들↔문자열)
10. 항목개수(항목들)
- 자체시험 40개 assert, 전부 PASS (
검사: PASS 40/40)
- 크라우니코드: lookup MISS 5/5(개별 intent 조회) + search 2건(웹코드보고서 목차=HTML/GUI 도메인, 데이터모델 불일치로 재사용 안 함) → 전부 신규생성, learn add 5건(목차텍스트생성·점선채움폭맞춤·정수내림나눗셈floor·제목수집레벨텍스트줄·배열복사참조형함정회피)
실측 함정 (이번 세션 재현)
- 배열 참조형 함정 재확인:
추가(항목들B, "1||10")처럼 이미 존재하는 배열을 인자로 넘겨 추가()를 호출하면 원본 배열(항목들B) 자체가 제자리변경되어 이후 테스트(레벨필터 개수·목차갱신 비교)가 오염됨. 해결: 배열복사(arr) 헬퍼(꺼내()로 읽기전용 순회 후 새 []에 추가)로 완전히 분리된 새 배열을 만든 뒤에만 추가 조작. → ~/.claude/CLAUDE.md의 "배열은 참조형(변수 b=a는 별칭)" 항목에 실사례로 추가 학습(learn add 완료).
- 나눗셈 자연반올림 우회:
줄페이지변환은 VM 나눗셈이 반올림(내림 아님)이라 정수내림나눗셈(a,b)(q=a/b; q*b>a면 q=q-1) 보정 필수. 7/4, 9/4, 3/4 등 케이스로 자체시험 검증.
관련 파일
/Users/ef/crowny-word/도구/목차생성.한선 (신규 작성)
- 이식 원본(읽기만, 미수정):
/Users/ef/crowny-word/도구/서식런.한선, /Users/ef/crowny-word/도구/문서파일.한선, /Users/ef/crowny-word/도구/문단배치.한선
잔여 이슈
- 목차항목 텍스트에 파이프(
|) 문자가 들어가면 필드 파싱이 깨짐 — 이스케이프 미구현(범위 밖으로 명기).
- 레벨필터는 "최대레벨 이하"(
<=) 의미로 구현 — 특정 레벨만 정확히 뽑는 요구가 있으면 별도 함수 필요.
- 문단배열/스타일배열 길이가 다르면
제목수집이 인덱스 초과로 실패할 수 있음(같은 길이 가정, 가드 없음).