Metadata-Version: 2.4
Name: ctstruct
Version: 0.1.0
Summary: 텍스트 양식을 구조화하는 트리 자료형 라이브러리
License: MIT
Keywords: tree,document,parser,markdown,structured-text
Classifier: Programming Language :: Python :: 3
Classifier: License :: OSI Approved :: MIT License
Classifier: Operating System :: OS Independent
Classifier: Topic :: Text Processing :: Markup
Requires-Python: >=3.10
Description-Content-Type: text/markdown
Provides-Extra: dev
Requires-Dist: pytest>=8.0; extra == "dev"
Requires-Dist: pytest-cov; extra == "dev"
Requires-Dist: ruff; extra == "dev"
Requires-Dist: mypy; extra == "dev"

# CTStruct

> **텍스트 양식을 구조화하는 Python 트리 자료형 라이브러리**

CTStruct는 Markdown, 일반 텍스트, JSON 등 다양한 텍스트 포맷을 **통일된 트리 자료구조(CTTree)** 로 파싱·변환·렌더링하는 Python 라이브러리입니다.

```
텍스트 입력  →  [Parser]  →  CTTree  →  [Renderer]  →  출력 포맷
                               ↑
                          (탐색 / 변환 / 병합)
```

---

## 특징

- **통일된 트리 API** — 어떤 포맷이든 `CTNode` / `CTTree` 로 표현
- **플러그인형 파서 & 렌더러** — `BaseParser` / `BaseRenderer` 상속으로 손쉽게 확장
- **풍부한 탐색 API** — `walk()`, `find()`, `ancestors()`, `toc()` 등
- **불변 변환** — `filter()`, `map()` 은 새 트리를 반환하여 원본 보존
- **직렬화** — `to_dict()` / `from_dict()` 로 JSON 직렬화 지원
- **의존성 없음** — 표준 라이브러리만 사용

---

## 빠른 시작

### 설치

```bash
pip install -e .
```

### 기본 사용 예시

```python
from ctstruct import CTTree, CTNode, NodeType
from ctstruct.parsers import MarkdownParser
from ctstruct.renderers import MarkdownRenderer, JSONRenderer

# 1) 직접 트리 빌드
tree = CTTree(title="나의 문서")
sec = CTNode(NodeType.SECTION)
sec.append(CTNode(NodeType.HEADING, "소개", {"level": 1}))
sec.append(CTNode(NodeType.PARAGRAPH, "CTStruct 는 텍스트를 트리로 구조화합니다."))
sec.append(CTTree.make_list(["파싱", "변환", "렌더링"]))
tree.root.append(sec)

# 2) Markdown 파싱
parser = MarkdownParser()
tree = parser.parse(open("document.md").read())

# 3) 탐색
for heading in tree.find(NodeType.HEADING):
    print(heading.attr("level"), heading.content)

# 목차 생성
for entry in tree.toc():
    print("  " * (entry["level"] - 1) + entry["text"])

# 4) 렌더링
md_renderer = MarkdownRenderer()
print(md_renderer.render(tree))

json_renderer = JSONRenderer(indent=2)
print(json_renderer.render(tree))

# 5) 트리 변환 (불변)
filtered = tree.filter(lambda n: n.node_type != NodeType.CODE_BLOCK)
upper = tree.map(lambda n: setattr(n, "content", (n.content or "").upper()) or None)
```

### 트리 구조 시각화

```python
print(tree.pretty())
# [a1b2c3d4] ROOT: None
#   [e5f6a7b8] SECTION: None
#     [c9d0e1f2] HEADING level=1: '소개'
#     [a3b4c5d6] PARAGRAPH: 'CTStruct 는 텍스트를…'
#     [e7f8a9b0] LIST style='unordered': None
#       [c1d2e3f4] LIST_ITEM: '파싱'
#       [a5b6c7d8] LIST_ITEM: '변환'
#       [e9f0a1b2] LIST_ITEM: '렌더링'
```

---

## 지원 노드 타입

| 카테고리 | 타입 | 설명 |
|----------|------|------|
| 구조 | `ROOT` | 트리 최상위 |
| 구조 | `DOCUMENT` | 문서 단위 |
| 구조 | `SECTION` | 헤딩 + 내용 묶음 |
| 블록 | `HEADING` | 제목 (level 1–6) |
| 블록 | `PARAGRAPH` | 문단 |
| 블록 | `LIST` / `LIST_ITEM` | 목록 |
| 블록 | `TABLE` / `TABLE_ROW` / `TABLE_CELL` | 표 |
| 블록 | `CODE_BLOCK` | 코드 블록 |
| 블록 | `BLOCKQUOTE` | 인용구 |
| 블록 | `DIVIDER` | 구분선 |
| 인라인 | `TEXT` `BOLD` `ITALIC` `CODE` `LINK` `IMAGE` | 인라인 요소 |
| 메타 | `METADATA` | 문서 메타 (frontmatter) |
| 메타 | `ANNOTATION` | 주석/노트 |
| 메타 | `CUSTOM` | 사용자 정의 확장 |

---

## 프로젝트 구조

```
CTStruct/
├── ctstruct/
│   ├── __init__.py          # 공개 API
│   ├── types.py             # NodeType Enum
│   ├── node.py              # CTNode 클래스
│   ├── tree.py              # CTTree 클래스
│   ├── parsers/
│   │   ├── base.py          # BaseParser (추상)
│   │   └── markdown.py      # MarkdownParser
│   └── renderers/
│       ├── base.py          # BaseRenderer (추상)
│       ├── markdown.py      # MarkdownRenderer
│       └── json_renderer.py # JSONRenderer
├── tests/
│   ├── test_node.py
│   ├── test_tree.py
│   └── test_parsers.py
├── docs/
│   └── ARCHITECTURE.md
└── pyproject.toml
```

---

## 테스트 실행

```bash
pip install -e ".[dev]"
pytest -v --cov=ctstruct
```

---

## 라이선스

MIT
