← 목록
기타 2026-07-12 4KB 읽기 3분

크라우니워드프로세서 기초도구 — 목차생성.한선

개요

크라우니워드프로세서 기초도구 시리즈의 "목차생성" 도메인을 완전 한선씨로 작성. 문단(줄)+스타일 배열에서 제목을 수집해 들여쓰기+점선+페이지번호 형식의 목차 텍스트를 생성하고, 역으로 파싱·갱신·검증까지 지원.

무엇을 했는지

  • 파일: /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/도구/문단배치.한선

    잔여 이슈

    • 목차항목 텍스트에 파이프(|) 문자가 들어가면 필드 파싱이 깨짐 — 이스케이프 미구현(범위 밖으로 명기).
    • 레벨필터는 "최대레벨 이하"(<=) 의미로 구현 — 특정 레벨만 정확히 뽑는 요구가 있으면 별도 함수 필요.
    • 문단배열/스타일배열 길이가 다르면 제목수집이 인덱스 초과로 실패할 수 있음(같은 길이 가정, 가드 없음).