feat(flutter): 조사 도우미가 호환 자모 · 숫자의 받침도 고른다

웹 조사 도우미(frontend shared/utils/korean.ts)와 짝으로 맞춘다. 초성 검색어(‘ㄱㅁ’)나
숫자로 끝나는 말이 "(으)로" · "이(가)" 꼴로 나오지 않게, 호환 자모 자음은 받침 있음
(ㄹ 은 "로"), 모음은 받침 없음, 숫자는 읽는 소리(영 · 일 · 이 …)로 고른다. 라틴 글자 ·
기호로 끝나면 지금처럼 괄호 꼴이다. 알려진 한계: 라틴 글자 뒤의 숫자도 한국어 소리로
센다(‘녹음.mp3’은).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-11-07 14:42:43 +09:00
parent ca6c68c34f
commit 3278e1abc1
4 changed files with 123 additions and 26 deletions
@@ -250,7 +250,7 @@ void main() {
);
});
test('은/는 — 받침에 맞추고, 한글로 끝나지 않으면 "은(는)"', () {
test('은/는 — 받침에 맞추고, 소리를 모르는 끝 글자(라틴 글자 · 기호)면 "은(는)"', () {
expect(topicParticle('사진'), '은');
expect(topicParticle('보고서'), '는');
expect(topicParticle('외 2개'), '는');
@@ -108,6 +108,49 @@ void main() {
expect(directionParticle('프로젝트'), '로');
expect(directionParticle('Archive'), '(으)로');
});
test('한글 자모 · 숫자는 읽는 소리로 — 자음은 받침 있음(ㄹ 은 "로"), 모음은 받침 없음', () {
// 끝 글자 → 이/가 · 으로/로 · 은/는
for (final (String last, String subject, String direction, String topic)
in <(String, String, String, String)>[
('ㄱ', '이', '으로', '은'), // 기역
('ㄹ', '이', '로', '은'), // 리을
('ㅁ', '이', '으로', '은'), // 미음
('ㄳ', '이', '으로', '은'), // 기역시옷 — 겹자음도 받침 있음
('ㅏ', '가', '로', '는'), // 아
('0', '이', '으로', '은'), // 영
('1', '이', '로', '은'), // 일
('2', '가', '로', '는'), // 이
('3', '이', '으로', '은'), // 삼
('4', '가', '로', '는'), // 사
('5', '가', '로', '는'), // 오
('6', '이', '으로', '은'), // 육
('7', '이', '로', '은'), // 칠
('8', '이', '로', '은'), // 팔
('9', '가', '로', '는'), // 구
]) {
expect(subjectParticle(last), subject, reason: last);
expect(directionParticle(last), direction, reason: last);
expect(topicParticle(last), topic, reason: last);
}
// 낱말의 끝 글자로 본다 — 초성 검색어 · 번호로 끝나는 이름
expect(directionParticle('ㄱㅁ'), '으로');
expect(subjectParticle('ㄱㅁ'), '이');
expect(directionParticle('프로젝트1'), '로');
expect(subjectParticle('2026'), '이');
// 라틴 글자 · 기호는 소리를 몰라 지금처럼
expect(subjectParticle('ARA'), '이(가)');
expect(directionParticle('100%'), '(으)로');
expect(topicParticle('v'), '은(는)');
});
test('끝의 공백은 떼고 보고, 따옴표 · 괄호는 떼지 않는다 — 그 글자로 끝나면 소리를 몰라 "이(가)" 꼴', () {
expect(subjectParticle('계약 '), '이');
expect(directionParticle('ㄹ '), '로');
expect(subjectParticle('계약)'), '이(가)');
expect(subjectParticle('"계약"'), '이(가)');
expect(directionParticle('(2)'), '(으)로');
});
});
group('여러 통 처리의 알림 글 (웹 mail-bulk.ts 와 같다)', () {