@bimeister/pupakit.calendar
Version:
PupaKit Calendar
30 lines • 6.85 kB
JavaScript
import { BIG_CALENDAR_CYCLE_SIZE_IN_YEARS } from '../constants/big-calendar-cycle-size-in-years.const';
import { DAYS_IN_WEEK } from '../constants/days-in-week.const';
import { SMALL_CALENDAR_CYCLE_SIZE_IN_YEARS } from '../constants/small-calendar-cycle-size-in-years.const';
import { SMALL_CALENDAR_CYCLE_WEEKDAYS_SEQUENCE } from '../constants/small-calendar-cycle-weekdays-sequence.const';
import '../enums/day-of-week.enum';
import '../enums/month-index.enum';
import { isLeapYear } from './is-leap-year.function';
const NORMAL_YEAR_OFFSETS_IN_SMALL_CYCLE = [0, 3, 3, 6, 1, 4, 6, 2, 5, 0, 3, 5];
export function getWeekdayIndex(yearNumber, monthIndex, dayNumber) {
const daysOffset = getDaysOffset(yearNumber, monthIndex);
const yearIndexInSmallCycle = getYearIndexInSmallCycle(yearNumber);
const dayIndex = dayNumber - 1;
const weekdayIndexInSmallCycle = SMALL_CALENDAR_CYCLE_WEEKDAYS_SEQUENCE[yearIndexInSmallCycle];
const weekdayIndex = (weekdayIndexInSmallCycle + daysOffset + dayIndex) % DAYS_IN_WEEK;
return weekdayIndex;
}
function getYearIndexInSmallCycle(yearNumber) {
const yearIndex = yearNumber - 1;
const yearIndexInBigCycle = yearIndex % BIG_CALENDAR_CYCLE_SIZE_IN_YEARS;
const centuryInBigCycle = Math.floor(yearIndexInBigCycle / 100);
const yearIndexRestoredWithBigCycle = 4 * centuryInBigCycle + (yearIndexInBigCycle % 100);
const yearIndexInSmallCycle = yearIndexRestoredWithBigCycle % SMALL_CALENDAR_CYCLE_SIZE_IN_YEARS;
return yearIndexInSmallCycle;
}
function getDaysOffset(yearNumber, monthIndex) {
const offset = NORMAL_YEAR_OFFSETS_IN_SMALL_CYCLE[monthIndex];
const isLeapYearAndFebruaryEnded = isLeapYear(yearNumber) && monthIndex > 1;
return isLeapYearAndFebruaryEnded ? offset + 1 : offset;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2V0LXdlZWtkYXktaW5kZXguZnVuY3Rpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvZGVjbGFyYXRpb25zL2Z1bmN0aW9ucy9nZXQtd2Vla2RheS1pbmRleC5mdW5jdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsZ0NBQWdDLEVBQUUsTUFBTSxxREFBcUQsQ0FBQztBQUN2RyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDL0QsT0FBTyxFQUFFLGtDQUFrQyxFQUFFLE1BQU0sdURBQXVELENBQUM7QUFDM0csT0FBTyxFQUFFLHNDQUFzQyxFQUFFLE1BQU0sMkRBQTJELENBQUM7QUFDbkgsT0FBMEIsMkJBQTJCLENBQUM7QUFDdEQsT0FBMkIsMkJBQTJCLENBQUM7QUFDdkQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBR3JELE1BQU0sa0NBQWtDLEdBQWEsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBRTFGLE1BQU0sVUFBVSxlQUFlLENBQUMsVUFBa0IsRUFBRSxVQUFzQixFQUFFLFNBQWlCO0lBQzNGLE1BQU0sVUFBVSxHQUFXLGFBQWEsQ0FBQyxVQUFVLEVBQUUsVUFBVSxDQUFDLENBQUM7SUFFakUsTUFBTSxxQkFBcUIsR0FBVyx3QkFBd0IsQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUUzRSxNQUFNLFFBQVEsR0FBVyxTQUFTLEdBQUcsQ0FBQyxDQUFDO0lBQ3ZDLE1BQU0sd0JBQXdCLEdBQWMsc0NBQXNDLENBQUMscUJBQXFCLENBQUMsQ0FBQztJQUUxRyxNQUFNLFlBQVksR0FBYyxDQUFDLHdCQUF3QixHQUFHLFVBQVUsR0FBRyxRQUFRLENBQUMsR0FBRyxZQUFZLENBQUM7SUFFbEcsT0FBTyxZQUFZLENBQUM7QUFDdEIsQ0FBQztBQUVELFNBQVMsd0JBQXdCLENBQUMsVUFBa0I7SUFDbEQsTUFBTSxTQUFTLEdBQVcsVUFBVSxHQUFHLENBQUMsQ0FBQztJQUV6QyxNQUFNLG1CQUFtQixHQUFXLFNBQVMsR0FBRyxnQ0FBZ0MsQ0FBQztJQUVqRixNQUFNLGlCQUFpQixHQUFXLElBQUksQ0FBQyxLQUFLLENBQUMsbUJBQW1CLEdBQUcsR0FBRyxDQUFDLENBQUM7SUFFeEUsTUFBTSw2QkFBNkIsR0FBVyxDQUFDLEdBQUcsaUJBQWlCLEdBQUcsQ0FBQyxtQkFBbUIsR0FBRyxHQUFHLENBQUMsQ0FBQztJQUVsRyxNQUFNLHFCQUFxQixHQUFXLDZCQUE2QixHQUFHLGtDQUFrQyxDQUFDO0lBRXpHLE9BQU8scUJBQXFCLENBQUM7QUFDL0IsQ0FBQztBQUVELFNBQVMsYUFBYSxDQUFDLFVBQWtCLEVBQUUsVUFBc0I7SUFDL0QsTUFBTSxNQUFNLEdBQVcsa0NBQWtDLENBQUMsVUFBVSxDQUFDLENBQUM7SUFFdEUsTUFBTSwwQkFBMEIsR0FBWSxVQUFVLENBQUMsVUFBVSxDQUFDLElBQUksVUFBVSxJQUFzQixDQUFDO0lBR3ZHLE9BQU8sMEJBQTBCLENBQUMsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQztBQUMxRCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQklHX0NBTEVOREFSX0NZQ0xFX1NJWkVfSU5fWUVBUlMgfSBmcm9tICcuLi9jb25zdGFudHMvYmlnLWNhbGVuZGFyLWN5Y2xlLXNpemUtaW4teWVhcnMuY29uc3QnO1xuaW1wb3J0IHsgREFZU19JTl9XRUVLIH0gZnJvbSAnLi4vY29uc3RhbnRzL2RheXMtaW4td2Vlay5jb25zdCc7XG5pbXBvcnQgeyBTTUFMTF9DQUxFTkRBUl9DWUNMRV9TSVpFX0lOX1lFQVJTIH0gZnJvbSAnLi4vY29uc3RhbnRzL3NtYWxsLWNhbGVuZGFyLWN5Y2xlLXNpemUtaW4teWVhcnMuY29uc3QnO1xuaW1wb3J0IHsgU01BTExfQ0FMRU5EQVJfQ1lDTEVfV0VFS0RBWVNfU0VRVUVOQ0UgfSBmcm9tICcuLi9jb25zdGFudHMvc21hbGwtY2FsZW5kYXItY3ljbGUtd2Vla2RheXMtc2VxdWVuY2UuY29uc3QnO1xuaW1wb3J0IHsgRGF5T2ZXZWVrIH0gZnJvbSAnLi4vZW51bXMvZGF5LW9mLXdlZWsuZW51bSc7XG5pbXBvcnQgeyBNb250aEluZGV4IH0gZnJvbSAnLi4vZW51bXMvbW9udGgtaW5kZXguZW51bSc7XG5pbXBvcnQgeyBpc0xlYXBZZWFyIH0gZnJvbSAnLi9pcy1sZWFwLXllYXIuZnVuY3Rpb24nO1xuXG4vLyBvZmZzZXQgZGF5cyBvZiB0aGUgd2VlayBvbiB0aGUgZmlyc3QgZGF5IG9mIGVhY2ggbW9udGggZm9yIHRoZSBOT1JNQUwgeWVhclxuY29uc3QgTk9STUFMX1lFQVJfT0ZGU0VUU19JTl9TTUFMTF9DWUNMRTogbnVtYmVyW10gPSBbMCwgMywgMywgNiwgMSwgNCwgNiwgMiwgNSwgMCwgMywgNV07XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRXZWVrZGF5SW5kZXgoeWVhck51bWJlcjogbnVtYmVyLCBtb250aEluZGV4OiBNb250aEluZGV4LCBkYXlOdW1iZXI6IG51bWJlcik6IERheU9mV2VlayB7XG4gIGNvbnN0IGRheXNPZmZzZXQ6IG51bWJlciA9IGdldERheXNPZmZzZXQoeWVhck51bWJlciwgbW9udGhJbmRleCk7XG5cbiAgY29uc3QgeWVhckluZGV4SW5TbWFsbEN5Y2xlOiBudW1iZXIgPSBnZXRZZWFySW5kZXhJblNtYWxsQ3ljbGUoeWVhck51bWJlcik7XG5cbiAgY29uc3QgZGF5SW5kZXg6IG51bWJlciA9IGRheU51bWJlciAtIDE7XG4gIGNvbnN0IHdlZWtkYXlJbmRleEluU21hbGxDeWNsZTogRGF5T2ZXZWVrID0gU01BTExfQ0FMRU5EQVJfQ1lDTEVfV0VFS0RBWVNfU0VRVUVOQ0VbeWVhckluZGV4SW5TbWFsbEN5Y2xlXTtcblxuICBjb25zdCB3ZWVrZGF5SW5kZXg6IERheU9mV2VlayA9ICh3ZWVrZGF5SW5kZXhJblNtYWxsQ3ljbGUgKyBkYXlzT2Zmc2V0ICsgZGF5SW5kZXgpICUgREFZU19JTl9XRUVLO1xuXG4gIHJldHVybiB3ZWVrZGF5SW5kZXg7XG59XG5cbmZ1bmN0aW9uIGdldFllYXJJbmRleEluU21hbGxDeWNsZSh5ZWFyTnVtYmVyOiBudW1iZXIpOiBudW1iZXIge1xuICBjb25zdCB5ZWFySW5kZXg6IG51bWJlciA9IHllYXJOdW1iZXIgLSAxO1xuXG4gIGNvbnN0IHllYXJJbmRleEluQmlnQ3ljbGU6IG51bWJlciA9IHllYXJJbmRleCAlIEJJR19DQUxFTkRBUl9DWUNMRV9TSVpFX0lOX1lFQVJTO1xuXG4gIGNvbnN0IGNlbnR1cnlJbkJpZ0N5Y2xlOiBudW1iZXIgPSBNYXRoLmZsb29yKHllYXJJbmRleEluQmlnQ3ljbGUgLyAxMDApO1xuXG4gIGNvbnN0IHllYXJJbmRleFJlc3RvcmVkV2l0aEJpZ0N5Y2xlOiBudW1iZXIgPSA0ICogY2VudHVyeUluQmlnQ3ljbGUgKyAoeWVhckluZGV4SW5CaWdDeWNsZSAlIDEwMCk7XG5cbiAgY29uc3QgeWVhckluZGV4SW5TbWFsbEN5Y2xlOiBudW1iZXIgPSB5ZWFySW5kZXhSZXN0b3JlZFdpdGhCaWdDeWNsZSAlIFNNQUxMX0NBTEVOREFSX0NZQ0xFX1NJWkVfSU5fWUVBUlM7XG5cbiAgcmV0dXJuIHllYXJJbmRleEluU21hbGxDeWNsZTtcbn1cblxuZnVuY3Rpb24gZ2V0RGF5c09mZnNldCh5ZWFyTnVtYmVyOiBudW1iZXIsIG1vbnRoSW5kZXg6IE1vbnRoSW5kZXgpOiBudW1iZXIge1xuICBjb25zdCBvZmZzZXQ6IG51bWJlciA9IE5PUk1BTF9ZRUFSX09GRlNFVFNfSU5fU01BTExfQ1lDTEVbbW9udGhJbmRleF07XG5cbiAgY29uc3QgaXNMZWFwWWVhckFuZEZlYnJ1YXJ5RW5kZWQ6IGJvb2xlYW4gPSBpc0xlYXBZZWFyKHllYXJOdW1iZXIpICYmIG1vbnRoSW5kZXggPiBNb250aEluZGV4LkZlYnJ1YXJ5O1xuXG4gIC8vIGluY3JlYXNlIG9mZnNldCwgYmVjYXVzZSBmZWJydWFyeSBpbiBsZWFwIHllYXIgaGFzIDI5IGRheXNcbiAgcmV0dXJuIGlzTGVhcFllYXJBbmRGZWJydWFyeUVuZGVkID8gb2Zmc2V0ICsgMSA6IG9mZnNldDtcbn1cbiJdfQ==