@hebcal/leyning 6.2.1 → 6.2.3

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.js CHANGED
@@ -1,8 +1,6 @@
1
- /*! @hebcal/leyning v6.2.1 */
1
+ /*! @hebcal/leyning v6.2.3 */
2
2
  'use strict';
3
3
 
4
- Object.defineProperty(exports, '__esModule', { value: true });
5
-
6
4
  var core = require('@hebcal/core');
7
5
 
8
6
  var Genesis=[0,31,25,24,26,32,22,24,22,29,32,32,20,18,24,21,16,27,33,38,18,34,24,20,67,34,35,46,22,35,43,54,33,20,31,29,43,36,30,23,23,57,38,34,34,28,34,31,22,33,26];var Exodus=[0,22,25,22,31,23,30,29,28,35,29,10,51,22,31,27,36,16,27,25,26,37,30,33,18,40,37,21,43,46,38,18,35,23,35,35,38,29,31,43,38];var Leviticus=[0,17,16,17,35,26,23,38,36,24,20,47,8,59,57,33,34,16,30,37,27,24,33,44,23,55,46,34];var Numbers=[0,54,34,51,49,31,27,89,26,23,36,35,16,33,45,41,35,28,32,22,29,35,41,30,25,19,65,23,31,39,17,54,42,56,29,34,13];var Deuteronomy=[0,46,37,29,49,30,25,26,20,29,22,32,31,19,29,23,22,20,22,21,20,23,29,26,22,19,19,26,69,28,20,30,52,29,12];var Joshua=[0,18,24,17,24,15,27,26,35,27,43,23,24,33,15,63,10,18,28,51,9,45,34,16,33];var Judges=[0,36,23,31,24,31,40,25,35,57,18,40,15,25,20,20,31,13,31,30,48,25];var Ruth=[0,22,23,18,22];var Isaiah=[0,31,22,26,6,30,13,25,23,20,34,16,6,22,32,9,14,14,7,25,6,17,25,18,23,12,21,13,29,24,33,9,20,24,17,10,22,38,22,8,31,29,25,28,28,25,13,15,22,26,11,23,15,12,17,13,12,21,14,21,22,11,12,19,11,25,24];var Jeremiah=[0,19,37,25,31,31,30,34,23,25,25,23,17,27,22,21,21,27,23,15,18,14,30,40,10,38,24,22,17,32,24,40,44,26,22,19,32,21,28,18,16,18,22,13,30,5,28,7,47,39,46,64,34];var Lamentations=[0,22,22,66,22,22];var Baruch=[0,22,35,38,37,9,72];var Ezekiel=[0,28,10,27,17,17,14,27,18,11,22,25,28,23,23,8,63,24,32,14,44,37,31,49,27,17,21,36,26,21,26,18,32,33,31,15,38,28,23,29,49,26,20,27,31,25,24,23,35];var Daniel=[0,21,49,100,34,30,29,28,27,27,21,45,13,64,42];var Hosea=[0,9,25,5,19,15,11,16,14,17,15,11,15,15,10];var Joel=[0,20,27,5,21];var Amos=[0,15,16,15,13,27,14,17,14,15];var Obadiah=[0,21];var Jonah=[0,16,11,10,11];var Micah=[0,16,13,12,14,14,16,20];var Nachum=[0,14,14,19];var Habakkuk=[0,17,20,19];var Zephaniah=[0,18,15,20];var Haggai=[0,15,23];var Zechariah=[0,17,17,10,14,11,15,14,23,17,12,17,14,9,21];var Malachi=[0,14,17,24];var numverses = {Genesis:Genesis,Exodus:Exodus,Leviticus:Leviticus,Numbers:Numbers,Deuteronomy:Deuteronomy,Joshua:Joshua,Judges:Judges,Ruth:Ruth,"I Samuel":[0,28,36,21,22,12,21,17,22,27,27,15,25,23,52,35,23,58,30,24,42,16,23,28,23,43,25,12,25,11,31,13],"II Samuel":[0,27,32,39,12,25,23,29,18,13,19,27,31,39,33,37,23,29,32,44,26,22,51,39,25],"I Kings":[0,53,46,28,20,32,38,51,66,28,29,43,33,34,31,34,34,24,46,21,43,29,54],"II Kings":[0,18,25,27,44,27,33,20,29,37,36,20,22,25,29,38,20,41,37,37,21,26,20,37,20,30],Isaiah:Isaiah,Jeremiah:Jeremiah,Lamentations:Lamentations,Baruch:Baruch,Ezekiel:Ezekiel,Daniel:Daniel,Hosea:Hosea,Joel:Joel,Amos:Amos,Obadiah:Obadiah,Jonah:Jonah,Micah:Micah,Nachum:Nachum,Habakkuk:Habakkuk,Zephaniah:Zephaniah,Haggai:Haggai,Zechariah:Zechariah,Malachi:Malachi};
