diff --git a/.changeset/smooth-tips-yawn.md b/.changeset/smooth-tips-yawn.md new file mode 100644 index 00000000..cdf14ddd --- /dev/null +++ b/.changeset/smooth-tips-yawn.md @@ -0,0 +1,5 @@ +--- +"es-hangul": minor +--- + +feat: removeLastHangulCharacter 추가 diff --git a/src/_internal.ts b/src/_internal.ts new file mode 100644 index 00000000..12e63b34 --- /dev/null +++ b/src/_internal.ts @@ -0,0 +1,4 @@ +export function excludeLastElement(array: string[]): [string[], string] { + const lastElement = array.at(-1); + return [array.slice(0, -1), lastElement ?? '']; +} diff --git a/src/removeLastHangulCharacter.spec.ts b/src/removeLastHangulCharacter.spec.ts new file mode 100644 index 00000000..a6ce9f62 --- /dev/null +++ b/src/removeLastHangulCharacter.spec.ts @@ -0,0 +1,15 @@ +import { describe, it, expect } from 'vitest'; +import { removeLastHangulCharacter } from './removeLastHangulCharacter'; + +describe('removeLastHangulCharacter', () => { + it('마지막 문자가 겹받침인 경우 홑받침으로 바꾼다', () => { + expect(removeLastHangulCharacter('안녕하세요 값')).toBe('안녕하세요 갑'); + }); + it('마지막 문자가 초성과 중성의 조합으로 끝날 경우 초성만 남긴다', () => { + expect(removeLastHangulCharacter('프론트엔드')).toBe('프론트엔ㄷ'); + }); + it('마지막 문자가 초성과 중성과 종성의 조합으로 끝날 경우 초성과 중성이 조합된 문자만 남긴다.', () => { + expect(removeLastHangulCharacter('일요일')).toBe('일요이'); + expect(removeLastHangulCharacter('깎')).toBe('까'); + }); +}); diff --git a/src/removeLastHangulCharacter.ts b/src/removeLastHangulCharacter.ts new file mode 100644 index 00000000..6d4f0034 --- /dev/null +++ b/src/removeLastHangulCharacter.ts @@ -0,0 +1,42 @@ +import { combineHangulCharacter } from './combineHangulCharacter'; +import { disassembleHangulToGroups } from './disassemble'; +import { excludeLastElement } from './_internal'; + +/** + * @name removeLastHangulCharacter + * @description + * 인자로 주어진 한글 문자열에서 가장 마지막 문자 하나를 제거하여 반환합니다. + * ```typescript + * removeLastHangulCharacter( + * // 한글 문자열 + * words: string + * ): string + * ``` + * @example + * removeLastHangulCharacter('안녕하세요 값') // 안녕하세요 갑 + * removeLastHangulCharacter('프론트엔드') // 프론트엔ㄷ + * removeLastHangulCharacter('일요일') // 일요이 + */ +export function removeLastHangulCharacter(words: string) { + const disassembedGroups = disassembleHangulToGroups(words); + const lastCharacter = disassembedGroups.at(-1); + + if (lastCharacter == null) { + return ''; + } + + const withoutLastCharacter = disassembedGroups + .filter(v => v !== lastCharacter) + .map(([first, middle, last]) => { + if (middle != null) { + return combineHangulCharacter(first, middle, last); + } + + return first; + }); + + const [[first, middle, last]] = excludeLastElement(lastCharacter); + const result = middle != null ? combineHangulCharacter(first, middle, last) : first; + + return [...withoutLastCharacter, result].join(''); +}