feat(core): braille decoder - #193
Open
coom1222 wants to merge 60 commits into
Open
Conversation
## Rust 디코더 - `libs/braillify/src/decoder.rs` 신규 작성 - 한국 점자 → 한글 상태 머신 디코더 (`Start / GotCho / GotJung`) - 약자(을·억·언·얼·연·열·영·옥·온·옹·운·울·은·인) 디코딩 - 2바이트 특수 약자(성·정·청·것) 디코딩 - 가나다마바사자카타파하 초성 단독 약자 디코딩 - Unicode TIndex 종성 값 정확히 반영 (ㄹ=8, ㅇ=21 등) - 7개 단위 테스트 전체 통과 - `libs/braillify/src/lib.rs`: `pub fn decode()` 공개 함수 추가 ## WASM 바인딩 - `packages/node/src/lib.rs`: `decodeFromUnicode()` JS 함수 노출 ## 모바일 앱 UI - `apps/mobile/src/lib/translate.ts` - `translateReverse()` 구현 — `decodeFromUnicode` WASM 연결 - `apps/mobile/src/pages/TranslatorPage.tsx` - 정점역 / 역점역 방향 토글 추가 - 역점역 모드에서 `BrailleInput` 컴포넌트로 전환 - `apps/mobile/src/components/BrailleInput.tsx` 신규 작성 - 직접 입력/붙여넣기 텍스트 필드 (점자 유니코드) - 도트 키보드: `EditableBrailleCell` 재사용, 셀 단위 점 토글 - 두 입력 방식 실시간 동기화 (`masksToString` / `parseToCells`) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- 모바일 앱 개발에 필요한 스크립트를 추가했습니다. - Tauri 앱에 있던 템플릿 메타데이터를 Braillify 프로젝트에 맞게 작성했습니다.
- 다음과 같은 문제를 해결: 11번째 번역을 하면 → 가장 오래된 10번째 항목이 자동으로 삭제
PR 리뷰 피드백 반영 (gemini-code-assist Critical). 된소리표 ⠠(32) 뒤의 바이트 패턴이 두 가지임을 확인: - ㅏ 모음: 된소리표 + 약자/공유 바이트 (까=[32,43], 싸=[32,7]) - 기타 모음: 된소리표 + 초성 바이트 + 별도 중성 (꺼=[32,8,14], 쏘=[32,32,37]) try_choseong_with_double() 함수 추가: 43|8 → ㄲ(1) / 10 → ㄸ(4) / 24 → ㅃ(8) 7|32 → ㅆ(10) / 40 → ㅉ(13) Stage::Start, Stage::GotJung 두 곳에서 try_choseong → try_choseong_with_double 교체. 된소리 테스트 8개 추가 (ㅏ 모음 5종 + ㅏ 외 모음 3종 + 단어 2종). Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
PR 리뷰 피드백 반영 (gemini-code-assist High Priority).
붙여넣기 시 일반 공백(' ')과 줄바꿈('\n')이 무시되어
단어 경계가 사라지는 문제 수정.
→ 두 문자 모두 0(⠀ U+2800 점자 공백)으로 매핑하여 단어 경계 보존.
PR 리뷰 피드백 반영 (gemini-code-assist Medium Priority). 단음절 테스트만으로는 놓칠 수 있는 케이스를 보완: - 껐어요: 된소리 + 종성 + 후속 음절 - 아까: 단어 중간에 된소리 - 기쁘다: ㅃ(된소리ㅂ) 포함 단어
PR 리뷰 피드백 반영 (gemini-code-assist Medium Priority). 배열 인덱스를 key로 쓰면 셀 삭제 시 React가 잘못된 컴포넌트를 재사용하는 버그가 생길 수 있음. counter useRef로 단조 증가 ID를 생성하고 cellIds state에 저장. - 셀 추가/공백/삭제 시 ID 배열도 함께 업데이트 - 텍스트 붙여넣기로 전체 교체 시 모든 셀에 새 ID 발급 - 방향 전환 등 외부 초기화(cells.length===0) 시 useEffect로 동기화
리뷰어(Nohgh) 피드백 반영.
기존: direction(정점역/역점역) + mode(일반/수학) 두 개의 토글
변경: PageMode('general'|'math'|'reverse') 단일 상태로 통합
→ [일반] [수학] [역점역] 한 줄 토글로 3가지 기능이 명확하게 표시됨
- direction/mode 두 상태 제거, pageMode 하나로 대체
- 수학 점역 기능 유지 확인
feat: 역점역(점자→한글) 기능 구현 및 점자 입력 키보드 추가
feat: Braillify Android 초기 설정 및 UI/UX 정리
- Next.js App Router + 정적 export(output:'export')로 마이그레이션 - @devup-ui/vite-plugin → @devup-ui/next-plugin 교체, WASM(asyncWebAssembly) webpack 설정 이식 - RSC 경계 분리: layout/page는 서버 컴포넌트, 탭 상태만 AppShell client island로 격리 - src/pages → src/views 이동(Next Pages Router 충돌 회피), 상호작용 화면에만 'use client' - global.css → devup-ui globalCss 이식 - Tauri frontendDist를 ../out(Next export 출력)으로 변경 - Vite 설정/진입점 제거
- 점자 약자, 된소리, 중·종성 테스트 케이스 추가 - 잘못된 중성 입력의 오류 검증 - 한글을 점자로 변환한 뒤 다시 한글로 되돌렸을 때 원문과 같은지 검증
- src-tauri/gen 을 추적에서 제외, .gitignore에 추가. - clone 후 tauri ios/android init로 재생성필요(절차는 README에 문서화 완료) - Apple 개발자 계정은 bundle.iOS.developmentTeam으로 관리(현재 빈 값)
- devup-ui 관용구 정리 및 탭 URL 동기화 - AppShell / EditorView: Flex → VStack으로 변경 - BottomTabBar: style 제거 - EditableBrailleCell / TranslatorView: 배열 타입 주석 제거 후 as const 적용 - HistoryView: 탭 배열을 Global variable(HISTORY_TABS)로 관리 - TranslatorView / EditorView: copyState 삼항을 COPY_LABEL 상수로 정리 - AppShell: URL 쿼리스트링 적용
1. init 시 Tauri 기본 아이콘이 생성되는 문제
- tauri ios/android init은 항상 기본 아이콘을 넣고, 커스텀 아이콘은
tauri icon을 따로 실행해야 적용됐었던 문제가 있었음
- ios:init / android:init 스크립트가 init 직후 tauri icon을 자동
실행하도록 함
- 배경색(#EFEEEB)을 app-icon.json manifest 한 곳에서 관리하도록
고정
2. 시뮬레이터에서 버튼이 반응하지 않는 문제 (웹은 정상)
- tauri ios dev는 개발 서버를 tauri:// 스킴으로 프록시하는데, 이 환경에서
Next.js 16 dev 런타임이 hydration을 끝내지 못해 모든 버튼이 비활성화 됐던 문제가 있었음
- ios:dev를 정적 빌드(out/) 임베드 방식으로 전환함(tauri.sim.conf.json).
# Conflicts: # Cargo.lock # bun.lock
- AppShell의 client 범위 축소 - 정적 VStack을 page.tsx로 이동
- Grid, VStack, Flex 사용
- BrailleTextInput bg 문제 해결 - TranslatorView / HistoryView 탭 구조를 인식하지 못했던 문제 해결 - BottomTabBar 활성 탭에 aria-current="page" 추가 활성 상태가 색상으로만 표현되던 문제 해결
-webkit-font-smoothing 제거, WebkitTapHighlightColor를 객체 형태로 이동
Codecov Report✅ All modified and coverable lines are covered by tests.
🚀 New features to boost your workflow:
|
Contributor
Changepacks |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
앱 PR #166의 코어 관련 리뷰를 위해 된소리 셀 입력 테스트를 별도로 분리했습니다.
기존의 #166 과 이 PR 모두 main을 대상으로 하고 있어, 현재 변경 목록에는 #166의 앱 변경도 함께 표시됩니다.
#166과 비교해 추가된 변경은 decoder.rs의 된소리 셀 테스트 10개, 총 16줄입니다
decoder.rs테스트 16줄 추가