@@ -12,23 +10,21 @@ var Genesis=[0,31,25,24,26,32,22,24,22,29,32,32,20,18,24,21,16,27,33,38,18,34,24
12
10
  * @readonly
13
11
  * @const {string[]}
14
12
  */
15
-
16
13
  const BOOK = ['', 'Genesis', 'Exodus', 'Leviticus', 'Numbers', 'Deuteronomy'];
14
+
17
15
  /**
18
16
  * Formats parsha as a string
19
17
  * @param {string[]} parsha
20
18
  * @return {string}
21
19
  */
22
-
23
20
  function parshaToString(parsha) {
24
21
  let s = parsha[0];
25
-
26
22
  if (parsha.length == 2) {
27
23
  s += '-' + parsha[1];
28
24
  }
29
-
30
25
  return s;
31
26
  }
27
+
32
28
  /**
33
29
  * Represents an aliyah
34
30
  * @typedef {Object} Aliyah
@@ -44,10 +40,10 @@ function parshaToString(parsha) {
44
40
  * @param {any} src
45
41
  * @return {any}
46
42
  */
47
-
48
43
  function clone(src) {
49
44
  return JSON.parse(JSON.stringify(src));
50
45
  }
46
+
51
47
  /**
52
48
  * Calculates the number of verses in an aliyah or haftara based on
53
49
  * the `b` (begin verse), `e` (end verse) and `k` (book).
@@ -55,98 +51,85 @@ function clone(src) {
55
51
  * @param {Aliyah} aliyah
56
52
  * @return {number}
57
53
  */
58
-
59
54
  function calculateNumVerses(aliyah) {
60
55
  if (aliyah.v) {
61
56
  return aliyah.v;
62
57
  }
63
-
64
58
  const chapVerseBegin = aliyah.b.split(':');
65
59
  const chapVerseEnd = aliyah.e.split(':');
66
60
  const c1 = parseInt(chapVerseBegin[0], 10);
67
61
  const c2 = parseInt(chapVerseEnd[0], 10);
68
62
  const v1 = parseInt(chapVerseBegin[1], 10);
69
63
  const v2 = parseInt(chapVerseEnd[1], 10);
70
-
71
64
  if (c1 === c2) {
72
65
  aliyah.v = v2 - v1 + 1;
73
66
  } else if (typeof aliyah.k === 'string') {
74
67
  const numv = numverses[aliyah.k];
75
-
76
68
  if (typeof numv !== 'object' || !numv.length) {
77
69
  throw new ReferenceError(`Can't find numverses for ${aliyah.k}`);
78
70
  }
79
-
80
71
  let total = numv[c1] - v1 + 1;
81
-
82
72
  for (let chap = c1 + 1; chap < c2; chap++) {
83
73
  total += numv[chap];
84
74
  }
85
-
86
75
  total += v2;
87
76
  aliyah.v = total;
88
77
  }
89
-
90
78
  return aliyah.v;
91
79
  }
80
+
92
81
  /**
93
82
  * Formats an aliyah object like "Numbers 28:9-28:15"
94
83
  * @param {Aliyah} a aliyah
95
84
  * @return {string}
96
85
  */
97
-
98
86
  function formatAliyahWithBook(a) {
99
87
  return `${a.k} ${a.b}-${a.e}`;
100
88
  }
89
+
101
90
  /**
102
91
  * Formats an aliyah object like "Numbers 28:9-15"
103
92
  * @param {Aliyah} aliyah
104
93
  * @param {boolean} showBook
105
94
  * @return {string}
106
95
  */
107
-
108
96
  function formatAliyahShort(aliyah, showBook) {
109
97
  const begin = aliyah.b;
110
98
  const end0 = aliyah.e;
111
99
  const prefix = showBook ? aliyah.k + ' ' : '';
112
-
113
100
  if (begin === end0) {
114
101
  return `${prefix}${begin}`;
115
102
  }
116
-
117
103
  const cv1 = begin.split(':');
118
104
  const cv2 = end0.split(':');
119
105
  const end = cv1[0] === cv2[0] ? cv2[1] : end0;
120
106
  return `${prefix}${begin}-${end}`;
121
107
  }
108
+
122
109
  /**
123
110
  * Returns the total number of verses in an array of Aliyah (or haftarah) objects
124
111
  * @param {Aliyah|Aliyah[]} aliyot
125
112
  * @return {number}
126
113
  */
127
-
128
114
  function sumVerses(aliyot) {
129
115
  return Array.isArray(aliyot) ? aliyot.reduce((prev, cur) => prev + cur.v, 0) : aliyot.v;
130
116
  }
117
+
131
118
  /**
132
119
  * @private
133
120
  * @param {Aliyah|Aliyah[]} haft
134
121
  * @return {Aliyah|Aliyah[]}
135
122
  */
136
-
137
123
  function cloneHaftara(haft) {
138
124
  if (!haft) {
139
125
  return haft;
140
126
  }
141
-
142
127
  const dest = clone(haft);
143
-
144
128
  if (Array.isArray(dest)) {
145
129
  dest.map(calculateNumVerses);
146
130
  } else {
147
131
  calculateNumVerses(dest);
148
132
  }
149
-
150
133
  return dest;
151
134
  }
152
135
 
@@ -156,39 +139,33 @@ function cloneHaftara(haft) {
156
139
  * @param {string} b
157
140
  * @return {boolean}
158
141
  */
159
-
160
142
  function isChapVerseBefore(a, b) {
161
143
  const cv1 = a.split(':').map(x => +x);
162
144
  const cv2 = b.split(':').map(x => +x);
163
145
  return cv1[0] * 100 + cv1[1] < cv2[0] * 100 + cv2[1];
164
146
  }
147
+
165
148
  /**
166
149
  * Summarizes an `AliyotMap` by collapsing all adjacent aliyot.
167
150
  * Finds any non-overlapping parts (e.g. special 7th aliyah or maftir)
168
151
  * @param {Object<string,Aliyah>} aliyot
169
152
  * @return {Aliyah[]}
170
153
  */
171
-
172
-
173
154
  function makeLeyningParts(aliyot) {
174
155
  const nums = Object.keys(aliyot).filter(x => x.length === 1);
175
156
  let start = aliyot[nums[0]];
176
157
  let end = start;
177
158
  const parts = [];
178
-
179
159
  for (let i = 0; i < nums.length; i++) {
180
160
  const num = nums[i];
181
161
  const aliyah = aliyot[num];
182
-
183
162
  if (i === nums.length - 1 && aliyah.k === end.k && aliyah.e === end.e) {
184
163
  // short-circuit when final aliyah is within the previous (e.g. M inside of 7)
185
164
  continue;
186
165
  }
187
-
188
166
  const prevEndChap = +end.e.split(':')[0];
189
167
  const curStartChap = +aliyah.b.split(':')[0];
190
168
  const sameOrNextChap = curStartChap === prevEndChap || curStartChap === prevEndChap + 1;
191
-
192
169
  if (i !== 0 && (aliyah.k !== start.k || isChapVerseBefore(aliyah.b, start.e) || !sameOrNextChap)) {
193
170
  parts.push({
194
171
  k: start.k,
@@ -197,10 +174,8 @@ function makeLeyningParts(aliyot) {
197
174
  });
198
175
  start = aliyah;
199
176
  }
200
-
201
177
  end = aliyah;
202
178
  }
203
-
204
179
  parts.push({
205
180
  k: start.k,
206
181
  b: start.b,
@@ -208,6 +183,7 @@ function makeLeyningParts(aliyot) {
208
183
  });
209
184
  return parts;
210
185
  }
186
+
211
187
  /**
212
188
  * Returns a string representation of the leyning parts.
213
189
  * Separate verse ranges read from the same book are separated
@@ -217,77 +193,64 @@ function makeLeyningParts(aliyot) {
217
193
  * @param {Aliyah|Aliyah[]} parts
218
194
  * @return {string}
219
195
  */
220
-
221
196
  function makeSummaryFromParts(parts) {
222
197
  if (!Array.isArray(parts)) {
223
198
  parts = [parts];
224
199
  }
225
-
226
200
  let prev = parts[0];
227
201
  let summary = formatAliyahShort(prev, true);
228
-
229
202
  for (let i = 1; i < parts.length; i++) {
230
203
  const part = parts[i];
231
-
232
204
  if (part.k === prev.k) {
233
205
  summary += ', ';
234
206
  } else {
235
207
  summary += `; ${part.k} `;
236
208
  }
237
-
238
209
  summary += formatAliyahShort(part, false);
239
210
  prev = part;
240
211
  }
241
-
242
212
  return summary;
243
213
  }
214
+
244
215
  /**
245
216
  * Makes a summary of the leyning, like "Genesis 6:9-11:32"
246
217
  * @param {Object<string,Aliyah>} aliyot
247
218
  * @return {string}
248
219
  */
249
-
250
220
  function makeLeyningSummary(aliyot) {
251
221
  const parts = makeLeyningParts(aliyot);
252
222
  return makeSummaryFromParts(parts);
253
223
  }
254
224
 
255
- var Purim={fullkriyah:{"1":{p:16,k:2,b:"17:8",e:"17:10"},"2":{p:16,k:2,b:"17:11",e:"17:13"},"3":{p:16,k:2,b:"17:14",e:"17:16"}}};var festivals = {"Pesach I":{haft:{k:"Joshua",b:"5:2",e:"6:1"},fullkriyah:{"1":{p:15,k:2,b:"12:21",e:"12:24"},"2":{p:15,k:2,b:"12:25",e:"12:28"},"3":{p:15,k:2,b:"12:29",e:"12:36"},"4":{p:15,k:2,b:"12:37",e:"12:42"},"5":{p:15,k:2,b:"12:43",e:"12:51"},M:{p:41,k:4,b:"28:16",e:"28:25"}}},"Pesach I (on Shabbat)":{haft:{k:"Joshua",b:"5:2",e:"6:1"},fullkriyah:{"1":{p:15,k:2,b:"12:21",e:"12:24"},"2":{p:15,k:2,b:"12:25",e:"12:28"},"3":{p:15,k:2,b:"12:29",e:"12:32"},"4":{p:15,k:2,b:"12:33",e:"12:36"},"5":{p:15,k:2,b:"12:37",e:"12:42"},"6":{p:15,k:2,b:"12:43",e:"12:47"},"7":{p:15,k:2,b:"12:48",e:"12:51"},M:{p:41,k:4,b:"28:16",e:"28:25"}}},"Pesach II":{haft:[{k:"II Kings",b:"23:1",e:"23:9"},{k:"II Kings",b:"23:21",e:"23:25"}],fullkriyah:{"1":{p:31,k:3,b:"22:26",e:"23:3"},"2":{p:31,k:3,b:"23:4",e:"23:14"},"3":{p:31,k:3,b:"23:15",e:"23:22"},"4":{p:31,k:3,b:"23:23",e:"23:32"},"5":{p:31,k:3,b:"23:33",e:"23:44"},M:{p:41,k:4,b:"28:16",e:"28:25"}}},"Pesach II (CH''M)":{note:"Israel only - according to Vaani T'fillati Siddur Yisraeli",fullkriyah:{"1":{p:31,k:3,b:"22:26",e:"23:8"},"2":{p:31,k:3,b:"23:9",e:"23:14"},"3":{p:31,k:3,b:"23:15",e:"23:44"},"4":{p:41,k:4,b:"28:19",e:"28:25"}}},"Pesach Chol ha-Moed Day 1":{fullkriyah:{"1":{p:15,k:2,b:"13:1",e:"13:4"},"2":{p:15,k:2,b:"13:5",e:"13:10"},"3":{p:15,k:2,b:"13:11",e:"13:16"},"4":{p:41,k:4,b:"28:19",e:"28:25"}}},"Pesach Chol ha-Moed Day 2":{fullkriyah:{"1":{p:18,k:2,b:"22:24",e:"22:26"},"2":{p:18,k:2,b:"22:27",e:"23:5"},"3":{p:18,k:2,b:"23:6",e:"23:19"},"4":{p:41,k:4,b:"28:19",e:"28:25"}}},"Pesach Chol ha-Moed Day 3":{fullkriyah:{"1":{p:21,k:2,b:"34:1",e:"34:10"},"2":{p:21,k:2,b:"34:11",e:"34:17"},"3":{p:21,k:2,b:"34:18",e:"34:26"},"4":{p:41,k:4,b:"28:19",e:"28:25"}}},"Pesach Chol ha-Moed Day 4":{fullkriyah:{"1":{p:36,k:4,b:"9:1",e:"9:5"},"2":{p:36,k:4,b:"9:6",e:"9:8"},"3":{p:36,k:4,b:"9:9",e:"9:14"},"4":{p:41,k:4,b:"28:19",e:"28:25"}}},"Pesach Shabbat Chol ha-Moed":{haft:{k:"Ezekiel",b:"37:1",e:"37:14"},fullkriyah:{"1":{p:21,k:2,b:"33:12",e:"33:16"},"2":{p:21,k:2,b:"33:17",e:"33:19"},"3":{p:21,k:2,b:"33:20",e:"33:23"},"4":{p:21,k:2,b:"34:1",e:"34:3"},"5":{p:21,k:2,b:"34:4",e:"34:10"},"6":{p:21,k:2,b:"34:11",e:"34:17"},"7":{p:21,k:2,b:"34:18",e:"34:26"},M:{p:41,k:4,b:"28:19",e:"28:25"}}},"Pesach VII":{haft:{k:"II Samuel",b:"22:1",e:"22:51"},fullkriyah:{"1":{p:16,k:2,b:"13:17",e:"13:22"},"2":{p:16,k:2,b:"14:1",e:"14:8"},"3":{p:16,k:2,b:"14:9",e:"14:14"},"4":{p:16,k:2,b:"14:15",e:"14:25"},"5":{p:16,k:2,b:"14:26",e:"15:26"},M:{p:41,k:4,b:"28:19",e:"28:25"}}},"Pesach VII (on Shabbat)":{haft:{k:"II Samuel",b:"22:1",e:"22:51"},fullkriyah:{"1":{p:16,k:2,b:"13:17",e:"13:19"},"2":{p:16,k:2,b:"13:20",e:"13:22"},"3":{p:16,k:2,b:"14:1",e:"14:4"},"4":{p:16,k:2,b:"14:5",e:"14:8"},"5":{p:16,k:2,b:"14:9",e:"14:14"},"6":{p:16,k:2,b:"14:15",e:"14:25"},"7":{p:16,k:2,b:"14:26",e:"15:26"},M:{p:41,k:4,b:"28:19",e:"28:25"}}},"Pesach VIII":{haft:{k:"Isaiah",b:"10:32",e:"12:6"},fullkriyah:{"1":{p:47,k:5,b:"15:19",e:"15:23"},"2":{p:47,k:5,b:"16:1",e:"16:3"},"3":{p:47,k:5,b:"16:4",e:"16:8"},"4":{p:47,k:5,b:"16:9",e:"16:12"},"5":{p:47,k:5,b:"16:13",e:"16:17"},M:{p:41,k:4,b:"28:19",e:"28:25"}}},"Pesach VIII (on Shabbat)":{haft:{k:"Isaiah",b:"10:32",e:"12:6"},fullkriyah:{"1":{p:47,k:5,b:"14:22",e:"14:29"},"2":{p:47,k:5,b:"15:1",e:"15:18"},"3":{p:47,k:5,b:"15:19",e:"15:23"},"4":{p:47,k:5,b:"16:1",e:"16:3"},"5":{p:47,k:5,b:"16:4",e:"16:8"},"6":{p:47,k:5,b:"16:9",e:"16:12"},"7":{p:47,k:5,b:"16:13",e:"16:17"},M:{p:41,k:4,b:"28:19",e:"28:25"}}},"Pesach III (CH''M)":{alias:true,il:true,key:"Pesach Chol ha-Moed Day 1"},"Pesach IV (CH''M)":{alias:true,il:true,key:"Pesach Chol ha-Moed Day 2"},"Pesach V (CH''M)":{alias:true,il:true,key:"Pesach Chol ha-Moed Day 3"},"Pesach VI (CH''M)":{alias:true,il:true,key:"Pesach Chol ha-Moed Day 4"},"Shavuot I":{haft:[{k:"Ezekiel",b:"1:1",e:"1:28"},{k:"Ezekiel",b:"3:12",e:"3:12"}],fullkriyah:{"1":{p:17,k:2,b:"19:1",e:"19:6"},"2":{p:17,k:2,b:"19:7",e:"19:13"},"3":{p:17,k:2,b:"19:14",e:"19:19"},"4":{p:17,k:2,b:"19:20",e:"20:14"},"5":{p:17,k:2,b:"20:15",e:"20:23"},M:{p:41,k:4,b:"28:26",e:"28:31"}}},"Shavuot II":{haft:{k:"Habakkuk",b:"3:1",e:"3:19"},fullkriyah:{"1":{p:47,k:5,b:"15:19",e:"15:23"},"2":{p:47,k:5,b:"16:1",e:"16:3"},"3":{p:47,k:5,b:"16:4",e:"16:8"},"4":{p:47,k:5,b:"16:9",e:"16:12"},"5":{p:47,k:5,b:"16:13",e:"16:17"},M:{p:41,k:4,b:"28:26",e:"28:31"}}},"Shavuot II (on Shabbat)":{haft:{k:"Habakkuk",b:"3:1",e:"3:19"},fullkriyah:{"1":{p:47,k:5,b:"14:22",e:"14:29"},"2":{p:47,k:5,b:"15:1",e:"15:18"},"3":{p:47,k:5,b:"15:19",e:"15:23"},"4":{p:47,k:5,b:"16:1",e:"16:3"},"5":{p:47,k:5,b:"16:4",e:"16:8"},"6":{p:47,k:5,b:"16:9",e:"16:12"},"7":{p:47,k:5,b:"16:13",e:"16:17"},M:{p:41,k:4,b:"28:26",e:"28:31"}}},"Fast Day (Morning)":{fullkriyah:{"1":{p:21,k:2,b:"32:11",e:"32:14"},"2":{p:21,k:2,b:"34:1",e:"34:3"},"3":{p:21,k:2,b:"34:4",e:"34:10"}}},"Fast Day (Afternoon)":{haft:{k:"Isaiah",b:"55:6",e:"56:8"},fullkriyah:{"1":{p:21,k:2,b:"32:11",e:"32:14"},"2":{p:21,k:2,b:"34:1",e:"34:3"},"3":{p:21,k:2,b:"34:4",e:"34:10"}}},"Asara B'Tevet":{alias:true,key:"Fast Day (Morning)"},"Ta'anit Bechorot":{alias:true,key:"Fast Day (Morning)"},"Ta'anit Esther":{alias:true,key:"Fast Day (Morning)"},"Tzom Gedaliah":{alias:true,key:"Fast Day (Morning)"},"Tzom Tammuz":{alias:true,key:"Fast Day (Morning)"},"Asara B'Tevet (Mincha)":{alias:true,key:"Fast Day (Afternoon)"},"Ta'anit Bechorot (Mincha)":{alias:true,key:"Fast Day (Afternoon)"},"Ta'anit Esther (Mincha)":{alias:true,key:"Fast Day (Afternoon)"},"Tzom Gedaliah (Mincha)":{alias:true,key:"Fast Day (Afternoon)"},"Tzom Tammuz (Mincha)":{alias:true,key:"Fast Day (Afternoon)"},"Tish'a B'Av":{haft:{k:"Jeremiah",b:"8:13",e:"9:23"},fullkriyah:{"1":{p:45,k:5,b:"4:25",e:"4:29"},"2":{p:45,k:5,b:"4:30",e:"4:35"},"3":{p:45,k:5,b:"4:36",e:"4:40"}}},"Tish'a B'Av (Mincha)":{alias:true,key:"Fast Day (Afternoon)"},"Rosh Hashana I":{haft:{k:"I Samuel",b:"1:1",e:"2:10"},fullkriyah:{"1":{p:4,k:1,b:"21:1",e:"21:4"},"2":{p:4,k:1,b:"21:5",e:"21:12"},"3":{p:4,k:1,b:"21:13",e:"21:21"},"4":{p:4,k:1,b:"21:22",e:"21:27"},"5":{p:4,k:1,b:"21:28",e:"21:34"},M:{p:41,k:4,b:"29:1",e:"29:6"}}},"Rosh Hashana I (on Shabbat)":{haft:{k:"I Samuel",b:"1:1",e:"2:10"},fullkriyah:{"1":{p:4,k:1,b:"21:1",e:"21:4"},"2":{p:4,k:1,b:"21:5",e:"21:8"},"3":{p:4,k:1,b:"21:9",e:"21:12"},"4":{p:4,k:1,b:"21:13",e:"21:17"},"5":{p:4,k:1,b:"21:18",e:"21:21"},"6":{p:4,k:1,b:"21:22",e:"21:27"},"7":{p:4,k:1,b:"21:28",e:"21:34"},M:{p:41,k:4,b:"29:1",e:"29:6"}}},"Rosh Hashana II":{haft:{k:"Jeremiah",b:"31:1",e:"31:19"},fullkriyah:{"1":{p:4,k:1,b:"22:1",e:"22:3"},"2":{p:4,k:1,b:"22:4",e:"22:8"},"3":{p:4,k:1,b:"22:9",e:"22:14"},"4":{p:4,k:1,b:"22:15",e:"22:19"},"5":{p:4,k:1,b:"22:20",e:"22:24"},M:{p:41,k:4,b:"29:1",e:"29:6"}}},"Yom Kippur":{haft:{k:"Isaiah",b:"57:14",e:"58:14"},fullkriyah:{"1":{p:29,k:3,b:"16:1",e:"16:6"},"2":{p:29,k:3,b:"16:7",e:"16:11"},"3":{p:29,k:3,b:"16:12",e:"16:17"},"4":{p:29,k:3,b:"16:18",e:"16:24"},"5":{p:29,k:3,b:"16:25",e:"16:30"},"6":{p:29,k:3,b:"16:31",e:"16:34"},M:{p:41,k:4,b:"29:7",e:"29:11"}}},"Yom Kippur (on Shabbat)":{haft:{k:"Isaiah",b:"57:14",e:"58:14"},fullkriyah:{"1":{p:29,k:3,b:"16:1",e:"16:3"},"2":{p:29,k:3,b:"16:4",e:"16:6"},"3":{p:29,k:3,b:"16:7",e:"16:11"},"4":{p:29,k:3,b:"16:12",e:"16:17"},"5":{p:29,k:3,b:"16:18",e:"16:24"},"6":{p:29,k:3,b:"16:25",e:"16:30"},"7":{p:29,k:3,b:"16:31",e:"16:34"},M:{p:41,k:4,b:"29:7",e:"29:11"}}},"Yom Kippur (Mincha)":{alias:true,key:"Yom Kippur (Mincha, Traditional)"},"Yom Kippur (Mincha, Traditional)":{haft:[{k:"Jonah",b:"1:1",e:"4:11"},{k:"Micah",b:"7:18",e:"7:20"}],fullkriyah:{"1":{p:29,k:3,b:"18:1",e:"18:5"},"2":{p:29,k:3,b:"18:6",e:"18:21"},"3":{p:29,k:3,b:"18:22",e:"18:30"}}},"Yom Kippur (Mincha, Alternate)":{haft:[{k:"Jonah",b:"1:1",e:"4:11"},{k:"Micah",b:"7:18",e:"7:20"}],fullkriyah:{"1":{p:30,k:3,b:"19:1",e:"19:4"},"2":{p:30,k:3,b:"19:5",e:"19:10"},"3":{p:30,k:3,b:"19:11",e:"19:18"}}},"Sukkot I":{haft:{k:"Zechariah",b:"14:1",e:"14:21"},fullkriyah:{"1":{p:31,k:3,b:"22:26",e:"23:3"},"2":{p:31,k:3,b:"23:4",e:"23:14"},"3":{p:31,k:3,b:"23:15",e:"23:22"},"4":{p:31,k:3,b:"23:23",e:"23:32"},"5":{p:31,k:3,b:"23:33",e:"23:44"},M:{p:41,k:4,b:"29:12",e:"29:16"}}},"Sukkot I (on Shabbat)":{haft:{k:"Zechariah",b:"14:1",e:"14:21"},fullkriyah:{"1":{p:31,k:3,b:"22:26",e:"22:33"},"2":{p:31,k:3,b:"23:1",e:"23:3"},"3":{p:31,k:3,b:"23:4",e:"23:8"},"4":{p:31,k:3,b:"23:9",e:"23:14"},"5":{p:31,k:3,b:"23:15",e:"23:22"},"6":{p:31,k:3,b:"23:23",e:"23:32"},"7":{p:31,k:3,b:"23:33",e:"23:44"},M:{p:41,k:4,b:"29:12",e:"29:16"}}},"Sukkot II":{haft:{k:"I Kings",b:"8:2",e:"8:21"},fullkriyah:{"1":{p:31,k:3,b:"22:26",e:"23:3"},"2":{p:31,k:3,b:"23:4",e:"23:14"},"3":{p:31,k:3,b:"23:15",e:"23:22"},"4":{p:31,k:3,b:"23:23",e:"23:32"},"5":{p:31,k:3,b:"23:33",e:"23:44"},M:{p:41,k:4,b:"29:12",e:"29:16"}}},"Sukkot Chol ha-Moed Day 1":{fullkriyah:{"1":{p:41,k:4,b:"29:17",e:"29:19"},"2":{p:41,k:4,b:"29:20",e:"29:22"},"3":{p:41,k:4,b:"29:23",e:"29:25"},"4":{p:41,k:4,b:"29:17",e:"29:22"}}},"Sukkot Chol ha-Moed Day 2":{fullkriyah:{"1":{p:41,k:4,b:"29:20",e:"29:22"},"2":{p:41,k:4,b:"29:23",e:"29:25"},"3":{p:41,k:4,b:"29:26",e:"29:28"},"4":{p:41,k:4,b:"29:20",e:"29:25"}}},"Sukkot Chol ha-Moed Day 3":{fullkriyah:{"1":{p:41,k:4,b:"29:23",e:"29:25"},"2":{p:41,k:4,b:"29:26",e:"29:28"},"3":{p:41,k:4,b:"29:29",e:"29:31"},"4":{p:41,k:4,b:"29:23",e:"29:28"}}},"Sukkot Chol ha-Moed Day 4":{fullkriyah:{"1":{p:41,k:4,b:"29:26",e:"29:28"},"2":{p:41,k:4,b:"29:29",e:"29:31"},"3":{p:41,k:4,b:"29:32",e:"29:34"},"4":{p:41,k:4,b:"29:26",e:"29:31"}}},"Sukkot Chol ha-Moed Day 5":{fullkriyah:{"1":{p:41,k:4,b:"29:29",e:"29:31"},"2":{p:41,k:4,b:"29:32",e:"29:34"},"3":{p:41,k:4,b:"29:35",e:"29:37"},"4":{p:41,k:4,b:"29:29",e:"29:34"}}},"Sukkot Shabbat Chol ha-Moed":{haft:{k:"Ezekiel",b:"38:18",e:"39:16"},fullkriyah:{"1":{p:21,k:2,b:"33:12",e:"33:16"},"2":{p:21,k:2,b:"33:17",e:"33:19"},"3":{p:21,k:2,b:"33:20",e:"33:23"},"4":{p:21,k:2,b:"34:1",e:"34:3"},"5":{p:21,k:2,b:"34:4",e:"34:10"},"6":{p:21,k:2,b:"34:11",e:"34:17"},"7":{p:21,k:2,b:"34:18",e:"34:26"},"M-day1":{p:41,k:4,b:"29:17",e:"29:22"},"M-day2":{p:41,k:4,b:"29:20",e:"29:25"},"M-day3":{p:41,k:4,b:"29:23",e:"29:28"},"M-day4":{p:41,k:4,b:"29:26",e:"29:31"},"M-day5":{p:41,k:4,b:"29:29",e:"29:34"}}},"Sukkot Final Day (Hoshana Raba)":{fullkriyah:{"1":{p:41,k:4,b:"29:26",e:"29:28"},"2":{p:41,k:4,b:"29:29",e:"29:31"},"3":{p:41,k:4,b:"29:32",e:"29:34"},"4":{p:41,k:4,b:"29:29",e:"29:34"}}},"Shmini Atzeret":{haft:{k:"I Kings",b:"8:54",e:"8:66"},fullkriyah:{"1":{p:47,k:5,b:"14:22",e:"14:29"},"2":{p:47,k:5,b:"15:1",e:"15:18"},"3":{p:47,k:5,b:"15:19",e:"16:3"},"4":{p:47,k:5,b:"16:4",e:"16:8"},"5":{p:47,k:5,b:"16:9",e:"16:17"},M:{p:41,k:4,b:"29:35",e:"30:1"}}},"Shmini Atzeret (on Shabbat)":{haft:{k:"I Kings",b:"8:54",e:"8:66"},fullkriyah:{"1":{p:47,k:5,b:"14:22",e:"14:29"},"2":{p:47,k:5,b:"15:1",e:"15:18"},"3":{p:47,k:5,b:"15:19",e:"15:23"},"4":{p:47,k:5,b:"16:1",e:"16:3"},"5":{p:47,k:5,b:"16:4",e:"16:8"},"6":{p:47,k:5,b:"16:9",e:"16:12"},"7":{p:47,k:5,b:"16:13",e:"16:17"},M:{p:41,k:4,b:"29:35",e:"30:1"}}},"Erev Simchat Torah":{fullkriyah:{"1":{p:54,k:5,b:"33:1",e:"33:7"},"2":{p:54,k:5,b:"33:8",e:"33:12"},"3":{p:54,k:5,b:"33:13",e:"33:17"},"4":{p:54,k:5,b:"33:18",e:"33:21"},"5":{p:54,k:5,b:"33:22",e:"33:26"}}},"Simchat Torah":{haft:{k:"Joshua",b:"1:1",e:"1:18"},fullkriyah:{"1":{p:54,k:5,b:"33:1",e:"33:7"},"2":{p:54,k:5,b:"33:8",e:"33:12"},"3":{p:54,k:5,b:"33:13",e:"33:17"},"4":{p:54,k:5,b:"33:18",e:"33:21"},"5":{p:54,k:5,b:"33:22",e:"33:26"},"6":{p:54,k:5,b:"33:27",e:"34:12"},"7":{p:1,k:1,b:"1:1",e:"2:3"},M:{p:41,k:4,b:"29:35",e:"30:1"}}},"Shabbat Rosh Chodesh Chanukah":{haft:{k:"Zechariah",b:"2:14",e:"4:7"},fullkriyah:{"7":{p:41,k:4,b:"28:9",e:"28:15"},M:{p:35,k:4,b:"7:42",e:"7:47"}}},"Chanukah Day 1":{fullkriyah:{"1":{p:35,k:4,b:"7:1",e:"7:11"},"2":{p:35,k:4,b:"7:12",e:"7:14"},"3":{p:35,k:4,b:"7:15",e:"7:17"}},alt:{"1":{p:35,k:4,b:"7:1",e:"7:3"},"2":{p:35,k:4,b:"7:4",e:"7:11"},"3":{p:35,k:4,b:"7:12",e:"7:17"}}},"Chanukah Day 1 (on Shabbat)":{haft:{k:"Zechariah",b:"2:14",e:"4:7"},fullkriyah:{M:{p:35,k:4,b:"7:1",e:"7:17"}}},"Chanukah Day 2":{fullkriyah:{"1":{p:35,k:4,b:"7:18",e:"7:20"},"2":{p:35,k:4,b:"7:21",e:"7:23"},"3":{p:35,k:4,b:"7:24",e:"7:29"}},alt:{"1":{p:35,k:4,b:"7:18",e:"7:20"},"2":{p:35,k:4,b:"7:21",e:"7:23"},"3":{p:35,k:4,b:"7:18",e:"7:23"}}},"Chanukah Day 2 (on Shabbat)":{haft:{k:"Zechariah",b:"2:14",e:"4:7"},fullkriyah:{M:{p:35,k:4,b:"7:18",e:"7:23"}}},"Chanukah Day 3":{fullkriyah:{"1":{p:35,k:4,b:"7:24",e:"7:26"},"2":{p:35,k:4,b:"7:27",e:"7:29"},"3":{p:35,k:4,b:"7:30",e:"7:35"}},alt:{"1":{p:35,k:4,b:"7:24",e:"7:26"},"2":{p:35,k:4,b:"7:27",e:"7:29"},"3":{p:35,k:4,b:"7:24",e:"7:29"}}},"Chanukah Day 3 (on Shabbat)":{haft:{k:"Zechariah",b:"2:14",e:"4:7"},fullkriyah:{M:{p:35,k:4,b:"7:24",e:"7:29"}}},"Chanukah Day 4":{fullkriyah:{"1":{p:35,k:4,b:"7:30",e:"7:32"},"2":{p:35,k:4,b:"7:33",e:"7:35"},"3":{p:35,k:4,b:"7:36",e:"7:41"}},alt:{"1":{p:35,k:4,b:"7:30",e:"7:32"},"2":{p:35,k:4,b:"7:33",e:"7:35"},"3":{p:35,k:4,b:"7:30",e:"7:35"}}},"Chanukah Day 4 (on Shabbat)":{haft:{k:"Zechariah",b:"2:14",e:"4:7"},fullkriyah:{M:{p:35,k:4,b:"7:30",e:"7:35"}}},"Chanukah Day 5":{fullkriyah:{"1":{p:35,k:4,b:"7:36",e:"7:38"},"2":{p:35,k:4,b:"7:39",e:"7:41"},"3":{p:35,k:4,b:"7:42",e:"7:47"}},alt:{"1":{p:35,k:4,b:"7:36",e:"7:38"},"2":{p:35,k:4,b:"7:39",e:"7:41"},"3":{p:35,k:4,b:"7:36",e:"7:41"}}},"Chanukah Day 5 (on Shabbat)":{haft:{k:"Zechariah",b:"2:14",e:"4:7"},fullkriyah:{M:{p:35,k:4,b:"7:36",e:"7:41"}}},"Chanukah Day 6":{fullkriyah:{"1":{p:41,k:4,b:"28:1",e:"28:5"},"2":{p:41,k:4,b:"28:6",e:"28:10"},"3":{p:41,k:4,b:"28:11",e:"28:15"},"4":{p:35,k:4,b:"7:42",e:"7:47"}}},"Chanukah Day 7":{fullkriyah:{"1":{p:35,k:4,b:"7:48",e:"7:50"},"2":{p:35,k:4,b:"7:51",e:"7:53"},"3":{p:35,k:4,b:"7:54",e:"7:59"}},alt:{"1":{p:35,k:4,b:"7:48",e:"7:50"},"2":{p:35,k:4,b:"7:51",e:"7:53"},"3":{p:35,k:4,b:"7:48",e:"7:53"}}},"Chanukah Day 7 (on Rosh Chodesh)":{fullkriyah:{"1":{p:41,k:4,b:"28:1",e:"28:5"},"2":{p:41,k:4,b:"28:6",e:"28:10"},"3":{p:41,k:4,b:"28:11",e:"28:15"},"4":{p:35,k:4,b:"7:48",e:"7:53"}}},"Chanukah Day 7 (on Shabbat)":{haft:{k:"Zechariah",b:"2:14",e:"4:7"},fullkriyah:{M:{p:35,k:4,b:"7:48",e:"7:53"}}},"Chanukah Day 8":{fullkriyah:{"1":{p:35,k:4,b:"7:54",e:"7:56"},"2":{p:35,k:4,b:"7:57",e:"7:59"},"3":{p:35,k:4,b:"7:60",e:"8:4"}}},"Chanukah Day 8 (on Shabbat)":{haft:{k:"I Kings",b:"7:40",e:"7:50"},fullkriyah:{M:{p:35,k:4,b:"7:54",e:"8:4"}}},Purim:Purim,"Shushan Purim":{fullkriyah:{"1":{p:16,k:2,b:"17:8",e:"17:10"},"2":{p:16,k:2,b:"17:11",e:"17:13"},"3":{p:16,k:2,b:"17:14",e:"17:16"}}},"Shushan Purim (on Shabbat)":{note:"Jerusalem & walled cities only: special maftir Exodus 17:8-16, same Haftara as Shabbat Zachor"},"Shabbat HaChodesh":{haft:{k:"Ezekiel",b:"45:16",e:"46:18"},fullkriyah:{M:{p:15,k:2,b:"12:1",e:"12:20"}}},"Shabbat HaChodesh (on Rosh Chodesh)":{haft:{k:"Ezekiel",b:"45:16",e:"46:18"},fullkriyah:{"7":{p:41,k:4,b:"28:9",e:"28:15"},M:{p:15,k:2,b:"12:1",e:"12:20"}}},"Shabbat HaGadol":{haft:{k:"Malachi",b:"3:4",e:"3:24"}},"Shabbat Parah":{haft:{k:"Ezekiel",b:"36:16",e:"36:38"},fullkriyah:{M:{p:39,k:4,b:"19:1",e:"19:22"}}},"Shabbat Shekalim":{haft:{k:"II Kings",b:"12:1",e:"12:17"},fullkriyah:{M:{p:21,k:2,b:"30:11",e:"30:16"}}},"Shabbat Shekalim (on Rosh Chodesh)":{haft:{k:"II Kings",b:"12:1",e:"12:17"},fullkriyah:{"7":{p:41,k:4,b:"28:9",e:"28:15"},M:{p:21,k:2,b:"30:11",e:"30:16"}}},"Shabbat Shuva (with Vayeilech)":{haft:[{k:"Hosea",b:"14:2",e:"14:10"},{k:"Micah",b:"7:18",e:"7:20"}]},"Shabbat Shuva (with Ha'Azinu)":{haft:[{k:"Hosea",b:"14:2",e:"14:10"},{k:"Joel",b:"2:15",e:"2:27"}],seph:[{k:"Hosea",b:"14:2",e:"14:10"},{k:"Micah",b:"7:18",e:"7:20"}]},"Shabbat Shuva":{haft:[{k:"Hosea",b:"14:2",e:"14:10"},{k:"Micah",b:"7:18",e:"7:20"},{k:"Joel",b:"2:15",e:"2:27"}]},"Shabbat Zachor":{haft:{k:"I Samuel",b:"15:2",e:"15:34"},fullkriyah:{M:{p:49,k:5,b:"25:17",e:"25:19"}}},"Pinchas occurring after 17 Tammuz":{haft:{k:"Jeremiah",b:"1:1",e:"2:3"}},"Masei on Shabbat Rosh Chodesh":{haft:[{k:"Jeremiah",b:"2:4",e:"2:28"},{k:"Jeremiah",b:"3:4",e:"3:4"},{k:"Isaiah",b:"66:1",e:"66:1"},{k:"Isaiah",b:"66:23",e:"66:23"}]},"Matot-Masei on Shabbat Rosh Chodesh":{alias:true,key:"Masei on Shabbat Rosh Chodesh"},"Rosh Chodesh":{fullkriyah:{"1":{p:41,k:4,b:"28:1",e:"28:3"},"2":{p:41,k:4,b:"28:3",e:"28:5"},"3":{p:41,k:4,b:"28:6",e:"28:10"},"4":{p:41,k:4,b:"28:11",e:"28:15"}}},"Rosh Chodesh Nisan":{alias:true,key:"Rosh Chodesh"},"Rosh Chodesh Iyyar":{alias:true,key:"Rosh Chodesh"},"Rosh Chodesh Sivan":{alias:true,key:"Rosh Chodesh"},"Rosh Chodesh Tamuz":{alias:true,key:"Rosh Chodesh"},"Rosh Chodesh Av":{alias:true,key:"Rosh Chodesh"},"Rosh Chodesh Elul":{alias:true,key:"Rosh Chodesh"},"Rosh Chodesh Tishrei":{alias:true,key:"Rosh Chodesh"},"Rosh Chodesh Cheshvan":{alias:true,key:"Rosh Chodesh"},"Rosh Chodesh Kislev":{alias:true,key:"Rosh Chodesh"},"Rosh Chodesh Sh'vat":{alias:true,key:"Rosh Chodesh"},"Rosh Chodesh Adar":{alias:true,key:"Rosh Chodesh"},"Rosh Chodesh Adar I":{alias:true,key:"Rosh Chodesh"},"Rosh Chodesh Adar II":{alias:true,key:"Rosh Chodesh"},"Shabbat Rosh Chodesh":{haft:{k:"Isaiah",b:"66:1",e:"66:24"},fullkriyah:{M:{p:41,k:4,b:"28:9",e:"28:15"}}},"Shabbat Machar Chodesh":{haft:{k:"I Samuel",b:"20:18",e:"20:42"}}};
225
+ var Purim={fullkriyah:{"1":{p:16,k:2,b:"17:8",e:"17:10"},"2":{p:16,k:2,b:"17:11",e:"17:13"},"3":{p:16,k:2,b:"17:14",e:"17:16"}}};var festivals = {"Pesach I":{haft:{k:"Joshua",b:"5:2",e:"6:1"},fullkriyah:{"1":{p:15,k:2,b:"12:21",e:"12:24"},"2":{p:15,k:2,b:"12:25",e:"12:28"},"3":{p:15,k:2,b:"12:29",e:"12:36"},"4":{p:15,k:2,b:"12:37",e:"12:42"},"5":{p:15,k:2,b:"12:43",e:"12:51"},M:{p:41,k:4,b:"28:16",e:"28:25"}}},"Pesach I (on Shabbat)":{haft:{k:"Joshua",b:"5:2",e:"6:1"},fullkriyah:{"1":{p:15,k:2,b:"12:21",e:"12:24"},"2":{p:15,k:2,b:"12:25",e:"12:28"},"3":{p:15,k:2,b:"12:29",e:"12:32"},"4":{p:15,k:2,b:"12:33",e:"12:36"},"5":{p:15,k:2,b:"12:37",e:"12:42"},"6":{p:15,k:2,b:"12:43",e:"12:47"},"7":{p:15,k:2,b:"12:48",e:"12:51"},M:{p:41,k:4,b:"28:16",e:"28:25"}}},"Pesach II":{haft:[{k:"II Kings",b:"23:1",e:"23:9"},{k:"II Kings",b:"23:21",e:"23:25"}],fullkriyah:{"1":{p:31,k:3,b:"22:26",e:"23:3"},"2":{p:31,k:3,b:"23:4",e:"23:14"},"3":{p:31,k:3,b:"23:15",e:"23:22"},"4":{p:31,k:3,b:"23:23",e:"23:32"},"5":{p:31,k:3,b:"23:33",e:"23:44"},M:{p:41,k:4,b:"28:16",e:"28:25"}}},"Pesach II (CH''M)":{note:"Israel only - according to Vaani T'fillati Siddur Yisraeli",fullkriyah:{"1":{p:31,k:3,b:"22:26",e:"23:8"},"2":{p:31,k:3,b:"23:9",e:"23:14"},"3":{p:31,k:3,b:"23:15",e:"23:44"},"4":{p:41,k:4,b:"28:19",e:"28:25"}}},"Pesach Chol ha-Moed Day 1":{fullkriyah:{"1":{p:15,k:2,b:"13:1",e:"13:4"},"2":{p:15,k:2,b:"13:5",e:"13:10"},"3":{p:15,k:2,b:"13:11",e:"13:16"},"4":{p:41,k:4,b:"28:19",e:"28:25"}}},"Pesach Chol ha-Moed Day 2":{fullkriyah:{"1":{p:18,k:2,b:"22:24",e:"22:26"},"2":{p:18,k:2,b:"22:27",e:"23:5"},"3":{p:18,k:2,b:"23:6",e:"23:19"},"4":{p:41,k:4,b:"28:19",e:"28:25"}}},"Pesach Chol ha-Moed Day 3":{fullkriyah:{"1":{p:21,k:2,b:"34:1",e:"34:10"},"2":{p:21,k:2,b:"34:11",e:"34:17"},"3":{p:21,k:2,b:"34:18",e:"34:26"},"4":{p:41,k:4,b:"28:19",e:"28:25"}}},"Pesach Chol ha-Moed Day 4":{fullkriyah:{"1":{p:36,k:4,b:"9:1",e:"9:5"},"2":{p:36,k:4,b:"9:6",e:"9:8"},"3":{p:36,k:4,b:"9:9",e:"9:14"},"4":{p:41,k:4,b:"28:19",e:"28:25"}}},"Pesach Shabbat Chol ha-Moed":{haft:{k:"Ezekiel",b:"37:1",e:"37:14"},fullkriyah:{"1":{p:21,k:2,b:"33:12",e:"33:16"},"2":{p:21,k:2,b:"33:17",e:"33:19"},"3":{p:21,k:2,b:"33:20",e:"33:23"},"4":{p:21,k:2,b:"34:1",e:"34:3"},"5":{p:21,k:2,b:"34:4",e:"34:10"},"6":{p:21,k:2,b:"34:11",e:"34:17"},"7":{p:21,k:2,b:"34:18",e:"34:26"},M:{p:41,k:4,b:"28:19",e:"28:25"}}},"Pesach VII":{haft:{k:"II Samuel",b:"22:1",e:"22:51"},fullkriyah:{"1":{p:16,k:2,b:"13:17",e:"13:22"},"2":{p:16,k:2,b:"14:1",e:"14:8"},"3":{p:16,k:2,b:"14:9",e:"14:14"},"4":{p:16,k:2,b:"14:15",e:"14:25"},"5":{p:16,k:2,b:"14:26",e:"15:26"},M:{p:41,k:4,b:"28:19",e:"28:25"}}},"Pesach VII (on Shabbat)":{haft:{k:"II Samuel",b:"22:1",e:"22:51"},fullkriyah:{"1":{p:16,k:2,b:"13:17",e:"13:19"},"2":{p:16,k:2,b:"13:20",e:"13:22"},"3":{p:16,k:2,b:"14:1",e:"14:4"},"4":{p:16,k:2,b:"14:5",e:"14:8"},"5":{p:16,k:2,b:"14:9",e:"14:14"},"6":{p:16,k:2,b:"14:15",e:"14:25"},"7":{p:16,k:2,b:"14:26",e:"15:26"},M:{p:41,k:4,b:"28:19",e:"28:25"}}},"Pesach VIII":{haft:{k:"Isaiah",b:"10:32",e:"12:6"},fullkriyah:{"1":{p:47,k:5,b:"15:19",e:"15:23"},"2":{p:47,k:5,b:"16:1",e:"16:3"},"3":{p:47,k:5,b:"16:4",e:"16:8"},"4":{p:47,k:5,b:"16:9",e:"16:12"},"5":{p:47,k:5,b:"16:13",e:"16:17"},M:{p:41,k:4,b:"28:19",e:"28:25"}}},"Pesach VIII (on Shabbat)":{haft:{k:"Isaiah",b:"10:32",e:"12:6"},fullkriyah:{"1":{p:47,k:5,b:"14:22",e:"14:29"},"2":{p:47,k:5,b:"15:1",e:"15:18"},"3":{p:47,k:5,b:"15:19",e:"15:23"},"4":{p:47,k:5,b:"16:1",e:"16:3"},"5":{p:47,k:5,b:"16:4",e:"16:8"},"6":{p:47,k:5,b:"16:9",e:"16:12"},"7":{p:47,k:5,b:"16:13",e:"16:17"},M:{p:41,k:4,b:"28:19",e:"28:25"}}},"Pesach III (CH''M)":{alias:true,il:true,key:"Pesach Chol ha-Moed Day 1"},"Pesach IV (CH''M)":{alias:true,il:true,key:"Pesach Chol ha-Moed Day 2"},"Pesach V (CH''M)":{alias:true,il:true,key:"Pesach Chol ha-Moed Day 3"},"Pesach VI (CH''M)":{alias:true,il:true,key:"Pesach Chol ha-Moed Day 4"},"Shavuot I":{haft:[{k:"Ezekiel",b:"1:1",e:"1:28"},{k:"Ezekiel",b:"3:12",e:"3:12"}],fullkriyah:{"1":{p:17,k:2,b:"19:1",e:"19:6"},"2":{p:17,k:2,b:"19:7",e:"19:13"},"3":{p:17,k:2,b:"19:14",e:"19:19"},"4":{p:17,k:2,b:"19:20",e:"20:14"},"5":{p:17,k:2,b:"20:15",e:"20:23"},M:{p:41,k:4,b:"28:26",e:"28:31"}}},"Shavuot II":{haft:{k:"Habakkuk",b:"3:1",e:"3:19"},fullkriyah:{"1":{p:47,k:5,b:"15:19",e:"15:23"},"2":{p:47,k:5,b:"16:1",e:"16:3"},"3":{p:47,k:5,b:"16:4",e:"16:8"},"4":{p:47,k:5,b:"16:9",e:"16:12"},"5":{p:47,k:5,b:"16:13",e:"16:17"},M:{p:41,k:4,b:"28:26",e:"28:31"}}},"Shavuot II (on Shabbat)":{haft:{k:"Habakkuk",b:"3:1",e:"3:19"},fullkriyah:{"1":{p:47,k:5,b:"14:22",e:"14:29"},"2":{p:47,k:5,b:"15:1",e:"15:18"},"3":{p:47,k:5,b:"15:19",e:"15:23"},"4":{p:47,k:5,b:"16:1",e:"16:3"},"5":{p:47,k:5,b:"16:4",e:"16:8"},"6":{p:47,k:5,b:"16:9",e:"16:12"},"7":{p:47,k:5,b:"16:13",e:"16:17"},M:{p:41,k:4,b:"28:26",e:"28:31"}}},"Fast Day (Morning)":{fullkriyah:{"1":{p:21,k:2,b:"32:11",e:"32:14"},"2":{p:21,k:2,b:"34:1",e:"34:3"},"3":{p:21,k:2,b:"34:4",e:"34:10"}}},"Fast Day (Afternoon)":{haft:{k:"Isaiah",b:"55:6",e:"56:8"},fullkriyah:{"1":{p:21,k:2,b:"32:11",e:"32:14"},"2":{p:21,k:2,b:"34:1",e:"34:3"},M:{p:21,k:2,b:"34:4",e:"34:10"}}},"Asara B'Tevet":{alias:true,key:"Fast Day (Morning)"},"Ta'anit Bechorot":{alias:true,key:"Fast Day (Morning)"},"Ta'anit Esther":{alias:true,key:"Fast Day (Morning)"},"Tzom Gedaliah":{alias:true,key:"Fast Day (Morning)"},"Tzom Tammuz":{alias:true,key:"Fast Day (Morning)"},"Asara B'Tevet (Mincha)":{alias:true,key:"Fast Day (Afternoon)"},"Ta'anit Bechorot (Mincha)":{alias:true,key:"Fast Day (Afternoon)"},"Ta'anit Esther (Mincha)":{alias:true,key:"Fast Day (Afternoon)"},"Tzom Gedaliah (Mincha)":{alias:true,key:"Fast Day (Afternoon)"},"Tzom Tammuz (Mincha)":{alias:true,key:"Fast Day (Afternoon)"},"Tish'a B'Av":{haft:{k:"Jeremiah",b:"8:13",e:"9:23"},fullkriyah:{"1":{p:45,k:5,b:"4:25",e:"4:29"},"2":{p:45,k:5,b:"4:30",e:"4:35"},"3":{p:45,k:5,b:"4:36",e:"4:40"}}},"Tish'a B'Av (Mincha)":{alias:true,key:"Fast Day (Afternoon)"},"Rosh Hashana I":{haft:{k:"I Samuel",b:"1:1",e:"2:10"},fullkriyah:{"1":{p:4,k:1,b:"21:1",e:"21:4"},"2":{p:4,k:1,b:"21:5",e:"21:12"},"3":{p:4,k:1,b:"21:13",e:"21:21"},"4":{p:4,k:1,b:"21:22",e:"21:27"},"5":{p:4,k:1,b:"21:28",e:"21:34"},M:{p:41,k:4,b:"29:1",e:"29:6"}}},"Rosh Hashana I (on Shabbat)":{haft:{k:"I Samuel",b:"1:1",e:"2:10"},fullkriyah:{"1":{p:4,k:1,b:"21:1",e:"21:4"},"2":{p:4,k:1,b:"21:5",e:"21:8"},"3":{p:4,k:1,b:"21:9",e:"21:12"},"4":{p:4,k:1,b:"21:13",e:"21:17"},"5":{p:4,k:1,b:"21:18",e:"21:21"},"6":{p:4,k:1,b:"21:22",e:"21:27"},"7":{p:4,k:1,b:"21:28",e:"21:34"},M:{p:41,k:4,b:"29:1",e:"29:6"}}},"Rosh Hashana II":{haft:{k:"Jeremiah",b:"31:1",e:"31:19"},fullkriyah:{"1":{p:4,k:1,b:"22:1",e:"22:3"},"2":{p:4,k:1,b:"22:4",e:"22:8"},"3":{p:4,k:1,b:"22:9",e:"22:14"},"4":{p:4,k:1,b:"22:15",e:"22:19"},"5":{p:4,k:1,b:"22:20",e:"22:24"},M:{p:41,k:4,b:"29:1",e:"29:6"}}},"Yom Kippur":{haft:{k:"Isaiah",b:"57:14",e:"58:14"},fullkriyah:{"1":{p:29,k:3,b:"16:1",e:"16:6"},"2":{p:29,k:3,b:"16:7",e:"16:11"},"3":{p:29,k:3,b:"16:12",e:"16:17"},"4":{p:29,k:3,b:"16:18",e:"16:24"},"5":{p:29,k:3,b:"16:25",e:"16:30"},"6":{p:29,k:3,b:"16:31",e:"16:34"},M:{p:41,k:4,b:"29:7",e:"29:11"}}},"Yom Kippur (on Shabbat)":{haft:{k:"Isaiah",b:"57:14",e:"58:14"},fullkriyah:{"1":{p:29,k:3,b:"16:1",e:"16:3"},"2":{p:29,k:3,b:"16:4",e:"16:6"},"3":{p:29,k:3,b:"16:7",e:"16:11"},"4":{p:29,k:3,b:"16:12",e:"16:17"},"5":{p:29,k:3,b:"16:18",e:"16:24"},"6":{p:29,k:3,b:"16:25",e:"16:30"},"7":{p:29,k:3,b:"16:31",e:"16:34"},M:{p:41,k:4,b:"29:7",e:"29:11"}}},"Yom Kippur (Mincha)":{alias:true,key:"Yom Kippur (Mincha, Traditional)"},"Yom Kippur (Mincha, Traditional)":{haft:[{k:"Jonah",b:"1:1",e:"4:11"},{k:"Micah",b:"7:18",e:"7:20"}],fullkriyah:{"1":{p:29,k:3,b:"18:1",e:"18:5"},"2":{p:29,k:3,b:"18:6",e:"18:21"},M:{p:29,k:3,b:"18:22",e:"18:30"}}},"Yom Kippur (Mincha, Alternate)":{haft:[{k:"Jonah",b:"1:1",e:"4:11"},{k:"Micah",b:"7:18",e:"7:20"}],fullkriyah:{"1":{p:30,k:3,b:"19:1",e:"19:4"},"2":{p:30,k:3,b:"19:5",e:"19:10"},M:{p:30,k:3,b:"19:11",e:"19:18"}}},"Sukkot I":{haft:{k:"Zechariah",b:"14:1",e:"14:21"},fullkriyah:{"1":{p:31,k:3,b:"22:26",e:"23:3"},"2":{p:31,k:3,b:"23:4",e:"23:14"},"3":{p:31,k:3,b:"23:15",e:"23:22"},"4":{p:31,k:3,b:"23:23",e:"23:32"},"5":{p:31,k:3,b:"23:33",e:"23:44"},M:{p:41,k:4,b:"29:12",e:"29:16"}}},"Sukkot I (on Shabbat)":{haft:{k:"Zechariah",b:"14:1",e:"14:21"},fullkriyah:{"1":{p:31,k:3,b:"22:26",e:"22:33"},"2":{p:31,k:3,b:"23:1",e:"23:3"},"3":{p:31,k:3,b:"23:4",e:"23:8"},"4":{p:31,k:3,b:"23:9",e:"23:14"},"5":{p:31,k:3,b:"23:15",e:"23:22"},"6":{p:31,k:3,b:"23:23",e:"23:32"},"7":{p:31,k:3,b:"23:33",e:"23:44"},M:{p:41,k:4,b:"29:12",e:"29:16"}}},"Sukkot II":{haft:{k:"I Kings",b:"8:2",e:"8:21"},fullkriyah:{"1":{p:31,k:3,b:"22:26",e:"23:3"},"2":{p:31,k:3,b:"23:4",e:"23:14"},"3":{p:31,k:3,b:"23:15",e:"23:22"},"4":{p:31,k:3,b:"23:23",e:"23:32"},"5":{p:31,k:3,b:"23:33",e:"23:44"},M:{p:41,k:4,b:"29:12",e:"29:16"}}},"Sukkot Chol ha-Moed Day 1":{fullkriyah:{"1":{p:41,k:4,b:"29:17",e:"29:19"},"2":{p:41,k:4,b:"29:20",e:"29:22"},"3":{p:41,k:4,b:"29:23",e:"29:25"},"4":{p:41,k:4,b:"29:17",e:"29:22"}}},"Sukkot Chol ha-Moed Day 2":{fullkriyah:{"1":{p:41,k:4,b:"29:20",e:"29:22"},"2":{p:41,k:4,b:"29:23",e:"29:25"},"3":{p:41,k:4,b:"29:26",e:"29:28"},"4":{p:41,k:4,b:"29:20",e:"29:25"}}},"Sukkot Chol ha-Moed Day 3":{fullkriyah:{"1":{p:41,k:4,b:"29:23",e:"29:25"},"2":{p:41,k:4,b:"29:26",e:"29:28"},"3":{p:41,k:4,b:"29:29",e:"29:31"},"4":{p:41,k:4,b:"29:23",e:"29:28"}}},"Sukkot Chol ha-Moed Day 4":{fullkriyah:{"1":{p:41,k:4,b:"29:26",e:"29:28"},"2":{p:41,k:4,b:"29:29",e:"29:31"},"3":{p:41,k:4,b:"29:32",e:"29:34"},"4":{p:41,k:4,b:"29:26",e:"29:31"}}},"Sukkot Chol ha-Moed Day 5":{fullkriyah:{"1":{p:41,k:4,b:"29:29",e:"29:31"},"2":{p:41,k:4,b:"29:32",e:"29:34"},"3":{p:41,k:4,b:"29:35",e:"29:37"},"4":{p:41,k:4,b:"29:29",e:"29:34"}}},"Sukkot Shabbat Chol ha-Moed":{haft:{k:"Ezekiel",b:"38:18",e:"39:16"},fullkriyah:{"1":{p:21,k:2,b:"33:12",e:"33:16"},"2":{p:21,k:2,b:"33:17",e:"33:19"},"3":{p:21,k:2,b:"33:20",e:"33:23"},"4":{p:21,k:2,b:"34:1",e:"34:3"},"5":{p:21,k:2,b:"34:4",e:"34:10"},"6":{p:21,k:2,b:"34:11",e:"34:17"},"7":{p:21,k:2,b:"34:18",e:"34:26"},"M-day1":{p:41,k:4,b:"29:17",e:"29:22"},"M-day2":{p:41,k:4,b:"29:20",e:"29:25"},"M-day3":{p:41,k:4,b:"29:23",e:"29:28"},"M-day4":{p:41,k:4,b:"29:26",e:"29:31"},"M-day5":{p:41,k:4,b:"29:29",e:"29:34"}}},"Sukkot Final Day (Hoshana Raba)":{fullkriyah:{"1":{p:41,k:4,b:"29:26",e:"29:28"},"2":{p:41,k:4,b:"29:29",e:"29:31"},"3":{p:41,k:4,b:"29:32",e:"29:34"},"4":{p:41,k:4,b:"29:29",e:"29:34"}}},"Shmini Atzeret":{haft:{k:"I Kings",b:"8:54",e:"8:66"},fullkriyah:{"1":{p:47,k:5,b:"14:22",e:"14:29"},"2":{p:47,k:5,b:"15:1",e:"15:18"},"3":{p:47,k:5,b:"15:19",e:"16:3"},"4":{p:47,k:5,b:"16:4",e:"16:8"},"5":{p:47,k:5,b:"16:9",e:"16:17"},M:{p:41,k:4,b:"29:35",e:"30:1"}}},"Shmini Atzeret (on Shabbat)":{haft:{k:"I Kings",b:"8:54",e:"8:66"},fullkriyah:{"1":{p:47,k:5,b:"14:22",e:"14:29"},"2":{p:47,k:5,b:"15:1",e:"15:18"},"3":{p:47,k:5,b:"15:19",e:"15:23"},"4":{p:47,k:5,b:"16:1",e:"16:3"},"5":{p:47,k:5,b:"16:4",e:"16:8"},"6":{p:47,k:5,b:"16:9",e:"16:12"},"7":{p:47,k:5,b:"16:13",e:"16:17"},M:{p:41,k:4,b:"29:35",e:"30:1"}}},"Erev Simchat Torah":{fullkriyah:{"1":{p:54,k:5,b:"33:1",e:"33:7"},"2":{p:54,k:5,b:"33:8",e:"33:12"},"3":{p:54,k:5,b:"33:13",e:"33:17"},"4":{p:54,k:5,b:"33:18",e:"33:21"},"5":{p:54,k:5,b:"33:22",e:"33:26"}}},"Simchat Torah":{haft:{k:"Joshua",b:"1:1",e:"1:18"},fullkriyah:{"1":{p:54,k:5,b:"33:1",e:"33:7"},"2":{p:54,k:5,b:"33:8",e:"33:12"},"3":{p:54,k:5,b:"33:13",e:"33:17"},"4":{p:54,k:5,b:"33:18",e:"33:21"},"5":{p:54,k:5,b:"33:22",e:"33:26"},"6":{p:54,k:5,b:"33:27",e:"34:12"},"7":{p:1,k:1,b:"1:1",e:"2:3"},M:{p:41,k:4,b:"29:35",e:"30:1"}}},"Shabbat Rosh Chodesh Chanukah":{haft:{k:"Zechariah",b:"2:14",e:"4:7"},fullkriyah:{"7":{p:41,k:4,b:"28:9",e:"28:15"},M:{p:35,k:4,b:"7:42",e:"7:47"}}},"Chanukah Day 1":{fullkriyah:{"1":{p:35,k:4,b:"7:1",e:"7:11"},"2":{p:35,k:4,b:"7:12",e:"7:14"},"3":{p:35,k:4,b:"7:15",e:"7:17"}},alt:{"1":{p:35,k:4,b:"7:1",e:"7:3"},"2":{p:35,k:4,b:"7:4",e:"7:11"},"3":{p:35,k:4,b:"7:12",e:"7:17"}}},"Chanukah Day 1 (on Shabbat)":{haft:{k:"Zechariah",b:"2:14",e:"4:7"},fullkriyah:{M:{p:35,k:4,b:"7:1",e:"7:17"}}},"Chanukah Day 2":{fullkriyah:{"1":{p:35,k:4,b:"7:18",e:"7:20"},"2":{p:35,k:4,b:"7:21",e:"7:23"},"3":{p:35,k:4,b:"7:24",e:"7:29"}},alt:{"1":{p:35,k:4,b:"7:18",e:"7:20"},"2":{p:35,k:4,b:"7:21",e:"7:23"},"3":{p:35,k:4,b:"7:18",e:"7:23"}}},"Chanukah Day 2 (on Shabbat)":{haft:{k:"Zechariah",b:"2:14",e:"4:7"},fullkriyah:{M:{p:35,k:4,b:"7:18",e:"7:23"}}},"Chanukah Day 3":{fullkriyah:{"1":{p:35,k:4,b:"7:24",e:"7:26"},"2":{p:35,k:4,b:"7:27",e:"7:29"},"3":{p:35,k:4,b:"7:30",e:"7:35"}},alt:{"1":{p:35,k:4,b:"7:24",e:"7:26"},"2":{p:35,k:4,b:"7:27",e:"7:29"},"3":{p:35,k:4,b:"7:24",e:"7:29"}}},"Chanukah Day 3 (on Shabbat)":{haft:{k:"Zechariah",b:"2:14",e:"4:7"},fullkriyah:{M:{p:35,k:4,b:"7:24",e:"7:29"}}},"Chanukah Day 4":{fullkriyah:{"1":{p:35,k:4,b:"7:30",e:"7:32"},"2":{p:35,k:4,b:"7:33",e:"7:35"},"3":{p:35,k:4,b:"7:36",e:"7:41"}},alt:{"1":{p:35,k:4,b:"7:30",e:"7:32"},"2":{p:35,k:4,b:"7:33",e:"7:35"},"3":{p:35,k:4,b:"7:30",e:"7:35"}}},"Chanukah Day 4 (on Shabbat)":{haft:{k:"Zechariah",b:"2:14",e:"4:7"},fullkriyah:{M:{p:35,k:4,b:"7:30",e:"7:35"}}},"Chanukah Day 5":{fullkriyah:{"1":{p:35,k:4,b:"7:36",e:"7:38"},"2":{p:35,k:4,b:"7:39",e:"7:41"},"3":{p:35,k:4,b:"7:42",e:"7:47"}},alt:{"1":{p:35,k:4,b:"7:36",e:"7:38"},"2":{p:35,k:4,b:"7:39",e:"7:41"},"3":{p:35,k:4,b:"7:36",e:"7:41"}}},"Chanukah Day 5 (on Shabbat)":{haft:{k:"Zechariah",b:"2:14",e:"4:7"},fullkriyah:{M:{p:35,k:4,b:"7:36",e:"7:41"}}},"Chanukah Day 6":{fullkriyah:{"1":{p:41,k:4,b:"28:1",e:"28:5"},"2":{p:41,k:4,b:"28:6",e:"28:10"},"3":{p:41,k:4,b:"28:11",e:"28:15"},"4":{p:35,k:4,b:"7:42",e:"7:47"}}},"Chanukah Day 7":{fullkriyah:{"1":{p:35,k:4,b:"7:48",e:"7:50"},"2":{p:35,k:4,b:"7:51",e:"7:53"},"3":{p:35,k:4,b:"7:54",e:"7:59"}},alt:{"1":{p:35,k:4,b:"7:48",e:"7:50"},"2":{p:35,k:4,b:"7:51",e:"7:53"},"3":{p:35,k:4,b:"7:48",e:"7:53"}}},"Chanukah Day 7 (on Rosh Chodesh)":{fullkriyah:{"1":{p:41,k:4,b:"28:1",e:"28:5"},"2":{p:41,k:4,b:"28:6",e:"28:10"},"3":{p:41,k:4,b:"28:11",e:"28:15"},"4":{p:35,k:4,b:"7:48",e:"7:53"}}},"Chanukah Day 7 (on Shabbat)":{haft:{k:"Zechariah",b:"2:14",e:"4:7"},fullkriyah:{M:{p:35,k:4,b:"7:48",e:"7:53"}}},"Chanukah Day 8":{fullkriyah:{"1":{p:35,k:4,b:"7:54",e:"7:56"},"2":{p:35,k:4,b:"7:57",e:"7:59"},"3":{p:35,k:4,b:"7:60",e:"8:4"}}},"Chanukah Day 8 (on Shabbat)":{haft:{k:"I Kings",b:"7:40",e:"7:50"},fullkriyah:{M:{p:35,k:4,b:"7:54",e:"8:4"}}},Purim:Purim,"Shushan Purim":{fullkriyah:{"1":{p:16,k:2,b:"17:8",e:"17:10"},"2":{p:16,k:2,b:"17:11",e:"17:13"},"3":{p:16,k:2,b:"17:14",e:"17:16"}}},"Shushan Purim (on Shabbat)":{note:"Jerusalem & walled cities only: special maftir Exodus 17:8-16, same Haftara as Shabbat Zachor"},"Shabbat HaChodesh":{haft:{k:"Ezekiel",b:"45:16",e:"46:18"},fullkriyah:{M:{p:15,k:2,b:"12:1",e:"12:20"}}},"Shabbat HaChodesh (on Rosh Chodesh)":{haft:{k:"Ezekiel",b:"45:16",e:"46:18"},fullkriyah:{"7":{p:41,k:4,b:"28:9",e:"28:15"},M:{p:15,k:2,b:"12:1",e:"12:20"}}},"Shabbat HaGadol":{haft:{k:"Malachi",b:"3:4",e:"3:24"}},"Shabbat Parah":{haft:{k:"Ezekiel",b:"36:16",e:"36:38"},fullkriyah:{M:{p:39,k:4,b:"19:1",e:"19:22"}}},"Shabbat Shekalim":{haft:{k:"II Kings",b:"12:1",e:"12:17"},fullkriyah:{M:{p:21,k:2,b:"30:11",e:"30:16"}}},"Shabbat Shekalim (on Rosh Chodesh)":{haft:{k:"II Kings",b:"12:1",e:"12:17"},fullkriyah:{"7":{p:41,k:4,b:"28:9",e:"28:15"},M:{p:21,k:2,b:"30:11",e:"30:16"}}},"Shabbat Shuva (with Vayeilech)":{haft:[{k:"Hosea",b:"14:2",e:"14:10"},{k:"Micah",b:"7:18",e:"7:20"}]},"Shabbat Shuva (with Ha'Azinu)":{haft:[{k:"Hosea",b:"14:2",e:"14:10"},{k:"Joel",b:"2:15",e:"2:27"}],seph:[{k:"Hosea",b:"14:2",e:"14:10"},{k:"Micah",b:"7:18",e:"7:20"}]},"Shabbat Shuva":{haft:[{k:"Hosea",b:"14:2",e:"14:10"},{k:"Micah",b:"7:18",e:"7:20"},{k:"Joel",b:"2:15",e:"2:27"}]},"Shabbat Zachor":{haft:{k:"I Samuel",b:"15:2",e:"15:34"},fullkriyah:{M:{p:49,k:5,b:"25:17",e:"25:19"}}},"Pinchas occurring after 17 Tammuz":{haft:{k:"Jeremiah",b:"1:1",e:"2:3"}},"Masei on Shabbat Rosh Chodesh":{haft:[{k:"Jeremiah",b:"2:4",e:"2:28"},{k:"Jeremiah",b:"3:4",e:"3:4"},{k:"Isaiah",b:"66:1",e:"66:1"},{k:"Isaiah",b:"66:23",e:"66:23"}]},"Matot-Masei on Shabbat Rosh Chodesh":{alias:true,key:"Masei on Shabbat Rosh Chodesh"},"Rosh Chodesh":{fullkriyah:{"1":{p:41,k:4,b:"28:1",e:"28:3"},"2":{p:41,k:4,b:"28:3",e:"28:5"},"3":{p:41,k:4,b:"28:6",e:"28:10"},"4":{p:41,k:4,b:"28:11",e:"28:15"}}},"Rosh Chodesh Nisan":{alias:true,key:"Rosh Chodesh"},"Rosh Chodesh Iyyar":{alias:true,key:"Rosh Chodesh"},"Rosh Chodesh Sivan":{alias:true,key:"Rosh Chodesh"},"Rosh Chodesh Tamuz":{alias:true,key:"Rosh Chodesh"},"Rosh Chodesh Av":{alias:true,key:"Rosh Chodesh"},"Rosh Chodesh Elul":{alias:true,key:"Rosh Chodesh"},"Rosh Chodesh Tishrei":{alias:true,key:"Rosh Chodesh"},"Rosh Chodesh Cheshvan":{alias:true,key:"Rosh Chodesh"},"Rosh Chodesh Kislev":{alias:true,key:"Rosh Chodesh"},"Rosh Chodesh Sh'vat":{alias:true,key:"Rosh Chodesh"},"Rosh Chodesh Adar":{alias:true,key:"Rosh Chodesh"},"Rosh Chodesh Adar I":{alias:true,key:"Rosh Chodesh"},"Rosh Chodesh Adar II":{alias:true,key:"Rosh Chodesh"},"Shabbat Rosh Chodesh":{haft:{k:"Isaiah",b:"66:1",e:"66:24"},fullkriyah:{M:{p:41,k:4,b:"28:9",e:"28:15"}}},"Shabbat Machar Chodesh":{haft:{k:"I Samuel",b:"20:18",e:"20:42"}}};
256
226
 
257
227
  /**
258
228
  * Is there a special festival Torah Reading for `holiday`?
259
229
  * @param {string} holiday
260
230
  * @return {boolean}
261
231
  */
262
-
263
232
  function hasFestival(holiday) {
264
233
  return typeof festivals[holiday] === 'object';
265
234
  }
235
+
266
236
  /**
267
237
  * Returns the raw metadata for festival reading for `holiday`
268
238
  * @param {string} holiday
269
239
  * @return {any}
270
240
  */
271
-
272
241
  function lookupFestival(holiday) {
273
242
  let src = festivals[holiday];
274
-
275
243
  if (typeof src === 'undefined') {
276
244
  return undefined;
277
245
  }
278
-
279
246
  if (src.alias) {
280
247
  const tmp = festivals[src.key];
281
-
282
248
  if (typeof tmp === 'undefined') {
283
249
  throw new Error(`Leyning alias ${holiday} => ${src.key} not found`);
284
250
  }
285
-
286
251
  src = tmp;
287
252
  }
288
-
289
253
  const result = src.fullkriyah ? clone(src) : src;
290
-
291
254
  if (result.fullkriyah) {
292
255
  Object.values(result.fullkriyah).forEach(aliyah => {
293
256
  if (typeof aliyah.k === 'number') {
@@ -295,32 +258,27 @@ function lookupFestival(holiday) {
295
258
  }
296
259
  });
297
260
  }
298
-
299
261
  return result;
300
262
  }
301
263
 
302
- const HOLIDAY_IGNORE_MASK = core.flags.DAF_YOMI | core.flags.OMER_COUNT | core.flags.SHABBAT_MEVARCHIM | core.flags.MOLAD | core.flags.USER_EVENT | core.flags.HEBREW_DATE | core.flags.MISHNA_YOMI | core.flags.MODERN_HOLIDAY;
264
+ const HOLIDAY_IGNORE_MASK = core.flags.DAF_YOMI | core.flags.OMER_COUNT | core.flags.SHABBAT_MEVARCHIM | core.flags.MOLAD | core.flags.USER_EVENT | core.flags.HEBREW_DATE | core.flags.MISHNA_YOMI | core.flags.MODERN_HOLIDAY | core.flags.YERUSHALMI_YOMI;
265
+
303
266
  /**
304
267
  * Based on the event date, type and title, finds the relevant leyning key
305
268
  * @param {Event} ev event
306
269
  * @param {boolean} [il] true if Israel holiday scheme
307
270
  * @return {string} key to look up in holiday-reading.json
308
271
  */
309
-
310
272
  function getLeyningKeyForEvent(ev, il = false) {
311
273
  const mask = ev.getFlags();
312
-
313
274
  if (mask & HOLIDAY_IGNORE_MASK) {
314
275
  return undefined;
315
- } // Skip all Erevs except for Simchat Torah
316
-
317
-
276
+ }
277
+ // Skip all Erevs except for Simchat Torah
318
278
  const desc = ev.getDesc();
319
-
320
279
  if (mask & core.flags.EREV && desc !== 'Erev Simchat Torah') {
321
280
  return undefined;
322
281
  }
323
-
324
282
  const hd = ev.getDate();
325
283
  const day = hd.getDate();
326
284
  const dow = hd.abs() % 7;
@@ -329,15 +287,12 @@ function getLeyningKeyForEvent(ev, il = false) {
329
287
  const isRoshChodesh = day == 1 || day == 30;
330
288
  const holiday = ev.basename();
331
289
  const isPesach = holiday === 'Pesach';
332
-
333
290
  if (il && isPesach) {
334
291
  if (isShabbat) {
335
292
  return day === 15 || day === 21 ? desc + ' (on Shabbat)' : 'Pesach Shabbat Chol ha-Moed';
336
293
  }
337
-
338
294
  return desc;
339
295
  }
340
-
341
296
  if (day == 1 && month === core.months.TISHREI) {
342
297
  return isShabbat ? 'Rosh Hashana I (on Shabbat)' : 'Rosh Hashana I';
343
298
  } else if (ev.cholHaMoedDay) {
@@ -346,12 +301,10 @@ function getLeyningKeyForEvent(ev, il = false) {
346
301
  return holiday + ' Shabbat Chol ha-Moed';
347
302
  } else if (desc == 'Sukkot VII (Hoshana Raba)') {
348
303
  return 'Sukkot Final Day (Hoshana Raba)';
349
- } // If Shabbat falls on the third day of Chol ha-Moed Pesach,
304
+ }
305
+ // If Shabbat falls on the third day of Chol ha-Moed Pesach,
350
306
  // the readings for the third, fourth, and fifth days are moved ahead
351
-
352
-
353
307
  let cholHaMoedDay = ev.cholHaMoedDay;
354
-
355
308
  if (isPesach && cholHaMoedDay >= 3) {
356
309
  if (dow == 0 && cholHaMoedDay == 4) {
357
310
  cholHaMoedDay = 3;
@@ -359,7 +312,6 @@ function getLeyningKeyForEvent(ev, il = false) {
359
312
  cholHaMoedDay = 4;
360
313
  }
361
314
  }
362
-
363
315
  return `${holiday} Chol ha-Moed Day ${cholHaMoedDay}`;
364
316
  } else if (ev.chanukahDay) {
365
317
  if (isShabbat && isRoshChodesh) {
@@ -372,54 +324,42 @@ function getLeyningKeyForEvent(ev, il = false) {
372
324
  return `Chanukah Day ${ev.chanukahDay}`;
373
325
  }
374
326
  }
375
-
376
327
  if (isRoshChodesh && (desc == 'Shabbat HaChodesh' || desc == 'Shabbat Shekalim')) {
377
328
  return desc + ' (on Rosh Chodesh)';
378
329
  }
379
-
380
330
  if (desc == 'Shavuot') {
381
331
  return 'Shavuot I';
382
332
  } else if (il && desc == 'Shmini Atzeret') {
383
333
  return 'Simchat Torah';
384
334
  }
385
-
386
335
  if (isShabbat && 'Shabbat' != desc.substring(0, 7)) {
387
336
  if (isRoshChodesh) {
388
337
  if (desc === 'Rosh Chodesh Tevet') {
389
338
  return 'Shabbat Rosh Chodesh Chanukah';
390
339
  }
391
-
392
340
  return 'Shabbat Rosh Chodesh';
393
341
  }
394
-
395
342
  const desc2 = desc + ' (on Shabbat)';
396
-
397
343
  if (hasFestival(desc2)) {
398
344
  return desc2;
399
345
  }
400
346
  }
401
-
402
347
  if (hasFestival(desc)) {
403
348
  return desc;
404
349
  }
405
-
406
350
  if (isShabbat) {
407
351
  const tommorow = hd.next().getDate();
408
-
409
352
  if (tommorow === 30 || tommorow === 1) {
410
353
  return 'Shabbat Machar Chodesh';
411
354
  }
412
355
  }
413
-
414
356
  if (desc === 'Rosh Hashana LaBehemot') {
415
357
  return undefined;
416
358
  }
417
-
418
359
  if (desc === 'Rosh Chodesh Tevet') {
419
360
  if (isShabbat) {
420
361
  return 'Shabbat Rosh Chodesh Chanukah';
421
362
  }
422
-
423
363
  if (day === 30 || core.HDate.shortKislev(hd.getFullYear())) {
424
364
  return 'Chanukah Day 6'; // 30th of Kislev or 1st of Tevet
425
365
  } else {
@@ -430,11 +370,9 @@ function getLeyningKeyForEvent(ev, il = false) {
430
370
  if (isRoshChodesh) {
431
371
  return desc;
432
372
  }
433
-
434
373
  if (desc === 'Tish\'a B\'Av (observed)') {
435
374
  return 'Tish\'a B\'Av';
436
375
  }
437
-
438
376
  return undefined;
439
377
  }
440
378
 
@@ -442,45 +380,40 @@ function getLeyningKeyForEvent(ev, il = false) {
442
380
  * @private
443
381
  * @param {Object<string,Aliyah>} aliyot
444
382
  */
445
-
446
383
  function aliyotCombine67(aliyot) {
447
384
  const a6 = clone(aliyot['6']);
448
385
  const a7 = aliyot['7'];
449
-
450
386
  if (a6.k !== a7.k) {
451
387
  throw new Error('Impossible to combine aliyot 6 & 7: ' + JSON.stringify(aliyot));
452
388
  }
453
-
454
389
  delete aliyot['7'];
455
390
  aliyot['6'] = {
456
391
  k: a6.k,
457
392
  b: a6.b,
458
393
  e: a7.e
459
394
  };
460
-
461
395
  if (a6.v && a7.v) {
462
396
  aliyot['6'].v = a6.v + a7.v;
463
397
  }
464
398
  }
399
+
465
400
  /**
466
401
  * @private
467
402
  * @param {Object<string,Aliyah>} aliyot
468
403
  * @param {Object<string,Aliyah>} special
469
404
  */
470
-
471
-
472
405
  function mergeAliyotWithSpecial(aliyot, special) {
473
406
  if (special['7']) {
474
407
  aliyotCombine67(aliyot);
475
408
  aliyot['7'] = clone(special['7']);
476
409
  calculateNumVerses(aliyot['7']);
477
410
  }
478
-
479
411
  if (special['M']) {
480
412
  aliyot['M'] = clone(special['M']);
481
413
  calculateNumVerses(aliyot['M']);
482
414
  }
483
415
  }
416
+
484
417
  /**
485
418
  * Determines if the regular parashat haShavua coincides with an event that requires
486
419
  * a special maftir or Haftara (for example Shabbat HaGadol, Shabbat Chanukah, Rosh
@@ -499,38 +432,32 @@ function mergeAliyotWithSpecial(aliyot, special) {
499
432
  * @param {boolean} [wantSeph]
500
433
  * @return {Aliyah | Aliyah[]}
501
434
  */
502
-
503
-
504
435
  function specialReadings(hd, il, aliyot, reason, parsha, wantSeph = false) {
505
436
  let haft;
506
437
  let seph;
507
438
  let specialHaft = false;
508
- const parshaName = parsha ? parshaToString(parsha) : null; // eslint-disable-next-line require-jsdoc
439
+ const parshaName = parsha ? parshaToString(parsha) : null;
509
440
 
441
+ // eslint-disable-next-line require-jsdoc
510
442
  function handleSpecial(key) {
511
443
  const special = lookupFestival(key);
512
-
513
444
  if (!special) {
514
445
  return;
515
446
  }
516
-
517
447
  if (special.haft && !specialHaft) {
518
448
  haft = cloneHaftara(special.haft);
519
449
  reason.haftara = key;
520
450
  specialHaft = true;
521
-
522
451
  if (special.seph) {
523
452
  seph = cloneHaftara(special.seph);
524
453
  reason.sephardic = key;
525
454
  }
526
455
  }
527
-
528
456
  if (special.fullkriyah) {
529
457
  mergeAliyotWithSpecial(aliyot, special.fullkriyah);
530
458
  Object.keys(special.fullkriyah).map(k => reason[k] = key);
531
459
  }
532
460
  }
533
-
534
461
  const events0 = core.HebrewCalendar.getHolidaysOnDate(hd, il) || [];
535
462
  const events = events0.filter(ev => !(ev.getFlags() & core.flags.ROSH_CHODESH));
536
463
  events.forEach(ev => {
@@ -538,16 +465,13 @@ function specialReadings(hd, il, aliyot, reason, parsha, wantSeph = false) {
538
465
  handleSpecial(`Shabbat Shuva (with ${parshaName})`);
539
466
  } else {
540
467
  const key = getLeyningKeyForEvent(ev, il);
541
-
542
468
  if (key) {
543
469
  handleSpecial(key);
544
470
  }
545
471
  }
546
472
  });
547
-
548
473
  if (!haft) {
549
474
  const day = hd.getDate();
550
-
551
475
  if (parshaName === 'Pinchas' && day > 17) {
552
476
  // Pinchas is always read in Tamuz (never another month)
553
477
  // either on the 14, 16, 17 (in Israel), 19, 21, 23, 24
@@ -557,13 +481,11 @@ function specialReadings(hd, il, aliyot, reason, parsha, wantSeph = false) {
557
481
  handleSpecial(key);
558
482
  } else {
559
483
  const tommorow = hd.next().getDate();
560
-
561
484
  if (tommorow === 30 || tommorow === 1) {
562
485
  handleSpecial('Shabbat Machar Chodesh');
563
486
  }
564
487
  }
565
488
  }
566
-
567
489
  if (wantSeph && haft) {
568
490
  return {
569
491
  haft,
@@ -622,7 +544,6 @@ var Bereshit={num:1,hebrew:"בְּרֵאשִׁית",book:1,haft:{k:"Isaiah",b:"4
622
544
  * @param {boolean} [il] true if Israel holiday scheme
623
545
  * @return {Leyning} map of aliyot
624
546
  */
625
-
626
547
  function getLeyningForHoliday(ev, il = false) {
627
548
  if (typeof ev !== 'object' || !(ev instanceof core.Event)) {
628
549
  throw new TypeError(`Bad event argument: ${ev}`);
@@ -631,11 +552,11 @@ function getLeyningForHoliday(ev, il = false) {
631
552
  } else if (ev.getFlags() & HOLIDAY_IGNORE_MASK) {
632
553
  return undefined;
633
554
  }
634
-
635
555
  const key = getLeyningKeyForEvent(ev, il);
636
556
  const leyning = getLeyningForHolidayKey(key, ev.cholHaMoedDay);
637
557
  return leyning;
638
558
  }
559
+
639
560
  /**
640
561
  * Looks up leyning for a given holiday key. Key should be an
641
562
  * (untranslated) string used in holiday-readings.json. Returns some
@@ -644,62 +565,50 @@ function getLeyningForHoliday(ev, il = false) {
644
565
  * @param {number} [cholHaMoedDay]
645
566
  * @return {Leyning} map of aliyot
646
567
  */
647
-
648
568
  function getLeyningForHolidayKey(key, cholHaMoedDay) {
649
569
  if (typeof key !== 'string') {
650
570
  return undefined;
651
571
  }
652
-
653
572
  const src = lookupFestival(key);
654
-
655
573
  if (typeof src === 'undefined') {
656
574
  return undefined;
657
575
  }
658
-
659
576
  const leyning = {
660
577
  name: {
661
578
  en: key,
662
579
  he: core.Locale.lookupTranslation(key, 'he')
663
580
  }
664
581
  };
665
-
666
582
  if (src.fullkriyah) {
667
583
  leyning.fullkriyah = clone(src.fullkriyah);
668
-
669
584
  if (key === 'Sukkot Shabbat Chol ha-Moed' && cholHaMoedDay) {
670
585
  leyning.fullkriyah['M'] = leyning.fullkriyah[`M-day${cholHaMoedDay}`];
671
-
672
586
  for (let day = 1; day <= 5; day++) {
673
587
  delete leyning.fullkriyah[`M-day${day}`];
674
588
  }
675
589
  }
676
-
677
590
  if (typeof leyning.fullkriyah['1'] === 'object') {
678
591
  const parts = makeLeyningParts(leyning.fullkriyah);
679
592
  leyning.summary = makeSummaryFromParts(parts);
680
-
681
593
  if (parts.length > 1) {
682
594
  leyning.summaryParts = parts;
683
595
  }
684
596
  }
685
-
686
597
  Object.values(leyning.fullkriyah).map(aliyah => calculateNumVerses(aliyah));
687
598
  }
688
-
689
599
  if (src.haft) {
690
600
  const haft = leyning.haft = cloneHaftara(src.haft);
691
601
  leyning.haftara = makeSummaryFromParts(haft);
692
602
  leyning.haftaraNumV = sumVerses(haft);
693
603
  }
694
-
695
604
  if (src.seph) {
696
605
  const seph = leyning.seph = cloneHaftara(src.seph);
697
606
  leyning.sephardic = makeSummaryFromParts(seph);
698
607
  leyning.sephardicNumV = sumVerses(seph);
699
608
  }
700
-
701
609
  return leyning;
702
610
  }
611
+
703
612
  /**
704
613
  * on doubled parshiot, read only the second Haftarah
705
614
  * except for Nitzavim-Vayelech
@@ -707,7 +616,6 @@ function getLeyningForHolidayKey(key, cholHaMoedDay) {
707
616
  * @param {string[]} parsha
708
617
  * @return {string}
709
618
  */
710
-
711
619
  function getHaftaraKey(parsha) {
712
620
  if (parsha.length == 1 || parsha[0] == 'Nitzavim') {
713
621
  return parsha[0];
@@ -715,20 +623,17 @@ function getHaftaraKey(parsha) {
715
623
  return parsha[1];
716
624
  }
717
625
  }
626
+
718
627
  /**
719
628
  * Looks up regular leyning for a weekly parsha with no special readings
720
629
  * @param {string|string[]} parsha untranslated name like 'Pinchas' or ['Pinchas'] or ['Matot','Masei']
721
630
  * @return {Leyning} map of aliyot
722
631
  */
723
-
724
-
725
632
  function getLeyningForParsha(parsha) {
726
633
  const isParshaString = typeof parsha === 'string';
727
-
728
634
  if (!isParshaString && (!Array.isArray(parsha) || parsha.length !== 1 && parsha.length !== 2)) {
729
635
  throw new TypeError(`Bad parsha argument: ${parsha}`);
730
636
  }
731
-
732
637
  const name = isParshaString ? parsha : parshaToString(parsha);
733
638
  const raw = parshiyotObj[name];
734
639
  const fullkriyah = {};
@@ -747,7 +652,6 @@ function getLeyningForParsha(parsha) {
747
652
  const parts = makeLeyningParts(fullkriyah);
748
653
  const summary = makeSummaryFromParts(parts);
749
654
  /** @type {Leyning} */
750
-
751
655
  const result = {
752
656
  name: {
753
657
  en: name,
@@ -758,28 +662,22 @@ function getLeyningForParsha(parsha) {
758
662
  summary,
759
663
  fullkriyah: fullkriyah
760
664
  };
761
-
762
665
  if (parts.length > 1) {
763
666
  result.summaryParts = parts;
764
667
  }
765
-
766
668
  const hkey = getHaftaraKey(parshaNameArray);
767
669
  const haft0 = parshiyotObj[hkey].haft;
768
-
769
670
  if (haft0) {
770
671
  const haft = result.haft = cloneHaftara(haft0);
771
672
  result.haftara = makeSummaryFromParts(haft);
772
673
  result.haftaraNumV = sumVerses(haft);
773
674
  }
774
-
775
675
  if (raw.seph) {
776
676
  const seph = result.seph = cloneHaftara(raw.seph);
777
677
  result.sephardic = makeSummaryFromParts(seph);
778
678
  result.sephardicNumV = sumVerses(seph);
779
679
  }
780
-
781
680
  const weekdaySrc = raw.weekday || parshiyotObj[parshaNameArray[0]].weekday;
782
-
783
681
  if (weekdaySrc) {
784
682
  const weekday = result.weekday = {};
785
683
  ['1', '2', '3'].forEach(num => {
@@ -793,9 +691,9 @@ function getLeyningForParsha(parsha) {
793
691
  weekday[num] = aliyah;
794
692
  });
795
693
  }
796
-
797
694
  return result;
798
695
  }
696
+
799
697
  /**
800
698
  * Looks up leyning for a regular Shabbat parsha, including any special
801
699
  * maftir or Haftara.
@@ -803,42 +701,35 @@ function getLeyningForParsha(parsha) {
803
701
  * @param {boolean} [il] in Israel
804
702
  * @return {Leyning} map of aliyot
805
703
  */
806
-
807
704
  function getLeyningForParshaHaShavua(ev, il = false) {
808
705
  if (!ev instanceof core.Event) {
809
706
  throw new TypeError(`Bad event argument: ${ev}`);
810
707
  } else if (ev.getFlags() != core.flags.PARSHA_HASHAVUA) {
811
708
  throw new TypeError(`Event must be parsha hashavua: ${ev.getDesc()}`);
812
- } // first, collect the default aliyot and haftara
813
-
814
-
709
+ }
710
+ // first, collect the default aliyot and haftara
815
711
  const parsha = ev.parsha;
816
712
  const result = getLeyningForParsha(parsha);
817
713
  const reason = {};
818
- const hd = ev.getDate(); // Now, check for special maftir or haftara on same date
819
-
714
+ const hd = ev.getDate();
715
+ // Now, check for special maftir or haftara on same date
820
716
  const specialHaftara = specialReadings(hd, il, result.fullkriyah, reason, parsha, true);
821
-
822
717
  if (specialHaftara) {
823
718
  const haft = result.haft = cloneHaftara(specialHaftara.haft);
824
719
  result.haftara = makeSummaryFromParts(haft);
825
720
  result.haftaraNumV = sumVerses(haft);
826
-
827
721
  if (specialHaftara.seph) {
828
722
  const seph = result.seph = cloneHaftara(specialHaftara.seph);
829
723
  result.sephardic = makeSummaryFromParts(seph);
830
724
  result.sephardicNumV = sumVerses(seph);
831
725
  }
832
726
  }
833
-
834
727
  if (reason['7'] || reason['M']) {
835
728
  const parts = makeLeyningParts(result.fullkriyah);
836
729
  result.summary = makeSummaryFromParts(parts);
837
730
  result.summaryParts = parts;
838
731
  }
839
-
840
732
  const reasons = Object.keys(reason);
841
-
842
733
  if (reasons.length !== 0) {
843
734
  result.reason = reason;
844
735
  reasons.forEach(num => {
@@ -848,18 +739,17 @@ function getLeyningForParshaHaShavua(ev, il = false) {
848
739
  hafts.forEach(haft => haft.reason = reason[num]);
849
740
  } else {
850
741
  const aliyah = result.fullkriyah[num];
851
-
852
742
  if (typeof aliyah === 'object') {
853
743
  aliyah.reason = reason[num];
854
744
  }
855
745
  }
856
746
  });
857
- } // to avoid confusion, don't include Saturday mincha reading here
858
-
859
-
747
+ }
748
+ // to avoid confusion, don't include Saturday mincha reading here
860
749
  delete result.weekday;
861
750
  return result;
862
751
  }
752
+
863
753
  /**
864
754
  * Looks up leyning for a regular Shabbat, Monday/Thursday weekday or holiday.
865
755
  *
@@ -877,28 +767,22 @@ function getLeyningForParshaHaShavua(ev, il = false) {
877
767
  * @param {boolean} il in Israel
878
768
  * @return {Leyning} map of aliyot
879
769
  */
880
-
881
770
  function getLeyningOnDate(hdate, il) {
882
771
  const dow = hdate.getDay();
883
772
  const hyear = hdate.getFullYear();
884
773
  const sedra = core.HebrewCalendar.getSedra(hyear, il);
885
774
  const parsha = sedra.lookup(hdate);
886
-
887
775
  if (dow === 6 && !parsha.chag) {
888
776
  const parshaEvent = new core.ParshaEvent(hdate, parsha.parsha, il);
889
777
  return getLeyningForParshaHaShavua(parshaEvent, il);
890
778
  }
891
-
892
779
  const events = core.HebrewCalendar.getHolidaysOnDate(hdate, il) || [];
893
-
894
780
  for (let i = 0; i < events.length; i++) {
895
781
  const reading = getLeyningForHoliday(events[i], il);
896
-
897
782
  if (reading) {
898
783
  return reading;
899
784
  }
900
785
  }
901
-
902
786
  if (dow === 1 || dow === 4) {
903
787
  const saturday = hdate.onOrAfter(6);
904
788
  const parsha2 = findParshaHaShavua(saturday);
@@ -910,44 +794,38 @@ function getLeyningOnDate(hdate, il) {
910
794
  weekday: reading.weekday
911
795
  };
912
796
  return result;
913
- } // no reading today: it's not Shabbat, Mon/Thu, or a Torah-reading holiday
914
-
915
-
797
+ }
798
+ // no reading today: it's not Shabbat, Mon/Thu, or a Torah-reading holiday
916
799
  return undefined;
917
800
  }
801
+
918
802
  /**
919
803
  * @private
920
804
  * @param {HDate} saturday
921
805
  * @param {boolean} il
922
806
  * @return {Leyning}
923
807
  */
924
-
925
808
  function findParshaHaShavua(saturday, il) {
926
809
  const hyear = saturday.getFullYear();
927
810
  const sedra = core.HebrewCalendar.getSedra(hyear, il);
928
811
  const parsha = sedra.lookup(saturday);
929
-
930
812
  if (!parsha.chag) {
931
813
  return parsha;
932
- } // Search for next regular parsha, which could even spill into next year
933
-
934
-
814
+ }
815
+ // Search for next regular parsha, which could even spill into next year
935
816
  const endOfYear = new core.HDate(1, core.months.TISHREI, hyear + 1).abs() - 1;
936
817
  const endAbs = endOfYear + 30;
937
-
938
818
  for (let sat2 = saturday.abs() + 7; sat2 <= endAbs; sat2 += 7) {
939
819
  const sedra2 = sat2 > endOfYear ? core.HebrewCalendar.getSedra(hyear + 1, il) : sedra;
940
820
  const parsha2 = sedra2.lookup(sat2);
941
-
942
821
  if (!parsha2.chag) {
943
822
  return parsha2;
944
823
  }
945
824
  }
946
825
  /* NOTREACHED */
947
-
948
-
949
826
  return null;
950
827
  }
828
+
951
829
  /**
952
830
  * Parsha metadata
953
831
  * @typedef {Object} ParshaMeta
@@ -966,22 +844,16 @@ function findParshaHaShavua(saturday, il) {
966
844
  * @param {string|string[]} parsha
967
845
  * @return {ParshaMeta}
968
846
  */
969
-
970
-
971
847
  function lookupParsha(parsha) {
972
848
  const isParshaString = typeof parsha === 'string';
973
-
974
849
  if (!isParshaString && (!Array.isArray(parsha) || parsha.length !== 1 && parsha.length !== 2)) {
975
850
  throw new TypeError(`Bad parsha argument: ${parsha}`);
976
851
  }
977
-
978
852
  const name = isParshaString ? parsha : parshaToString(parsha);
979
853
  const raw = parshiyotObj[name];
980
-
981
854
  if (typeof raw !== 'object') {
982
855
  throw new TypeError(`Bad parsha argument: ${parsha}`);
983
856
  }
984
-
985
857
  return raw;
986
858
  }
987
859
 
@@ -990,23 +862,22 @@ const fmt = new Intl.DateTimeFormat('en-US', {
990
862
  month: 'short',
991
863
  day: '2-digit'
992
864
  });
865
+
993
866
  /**
994
867
  * @private
995
868
  * @param {Date} dt
996
869
  * @return {string}
997
870
  */
998
-
999
871
  function fmtDate(dt) {
1000
872
  const s = fmt.format(dt).split(' ');
1001
873
  return s[1].substring(0, 2) + '-' + s[0] + '-' + s[2];
1002
874
  }
875
+
1003
876
  /**
1004
877
  * @private
1005
878
  * @param {Event[]} events
1006
879
  * @return {Object<string,boolean>}
1007
880
  */
1008
-
1009
-
1010
881
  function getParshaDates(events) {
1011
882
  const parshaEvents = events.filter(ev => ev.getFlags() === core.flags.PARSHA_HASHAVUA);
1012
883
  const parshaDates = parshaEvents.reduce((set, ev) => {
@@ -1015,13 +886,13 @@ function getParshaDates(events) {
1015
886
  }, {});
1016
887
  return parshaDates;
1017
888
  }
889
+
1018
890
  /**
1019
891
  * @private
1020
892
  * @param {fs.WriteStream} stream
1021
893
  * @param {number} hyear
1022
894
  * @param {boolean} il
1023
895
  */
1024
-
1025
896
  function writeFullKriyahCsv(stream, hyear, il) {
1026
897
  const events0 = core.HebrewCalendar.calendar({
1027
898
  year: hyear,
@@ -1038,68 +909,61 @@ function writeFullKriyahCsv(stream, hyear, il) {
1038
909
  }
1039
910
  });
1040
911
  }
912
+
1041
913
  /**
1042
914
  * @private
1043
915
  * @param {Event} ev
1044
916
  * @return {boolean}
1045
917
  */
1046
-
1047
918
  function ignore(ev) {
1048
919
  const mask = ev.getFlags();
1049
-
1050
920
  if (mask === core.flags.SPECIAL_SHABBAT) {
1051
921
  return true;
1052
922
  }
1053
-
1054
923
  if (mask !== core.flags.ROSH_CHODESH) {
1055
924
  return false;
1056
925
  }
1057
-
1058
926
  return ev.getDate().getDay() === 6;
1059
927
  }
928
+
1060
929
  /**
1061
930
  * @private
1062
931
  * @param {fs.WriteStream} stream
1063
932
  * @param {Event} ev
1064
933
  * @param {boolean} il
1065
934
  */
1066
-
1067
-
1068
935
  function writeFullKriyahEvent(stream, ev, il) {
1069
936
  if (ignore(ev)) {
1070
937
  return;
1071
938
  }
1072
-
1073
939
  const mask = ev.getFlags();
1074
940
  const isParsha = mask === core.flags.PARSHA_HASHAVUA;
1075
941
  const reading = isParsha ? getLeyningForParshaHaShavua(ev, il) : getLeyningForHoliday(ev, il);
1076
-
1077
942
  if (reading) {
1078
943
  writeCsvLines(stream, ev, reading, il, isParsha);
1079
-
1080
944
  if (!isParsha) {
1081
945
  writeHolidayMincha(stream, ev, il);
1082
946
  }
1083
947
  }
1084
948
  }
949
+
1085
950
  /**
1086
951
  * @private
1087
952
  * @param {fs.WriteStream} stream
1088
953
  * @param {Event} ev
1089
954
  * @param {boolean} il
1090
955
  */
1091
-
1092
956
  function writeHolidayMincha(stream, ev, il) {
1093
957
  const desc = ev.getDesc();
1094
958
  const minchaDesc1 = desc + ' (Mincha)';
1095
959
  const readingMincha1 = getLeyningForHolidayKey(minchaDesc1);
1096
960
  const readingMincha = readingMincha1 || getLeyningForHolidayKey(getLeyningKeyForEvent(ev, il) + ' (Mincha)');
1097
-
1098
961
  if (readingMincha) {
1099
962
  const minchaEv = new core.Event(ev.getDate(), minchaDesc1, core.flags.USER_EVENT);
1100
963
  writeCsvLines(stream, minchaEv, readingMincha, il, false);
1101
964
  }
1102
965
  }
966
+
1103
967
  /**
1104
968
  * Formats reading for CSV
1105
969
  * @param {fs.WriteStream} stream
@@ -1108,75 +972,59 @@ function writeHolidayMincha(stream, ev, il) {
1108
972
  * @param {boolean} il
1109
973
  * @param {boolean} isParsha
1110
974
  */
1111
-
1112
975
  function writeCsvLines(stream, ev, reading, il, isParsha) {
1113
976
  const parsha = isParsha ? ev.basename() : getLeyningKeyForEvent(ev, il) || ev.render();
1114
977
  const date = fmtDate(ev.getDate().greg());
1115
978
  const lines = getFullKriyahLines(reading);
1116
979
  lines.forEach(s => {
1117
980
  const code = s[0].charCodeAt(0);
1118
-
1119
981
  if (code < 48 || code > 57) {
1120
982
  s[0] = `"${s[0]}"`;
1121
983
  }
1122
-
1123
984
  stream.write(`${date},"${parsha}",${s[0]},"${s[1]}",${s[2]}\r\n`);
1124
985
  });
1125
986
  stream.write('\r\n');
1126
987
  }
988
+
1127
989
  /**
1128
990
  * @private
1129
991
  * @param {any} reading
1130
992
  * @return {any[]}
1131
993
  */
1132
-
1133
994
  function getFullKriyahLines(reading) {
1134
995
  const lines = [];
1135
-
1136
996
  if (reading.fullkriyah) {
1137
997
  Object.keys(reading.fullkriyah).forEach(num => {
1138
998
  const a = reading.fullkriyah[num];
1139
-
1140
999
  if (typeof a !== 'undefined') {
1141
1000
  var _reading$reason;
1142
-
1143
1001
  const k = num == 'M' ? 'maf' : num;
1144
1002
  let aliyah = formatAliyahWithBook(a);
1145
-
1146
1003
  if ((_reading$reason = reading.reason) !== null && _reading$reason !== void 0 && _reading$reason[num]) {
1147
1004
  aliyah += ' | ' + reading.reason[num];
1148
1005
  }
1149
-
1150
1006
  lines.push([k, aliyah, a.v || '']);
1151
1007
  }
1152
1008
  });
1153
1009
  }
1154
-
1155
1010
  let specialHaftara = false;
1156
-
1157
1011
  if (reading.haftara) {
1158
1012
  var _reading$reason2;
1159
-
1160
1013
  let haftara = reading.haftara.replace(/,/g, ';');
1161
-
1162
1014
  if ((_reading$reason2 = reading.reason) !== null && _reading$reason2 !== void 0 && _reading$reason2.haftara) {
1163
1015
  specialHaftara = true;
1164
1016
  haftara += ' | ' + reading.reason.haftara;
1165
1017
  }
1166
-
1167
1018
  lines.push(['Haftara', haftara, reading.haftaraNumV || '']);
1168
1019
  }
1169
-
1170
1020
  if (reading.sephardic && !specialHaftara) {
1171
1021
  const sephardic = reading.sephardic.replace(/,/g, ';');
1172
1022
  lines.push(['Haftara for Sephardim', sephardic, reading.sephardicNumV || '']);
1173
1023
  }
1174
-
1175
1024
  if (reading.triHaftara) {
1176
1025
  const haftara = reading.triHaftara.replace(/,/g, ';');
1177
1026
  lines.push(['Alternate Haftara', haftara, reading.triHaftaraNumV || '']);
1178
1027
  }
1179
-
1180
1028
  return lines;
1181
1029
  }
1182
1030