Skip to content

Commit 2dc95a9

Browse files
wkdgus1164claude
andcommitted
docs: 전체 문서 말투 통일 및 마크다운 렌더링 수정
es-toolkit 스타일의 친근한 존댓말(~예요/~해요)로 전체 문서 통일. adding-formats.md에서 리스트 앞 빈 줄 누락으로 렌더링이 깨지던 문제 수정. architecture.md 제목 한글화. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
1 parent edfc23f commit 2dc95a9

10 files changed

Lines changed: 87 additions & 58 deletions

File tree

docs/adding-formats.md

Lines changed: 25 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
1-
# Adding New Formats
1+
# 포맷 확장 가이드
22

3-
새 입력 포맷(Parser)이나 출력 포맷(Writer)을 추가하는 가이드.
3+
새 입력 포맷(Parser)이나 출력 포맷(Writer)을 추가하는 방법을 안내해요.
44

55
## 새 Parser 추가
66

77
### 1. 파서 패키지 생성
88

9-
`src/ureca_document_parser/` 아래에 확장자명 디렉토리를 만들고 `parser.py`생성한다.
9+
`src/ureca_document_parser/` 아래에 확장자명 디렉토리를 만들고 `parser.py`생성하세요.
1010

1111
```python
1212
# src/ureca_document_parser/pdf/parser.py
@@ -46,7 +46,7 @@ class PdfParser:
4646
return parse_pdf(filepath)
4747
```
4848

49-
`__init__.py`에서 re-export한다:
49+
`__init__.py`에서 re-export해 주세요.
5050

5151
```python
5252
# src/ureca_document_parser/pdf/__init__.py
@@ -55,14 +55,15 @@ from .parser import PdfParser
5555
__all__ = ["PdfParser"]
5656
```
5757

58-
핵심 규칙:
59-
- `protocols.py``Parser` Protocol 시그니처를 따른다
60-
- `models.py``Document`를 반환한다
61-
- 선택적 의존성은 **함수 내부에서 lazy import**한다
58+
핵심 규칙은 다음과 같아요.
59+
60+
- `protocols.py``Parser` Protocol 시그니처를 따라야 해요
61+
- `models.py``Document`를 반환해야 해요
62+
- 선택적 의존성은 **함수 내부에서 lazy import**해야 해요
6263

6364
### 2. 레지스트리에 등록
6465

65-
`src/ureca_document_parser/registry.py``_auto_register()` 함수에 추가한다.
66+
`src/ureca_document_parser/registry.py``_auto_register()` 함수에 추가하세요.
6667

6768
```python
6869
def _auto_register(registry: FormatRegistry) -> None:
@@ -75,7 +76,7 @@ def _auto_register(registry: FormatRegistry) -> None:
7576
pass # pymupdf 미설치 시 건너뜀
7677
```
7778

78-
### 3. (선택) pyproject.toml에 optional dependency 추가
79+
### 3. pyproject.toml에 optional dependency 추가 (선택)
7980

8081
```toml
8182
[project.optional-dependencies]
@@ -85,12 +86,14 @@ all = ["ureca_document_parser[pdf,ocr]"] # all에도 추가
8586

8687
### 완료
8788

88-
이제 다음이 자동으로 동작한다:
89+
이제 다음이 자동으로 동작해요.
8990

9091
```python
9192
from ureca_document_parser import get_registry
9293
doc = get_registry().parse("document.pdf")
94+
```
9395

96+
```bash
9497
# CLI
9598
ureca_document_parser document.pdf -o output.md
9699
```
@@ -101,7 +104,7 @@ ureca_document_parser document.pdf -o output.md
101104

102105
### 1. Writer 모듈 생성
103106

104-
`src/ureca_document_parser/writers/` 아래에 새 파일을 만든다.
107+
`src/ureca_document_parser/writers/` 아래에 새 파일을 만드세요.
105108

106109
```python
107110
# src/ureca_document_parser/writers/html.py
@@ -164,10 +167,14 @@ except ImportError:
164167

165168
### 완료
166169

170+
이제 다음이 자동으로 동작해요.
171+
167172
```python
168173
from ureca_document_parser import get_registry
169174
md = get_registry().write(doc, "html")
175+
```
170176

