@hebcal/core 5.3.3 → 5.3.4
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/bundle.js +233 -187
- package/dist/bundle.min.js +2 -2
- package/dist/index.cjs +662 -662
- package/dist/index.mjs +662 -662
- package/package.json +5 -5
package/dist/index.mjs
CHANGED
|
@@ -1,23 +1,37 @@
|
|
|
1
|
-
/*! @hebcal/core v5.3.
|
|
1
|
+
/*! @hebcal/core v5.3.4 */
|
|
2
|
+
/* eslint-disable @typescript-eslint/no-namespace, no-inner-declarations */
|
|
2
3
|
/** @private */
|
|
3
4
|
const lengths = [0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
|
|
4
5
|
/** @private */
|
|
5
|
-
const monthLengths = [
|
|
6
|
-
lengths,
|
|
7
|
-
lengths.slice(),
|
|
8
|
-
];
|
|
6
|
+
const monthLengths = [lengths, lengths.slice()];
|
|
9
7
|
monthLengths[1][2] = 29;
|
|
10
8
|
/**
|
|
11
9
|
* @private
|
|
12
10
|
*/
|
|
13
11
|
function mod$1(x, y) {
|
|
14
|
-
|
|
12
|
+
return x - y * Math.floor(x / y);
|
|
15
13
|
}
|
|
16
14
|
/**
|
|
17
15
|
* @private
|
|
18
16
|
*/
|
|
19
17
|
function quotient(x, y) {
|
|
20
|
-
|
|
18
|
+
return Math.floor(x / y);
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* @private
|
|
22
|
+
* @param abs - R.D. number of days
|
|
23
|
+
*/
|
|
24
|
+
function yearFromFixed(abs) {
|
|
25
|
+
const l0 = abs - 1;
|
|
26
|
+
const n400 = quotient(l0, 146097);
|
|
27
|
+
const d1 = mod$1(l0, 146097);
|
|
28
|
+
const n100 = quotient(d1, 36524);
|
|
29
|
+
const d2 = mod$1(d1, 36524);
|
|
30
|
+
const n4 = quotient(d2, 1461);
|
|
31
|
+
const d3 = mod$1(d2, 1461);
|
|
32
|
+
const n1 = quotient(d3, 365);
|
|
33
|
+
const year = 400 * n400 + 100 * n100 + 4 * n4 + n1;
|
|
34
|
+
return n100 !== 4 && n1 !== 4 ? year + 1 : year;
|
|
21
35
|
}
|
|
22
36
|
/*
|
|
23
37
|
const ABS_14SEP1752 = 639797;
|
|
@@ -28,116 +42,95 @@ const ABS_2SEP1752 = 639785;
|
|
|
28
42
|
*/
|
|
29
43
|
var greg;
|
|
30
44
|
(function (greg) {
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
45
|
+
/**
|
|
46
|
+
* Returns true if the Gregorian year is a leap year
|
|
47
|
+
* @param {number} year Gregorian year
|
|
48
|
+
* @return {boolean}
|
|
49
|
+
*/
|
|
50
|
+
function isLeapYear(year) {
|
|
51
|
+
return !(year % 4) && (!!(year % 100) || !(year % 400));
|
|
52
|
+
}
|
|
53
|
+
greg.isLeapYear = isLeapYear;
|
|
54
|
+
/**
|
|
55
|
+
* Number of days in the Gregorian month for given year
|
|
56
|
+
* @param {number} month Gregorian month (1=January, 12=December)
|
|
57
|
+
* @param {number} year Gregorian year
|
|
58
|
+
* @return {number}
|
|
59
|
+
*/
|
|
60
|
+
function daysInMonth(month, year) {
|
|
61
|
+
// 1 based months
|
|
62
|
+
return monthLengths[+isLeapYear(year)][month];
|
|
63
|
+
}
|
|
64
|
+
greg.daysInMonth = daysInMonth;
|
|
65
|
+
/**
|
|
66
|
+
* Returns true if the object is a Javascript Date
|
|
67
|
+
* @param {Object} obj
|
|
68
|
+
* @return {boolean}
|
|
69
|
+
*/
|
|
70
|
+
function isDate(obj) {
|
|
71
|
+
// eslint-disable-next-line no-prototype-builtins
|
|
72
|
+
return typeof obj === 'object' && Date.prototype.isPrototypeOf(obj);
|
|
73
|
+
}
|
|
74
|
+
greg.isDate = isDate;
|
|
75
|
+
/**
|
|
76
|
+
* @private
|
|
77
|
+
* @param year
|
|
78
|
+
* @param month (1-12)
|
|
79
|
+
* @param day (1-31)
|
|
80
|
+
*/
|
|
81
|
+
function toFixed(year, month, day) {
|
|
82
|
+
const py = year - 1;
|
|
83
|
+
return 365 * py + quotient(py, 4) - quotient(py, 100) + quotient(py, 400) + quotient(367 * month - 362, 12) + (month <= 2 ? 0 : isLeapYear(year) ? -1 : -2) + day;
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Converts Gregorian date to absolute R.D. (Rata Die) days
|
|
87
|
+
* @param {Date} date Gregorian date
|
|
88
|
+
* @return {number}
|
|
89
|
+
*/
|
|
90
|
+
function greg2abs(date) {
|
|
91
|
+
if (!isDate(date)) {
|
|
92
|
+
throw new TypeError(`Argument not a Date: ${date}`);
|
|
75
93
|
}
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
* @param day (1-31)
|
|
81
|
-
*/
|
|
82
|
-
function toFixed(year, month, day) {
|
|
83
|
-
const py = year - 1;
|
|
84
|
-
return 365 * py +
|
|
85
|
-
quotient(py, 4) -
|
|
86
|
-
quotient(py, 100) +
|
|
87
|
-
quotient(py, 400) +
|
|
88
|
-
quotient((367 * month - 362), 12) +
|
|
89
|
-
(month <= 2 ? 0 : (isLeapYear(year) ? -1 : -2)) +
|
|
90
|
-
day;
|
|
94
|
+
const abs = toFixed(date.getFullYear(), date.getMonth() + 1, date.getDate());
|
|
95
|
+
/*
|
|
96
|
+
if (abs < ABS_14SEP1752 && abs > ABS_2SEP1752) {
|
|
97
|
+
throw new RangeError(`Invalid Date: ${date}`);
|
|
91
98
|
}
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
99
|
+
*/
|
|
100
|
+
return abs;
|
|
101
|
+
}
|
|
102
|
+
greg.greg2abs = greg2abs;
|
|
103
|
+
/**
|
|
104
|
+
* Converts from Rata Die (R.D. number) to Gregorian date.
|
|
105
|
+
* See the footnote on page 384 of ``Calendrical Calculations, Part II:
|
|
106
|
+
* Three Historical Calendars'' by E. M. Reingold, N. Dershowitz, and S. M.
|
|
107
|
+
* Clamen, Software--Practice and Experience, Volume 23, Number 4
|
|
108
|
+
* (April, 1993), pages 383-404 for an explanation.
|
|
109
|
+
* @param {number} abs - R.D. number of days
|
|
110
|
+
* @return {Date}
|
|
111
|
+
*/
|
|
112
|
+
function abs2greg(abs) {
|
|
113
|
+
if (typeof abs !== 'number') {
|
|
114
|
+
throw new TypeError(`Argument not a Number: ${abs}`);
|
|
108
115
|
}
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
* Three Historical Calendars'' by E. M. Reingold, N. Dershowitz, and S. M.
|
|
114
|
-
* Clamen, Software--Practice and Experience, Volume 23, Number 4
|
|
115
|
-
* (April, 1993), pages 383-404 for an explanation.
|
|
116
|
-
* @param {number} abs - R.D. number of days
|
|
117
|
-
* @return {Date}
|
|
118
|
-
*/
|
|
119
|
-
function abs2greg(abs) {
|
|
120
|
-
if (typeof abs !== 'number') {
|
|
121
|
-
throw new TypeError(`Argument not a Number: ${abs}`);
|
|
122
|
-
}
|
|
123
|
-
abs = Math.trunc(abs);
|
|
124
|
-
/*
|
|
125
|
-
if (abs < ABS_14SEP1752 && abs > ABS_2SEP1752) {
|
|
126
|
-
throw new RangeError(`Invalid Date: ${abs}`);
|
|
127
|
-
}
|
|
128
|
-
*/
|
|
129
|
-
const year = yearFromFixed(abs);
|
|
130
|
-
const priorDays = abs - toFixed(year, 1, 1);
|
|
131
|
-
const correction = abs < toFixed(year, 3, 1) ? 0 : (isLeapYear(year) ? 1 : 2);
|
|
132
|
-
const month = quotient((12 * (priorDays + correction) + 373), 367);
|
|
133
|
-
const day = abs - toFixed(year, month, 1) + 1;
|
|
134
|
-
const dt = new Date(year, month - 1, day);
|
|
135
|
-
if (year < 100 && year >= 0) {
|
|
136
|
-
dt.setFullYear(year);
|
|
137
|
-
}
|
|
138
|
-
return dt;
|
|
116
|
+
abs = Math.trunc(abs);
|
|
117
|
+
/*
|
|
118
|
+
if (abs < ABS_14SEP1752 && abs > ABS_2SEP1752) {
|
|
119
|
+
throw new RangeError(`Invalid Date: ${abs}`);
|
|
139
120
|
}
|
|
140
|
-
|
|
121
|
+
*/
|
|
122
|
+
const year = yearFromFixed(abs);
|
|
123
|
+
const priorDays = abs - toFixed(year, 1, 1);
|
|
124
|
+
const correction = abs < toFixed(year, 3, 1) ? 0 : isLeapYear(year) ? 1 : 2;
|
|
125
|
+
const month = quotient(12 * (priorDays + correction) + 373, 367);
|
|
126
|
+
const day = abs - toFixed(year, month, 1) + 1;
|
|
127
|
+
const dt = new Date(year, month - 1, day);
|
|
128
|
+
if (year < 100 && year >= 0) {
|
|
129
|
+
dt.setFullYear(year);
|
|
130
|
+
}
|
|
131
|
+
return dt;
|
|
132
|
+
}
|
|
133
|
+
greg.abs2greg = abs2greg;
|
|
141
134
|
})(greg || (greg = {}));
|
|
142
135
|
|
|
143
136
|
/*
|
|
@@ -162,63 +155,40 @@ const ADAR_II$2 = 13;
|
|
|
162
155
|
* @enum {number}
|
|
163
156
|
*/
|
|
164
157
|
const months = {
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
158
|
+
/** Nissan / ניסן */
|
|
159
|
+
NISAN: 1,
|
|
160
|
+
/** Iyyar / אייר */
|
|
161
|
+
IYYAR: 2,
|
|
162
|
+
/** Sivan / סיון */
|
|
163
|
+
SIVAN: 3,
|
|
164
|
+
/** Tamuz (sometimes Tammuz) / תמוז */
|
|
165
|
+
TAMUZ: 4,
|
|
166
|
+
/** Av / אב */
|
|
167
|
+
AV: 5,
|
|
168
|
+
/** Elul / אלול */
|
|
169
|
+
ELUL: 6,
|
|
170
|
+
/** Tishrei / תִּשְׁרֵי */
|
|
171
|
+
TISHREI: 7,
|
|
172
|
+
/** Cheshvan / חשון */
|
|
173
|
+
CHESHVAN: 8,
|
|
174
|
+
/** Kislev / כסלו */
|
|
175
|
+
KISLEV: 9,
|
|
176
|
+
/** Tevet / טבת */
|
|
177
|
+
TEVET: 10,
|
|
178
|
+
/** Sh'vat / שבט */
|
|
179
|
+
SHVAT: 11,
|
|
180
|
+
/** Adar or Adar Rishon / אדר */
|
|
181
|
+
ADAR_I: 12,
|
|
182
|
+
/** Adar Sheini (only on leap years) / אדר ב׳ */
|
|
183
|
+
ADAR_II: 13
|
|
191
184
|
};
|
|
192
|
-
const monthNames0 = [
|
|
193
|
-
'',
|
|
194
|
-
'Nisan',
|
|
195
|
-
'Iyyar',
|
|
196
|
-
'Sivan',
|
|
197
|
-
'Tamuz',
|
|
198
|
-
'Av',
|
|
199
|
-
'Elul',
|
|
200
|
-
'Tishrei',
|
|
201
|
-
'Cheshvan',
|
|
202
|
-
'Kislev',
|
|
203
|
-
'Tevet',
|
|
204
|
-
'Sh\'vat',
|
|
205
|
-
];
|
|
185
|
+
const monthNames0 = ['', 'Nisan', 'Iyyar', 'Sivan', 'Tamuz', 'Av', 'Elul', 'Tishrei', 'Cheshvan', 'Kislev', 'Tevet', "Sh'vat"];
|
|
206
186
|
/**
|
|
207
187
|
* Transliterations of Hebrew month names.
|
|
208
188
|
* Regular years are index 0 and leap years are index 1.
|
|
209
189
|
* @private
|
|
210
190
|
*/
|
|
211
|
-
const monthNames = [
|
|
212
|
-
monthNames0.concat([
|
|
213
|
-
'Adar',
|
|
214
|
-
'Nisan',
|
|
215
|
-
]),
|
|
216
|
-
monthNames0.concat([
|
|
217
|
-
'Adar I',
|
|
218
|
-
'Adar II',
|
|
219
|
-
'Nisan',
|
|
220
|
-
]),
|
|
221
|
-
];
|
|
191
|
+
const monthNames = [monthNames0.concat(['Adar', 'Nisan']), monthNames0.concat(['Adar I', 'Adar II', 'Nisan'])];
|
|
222
192
|
const edCache = new Map();
|
|
223
193
|
const EPOCH = -1373428;
|
|
224
194
|
// Avg year length in the cycle (19 solar years with 235 lunar months)
|
|
@@ -227,9 +197,9 @@ const AVG_HEBYEAR_DAYS = 365.24682220597794;
|
|
|
227
197
|
* @private
|
|
228
198
|
*/
|
|
229
199
|
function assertNumber(n, name) {
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
200
|
+
if (typeof n !== 'number' || isNaN(n)) {
|
|
201
|
+
throw new TypeError(`invalid parameter '${name}' not a number: ${n}`);
|
|
202
|
+
}
|
|
233
203
|
}
|
|
234
204
|
/**
|
|
235
205
|
* Converts Hebrew date to R.D. (Rata Die) fixed days.
|
|
@@ -241,33 +211,32 @@ function assertNumber(n, name) {
|
|
|
241
211
|
* @return {number}
|
|
242
212
|
*/
|
|
243
213
|
function hebrew2abs(year, month, day) {
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
}
|
|
255
|
-
for (let m = NISAN$4; m < month; m++) {
|
|
256
|
-
tempabs += daysInMonth(m, year);
|
|
257
|
-
}
|
|
214
|
+
assertNumber(year, 'year');
|
|
215
|
+
assertNumber(month, 'month');
|
|
216
|
+
assertNumber(day, 'day');
|
|
217
|
+
if (year < 1) {
|
|
218
|
+
throw new RangeError(`hebrew2abs: invalid year ${year}`);
|
|
219
|
+
}
|
|
220
|
+
let tempabs = day;
|
|
221
|
+
if (month < TISHREI$2) {
|
|
222
|
+
for (let m = TISHREI$2; m <= monthsInYear(year); m++) {
|
|
223
|
+
tempabs += daysInMonth(m, year);
|
|
258
224
|
}
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
tempabs += daysInMonth(m, year);
|
|
262
|
-
}
|
|
225
|
+
for (let m = NISAN$4; m < month; m++) {
|
|
226
|
+
tempabs += daysInMonth(m, year);
|
|
263
227
|
}
|
|
264
|
-
|
|
228
|
+
} else {
|
|
229
|
+
for (let m = TISHREI$2; m < month; m++) {
|
|
230
|
+
tempabs += daysInMonth(m, year);
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
return EPOCH + elapsedDays(year) + tempabs - 1;
|
|
265
234
|
}
|
|
266
235
|
/**
|
|
267
236
|
* @private
|
|
268
237
|
*/
|
|
269
238
|
function newYear(year) {
|
|
270
|
-
|
|
239
|
+
return EPOCH + elapsedDays(year);
|
|
271
240
|
}
|
|
272
241
|
/**
|
|
273
242
|
* Converts absolute R.D. days to Hebrew date
|
|
@@ -275,23 +244,27 @@ function newYear(year) {
|
|
|
275
244
|
* @return {SimpleHebrewDate}
|
|
276
245
|
*/
|
|
277
246
|
function abs2hebrew(abs) {
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
247
|
+
assertNumber(abs, 'abs');
|
|
248
|
+
abs = Math.trunc(abs);
|
|
249
|
+
if (abs <= EPOCH) {
|
|
250
|
+
throw new RangeError(`abs2hebrew: ${abs} is before epoch`);
|
|
251
|
+
}
|
|
252
|
+
// first, quickly approximate year
|
|
253
|
+
let year = Math.floor((abs - EPOCH) / AVG_HEBYEAR_DAYS);
|
|
254
|
+
while (newYear(year) <= abs) {
|
|
255
|
+
++year;
|
|
256
|
+
}
|
|
257
|
+
--year;
|
|
258
|
+
let month = abs < hebrew2abs(year, 1, 1) ? 7 : 1;
|
|
259
|
+
while (abs > hebrew2abs(year, month, daysInMonth(month, year))) {
|
|
260
|
+
++month;
|
|
261
|
+
}
|
|
262
|
+
const day = 1 + abs - hebrew2abs(year, month, 1);
|
|
263
|
+
return {
|
|
264
|
+
yy: year,
|
|
265
|
+
mm: month,
|
|
266
|
+
dd: day
|
|
267
|
+
};
|
|
295
268
|
}
|
|
296
269
|
/**
|
|
297
270
|
* Returns true if Hebrew year is a leap year
|
|
@@ -299,7 +272,7 @@ function abs2hebrew(abs) {
|
|
|
299
272
|
* @return {boolean}
|
|
300
273
|
*/
|
|
301
274
|
function isLeapYear(year) {
|
|
302
|
-
|
|
275
|
+
return (1 + year * 7) % 19 < 7;
|
|
303
276
|
}
|
|
304
277
|
/**
|
|
305
278
|
* Number of months in this Hebrew year (either 12 or 13 depending on leap year)
|
|
@@ -307,7 +280,7 @@ function isLeapYear(year) {
|
|
|
307
280
|
* @return {number}
|
|
308
281
|
*/
|
|
309
282
|
function monthsInYear(year) {
|
|
310
|
-
|
|
283
|
+
return 12 + +isLeapYear(year); // boolean is cast to 1 or 0
|
|
311
284
|
}
|
|
312
285
|
/**
|
|
313
286
|
* Number of days in Hebrew month in a given year (29 or 30)
|
|
@@ -316,22 +289,19 @@ function monthsInYear(year) {
|
|
|
316
289
|
* @return {number}
|
|
317
290
|
*/
|
|
318
291
|
function daysInMonth(month, year) {
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
else {
|
|
333
|
-
return 30;
|
|
334
|
-
}
|
|
292
|
+
switch (month) {
|
|
293
|
+
case IYYAR$1:
|
|
294
|
+
case TAMUZ$1:
|
|
295
|
+
case ELUL$1:
|
|
296
|
+
case TEVET$2:
|
|
297
|
+
case ADAR_II$2:
|
|
298
|
+
return 29;
|
|
299
|
+
}
|
|
300
|
+
if (month === ADAR_I$2 && !isLeapYear(year) || month === CHESHVAN$1 && !longCheshvan(year) || month === KISLEV$2 && shortKislev(year)) {
|
|
301
|
+
return 29;
|
|
302
|
+
} else {
|
|
303
|
+
return 30;
|
|
304
|
+
}
|
|
335
305
|
}
|
|
336
306
|
/**
|
|
337
307
|
* Returns a transliterated string name of Hebrew month in year,
|
|
@@ -340,12 +310,12 @@ function daysInMonth(month, year) {
|
|
|
340
310
|
* @param {number} year Hebrew year
|
|
341
311
|
*/
|
|
342
312
|
function getMonthName(month, year) {
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
313
|
+
assertNumber(month, 'month');
|
|
314
|
+
assertNumber(year, 'year');
|
|
315
|
+
if (month < 1 || month > 14) {
|
|
316
|
+
throw new TypeError(`bad month argument ${month}`);
|
|
317
|
+
}
|
|
318
|
+
return monthNames[+isLeapYear(year)][month];
|
|
349
319
|
}
|
|
350
320
|
/**
|
|
351
321
|
* Days from sunday prior to start of Hebrew calendar to mean
|
|
@@ -354,13 +324,13 @@ function getMonthName(month, year) {
|
|
|
354
324
|
* @return {number}
|
|
355
325
|
*/
|
|
356
326
|
function elapsedDays(year) {
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
327
|
+
const n = edCache.get(year);
|
|
328
|
+
if (typeof n === 'number') {
|
|
329
|
+
return n;
|
|
330
|
+
}
|
|
331
|
+
const elapsed = elapsedDays0(year);
|
|
332
|
+
edCache.set(year, elapsed);
|
|
333
|
+
return elapsed;
|
|
364
334
|
}
|
|
365
335
|
/**
|
|
366
336
|
* Days from sunday prior to start of Hebrew calendar to mean
|
|
@@ -369,29 +339,25 @@ function elapsedDays(year) {
|
|
|
369
339
|
* @param year Hebrew year
|
|
370
340
|
*/
|
|
371
341
|
function elapsedDays0(year) {
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
}
|
|
392
|
-
else {
|
|
393
|
-
return altDay;
|
|
394
|
-
}
|
|
342
|
+
const prevYear = year - 1;
|
|
343
|
+
const mElapsed = 235 * Math.floor(prevYear / 19) +
|
|
344
|
+
// Months in complete 19 year lunar (Metonic) cycles so far
|
|
345
|
+
12 * (prevYear % 19) +
|
|
346
|
+
// Regular months in this cycle
|
|
347
|
+
Math.floor((prevYear % 19 * 7 + 1) / 19); // Leap months this cycle
|
|
348
|
+
const pElapsed = 204 + 793 * (mElapsed % 1080);
|
|
349
|
+
const hElapsed = 5 + 12 * mElapsed + 793 * Math.floor(mElapsed / 1080) + Math.floor(pElapsed / 1080);
|
|
350
|
+
const parts = pElapsed % 1080 + 1080 * (hElapsed % 24);
|
|
351
|
+
const day = 1 + 29 * mElapsed + Math.floor(hElapsed / 24);
|
|
352
|
+
let altDay = day;
|
|
353
|
+
if (parts >= 19440 || 2 === day % 7 && parts >= 9924 && !isLeapYear(year) || 1 === day % 7 && parts >= 16789 && isLeapYear(prevYear)) {
|
|
354
|
+
altDay++;
|
|
355
|
+
}
|
|
356
|
+
if (altDay % 7 === 0 || altDay % 7 === 3 || altDay % 7 === 5) {
|
|
357
|
+
return altDay + 1;
|
|
358
|
+
} else {
|
|
359
|
+
return altDay;
|
|
360
|
+
}
|
|
395
361
|
}
|
|
396
362
|
/**
|
|
397
363
|
* Number of days in the hebrew YEAR.
|
|
@@ -401,7 +367,7 @@ function elapsedDays0(year) {
|
|
|
401
367
|
* @return {number}
|
|
402
368
|
*/
|
|
403
369
|
function daysInYear(year) {
|
|
404
|
-
|
|
370
|
+
return elapsedDays(year + 1) - elapsedDays(year);
|
|
405
371
|
}
|
|
406
372
|
/**
|
|
407
373
|
* true if Cheshvan is long in Hebrew year
|
|
@@ -409,7 +375,7 @@ function daysInYear(year) {
|
|
|
409
375
|
* @return {boolean}
|
|
410
376
|
*/
|
|
411
377
|
function longCheshvan(year) {
|
|
412
|
-
|
|
378
|
+
return daysInYear(year) % 10 === 5;
|
|
413
379
|
}
|
|
414
380
|
/**
|
|
415
381
|
* true if Kislev is short in Hebrew year
|
|
@@ -417,7 +383,7 @@ function longCheshvan(year) {
|
|
|
417
383
|
* @return {boolean}
|
|
418
384
|
*/
|
|
419
385
|
function shortKislev(year) {
|
|
420
|
-
|
|
386
|
+
return daysInYear(year) % 10 === 3;
|
|
421
387
|
}
|
|
422
388
|
/**
|
|
423
389
|
* Converts Hebrew month string name to numeric
|
|
@@ -425,116 +391,116 @@ function shortKislev(year) {
|
|
|
425
391
|
* @return {number}
|
|
426
392
|
*/
|
|
427
393
|
function monthFromName(monthName) {
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
394
|
+
if (typeof monthName === 'number') {
|
|
395
|
+
if (isNaN(monthName) || monthName < 1 || monthName > 14) {
|
|
396
|
+
throw new RangeError(`Invalid month name: ${monthName}`);
|
|
397
|
+
}
|
|
398
|
+
return monthName;
|
|
399
|
+
}
|
|
400
|
+
let c = monthName.trim().toLowerCase();
|
|
401
|
+
// If Hebrew month starts with a bet (for example `בתמוז`) then ignore it
|
|
402
|
+
if (c[0] === 'ב') {
|
|
403
|
+
c = c.substring(1);
|
|
404
|
+
}
|
|
405
|
+
/*
|
|
406
|
+
the Hebrew months are unique to their second letter
|
|
407
|
+
N Nisan (November?)
|
|
408
|
+
I Iyyar
|
|
409
|
+
E Elul
|
|
410
|
+
C Cheshvan
|
|
411
|
+
K Kislev
|
|
412
|
+
1 1Adar
|
|
413
|
+
2 2Adar
|
|
414
|
+
Si Sh Sivan, Shvat
|
|
415
|
+
Ta Ti Te Tamuz, Tishrei, Tevet
|
|
416
|
+
Av Ad Av, Adar
|
|
417
|
+
אב אד אי אל אב אדר אייר אלול
|
|
418
|
+
ח חשון
|
|
419
|
+
ט טבת
|
|
420
|
+
כ כסלו
|
|
421
|
+
נ ניסן
|
|
422
|
+
ס סיון
|
|
423
|
+
ש שבט
|
|
424
|
+
תמ תש תמוז תשרי
|
|
425
|
+
*/
|
|
426
|
+
switch (c[0]) {
|
|
427
|
+
case 'n':
|
|
428
|
+
case 'נ':
|
|
429
|
+
if (c[1] === 'o') {
|
|
430
|
+
break; /* this catches "november" */
|
|
431
|
+
}
|
|
432
|
+
return months.NISAN;
|
|
433
|
+
case 'i':
|
|
434
|
+
return months.IYYAR;
|
|
435
|
+
case 'e':
|
|
436
|
+
return months.ELUL;
|
|
437
|
+
case 'c':
|
|
438
|
+
case 'ח':
|
|
439
|
+
return months.CHESHVAN;
|
|
440
|
+
case 'k':
|
|
441
|
+
case 'כ':
|
|
442
|
+
return months.KISLEV;
|
|
443
|
+
case 's':
|
|
444
|
+
switch (c[1]) {
|
|
468
445
|
case 'i':
|
|
469
|
-
|
|
470
|
-
case '
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
case 'כ':
|
|
477
|
-
return months.KISLEV;
|
|
478
|
-
case 's':
|
|
479
|
-
switch (c[1]) {
|
|
480
|
-
case 'i':
|
|
481
|
-
return months.SIVAN;
|
|
482
|
-
case 'h':
|
|
483
|
-
return months.SHVAT;
|
|
484
|
-
}
|
|
485
|
-
break;
|
|
486
|
-
case 't':
|
|
487
|
-
switch (c[1]) {
|
|
488
|
-
case 'a':
|
|
489
|
-
return months.TAMUZ;
|
|
490
|
-
case 'i':
|
|
491
|
-
return months.TISHREI;
|
|
492
|
-
case 'e':
|
|
493
|
-
return months.TEVET;
|
|
494
|
-
}
|
|
495
|
-
break;
|
|
446
|
+
return months.SIVAN;
|
|
447
|
+
case 'h':
|
|
448
|
+
return months.SHVAT;
|
|
449
|
+
}
|
|
450
|
+
break;
|
|
451
|
+
case 't':
|
|
452
|
+
switch (c[1]) {
|
|
496
453
|
case 'a':
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
return months.
|
|
454
|
+
return months.TAMUZ;
|
|
455
|
+
case 'i':
|
|
456
|
+
return months.TISHREI;
|
|
457
|
+
case 'e':
|
|
458
|
+
return months.TEVET;
|
|
459
|
+
}
|
|
460
|
+
break;
|
|
461
|
+
case 'a':
|
|
462
|
+
switch (c[1]) {
|
|
463
|
+
case 'v':
|
|
464
|
+
return months.AV;
|
|
465
|
+
case 'd':
|
|
466
|
+
if (/(1|[^i]i|a|א)$/i.test(monthName)) {
|
|
467
|
+
return months.ADAR_I;
|
|
468
|
+
}
|
|
469
|
+
return months.ADAR_II;
|
|
470
|
+
}
|
|
471
|
+
break;
|
|
472
|
+
case 'ס':
|
|
473
|
+
return months.SIVAN;
|
|
474
|
+
case 'ט':
|
|
475
|
+
return months.TEVET;
|
|
476
|
+
case 'ש':
|
|
477
|
+
return months.SHVAT;
|
|
478
|
+
case 'א':
|
|
479
|
+
switch (c[1]) {
|
|
480
|
+
case 'ב':
|
|
481
|
+
return months.AV;
|
|
482
|
+
case 'ד':
|
|
483
|
+
if (/(1|[^i]i|a|א)$/i.test(monthName)) {
|
|
484
|
+
return months.ADAR_I;
|
|
485
|
+
}
|
|
486
|
+
return months.ADAR_II;
|
|
487
|
+
// else assume sheini
|
|
488
|
+
case 'י':
|
|
489
|
+
return months.IYYAR;
|
|
490
|
+
case 'ל':
|
|
491
|
+
return months.ELUL;
|
|
492
|
+
}
|
|
493
|
+
break;
|
|
494
|
+
case 'ת':
|
|
495
|
+
switch (c[1]) {
|
|
496
|
+
case 'מ':
|
|
497
|
+
return months.TAMUZ;
|
|
511
498
|
case 'ש':
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
case 'ד':
|
|
518
|
-
if (/(1|[^i]i|a|א)$/i.test(monthName)) {
|
|
519
|
-
return months.ADAR_I;
|
|
520
|
-
}
|
|
521
|
-
return months.ADAR_II; // else assume sheini
|
|
522
|
-
case 'י':
|
|
523
|
-
return months.IYYAR;
|
|
524
|
-
case 'ל':
|
|
525
|
-
return months.ELUL;
|
|
526
|
-
}
|
|
527
|
-
break;
|
|
528
|
-
case 'ת':
|
|
529
|
-
switch (c[1]) {
|
|
530
|
-
case 'מ':
|
|
531
|
-
return months.TAMUZ;
|
|
532
|
-
case 'ש':
|
|
533
|
-
return months.TISHREI;
|
|
534
|
-
}
|
|
535
|
-
break;
|
|
536
|
-
}
|
|
537
|
-
throw new RangeError(`Unable to parse month name: ${monthName}`);
|
|
499
|
+
return months.TISHREI;
|
|
500
|
+
}
|
|
501
|
+
break;
|
|
502
|
+
}
|
|
503
|
+
throw new RangeError(`Unable to parse month name: ${monthName}`);
|
|
538
504
|
}
|
|
539
505
|
|
|
540
506
|
const NISAN$3 = months.NISAN;
|
|
@@ -545,155 +511,145 @@ const SHVAT = months.SHVAT;
|
|
|
545
511
|
const ADAR_I$1 = months.ADAR_I;
|
|
546
512
|
const ADAR_II$1 = months.ADAR_II;
|
|
547
513
|
/**
|
|
548
|
-
* Returns true if the object is a
|
|
514
|
+
* Returns true if the object is a SimpleHebrewDate
|
|
549
515
|
* @private
|
|
550
516
|
* @param {Object} obj
|
|
551
517
|
*/
|
|
552
518
|
function isSimpleHebrewDate(obj) {
|
|
553
|
-
|
|
554
|
-
typeof obj.yy === 'number' &&
|
|
555
|
-
typeof obj.mm === 'number' &&
|
|
556
|
-
typeof obj.dd === 'number';
|
|
519
|
+
return typeof obj === 'object' && obj !== null && typeof obj.yy === 'number' && typeof obj.mm === 'number' && typeof obj.dd === 'number';
|
|
557
520
|
}
|
|
558
521
|
/**
|
|
559
522
|
* @private
|
|
560
523
|
*/
|
|
561
524
|
function toSimpleHebrewDate(obj) {
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
else {
|
|
573
|
-
throw new TypeError(`Argument not a Date: ${obj}`);
|
|
574
|
-
}
|
|
525
|
+
if (isSimpleHebrewDate(obj)) {
|
|
526
|
+
return obj;
|
|
527
|
+
} else if (typeof obj === 'number') {
|
|
528
|
+
return abs2hebrew(obj);
|
|
529
|
+
} else if (greg.isDate(obj)) {
|
|
530
|
+
const abs = greg.greg2abs(obj);
|
|
531
|
+
return abs2hebrew(abs);
|
|
532
|
+
} else {
|
|
533
|
+
throw new TypeError(`Argument not a Date: ${obj}`);
|
|
534
|
+
}
|
|
575
535
|
}
|
|
576
536
|
function getYahrzeitHD(hyear, date) {
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
hDeath.dd = 1;
|
|
611
|
-
}
|
|
612
|
-
hDeath.yy = hyear;
|
|
613
|
-
return hDeath;
|
|
537
|
+
let hDeath = toSimpleHebrewDate(date);
|
|
538
|
+
if (hyear <= hDeath.yy) {
|
|
539
|
+
// Hebrew year ${hyear} occurs on or before original date in ${hDeath.yy}
|
|
540
|
+
return undefined;
|
|
541
|
+
}
|
|
542
|
+
if (hDeath.mm === CHESHVAN && hDeath.dd === 30 && !longCheshvan(hDeath.yy + 1)) {
|
|
543
|
+
// If it's Heshvan 30 it depends on the first anniversary;
|
|
544
|
+
// if that was not Heshvan 30, use the day before Kislev 1.
|
|
545
|
+
hDeath = abs2hebrew(hebrew2abs(hyear, KISLEV$1, 1) - 1);
|
|
546
|
+
} else if (hDeath.mm === KISLEV$1 && hDeath.dd === 30 && shortKislev(hDeath.yy + 1)) {
|
|
547
|
+
// If it's Kislev 30 it depends on the first anniversary;
|
|
548
|
+
// if that was not Kislev 30, use the day before Teveth 1.
|
|
549
|
+
hDeath = abs2hebrew(hebrew2abs(hyear, TEVET$1, 1) - 1);
|
|
550
|
+
} else if (hDeath.mm === ADAR_II$1) {
|
|
551
|
+
// If it's Adar II, use the same day in last month of year (Adar or Adar II).
|
|
552
|
+
hDeath.mm = monthsInYear(hyear);
|
|
553
|
+
} else if (hDeath.mm === ADAR_I$1 && hDeath.dd === 30 && !isLeapYear(hyear)) {
|
|
554
|
+
// If it's the 30th in Adar I and year is not a leap year
|
|
555
|
+
// (so Adar has only 29 days), use the last day in Shevat.
|
|
556
|
+
hDeath.dd = 30;
|
|
557
|
+
hDeath.mm = SHVAT;
|
|
558
|
+
}
|
|
559
|
+
// In all other cases, use the normal anniversary of the date of death.
|
|
560
|
+
// advance day to rosh chodesh if needed
|
|
561
|
+
if (hDeath.mm === CHESHVAN && hDeath.dd === 30 && !longCheshvan(hyear)) {
|
|
562
|
+
hDeath.mm = KISLEV$1;
|
|
563
|
+
hDeath.dd = 1;
|
|
564
|
+
} else if (hDeath.mm === KISLEV$1 && hDeath.dd === 30 && shortKislev(hyear)) {
|
|
565
|
+
hDeath.mm = TEVET$1;
|
|
566
|
+
hDeath.dd = 1;
|
|
567
|
+
}
|
|
568
|
+
hDeath.yy = hyear;
|
|
569
|
+
return hDeath;
|
|
614
570
|
}
|
|
615
571
|
function getBirthdayHD(hyear, date) {
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
|
|
622
|
-
|
|
623
|
-
|
|
624
|
-
|
|
625
|
-
|
|
626
|
-
|
|
627
|
-
|
|
628
|
-
|
|
629
|
-
|
|
630
|
-
|
|
631
|
-
|
|
632
|
-
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
|
|
636
|
-
|
|
637
|
-
|
|
638
|
-
|
|
639
|
-
|
|
640
|
-
|
|
641
|
-
|
|
642
|
-
|
|
643
|
-
|
|
572
|
+
const orig = toSimpleHebrewDate(date);
|
|
573
|
+
const origYear = orig.yy;
|
|
574
|
+
if (hyear === origYear) {
|
|
575
|
+
return orig;
|
|
576
|
+
} else if (hyear < origYear) {
|
|
577
|
+
// Hebrew year ${hyear} occurs on or before original date in ${origYear}
|
|
578
|
+
return undefined;
|
|
579
|
+
}
|
|
580
|
+
const isOrigLeap = isLeapYear(origYear);
|
|
581
|
+
let month = orig.mm;
|
|
582
|
+
let day = orig.dd;
|
|
583
|
+
if (month === ADAR_I$1 && !isOrigLeap || month === ADAR_II$1 && isOrigLeap) {
|
|
584
|
+
month = monthsInYear(hyear);
|
|
585
|
+
} else if (month === CHESHVAN && day === 30 && !longCheshvan(hyear)) {
|
|
586
|
+
month = KISLEV$1;
|
|
587
|
+
day = 1;
|
|
588
|
+
} else if (month === KISLEV$1 && day === 30 && shortKislev(hyear)) {
|
|
589
|
+
month = TEVET$1;
|
|
590
|
+
day = 1;
|
|
591
|
+
} else if (month === ADAR_I$1 && day === 30 && isOrigLeap && !isLeapYear(hyear)) {
|
|
592
|
+
month = NISAN$3;
|
|
593
|
+
day = 1;
|
|
594
|
+
}
|
|
595
|
+
return {
|
|
596
|
+
yy: hyear,
|
|
597
|
+
mm: month,
|
|
598
|
+
dd: day
|
|
599
|
+
};
|
|
644
600
|
}
|
|
645
601
|
|
|
646
602
|
const GERESH = '׳';
|
|
647
603
|
const GERSHAYIM = '״';
|
|
648
604
|
const alefbet = {
|
|
649
|
-
|
|
650
|
-
|
|
651
|
-
|
|
652
|
-
|
|
653
|
-
|
|
654
|
-
|
|
655
|
-
|
|
656
|
-
|
|
657
|
-
|
|
658
|
-
|
|
659
|
-
|
|
660
|
-
|
|
661
|
-
|
|
662
|
-
|
|
663
|
-
|
|
664
|
-
|
|
665
|
-
|
|
666
|
-
|
|
667
|
-
|
|
668
|
-
|
|
669
|
-
|
|
670
|
-
|
|
605
|
+
א: 1,
|
|
606
|
+
ב: 2,
|
|
607
|
+
ג: 3,
|
|
608
|
+
ד: 4,
|
|
609
|
+
ה: 5,
|
|
610
|
+
ו: 6,
|
|
611
|
+
ז: 7,
|
|
612
|
+
ח: 8,
|
|
613
|
+
ט: 9,
|
|
614
|
+
י: 10,
|
|
615
|
+
כ: 20,
|
|
616
|
+
ל: 30,
|
|
617
|
+
מ: 40,
|
|
618
|
+
נ: 50,
|
|
619
|
+
ס: 60,
|
|
620
|
+
ע: 70,
|
|
621
|
+
פ: 80,
|
|
622
|
+
צ: 90,
|
|
623
|
+
ק: 100,
|
|
624
|
+
ר: 200,
|
|
625
|
+
ש: 300,
|
|
626
|
+
ת: 400
|
|
671
627
|
};
|
|
672
628
|
const heb2num = new Map();
|
|
673
629
|
const num2heb = new Map();
|
|
674
630
|
for (const [key, val] of Object.entries(alefbet)) {
|
|
675
|
-
|
|
676
|
-
|
|
631
|
+
heb2num.set(key, val);
|
|
632
|
+
num2heb.set(val, key);
|
|
677
633
|
}
|
|
678
634
|
function num2digits(num) {
|
|
679
|
-
|
|
680
|
-
|
|
681
|
-
|
|
682
|
-
|
|
683
|
-
|
|
684
|
-
|
|
685
|
-
|
|
686
|
-
|
|
687
|
-
|
|
688
|
-
|
|
689
|
-
|
|
690
|
-
|
|
691
|
-
|
|
692
|
-
}
|
|
693
|
-
digits.push(i);
|
|
694
|
-
num -= i;
|
|
635
|
+
const digits = [];
|
|
636
|
+
while (num > 0) {
|
|
637
|
+
if (num === 15 || num === 16) {
|
|
638
|
+
digits.push(9);
|
|
639
|
+
digits.push(num - 9);
|
|
640
|
+
break;
|
|
641
|
+
}
|
|
642
|
+
let incr = 100;
|
|
643
|
+
let i;
|
|
644
|
+
for (i = 400; i > num; i -= incr) {
|
|
645
|
+
if (i === incr) {
|
|
646
|
+
incr = incr / 10;
|
|
647
|
+
}
|
|
695
648
|
}
|
|
696
|
-
|
|
649
|
+
digits.push(i);
|
|
650
|
+
num -= i;
|
|
651
|
+
}
|
|
652
|
+
return digits;
|
|
697
653
|
}
|
|
698
654
|
/**
|
|
699
655
|
* Converts a numerical value to a string of Hebrew letters.
|
|
@@ -710,31 +666,31 @@ function num2digits(num) {
|
|
|
710
666
|
* @return {string}
|
|
711
667
|
*/
|
|
712
668
|
function gematriya(num) {
|
|
713
|
-
|
|
714
|
-
|
|
715
|
-
|
|
716
|
-
|
|
717
|
-
|
|
718
|
-
|
|
719
|
-
|
|
720
|
-
|
|
721
|
-
|
|
722
|
-
|
|
723
|
-
|
|
724
|
-
}
|
|
725
|
-
str += GERESH;
|
|
726
|
-
}
|
|
727
|
-
const digits = num2digits(num1 % 1000);
|
|
728
|
-
if (digits.length == 1) {
|
|
729
|
-
return str + num2heb.get(digits[0]) + GERESH;
|
|
669
|
+
const num0 = num;
|
|
670
|
+
const num1 = parseInt(num0, 10);
|
|
671
|
+
if (!num1) {
|
|
672
|
+
throw new TypeError(`invalid parameter to gematriya ${num}`);
|
|
673
|
+
}
|
|
674
|
+
let str = '';
|
|
675
|
+
const thousands = Math.floor(num1 / 1000);
|
|
676
|
+
if (thousands > 0 && thousands !== 5) {
|
|
677
|
+
const tdigits = num2digits(thousands);
|
|
678
|
+
for (const tdig of tdigits) {
|
|
679
|
+
str += num2heb.get(tdig);
|
|
730
680
|
}
|
|
731
|
-
|
|
732
|
-
|
|
733
|
-
|
|
734
|
-
|
|
735
|
-
|
|
681
|
+
str += GERESH;
|
|
682
|
+
}
|
|
683
|
+
const digits = num2digits(num1 % 1000);
|
|
684
|
+
if (digits.length === 1) {
|
|
685
|
+
return str + num2heb.get(digits[0]) + GERESH;
|
|
686
|
+
}
|
|
687
|
+
for (let i = 0; i < digits.length; i++) {
|
|
688
|
+
if (i + 1 === digits.length) {
|
|
689
|
+
str += GERSHAYIM;
|
|
736
690
|
}
|
|
737
|
-
|
|
691
|
+
str += num2heb.get(digits[i]);
|
|
692
|
+
}
|
|
693
|
+
return str;
|
|
738
694
|
}
|
|
739
695
|
/**
|
|
740
696
|
* Converts a string of Hebrew letters to a numerical value.
|
|
@@ -747,20 +703,189 @@ function gematriya(num) {
|
|
|
747
703
|
* @return {number}
|
|
748
704
|
*/
|
|
749
705
|
function gematriyaStrToNum(str) {
|
|
750
|
-
|
|
751
|
-
|
|
752
|
-
|
|
753
|
-
|
|
754
|
-
|
|
755
|
-
|
|
756
|
-
|
|
757
|
-
|
|
758
|
-
|
|
759
|
-
|
|
760
|
-
|
|
761
|
-
|
|
706
|
+
let num = 0;
|
|
707
|
+
const gereshIdx = str.indexOf(GERESH);
|
|
708
|
+
if (gereshIdx !== -1 && gereshIdx !== str.length - 1) {
|
|
709
|
+
const thousands = str.substring(0, gereshIdx);
|
|
710
|
+
num += gematriyaStrToNum(thousands) * 1000;
|
|
711
|
+
str = str.substring(gereshIdx);
|
|
712
|
+
}
|
|
713
|
+
for (const ch of str) {
|
|
714
|
+
const n = heb2num.get(ch);
|
|
715
|
+
if (typeof n === 'number') {
|
|
716
|
+
num += n;
|
|
717
|
+
}
|
|
718
|
+
}
|
|
719
|
+
return num;
|
|
720
|
+
}
|
|
721
|
+
|
|
722
|
+
const sefirot = {
|
|
723
|
+
en: {
|
|
724
|
+
infix: 'within ',
|
|
725
|
+
infix26: 'within ',
|
|
726
|
+
words: ['', 'Lovingkindness', 'Might', 'Beauty', 'Eternity', 'Splendor', 'Foundation', 'Majesty']
|
|
727
|
+
},
|
|
728
|
+
he: {
|
|
729
|
+
infix: 'שֶׁבְּ',
|
|
730
|
+
infix26: 'שֶׁבִּ',
|
|
731
|
+
words: ['', 'חֶֽסֶד', 'גְבוּרָה', 'תִּפאֶרֶת', 'נֶּֽצַח', 'הוֹד', 'יְּסוֹד', 'מַּלְכוּת']
|
|
732
|
+
},
|
|
733
|
+
translit: {
|
|
734
|
+
infix: "sheb'",
|
|
735
|
+
infix26: 'shebi',
|
|
736
|
+
words: ['', 'Chesed', 'Gevurah', 'Tiferet', 'Netzach', 'Hod', 'Yesod', 'Malkhut']
|
|
737
|
+
}
|
|
738
|
+
};
|
|
739
|
+
function checkDay(omerDay) {
|
|
740
|
+
if (omerDay < 1 || omerDay > 49) {
|
|
741
|
+
throw new RangeError(`Invalid Omer day ${omerDay}`);
|
|
742
|
+
}
|
|
743
|
+
}
|
|
744
|
+
function getWeeks(omerDay) {
|
|
745
|
+
const weekNum = Math.floor((omerDay - 1) / 7) + 1;
|
|
746
|
+
const daysWithinWeeks = omerDay % 7 || 7;
|
|
747
|
+
return [weekNum, daysWithinWeeks];
|
|
748
|
+
}
|
|
749
|
+
/**
|
|
750
|
+
* Returns the sefira. For example, on day 8
|
|
751
|
+
* חֶֽסֶד שֶׁבִּגְבוּרָה
|
|
752
|
+
* Chesed shebiGevurah
|
|
753
|
+
* Lovingkindness within Might
|
|
754
|
+
* @param omerDay the day of the omer, 1-49 inclusive
|
|
755
|
+
* @param lang `en` (English), `he` (Hebrew with nikud), or `translit` (Hebrew in Sephardic transliteration)
|
|
756
|
+
* @returns a string such as `Lovingkindness within Might` or `חֶֽסֶד שֶׁבִּגְבוּרָה`
|
|
757
|
+
*/
|
|
758
|
+
function omerSefira(omerDay, lang) {
|
|
759
|
+
checkDay(omerDay);
|
|
760
|
+
const [weekNum, daysWithinWeeks] = getWeeks(omerDay);
|
|
761
|
+
const config = sefirot[lang];
|
|
762
|
+
const week = config.words[weekNum];
|
|
763
|
+
const dayWithinWeek = config.words[daysWithinWeeks];
|
|
764
|
+
const infix = weekNum === 2 || weekNum === 6 ? config.infix26 : config.infix;
|
|
765
|
+
return (dayWithinWeek + ' ' + infix + week).normalize();
|
|
766
|
+
}
|
|
767
|
+
/**
|
|
768
|
+
* Returns a sentence with that evening's omer count
|
|
769
|
+
* @param omerDay the day of the omer, 1-49 inclusive
|
|
770
|
+
* @param lang `en` (English), `he` (Hebrew with nikud)
|
|
771
|
+
* @returns a string such as `Today is 10 days, which is 1 week and 3 days of the Omer`
|
|
772
|
+
* or `הַיוֹם עֲשָׂרָה יָמִים, שְׁהֵם שָׁבוּעַ אֶחָד וְשְׁלוֹשָׁה יָמִים לָעוֹמֶר`
|
|
773
|
+
*/
|
|
774
|
+
function omerTodayIs(omerDay, lang) {
|
|
775
|
+
checkDay(omerDay);
|
|
776
|
+
if (lang === 'en') {
|
|
777
|
+
return omerTodayIsEn(omerDay);
|
|
778
|
+
} else if (lang === 'he') {
|
|
779
|
+
return omerTodayIsHe(omerDay);
|
|
780
|
+
} else {
|
|
781
|
+
return undefined;
|
|
782
|
+
}
|
|
783
|
+
}
|
|
784
|
+
function omerTodayIsEn(omerDay) {
|
|
785
|
+
const [weekNumber, daysWithinWeeks] = getWeeks(omerDay);
|
|
786
|
+
const totalDaysStr = omerDay === 1 ? 'day' : 'days';
|
|
787
|
+
let str = `Today is ${omerDay} ${totalDaysStr}`;
|
|
788
|
+
if (weekNumber > 1 || omerDay === 7) {
|
|
789
|
+
const day7 = daysWithinWeeks === 7;
|
|
790
|
+
const numWeeks = day7 ? weekNumber : weekNumber - 1;
|
|
791
|
+
const weeksStr = numWeeks === 1 ? 'week' : 'weeks';
|
|
792
|
+
str += `, which is ${numWeeks} ${weeksStr}`;
|
|
793
|
+
if (!day7) {
|
|
794
|
+
const daysStr = daysWithinWeeks === 1 ? 'day' : 'days';
|
|
795
|
+
str += ` and ${daysWithinWeeks} ${daysStr}`;
|
|
796
|
+
}
|
|
797
|
+
}
|
|
798
|
+
return str + ' of the Omer';
|
|
799
|
+
}
|
|
800
|
+
// adapted from pip hdate package (GPL)
|
|
801
|
+
// https://github.com/py-libhdate/py-libhdate/blob/master/hdate/date.py
|
|
802
|
+
const tens = ['', 'עֲשָׂרָה', 'עֶשְׂרִים', 'שְׁלוֹשִׁים', 'אַרְבָּעִים'];
|
|
803
|
+
const ones = ['', 'אֶחָד', 'שְׁנַיִם', 'שְׁלוֹשָׁה', 'אַרְבָּעָה', 'חֲמִשָּׁה', 'שִׁשָּׁה', 'שִׁבְעָה', 'שְׁמוֹנָה', 'תִּשְׁעָה'];
|
|
804
|
+
const shnei = 'שְׁנֵי';
|
|
805
|
+
const yamim = 'יָמִים';
|
|
806
|
+
const shneiYamim = shnei + ' ' + yamim;
|
|
807
|
+
const shavuot = 'שָׁבוּעוֹת';
|
|
808
|
+
const yom = 'יוֹם';
|
|
809
|
+
const yomEchad = yom + ' ' + ones[1];
|
|
810
|
+
function omerTodayIsHe(omerDay) {
|
|
811
|
+
const ten = Math.floor(omerDay / 10);
|
|
812
|
+
const one = omerDay % 10;
|
|
813
|
+
let str = 'הַיּוֹם ';
|
|
814
|
+
if (10 < omerDay && omerDay < 20) {
|
|
815
|
+
str += ones[one] + ' עָשָׂר';
|
|
816
|
+
} else if (omerDay > 9) {
|
|
817
|
+
str += ones[one];
|
|
818
|
+
if (one) {
|
|
819
|
+
str += ' ';
|
|
820
|
+
str += ten === 3 ? 'וּ' : 'וְ';
|
|
821
|
+
}
|
|
822
|
+
}
|
|
823
|
+
if (omerDay > 2) {
|
|
824
|
+
if (omerDay > 20 || omerDay === 10 || omerDay === 20) {
|
|
825
|
+
str += tens[ten];
|
|
826
|
+
}
|
|
827
|
+
if (omerDay < 11) {
|
|
828
|
+
str += ones[one] + ' ' + yamim + ' ';
|
|
829
|
+
} else {
|
|
830
|
+
str += ' ' + yom + ' ';
|
|
831
|
+
}
|
|
832
|
+
} else if (omerDay === 1) {
|
|
833
|
+
str += yomEchad + ' ';
|
|
834
|
+
} else {
|
|
835
|
+
// omer == 2
|
|
836
|
+
str += shneiYamim + ' ';
|
|
837
|
+
}
|
|
838
|
+
if (omerDay > 6) {
|
|
839
|
+
str = str.trim(); // remove trailing space before comma
|
|
840
|
+
str += ', שְׁהֵם ';
|
|
841
|
+
const weeks = Math.floor(omerDay / 7);
|
|
842
|
+
const days = omerDay % 7;
|
|
843
|
+
if (weeks > 2) {
|
|
844
|
+
str += ones[weeks] + ' ' + shavuot + ' ';
|
|
845
|
+
} else if (weeks === 1) {
|
|
846
|
+
str += 'שָׁבֽוּעַ' + ' ' + ones[1] + ' ';
|
|
847
|
+
} else {
|
|
848
|
+
// weeks == 2
|
|
849
|
+
str += shnei + ' ' + shavuot + ' ';
|
|
850
|
+
}
|
|
851
|
+
if (days) {
|
|
852
|
+
if (days === 2 || days === 3) {
|
|
853
|
+
str += 'וּ';
|
|
854
|
+
} else if (days === 5) {
|
|
855
|
+
str += 'וַ';
|
|
856
|
+
} else {
|
|
857
|
+
str += 'וְ';
|
|
858
|
+
}
|
|
859
|
+
if (days > 2) {
|
|
860
|
+
str += ones[days] + ' ' + yamim + ' ';
|
|
861
|
+
} else if (days === 1) {
|
|
862
|
+
str += yomEchad + ' ';
|
|
863
|
+
} else {
|
|
864
|
+
// days == 2
|
|
865
|
+
str += shneiYamim + ' ';
|
|
866
|
+
}
|
|
762
867
|
}
|
|
763
|
-
|
|
868
|
+
}
|
|
869
|
+
str += 'לָעֽוֹמֶר';
|
|
870
|
+
return str.normalize();
|
|
871
|
+
}
|
|
872
|
+
/**
|
|
873
|
+
* Returns an emoji number symbol with a circle, for example `㊲`
|
|
874
|
+
* from the “Enclosed CJK Letters and Months” block of the Unicode standard
|
|
875
|
+
* @param omerDay the day of the omer, 1-49 inclusive
|
|
876
|
+
* @returns a single Unicode character from `①` through `㊾`
|
|
877
|
+
*/
|
|
878
|
+
function omerEmoji(omerDay) {
|
|
879
|
+
checkDay(omerDay);
|
|
880
|
+
if (omerDay <= 20) {
|
|
881
|
+
return String.fromCodePoint(9312 + omerDay - 1);
|
|
882
|
+
} else if (omerDay <= 35) {
|
|
883
|
+
// between 21 and 35 inclusive
|
|
884
|
+
return String.fromCodePoint(12881 + omerDay - 21);
|
|
885
|
+
} else {
|
|
886
|
+
// between 36 and 49 inclusive
|
|
887
|
+
return String.fromCodePoint(12977 + omerDay - 36);
|
|
888
|
+
}
|
|
764
889
|
}
|
|
765
890
|
|
|
766
891
|
const noopLocale = {
|
|
@@ -8374,9 +8499,6 @@ class MoladEvent extends Event {
|
|
|
8374
8499
|
}
|
|
8375
8500
|
}
|
|
8376
8501
|
|
|
8377
|
-
const sefirot = [null, 'Lovingkindness', 'Might', 'Beauty', 'Eternity', 'Splendor', 'Foundation', 'Majesty'];
|
|
8378
|
-
const sefirotTranslit = [null, 'Chesed', 'Gevurah', 'Tiferet', 'Netzach', 'Hod', 'Yesod', 'Malkhut'];
|
|
8379
|
-
|
|
8380
8502
|
/** Represents a day 1-49 of counting the Omer from Pesach to Shavuot */
|
|
8381
8503
|
class OmerEvent extends Event {
|
|
8382
8504
|
/**
|
|
@@ -8397,39 +8519,10 @@ class OmerEvent extends Event {
|
|
|
8397
8519
|
* @return {string}
|
|
8398
8520
|
*/
|
|
8399
8521
|
sefira(lang = 'en') {
|
|
8400
|
-
if (lang
|
|
8401
|
-
|
|
8402
|
-
} else if (lang === 'translit') {
|
|
8403
|
-
return this.sefiraTranslit();
|
|
8404
|
-
} else {
|
|
8405
|
-
const week = sefirot[this.weekNumber];
|
|
8406
|
-
const dayWithinWeek = sefirot[this.daysWithinWeeks];
|
|
8407
|
-
return `${dayWithinWeek} within ${week}`;
|
|
8522
|
+
if (lang !== 'he' && lang !== 'translit') {
|
|
8523
|
+
lang = 'en';
|
|
8408
8524
|
}
|
|
8409
|
-
|
|
8410
|
-
/**
|
|
8411
|
-
* @private
|
|
8412
|
-
* @return {string}
|
|
8413
|
-
*/
|
|
8414
|
-
sefiraTranslit() {
|
|
8415
|
-
const weekNum = this.weekNumber;
|
|
8416
|
-
const translitWeek = sefirotTranslit[weekNum];
|
|
8417
|
-
const translitDayWithinWeek = sefirotTranslit[this.daysWithinWeeks];
|
|
8418
|
-
const translitPrefix = weekNum === 2 || weekNum === 6 ? 'shebi' : `sheb'`;
|
|
8419
|
-
return `${translitDayWithinWeek} ${translitPrefix}${translitWeek}`;
|
|
8420
|
-
}
|
|
8421
|
-
/**
|
|
8422
|
-
* @private
|
|
8423
|
-
* @return {string}
|
|
8424
|
-
*/
|
|
8425
|
-
sefiraHe() {
|
|
8426
|
-
const weekNum = this.weekNumber;
|
|
8427
|
-
const week = sefirot[weekNum];
|
|
8428
|
-
const dayWithinWeek = sefirot[this.daysWithinWeeks];
|
|
8429
|
-
const heWeek = Locale.gettext(week, 'he');
|
|
8430
|
-
const heDayWithinWeek = Locale.gettext(dayWithinWeek, 'he');
|
|
8431
|
-
const hePrefix = weekNum === 2 || weekNum === 6 ? 'שֶׁבִּ' : 'שֶׁבְּ';
|
|
8432
|
-
return `${heDayWithinWeek} ${hePrefix}${heWeek}`.normalize();
|
|
8525
|
+
return omerSefira(this.omer, lang);
|
|
8433
8526
|
}
|
|
8434
8527
|
/**
|
|
8435
8528
|
* @todo use gettext()
|
|
@@ -8453,16 +8546,7 @@ class OmerEvent extends Event {
|
|
|
8453
8546
|
/** @return {string} */
|
|
8454
8547
|
getEmoji() {
|
|
8455
8548
|
if (typeof this.emoji === 'string') return this.emoji;
|
|
8456
|
-
|
|
8457
|
-
if (number <= 20) {
|
|
8458
|
-
return String.fromCodePoint(9312 + number - 1);
|
|
8459
|
-
} else if (number <= 35) {
|
|
8460
|
-
// between 21 and 35 inclusive
|
|
8461
|
-
return String.fromCodePoint(12881 + number - 21);
|
|
8462
|
-
} else {
|
|
8463
|
-
// between 36 and 49 inclusive
|
|
8464
|
-
return String.fromCodePoint(12977 + number - 36);
|
|
8465
|
-
}
|
|
8549
|
+
return omerEmoji(this.omer);
|
|
8466
8550
|
}
|
|
8467
8551
|
/** @return {number} */
|
|
8468
8552
|
getWeeks() {
|
|
@@ -8483,23 +8567,12 @@ class OmerEvent extends Event {
|
|
|
8483
8567
|
locale = locale.toLowerCase();
|
|
8484
8568
|
}
|
|
8485
8569
|
if (locale === 'he') {
|
|
8486
|
-
return
|
|
8570
|
+
return omerTodayIs(this.omer, 'he');
|
|
8487
8571
|
} else if (locale === 'he-x-nonikud') {
|
|
8488
|
-
|
|
8489
|
-
|
|
8490
|
-
const totalDaysStr = this.omer === 1 ? 'day' : 'days';
|
|
8491
|
-
let str = `Today is ${this.omer} ${totalDaysStr}`;
|
|
8492
|
-
if (this.weekNumber > 1 || this.omer === 7) {
|
|
8493
|
-
const day7 = this.daysWithinWeeks === 7;
|
|
8494
|
-
const numWeeks = day7 ? this.weekNumber : this.weekNumber - 1;
|
|
8495
|
-
const weeksStr = numWeeks === 1 ? 'week' : 'weeks';
|
|
8496
|
-
str += `, which is ${numWeeks} ${weeksStr}`;
|
|
8497
|
-
if (!day7) {
|
|
8498
|
-
const daysStr = this.daysWithinWeeks === 1 ? 'day' : 'days';
|
|
8499
|
-
str += ` and ${this.daysWithinWeeks} ${daysStr}`;
|
|
8500
|
-
}
|
|
8572
|
+
const str = omerTodayIs(this.omer, 'he');
|
|
8573
|
+
return Locale.hebrewStripNikkud(str);
|
|
8501
8574
|
}
|
|
8502
|
-
return
|
|
8575
|
+
return omerTodayIs(this.omer, 'en');
|
|
8503
8576
|
}
|
|
8504
8577
|
/** @return {string} */
|
|
8505
8578
|
url() {
|
|
@@ -8507,79 +8580,6 @@ class OmerEvent extends Event {
|
|
|
8507
8580
|
}
|
|
8508
8581
|
}
|
|
8509
8582
|
|
|
8510
|
-
// adapted from pip hdate package (GPL)
|
|
8511
|
-
// https://github.com/py-libhdate/py-libhdate/blob/master/hdate/date.py
|
|
8512
|
-
|
|
8513
|
-
const tens = ['', 'עֲשָׂרָה', 'עֶשְׂרִים', 'שְׁלוֹשִׁים', 'אַרְבָּעִים'];
|
|
8514
|
-
const ones = ['', 'אֶחָד', 'שְׁנַיִם', 'שְׁלוֹשָׁה', 'אַרְבָּעָה', 'חֲמִשָׁה', 'שִׁשָׁה', 'שִׁבְעָה', 'שְׁמוֹנָה', 'תִּשְׁעָה'];
|
|
8515
|
-
const shnei = 'שְׁנֵי';
|
|
8516
|
-
const yamim = 'יָמִים';
|
|
8517
|
-
const shneiYamim = shnei + ' ' + yamim;
|
|
8518
|
-
const shavuot = 'שָׁבוּעוֹת';
|
|
8519
|
-
const yom = 'יוֹם';
|
|
8520
|
-
const yomEchad = yom + ' ' + ones[1];
|
|
8521
|
-
|
|
8522
|
-
/**
|
|
8523
|
-
* @private
|
|
8524
|
-
* @param {number} omer
|
|
8525
|
-
* @return {string}
|
|
8526
|
-
*/
|
|
8527
|
-
function getTodayIsHe(omer) {
|
|
8528
|
-
const ten = Math.floor(omer / 10);
|
|
8529
|
-
const one = omer % 10;
|
|
8530
|
-
let str = 'הַיוֹם ';
|
|
8531
|
-
if (10 < omer && omer < 20) {
|
|
8532
|
-
str += ones[one] + ' עָשָׂר';
|
|
8533
|
-
} else if (omer > 9) {
|
|
8534
|
-
str += ones[one];
|
|
8535
|
-
if (one) {
|
|
8536
|
-
str += ' וְ';
|
|
8537
|
-
}
|
|
8538
|
-
}
|
|
8539
|
-
if (omer > 2) {
|
|
8540
|
-
if (omer > 20 || omer === 10 || omer === 20) {
|
|
8541
|
-
str += tens[ten];
|
|
8542
|
-
}
|
|
8543
|
-
if (omer < 11) {
|
|
8544
|
-
str += ones[one] + ' ' + yamim + ' ';
|
|
8545
|
-
} else {
|
|
8546
|
-
str += ' ' + yom + ' ';
|
|
8547
|
-
}
|
|
8548
|
-
} else if (omer === 1) {
|
|
8549
|
-
str += yomEchad + ' ';
|
|
8550
|
-
} else {
|
|
8551
|
-
// omer == 2
|
|
8552
|
-
str += shneiYamim + ' ';
|
|
8553
|
-
}
|
|
8554
|
-
if (omer > 6) {
|
|
8555
|
-
str = str.trim(); // remove trailing space before comma
|
|
8556
|
-
str += ', שְׁהֵם ';
|
|
8557
|
-
const weeks = Math.floor(omer / 7);
|
|
8558
|
-
const days = omer % 7;
|
|
8559
|
-
if (weeks > 2) {
|
|
8560
|
-
str += ones[weeks] + ' ' + shavuot + ' ';
|
|
8561
|
-
} else if (weeks == 1) {
|
|
8562
|
-
str += 'שָׁבוּעַ' + ' ' + ones[1] + ' ';
|
|
8563
|
-
} else {
|
|
8564
|
-
// weeks == 2
|
|
8565
|
-
str += shnei + ' ' + shavuot + ' ';
|
|
8566
|
-
}
|
|
8567
|
-
if (days) {
|
|
8568
|
-
str += 'וְ';
|
|
8569
|
-
if (days > 2) {
|
|
8570
|
-
str += ones[days] + ' ' + yamim + ' ';
|
|
8571
|
-
} else if (days == 1) {
|
|
8572
|
-
str += yomEchad + ' ';
|
|
8573
|
-
} else {
|
|
8574
|
-
// days == 2
|
|
8575
|
-
str += shneiYamim + ' ';
|
|
8576
|
-
}
|
|
8577
|
-
}
|
|
8578
|
-
}
|
|
8579
|
-
str += 'לָעוֹמֶר';
|
|
8580
|
-
return str.normalize();
|
|
8581
|
-
}
|
|
8582
|
-
|
|
8583
8583
|
class QuickLRU extends Map {
|
|
8584
8584
|
#size = 0;
|
|
8585
8585
|
#cache = new Map();
|
|
@@ -10353,7 +10353,7 @@ class DailyLearning {
|
|
|
10353
10353
|
}
|
|
10354
10354
|
|
|
10355
10355
|
// DO NOT EDIT THIS AUTO-GENERATED FILE!
|
|
10356
|
-
const version = '5.3.
|
|
10356
|
+
const version = '5.3.4';
|
|
10357
10357
|
|
|
10358
10358
|
const NONE$1 = 0;
|
|
10359
10359
|
const HALF = 1;
|