@hebcal/core 3.50.4 → 4.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.mjs CHANGED
@@ -1,4 +1,4 @@
1
- /*! @hebcal/core v3.50.4 */
1
+ /*! @hebcal/core v4.0.0 */
2
2
  /*
3
3
  * More minimal greg routines
4
4
  */
@@ -432,7 +432,7 @@ class Locale {
432
432
  /**
433
433
  * Register locale translations.
434
434
  * @param {string} locale Locale name (i.e.: `'he'`, `'fr'`)
435
- * @param {LocaleDate} data parsed data from a `.po` file.
435
+ * @param {LocaleData} data parsed data from a `.po` file.
436
436
  */
437
437
  static addLocale(locale, data) {
438
438
  if (typeof data.contexts !== 'object' || typeof data.contexts[''] !== 'object') {
@@ -595,6 +595,17 @@ const EPOCH = -1373428;
595
595
  // Avg year length in the cycle (19 solar years with 235 lunar months)
596
596
  const AVG_HEBYEAR_DAYS = 365.24682220597794;
597
597
 
598
+ /**
599
+ * @private
600
+ * @param {any} n
601
+ * @param {string} name
602
+ */
603
+ function assertNumber(n, name) {
604
+ if (typeof n !== 'number' || isNaN(n)) {
605
+ throw new TypeError(`invalid parameter '${name}' not a number: ${n}`);
606
+ }
607
+ }
608
+
598
609
  /**
599
610
  * Converts Hebrew date to R.D. (Rata Die) fixed days.
600
611
  * R.D. 1 is the imaginary date Monday, January 1, 1 on the Gregorian
@@ -606,6 +617,9 @@ const AVG_HEBYEAR_DAYS = 365.24682220597794;
606
617
  * @return {number}
607
618
  */
608
619
  function hebrew2abs(year, month, day) {
620
+ assertNumber(year, 'year');
621
+ assertNumber(month, 'month');
622
+ assertNumber(day, 'day');
609
623
  if (year < 1) {
610
624
  throw new RangeError(`hebrew2abs: invalid year ${year}`);
611
625
  }
@@ -641,9 +655,7 @@ function newYear(year) {
641
655
  * @return {SimpleHebrewDate}
642
656
  */
643
657
  function abs2hebrew(abs) {
644
- if (typeof abs !== 'number' || isNaN(abs)) {
645
- throw new TypeError(`invalid parameter to abs2hebrew ${abs}`);
646
- }
658
+ assertNumber(abs, 'abs');
647
659
  abs = Math.trunc(abs);
648
660
  if (abs <= EPOCH) {
649
661
  throw new RangeError(`abs2hebrew: ${abs} is before epoch`);
@@ -718,7 +730,9 @@ function daysInMonth(month, year) {
718
730
  * @return {string}
719
731
  */
720
732
  function getMonthName(month, year) {
721
- if (typeof month !== 'number' || isNaN(month) || month < 1 || month > 14) {
733
+ assertNumber(month, 'month');
734
+ assertNumber(year, 'year');
735
+ if (month < 1 || month > 14) {
722
736
  throw new TypeError(`bad month argument ${month}`);
723
737
  }
724
738
  return monthNames[+isLeapYear(year)][month];
@@ -1701,6 +1715,9 @@ const flags = {
1701
1715
  /** Nach Yomi */
1702
1716
  NACH_YOMI: 0x2000000
1703
1717
  };
1718
+ const flagToCategory = [[flags.MAJOR_FAST, 'holiday', 'major', 'fast'], [flags.CHANUKAH_CANDLES, 'holiday', 'major'], [flags.HEBREW_DATE, 'hebdate'], [flags.MINOR_FAST, 'holiday', 'fast'], [flags.MINOR_HOLIDAY, 'holiday', 'minor'], [flags.MODERN_HOLIDAY, 'holiday', 'modern'], [flags.MOLAD, 'molad'], [flags.OMER_COUNT, 'omer'], [flags.PARSHA_HASHAVUA, 'parashat'],
1719
+ // backwards-compat
1720
+ [flags.ROSH_CHODESH, 'roshchodesh'], [flags.SHABBAT_MEVARCHIM, 'mevarchim'], [flags.SPECIAL_SHABBAT, 'holiday', 'shabbat'], [flags.USER_EVENT, 'user']];
1704
1721
 
1705
1722
  /** Represents an Event with a title, date, and flags */
1706
1723
  class Event {
@@ -1848,8 +1865,21 @@ class Event {
1848
1865
  }
1849
1866
  return ev;
1850
1867
  }
1868
+ /**
1869
+ * Returns a list of event categories
1870
+ * @return {string[]}
1871
+ */
1872
+ getCategories() {
1873
+ const mask = this.getFlags();
1874
+ for (let i = 0; i < flagToCategory.length; i++) {
1875
+ const attrs = flagToCategory[i];
1876
+ if (mask & attrs[0]) {
1877
+ return attrs.slice(1);
1878
+ }
1879
+ }
1880
+ return ['unknown'];
1881
+ }
1851
1882
  }
1852
- const KEYCAP_DIGITS = ['0️⃣', '1️⃣', '2️⃣', '3️⃣', '4️⃣', '5️⃣', '6️⃣', '7️⃣', '8️⃣', '9️⃣'];
1853
1883
 
1854
1884
  /** Daily Hebrew date ("11th of Sivan, 5780") */
1855
1885
  class HebrewDateEvent extends Event {
@@ -3099,6 +3129,22 @@ class TimedEvent extends Event {
3099
3129
  renderBrief(locale) {
3100
3130
  return Locale.gettext(this.getDesc(), locale);
3101
3131
  }
3132
+ /** @return {string[]} */
3133
+ getCategories() {
3134
+ const desc = this.getDesc();
3135
+ switch (desc) {
3136
+ // LIGHT_CANDLES or LIGHT_CANDLES_TZEIS
3137
+ case 'Candle lighting':
3138
+ return ['candles'];
3139
+ // YOM_TOV_ENDS
3140
+ case 'Havdalah':
3141
+ return ['havdalah'];
3142
+ // flags.MINOR_FAST or flags.MAJOR_FAST
3143
+ case 'Fast begins':
3144
+ case 'Fast ends':
3145
+ return ['zmanim', 'fast'];
3146
+ }
3147
+ }
3102
3148
  }
3103
3149
 
3104
3150
  /** Havdalah after Shabbat or holiday */
@@ -3523,173 +3569,6 @@ function getTodayIsHe(omer) {
3523
3569
  return str.normalize();
3524
3570
  }
3525
3571
 
3526
- /* eslint-disable no-multi-spaces */
3527
- const osdate = new Date(1923, 8, 11);
3528
- const osday = greg2abs(osdate);
3529
- const nsday = greg2abs(new Date(1975, 5, 24));
3530
- const shas0 = [['Berachot', 64], ['Shabbat', 157], ['Eruvin', 105], ['Pesachim', 121], ['Shekalim', 22], ['Yoma', 88], ['Sukkah', 56], ['Beitzah', 40], ['Rosh Hashana', 35], ['Taanit', 31], ['Megillah', 32], ['Moed Katan', 29], ['Chagigah', 27], ['Yevamot', 122], ['Ketubot', 112], ['Nedarim', 91], ['Nazir', 66], ['Sotah', 49], ['Gitin', 90], ['Kiddushin', 82], ['Baba Kamma', 119], ['Baba Metzia', 119], ['Baba Batra', 176], ['Sanhedrin', 113], ['Makkot', 24], ['Shevuot', 49], ['Avodah Zarah', 76], ['Horayot', 14], ['Zevachim', 120], ['Menachot', 110], ['Chullin', 142], ['Bechorot', 61], ['Arachin', 34], ['Temurah', 34], ['Keritot', 28], ['Meilah', 22], ['Kinnim', 4], ['Tamid', 9], ['Midot', 5], ['Niddah', 73]].map(m => {
3531
- return {
3532
- name: m[0],
3533
- blatt: m[1]
3534
- };
3535
- });
3536
-
3537
- /**
3538
- * Returns the Daf Yomi for given date
3539
- */
3540
- class DafYomi {
3541
- /**
3542
- * Initializes a daf yomi instance
3543
- * @param {Date|HDate|number} date Gregorian or Hebrew date
3544
- */
3545
- constructor(date) {
3546
- const cday = typeof date === 'number' && !isNaN(date) ? date : isDate(date) ? greg2abs(date) : HDate.isHDate(date) ? date.abs() : throwTypeError(`non-date given to dafyomi: ${date}`);
3547
- if (cday < osday) {
3548
- throw new RangeError(`Date ${date} too early; Daf Yomi cycle began on ${osdate}`);
3549
- }
3550
- let cno;
3551
- let dno;
3552
- if (cday >= nsday) {
3553
- // "new" cycle
3554
- cno = 8 + Math.floor((cday - nsday) / 2711);
3555
- dno = (cday - nsday) % 2711;
3556
- } else {
3557
- // old cycle
3558
- cno = 1 + Math.floor((cday - osday) / 2702);
3559
- dno = (cday - osday) % 2702;
3560
- }
3561
-
3562
- // Find the daf taking note that the cycle changed slightly after cycle 7.
3563
-
3564
- let total = 0;
3565
- let blatt = 0;
3566
- let count = -1;
3567
-
3568
- // Fix Shekalim for old cycles
3569
- const shortShekalim = cno <= 7;
3570
- const shas = shortShekalim ? shas0.slice() : shas0;
3571
- if (shortShekalim) {
3572
- shas[4] = {
3573
- name: 'Shekalim',
3574
- blatt: 13
3575
- };
3576
- }
3577
-
3578
- // Find the daf
3579
- let j = 0;
3580
- const dafcnt = 40;
3581
- while (j < dafcnt) {
3582
- count++;
3583
- total = total + shas[j].blatt - 1;
3584
- if (dno < total) {
3585
- blatt = shas[j].blatt + 1 - (total - dno);
3586
- // fiddle with the weird ones near the end
3587
- switch (count) {
3588
- case 36:
3589
- blatt = blatt + 21;
3590
- break;
3591
- case 37:
3592
- blatt = blatt + 24;
3593
- break;
3594
- case 38:
3595
- blatt = blatt + 32;
3596
- break;
3597
- }
3598
- // Bailout
3599
- j = 1 + dafcnt;
3600
- }
3601
- j++;
3602
- }
3603
- this.name = shas[count].name;
3604
- this.blatt = blatt;
3605
- }
3606
- /**
3607
- * @return {number}
3608
- */
3609
- getBlatt() {
3610
- return this.blatt;
3611
- }
3612
- /**
3613
- * @return {string}
3614
- */
3615
- getName() {
3616
- return this.name;
3617
- }
3618
- /**
3619
- * Formats (with translation) the dafyomi result as a string like "Pesachim 34"
3620
- * @param {string} [locale] Optional locale name (defaults to active locale).
3621
- * @return {string}
3622
- */
3623
- render(locale) {
3624
- locale = locale || Locale.getLocaleName();
3625
- if (typeof locale === 'string') {
3626
- locale = locale.toLowerCase();
3627
- }
3628
- if (locale === 'he' || locale === 'he-x-nonikud') {
3629
- return Locale.gettext(this.name, locale) + ' דף ' + gematriya(this.blatt);
3630
- }
3631
- return Locale.gettext(this.name, locale) + ' ' + this.blatt;
3632
- }
3633
- }
3634
- const dafYomiSefaria = {
3635
- 'Berachot': 'Berakhot',
3636
- 'Rosh Hashana': 'Rosh Hashanah',
3637
- 'Gitin': 'Gittin',
3638
- 'Baba Kamma': 'Bava Kamma',
3639
- 'Baba Metzia': 'Bava Metzia',
3640
- 'Baba Batra': 'Bava Batra',
3641
- 'Bechorot': 'Bekhorot',
3642
- 'Arachin': 'Arakhin',
3643
- 'Midot': 'Middot',
3644
- 'Shekalim': 'Jerusalem_Talmud_Shekalim'
3645
- };
3646
-
3647
- /**
3648
- * Event wrapper around a DafYomi instance
3649
- */
3650
- class DafYomiEvent extends Event {
3651
- /**
3652
- * @param {HDate} date
3653
- */
3654
- constructor(date) {
3655
- const daf = new DafYomi(date.greg());
3656
- super(date, daf.render('en'), flags.DAF_YOMI);
3657
- this.daf = daf;
3658
- }
3659
- /**
3660
- * Returns Daf Yomi name including the 'Daf Yomi: ' prefix (e.g. "Daf Yomi: Pesachim 107").
3661
- * @param {string} [locale] Optional locale name (defaults to active locale).
3662
- * @return {string}
3663
- */
3664
- render(locale) {
3665
- return Locale.gettext('Daf Yomi', locale) + ': ' + this.daf.render(locale);
3666
- }
3667
- /**
3668
- * Returns Daf Yomi name without the 'Daf Yomi: ' prefix (e.g. "Pesachim 107").
3669
- * @param {string} [locale] Optional locale name (defaults to active locale).
3670
- * @return {string}
3671
- */
3672
- renderBrief(locale) {
3673
- return this.daf.render(locale);
3674
- }
3675
- /**
3676
- * Returns a link to sefaria.org or dafyomi.org
3677
- * @return {string}
3678
- */
3679
- url() {
3680
- const daf = this.daf;
3681
- const tractate = daf.getName();
3682
- const blatt = daf.getBlatt();
3683
- if (tractate == 'Kinnim' || tractate == 'Midot') {
3684
- return `https://www.dafyomi.org/index.php?masechta=meilah&daf=${blatt}a`;
3685
- } else {
3686
- const name0 = dafYomiSefaria[tractate] || tractate;
3687
- const name = name0.replace(/ /g, '_');
3688
- return `https://www.sefaria.org/${name}.${blatt}a?lang=bi`;
3689
- }
3690
- }
3691
- }
3692
-
3693
3572
  /* eslint-disable new-cap */
3694
3573
  const INCOMPLETE = 0;
3695
3574
  const REGULAR = 1;
@@ -4119,10 +3998,10 @@ class ParshaEvent extends Event {
4119
3998
  }
4120
3999
  }
4121
4000
 
4122
- const SUN$2 = 0;
4001
+ const SUN$1 = 0;
4123
4002
  const TUE$1 = 2;
4124
4003
  const FRI$2 = 5;
4125
- const SAT$3 = 6;
4004
+ const SAT$2 = 6;
4126
4005
  const NISAN$3 = months.NISAN;
4127
4006
  const IYYAR = months.IYYAR;
4128
4007
 
@@ -4144,7 +4023,7 @@ function dateYomHaShoah(year) {
4144
4023
  let nisan27dt = new HDate(27, NISAN$3, year);
4145
4024
  if (nisan27dt.getDay() === FRI$2) {
4146
4025
  nisan27dt = new HDate(26, NISAN$3, year);
4147
- } else if (nisan27dt.getDay() === SUN$2) {
4026
+ } else if (nisan27dt.getDay() === SUN$1) {
4148
4027
  nisan27dt = new HDate(28, NISAN$3, year);
4149
4028
  }
4150
4029
  return nisan27dt;
@@ -4163,9 +4042,9 @@ function dateYomHaZikaron(year) {
4163
4042
  let day;
4164
4043
  const pesach = new HDate(15, NISAN$3, year);
4165
4044
  const pdow = pesach.getDay();
4166
- if (pdow === SUN$2) {
4045
+ if (pdow === SUN$1) {
4167
4046
  day = 2;
4168
- } else if (pdow === SAT$3) {
4047
+ } else if (pdow === SAT$2) {
4169
4048
  day = 3;
4170
4049
  } else if (year < 5764) {
4171
4050
  day = 4;
@@ -4651,6 +4530,29 @@ class HolidayEvent extends Event {
4651
4530
  return '✡️';
4652
4531
  }
4653
4532
  }
4533
+ /** @return {string[]} */
4534
+ getCategories() {
4535
+ const cats = super.getCategories();
4536
+ if (cats[0] !== 'unknown') {
4537
+ return cats;
4538
+ }
4539
+ const desc = this.getDesc();
4540
+ // Don't depend on flags.MINOR_HOLIDAY always being set
4541
+ switch (desc) {
4542
+ case 'Lag BaOmer':
4543
+ case 'Leil Selichot':
4544
+ case 'Pesach Sheni':
4545
+ case 'Erev Purim':
4546
+ case 'Purim Katan':
4547
+ case 'Shushan Purim':
4548
+ case 'Tu B\'Av':
4549
+ case 'Tu BiShvat':
4550
+ case 'Rosh Hashana LaBehemot':
4551
+ return ['holiday', 'minor'];
4552
+ default:
4553
+ return ['holiday', 'major'];
4554
+ }
4555
+ }
4654
4556
  }
4655
4557
  const roshChodeshStr = 'Rosh Chodesh';
4656
4558
 
@@ -4798,13 +4700,13 @@ class YomKippurKatanEvent extends HolidayEvent {
4798
4700
  return undefined;
4799
4701
  }
4800
4702
  }
4801
- const SUN$1 = 0;
4703
+ const SUN = 0;
4802
4704
  // const MON = 1;
4803
4705
  const TUE = 2;
4804
4706
  // const WED = 3;
4805
4707
  const THU = 4;
4806
4708
  const FRI$1 = 5;
4807
- const SAT$2 = 6;
4709
+ const SAT$1 = 6;
4808
4710
  const NISAN$2 = months.NISAN;
4809
4711
  // const IYYAR = months.IYYAR;
4810
4712
  // const SIVAN = months.SIVAN;
@@ -4889,6 +4791,7 @@ const emojiIsraelFlag = {
4889
4791
  };
4890
4792
  const chanukahEmoji = '🕎';
4891
4793
  const yearCache = Object.create(null);
4794
+ const KEYCAP_DIGITS = ['0️⃣', '1️⃣', '2️⃣', '3️⃣', '4️⃣', '5️⃣', '6️⃣', '7️⃣', '8️⃣', '9️⃣'];
4892
4795
 
4893
4796
  /**
4894
4797
  * Lower-level holidays interface, which returns a `Map` of `Event`s indexed by
@@ -4942,7 +4845,7 @@ function getHolidaysForYear_(year) {
4942
4845
  // Variable date holidays
4943
4846
  add(new HolidayEvent(new HDate(3 + (RH.getDay() == THU), TISHREI$1, year), 'Tzom Gedaliah', MINOR_FAST$1));
4944
4847
  // first SAT after RH
4945
- add(new HolidayEvent(new HDate(HDate.dayOnOrBefore(SAT$2, 7 + RH.abs())), 'Shabbat Shuva', SPECIAL_SHABBAT$1));
4848
+ add(new HolidayEvent(new HDate(HDate.dayOnOrBefore(SAT$1, 7 + RH.abs())), 'Shabbat Shuva', SPECIAL_SHABBAT$1));
4946
4849
  const rchTevet = HDate.shortKislev(year) ? new HDate(1, TEVET$1, year) : new HDate(30, KISLEV$1, year);
4947
4850
  add(new HolidayEvent(rchTevet, 'Chag HaBanot', MINOR_HOLIDAY$1));
4948
4851
  // yes, we know Kislev 30-32 are wrong
@@ -4960,14 +4863,14 @@ function getHolidaysForYear_(year) {
4960
4863
  }));
4961
4864
  add(new AsaraBTevetEvent(new HDate(10, TEVET$1, year), 'Asara B\'Tevet', MINOR_FAST$1));
4962
4865
  const pesachAbs = pesach.abs();
4963
- add(new HolidayEvent(new HDate(HDate.dayOnOrBefore(SAT$2, pesachAbs - 43)), 'Shabbat Shekalim', SPECIAL_SHABBAT$1), new HolidayEvent(new HDate(HDate.dayOnOrBefore(SAT$2, pesachAbs - 30)), 'Shabbat Zachor', SPECIAL_SHABBAT$1), new HolidayEvent(new HDate(pesachAbs - (pesach.getDay() == TUE ? 33 : 31)), 'Ta\'anit Esther', MINOR_FAST$1));
4964
- add(new HolidayEvent(new HDate(HDate.dayOnOrBefore(SAT$2, pesachAbs - 14) - 7), 'Shabbat Parah', SPECIAL_SHABBAT$1), new HolidayEvent(new HDate(HDate.dayOnOrBefore(SAT$2, pesachAbs - 14)), 'Shabbat HaChodesh', SPECIAL_SHABBAT$1), new HolidayEvent(new HDate(HDate.dayOnOrBefore(SAT$2, pesachAbs - 1)), 'Shabbat HaGadol', SPECIAL_SHABBAT$1), new HolidayEvent(
4866
+ add(new HolidayEvent(new HDate(HDate.dayOnOrBefore(SAT$1, pesachAbs - 43)), 'Shabbat Shekalim', SPECIAL_SHABBAT$1), new HolidayEvent(new HDate(HDate.dayOnOrBefore(SAT$1, pesachAbs - 30)), 'Shabbat Zachor', SPECIAL_SHABBAT$1), new HolidayEvent(new HDate(pesachAbs - (pesach.getDay() == TUE ? 33 : 31)), 'Ta\'anit Esther', MINOR_FAST$1));
4867
+ add(new HolidayEvent(new HDate(HDate.dayOnOrBefore(SAT$1, pesachAbs - 14) - 7), 'Shabbat Parah', SPECIAL_SHABBAT$1), new HolidayEvent(new HDate(HDate.dayOnOrBefore(SAT$1, pesachAbs - 14)), 'Shabbat HaChodesh', SPECIAL_SHABBAT$1), new HolidayEvent(new HDate(HDate.dayOnOrBefore(SAT$1, pesachAbs - 1)), 'Shabbat HaGadol', SPECIAL_SHABBAT$1), new HolidayEvent(
4965
4868
  // if the fast falls on Shabbat, move to Thursday
4966
- pesach.prev().getDay() == SAT$2 ? pesach.onOrBefore(THU) : new HDate(14, NISAN$2, year), 'Ta\'anit Bechorot', MINOR_FAST$1));
4967
- add(new HolidayEvent(new HDate(HDate.dayOnOrBefore(SAT$2, new HDate(1, TISHREI$1, year + 1).abs() - 4)), 'Leil Selichot', MINOR_HOLIDAY$1, {
4869
+ pesach.prev().getDay() == SAT$1 ? pesach.onOrBefore(THU) : new HDate(14, NISAN$2, year), 'Ta\'anit Bechorot', MINOR_FAST$1));
4870
+ add(new HolidayEvent(new HDate(HDate.dayOnOrBefore(SAT$1, new HDate(1, TISHREI$1, year + 1).abs() - 4)), 'Leil Selichot', MINOR_HOLIDAY$1, {
4968
4871
  emoji: '🕍'
4969
4872
  }));
4970
- if (pesach.getDay() == SUN$1) {
4873
+ if (pesach.getDay() == SUN) {
4971
4874
  add(new HolidayEvent(new HDate(16, months.ADAR_II, year), 'Purim Meshulash', MINOR_HOLIDAY$1));
4972
4875
  }
4973
4876
  if (HDate.isLeapYear(year)) {
@@ -4990,11 +4893,11 @@ function getHolidaysForYear_(year) {
4990
4893
  if (year >= h.firstYear) {
4991
4894
  let hd = new HDate(h.dd, h.mm, year);
4992
4895
  const dow = hd.getDay();
4993
- if (h.friSatMovetoThu && (dow === FRI$1 || dow === SAT$2)) {
4896
+ if (h.friSatMovetoThu && (dow === FRI$1 || dow === SAT$1)) {
4994
4897
  hd = hd.onOrBefore(THU);
4995
4898
  } else if (h.friPostponeToSun && dow === FRI$1) {
4996
4899
  hd = new HDate(hd.abs() + 2);
4997
- } else if (h.satPostponeToSun && dow === SAT$2) {
4900
+ } else if (h.satPostponeToSun && dow === SAT$1) {
4998
4901
  hd = hd.next();
4999
4902
  }
5000
4903
  const mask = h.chul ? MODERN_HOLIDAY$1 : MODERN_HOLIDAY$1 | flags.IL_ONLY;
@@ -5007,7 +4910,7 @@ function getHolidaysForYear_(year) {
5007
4910
  });
5008
4911
  let tamuz17 = new HDate(17, TAMUZ, year);
5009
4912
  let tamuz17attrs;
5010
- if (tamuz17.getDay() == SAT$2) {
4913
+ if (tamuz17.getDay() == SAT$1) {
5011
4914
  tamuz17 = new HDate(18, TAMUZ, year);
5012
4915
  tamuz17attrs = {
5013
4916
  observed: true
@@ -5017,7 +4920,7 @@ function getHolidaysForYear_(year) {
5017
4920
  let av9dt = new HDate(9, AV, year);
5018
4921
  let av9title = 'Tish\'a B\'Av';
5019
4922
  let av9attrs;
5020
- if (av9dt.getDay() == SAT$2) {
4923
+ if (av9dt.getDay() == SAT$1) {
5021
4924
  av9dt = av9dt.next();
5022
4925
  av9attrs = {
5023
4926
  observed: true
@@ -5025,7 +4928,7 @@ function getHolidaysForYear_(year) {
5025
4928
  av9title += ' (observed)';
5026
4929
  }
5027
4930
  const av9abs = av9dt.abs();
5028
- add(new HolidayEvent(new HDate(HDate.dayOnOrBefore(SAT$2, av9abs)), 'Shabbat Chazon', SPECIAL_SHABBAT$1), new HolidayEvent(av9dt.prev(), 'Erev Tish\'a B\'Av', EREV$1 | MAJOR_FAST$1, av9attrs), new HolidayEvent(av9dt, av9title, MAJOR_FAST$1, av9attrs), new HolidayEvent(new HDate(HDate.dayOnOrBefore(SAT$2, av9abs + 7)), 'Shabbat Nachamu', SPECIAL_SHABBAT$1));
4931
+ add(new HolidayEvent(new HDate(HDate.dayOnOrBefore(SAT$1, av9abs)), 'Shabbat Chazon', SPECIAL_SHABBAT$1), new HolidayEvent(av9dt.prev(), 'Erev Tish\'a B\'Av', EREV$1 | MAJOR_FAST$1, av9attrs), new HolidayEvent(av9dt, av9title, MAJOR_FAST$1, av9attrs), new HolidayEvent(new HDate(HDate.dayOnOrBefore(SAT$1, av9abs + 7)), 'Shabbat Nachamu', SPECIAL_SHABBAT$1));
5029
4932
  const monthsInYear = HDate.monthsInYear(year);
5030
4933
  for (let month = 1; month <= monthsInYear; month++) {
5031
4934
  const monthName = HDate.getMonthName(month, year);
@@ -5041,7 +4944,7 @@ function getHolidaysForYear_(year) {
5041
4944
 
5042
4945
  // Don't worry about month overrun; will get "Nisan" for month=14
5043
4946
  const nextMonthName = HDate.getMonthName(month + 1, year);
5044
- add(new MevarchimChodeshEvent(new HDate(29, month, year).onOrBefore(SAT$2), nextMonthName));
4947
+ add(new MevarchimChodeshEvent(new HDate(29, month, year).onOrBefore(SAT$1), nextMonthName));
5045
4948
  }
5046
4949
 
5047
4950
  // Begin: Yom Kippur Katan
@@ -5056,7 +4959,7 @@ function getHolidaysForYear_(year) {
5056
4959
  }
5057
4960
  let ykk = new HDate(29, month, year);
5058
4961
  const dow = ykk.getDay();
5059
- if (dow === FRI$1 || dow === SAT$2) {
4962
+ if (dow === FRI$1 || dow === SAT$1) {
5060
4963
  ykk = ykk.onOrBefore(THU);
5061
4964
  }
5062
4965
  const nextMonthName = HDate.getMonthName(nextMonth, year);
@@ -5106,422 +5009,41 @@ function getBirkatHaChama(year) {
5106
5009
  return 0;
5107
5010
  }
5108
5011
 
5109
- var mishnayot = [{k:"Berakhot",v:[5,8,6,7,5,8,5,8,5]},{k:"Peah",v:[6,8,8,11,8,11,8,9]},{k:"Demai",v:[4,5,6,7,11,12,8]},{k:"Kilayim",v:[9,11,7,9,8,9,8,6,10]},{k:"Sheviit",v:[8,10,10,10,9,6,7,11,9,9]},{k:"Terumot",v:[10,6,9,13,9,6,7,12,7,12,10]},{k:"Maasrot",v:[8,8,10,6,8]},{k:"Maaser Sheni",v:[7,10,13,12,15]},{k:"Challah",v:[9,8,10,11]},{k:"Orlah",v:[9,17,9]},{k:"Bikkurim",v:[11,11,12,5]},{k:"Shabbat",v:[11,7,6,2,4,10,4,7,7,6,6,6,7,4,3,8,8,3,6,5,3,6,5,5]},{k:"Eruvin",v:[10,6,9,11,9,10,11,11,4,15]},{k:"Pesachim",v:[7,8,8,9,10,6,13,8,11,9]},{k:"Shekalim",v:[7,5,4,9,6,6,7,8]},{k:"Yoma",v:[8,7,11,6,7,8,5,9]},{k:"Sukkah",v:[11,9,15,10,8]},{k:"Beitzah",v:[10,10,8,7,7]},{k:"Rosh Hashanah",v:[9,9,8,9]},{k:"Taanit",v:[7,10,9,8]},{k:"Megillah",v:[11,6,6,10]},{k:"Moed Katan",v:[10,5,9]},{k:"Chagigah",v:[8,7,8]},{k:"Yevamot",v:[4,10,10,13,6,6,6,6,6,9,7,6,13,9,10,7]},{k:"Ketubot",v:[10,10,9,12,9,7,10,8,9,6,6,4,11]},{k:"Nedarim",v:[4,5,11,8,6,10,9,7,10,8,12]},{k:"Nazir",v:[7,10,7,7,7,11,4,2,5]},{k:"Sotah",v:[9,6,8,5,5,4,8,7,15]},{k:"Gittin",v:[6,7,8,9,9,7,9,10,10]},{k:"Kiddushin",v:[10,10,13,14]},{k:"Bava Kamma",v:[4,6,11,9,7,6,7,7,12,10]},{k:"Bava Metzia",v:[8,11,12,12,11,8,11,9,13,6]},{k:"Bava Batra",v:[6,14,8,9,11,8,4,8,10,8]},{k:"Sanhedrin",v:[6,5,8,5,5,6,11,7,6,6,6]},{k:"Makkot",v:[10,8,16]},{k:"Shevuot",v:[7,5,11,13,5,7,8,6]},{k:"Eduyot",v:[14,10,12,12,7,3,9,7]},{k:"Avodah Zarah",v:[9,7,10,12,12]},{k:"Avot",v:[18,16,18,22,23,11]},{k:"Horayot",v:[5,7,8]},{k:"Zevachim",v:[4,5,6,6,8,7,6,12,7,8,8,6,8,10]},{k:"Menachot",v:[4,5,7,5,9,7,6,7,9,9,9,5,11]},{k:"Chullin",v:[7,10,7,7,5,7,6,6,8,4,2,5]},{k:"Bekhorot",v:[7,9,4,10,6,12,7,10,8]},{k:"Arakhin",v:[4,6,5,4,6,5,5,7,8]},{k:"Temurah",v:[6,3,5,4,6,5,6]},{k:"Keritot",v:[7,6,10,3,8,9]},{k:"Meilah",v:[4,9,8,6,5,6]},{k:"Tamid",v:[4,5,9,3,6,3,4]},{k:"Middot",v:[9,6,8,7,4]},{k:"Kinnim",v:[4,5,6]},{k:"Kelim",v:[9,8,8,4,11,4,6,11,8,8,9,8,8,8,6,8,17,9,10,7,3,10,5,17,9,9,12,10,8,4]},{k:"Oholot",v:[8,7,7,3,7,7,6,6,16,7,9,8,6,7,10,5,5,10]},{k:"Negaim",v:[6,5,8,11,5,8,5,10,3,10,12,7,12,13]},{k:"Parah",v:[4,5,11,4,9,5,12,11,9,6,9,11]},{k:"Tahorot",v:[9,8,8,13,9,10,9,9,9,8]},{k:"Mikvaot",v:[8,10,4,5,6,11,7,5,7,8]},{k:"Niddah",v:[7,7,7,7,9,14,5,4,11,8]},{k:"Makhshirin",v:[6,11,8,10,11,8]},{k:"Zavim",v:[6,4,3,7,12]},{k:"Tevul Yom",v:[5,8,6,7]},{k:"Yadayim",v:[5,4,5,8]},{k:"Oktzin",v:[6,10,12]}];
5110
-
5111
- const cycleStartDate$1 = new Date(1947, 4, 20);
5112
- const mishnaYomiStart = greg2abs(cycleStartDate$1);
5113
- const numMishnayot = 4192;
5114
- const numDays = numMishnayot / 2;
5115
-
5116
- /**
5117
- * Describes a mishna to be read
5118
- * @typedef {Object} MishnaYomi
5119
- * @property {string} k tractate name in Sephardic transliteration (e.g. "Berakhot", "Moed Katan")
5120
- * @property {string} v verse (e.g. "2:1")
5121
- */
5122
-
5123
- /**
5124
- * A program of daily learning in which participants study two Mishnahs
5125
- * each day in order to finish the entire Mishnah in ~6 years.
5126
- */
5127
- class MishnaYomiIndex {
5128
- /**
5129
- * Initializes a Mishna Yomi instance
5130
- */
5131
- constructor() {
5132
- const tmp = Array(numMishnayot);
5133
- let i = 0;
5134
- for (let j = 0; j < mishnayot.length; j++) {
5135
- const tractate = mishnayot[j];
5136
- const v = tractate.v;
5137
- for (let chap = 1; chap <= v.length; chap++) {
5138
- const numv = v[chap - 1];
5139
- for (let verse = 1; verse <= numv; verse++) {
5140
- tmp[i++] = {
5141
- k: tractate.k,
5142
- v: `${chap}:${verse}`
5143
- };
5144
- }
5145
- }
5146
- }
5147
- const days = Array(numDays);
5148
- for (let j = 0; j < numDays; j++) {
5149
- const k = j * 2;
5150
- days[j] = [tmp[k], tmp[k + 1]];
5151
- }
5152
- /** @type {MishnaYomi[]} */
5153
- this.days = days;
5154
- }
5155
-
5156
- /**
5157
- * Looks up a Mishna Yomi
5158
- * @param {Date|HDate|number} date Gregorian date
5159
- * @return {MishnaYomi[]}
5160
- */
5161
- lookup(date) {
5162
- const abs = typeof date === 'number' && !isNaN(date) ? date : isDate(date) ? greg2abs(date) : HDate.isHDate(date) ? date.abs() : throwTypeError(`Invalid date: ${date}`);
5163
- if (abs < mishnaYomiStart) {
5164
- const dt = abs2greg(abs);
5165
- const s = dt.toISOString().substring(0, 10);
5166
- throw new RangeError(`Date ${s} too early; Mishna Yomi cycle began on 1947-05-20`);
5167
- }
5168
- const dayNum = (abs - mishnaYomiStart) % numDays;
5169
- return this.days[dayNum];
5170
- }
5171
- }
5172
-
5173
- /**
5174
- * @private
5175
- * @param {MishnaYomi[]} mishnaYomi
5176
- * @param {string} locale
5177
- * @return {string}
5178
- */
5179
- function formatMyomi(mishnaYomi, locale) {
5180
- const k1 = mishnaYomi[0].k;
5181
- const cv1 = mishnaYomi[0].v;
5182
- const mishna1 = Locale.gettext(k1, locale) + ' ' + cv1;
5183
- const k2 = mishnaYomi[1].k;
5184
- const cv2 = mishnaYomi[1].v;
5185
- if (k1 !== k2) {
5186
- return mishna1 + '-' + Locale.gettext(k2, locale) + ' ' + cv2;
5187
- }
5188
- const p1 = cv1.split(':');
5189
- const p2 = cv2.split(':');
5190
- if (p1[0] === p2[0]) {
5191
- return mishna1 + '-' + p2[1];
5192
- }
5193
- return mishna1 + '-' + cv2;
5194
- }
5195
-
5196
- /**
5197
- * Event wrapper around a Mishna Yomi instance
5198
- */
5199
- class MishnaYomiEvent extends Event {
5200
- /**
5201
- * @param {HDate} date
5202
- * @param {MishnaYomi[]} mishnaYomi
5203
- */
5204
- constructor(date, mishnaYomi) {
5205
- super(date, formatMyomi(mishnaYomi, null), flags.MISHNA_YOMI);
5206
- this.mishnaYomi = mishnaYomi;
5207
- }
5208
- /**
5209
- * Returns Mishna Yomi name (e.g. "Bava Metzia 10:5-6" or "Berakhot 9:5-Peah 1:1").
5210
- * @param {string} [locale] Optional locale name (defaults to active locale).
5211
- * @return {string}
5212
- */
5213
- render(locale) {
5214
- return formatMyomi(this.mishnaYomi, locale);
5215
- }
5216
- /**
5217
- * Returns a link to sefaria.org
5218
- * @return {string}
5219
- */
5220
- url() {
5221
- const mishnaYomi = this.mishnaYomi;
5222
- const k1 = mishnaYomi[0].k;
5223
- const mishna = k1 === 'Avot' ? 'Pirkei' : 'Mishnah';
5224
- const name = k1.replace(/ /g, '_');
5225
- const prefix = `https://www.sefaria.org/${mishna}_${name}`;
5226
- const cv1 = mishnaYomi[0].v;
5227
- if (k1 !== mishnaYomi[1].k) {
5228
- const verse1 = cv1.replace(':', '.');
5229
- return `${prefix}.${verse1}?lang=bi`;
5230
- }
5231
- const cv2 = mishnaYomi[1].v;
5232
- const p1 = cv1.split(':');
5233
- const p2 = cv2.split(':');
5234
- const verse1 = p1.join('.');
5235
- const verse2 = p1[0] === p2[0] ? p2[1] : p2.join('.');
5236
- return `${prefix}.${verse1}-${verse2}?lang=bi`;
5237
- }
5238
- }
5239
-
5240
- const nach = [['Joshua', 24], ['Judges', 21], ['I Samuel', 31], ['II Samuel', 24], ['I Kings', 22], ['II Kings', 25], ['Isaiah', 66], ['Jeremiah', 52], ['Ezekiel', 48], ['Hosea', 14], ['Joel', 4], ['Amos', 9], ['Obadiah', 1], ['Jonah', 4], ['Micah', 7], ['Nachum', 3], ['Habakkuk', 3], ['Zephaniah', 3], ['Haggai', 2], ['Zechariah', 14], ['Malachi', 3], ['Psalms', 150], ['Proverbs', 31], ['Job', 42], ['Song of Songs', 8], ['Ruth', 4], ['Lamentations', 5], ['Ecclesiastes', 12], ['Esther', 10], ['Daniel', 12], ['Ezra', 10], ['Nehemiah', 13], ['I Chronicles', 29], ['II Chronicles', 36]];
5241
- const cycleStartDate = new Date(2007, 10, 1);
5242
- const nachYomiStart = greg2abs(cycleStartDate);
5243
- const numChapters = 742;
5244
-
5245
- /**
5246
- * Describes a chapter to be read
5247
- * @typedef {Object} NachYomi
5248
- * @property {string} k book name in Sephardic transliteration (e.g. "Berakhot", "Moed Katan")
5249
- * @property {number} v chapter (e.g. "2:1")
5250
- */
5012
+ /** @private */
5013
+ const cals = Object.create(null);
5251
5014
 
5252
5015
  /**
5253
- * A daily regimen of learning the books of Nevi'im (Prophets)
5254
- * and Ketuvim (Writings).
5016
+ * Plug-ins for daily learning calendars such as Daf Yomi, Mishna Yomi, Nach Yomi, etc.
5017
+ *
5018
+ * Learning schedules are provided by the `@hebcal/learning` package.
5255
5019
  */
5256
- class NachYomiIndex {
5257
- /**
5258
- * Initializes a Nach Yomi instance
5259
- */
5260
- constructor() {
5261
- const days = Array(numChapters);
5262
- let i = 0;
5263
- for (let j = 0; j < nach.length; j++) {
5264
- const book = nach[j][0];
5265
- const chapters = nach[j][1];
5266
- for (let chap = 1; chap <= chapters; chap++) {
5267
- days[i++] = {
5268
- k: book,
5269
- v: chap
5270
- };
5271
- }
5272
- }
5273
- this.days = days;
5274
- }
5275
-
5020
+ class DailyLearning {
5276
5021
  /**
5277
- * Looks up a Mishna Yomi
5278
- * @param {Date|HDate|number} date Gregorian date
5279
- * @return {NachYomi}
5022
+ * Register a new learning calendar.
5023
+ * @param {string} name
5024
+ * @param {Function} calendar
5280
5025
  */
5281
- lookup(date) {
5282
- const abs = typeof date === 'number' && !isNaN(date) ? date : isDate(date) ? greg2abs(date) : HDate.isHDate(date) ? date.abs() : throwTypeError(`Invalid date: ${date}`);
5283
- if (abs < nachYomiStart) {
5284
- const dt = abs2greg(abs);
5285
- const s = dt.toISOString().substring(0, 10);
5286
- throw new RangeError(`Date ${s} too early; Nach Yomi cycle began on 2007-11-01`);
5026
+ static addCalendar(name, calendar) {
5027
+ if (typeof calendar !== 'function') {
5028
+ throw new TypeError(`Invalid calendar function: ${calendar}`);
5287
5029
  }
5288
- const dayNum = (abs - nachYomiStart) % numChapters;
5289
- return this.days[dayNum];
5030
+ cals[name] = calendar;
5290
5031
  }
5291
- }
5292
5032
 
5293
- /**
5294
- * Event wrapper around a Nach Yomi instance
5295
- */
5296
- class NachYomiEvent extends Event {
5297
5033
  /**
5298
- * @param {HDate} date
5299
- * @param {NachYomi} nachYomi
5300
- */
5301
- constructor(date, nachYomi) {
5302
- super(date, `${nachYomi.k} ${nachYomi.v}`, flags.NACH_YOMI);
5303
- this.nachYomi = nachYomi;
5304
- }
5305
- /**
5306
- * Returns name of tractate and page (e.g. "Beitzah 21").
5307
- * @param {string} [locale] Optional locale name (defaults to active locale).
5308
- * @return {string}
5034
+ * Returns an event from daily calendar for a given date. Returns `null` if there
5035
+ * is no learning from this calendar on this date.
5036
+ * @param {string} name
5037
+ * @param {HDate} hd
5038
+ * @return {Event}
5309
5039
  */
5310
- render(locale) {
5311
- locale = locale || Locale.getLocaleName();
5312
- if (typeof locale === 'string') {
5313
- locale = locale.toLowerCase();
5314
- }
5315
- const name = Locale.gettext(this.nachYomi.k, locale);
5316
- if (locale === 'he' || locale === 'he-x-nonikud') {
5317
- return name + ' ' + gematriya(this.nachYomi.v);
5040
+ static lookup(name, hd) {
5041
+ const lookup = cals[name];
5042
+ if (typeof lookup === 'function') {
5043
+ return lookup(hd);
5318
5044
  }
5319
- return name + ' ' + this.nachYomi.v;
5320
- }
5321
- /**
5322
- * Returns a link to sefaria.org
5323
- * @return {string}
5324
- */
5325
- url() {
5326
- const name = this.nachYomi.k.replace(/ /g, '_');
5327
- const chapter = this.nachYomi.v;
5328
- return `https://www.sefaria.org/${name}.${chapter}?lang=bi`;
5329
- }
5330
- }
5331
-
5332
- const Berakhot=["1:1:1-2","1:1:7-11","1:1:12-15","1:1:16-19","1:1:23-27","1:1:29-31","1:1:36-2:2","1:2:8-9","1:4:3-5:3","1:5:9-14","1:5:18-6:3","2:1:1-4","2:1:14-19","2:3:4-7","2:3:10-14","2:4:1-3","2:4:8-12","2:5:1-8","2:6:3-7:2","2:8:2-7","2:9:1-4","3:1:4-7","3:1:12-18","3:1:23-2:3","3:2:5-3:8","3:3:11-4:5","3:4:15-5:6","3:5:13-6:1","4:1:1-2","4:1:10-16","4:1:21-25","4:1:28-31","4:1:33-3:2","4:3:11-4:2","4:4:9-5:5","4:6:3-7","5:1:3-11","5:1:18-2:3","5:2:6-10","5:3:2-7","6:1:1-2","6:1:4-6","6:1:8-9","6:1:11-15","6:1:17-23","6:2:1-4","6:4:2-4","6:5:3-5","6:6:3-4","6:6:6-8:2","7:1:1-3","7:1:5-6","7:1:7-2:2","7:2:7-3:1","7:3:4-4:3","7:5:5-11","8:1:6-7","8:2:2-6","8:2:12-3:3","8:4:1-5:6","8:6:4-11","9:1:1-4","9:1:13-22","9:1:33-2:6","9:2:12-20","9:3:3-7","9:5:1-7","9:5:16-22"];const Peah=["1:1:1-3","1:1:6-11","1:1:15-22","1:1:31-39","1:1:47-56","1:3:1-3","1:3:5-4:1","1:4:3-7","1:5:1-2",null,"2:1:4-9","2:1:11-3:2","2:4:3-5:1","3:1:1-7","3:1:10-2:4","3:4:3-5:4","3:7:1-3","3:7:7-13","3:7:18","4:1:1-3","4:2:1-5","4:2:7-5:3","4:6:6-9","4:7:1-5","5:1:3-2:2","5:2:5-7","5:3:5-5:3","6:1:1-7","6:2:1-3:1","6:3:4-5:3","6:6:7-8:4","7:2:1-6","7:3:5-4:2","7:5:3-11","8:1:1-2:1","8:3:2-5:4","8:7:1-8:5"];const Demai=["1:1:1-5","1:1:10-2:1","1:2:4-5","1:3:6-16","1:3:21-4:1","1:4:7-8","2:1:1-3","2:1:6-12","2:1:19-2:4","2:3:4-4:2","2:4:4-5:4","3:1:5-7","3:2:1-4","3:3:5-4:3","3:4:5-7","3:4:9-5:1","4:1:4-8","4:2:2-3:4","4:3:8-5:4","5:1:2-2:1","5:2:5-8","5:3:3-5:1","5:6:2-8:4","5:8:8-11","6:1:1-6","6:1:9-2:5","6:2:9-3:1","6:5:3-6","6:8:1-7","7:1:4-2:4","7:4:2-4","7:4:5-6:1","7:6:6-7:1","7:8:1-3"];const Kilayim=["1:1:1-4","1:2:1-4:3","1:6:3-7:3","1:7:6-9:2","1:9:4-5","2:1:1-5","2:1:9-11","2:3:2-4","2:3:4-4:3","2:5:3-6:2","2:6:5-7:1","2:8:2-7","3:1:1-2","3:1:2-3","3:1:6-2:3","3:3:1-4:1","3:4:3-5:1","3:6:1-6","4:1:2-5","4:1:7-8","4:2:4-9","4:3:2-5:1","4:6:3-5","5:1:4-5","5:1:5-2:2","5:3:1-4:1","5:5:2-6:3","6:1:1-3","6:1:4-2:2","6:2:5-3:4","6:4:4-9","7:1:3-2:3","7:2:6-3:2","7:3:4-4:2","7:6:2-5","8:1:3-4","8:1:6-8","8:2:1-3:2","8:3:6-4:5","9:1:2-7","9:1:12-2:5","9:3:3-8","9:3:13-4:5","9:5:2-6:3"];const Sheviit=["1:1:1-2:2","1:2:4-3:6","2:1:1-2","2:2:2-3:2","2:4:6-5:3","2:5:8-7:6","3:1:3-2:3","3:3:4-4:5","3:6:2-7:4","4:1:6-2:4","4:2:10-4:4","4:6:3-7:1","5:1:1-4","5:2:3-9","5:3:3-4:3","6:1:4-10","6:1:17-2:4","6:4:1-7","7:1:9-15","7:2:3-5","7:2:5-7","8:1:4-2:3","8:4:3-5:3","8:7:1-8:4","9:1:5-12","9:2:9-5:1","9:6:1-5","10:1:5-9","10:1:16-2:1","10:3:2-10","10:4:6"];const Terumot=["1:1:1-4","1:1:8-12","1:1:15-16","1:1:19-21","1:1:23-2:3","1:3:1-4:3","1:5:1-3","1:5:5-9","2:1:3-9","2:1:12-13","2:1:15-17","2:1:19-21","2:2:2-4","2:3:2-6","3:1:4-2:2","3:2:3-8","3:3:5-11","4:1:1-2","4:1:4-2:3","4:3:3-7","4:4:3-6","4:5:2-7:3","4:7:6-10","4:8:1-4","5:1:1-2","5:1:4-8","5:1:10-12","5:1:14-2:3","5:2:3-4","5:2:6-3:2","6:1:1-5","6:1:10","6:2:2","6:2:5-3:3","7:1:3-7","7:1:10-12","7:2:2-6","7:3:4-6","8:1:2","8:1:3","8:1:6-9","8:2:2-3:6","8:3:15-21","8:3:29-36","8:4:3-4","8:4:6-7","8:4:11-15","9:1:11-14","9:2:1-3","9:2:7-3:4","10:1:6-2:2","10:2:6-4:2","10:5:2-6:1","10:6:4-12","11:1:6-2:4","11:2:7-3:3","11:4:5-9","11:5:2-5","11:5:12-13"];const Maasrot=["1:1:1-3","1:1:5-9","1:2:5-13","1:3:4-4:2","1:4:6-7","1:4:10-5:3","2:1:1-4","2:1:6-8","2:1:9-2:2","2:3:2-4","2:3:8-4:5","2:4:10-14","3:1:3-4","3:1:6-10","3:1:12-2:1","3:2:4-3:2","3:4:1-7","3:4:10-14","4:1:5-2:3","4:3:1-4:4","5:1:1-3","5:1:5-7","5:2:1-5","5:2:6-3:1","5:3:4","5:3:8-11"];const Challah=["1:1:1-3","1:1:9-13","1:1:16-20","1:1:21-25","1:1:27-2:2","1:3:4-7","1:3:12-16","1:4:2-5:1","1:5:6-6:1","2:1:1-3","2:1:5-7","2:1:8-12","2:2:1-3:2","2:3:4-7","3:1:2-5","3:1:8","3:2:2-4:2","3:4:6-7","3:5:2-3","3:5:4-5","3:5:8-9","3:5:11-13","4:1:4-2:2","4:2:5-3:2","4:3:4-4:1","4:4:5-6","4:4:9-15","4:5:1-7"];const Orlah=["1:1:1-6","1:1:10-14","1:1:18-2:2","1:2:7-9","1:3:3-6","1:3:9-13","1:4:1-6","1:5:2-9","2:1:4-6","2:1:10-14","2:1:19-21","2:2:2","2:3:5-4:2","2:4:5-5:4","2:6:2-7:4","2:9:1-4","3:1:6-12","3:1:16-2:3","3:3:1-5:2","3:6:4-7:7"];const Bikkurim=["1:1:1-4","1:2:2-3","1:3:6-4:3","1:5:5-8","1:6:4-7:1","1:8:1-9:3","2:1:9-15","2:2:2-8","2:2:10-3:2","2:4:2-6:2","3:1:4-3:8","3:3:20-4:10","3:6:1-4"];const Shabbat=["1:1:1-2","1:1:3-7","1:1:9-10","1:1:14-17","1:1:20-23","1:1:26-2:2","1:2:6-11","1:3:3-7","1:3:11-4:4","1:4:6-9","1:4:15-5:1","1:5:4-7:3","1:8:3-10:2","1:11:2-8","2:1:9-13","2:1:17-2:1","2:3:3-6","2:5:1-6","2:5:8-6:1","2:6:9-7:3","3:1:1-8","3:1:10-13","3:3:2-6","3:3:8-14","3:4:4-6:2","3:7:2-6","3:7:9-13","4:1:1-2","4:1:3-7","4:2:4-9","5:1:1-7","5:2:5-4:2","6:1:1-2","6:1:7-10","6:2:2-8","6:2:11-3:2","6:4:4-5:3","6:6:2-8:2","6:9:6-14","7:1:1-3","7:1:4-6","7:1:7-9","7:1:12-15","7:2:1-6","7:2:9-12","7:2:14-16","7:2:17-19","7:2:20-22","7:2:27-32","7:2:35-37","7:2:41-45","7:2:49-54","7:2:59-4:2","8:1:1-5","8:1:9-2:3","8:3:5-6:1","9:1:1-2","9:1:4","9:2:3-3:2","9:3:4-4:2","9:6:2-7:7","10:2:1-3","10:4:2-5:2","10:5:4-6:2","11:1:3-7","11:2:3-3:2","11:5:2-6","12:1:1-4","12:1:7-3:2","12:3:5-4:3","13:1:1-2","13:1:4-3:3","13:5:1-3","14:1:1-2","14:2:3-3:5","14:4:2-6","15:1:1-2","15:2:3-3:3","16:1:2-4","16:1:9-3:3","16:5:1-7:2","17:1:1-6","17:2:4-5:1","18:1:1-5","18:1:6-2:1","19:1:1-3","19:1:8-2:1","19:3:1-4:2","19:4:2-5:2","19:5:2-6:3","20:1:4-3:2","23:1:1"];const Eruvin=["1:1:1-2","1:1:2-4","1:1:7-9","1:1:12-13","1:1:14-18","1:1:22-26","1:2:3-3:4","1:4:4-5:4","1:6:3-6","1:7:4-8:3","1:9:3-5","1:10:2-3","1:10:5-6","2:1:3-4","2:1:6-8","2:2:2-4:2","2:5:2-6:1","3:1:1-2","3:1:5-7","3:1:10-2:3","3:3:1-2","3:3:4-4:1","3:4:4-5","3:5:2-4","3:7:1-3","3:8:3-9:3","4:1:2-4","4:1:7-3:3","4:5:3-7:1","4:9:2-10:2","5:1:4-5","5:1:10-13","5:1:15-17","5:2:1-3","5:3:3-4:2","5:5:2-7:1","5:7:4-8:2","6:1:1-2:2","6:2:5-3:2","6:4:1-4","6:5:2-6:3","6:7:2-3","6:8:2-6","6:8:8-10:1","7:1:1-3","7:1:5-2:1","7:2:4-3:1","7:5:1-6:1","7:6:3-7:2","7:10:1-4","8:1:2-2:3","8:3:3-7","8:4:3-6:4","8:8:1-3","8:8:6-9:2","9:1:1-3","9:1:8-3:2","9:4:4-5:3","10:1:3-6","10:2:1-3:2","10:5:1-6:2","10:7:1-8:4","10:9:2-10:3","10:12:2-13:3","10:14:2-5"];const Pesachim=["1:1:1-4","1:1:9-12","1:1:17-2:2","1:3:4-4:4","1:4:6-5:2","1:5:5-6:2","1:7:2-8:2","1:8:3-6","1:8:7-9","1:8:12-13","2:1:4-7","2:1:11-16","2:2:2-9","2:2:12-13","2:2:16-3:1","2:3:4-6","2:4:4-9","2:4:10-5:4","2:7:3-6","3:1:11-12","3:2:3-3:2","3:3:5-9","3:4:3-6:3","3:7:4-8:3","4:1:1-4","4:1:10-13","4:3:2-5","4:4:1-4","4:8:1-9:1","4:9:5-9","5:1:2-6","5:2:1-6","5:2:8-10","5:3:1-3","5:3:7-4:1","5:4:5-9","5:4:12-6:1","5:7:2-8:3","6:1:1-4","6:1:8-13","6:1:15-19","6:2:2-3:3","6:4:4-5:2","6:5:4-5","6:5:5-6:2","7:1:1-5","7:1:7-2:3","7:2:8-4:3","7:5:4-6","7:6:2","7:6:5-7:4","7:7:5-8","7:8:2-9:3","7:10:1-2","7:11:2-5","7:12:2-13:2","7:13:4-7","8:1:2-5","8:1:7-10","8:3:2-3","8:4:3-5:2","8:6:4-8:3","8:8:6-9","9:1:4-2:1","9:3:2-4:3","9:6:1-6","9:7:1-9:1","10:1:1-2","10:1:7-14","10:3:1-4:1","10:5:4-7:1"];const Beitzah=["1:1:1-3","1:1:5-7","1:1:9-11","1:3:2-3","1:3:5-4:2","1:5:1-4","1:6:3-8:1","1:9:3-10:3","1:11:2-12:4","2:1:3-7","2:3:2-4:5","2:6:1-8:1","3:1:1-2","3:3:1-4:2","3:5:1-6:3","4:1:1-2","4:1:6-3:1","4:3:10-4:5","5:1:1-6","5:2:2-7","5:2:12-16","5:4:3-7:2"];const Yoma=["1:1:1-4","1:1:5-8","1:1:11-13","1:1:13-16","1:1:20-25","1:2:2-5","1:4:1-5:5","2:1:1-3","2:1:5-8","2:1:10-16","2:2:2-3","2:2:4-8","2:4:1-4","3:2:1-3:1","3:3:4-4:3","3:5:3-6:2","3:6:4-6","3:7:1-5","3:8:3-9","4:1:1-4","4:1:7-9","4:2:1-3:4","4:4:9-5:5","4:6:3-6","5:1:3-5","5:1:7-9","5:2:2-4:1","5:4:5-8","5:5:1-2","5:6:3-7","5:6:9-7:2","6:1:1-7","6:1:13-3:2","6:4:1-5:2","6:6:3-5","6:6:7-7:1","7:1:4-2:3","7:3:2-6","8:1:3-9","8:3:2-11","8:3:15-5:2","8:6:3-7:4"];const Sukkah=["1:1:1-2","1:1:4-5","1:1:7-10","1:1:14-2:1","1:3:2-4:3","1:5:4-7:2","1:8:2-10:2","2:1:1-2","2:2:2-4:2","2:4:5-5:6","2:7:2-8:3","3:1:1-4","3:1:8-3:2","3:4:2-3","3:6:2-7:2","3:9:2-10:4","3:11:2-12:1","4:1:2-2:2","4:3:4-4:2","4:5:4-6:2","4:6:5-6","5:1:1-2","5:1:3-2:2","5:3:4-5:1","5:6:2-7:1","5:8:1-6"];const Taanit=["1:1:1-2","1:1:5-9","1:1:13-17","1:2:4-3:3","1:3:8-4:6","1:5:1-6:4","1:6:9-8:2","2:1:2-8","2:1:13-2:3","2:2:11-3:2","2:6:2-10:1","2:11:4-12:3","2:13:2-14:2","3:1:3-3:1","3:4:3-5:2","3:7:1-9:3","3:10:3-11:4","4:1:2-6","4:1:10-15","4:2:3-8","4:2:14-3:2","4:3:4-4:2","4:5:2-6","4:5:9-13","4:5:16-22","4:6:4-7:2"];const Shekalim=["1:1:1-4","1:1:6-8","1:1:14-2:3","1:3:1-4","1:4:1-4","1:4:5-7","1:4:7","2:1:3-2:1","2:2:4-3:2","2:4:1-3","2:5:3-6","3:1:3-4","3:2:2-6","3:2:10-3:4","4:1:1-3","4:2:1-3","4:2:6-3:1","4:3:3-4:1","4:4:2-5","4:4:6-10","5:1:1-6","5:1:12-21","5:3:1-4:1","6:1:1-5","6:1:9-14","6:2:3-7","6:3:3-4:2","6:4:5-7","7:1:3-2:6","7:3:1-3","7:3:8-10","8:1:2-2:1","8:3:2-4:4"];const Megillah=["1:1:1-2","1:1:4","1:1:8-10","1:3:2-3","1:4:2-6","1:4:9-12","1:5:3-7","1:6:3-5","1:7:3-8:3","1:8:4-9:4","1:9:6-9","1:9:10-12","1:9:17-10:1","1:10:4-8","1:11:3-5","1:11:6-7","1:12:3-4","2:1:1-3","2:2:1-6","2:3:2-4:4","2:5:2-6:1","2:7:2-5","3:1:3-5","3:1:10-2:5","3:3:1-4:3","3:5:3-7:1","3:7:3-6","4:1:4-8","4:1:11-13","4:2:2-4:1","4:4:6-5:2","4:5:6-7:2","4:10:3-11:2","4:12:3-6"];const Chagigah=["1:1:1-3","1:1:8-9","1:1:9-18","1:1:20-2:3","1:2:4-4:2","1:6:2-7:3","1:8:4-10","2:1:1-2","2:1:6-9","2:1:11-15","2:2:4-6","2:3:3-4:3","2:5:2-5","2:6:3-7:3","3:1:1-3","3:1:4-7","3:2:4-5","3:2:7","3:2:10-3:3","3:4:1-3","3:5:1-7:1","3:8:2-4"];const Yevamot=["1:1:1-6","1:1:7-10","1:1:14-17","1:1:18-20","1:1:21-24","1:2:2-5","1:2:10-5:2","1:6:2-5","1:6:8-9","2:1:6-2:3","2:2:4-3:1","2:4:2-7","2:4:10-6:5","2:8:3-10:3","2:11:2-12:2","3:1:3-4","3:1:5-6","3:1:8-10","3:2:1-3:2","3:3:4-4:3","3:8:2-9:4","4:1:1-2","4:1:4-6","4:2:3-4","4:2:7-4:2","4:7:3-8:3","4:11:1-4","4:11:6-8","4:12:3-15:3","5:1:1-5","5:1:7-10","5:2:3-4:1","5:4:3-6:1","5:8:1-2","6:1:3-7","6:3:1-2","6:4:5-5:2","6:6:3-6","7:1:3-4","7:1:8-3:2","7:3:3-5","7:4:2-5:4","8:1:1-2","8:1:6-8","8:1:12-15","8:1:18-2:2","8:2:4-6","8:2:9-12","8:3:5-8","8:4:1-6:2","9:1:1-2:2","9:4:4-5:1","10:1:1-2","10:1:5-11","10:1:12-2:2","10:3:2-4","10:5:3-6:4","10:6:7-7:3","10:7:6-8","11:1:1-2","11:1:5-7","11:1:11-2:2","11:2:6-3:1","11:5:5-6:3","11:7:3-8","12:1:8-14","12:1:17-2:4","12:2:6-4:2","12:6:1-6","13:1:2-6","13:1:13-2:6","13:2:8-9","13:6:1-4","13:7:3-8:2","13:14:1-3","14:1:4-2:3","15:1:1-4","15:2:2-3:7","15:3:9-4:4","15:5:2-4","15:8:2-9:3","16:1:2-2:3","16:3:5-4:2","16:5:5-6:4","16:9:2"];const Ketubot=["1:1:1-4","1:1:6-9","1:1:14-17","1:2:5-3:1","1:3:5-4:5","1:5:3-6:3","1:8:2-9:3","1:10:3-4","2:1:1-4","2:2:1-4","2:2:4-3:3","2:4:5-6","2:5:4-7:2","2:7:4-9:4","2:10:3-8","3:1:4-7","3:1:12-13","3:1:16-18","3:3:3-5:1","3:5:4-6:2","3:6:3-7:2","3:8:1-9:3","4:1:1-4","4:1:6-2:1","4:2:3-3:2","4:4:3-7","4:4:8-9","4:4:12-7:1","4:8:4-12","4:9:1-11:3","4:12:2-14:3","5:1:3-4","5:1:6-2:2","5:3:1-4:1","5:5:2-3","5:5:4-6:3","5:6:5-7:5","5:8:3-10:1","6:1:2-3","6:3:2-4:2","6:5:2-6:3","6:7:1-4","7:1:1-3","7:2:1-5:1","7:6:6-7","7:7:3-5","7:8:2-9:3","8:2:2-4:2","8:6:2-9:1","8:10:3","9:1:1-2","9:1:5-7","9:1:12","9:3:1-4:2","9:5:3-6:2","9:7:6-8:1","9:9:1-10:1","10:1:1-6","10:2:3-4:1","10:4:4-5:2","11:1:1-5","11:2:4-3:2","11:4:2-6:2","11:7:1-8","12:2:2-3:3","12:3:8-10","12:3:14-5:2","13:1:2-5","13:2:3-3:1","13:3:4-4:3","13:7:1-8:2","13:10:2-11:3"];const Sotah=["1:1:1-6","1:1:9-10","1:2:1-5","1:2:7-10","1:3:2-4:3","1:5:1-6:1","1:7:4-8:5","1:8:11-10:4","2:1:2-4","2:1:9-2:5","2:2:9-4:1","2:5:1-5","2:5:6-6:1","3:1:4-2:1","3:3:2-4:1","3:4:6-11","3:5:3-6:5","3:6:6-8:2","4:1:3-2:2","4:4:1-5:3","5:1:5","5:2:3-5","5:2:6-8","5:2:11-3:2","5:4:3-5:6","6:1:1-2","6:2:4-3:1","6:3:2-4:4","7:1:1-5","7:2:2-3:2","7:4:4-7","7:4:9-5:3","7:5:6-6:3","8:1:1-2","8:2:2-3:3","8:3:6-9","8:3:12-4:3","8:5:5-8:1","8:9:2-10:1","9:1:2-6","9:2:1-7","9:4:2-5:4","9:5:7-6:3","9:8:1-11:2","9:11:8-13:2","9:14:1-15:6","9:16:1-4"];const Nedarim=["1:1:1-3","1:1:7-10","1:1:14-2:2","1:3:1-9","2:1:1-2","2:2:2-3:2","2:4:2-4","3:1:2-4","3:2:1-5","3:2:9-3:2","3:4:3-5:3","3:7:1-9:1","4:1:1-3","4:2:4-3:3","4:5:2-7:2","4:10:2-3","5:1:1-2","5:1:5-3:3","5:5:1-6:1","6:1:2-2:2","6:4:2-3","6:8:1-6","6:8:10-14","7:1:1-5","7:3:2-6:2","8:1:1-5","8:2:2-4:2","8:6:1-7:3","9:1:2-6","9:2:3-4:2","9:5:2-8:1","10:1:3-4","10:2:3-4:2","10:6:1-7:2","10:8:4-9","11:1:2-4","11:1:8-2:3","11:3:5-4:3","11:7:1-11:1","11:12:6"];const Nazir=["1:1:1-3","1:1:7-9","1:2:5-7","1:2:9-3:2","2:1:1-2","2:1:4-2:2","2:4:1-5:1","2:5:3-7:2","2:9:1-2","2:10:2-3","3:1:1-3","3:2:2","3:4:1-2","3:5:3-5","3:5:7-6:1","4:1:1-2","4:2:2-3:5","4:4:3-7","4:5:1-6:1","5:1:1-3","5:1:6-7","5:1:9-12","5:2:3-3:3","6:1:1-2","6:1:4-6","6:1:7-9","6:1:11-14","6:2:5-3:2","6:3:5-4:3","6:6:2-7:2","6:9:1-5","6:9:9-11:2","7:1:2-6","7:1:11-20","7:2:1-4","7:2:7-11","7:3:4-6","7:4:2-3","8:1:2-3","8:1:5-9","8:2:2-8","9:1:1-3","9:1:4-6","9:2:3-6","9:2:10-3:2","9:3:7-4:2","9:5:2-6:1"];const Gittin=["1:1:1-3","1:1:3-4","1:1:5-6","1:1:7-8","1:2:2-5","1:3:2-4:1","1:4:3-5","1:5:2-4","2:1:1-2","2:1:4-6","2:2:2-3:1","2:3:3-7","2:3:8-4:3","2:6:1-7:3","3:1:3-6","3:2:2-3:1","3:4:1-5:3","3:6:3-7:2","3:8:1-4","4:1:2-2:3","4:2:5-3:1","4:3:4-4:2","4:4:5-6","4:4:7-6:2","4:7:1-8:3","5:1:1-5","5:1:7-11","5:3:3-6","5:4:1-4","5:5:2-4","5:6:4-7:2","5:7:5-9:2","5:9:6-10:3","6:1:1-5","6:1:6-9","6:2:3-4","6:4:2-5:4","6:6:2-7:2","7:1:3-7","7:1:10-3:2","7:3:4-6","7:4:2-5","7:5:1-6:3","8:1:1-3","8:1:3-2:1","8:3:3-9","8:4:3-6:2","8:8:2-10:2","8:10:4-6","9:1:4-6","9:3:2-5","9:5:2-6:2","9:7:2-4","9:8:5-11:1"];const Kiddushin=["1:1:1-7","1:1:13-18","1:1:18-19","1:1:21-25","1:1:30-2:1","1:2:3-6","1:2:7","1:2:10-13","1:2:15-20","1:2:23-24","1:2:27-29","1:3:1-6","1:3:8-11","1:3:13-4:3","1:4:6-9","1:4:11-5:3","1:5:8-11","1:5:14-6:3","1:6:4-7:2","1:7:4-8","1:7:14-18","1:8:2-6","2:1:1-2","2:1:5-8","2:1:10-11","2:1:14-2:1","2:4:2-5","2:5:2-6:3","2:7:4-7","2:7:9-8:3","3:1:1-4","3:1:6-8","3:1:11-2:1","3:2:5-6","3:3:2-3","3:4:4-7","3:5:3-7","3:6:3-8:1","3:8:4-10:1","3:12:1-5","3:12:9-13:3","4:1:4-7","4:1:8-12","4:2:3-3:3","4:4:2-5:1","4:6:3-7:1","4:8:1-11:1","4:11:3-12:2"];const Shevuot=["1:1:1-2","1:1:3-5","1:1:5-2:1","1:2:3-7","1:3:2-4:2","1:4:3-5","1:6:3-8","1:7:2-3","2:1:4-7","2:1:9-11","2:3:2-5:1","3:1:2-3","3:2:2-3:2","3:4:2-4","3:4:8-5:2","3:5:3-7:2","3:7:7-8:4","3:8:9-9:5","4:1:1-20","4:2:3-3:1","4:3:4-5:2","4:7:1-9:2","5:1:1-2","5:1:4-2:4","5:3:4-4:2","5:4:4","5:5:1-6:1","6:1:2-4","6:1:7-2:4","6:3:2-4:2","6:5:1-3","6:6:3-7:2","6:8:4","7:1:3-4","7:1:6-8","7:2:4-4:2","7:5:4-6:2","7:7:2-4","7:7:9-8:3","8:1:2-5","8:1:9","8:1:12-2:3","8:3:2-4","8:3:5-6"];const Makkot=["1:1:1-4","1:2:2-4","1:3:2-4:2","1:6:2-7:3","2:1:1-3:1","2:5:1-6:1","2:6:7-11","3:1:1-3:1","3:7:1-11:1"];const Sanhedrin=["1:1:1-6","1:1:11-17","1:1:29-2:1","1:2:8-13","1:2:19-26","1:2:33-38","1:2:45-3:4","1:3:7-4:2","1:4:7-10","2:1:3-6","2:2:4-3:7","2:4:2-5:3","2:6:4-12","3:2:1-3:2","3:4:2-5:4","3:5:7-11","3:6:3-7:1","3:9:1-11","3:9:19-21","3:10:2-12:1","4:1:2-2:2","4:5:2-7:1","4:7:6-9:1","5:1:1-8","5:2:3-4","5:3:4-4:2","6:1:1-2","6:3:2-5:2","6:6:5-7:3","7:1:1-2","7:1:4-2:4","7:5:2-3","7:5:5-6","7:6:3-5","7:6:6-7:1","7:7:4-8:2","7:8:7-9:3","7:9:7-10:2","7:10:4-8","7:11:2-12:1","7:13:3-7","8:2:4-3:4","8:6:5-7:1","8:8:3-9:3","9:1:5-9","9:1:14-2:1","9:3:2-3","9:5:1-6:3","10:1:1-8","10:1:13-22","10:2:3-7","10:2:15-19","10:2:23-4:2","10:6:1-7:2","11:1:2-3:2","11:4:3-4","11:5:4-6:2"];const Horayot=["1:1:1-3","1:1:4-7","1:1:8-2:1","1:2:3-5","1:2:8-3:3","1:4:2-6:2","1:6:2-8:2","2:1:1-2","2:2:2-4:2","2:4:2-5:4","2:7:1-3","3:1:2-2:3","3:2:7-11","3:2:11-13","3:2:15-19","3:2:25-30","3:2:35-3:4","3:4:3-9","3:5:7-9"];const Niddah=["1:1:1-4","1:1:7-2:2","1:3:4-7","1:4:5-5:2","1:5:4-6:2","2:1:1-5","2:2:3-4:2","2:6:1-7:2","3:1:1-2:1","3:2:5-9","3:4:1-5","3:4:7-5:3"];var vilnaMap = {Berakhot:Berakhot,Peah:Peah,Demai:Demai,Kilayim:Kilayim,Sheviit:Sheviit,Terumot:Terumot,Maasrot:Maasrot,"Maaser Sheni":["1:1:1-3","1:1:5-10","1:1:13-16","1:1:19-20","1:2:2-5","1:2:8-3:1","1:3:2-4","2:1:1-2","2:1:8-10","2:1:14-16","2:2:3-6","2:3:2-6","2:3:9-4:1","3:1:1-4","3:2:2-5","3:2:6-3:1","3:3:7-9","3:4:3-5:3","3:5:7-6:4","3:6:5-9","4:1:4-7","4:1:10-2:3","4:2:7-3:4","4:3:8-4:2","4:4:6-5:1","4:5:2-6:1","4:6:5-9","5:1:1-4","5:1:10-2:1","5:2:9-3:1","5:3:5-9","5:4:5-5:1","5:5:8-12"],Challah:Challah,Orlah:Orlah,Bikkurim:Bikkurim,Shabbat:Shabbat,Eruvin:Eruvin,Pesachim:Pesachim,Beitzah:Beitzah,"Rosh Hashanah":["1:1:1-2","1:1:3-5","1:1:8","1:1:10-11","1:1:12-15","1:2:1-4","1:2:6-3:4","1:3:6-4:3","1:7:1-6","1:8:4","2:1:3-7","2:1:8-4:1","2:4:6-5:3","2:6:1-8:4","3:1:3-5","3:1:10-3:4","3:5:4-6:2","4:1:1-2","4:2:2-4:2","4:6:3-7:3","4:8:3-10:2","4:10:5"],Yoma:Yoma,Sukkah:Sukkah,Taanit:Taanit,Shekalim:Shekalim,Megillah:Megillah,Chagigah:Chagigah,"Moed Katan":["1:1:1-2","1:1:4-2:2","1:2:3-3:1","1:4:4-5:2","1:5:2-4","1:7:2-8:1","1:9:2-10:5","2:1:5-2:3","2:3:3-4:3","3:1:1-6","3:1:10-14","3:1:16-3:1","3:5:1-4","3:5:6-10","3:5:14-16","3:5:19-23","3:6:1-7:5","3:7:12-17","3:8:3-9:2"],Yevamot:Yevamot,Ketubot:Ketubot,Sotah:Sotah,Nedarim:Nedarim,Nazir:Nazir,Gittin:Gittin,Kiddushin:Kiddushin,"Bava Kamma":["1:1:1","1:1:3-7","1:1:8","1:1:10-2:2","1:2:3-4","1:2:5-3:1","2:1:1-2","2:1:5-2:2","2:2:2-3:2","2:4:2-5:3","2:5:3-6:3","3:1:2-4","3:1:7-2:2","3:3:4-4:4","3:4:5-5:2","3:6:2-9:1","3:10:1-11:2","4:1:2-5","4:1:6-2:3","4:4:3-5","4:5:2-3","4:5:3-6:3","5:1:1-2","5:2:1-5:1","5:6:1-7:1","5:7:6-8:3","6:1:3-2:4","6:2:5-4:2","6:5:2-7:2","7:1:1-2","7:2:1-3:2","7:3:2-4:1","7:4:3-5:2","8:1:1-4","8:2:2-3:3","8:5:1-6:1","8:8:1-2","9:1:3-3:1","9:5:1-4","9:5:5-6:2","9:8:1-9:2","10:1:1-2","10:1:5-2:3","10:6:1-8:2"],"Bava Metzia":["1:1:1-2","1:1:3-3:2","1:4:2","1:5:1-6:2","1:6:3-7:3","2:1:1-3","2:3:2-4:3","2:5:2-7","2:8:2-10:2","3:1:1-2","3:2:1-3:2","3:4:2-6:2","3:7:1-9:3","4:1:2-5","4:2:1-4","4:2:7-3:2","4:3:4-5:1","4:6:1-7:2","5:1:3-7","5:2:2-3:1","5:3:7-8","5:4:7-5:4","5:5:9-6:2","5:6:4-7:1","6:1:1-3","6:2:2-3:3","6:4:2-6:2","7:1:4-3:1","7:6:1-7:2","8:2:1-3:2","8:4:2-7:1","9:1:1-3:1","9:5:2-7:2","9:8:2-10:2","9:12:2-13:2","10:2:1-4:1","10:5:2-6:3"],"Bava Batra":["1:1:1-2","1:3:2-4:2","1:5:3-6","2:1:4-2:2","2:3:5-4:2","2:5:2-7:1","2:10:1-11:2","3:1:3-5","3:1:6-3:2","3:4:1-5:1","3:5:6-8:1","3:8:4-10:2","4:1:1-2:1","4:4:2-8:1","4:8:4","5:1:3-4","5:1:7-4:1","6:1:1-2","6:1:6-2:1","7:1:1-2","7:2:2-4:2","8:1:2-2:1","8:2:7-4:1","8:5:2-3","8:7:1-4","8:8:3-5","9:1:4-5","9:3:1-4:1","9:5:3-6:3","9:7:2-9:1","10:1:6-9","10:4:1-5:1","10:6:4-9:2","10:10:2-4"],Shevuot:Shevuot,Makkot:Makkot,Sanhedrin:Sanhedrin,"Avodah Zarah":["1:1:1-3","1:1:8-11","1:2:3-9","1:3:3-4:2","1:4:3-5:1","1:6:1-5","1:7:1-9:1","1:9:5-10:2","2:1:2-5","2:1:11-2:4","2:2:9-14","2:3:7-15","2:3:19-4:3","2:4:10-7:1","2:7:3-10","2:8:4-10","2:9:2-4","3:1:1-9","3:2:2-3:3","3:4:2-5:3","3:5:5-8","3:6:2-4","3:6:4-7:2","3:8:4-11:2","4:1:1-3","4:1:7-3:1","4:4:4-9","4:5:2-7:3","4:8:3-9:1","4:10:1-11:2","5:1:1-3","5:1:5-3:1","5:3:5-4:3","5:4:8-7:1","5:8:3-10:4","5:11:4-12:1","5:13:2-15:1"],Horayot:Horayot,Niddah:Niddah};
5333
-
5334
- const vilnaStartDate = new Date(1980, 1, 2);
5335
- /**
5336
- * Yerushalmi Yomi configuration for Vilna Edition
5337
- * @readonly
5338
- */
5339
- const vilna = {
5340
- ed: 'vilna',
5341
- startDate: vilnaStartDate,
5342
- startAbs: greg2abs(vilnaStartDate),
5343
- skipYK9Av: true,
5344
- shas: [['Berakhot', 68], ['Peah', 37], ['Demai', 34], ['Kilayim', 44], ['Sheviit', 31], ['Terumot', 59], ['Maasrot', 26], ['Maaser Sheni', 33], ['Challah', 28], ['Orlah', 20], ['Bikkurim', 13], ['Shabbat', 92], ['Eruvin', 65], ['Pesachim', 71], ['Beitzah', 22], ['Rosh Hashanah', 22], ['Yoma', 42], ['Sukkah', 26], ['Taanit', 26], ['Shekalim', 33], ['Megillah', 34], ['Chagigah', 22], ['Moed Katan', 19], ['Yevamot', 85], ['Ketubot', 72], ['Sotah', 47], ['Nedarim', 40], ['Nazir', 47], ['Gittin', 54], ['Kiddushin', 48], ['Bava Kamma', 44], ['Bava Metzia', 37], ['Bava Batra', 34], ['Shevuot', 44], ['Makkot', 9], ['Sanhedrin', 57], ['Avodah Zarah', 37], ['Horayot', 19], ['Niddah', 13]]
5345
- };
5346
- const schottensteinStartDate = new Date(2022, 10, 14);
5347
- /**
5348
- * Yerushalmi Yomi configuration for Schottenstein Edition
5349
- * @readonly
5350
- */
5351
- const schottenstein = {
5352
- ed: 'schottenstein',
5353
- startDate: schottensteinStartDate,
5354
- startAbs: greg2abs(schottensteinStartDate),
5355
- skipYK9Av: false,
5356
- shas: [['Berakhot', 94], ['Peah', 73], ['Demai', 77], ['Kilayim', 84], ['Sheviit', 87], ['Terumot', 107], ['Maasrot', 46], ['Maaser Sheni', 59], ['Challah', 49], ['Orlah', 42], ['Bikkurim', 26], ['Shabbat', 113], ['Eruvin', 71], ['Pesachim', 86], ['Shekalim', 61], ['Yoma', 57], ['Sukkah', 33], ['Beitzah', 49], ['Rosh Hashanah', 27], ['Taanit', 31], ['Megillah', 41], ['Chagigah', 28], ['Moed Katan', 23], ['Yevamot', 88], ['Ketubot', 77], ['Nedarim', 42], ['Nazir', 53], ['Sotah', 52], ['Gittin', 53], ['Kiddushin', 53], ['Bava Kamma', 40], ['Bava Metzia', 35], ['Bava Batra', 39], ['Sanhedrin', 75], ['Shevuot', 49], ['Avodah Zarah', 34], ['Makkot', 11], ['Horayot', 18], ['Niddah', 11]]
5357
- };
5358
- const SUN = 0;
5359
- const SAT$1 = 6;
5360
-
5361
- /**
5362
- * Using the Vilna edition, the Yerushalmi Daf Yomi program takes
5363
- * ~4.25 years or 51 months.
5364
- * Unlike the Daf Yomi Bavli cycle, this Yerushalmi cycle skips both
5365
- * Yom Kippur and Tisha B'Av (returning `null`).
5366
- * The page numbers are according to the Vilna
5367
- * Edition which is used since 1900.
5368
- *
5369
- * The Schottenstein edition uses different page numbers and takes
5370
- * ~6 years to complete.
5371
- *
5372
- * Throws an exception if the date is before Daf Yomi Yerushalmi
5373
- * cycle began (2 February 1980 for Vilna,
5374
- * 14 November 2022 for Schottenstein).
5375
- *
5376
- * @param {HDate|Date|number} date - Hebrew or Gregorian date
5377
- * @param {any} config - either vilna or schottenstein
5378
- * @return {any}
5379
- */
5380
- function yerushalmiYomi(date, config) {
5381
- if (typeof config !== 'object' || !Array.isArray(config.shas)) {
5382
- throw new Error('invalid yerushalmi config');
5383
- }
5384
- const cday = typeof date === 'number' && !isNaN(date) ? date : isDate(date) ? greg2abs(date) : HDate.isHDate(date) ? date.abs() : throwTypeError(`non-date given to dafyomi: ${date}`);
5385
- const startAbs = config.startAbs;
5386
- if (cday < startAbs) {
5387
- throw new RangeError(`Date ${date} too early; Yerushalmi Yomi cycle began on ${config.startDate}`);
5388
- }
5389
- const hd = new HDate(cday);
5390
- // No Daf for Yom Kippur and Tisha B'Av
5391
- if (config.skipYK9Av && skipDay(hd)) {
5392
5045
  return null;
5393
5046
  }
5394
- const shas = config.shas;
5395
- let numDapim = 0;
5396
- for (let j = 0; j < shas.length; j++) {
5397
- numDapim += shas[j][1];
5398
- }
5399
- let prevCycle = startAbs;
5400
- let nextCycle = startAbs;
5401
- while (cday >= nextCycle) {
5402
- prevCycle = nextCycle;
5403
- nextCycle += numDapim;
5404
- nextCycle += numSpecialDays(config, prevCycle, nextCycle);
5405
- }
5406
- let total = cday - prevCycle - numSpecialDays(config, prevCycle, cday);
5407
- for (let j = 0; j < shas.length; j++) {
5408
- const masechet = shas[j];
5409
- if (total < masechet[1]) {
5410
- return {
5411
- name: masechet[0],
5412
- blatt: total + 1,
5413
- ed: config.ed
5414
- };
5415
- }
5416
- total -= masechet[1];
5417
- }
5418
- throw new Error('Interal error, this code should be unreachable');
5419
- }
5420
-
5421
- /**
5422
- * @private
5423
- * @param {HDate} hd
5424
- * @return {boolean}
5425
- */
5426
- function skipDay(hd) {
5427
- if (hd.getMonth() === months.TISHREI && hd.getDate() === 10 || hd.getMonth() === months.AV && (hd.getDate() === 9 && hd.getDay() !== SAT$1 || hd.getDate() === 10 && hd.getDay() === SUN)) {
5428
- return true;
5429
- }
5430
- return false;
5431
- }
5432
-
5433
- /**
5434
- * @private
5435
- * @param {any} config
5436
- * @param {number} startAbs
5437
- * @param {number} endAbs
5438
- * @return {number}
5439
- */
5440
- function numSpecialDays(config, startAbs, endAbs) {
5441
- if (!config.skipYK9Av) {
5442
- return 0;
5443
- }
5444
- const startYear = new HDate(startAbs).getFullYear();
5445
- const endYear = new HDate(endAbs).getFullYear();
5446
- let specialDays = 0;
5447
- for (let year = startYear; year <= endYear; year++) {
5448
- const ykAbs = new HDate(10, months.TISHREI, year).abs();
5449
- if (ykAbs >= startAbs && ykAbs <= endAbs) {
5450
- specialDays++;
5451
- }
5452
- let av9dt = new HDate(9, months.AV, year);
5453
- if (av9dt.getDay() == SAT$1) {
5454
- av9dt = av9dt.next();
5455
- }
5456
- const av9abs = av9dt.abs();
5457
- if (av9abs >= startAbs && av9abs <= endAbs) {
5458
- specialDays++;
5459
- }
5460
- }
5461
- return specialDays;
5462
- }
5463
-
5464
- /**
5465
- * Event wrapper around a Yerushalmi Yomi result
5466
- */
5467
- class YerushalmiYomiEvent extends Event {
5468
- /**
5469
- * @param {HDate} date
5470
- * @param {any} daf
5471
- */
5472
- constructor(date, daf) {
5473
- super(date, `${daf.name} ${daf.blatt}`, flags.YERUSHALMI_YOMI);
5474
- this.daf = daf;
5475
- }
5476
- /**
5477
- * Returns name of tractate and page (e.g. "Yerushalmi Beitzah 21").
5478
- * @param {string} [locale] Optional locale name (defaults to active locale).
5479
- * @return {string}
5480
- */
5481
- render(locale) {
5482
- const prefix = Locale.gettext('Yerushalmi', locale);
5483
- return prefix + ' ' + this.renderBrief(locale);
5484
- }
5485
- /**
5486
- * Returns name of tractate and page (e.g. "Beitzah 21").
5487
- * @param {string} [locale] Optional locale name (defaults to active locale).
5488
- * @return {string}
5489
- */
5490
- renderBrief(locale) {
5491
- locale = locale || Locale.getLocaleName();
5492
- if (typeof locale === 'string') {
5493
- locale = locale.toLowerCase();
5494
- }
5495
- const name = Locale.gettext(this.daf.name, locale);
5496
- if (locale === 'he' || locale === 'he-x-nonikud') {
5497
- return name + ' דף ' + gematriya(this.daf.blatt);
5498
- }
5499
- return name + ' ' + this.daf.blatt;
5500
- }
5501
- /**
5502
- * Returns a link to sefaria.org
5503
- * @return {string}
5504
- */
5505
- url() {
5506
- const daf = this.daf;
5507
- if (daf.ed !== 'vilna') {
5508
- return undefined;
5509
- }
5510
- const tractate = daf.name;
5511
- const pageMap = vilnaMap[tractate];
5512
- if (!Array.isArray(pageMap)) {
5513
- return undefined;
5514
- }
5515
- const idx = daf.blatt - 1;
5516
- const verses0 = pageMap[idx];
5517
- if (typeof verses0 !== 'string') {
5518
- return undefined;
5519
- }
5520
- const name0 = 'Jerusalem Talmud ' + tractate;
5521
- const name = name0.replace(/ /g, '_');
5522
- const verses = verses0.replace(/:/g, '.');
5523
- return `https://www.sefaria.org/${name}.${verses}?lang=bi`;
5524
- }
5525
5047
  }
5526
5048
 
5527
5049
  const NISAN$1 = months.NISAN;
@@ -5612,7 +5134,7 @@ function getBirthdayOrAnniversary_(hyear, gdate) {
5612
5134
  return new HDate(day, month, hyear);
5613
5135
  }
5614
5136
 
5615
- const version="3.50.4";
5137
+ const version="4.0.0";
5616
5138
 
5617
5139
  const headers$1={"plural-forms":"nplurals=2; plural=(n > 1);"};const contexts$1={"":{Berachot:["Berachos"],Shabbat:["Shabbos"],Taanit:["Taanis"],Yevamot:["Yevamos"],Ketubot:["Kesubos"],"Baba Batra":["Baba Basra"],Makkot:["Makkos"],Shevuot:["Shevuos"],Horayot:["Horayos"],Menachot:["Menachos"],Bechorot:["Bechoros"],Keritot:["Kerisos"],Midot:["Midos"],"Achrei Mot":["Achrei Mos"],Bechukotai:["Bechukosai"],"Beha'alotcha":["Beha'aloscha"],Bereshit:["Bereshis"],Chukat:["Chukas"],"Erev Shavuot":["Erev Shavuos"],"Erev Sukkot":["Erev Sukkos"],"Ki Tavo":["Ki Savo"],"Ki Teitzei":["Ki Seitzei"],"Ki Tisa":["Ki Sisa"],Matot:["Matos"],"Purim Katan":["Purim Koton"],Tazria:["Sazria"],"Shabbat Chazon":["Shabbos Chazon"],"Shabbat HaChodesh":["Shabbos HaChodesh"],"Shabbat HaGadol":["Shabbos HaGadol"],"Shabbat Nachamu":["Shabbos Nachamu"],"Shabbat Parah":["Shabbos Parah"],"Shabbat Shekalim":["Shabbos Shekalim"],"Shabbat Shuva":["Shabbos Shuvah"],"Shabbat Zachor":["Shabbos Zachor"],Shavuot:["Shavuos"],"Shavuot I":["Shavuos I"],"Shavuot II":["Shavuos II"],Shemot:["Shemos"],"Shmini Atzeret":["Shmini Atzeres"],"Simchat Torah":["Simchas Torah"],Sukkot:["Sukkos"],"Sukkot I":["Sukkos I"],"Sukkot II":["Sukkos II"],"Sukkot II (CH''M)":["Sukkos II (CH''M)"],"Sukkot III (CH''M)":["Sukkos III (CH''M)"],"Sukkot IV (CH''M)":["Sukkos IV (CH''M)"],"Sukkot V (CH''M)":["Sukkos V (CH''M)"],"Sukkot VI (CH''M)":["Sukkos VI (CH''M)"],"Sukkot VII (Hoshana Raba)":["Sukkos VII (Hoshana Raba)"],"Ta'anit Bechorot":["Ta'anis Bechoros"],"Ta'anit Esther":["Ta'anis Esther"],Toldot:["Toldos"],Vaetchanan:["Vaeschanan"],Yitro:["Yisro"],"Vezot Haberakhah":["Vezos Haberakhah"],Parashat:["Parshas"],"Leil Selichot":["Leil Selichos"],"Shabbat Mevarchim Chodesh":["Shabbos Mevorchim Chodesh"],"Shabbat Shirah":["Shabbos Shirah"],Tevet:["Teves"],"Asara B'Tevet":["Asara B'Teves"],Berakhot:["Berakhos"],Sheviit:["Sheviis"],Terumot:["Terumos"],Maasrot:["Maasros"],Eduyot:["Eduyos"],Avot:["Avos"],Bekhorot:["Bekhoros"],Middot:["Middos"],Oholot:["Oholos"],Tahorot:["Tahoros"],Mikvaot:["Mikvaos"],"Alot HaShachar":["Alos HaShachar"],"Kriat Shema, sof zeman":["Krias Shema, sof zman"],"Tefilah, sof zeman":["Tefilah, sof zman"],"Kriat Shema, sof zeman (MGA)":["Krias Shema, sof zman (MGA)"],"Tefilah, sof zeman (MGA)":["Tefilah, sof zman (MGA)"],"Chatzot HaLailah":["Chatzos HaLailah"],"Chatzot hayom":["Chatzos"],"Tzeit HaKochavim":["Tzeis HaKochavim"],"Birkat Hachamah":["Birkas Hachamah"],"Shushan Purim Katan":["Shushan Purim Koton"]}};var poAshkenazi = {headers:headers$1,contexts:contexts$1};
5618
5140
 
@@ -5881,9 +5403,6 @@ const RECOGNIZED_OPTIONS = {
5881
5403
  noRoshChodesh: 1,
5882
5404
  noSpecialShabbat: 1,
5883
5405
  noHolidays: 1,
5884
- dafyomi: 1,
5885
- mishnaYomi: 1,
5886
- nachYomi: 1,
5887
5406
  omer: 1,
5888
5407
  molad: 1,
5889
5408
  ashkenazi: 1,
@@ -5895,8 +5414,7 @@ const RECOGNIZED_OPTIONS = {
5895
5414
  userMask: 1,
5896
5415
  yomKippurKatan: 1,
5897
5416
  hour12: 1,
5898
- yerushalmi: 1,
5899
- yerushalmiEdition: 1
5417
+ dailyLearning: 1
5900
5418
  };
5901
5419
 
5902
5420
  /**
@@ -6005,11 +5523,6 @@ function checkCandleOptions(options) {
6005
5523
  * @property {boolean} shabbatMevarchim - add Shabbat Mevarchim
6006
5524
  * @property {boolean} noSpecialShabbat - suppress Special Shabbat
6007
5525
  * @property {boolean} noHolidays - suppress regular holidays
6008
- * @property {boolean} dafyomi - Babylonian Talmud Daf Yomi
6009
- * @property {boolean} yerushalmi - Jerusalem Talmud (Yerushalmi) Yomi
6010
- * @property {number} yerushalmiEdition - Use 1 for Vilna, 2 for Schottenstein
6011
- * @property {boolean} mishnaYomi - include Mishna Yomi
6012
- * @property {boolean} nachYomi - include Nach Yomi
6013
5526
  * @property {boolean} omer - include Days of the Omer
6014
5527
  * @property {boolean} molad - include event announcing the molad
6015
5528
  * @property {boolean} ashkenazi - use Ashkenazi transliterations for event titles (default Sephardi transliterations)
@@ -6029,6 +5542,9 @@ function checkCandleOptions(options) {
6029
5542
  * See {@link https://en.wikipedia.org/wiki/Yom_Kippur_Katan#Practices Wikipedia Yom Kippur Katan practices}
6030
5543
  * @property {boolean} hour12 - Whether to use 12-hour time (as opposed to 24-hour time).
6031
5544
  * Possible values are `true` and `false`; the default is locale dependent.
5545
+ * @property {Object<string,any>} dailyLearning - map of options to enable daily study calendars
5546
+ * such as `dafYomi`, `mishnaYomi`, `nachYomi` with value `true`. For `yerushalmi`
5547
+ * the value should be a `number` for edition (`1` for Vilna, `2` for Schottenstein).
6032
5548
  */
6033
5549
 
6034
5550
  /**
@@ -6126,13 +5642,25 @@ function getMaskFromOptions(options) {
6126
5642
  if (m & MINOR_FAST) delete options.noMinorFast;
6127
5643
  if (m & SPECIAL_SHABBAT) delete options.noSpecialShabbat;
6128
5644
  if (m & PARSHA_HASHAVUA) options.sedrot = true;
6129
- if (m & DAF_YOMI) options.dafyomi = true;
5645
+ if (m & DAF_YOMI) {
5646
+ options.dailyLearning = options.dailyLearning || {};
5647
+ options.dailyLearning.dafYomi = true;
5648
+ }
6130
5649
  if (m & OMER_COUNT) options.omer = true;
6131
5650
  if (m & SHABBAT_MEVARCHIM) options.shabbatMevarchim = true;
6132
- if (m & flags.MISHNA_YOMI) options.mishnaYomi = true;
6133
- if (m & flags.NACH_YOMI) options.nachYomi = true;
5651
+ if (m & flags.MISHNA_YOMI) {
5652
+ options.dailyLearning = options.dailyLearning || {};
5653
+ options.dailyLearning.mishnaYomi = true;
5654
+ }
5655
+ if (m & flags.NACH_YOMI) {
5656
+ options.dailyLearning = options.dailyLearning || {};
5657
+ options.dailyLearning.nachYomi = true;
5658
+ }
6134
5659
  if (m & flags.YOM_KIPPUR_KATAN) options.yomKippurKatan = true;
6135
- if (m & flags.YERUSHALMI_YOMI) options.yerushalmi = true;
5660
+ if (m & flags.YERUSHALMI_YOMI) {
5661
+ options.dailyLearning = options.dailyLearning || {};
5662
+ options.dailyLearning.yerushalmi = 1;
5663
+ }
6136
5664
  options.userMask = true;
6137
5665
  return m;
6138
5666
  }
@@ -6169,15 +5697,6 @@ function getMaskFromOptions(options) {
6169
5697
  if (options.sedrot) {
6170
5698
  mask |= PARSHA_HASHAVUA;
6171
5699
  }
6172
- if (options.dafyomi) {
6173
- mask |= DAF_YOMI;
6174
- }
6175
- if (options.mishnaYomi) {
6176
- mask |= flags.MISHNA_YOMI;
6177
- }
6178
- if (options.nachYomi) {
6179
- mask |= flags.NACH_YOMI;
6180
- }
6181
5700
  if (options.omer) {
6182
5701
  mask |= OMER_COUNT;
6183
5702
  }
@@ -6187,8 +5706,20 @@ function getMaskFromOptions(options) {
6187
5706
  if (options.yomKippurKatan) {
6188
5707
  mask |= flags.YOM_KIPPUR_KATAN;
6189
5708
  }
6190
- if (options.yerushalmi) {
6191
- mask |= flags.YERUSHALMI_YOMI;
5709
+ if (options.dailyLearning) {
5710
+ const dailyLearning = options.dailyLearning;
5711
+ if (dailyLearning.dafYomi) {
5712
+ mask |= DAF_YOMI;
5713
+ }
5714
+ if (dailyLearning.mishnaYomi) {
5715
+ mask |= flags.MISHNA_YOMI;
5716
+ }
5717
+ if (dailyLearning.nachYomi) {
5718
+ mask |= flags.NACH_YOMI;
5719
+ }
5720
+ if (dailyLearning.yerushalmi) {
5721
+ mask |= flags.YERUSHALMI_YOMI;
5722
+ }
6192
5723
  }
6193
5724
  return mask;
6194
5725
  }
@@ -6266,14 +5797,16 @@ class HebrewCalendar {
6266
5797
  * Additional non-default event types can be specified:
6267
5798
  * * Parashat HaShavua - weekly Torah Reading on Saturdays (`options.sedrot`)
6268
5799
  * * Counting of the Omer (`options.omer`)
6269
- * * Babylonian Talmud Daf Yomi (`options.dafyomi`)
6270
- * * Jerusalem Talmud (Yerushalmi) Yomi (`options.yerushalmi`)
6271
- * * Mishna Yomi (`options.mishnaYomi`)
6272
- * * Nach Yomi (`options.nachYomi`)
6273
5800
  * * Shabbat Mevarchim HaChodesh on Saturday before Rosh Chodesh (`options.shabbatMevarchim`)
6274
5801
  * * Molad announcement on Saturday before Rosh Chodesh (`options.molad`)
6275
5802
  * * Yom Kippur Katan (`options.yomKippurKatan`)
6276
5803
  *
5804
+ * Daily Study of texts:
5805
+ * * Babylonian Talmud Daf Yomi (`options.dailyLearning.dafYomi`)
5806
+ * * Jerusalem Talmud (Yerushalmi) Yomi (`options.dailyLearning.yerushalmi`)
5807
+ * * Mishna Yomi (`options.dailyLearning.mishnaYomi`)
5808
+ * * Nach Yomi (`options.dailyLearning.nachYomi`)
5809
+ *
6277
5810
  * Candle-lighting and Havdalah times are approximated using latitude and longitude
6278
5811
  * specified by the {@link Location} class. The `Location` class contains a small
6279
5812
  * database of cities with their associated geographic information and time-zone information.
@@ -6371,15 +5904,6 @@ class HebrewCalendar {
6371
5904
  if (startGreg.getFullYear() < 100) {
6372
5905
  options.candlelighting = false;
6373
5906
  }
6374
- let mishnaYomiIndex;
6375
- if (options.mishnaYomi) {
6376
- mishnaYomiIndex = new MishnaYomiIndex();
6377
- }
6378
- let nachYomiIndex;
6379
- if (options.nachYomi) {
6380
- nachYomiIndex = new NachYomiIndex();
6381
- }
6382
- const yerushalmiCfg = options.yerushalmiEdition === 2 ? schottenstein : vilna;
6383
5907
  for (let abs = startAbs; abs <= endAbs; abs++) {
6384
5908
  const hd = new HDate(abs);
6385
5909
  const hyear = hd.getFullYear();
@@ -6407,23 +5931,19 @@ class HebrewCalendar {
6407
5931
  evts.push(new ParshaEvent(hd, parsha0.parsha, il, parsha0.num));
6408
5932
  }
6409
5933
  }
6410
- if (options.dafyomi && hyear >= 5684) {
6411
- evts.push(new DafYomiEvent(hd));
6412
- }
6413
- if (options.yerushalmi && abs >= yerushalmiCfg.startAbs) {
6414
- const daf = yerushalmiYomi(abs, yerushalmiCfg);
6415
- // daf will be null to signal no Yerushalmi Yomi on YK and 9Av
6416
- if (daf != null) {
6417
- evts.push(new YerushalmiYomiEvent(hd, daf));
6418
- }
6419
- }
6420
- if (options.mishnaYomi && abs >= mishnaYomiStart) {
6421
- const mishnaYomi = mishnaYomiIndex.lookup(abs);
6422
- evts.push(new MishnaYomiEvent(hd, mishnaYomi));
6423
- }
6424
- if (options.nachYomi && abs >= nachYomiStart) {
6425
- const nachYomi = nachYomiIndex.lookup(abs);
6426
- evts.push(new NachYomiEvent(hd, nachYomi));
5934
+ const dailyLearning = options.dailyLearning;
5935
+ if (typeof dailyLearning === 'object') {
5936
+ Object.entries(dailyLearning).forEach(kv => {
5937
+ const key = kv[0];
5938
+ const val = kv[1];
5939
+ if (val) {
5940
+ const name = key === 'yerushalmi' ? val === 2 ? 'yerushalmi-schottenstein' : 'yerushalmi-vilna' : key;
5941
+ const learningEv = DailyLearning.lookup(name, hd);
5942
+ if (learningEv) {
5943
+ evts.push(learningEv);
5944
+ }
5945
+ }
5946
+ });
6427
5947
  }
6428
5948
  if (options.omer && abs >= beginOmer && abs <= endOmer) {
6429
5949
  const omer = abs - beginOmer + 1;
@@ -6750,4 +6270,4 @@ function appendHolidayAndRelated(events, ev, options, candlesEv, dow) {
6750
6270
  return candlesEv;
6751
6271
  }
6752
6272
 
6753
- export { AsaraBTevetEvent, CandleLightingEvent, DafYomi, DafYomiEvent, Event, HDate, HavdalahEvent, HebrewCalendar, HebrewDateEvent, HolidayEvent, Locale, Location, MevarchimChodeshEvent, MishnaYomiEvent, MishnaYomiIndex, Molad, MoladEvent, NachYomiEvent, NachYomiIndex, OmerEvent, ParshaEvent, RoshChodeshEvent, RoshHashanaEvent, Sedra, SolarCalc, TimedEvent, YerushalmiYomiEvent, Zmanim, flags, gematriya, greg, months, parshiot, schottenstein, version, vilna, yerushalmiYomi };
6273
+ export { AsaraBTevetEvent, CandleLightingEvent, DailyLearning, Event, HDate, HavdalahEvent, HebrewCalendar, HebrewDateEvent, HolidayEvent, Locale, Location, MevarchimChodeshEvent, Molad, MoladEvent, OmerEvent, ParshaEvent, RoshChodeshEvent, RoshHashanaEvent, Sedra, SolarCalc, TimedEvent, Zmanim, flags, gematriya, greg, months, parshiot, version };