@hebcal/leyning
Version:
Torah Reading API for Parashat HaShavua and holidays
146 lines (143 loc) • 5.56 kB
JavaScript
/*! @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