From d42cc8fce6e9cecc6109779698c1bb842a8e9e57 Mon Sep 17 00:00:00 2001 From: bosung baek Date: Wed, 7 Aug 2024 23:42:17 +0900 Subject: [PATCH 01/11] =?UTF-8?q?feat:=20days=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/constants.ts | 15 +++++++++++++++ src/date.ts | 23 +++++++++++++++++++++++ 2 files changed, 38 insertions(+) create mode 100644 src/date.ts diff --git a/src/constants.ts b/src/constants.ts index e9704ff9..f5bb9b7f 100644 --- a/src/constants.ts +++ b/src/constants.ts @@ -298,3 +298,18 @@ export const SUSA_CLASSIFIER_MAP = { 4: '네', 20: '스무', } as const; + +export const DATE_DAYS_MAP = { + 1: '하루', + 2: '이틀', + 3: '사흘', + 4: '나흘', + 5: '닷새', + 6: '엿새', + 7: '이레', + 8: '여드레', + 9: '아흐레', + 10: '열흘', + 20: '스무날', + 30: '서른날', +} as const; diff --git a/src/date.ts b/src/date.ts new file mode 100644 index 00000000..7c8b90be --- /dev/null +++ b/src/date.ts @@ -0,0 +1,23 @@ +import { hasProperty } from './_internal'; +import { DATE_DAYS_MAP } from './constants'; + +export function days(num: number): string { + validateNumber(num); + return getNumberWord(num); +} + +function validateNumber(num: number): void { + if (Number.isNaN(num) || num <= 0 || num > 30 || !Number.isInteger(num) || !Number.isFinite(num)) { + throw new Error('지원하지 않는 숫자입니다.'); + } +} + +function getNumberWord(num: number): string { + const tens = Math.floor(num / 10) * 10; + const ones = num % 10; + + const tensWord = hasProperty(DATE_DAYS_MAP, tens) ? DATE_DAYS_MAP[tens] : ''; + const onesWord = hasProperty(DATE_DAYS_MAP, ones) ? DATE_DAYS_MAP[ones] : ''; + + return `${tensWord}${onesWord}`; +} From 172c8fc7719a8c83ccc3421aba9ac7ccaa964b1b Mon Sep 17 00:00:00 2001 From: bosung baek Date: Thu, 8 Aug 2024 00:00:39 +0900 Subject: [PATCH 02/11] =?UTF-8?q?test:=20days=EC=97=90=20=EB=8C=80?= =?UTF-8?q?=ED=95=9C=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/date.spec.ts | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 src/date.spec.ts diff --git a/src/date.spec.ts b/src/date.spec.ts new file mode 100644 index 00000000..24acda80 --- /dev/null +++ b/src/date.spec.ts @@ -0,0 +1,38 @@ +import { days } from './date'; + +describe('days', () => { + const validNumbers = [ + { num: 1, word: '하루' }, + { num: 2, word: '이틀' }, + { num: 3, word: '사흘' }, + { num: 4, word: '나흘' }, + { num: 5, word: '닷새' }, + { num: 6, word: '엿새' }, + { num: 7, word: '이레' }, + { num: 8, word: '여드레' }, + { num: 9, word: '아흐레' }, + { num: 10, word: '열흘' }, + { num: 11, word: '열하루' }, + { num: 20, word: '스무날' }, + { num: 21, word: '스무하루' }, + { num: 30, word: '서른날' }, + ]; + + const invalidNumbers = [0, -1, 101, 1.1, -1.1, Infinity, -Infinity, NaN]; + + validNumbers.forEach(({ num, word }) => { + it(`${num} - 순 우리말 날짜 ${word}로 바꿔 반환해야 한다.`, () => { + expect(days(num)).toBe(word); + }); + + // it(`${num} - 순 우리말 수 관형사가 있다면 수 관형사로 없다면 수사로 반환해야 한다.`, () => { + // expect(days(num, true)).toB); + // }); + }); + + invalidNumbers.forEach(num => { + it(`유효하지 않은 숫자 ${num}에 대해 오류를 발생시켜야 한다.`, () => { + expect(() => days(num)).toThrow('지원하지 않는 숫자입니다.'); + }); + }); +}); From 244c6152045c4ba8592a962f11148d32b137be85 Mon Sep 17 00:00:00 2001 From: bosung baek Date: Thu, 8 Aug 2024 00:02:43 +0900 Subject: [PATCH 03/11] =?UTF-8?q?feat:=20=ED=85=8C=EC=8A=A4=ED=8A=B8?= =?UTF-8?q?=EB=A5=BC=20=ED=86=B5=EA=B3=BC=ED=95=98=EB=8F=84=EB=A1=9D=20?= =?UTF-8?q?=EB=AF=B8=EA=B5=AC=ED=98=84=EB=B6=80=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/constants.ts | 5 +++++ src/date.ts | 9 +++++++-- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/src/constants.ts b/src/constants.ts index f5bb9b7f..4333a2b8 100644 --- a/src/constants.ts +++ b/src/constants.ts @@ -309,6 +309,11 @@ export const DATE_DAYS_MAP = { 7: '이레', 8: '여드레', 9: '아흐레', + 10: '열', + 20: '스무', +} as const; + +export const DATE_DAYS_ONLY_TENS_MAP = { 10: '열흘', 20: '스무날', 30: '서른날', diff --git a/src/date.ts b/src/date.ts index 7c8b90be..1569d9fe 100644 --- a/src/date.ts +++ b/src/date.ts @@ -1,8 +1,7 @@ import { hasProperty } from './_internal'; -import { DATE_DAYS_MAP } from './constants'; +import { DATE_DAYS_MAP, DATE_DAYS_ONLY_TENS_MAP } from './constants'; export function days(num: number): string { - validateNumber(num); return getNumberWord(num); } @@ -13,9 +12,15 @@ function validateNumber(num: number): void { } function getNumberWord(num: number): string { + validateNumber(num); + const tens = Math.floor(num / 10) * 10; const ones = num % 10; + if (ones === 0 && hasProperty(DATE_DAYS_ONLY_TENS_MAP, tens)) { + return DATE_DAYS_ONLY_TENS_MAP[tens]; + } + const tensWord = hasProperty(DATE_DAYS_MAP, tens) ? DATE_DAYS_MAP[tens] : ''; const onesWord = hasProperty(DATE_DAYS_MAP, ones) ? DATE_DAYS_MAP[ones] : ''; From 6e8cd9e0e9e302eb782ecccc173bc7413eef9480 Mon Sep 17 00:00:00 2001 From: bosung baek Date: Thu, 8 Aug 2024 00:04:18 +0900 Subject: [PATCH 04/11] =?UTF-8?q?feat:=20index=20=EC=97=90=EC=84=9C=20expo?= =?UTF-8?q?rt=20=ED=95=98=EB=8F=84=EB=A1=9D=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/index.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/index.ts b/src/index.ts index 44ab09b2..c1a6cd7a 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,6 +1,7 @@ export { assemble } from './assemble'; export { combineCharacter, combineVowels } from './combineCharacter'; export { convertQwertyToHangul, convertQwertyToAlphabet } from './convertQwertyToAlphabet'; +export { days } from './date'; export { disassemble, disassembleToGroups } from './disassemble'; export { disassembleCompleteCharacter } from './disassembleCompleteCharacter'; export { josa } from './josa'; From 5491d7864cf07b5b6bc30b95fbd53698d0a4bc8c Mon Sep 17 00:00:00 2001 From: bosung baek Date: Thu, 8 Aug 2024 00:28:26 +0900 Subject: [PATCH 05/11] =?UTF-8?q?chore:=20=EC=BD=94=EB=93=9C=20=EC=A0=95?= =?UTF-8?q?=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/date.ts | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/date.ts b/src/date.ts index 1569d9fe..e46f4f3b 100644 --- a/src/date.ts +++ b/src/date.ts @@ -5,12 +5,6 @@ export function days(num: number): string { return getNumberWord(num); } -function validateNumber(num: number): void { - if (Number.isNaN(num) || num <= 0 || num > 30 || !Number.isInteger(num) || !Number.isFinite(num)) { - throw new Error('지원하지 않는 숫자입니다.'); - } -} - function getNumberWord(num: number): string { validateNumber(num); @@ -26,3 +20,9 @@ function getNumberWord(num: number): string { return `${tensWord}${onesWord}`; } + +function validateNumber(num: number): void { + if (Number.isNaN(num) || num <= 0 || num > 30 || !Number.isInteger(num) || !Number.isFinite(num)) { + throw new Error('지원하지 않는 숫자입니다.'); + } +} From 5d72e8944742bd2137512e9bee71d638d722aff4 Mon Sep 17 00:00:00 2001 From: bosung baek Date: Thu, 8 Aug 2024 00:28:41 +0900 Subject: [PATCH 06/11] =?UTF-8?q?chore:=20=EB=B6=88=ED=95=84=EC=9A=94?= =?UTF-8?q?=ED=95=9C=20=EC=A3=BC=EC=84=9D=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/date.spec.ts | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/date.spec.ts b/src/date.spec.ts index 24acda80..b955a8df 100644 --- a/src/date.spec.ts +++ b/src/date.spec.ts @@ -24,10 +24,6 @@ describe('days', () => { it(`${num} - 순 우리말 날짜 ${word}로 바꿔 반환해야 한다.`, () => { expect(days(num)).toBe(word); }); - - // it(`${num} - 순 우리말 수 관형사가 있다면 수 관형사로 없다면 수사로 반환해야 한다.`, () => { - // expect(days(num, true)).toB); - // }); }); invalidNumbers.forEach(num => { From ca4391b3fc9212e079f706ea38e4f499dce0ecab Mon Sep 17 00:00:00 2001 From: bosung baek Date: Thu, 8 Aug 2024 00:33:52 +0900 Subject: [PATCH 07/11] =?UTF-8?q?docs:=20date=20mdx=20=ED=8C=8C=EC=9D=BC?= =?UTF-8?q?=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/src/pages/docs/api/date.en.mdx | 48 +++++++++++++++++++++++++++++ docs/src/pages/docs/api/date.ko.mdx | 47 ++++++++++++++++++++++++++++ 2 files changed, 95 insertions(+) create mode 100644 docs/src/pages/docs/api/date.en.mdx create mode 100644 docs/src/pages/docs/api/date.ko.mdx diff --git a/docs/src/pages/docs/api/date.en.mdx b/docs/src/pages/docs/api/date.en.mdx new file mode 100644 index 00000000..db50201f --- /dev/null +++ b/docs/src/pages/docs/api/date.en.mdx @@ -0,0 +1,48 @@ +--- +title: date +--- + +import { Sandpack } from '@/components/Sandpack'; + +# date + +Convert numbers to native Korean words representing dates. The given number is valid when it is greater than 0 and less than or equal to 30. + +## days + +Convert numbers to native Korean words for days. + +```typescript +function days( + // Number to convert + num: number +): string; +``` + +### Examples + +```typescript +days(1); // '하루' +days(2); // '이틀' +days(3); // '사흘' +days(10); // '열흘' +days(11); // '열하루' +days(20); // '스무날' +days(29); // '스무아흐레' +days(30); // '서른날' +``` + +### Demo + +
+ + + +```ts index.ts +import { days } from 'es-hangul'; + +console.log(days(3)); +console.log(days(4)); +``` + + diff --git a/docs/src/pages/docs/api/date.ko.mdx b/docs/src/pages/docs/api/date.ko.mdx new file mode 100644 index 00000000..5e872700 --- /dev/null +++ b/docs/src/pages/docs/api/date.ko.mdx @@ -0,0 +1,47 @@ +--- +title: date +--- + +import { Sandpack } from '@/components/Sandpack'; + +# date + +숫자를 날짜를 나타내는 순우리말로 바꿔줍니다. 주어진 숫자가 0보다 크고 30 이하일 때 유효합니다. + +## days + +숫자를 순우리말 날로 바꿔줍니다. + +```typescript +function days( + // 변환할 숫자 + num: number +): string; +``` + +### Examples + +```typescript +days(1); // '하루' +days(2); // '이틀' +days(3); // '사흘' +days(10); // '열흘' +days(11); // '열하루' +days(20); // '스무날' +days(29); // '스무아흐레' +days(30); // '서른날' +``` + +### 사용해보기 + +
+ + + +```ts index.ts +import { canBeJongseong } from 'es-hangul'; + +console.log(canBeJongseong('ㄱ')); +``` + + From 2531d0a80106ddceb14cbb3084149f43b0b688d9 Mon Sep 17 00:00:00 2001 From: bosung baek Date: Thu, 8 Aug 2024 00:37:39 +0900 Subject: [PATCH 08/11] =?UTF-8?q?test:=20=ED=85=8C=EC=8A=A4=ED=8A=B8?= =?UTF-8?q?=EB=A5=BC=20date=EB=A1=9C=20=EA=B0=90=EC=8B=B8=EA=B3=A0=20invai?= =?UTF-8?q?ldNumber=EC=97=90=EC=84=9C=20101=EB=B3=B4=EB=8B=A4=20=EA=B0=80?= =?UTF-8?q?=EA=B9=8C=EC=9A=B4=2031=EB=A1=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/date.spec.ts | 52 +++++++++++++++++++++++++----------------------- 1 file changed, 27 insertions(+), 25 deletions(-) diff --git a/src/date.spec.ts b/src/date.spec.ts index b955a8df..af492c07 100644 --- a/src/date.spec.ts +++ b/src/date.spec.ts @@ -1,34 +1,36 @@ import { days } from './date'; -describe('days', () => { - const validNumbers = [ - { num: 1, word: '하루' }, - { num: 2, word: '이틀' }, - { num: 3, word: '사흘' }, - { num: 4, word: '나흘' }, - { num: 5, word: '닷새' }, - { num: 6, word: '엿새' }, - { num: 7, word: '이레' }, - { num: 8, word: '여드레' }, - { num: 9, word: '아흐레' }, - { num: 10, word: '열흘' }, - { num: 11, word: '열하루' }, - { num: 20, word: '스무날' }, - { num: 21, word: '스무하루' }, - { num: 30, word: '서른날' }, - ]; +describe('date', () => { + describe('days', () => { + const validNumbers = [ + { num: 1, word: '하루' }, + { num: 2, word: '이틀' }, + { num: 3, word: '사흘' }, + { num: 4, word: '나흘' }, + { num: 5, word: '닷새' }, + { num: 6, word: '엿새' }, + { num: 7, word: '이레' }, + { num: 8, word: '여드레' }, + { num: 9, word: '아흐레' }, + { num: 10, word: '열흘' }, + { num: 11, word: '열하루' }, + { num: 20, word: '스무날' }, + { num: 21, word: '스무하루' }, + { num: 30, word: '서른날' }, + ]; - const invalidNumbers = [0, -1, 101, 1.1, -1.1, Infinity, -Infinity, NaN]; + const invalidNumbers = [0, -1, 31, 1.1, -1.1, Infinity, -Infinity, NaN]; - validNumbers.forEach(({ num, word }) => { - it(`${num} - 순 우리말 날짜 ${word}로 바꿔 반환해야 한다.`, () => { - expect(days(num)).toBe(word); + validNumbers.forEach(({ num, word }) => { + it(`${num} - 순 우리말 날짜 ${word}로 바꿔 반환해야 한다.`, () => { + expect(days(num)).toBe(word); + }); }); - }); - invalidNumbers.forEach(num => { - it(`유효하지 않은 숫자 ${num}에 대해 오류를 발생시켜야 한다.`, () => { - expect(() => days(num)).toThrow('지원하지 않는 숫자입니다.'); + invalidNumbers.forEach(num => { + it(`유효하지 않은 숫자 ${num}에 대해 오류를 발생시켜야 한다.`, () => { + expect(() => days(num)).toThrow('지원하지 않는 숫자입니다.'); + }); }); }); }); From d84d2718d2e93d688dcf323f6919b116c966d5ff Mon Sep 17 00:00:00 2001 From: bosung baek Date: Fri, 9 Aug 2024 23:16:30 +0900 Subject: [PATCH 09/11] =?UTF-8?q?docs:=20=EC=9E=98=EB=AA=BB=EB=90=9C=20?= =?UTF-8?q?=EC=98=88=EC=A0=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/src/pages/docs/api/date.ko.mdx | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/docs/src/pages/docs/api/date.ko.mdx b/docs/src/pages/docs/api/date.ko.mdx index 5e872700..7073af87 100644 --- a/docs/src/pages/docs/api/date.ko.mdx +++ b/docs/src/pages/docs/api/date.ko.mdx @@ -39,9 +39,10 @@ days(30); // '서른날' ```ts index.ts -import { canBeJongseong } from 'es-hangul'; +import { days } from 'es-hangul'; -console.log(canBeJongseong('ㄱ')); +console.log(days(3)); +console.log(days(4)); ``` From 87b0b41d5eb5f7de946aaace199e666cad92f97c Mon Sep 17 00:00:00 2001 From: bosung baek Date: Fri, 9 Aug 2024 23:26:25 +0900 Subject: [PATCH 10/11] =?UTF-8?q?refactor:=20date=EC=9D=98=20=ED=99=95?= =?UTF-8?q?=EC=9E=A5=EC=9D=84=20=EA=B3=A0=EB=A0=A4=ED=95=B4=20=ED=8F=B4?= =?UTF-8?q?=EB=8D=94=EA=B5=AC=EC=A1=B0=EB=A5=BC=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/constants.ts | 20 -------------------- src/{ => date}/date.spec.ts | 2 +- src/date/days.constants.ts | 19 +++++++++++++++++++ src/{date.ts => date/index.ts} | 12 ++++++------ 4 files changed, 26 insertions(+), 27 deletions(-) rename src/{ => date}/date.spec.ts (97%) create mode 100644 src/date/days.constants.ts rename src/{date.ts => date/index.ts} (55%) diff --git a/src/constants.ts b/src/constants.ts index 4333a2b8..e9704ff9 100644 --- a/src/constants.ts +++ b/src/constants.ts @@ -298,23 +298,3 @@ export const SUSA_CLASSIFIER_MAP = { 4: '네', 20: '스무', } as const; - -export const DATE_DAYS_MAP = { - 1: '하루', - 2: '이틀', - 3: '사흘', - 4: '나흘', - 5: '닷새', - 6: '엿새', - 7: '이레', - 8: '여드레', - 9: '아흐레', - 10: '열', - 20: '스무', -} as const; - -export const DATE_DAYS_ONLY_TENS_MAP = { - 10: '열흘', - 20: '스무날', - 30: '서른날', -} as const; diff --git a/src/date.spec.ts b/src/date/date.spec.ts similarity index 97% rename from src/date.spec.ts rename to src/date/date.spec.ts index af492c07..9dc1ff85 100644 --- a/src/date.spec.ts +++ b/src/date/date.spec.ts @@ -1,4 +1,4 @@ -import { days } from './date'; +import { days } from '.'; describe('date', () => { describe('days', () => { diff --git a/src/date/days.constants.ts b/src/date/days.constants.ts new file mode 100644 index 00000000..db5b082c --- /dev/null +++ b/src/date/days.constants.ts @@ -0,0 +1,19 @@ +export const DAYS_MAP = { + 1: '하루', + 2: '이틀', + 3: '사흘', + 4: '나흘', + 5: '닷새', + 6: '엿새', + 7: '이레', + 8: '여드레', + 9: '아흐레', + 10: '열', + 20: '스무', +} as const; + +export const DAYS_ONLY_TENS_MAP = { + 10: '열흘', + 20: '스무날', + 30: '서른날', +} as const; diff --git a/src/date.ts b/src/date/index.ts similarity index 55% rename from src/date.ts rename to src/date/index.ts index e46f4f3b..04912cfb 100644 --- a/src/date.ts +++ b/src/date/index.ts @@ -1,5 +1,5 @@ -import { hasProperty } from './_internal'; -import { DATE_DAYS_MAP, DATE_DAYS_ONLY_TENS_MAP } from './constants'; +import { hasProperty } from '../_internal'; +import { DAYS_MAP, DAYS_ONLY_TENS_MAP } from './days.constants'; export function days(num: number): string { return getNumberWord(num); @@ -11,12 +11,12 @@ function getNumberWord(num: number): string { const tens = Math.floor(num / 10) * 10; const ones = num % 10; - if (ones === 0 && hasProperty(DATE_DAYS_ONLY_TENS_MAP, tens)) { - return DATE_DAYS_ONLY_TENS_MAP[tens]; + if (ones === 0 && hasProperty(DAYS_ONLY_TENS_MAP, tens)) { + return DAYS_ONLY_TENS_MAP[tens]; } - const tensWord = hasProperty(DATE_DAYS_MAP, tens) ? DATE_DAYS_MAP[tens] : ''; - const onesWord = hasProperty(DATE_DAYS_MAP, ones) ? DATE_DAYS_MAP[ones] : ''; + const tensWord = hasProperty(DAYS_MAP, tens) ? DAYS_MAP[tens] : ''; + const onesWord = hasProperty(DAYS_MAP, ones) ? DAYS_MAP[ones] : ''; return `${tensWord}${onesWord}`; } From 0922f463135e0df49f840b4dcb6c9901924b4334 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=B0=95=EC=B0=AC=ED=98=81?= Date: Sat, 10 Aug 2024 01:04:07 +0900 Subject: [PATCH 11/11] Create spicy-teachers-admire.md --- .changeset/spicy-teachers-admire.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/spicy-teachers-admire.md diff --git a/.changeset/spicy-teachers-admire.md b/.changeset/spicy-teachers-admire.md new file mode 100644 index 00000000..1060b6f8 --- /dev/null +++ b/.changeset/spicy-teachers-admire.md @@ -0,0 +1,5 @@ +--- +"es-hangul": minor +--- + +feat: 숫자를 날짜를 나타내는 순우리말로 바꿔주는 함수 중 days를 추가