Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
34 changes: 28 additions & 6 deletions crates/hwp-model/src/paragraph.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}

/// 문단을 구성하는 문자 하나.
Expand Down
4 changes: 2 additions & 2 deletions docs/design/10-hwp5-structure-map.md
Original file line number Diff line number Diff line change
Expand Up @@ -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).

Expand All @@ -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 |
Expand Down
Loading