@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/README.md +2 -1
- package/dist/bundle.js +77 -238
- package/dist/bundle.min.js +2 -2
- package/dist/index.js +48 -200
- package/dist/index.mjs +48 -198
- package/package.json +14 -14
package/dist/index.js
CHANGED
|
@@ -1,8 +1,6 @@
|
|
|
1
|
-
/*! @hebcal/leyning v6.2.
|
|
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
|
-
}
|
|
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
|
-
}
|
|
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;
|
|
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
|
-
}
|
|
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();
|
|
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
|
-
}
|
|
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
|
-
}
|
|
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
|
-
}
|
|
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
|
|