177+
```bash
171178
# CLI
172179
ureca_document_parser document.hwp -f html -o output.html
173180
```
@@ -176,10 +183,10 @@ ureca_document_parser document.hwp -f html -o output.html
176183

177184
## 체크리스트
178185

179-
포맷 추가 시 확인 사항:
186+
포맷을 추가할 때 다음 사항을 확인하세요.
180187

181-
- [ ] Protocol 시그니처와 호환되는 클래스 작성
182-
- [ ] `models.py``Document`사용하여 입출력
183-
- [ ] `registry.py:_auto_register()``try/except ImportError`등록
184-
- [ ] 선택적 의존성은 `pyproject.toml``[project.optional-dependencies]`추가
185-
- [ ] lazy import 사용 (함수 내부에서 import)
188+
- [ ] Protocol 시그니처와 호환되는 클래스를 작성했나요?
189+
- [ ] `models.py``Document`사용해서 입출력하나요?
190+
- [ ] `registry.py``_auto_register()``try/except ImportError`등록했나요?
191+
- [ ] 선택적 의존성을 `pyproject.toml``[project.optional-dependencies]`추가했나요?
192+
- [ ] lazy import를 사용하고 있나요? (함수 내부에서 import)

docs/api/index.md

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
11
# API 레퍼런스
22

3-
`ureca_document_parser`의 공개 API 문서입니다.
3+
`ureca_document_parser`의 공개 API 문서예요.
44

55
## 모듈 구조
66

