Skip to content

Commit d550b0c

Browse files
grimza99okinawaa
andauthored
feat : 영어로 된 약어에 대한 조사 조건부 처리 (#359)
* Chore : ALPHABET_TO_KOREAN 상수 생성 * Test : 영어 약어에 대한 테스트 파일 생성 * Feat : josa 함수에서 word가 모두 대문자 영어일경우, 마지막 영단어를 한국어로 번역한뒤 josaPicker 함수 동작 * Create kind-doors-draw.md --------- Co-authored-by: 박찬혁 <[email protected]>
1 parent 101672e commit d550b0c

File tree

4 files changed

+73
-0
lines changed

4 files changed

+73
-0
lines changed

.changeset/kind-doors-draw.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"es-hangul": patch
3+
---
4+
5+
feat : 영어로 된 약어에 대한 조사 조건부 처리

src/_internal/constants.ts

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -161,3 +161,32 @@ export const HANGUL_DIGITS_MAX = HANGUL_DIGITS.length * 4;
161161
export const HANGUL_NUMBERS = ['', '일', '이', '삼', '사', '오', '육', '칠', '팔', '구'];
162162
export const HANGUL_NUMBERS_FOR_DECIMAL = ['영', '일', '이', '삼', '사', '오', '육', '칠', '팔', '구'];
163163
export const HANGUL_CARDINAL = ['', '십', '백', '천'];
164+
165+
export const ALPHABET_TO_KOREAN: Record<string, string> = {
166+
A: '에이',
167+
B: '비',
168+
C: '씨',
169+
D: '디',
170+
E: '이',
171+
F: '에프',
172+
G: '지',
173+
H: '에이치',
174+
I: '아이',
175+
J: '제이',
176+
K: '케이',
177+
L: '엘',
178+
M: '엠',
179+
N: '엔',
180+
O: '오',
181+
P: '피',
182+
Q: '큐',
183+
R: '알',
184+
S: '에스',
185+
T: '티',
186+
U: '유',
187+
V: '브이',
188+
W: '더블유',
189+
X: '엑스',
190+
Y: '와이',
191+
Z: '지',
192+
};

src/core/josa/josa.spec.ts

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -148,4 +148,35 @@ describe('josa.pick', () => {
148148
it('어떤 행동의 출발점이나 비롯되는 대상임을 나타내는 격 조사 ㄹ 받침 예외 처리', () => {
149149
expect(josa.pick('동굴', '으로부터/로부터')).toBe('로부터');
150150
});
151+
152+
it('영어로된 약어일 경우, 마지막 알파벳을 한국어로 바꾼뒤 조사를 붙인다.', () => {
153+
expect(josa('URL', '을/를')).toBe('URL을');
154+
expect(josa('CSS', '을/를')).toBe('CSS를');
155+
156+
expect(josa('URL', '은/는')).toBe('URL은');
157+
expect(josa('CSS', '은/는')).toBe('CSS는');
158+
159+
expect(josa('URL', '이/가')).toBe('URL이');
160+
expect(josa('CSS', '이/가')).toBe('CSS가');
161+
162+
expect(josa('URL', '와/과')).toBe('URL과');
163+
expect(josa('CSS', '와/과')).toBe('CSS와');
164+
165+
expect(josa('URL', '으로/로')).toBe('URL로');
166+
167+
expect(josa('URL', '이나/나')).toBe('URL이나');
168+
expect(josa('CSS', '이나/나')).toBe('CSS나');
169+
170+
expect(josa('URL', '이란/란')).toBe('URL이란');
171+
expect(josa('CSS', '이란/란')).toBe('CSS란');
172+
173+
expect(josa('URL', '아/야')).toBe('URL아');
174+
expect(josa('CSS', '아/야')).toBe('CSS야');
175+
176+
expect(josa('URL', '이랑/랑')).toBe('URL이랑');
177+
expect(josa('CSS', '이랑/랑')).toBe('CSS랑');
178+
179+
expect(josa('URL', '이에요/예요')).toBe('URL이에요');
180+
expect(josa('CSS', '이에요/예요')).toBe('CSS예요');
181+
});
151182
});

src/core/josa/josa.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import { disassembleCompleteCharacter } from '@/core/disassembleCompleteCharacter';
22
import { hasBatchim } from '../hasBatchim';
3+
import { ALPHABET_TO_KOREAN } from '@/_internal/constants';
34

45
type JosaOption =
56
| '이/가'
@@ -26,6 +27,13 @@ export function josa<T extends string, U extends JosaOption>(word: T, josa: U):
2627
return word as `${T}${ExtractJosaOption<U>}`;
2728
}
2829

30+
if (/^[A-Z]+$/.test(word)) {
31+
const lastChar = word[word.length - 1];
32+
const koreanPronunciationOfLastChar = ALPHABET_TO_KOREAN[lastChar];
33+
34+
return (word + josaPicker(koreanPronunciationOfLastChar, josa)) as `${T}${ExtractJosaOption<U>}`;
35+
}
36+
2937
return (word + josaPicker(word, josa)) as `${T}${ExtractJosaOption<U>}`;
3038
}
3139

0 commit comments

Comments
 (0)