|
1 | | -# PROJECT KNOWLEDGE BASE |
| 1 | +# Braillify |
2 | 2 |
|
3 | | -**Generated:** 2026-01-13 |
4 | | -**Commit:** b1d6b2b |
5 | | -**Branch:** main |
| 3 | +한국어 텍스트를 한국 점자로 변환하는 라이브러리. |
6 | 4 |
|
7 | | -## OVERVIEW |
| 5 | +## 프로젝트 구조 |
8 | 6 |
|
9 | | -Korean Braille (Jeomja) translation library implementing 2024 Korean Braille Standard. Core in Rust with WASM (Node.js) and PyO3 (Python) bindings. |
| 7 | +- `libs/braillify/` — Rust 핵심 변환 엔진 |
| 8 | +- `packages/node/` — Node.js WASM 바인딩 |
| 9 | +- `packages/python/` — Python 바인딩 (maturin) |
| 10 | +- `apps/landing/` — Next.js 랜딩 페이지 |
| 11 | +- `test_cases/` — 점자 변환 테스트 케이스 (JSON) |
| 12 | +- `docs/` — 2024 개정 한국 점자 규정 PDF |
| 13 | +- `braillove-case-collector/` — 점자 내부표기 → 숫자/유니코드 변환기 |
10 | 14 |
|
11 | | -## STRUCTURE |
| 15 | +## 빌드 & 테스트 |
12 | 16 |
|
13 | | -``` |
14 | | -braillify/ |
15 | | -├── libs/braillify/ # Core Rust library (see libs/braillify/AGENTS.md) |
16 | | -├── packages/ |
17 | | -│ ├── node/ # WASM bindings via wasm-pack |
18 | | -│ └── python/ # PyO3 bindings via maturin |
19 | | -├── apps/landing/ # Next.js 16 docs site (@devup-ui) |
20 | | -├── test_cases/ # CSV rule test cases (61 files) |
21 | | -├── test_case_inputs/ # Input-only test CSVs |
22 | | -├── __tests__/ # Bun JS integration tests |
23 | | -├── py-test/ # Pytest Python tests |
24 | | -└── braillove-case-collector/ # Windows automation tool |
| 17 | +```bash |
| 18 | +bun install |
| 19 | +cargo build --release -p braillify |
| 20 | +bun test # 전체 테스트 (Rust + Bun + Python) |
| 21 | +bun test test_cases/ # 테스트케이스 무결성 검증만 |
25 | 22 | ``` |
26 | 23 |
|
27 | | -## WHERE TO LOOK |
| 24 | +## 테스트 케이스 규칙 |
28 | 25 |
|
29 | | -| Task | Location | Notes | |
30 | | -| ------------------------- | ------------------------------------------ | --------------------------------------- | |
31 | | -| Braille encoding logic | `libs/braillify/src/lib.rs` | Main `Encoder` struct, `encode()` | |
32 | | -| Korean character handling | `libs/braillify/src/korean_*.rs` | Choseong/Jungseong/Jongseong | |
33 | | -| Rule implementations | `libs/braillify/src/rule.rs`, `rule_en.rs` | Korean Braille Standard rules | |
34 | | -| Symbol/shortcut tables | `libs/braillify/src/*_shortcut.rs` | PHF static maps | |
35 | | -| CLI | `libs/braillify/src/cli.rs` | REPL mode, one-shot mode | |
36 | | -| Node.js API | `packages/node/src/lib.rs` | `encode`, `translateToUnicode` | |
37 | | -| Python API | `packages/python/src/lib.rs` | Same API + CLI entry | |
38 | | -| Landing page | `apps/landing/src/app/` | Next.js App Router | |
39 | | -| Test cases | `test_cases/*.csv` | Format: input,internal,expected,unicode | |
| 26 | +### 파일 구조 |
40 | 27 |
|
41 | | -## CONVENTIONS |
| 28 | +- `test_cases/korean/rule_{N}.json` — 한글 점자 제N항 |
| 29 | +- `test_cases/korean/rule_{N}_b1.json` — 제N항 붙임 1 |
| 30 | +- `test_cases/math/math_{N}.json` — 수학 점자 제N항 |
| 31 | +- 근거: `docs/2024 개정 한국 점자 규정.pdf` |
42 | 32 |
|
43 | | -### Rust |
| 33 | +### 엔트리 형식 |
44 | 34 |
|
45 | | -- Edition 2024, resolver 3 |
46 | | -- PHF macros for static lookup tables |
47 | | -- `Result<T, String>` for encoding errors (no custom error type) |
48 | | -- Feature flags: `cli` (default), `wasm` |
49 | | -- Tests inline with `#[cfg(test)]` modules |
| 35 | +```json |
| 36 | +{ |
| 37 | + "input": "입력 텍스트 (묵자 또는 LaTeX)", |
| 38 | + "note": "설명 (선택, 동일 input이 여럿이거나 맥락 필요 시에만)", |
| 39 | + "internal": "점자 내부표기", |
| 40 | + "expected": "브라유셀 인덱스 연결 문자열", |
| 41 | + "unicode": "점자 유니코드 문자열" |
| 42 | +} |
| 43 | +``` |
50 | 44 |
|
51 | | -### TypeScript |
| 45 | +### internal → expected/unicode 변환 |
52 | 46 |
|
53 | | -- `strict: true`, `moduleResolution: bundler` |
54 | | -- `@/*` path alias to `./src/*` |
55 | | -- ESLint: `eslint-plugin-devup` recommended config |
56 | | -- Bun test with a preload plugin for WASM tests |
| 47 | +`braillove-case-collector/converter.py`의 패턴을 따른다: |
57 | 48 |
|
58 | | -### Python |
| 49 | +``` |
| 50 | +pattern: " a1b'k2l@cif/msp"e3h9o6r^djg>ntq,*5<-u8v.%[$+x!&;:4\0z7(_?w]#y)=" |
| 51 | +braille: ⠀⠁⠂⠃⠄⠅⠆⠇⠈⠉⠊⠋⠌⠍⠎⠏⠐⠑⠒⠓⠔⠕⠖⠗⠘⠙⠚⠛⠜⠝⠞⠟⠠⠡⠢⠣⠤⠥⠦⠧⠨⠩⠪⠫⠬⠭⠮⠯⠰⠱⠲⠳⠴⠵⠶⠷⠸⠹⠺⠻⠼⠽⠾⠿ |
| 52 | +``` |
59 | 53 |
|
60 | | -- Requires Python >= 3.13 (workspace), >= 3.8 (package) |
61 | | -- `uv` for workspace management |
62 | | -- `maturin` for building wheels |
63 | | -- CLI entry: `braillify = "braillify:cli"` |
| 54 | +특수 매핑: `` ` ``→0, `{`→42, `}`→59, `~`→24, `|`→51 |
64 | 55 |
|
65 | | -## ANTI-PATTERNS (THIS PROJECT) |
| 56 | +`expected`는 각 문자의 인덱스를 문자열로 이어붙인 것, `unicode`는 대응하는 점자 유니코드 문자를 이어붙인 것이다. |
66 | 57 |
|
67 | | -- **Never suppress encoding errors** - propagate `Result<T, String>` |
68 | | -- **Never modify CSV test files without running full test suite** - `rule_map.json` must match |
69 | | -- **Avoid `as any` or `@ts-ignore`** in TypeScript |
| 58 | +### 무결성 검증 |
70 | 59 |
|
71 | | -## COMMANDS |
| 60 | +`test_cases/testcase-integrity.test.ts`가 모든 엔트리의 internal → expected/unicode 일치를 검증한다. 대문자(수학 변수 A, B 등)를 포함한 internal은 기본 패턴 외이므로 skip된다. |
72 | 61 |
|
73 | | -```bash |
74 | | -# Install dependencies (runs uv sync, wasm-pack install, maturin install) |
75 | | -bun install |
| 62 | +### 테스트 케이스 작성 원칙 |
76 | 63 |
|
77 | | -# Build all packages |
78 | | -bun run build |
| 64 | +1. **PDF가 유일한 근거** — `docs/2024 개정 한국 점자 규정.pdf`에 없는 예제를 만들지 않는다. |
| 65 | +2. **PDF 순서 준수** — 기호 정의 → 해당 예제 순서로, PDF에 나온 순서 그대로 배치한다. |
| 66 | +3. **기호 단독 엔트리 필수** — 각 기호는 단독 엔트리로 먼저 등록하고, 그 뒤에 해당 기호를 사용하는 예제가 온다. |
| 67 | +4. **note는 필요할 때만** — 동일 input이 다른 의미로 쓰일 때, 또는 맥락이 필요할 때만 추가한다. input을 반복하는 note는 쓰지 않는다. |
| 68 | +5. **소속 정확히** — 각 엔트리는 해당 항 파일에만 존재한다. 다른 항의 예제를 섞지 않는다. |
79 | 69 |
|
80 | | -# Run all tests (Rust coverage + Bun test + Pytest) |
81 | | -bun run test |
| 70 | +### LaTeX 입력 |
82 | 71 |
|
83 | | -# Build landing site (requires test_status.json from test run) |
84 | | -bun run build:landing |
| 72 | +수학 수식은 LaTeX 형식의 input도 테스트한다. 기존 엔트리의 LaTeX 버전을 추가하는 방식이다: |
85 | 73 |
|
86 | | -# Dev server for landing |
87 | | -bun -F landing dev |
| 74 | +- 형식: `$<LaTeX 수식>$` (앞에 `$`, 뒤에 `$`) |
| 75 | +- 동일한 `internal`/`expected`/`unicode`를 공유 |
| 76 | +- `"note": "LaTeX"` 표기 |
| 77 | +- **기존 예제의 변환만** — 새로운 수식을 만들지 않는다 |
88 | 78 |
|
89 | | -# Lint |
90 | | -bun run lint |
91 | | -bun run lint:fix |
| 79 | +```json |
| 80 | +{ |
| 81 | + "input": "$\\frac{3}{4}$", |
| 82 | + "note": "LaTeX", |
| 83 | + "internal": "#d/#c", |
| 84 | + "expected": "6025129", |
| 85 | + "unicode": "⠼⠙⠌⠉" |
| 86 | +} |
92 | 87 | ``` |
93 | 88 |
|
94 | | -## NOTES |
| 89 | +주요 LaTeX 변환: |
| 90 | + |
| 91 | +| 수식 | LaTeX | |
| 92 | +|------|-------| |
| 93 | +| 분수 | `$\frac{분자}{분모}$` | |
| 94 | +| 근호 | `$\sqrt{x}$`, `$\sqrt[n]{x}$` | |
| 95 | +| 위첨자 | `$x^{2}$` | |
| 96 | +| 아래첨자 | `$x_{n}$` | |
| 97 | +| 부등호 | `$\neq$`, `$\geq$`, `$\leq$` | |
| 98 | +| 절댓값 | `$\|x\|$` | |
| 99 | +| 무한대 | `$\infty$` | |
| 100 | +| 적분 | `$\int f(x)dx$` | |
| 101 | +| 집합 | `$\cup$`, `$\cap$`, `$\subset$`, `$\emptyset$` | |
| 102 | +| 논리 | `$\land$`, `$\lor$`, `$\forall$`, `$\exists$` | |
| 103 | + |
| 104 | +### 대문자 수학 변수 |
95 | 105 |
|
96 | | -- **Test output**: `cargo test test_by_testcase` generates `test_status.json` for landing page |
97 | | -- **WASM build**: `wasm-pack build --target bundler` in `packages/node` |
98 | | -- **Python wheel**: `maturin build --release` in `packages/python` |
99 | | -- **No CI workflows checked in** - build/test orchestrated via root `package.json` |
100 | | -- **Korean comments** in Rust code reference specific rule numbers (e.g., "제14항") |
| 106 | +수학 점자에서 대문자 변수(A, B, N 등)를 사용하는 internal은 기본 64셀 패턴에 포함되지 않는다. 이런 엔트리는 `expected`/`unicode`가 빈 문자열이며, 무결성 테스트에서 자동으로 skip된다. |
0 commit comments