From 402ddb81edfee58a3a90ba8dd13eb039c943c351 Mon Sep 17 00:00:00 2001 From: Quantum Date: Sat, 12 Feb 2022 12:27:14 -0500 Subject: [PATCH] Add month and date functions --- src/Calendar.ts | 26 ------- src/{Calendar.test.ts => dates.test.ts} | 26 ++++++- src/dates.ts | 97 +++++++++++++++++++++++++ 3 files changed, 122 insertions(+), 27 deletions(-) delete mode 100644 src/Calendar.ts rename src/{Calendar.test.ts => dates.test.ts} (58%) create mode 100644 src/dates.ts diff --git a/src/Calendar.ts b/src/Calendar.ts deleted file mode 100644 index 5fcbaf8..0000000 --- a/src/Calendar.ts +++ /dev/null @@ -1,26 +0,0 @@ -import data from '../cal.json'; - -const startJD = data.start_jd; -const startYear = data.start_year; -const leaps: Array = [0]; - -let leapFromStart = 0; -data.leap.forEach(leap => { - leapFromStart += leap; - leaps.push(leapFromStart); -}); - -export function gregorianJDN(year: number, month: number, day: number) { - const g = year + 4716 - (month <= 2 ? 1 : 0); - const f = (month + 9) % 12; - const e = Math.floor(1461 * g / 4) + day - 1402; - const J = e + Math.floor((153 * f + 2) / 5); - const dg = 38 - Math.floor(Math.floor((g + 184) / 100) * 3 / 4); - return J + dg; -} - -export function frJDN(year: number, month: number, day: number) { - const dy = year - startYear; - const dd = month * 30 + day - 31; - return startJD + 365 * dy + leaps[dy] + dd; -} diff --git a/src/Calendar.test.ts b/src/dates.test.ts similarity index 58% rename from src/Calendar.test.ts rename to src/dates.test.ts index 33c5076..ac25d53 100644 --- a/src/Calendar.test.ts +++ b/src/dates.test.ts @@ -1,4 +1,4 @@ -import {frJDN, gregorianJDN} from './Calendar'; +import {dateName, frJDN, gregorianJDN, monthName} from './dates'; describe('gregorianJDN', () => { it('works', () => { @@ -29,3 +29,27 @@ describe('frJDN', () => { expect(frJDN(2490, 1, 1)).toBe(3284926); // equinox 4281-09-20T23:50:38 UT1 }); }); + +describe('monthName', () => { + it('works', () => { + expect(monthName(1)).toBe('Vendémiaire'); + expect(monthName(12)).toBe('Fructidor'); + expect(monthName(13)).toBe('Jours Complémentaires'); + }); +}); + +describe('dateName', () => { + it('works', () => { + expect(dateName(1, 1)).toBe('1 Vendémiaire'); + expect(dateName(2, 18)).toBe('18 Brumaire'); + expect(dateName(3, 11)).toBe('11 Frimaire'); + expect(dateName(8, 16)).toBe('16 Floréal'); + expect(dateName(12, 30)).toBe('30 Fructidor'); + expect(dateName(13, 1)).toBe('La Fête de la Vertu'); + expect(dateName(13, 6)).toBe('La Fête de la Révolution'); + }); + + it('returns null for non-existent complimentary days', () => { + expect(dateName(13, 7)).toBeNull(); + }); +}); diff --git a/src/dates.ts b/src/dates.ts new file mode 100644 index 0000000..b356829 --- /dev/null +++ b/src/dates.ts @@ -0,0 +1,97 @@ +import data from '../cal.json'; + +// Month 13 is for the complementary days +export type Month = 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13; +export type Day = + 1 + | 2 + | 3 + | 4 + | 5 + | 6 + | 7 + | 8 + | 9 + | 10 + | 11 + | 12 + | 13 + | 14 + | 15 + | 16 + | 17 + | 18 + | 19 + | 20 + | 21 + | 22 + | 23 + | 24 + | 25 + | 26 + | 27 + | 28 + | 29 + | 30; + +const monthNames: { + [key in Month]: string +} = { + 1: 'Vendémiaire', + 2: 'Brumaire', + 3: 'Frimaire', + 4: 'Nivôse', + 5: 'Pluviôse', + 6: 'Ventôse', + 7: 'Germinal', + 8: 'Floréal', + 9: 'Prairial', + 10: 'Messidor', + 11: 'Thermidor', + 12: 'Fructidor', + 13: 'Jours Complémentaires', +}; + +const startJD = data.start_jd; +const startYear = data.start_year; +const leaps: Array = [0]; + +let leapFromStart = 0; +data.leap.forEach(leap => { + leapFromStart += leap; + leaps.push(leapFromStart); +}); + +export function gregorianJDN(year: number, month: number, day: number): number { + const g = year + 4716 - (month <= 2 ? 1 : 0); + const f = (month + 9) % 12; + const e = Math.floor(1461 * g / 4) + day - 1402; + const J = e + Math.floor((153 * f + 2) / 5); + const dg = 38 - Math.floor(Math.floor((g + 184) / 100) * 3 / 4); + return J + dg; +} + +export function frJDN(year: number, month: Month, day: Day): number { + const dy = year - startYear; + const dd = month * 30 + day - 31; + return startJD + 365 * dy + leaps[dy] + dd; +} + +export function monthName(month: Month): string { + return monthNames[month]; +} + +export function dateName(month: Month, day: Day): string | null { + if (month === 13) { + switch (day) { + case 1: return 'La Fête de la Vertu'; + case 2: return 'La Fête du Génie'; + case 3: return 'La Fête du Travail'; + case 4: return "La Fête de l'Opinion"; + case 5: return 'La Fête des Récompenses'; + case 6: return 'La Fête de la Révolution'; + default: return null; + } + } + return `${day} ${monthNames[month]}`; +}