77
| 모듈 | 설명 |
88
|------|------|
9-
| [`ureca_document_parser.models`](models.md) | Document 모델 — 파서와 Writer의 공유 데이터 구조 |
10-
| [`ureca_document_parser.hwp`](parsers.md#hwp) | HWP v5 바이너리 파서 |
11-
| [`ureca_document_parser.hwpx`](parsers.md#hwpx) | HWPX (ZIP+XML) 파서 |
9+
| [`ureca_document_parser.models`](models.md) | Document 모델 — 파서와 Writer가 공유하는 데이터 구조 |
10+
| [`ureca_document_parser.hwp`](parsers.md#hwp-파서) | HWP v5 바이너리 파서 |
11+
| [`ureca_document_parser.hwpx`](parsers.md#hwpx-파서) | HWPX (ZIP+XML) 파서 |
1212
| [`ureca_document_parser.writers.markdown`](writers.md) | Markdown Writer |
1313
| [`ureca_document_parser.registry`](registry.md) | FormatRegistry — 파서/Writer 자동 라우팅 |
1414

docs/api/models.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# Document 모델
22

3-
파서와 Writer가 공유하는 중간 표현(IR) 데이터 모델입니다. 모든 파서는 `Document`를 생산하고, 모든 Writer는 `Document`소비합니다.
3+
파서와 Writer가 공유하는 중간 표현(IR) 데이터 모델이에요. 모든 파서는 `Document`를 생산하고, 모든 Writer는 `Document`소비해요.
44

55
```
66
Document

docs/api/parsers.md

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
# 파서 (HWP / HWPX)
22

3-
문서 파일을 읽어 [`Document`](models.md) 모델로 변환하는 파서입니다.
3+
문서 파일을 읽어 [`Document`](models.md) 모델로 변환하는 파서예요.
44

5-
모든 파서는 [`Parser` Protocol](registry.md)구현합니다.
5+
모든 파서는 [`Parser` Protocol](registry.md)구현해요.
66

77
## HWP 파서
88

9-
HWP v5 바이너리 형식(아래한글 2007 이후)을 파싱합니다. 내부적으로 `olefile`사용하여 OLE2 컨테이너를 읽고, 레코드 스트림에서 텍스트와 표를 추출합니다.
9+
HWP v5 바이너리 형식(아래한글 2007 이후)을 파싱해요. 내부적으로 `olefile`사용해서 OLE2 컨테이너를 읽고, 레코드 스트림에서 텍스트와 표를 추출해요.
1010

1111
::: ureca_document_parser.hwp.parser.HwpParser
1212
options:
@@ -15,7 +15,7 @@ HWP v5 바이너리 형식(아래한글 2007 이후)을 파싱합니다. 내부
1515

1616
## HWPX 파서
1717

18-
HWPX(한글 OOXML) 형식을 파싱합니다. ZIP 아카이브 내 XML 파일을 `xml.etree.ElementTree`처리합니다.
18+
HWPX(한글 OOXML) 형식을 파싱해요. ZIP 아카이브 내 XML 파일을 `xml.etree.ElementTree`처리해요.
1919

2020
::: ureca_document_parser.hwpx.parser.HwpxParser
2121
options:

docs/api/registry.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# FormatRegistry
22

3-
파서와 Writer를 중앙에서 관리하는 레지스트리입니다. 파일 확장자 기반으로 파서를 자동 라우팅하고, 포맷 이름으로 Writer를 선택합니다.
3+
파서와 Writer를 중앙에서 관리하는 레지스트리예요. 파일 확장자 기반으로 파서를 자동 라우팅하고, 포맷 이름으로 Writer를 선택해요.
44

55
## Protocol
66

docs/api/writers.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
# Writer
22

3-
[`Document`](models.md) 모델을 출력 포맷 문자열로 변환하는 Writer입니다.
3+
[`Document`](models.md) 모델을 출력 포맷 문자열로 변환하는 Writer예요.
44

5-
모든 Writer는 [`Writer` Protocol](registry.md)구현합니다.
5+
모든 Writer는 [`Writer` Protocol](registry.md)구현해요.
66

77
## Markdown Writer
88

9-
Document를 GitHub Flavored Markdown으로 변환합니다. 헤딩, 리스트, 테이블, 이미지 등 구조를 보존합니다.
9+
Document를 GitHub Flavored Markdown으로 변환해요. 헤딩, 리스트, 테이블, 이미지 등 구조를 보존해요.
1010

1111
::: ureca_document_parser.writers.markdown.MarkdownWriter
1212
options:

docs/architecture.md

Lines changed: 26 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
1-
# Architecture
1+
# 아키텍처
22

3-
## Pipeline
3+
## 파이프라인
4+
5+
입력 파일이 변환되는 전체 흐름이에요.
46

57
```mermaid
68
flowchart LR
@@ -14,7 +16,9 @@ flowchart LR
1416
G --> H["LangChain Documents\n(chunks)"]
1517
```
1618

17-
## Module Dependency Graph
19+
## 모듈 의존성 그래프
20+
21+
각 모듈이 어떤 모듈에 의존하는지 보여줘요. 화살표 방향이 의존 방향이에요.
1822

1923
```mermaid
2024
graph TD
@@ -57,9 +61,11 @@ graph TD
5761
styles["styles.py"]
5862
```
5963

60-
핵심 원칙: **파서와 Writer는 `models.py`에만 의존**한다. 서로를 직접 import하지 않는다.
64+
핵심 원칙은 **파서와 Writer가 `models.py`에만 의존**하는 거예요. 서로를 직접 import하지 않아요.
6165

62-
## Document Model
66+
## Document 모델
67+
68+
`Document`는 파싱 결과의 중간 표현(IR)이에요. 모든 파서는 이 모델을 생산하고, 모든 Writer는 이 모델을 소비해요.
6369

6470
```mermaid
6571
classDiagram
@@ -118,16 +124,16 @@ classDiagram
118124

119125
## FormatRegistry
120126

121-
`FormatRegistry`는 파서와 Writer를 중앙에서 관리한다.
127+
`FormatRegistry`는 파서와 Writer를 중앙에서 관리하는 레지스트리예요.
122128

123-
- **파서 등록**: 파일 확장자(`.hwp`, `.hwpx`)를 키로 파서 클래스를 매핑
124-
- **Writer 등록**: 포맷 이름(`markdown`)을 키로 Writer 클래스를 매핑
125-
- **자동 등록**: `get_registry()` 최초 호출 시 `_auto_register()`가 내장 파서/Writer를 등록
126-
- **선택적 의존성**: `try/except ImportError`처리하여 없는 의존성은 건너뜀
129+
- **파서 등록**파일 확장자(`.hwp`, `.hwpx`)를 키로 파서 클래스를 매핑해요
130+
- **Writer 등록**포맷 이름(`markdown`)을 키로 Writer 클래스를 매핑해요
131+
- **자동 등록**`get_registry()` 최초 호출하면 `_auto_register()`가 내장 파서/Writer를 등록해요
132+
- **선택적 의존성**`try/except ImportError`처리해서 없는 의존성은 건너뛰어요
127133

128134
## Protocol 기반 인터페이스
129135

130-
ABC 대신 `typing.Protocol`사용하여 구조적 서브타이핑을 구현한다.
136+
ABC 대신 `typing.Protocol`사용해서 구조적 서브타이핑을 구현했어요.
131137

132138
```python
133139
class Parser(Protocol):
@@ -145,29 +151,31 @@ class Writer(Protocol):
145151
def write(doc: Document) -> str: ...
146152
```
147153

148-
- 상속 불필요 — 메서드 시그니처만 맞으면 Protocol 호환
149-
- `@staticmethod` — 현재 파서/Writer가 모두 무상태이므로 인스턴스 불필요
154+
- 상속이 필요 없어요 — 메서드 시그니처만 맞으면 Protocol과 호환돼요
155+
- `@staticmethod`을 사용해요 — 현재 파서/Writer가 모두 무상태이므로 인스턴스가 필요 없어요
150156

151157
## HWP 파서 내부 구조
152158

153159
### Record 파싱
154160

155-
HWP 바이너리는 레코드 스트림이다. 각 레코드의 헤더는 4바이트:
161+
HWP 바이너리는 레코드 스트림이에요. 각 레코드의 헤더는 4바이트로 구성돼요.
156162

157163
```
158164
[tag: 10비트][level: 10비트][size: 12비트]
159165
```
160166

161-
`size == 0xFFF`이면 다음 4바이트가 실제 크기를 담는다.
167+
`size == 0xFFF`이면 다음 4바이트가 실제 크기를 담고 있어요.
162168

163169
### Character 스캐닝
164170

165-
`scan_para_chars()`는 PARA_TEXT 바이트를 순회하여 `CharInfo`yield한다. 확장 제어문자(16바이트)와 일반 문자(2바이트)를 구분한다.
171+
`scan_para_chars()`는 PARA_TEXT 바이트를 순회하며 `CharInfo`yield해요. 확장 제어문자(16바이트)와 일반 문자(2바이트)를 올바르게 구분해요.
166172

167-
`extract_text()``has_table_marker()`는 모두 이 제너레이터를 사용하여 중복 로직을 제거했다.
173+
`extract_text()``has_table_marker()`는 모두 이 제너레이터를 사용해서 중복 로직을 제거했어요.
168174

169175
### 테이블 파싱 3단계
170176

177+
테이블은 세 단계에 걸쳐 파싱돼요.
178+
171179
```mermaid
172180
flowchart TD
173181
A["Phase 1: find_table_ctrl()"] -->|"ctrl_level"| B["Phase 2: read_table_dimensions()"]
@@ -181,4 +189,4 @@ flowchart TD
181189

182190
### RecordCursor
183191

184-
인덱스 기반 `while i < n` 대신 `RecordCursor` 클래스로 명시적 순회를 구현한다.
192+
인덱스 기반 `while i < n` 대신 `RecordCursor` 클래스로 명시적 순회를 구현했어요.

docs/getting-started.md

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@ uv add ureca_document_parser
1010

1111
### 선택적 의존성
1212

13+
필요한 기능에 따라 추가 의존성을 설치할 수 있어요.
14+
1315
```bash
1416
# LangChain 청크 분할
1517
uv add ureca_document_parser[langchain]
@@ -26,6 +28,8 @@ uv add ureca_document_parser[all]
2628

2729
### 개발 환경
2830

31+
소스 코드를 직접 수정하고 싶다면 다음과 같이 설정하세요.
32+
2933
```bash
3034
git clone https://github.com/ureca-corp/document_parser.git
3135
cd document_parser
@@ -36,6 +40,8 @@ uv sync --extra dev
3640

3741
### 기본 변환
3842

43+
HWP 또는 HWPX 파일을 Markdown으로 변환할 수 있어요.
44+
3945
```bash
4046
ureca_document_parser document.hwp -o output.md
4147
ureca_document_parser document.hwpx -o output.md
@@ -55,8 +61,12 @@ uv run python -m ureca_document_parser document.hwp -o output.md
5561

5662
## 라이브러리 사용법
5763

64+
세 가지 레벨의 API를 제공해요. 용도에 맞게 선택하세요.
65+
5866
### 간편 변환 (High-level)
5967

68+
파일 경로만 전달하면 바로 변환돼요.
69+
6070
```python
6171
from ureca_document_parser import convert
6272

@@ -65,6 +75,8 @@ convert("document.hwp", "output.md")
6575

6676
### 레지스트리 기반 (Mid-level)
6777

78+
파싱과 출력을 분리해서 제어할 수 있어요.
79+
6880
```python
6981
from ureca_document_parser import get_registry
7082

@@ -75,6 +87,8 @@ md = registry.write(doc, "markdown")
7587

7688
### 직접 파서/Writer 사용 (Low-level)
7789

90+
특정 파서나 Writer를 직접 import해서 사용할 수도 있어요.
91+
7892
```python
7993
from ureca_document_parser.hwp import HwpParser
8094
from ureca_document_parser.writers.markdown import MarkdownWriter
@@ -85,7 +99,7 @@ md = MarkdownWriter.write(doc)
8599

86100
### LangChain 청크 분할
87101

88-
RAG 파이프라인에서 사용할 수 있는 LangChain Document 리스트를 생성합니다.
102+
RAG 파이프라인에서 사용할 수 있는 LangChain Document 리스트를 생성해요.
89103

90104
```python
91105
from ureca_document_parser import convert_to_chunks
@@ -102,5 +116,5 @@ for chunk in chunks:
102116
```
103117

104118
!!! note
105-
`convert_to_chunks`를 사용하려면 `langchain` 추가 의존성이 필요합니다:
119+
`convert_to_chunks`를 사용하려면 `langchain` 추가 의존성이 필요해요:
106120
`uv add ureca_document_parser[langchain]`

docs/index.md

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
11
# ureca_document_parser
22

3-
**Multi-format document parser and converter**한국어 워드프로세서(아래한글) HWP/HWPX 파일을 Markdown으로 변환합니다.
3+
한국어 워드프로세서(아래한글) HWP/HWPX 파일을 Markdown으로 변환하는 현대적인 문서 파서예요.
44

55
## 주요 기능
66

7-
- **HWP v5 바이너리 파싱**`olefile` 기반, 텍스트·표·이미지 추출
8-
- **HWPX (OOXML) 파싱** — ZIP+XML 구조, 표준 라이브러리만 사용
9-
- **Markdown 출력** — 헤딩, 리스트, 테이블 등 구조 보존
10-
- **LangChain 연동** — RAG 파이프라인용 청크 분할 지원
11-
- **확장 가능한 아키텍처** — Protocol 기반 파서/Writer 등록
7+
- **HWP v5 바이너리 파싱**`olefile` 기반으로 텍스트, 표, 이미지를 추출해요
8+
- **HWPX (OOXML) 파싱** — ZIP+XML 구조를 표준 라이브러리만으로 처리해요
9+
- **Markdown 출력** — 헤딩, 리스트, 테이블 등 문서 구조를 보존해요
10+
- **LangChain 연동** — RAG 파이프라인용 청크 분할을 지원해요
11+
- **확장 가능한 아키텍처** — Protocol 기반으로 새 파서/Writer를 쉽게 등록할 수 있어요
1212

1313
## 퀵스타트
1414

mkdocs.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ nav:
5959
- 시작하기: getting-started.md
6060
- 가이드:
6161
- 아키텍처: architecture.md
62-
- 포맷 확장: adding-formats.md
62+
- 포맷 확장 가이드: adding-formats.md
6363
- API 레퍼런스:
6464
- 개요: api/index.md
6565
- Document 모델: api/models.md

0 commit comments

Comments
 (0)