diff --git a/crates/hwp-model/src/paragraph.rs b/crates/hwp-model/src/paragraph.rs index a9b36de..d633c6f 100644 --- a/crates/hwp-model/src/paragraph.rs +++ b/crates/hwp-model/src/paragraph.rs @@ -33,25 +33,47 @@ pub fn char_kind(code: u16) -> CharKind { } } -/// 잘 알려진 컨트롤 문자 코드. +/// 잘 알려진 컨트롤 문자 코드 (한글문서파일형식 5.0 §3.2.3 표 6 「제어 문자」). +/// +/// 각 상수의 주석은 표 6 해당 행의 설명·컨트롤 형식을 옮긴 것이다. 0~31 중 +/// 여기 없는 코드는 예약(1·5~7·12·14·19~20·25~29)·unusable(0)·title mark(8, +/// 코드베이스 미사용)뿐이며, 분류 전수는 [`char_kind`](super::char_kind)가 다룬다. pub mod ctrl_char { + /// 한 줄 끝(line break) — char (§3.2.3 표 6 코드 10) pub const LINE_BREAK: u16 = 10; + /// 문단 끝(para break) — char (§3.2.3 표 6 코드 13) pub const PARA_BREAK: u16 = 13; + /// 하이픈 — char (§3.2.3 표 6 코드 24) pub const HYPHEN: u16 = 24; - pub const NB_SPACE: u16 = 30; // 묶음 빈칸 - pub const FW_SPACE: u16 = 31; // 고정폭 빈칸 + /// 묶음 빈칸 — char (§3.2.3 표 6 코드 30) + pub const NB_SPACE: u16 = 30; + /// 고정폭 빈칸 — char (§3.2.3 표 6 코드 31) + pub const FW_SPACE: u16 = 31; + /// 필드 끝 — inline (§3.2.3 표 6 코드 4) pub const FIELD_END: u16 = 4; + /// 탭 — inline (§3.2.3 표 6 코드 9) pub const TAB: u16 = 9; - pub const SECTION_COLUMN_DEF: u16 = 2; // 구역/단 정의 + /// 구역 정의/단 정의 — extended (§3.2.3 표 6 코드 2) + pub const SECTION_COLUMN_DEF: u16 = 2; + /// 필드 시작(누름틀·하이퍼링크·블록 책갈피·표 계산식·상호 참조·메모 등) + /// — extended (§3.2.3 표 6 코드 3) pub const FIELD_START: u16 = 3; - pub const OBJECT: u16 = 11; // 그리기 개체/표 + /// 그리기 개체/표 — extended (§3.2.3 표 6 코드 11) + pub const OBJECT: u16 = 11; + /// 숨은 설명 — extended (§3.2.3 표 6 코드 15) pub const HIDDEN_COMMENT: u16 = 15; + /// 머리말/꼬리말 — extended (§3.2.3 표 6 코드 16) pub const HEADER_FOOTER: u16 = 16; + /// 각주/미주 — extended (§3.2.3 표 6 코드 17) pub const FOOTNOTE_ENDNOTE: u16 = 17; + /// 자동번호(각주, 표 등) — extended (§3.2.3 표 6 코드 18) pub const AUTO_NUMBER: u16 = 18; + /// 페이지 컨트롤(감추기, 새 번호로 시작 등) — extended (§3.2.3 표 6 코드 21) pub const PAGE_CONTROL: u16 = 21; + /// 책갈피/찾아보기 표식 — extended (§3.2.3 표 6 코드 22) pub const BOOKMARK: u16 = 22; - pub const OVERLAP: u16 = 23; // 덧말/글자 겹침 + /// 덧말/글자 겹침 — extended (§3.2.3 표 6 코드 23) + pub const OVERLAP: u16 = 23; } /// 문단을 구성하는 문자 하나. diff --git a/docs/design/10-hwp5-structure-map.md b/docs/design/10-hwp5-structure-map.md index 4c13569..ca28016 100644 --- a/docs/design/10-hwp5-structure-map.md +++ b/docs/design/10-hwp5-structure-map.md @@ -258,7 +258,7 @@ GenericControl은 이 평탄화된 `paragraph_lists`를 텍스트 추출에만 PARA_TEXT의 WCHAR 배열을 소비할 때 **코드 0~31의 분류가 위치 산수의 기준**이다. 8 WCHAR 컨트롤을 하나라도 잘못 세면 이후 모든 위치 계산(`nchars == Σ wchar_width`)이 어긋난다. 분류의 단일 진실은 -`char_kind`(`paragraph.rs:27`)이며, 이름은 `ctrl_char` 모듈(`paragraph.rs:37`), 텍스트 추출 처리는 +`char_kind`(`paragraph.rs:27`)이며, 이름은 `ctrl_char` 모듈(`paragraph.rs:41`), 텍스트 추출 처리는 `text.rs:44`가 담당한다. 스펙 근거는 **§3.2.3 본문의 표 6(제어 문자)**이다(코드 주석의 §4.2.4, 이 문서 구판의 §4.3.2 표기는 모두 오기 — Phase 2 감사 C7·C8에서 확정, 2026-07-18). @@ -272,7 +272,7 @@ PARA_TEXT의 WCHAR 배열을 소비할 때 **코드 0~31의 분류가 위치 산 | 5 | Inline | 8 | 예약 | 버림 | | 6 | Inline | 8 | 예약 | 버림 | | 7 | Inline | 8 | 예약 | 버림 | -| 8 | Inline | 8 | 예약(제목 표시 등) | 버림 | +| 8 | Inline | 8 | title mark(제목 표시) | 버림 | | 9 | Inline | 8 | 탭 | `\t` | | 10 | Char | 1 | 줄 나눔 | `\n` | | 11 | Extended | 8 | 그리기 개체/표 (gso/tbl) | Table/Picture/Generic |