크라우니워드프로세서 기초도구 — 메일머지
개요
크라우니워드프로세서 기초도구 시리즈의 "메일머지"(편지병합) 도메인을 완전 한선씨(hanseonc_high)로 작성. 템플릿
{{필드}} 자리표시자 + PSV(파이프구분) 데이터를 병합해 개인화 문서를 대량 생성하는 기능 일체.
무엇을 했는지
파일: /Users/ef/crowny-word/도구/메일머지.한선 (자기완결, 가져오기 없음)
함수 명세 10개 전부 구현 + 내부 헬퍼 4개(나누기/합치기/찾기부분/배열찾기) + 지원 헬퍼 3개(헤더배열가져오기/행필드가져오기/필드값찾기/기본값찾기):
템플릿필드추출 — {{필드}} 자리표시자 스캔, {{#if}}/{{/if}} 제어태그 제외, 중복제거
PSV데이터파싱 — 헤더+행 텍스트 → 빈줄제거 줄배열(줄배열[0]=헤더)
매핑검증 — 템플릿 필드 전부가 PSV 헤더에 존재하는지 확인("유효"/"누락:필드1,필드2")
병합1건 — 조건필드 해소 → 자리표시자 치환(인라인기본값 우선 → 기본값테이블 → 빈문자열)
병합전부 — 전체 데이터행 일괄 병합
조건필드 — {{#if 필드}}...{{/if}} 기초 조건블록(값이 비었거나 "0"/"거짓"이면 블록 제거)
누락기본값 — 값 비었을 때 기본값테이블("필드1:값1|필드2:값2")에서 대체값 조회
미리보기 — 최대건수만큼만 병합, "\n---\n" 구분선으로 이어붙임
병합저장 — flat 파일명(/tmp/<접두사>_<순번>.txt)으로 저장, 동적 서브디렉 없음
병합통계 — "총레코드:N|필드수:K|성공:M" 통계 문자열
데이터 모델: PSV 원문(줄바꿈 구분 행, | 구분 필드). 템플릿 자리표시자는 {{필드}} 또는 {{필드:인라인기본값}}.
이식: 서식런.한선/각주미주.한선/수식표현.한선의 나누기/콜론위치찾기류 관용구를 일반화한 찾기부분(문자열,시작,패턴)(다중문자 탐색)으로 재구성해 이 파일에 재이식.검증
cd /Users/ef/CrownyOS/crownyc
./hanseonc_high /Users/ef/crowny-word/도구/메일머지.한선 > /tmp/메일머지.toau 2>/tmp/메일머지.err
./crownyc run /tmp/메일머지.toau
결과:
검사: PASS 32/32 (1차 컴파일·1차 실행에서 전체 통과, 재수정 불필요).
관련 파일
/Users/ef/crowny-word/도구/메일머지.한선 (신규)
- 참고 이식원:
/Users/ef/crowny-word/도구/서식런.한선, /Users/ef/crowny-word/도구/각주미주.한선, /Users/ef/crowny-word/도구/수식표현.한선
크라우니코드
learn.sh search "메일머지" / "템플릿 필드 치환" / "PSV 파싱" / "구분자 분리" → 전부 MISS(학습DB·패턴DB 무매칭)
- 작성 후
learn.sh add 4건(템플릿필드추출/조건필드/병합1건/PSV파싱+병합저장) — 앞 3건은 PostToolUse 훅이 Write 시점에 이미 자동학습(중복 스킵), 1건은 신규 등록됨. search "메일머지" 재조회로 fn_메일머지_* 등재 확인.
잔여 이슈
- PSV 필드 값에
"|"나 개행이 들어가면 파싱이 깨짐(이스케이프 미구현) — 문서파일.한선/각주미주.한선과 동일한 "구분자와 겹치는 문자는 필드에 안 넣는다" 관례로 문서화만 해둠.
- 조건블록은 중첩·else 없는 기초형만 지원(명세 그대로, "기초"로 한정).
- 병합저장은 저장 성공 여부를 파일 존재 확인 없이 반환(쓰기() 실패 시에도 카운트 증가) — 필요 시 읽기() 재확인 가드 추가 가능.