@hebcal/leyning
Version:
Torah Reading API for Parashat HaShavua and holidays
146 lines (143 loc) • 4.72 kB
JavaScript
/*! @hebcal/leyning v9.5.4 */
import { months, HDate } from '@hebcal/hdate';
import { flags } from '@hebcal/core/dist/esm/event';
import { hasFestival } from './festival.js';
const HOLIDAY_IGNORE_MASK = flags.DAF_YOMI |
flags.OMER_COUNT |
flags.SHABBAT_MEVARCHIM |
flags.MOLAD |
flags.USER_EVENT |
flags.HEBREW_DATE |
flags.MISHNA_YOMI |
flags.MODERN_HOLIDAY |
flags.YERUSHALMI_YOMI;
/**
* Based on the event date, type and title, finds the relevant leyning key
* @param ev event
* @param [il] true if Israel holiday scheme
* @returns key to look up in holiday-reading.json
*/
function getLeyningKeyForEvent(ev, il = false) {
// eslint-disable-next-line @typescript-eslint/no-explicit-any
if (ev.eventTime !== undefined) {
return undefined;
}
const mask = ev.getFlags();
if (mask & HOLIDAY_IGNORE_MASK) {
return undefined;
}
// Skip all Erevs except for Simchat Torah
const desc = ev.getDesc();
if (mask & flags.EREV && !hasFestival(desc)) {
return undefined;
}
const hd = ev.getDate();
const day = hd.getDate();
const dow = hd.abs() % 7;
const month = hd.getMonth();
const isShabbat = dow === 6;
const isRoshChodesh = day === 1 || day === 30;
const holiday = ev.basename();
const isPesach = holiday === 'Pesach';
if (il && isPesach) {
if (isShabbat) {
return day === 15 || day === 21
? desc + ' (on Shabbat)'
: 'Pesach Shabbat Chol ha-Moed';
}
return desc;
}
if (day === 1 && month === months.TISHREI) {
return isShabbat ? 'Rosh Hashana I (on Shabbat)' : 'Rosh Hashana I';
}
// eslint-disable-next-line @typescript-eslint/no-explicit-any
const cholHaMoedDay = ev.cholHaMoedDay;
if (typeof cholHaMoedDay === 'number') {
// Sukkot or Pesach
if (isShabbat) {
return holiday + ' Shabbat Chol ha-Moed';
}
else if (desc === 'Sukkot VII (Hoshana Raba)') {
return 'Sukkot Final Day (Hoshana Raba)';
}
if (isPesach && cholHaMoedDay) {
if (dow === 0 && desc === "Pesach IV (CH''M)") {
return 'Pesach Chol ha-Moed Day 2 on Sunday';
}
else if (dow === 1 && desc === "Pesach V (CH''M)") {
return 'Pesach Chol ha-Moed Day 3 on Monday';
}
}
return `${holiday} Chol ha-Moed Day ${cholHaMoedDay}`;
}
// eslint-disable-next-line @typescript-eslint/no-explicit-any
const chanukahDay = ev.chanukahDay;
if (typeof chanukahDay === 'number') {
if (isShabbat && isRoshChodesh) {
return 'Shabbat Rosh Chodesh Chanukah';
}
else if (isRoshChodesh && chanukahDay === 7) {
return 'Chanukah Day 7 (on Rosh Chodesh)';
}
else if (isShabbat) {
return `Chanukah Day ${chanukahDay} (on Shabbat)`;
}
else {
return `Chanukah Day ${chanukahDay}`;
}
}
if (isRoshChodesh &&
(desc === 'Shabbat HaChodesh' || desc === 'Shabbat Shekalim')) {
return desc + ' (on Rosh Chodesh)';
}
if (il && desc === 'Shmini Atzeret') {
return 'Simchat Torah' + (isShabbat ? ' (on Shabbat)' : '');
}
if (desc === 'Chag HaBanot') {
return undefined;
}
if (isShabbat && 'Shabbat' !== desc.substring(0, 7)) {
if (isRoshChodesh) {
if (desc === 'Rosh Chodesh Tevet') {
return 'Shabbat Rosh Chodesh Chanukah';
}
return 'Shabbat Rosh Chodesh';
}
const desc2 = desc + ' (on Shabbat)';
if (hasFestival(desc2)) {
return desc2;
}
}
if (hasFestival(desc)) {
return desc;
}
if (isShabbat) {
const tommorow = hd.next().getDate();
if (tommorow === 30 || tommorow === 1) {
return 'Shabbat Machar Chodesh';
}
}
if (desc === 'Rosh Hashana LaBehemot') {
return undefined;
}
if (desc === 'Rosh Chodesh Tevet') {
if (isShabbat) {
return 'Shabbat Rosh Chodesh Chanukah';
}
if (day === 30 || HDate.shortKislev(hd.getFullYear())) {
return 'Chanukah Day 6'; // 30th of Kislev or 1st of Tevet
}
else {
return 'Chanukah Day 7 (on Rosh Chodesh)'; // 1st of Tevet
}
}
if (isRoshChodesh) {
return desc;
}
if (desc === "Tish'a B'Av (observed)") {
return "Tish'a B'Av";
}
return undefined;
}
export { HOLIDAY_IGNORE_MASK, getLeyningKeyForEvent };
//# sourceMappingURL=getLeyningKeyForEvent.js.map