UNPKG

@hebcal/leyning

Version:

Torah Reading API for Parashat HaShavua and holidays

146 lines (143 loc) 5.56 kB
/*! @hebcal/leyning v9.5.4 */ import { months, HDate } from '@hebcal/hdate'; import { flags } from '@hebcal/core/dist/esm/event'; import { getLeyningForHoliday, getLeyningForHolidayKey } from './getLeyningForHoliday.js'; import { getLeyningKeyForEvent } from './getLeyningKeyForEvent.js'; import { getLeyningForParshaHaShavua, getWeekdayReading, makeLeyningNames } from './leyning.js'; import { getSedra } from '@hebcal/core/dist/esm/sedra'; import { getHolidaysOnDate } from '@hebcal/core/dist/esm/holidays'; import { ParshaEvent } from '@hebcal/core/dist/esm/ParshaEvent'; import { translateLeyning } from './translate.js'; import { makeLeyningParts, makeSummaryFromParts } from './summary.js'; function findParshaHaShavua(saturday, il) { const hyear = saturday.getFullYear(); const sedra = getSedra(hyear, il); const parsha = sedra.lookup(saturday); if (!parsha.chag) { return parsha; } // Special case between YK and Simchat Torah // If Vayeilech or Ha'azinu occurs between RH and YK, the following block for // Monday/Thursday weekday isn't executed because the above sedra.lookup() // would have already found the regular Saturday parsha. if (saturday.getMonth() === months.TISHREI) { const dd = saturday.getDate(); const simchatTorah = il ? 22 : 23; if (dd > 2 && dd <= simchatTorah) { return { parsha: ['Vezot Haberakhah'], chag: false, num: 54, hdate: saturday, il, }; } } // Search for next regular parsha, which could even spill into next year const endOfYear = new HDate(1, months.TISHREI, hyear + 1).abs() - 1; const endAbs = endOfYear + 30; for (let sat2 = saturday.abs() + 7; sat2 <= endAbs; sat2 += 7) { const sedra2 = sat2 > endOfYear ? getSedra(hyear + 1, il) : sedra; const parsha2 = sedra2.lookup(sat2); if (!parsha2.chag) { return parsha2; } } /* NOTREACHED */ throw new Error(`can't findParshaHaShavua for ${saturday}/${il}`); } function getLeyningOnDate(hdate, il, wantarray = false, language = 'en') { const dow = hdate.getDay(); const arr = []; let hasParshaHaShavua = false; if (dow === 6) { const hyear = hdate.getFullYear(); const sedra = getSedra(hyear, il); const parsha = sedra.lookup(hdate); if (!parsha.chag) { const parshaEvent = new ParshaEvent(parsha); const reading = getLeyningForParshaHaShavua(parshaEvent, il, language); if (wantarray) { hasParshaHaShavua = true; arr.push(reading); } else { return reading; } } } const events = getHolidaysOnDate(hdate, il) || []; let hasFullKriyah = false; for (const ev of events) { const specialShabbat = Boolean(ev.getFlags() & (flags.SPECIAL_SHABBAT | flags.ROSH_CHODESH)); if (hasParshaHaShavua && specialShabbat) { continue; } const reading = getLeyningForHoliday(ev, il); if (reading) { // Skip duplicate readings from overlapping events (eg, Rosh Chodesh + Chanukah) if (arr.some(r => r.name.en === reading.name.en)) continue; const fk = reading.fullkriyah; if (fk) { hasFullKriyah = true; } const specialMaftirOnly = hasParshaHaShavua && hasFullKriyah && fk.M && !fk['1']; if (!specialMaftirOnly) { arr.push(reading); } const mincha = getMincha(ev, il); if (mincha) { arr.push(mincha); } // Special case for Erev Simchat Torah - the only time we read Torah at night const desc = ev.getDesc(); if ((il && desc === 'Sukkot VII (Hoshana Raba)') || (!il && desc === 'Shmini Atzeret')) { const erevST = getLeyningForHolidayKey('Erev Simchat Torah'); arr.push(erevST); } } } if (!hasFullKriyah && (dow === 1 || dow === 4)) { const saturday = hdate.onOrAfter(6); const parsha = findParshaHaShavua(saturday, il); const aliyot = getWeekdayReading(parsha.parsha); const parts = makeLeyningParts(aliyot); const reading = { name: makeLeyningNames(parsha.parsha), type: 'weekday', parsha: parsha.parsha, parshaNum: parsha.num, weekday: aliyot, summary: makeSummaryFromParts(parts), }; arr.unshift(reading); } // call translateLeyning on arr or arr[0] if (arr.length === 0) { return wantarray ? arr : arr[0]; } if (wantarray) { return arr.map(reading => translateLeyning(reading, language)); } return translateLeyning(arr[0], language); } const minchaSuffix = ' (Mincha)'; function getMincha(ev, il) { const desc = ev.getDesc() + minchaSuffix; const reading1 = getLeyningForHolidayKey(desc, ev.cholHaMoedDay, il); if (reading1) { return reading1; } const desc2 = getLeyningKeyForEvent(ev, il); if (desc2) { const reading2 = getLeyningForHolidayKey(desc2 + minchaSuffix, ev.cholHaMoedDay, il); if (reading2) { return reading2; } } return undefined; } export { getLeyningOnDate }; //# sourceMappingURL=getLeyningOnDate.js.map