Convert consecutive FSF copyright years to ranges.
[bpt/emacs.git] / lisp / calendar / cal-hebrew.el
CommitLineData
3afbc435 1;;; cal-hebrew.el --- calendar functions for the Hebrew calendar
4b112ac4 2
73b0cd50 3;; Copyright (C) 1995, 1997, 2001-2011 Free Software Foundation, Inc.
4b112ac4 4
85d0ba86 5;; Author: Nachum Dershowitz <nachum@cs.uiuc.edu>
6b789b4b 6;; Edward M. Reingold <reingold@cs.uiuc.edu>
dbfca9c4 7;; Maintainer: Glenn Morris <rgm@gnu.org>
4b112ac4
ER
8;; Keywords: calendar
9;; Human-Keywords: Hebrew calendar, calendar, diary
bd78fa1d 10;; Package: calendar
4b112ac4
ER
11
12;; This file is part of GNU Emacs.
13
2ed66575 14;; GNU Emacs is free software: you can redistribute it and/or modify
4b112ac4 15;; it under the terms of the GNU General Public License as published by
2ed66575
GM
16;; the Free Software Foundation, either version 3 of the License, or
17;; (at your option) any later version.
4b112ac4
ER
18
19;; GNU Emacs is distributed in the hope that it will be useful,
20;; but WITHOUT ANY WARRANTY; without even the implied warranty of
21;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
22;; GNU General Public License for more details.
23
24;; You should have received a copy of the GNU General Public License
2ed66575 25;; along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>.
4b112ac4
ER
26
27;;; Commentary:
28
618c03c1 29;; See calendar.el.
a96a5fca 30
4b112ac4
ER
31;;; Code:
32
da3fc020 33(require 'calendar)
4b112ac4 34
1a9f2b77
GM
35(define-obsolete-variable-alias 'diary-sabbath-candles-minutes
36 'diary-hebrew-sabbath-candles-minutes "23.1")
37
87e1e9cd
GM
38(defcustom diary-hebrew-sabbath-candles-minutes 18
39 "Number of minutes before sunset for sabbath candle lighting.
40Used by `diary-hebrew-sabbath-candles'."
41 :group 'diary
42 :type 'integer
43 :version "21.1")
44
87e1e9cd
GM
45;; End of user options.
46
8fc9e5a0 47(defun calendar-hebrew-leap-year-p (year)
6afe7cdd 48 "Non-nil if YEAR is a Hebrew calendar leap year."
4b112ac4
ER
49 (< (% (1+ (* 7 year)) 19) 7))
50
8fc9e5a0 51(defun calendar-hebrew-last-month-of-year (year)
4b112ac4 52 "The last month of the Hebrew calendar YEAR."
8fc9e5a0 53 (if (calendar-hebrew-leap-year-p year)
4b112ac4
ER
54 13
55 12))
56
8fc9e5a0 57(defun calendar-hebrew-elapsed-days (year)
6b789b4b
GM
58 "Days to mean conjunction of Tishri of Hebrew YEAR.
59Measured from Sunday before start of Hebrew calendar."
4b112ac4 60 (let* ((months-elapsed
9c68082d
GM
61 (+ (* 235 (/ (1- year) 19)) ; months in complete cycles so far
62 (* 12 (% (1- year) 19)) ; regular months in this cycle
63 (/ (1+ (* 7 (% (1- year) 19))) 19))) ; leap months this cycle
4b112ac4
ER
64 (parts-elapsed (+ 204 (* 793 (% months-elapsed 1080))))
65 (hours-elapsed (+ 5
66 (* 12 months-elapsed)
67 (* 793 (/ months-elapsed 1080))
68 (/ parts-elapsed 1080)))
71ea27ee 69 (parts ; conjunction parts
4b112ac4 70 (+ (* 1080 (% hours-elapsed 24)) (% parts-elapsed 1080)))
71ea27ee 71 (day ; conjunction day
4b112ac4
ER
72 (+ 1 (* 29 months-elapsed) (/ hours-elapsed 24)))
73 (alternative-day
9c68082d 74 (if (or (>= parts 19440) ; if the new moon is at or after midday
71ea27ee 75 (and (= (% day 7) 2) ; ...or is on a Tuesday...
9c68082d 76 (>= parts 9924) ; at 9 hours, 204 parts or later...
71ea27ee 77 ;; of a common year...
8fc9e5a0 78 (not (calendar-hebrew-leap-year-p year)))
71ea27ee 79 (and (= (% day 7) 1) ; ...or is on a Monday...
9c68082d 80 (>= parts 16789) ; at 15 hours, 589 parts or later...
71ea27ee 81 ;; at the end of a leap year.
8fc9e5a0 82 (calendar-hebrew-leap-year-p (1- year))))
71ea27ee 83 ;; Then postpone Rosh HaShanah one day.
4b112ac4 84 (1+ day)
71ea27ee 85 ;; Else:
4b112ac4 86 day)))
9c68082d
GM
87 ;; If Rosh HaShanah would occur on Sunday, Wednesday, or Friday
88 (if (memq (% alternative-day 7) (list 0 3 5))
71ea27ee 89 ;; Then postpone it one (more) day and return.
4b112ac4 90 (1+ alternative-day)
9c68082d 91 ;; Else return.
4b112ac4
ER
92 alternative-day)))
93
8fc9e5a0 94(defun calendar-hebrew-days-in-year (year)
4b112ac4 95 "Number of days in Hebrew YEAR."
8fc9e5a0
GM
96 (- (calendar-hebrew-elapsed-days (1+ year))
97 (calendar-hebrew-elapsed-days year)))
4b112ac4 98
8fc9e5a0 99(defun calendar-hebrew-long-heshvan-p (year)
6afe7cdd 100 "Non-nil if Heshvan is long in Hebrew YEAR."
8fc9e5a0 101 (= (% (calendar-hebrew-days-in-year year) 10) 5))
4b112ac4 102
8fc9e5a0 103(defun calendar-hebrew-short-kislev-p (year)
6afe7cdd 104 "Non-nil if Kislev is short in Hebrew YEAR."
8fc9e5a0 105 (= (% (calendar-hebrew-days-in-year year) 10) 3))
4b112ac4 106
8fc9e5a0 107(defun calendar-hebrew-last-day-of-month (month year)
da3fc020
GM
108 "The last day of MONTH in YEAR."
109 (if (or (memq month (list 2 4 6 10 13))
8fc9e5a0
GM
110 (and (= month 12) (not (calendar-hebrew-leap-year-p year)))
111 (and (= month 8) (not (calendar-hebrew-long-heshvan-p year)))
112 (and (= month 9) (calendar-hebrew-short-kislev-p year)))
da3fc020
GM
113 29
114 30))
115
8fc9e5a0 116(defun calendar-hebrew-to-absolute (date)
4b112ac4
ER
117 "Absolute date of Hebrew DATE.
118The absolute date is the number of days elapsed since the (imaginary)
119Gregorian date Sunday, December 31, 1 BC."
e803eab7
GM
120 (let ((month (calendar-extract-month date))
121 (day (calendar-extract-day date))
122 (year (calendar-extract-year date)))
71ea27ee
GM
123 (+ day ; days so far this month
124 (if (< month 7) ; before Tishri
125 ;; Then add days in prior months this year before and after Nisan.
4b112ac4 126 (+ (calendar-sum
8fc9e5a0
GM
127 m 7 (<= m (calendar-hebrew-last-month-of-year year))
128 (calendar-hebrew-last-day-of-month m year))
4b112ac4
ER
129 (calendar-sum
130 m 1 (< m month)
8fc9e5a0 131 (calendar-hebrew-last-day-of-month m year)))
71ea27ee 132 ;; Else add days in prior months this year.
4b112ac4
ER
133 (calendar-sum
134 m 7 (< m month)
8fc9e5a0
GM
135 (calendar-hebrew-last-day-of-month m year)))
136 (calendar-hebrew-elapsed-days year) ; days in prior years
71ea27ee 137 -1373429))) ; days elapsed before absolute date 1
4b112ac4 138
8fc9e5a0
GM
139(define-obsolete-function-alias 'calendar-absolute-from-hebrew
140 'calendar-hebrew-to-absolute "23.1")
141
da3fc020
GM
142(defun calendar-hebrew-from-absolute (date)
143 "Compute the Hebrew date (month day year) corresponding to absolute DATE.
144The absolute date is the number of days elapsed since the (imaginary)
145Gregorian date Sunday, December 31, 1 BC."
146 (let* ((greg-date (calendar-gregorian-from-absolute date))
e803eab7 147 (year (+ 3760 (calendar-extract-year greg-date)))
da3fc020 148 (month (aref [9 10 11 12 1 2 3 4 7 7 7 8]
e803eab7 149 (1- (calendar-extract-month greg-date))))
6b789b4b 150 (length (progn
8fc9e5a0 151 (while (>= date (calendar-hebrew-to-absolute
6b789b4b
GM
152 (list 7 1 (1+ year))))
153 (setq year (1+ year)))
8fc9e5a0 154 (calendar-hebrew-last-month-of-year year)))
28c02796 155 day)
6b789b4b 156 (while (> date
8fc9e5a0 157 (calendar-hebrew-to-absolute
6b789b4b 158 (list month
8fc9e5a0 159 (calendar-hebrew-last-day-of-month month year)
6b789b4b
GM
160 year)))
161 (setq month (1+ (% month length))))
da3fc020 162 (setq day (1+
8fc9e5a0 163 (- date (calendar-hebrew-to-absolute (list month 1 year)))))
da3fc020
GM
164 (list month day year)))
165
711d00e7 166(defconst calendar-hebrew-month-name-array-common-year
4b112ac4 167 ["Nisan" "Iyar" "Sivan" "Tammuz" "Av" "Elul" "Tishri"
da3fc020 168 "Heshvan" "Kislev" "Teveth" "Shevat" "Adar"]
71ea27ee 169 "Array of strings giving the names of the Hebrew months in a common year.")
4b112ac4 170
711d00e7 171(defconst calendar-hebrew-month-name-array-leap-year
4b112ac4 172 ["Nisan" "Iyar" "Sivan" "Tammuz" "Av" "Elul" "Tishri"
da3fc020 173 "Heshvan" "Kislev" "Teveth" "Shevat" "Adar I" "Adar II"]
71ea27ee 174 "Array of strings giving the names of the Hebrew months in a leap year.")
4b112ac4 175
28b3c0f5 176;;;###cal-autoload
4b112ac4
ER
177(defun calendar-hebrew-date-string (&optional date)
178 "String of Hebrew date before sunset of Gregorian DATE.
179Defaults to today's date if DATE is not given.
180Driven by the variable `calendar-date-display-form'."
181 (let* ((hebrew-date (calendar-hebrew-from-absolute
182 (calendar-absolute-from-gregorian
183 (or date (calendar-current-date)))))
184 (calendar-month-name-array
e803eab7 185 (if (calendar-hebrew-leap-year-p (calendar-extract-year hebrew-date))
4b112ac4
ER
186 calendar-hebrew-month-name-array-leap-year
187 calendar-hebrew-month-name-array-common-year)))
188 (calendar-date-string hebrew-date nil t)))
189
28b3c0f5 190;;;###cal-autoload
8fc9e5a0 191(defun calendar-hebrew-print-date ()
4b112ac4
ER
192 "Show the Hebrew calendar equivalent of the date under the cursor."
193 (interactive)
194 (message "Hebrew date (until sunset): %s"
195 (calendar-hebrew-date-string (calendar-cursor-to-date t))))
196
8fc9e5a0
GM
197(define-obsolete-function-alias 'calendar-print-hebrew-date
198 'calendar-hebrew-print-date "23.1")
199
200(defun calendar-hebrew-yahrzeit (death-date year)
4b112ac4 201 "Absolute date of the anniversary of Hebrew DEATH-DATE in Hebrew YEAR."
e803eab7
GM
202 (let ((death-day (calendar-extract-day death-date))
203 (death-month (calendar-extract-month death-date))
204 (death-year (calendar-extract-year death-date)))
4b112ac4
ER
205 (cond
206 ;; If it's Heshvan 30 it depends on the first anniversary; if
207 ;; that was not Heshvan 30, use the day before Kislev 1.
208 ((and (= death-month 8)
209 (= death-day 30)
8fc9e5a0
GM
210 (not (calendar-hebrew-long-heshvan-p (1+ death-year))))
211 (1- (calendar-hebrew-to-absolute (list 9 1 year))))
9c68082d
GM
212 ;; If it's Kislev 30 it depends on the first anniversary; if that
213 ;; was not Kislev 30, use the day before Teveth 1.
4b112ac4
ER
214 ((and (= death-month 9)
215 (= death-day 30)
8fc9e5a0
GM
216 (calendar-hebrew-short-kislev-p (1+ death-year)))
217 (1- (calendar-hebrew-to-absolute (list 10 1 year))))
9c68082d
GM
218 ;; If it's Adar II, use the same day in last month of year (Adar
219 ;; or Adar II).
4b112ac4 220 ((= death-month 13)
8fc9e5a0
GM
221 (calendar-hebrew-to-absolute
222 (list (calendar-hebrew-last-month-of-year year) death-day year)))
9c68082d
GM
223 ;; If it's the 30th in Adar I and year is not a leap year (so
224 ;; Adar has only 29 days), use the last day in Shevat.
4b112ac4
ER
225 ((and (= death-day 30)
226 (= death-month 12)
8fc9e5a0
GM
227 (not (calendar-hebrew-leap-year-p year)))
228 (calendar-hebrew-to-absolute (list 11 30 year)))
4b112ac4 229 ;; In all other cases, use the normal anniversary of the date of death.
8fc9e5a0 230 (t (calendar-hebrew-to-absolute
4b112ac4
ER
231 (list death-month death-day year))))))
232
8fc9e5a0
GM
233(define-obsolete-function-alias 'hebrew-calendar-yahrzeit
234 'calendar-hebrew-yahrzeit "23.1")
235
42281b7b
GM
236(defun calendar-hebrew-read-date ()
237 "Interactively read the arguments for a Hebrew date command.
238Reads a year, month, and day."
28c02796
GM
239 (let* ((today (calendar-current-date))
240 (year (calendar-read
241 "Hebrew calendar year (>3760): "
242 (lambda (x) (> x 3760))
d92bcf94 243 (number-to-string
e803eab7 244 (calendar-extract-year
28c02796
GM
245 (calendar-hebrew-from-absolute
246 (calendar-absolute-from-gregorian today))))))
8fc9e5a0 247 (month-array (if (calendar-hebrew-leap-year-p year)
28c02796
GM
248 calendar-hebrew-month-name-array-leap-year
249 calendar-hebrew-month-name-array-common-year))
250 (completion-ignore-case t)
251 (month (cdr (assoc-string
252 (completing-read
253 "Hebrew calendar month name: "
254 (mapcar 'list (append month-array nil))
255 (if (= year 3761)
256 (lambda (x)
257 (let ((m (cdr
258 (assoc-string
259 (car x)
260 (calendar-make-alist month-array)
261 t))))
262 (< 0
8fc9e5a0 263 (calendar-hebrew-to-absolute
28c02796 264 (list m
8fc9e5a0 265 (calendar-hebrew-last-day-of-month
28c02796
GM
266 m year)
267 year))))))
268 t)
269 (calendar-make-alist month-array 1) t)))
8fc9e5a0 270 (last (calendar-hebrew-last-day-of-month month year))
28c02796
GM
271 (first (if (and (= year 3761) (= month 10))
272 18 1))
273 (day (calendar-read
274 (format "Hebrew calendar day (%d-%d): "
275 first last)
276 (lambda (x) (and (<= first x) (<= x last))))))
277 (list (list month day year))))
278
28b3c0f5 279;;;###cal-autoload
8fc9e5a0 280(defun calendar-hebrew-goto-date (date &optional noecho)
8f11970d 281 "Move cursor to Hebrew DATE; echo Hebrew date unless NOECHO is non-nil."
42281b7b 282 (interactive (calendar-hebrew-read-date))
4b112ac4 283 (calendar-goto-date (calendar-gregorian-from-absolute
8fc9e5a0
GM
284 (calendar-hebrew-to-absolute date)))
285 (or noecho (calendar-hebrew-print-date)))
286
287(define-obsolete-function-alias 'calendar-goto-hebrew-date
288 'calendar-hebrew-goto-date "23.1")
4b112ac4 289
e803eab7 290(defvar displayed-month) ; from calendar-generate
8f11970d 291
6b789b4b
GM
292(defun calendar-hebrew-date-is-visible-p (month day)
293 "Return non-nil if Hebrew MONTH DAY is visible in the calendar window.
294Returns the corresponding Gregorian date."
9c68082d
GM
295 ;; This test is only to speed things up a bit; it works fine without it.
296 (if (memq displayed-month
1d2a9d53
GM
297 ;; What this is doing is equivalent to +1,2,3,4,5 modulo 12, ie:
298 ;; (mapcar (lambda (n) (let ((x (mod n 12)))
299 ;; (if (zerop x) 12
300 ;; x)))
301 ;; (number-sequence (1+ month) (+ 5 month)))
302 ;; Ie it makes a list:
303 ;; 2 3 4 5 6 when month = 1
304 ;; 3 4 5 6 7 when month = 2
305 ;; ...
306 ;; 8 9 10 11 12 when month = 7
307 ;; 9 10 11 12 1 when month = 8
308 ;; ...
309 ;; 12 1 2 3 4 when month = 11
310 ;; 1 2 3 4 5 when month = 12
311 ;; This implies that hebrew month N cannot occur outside
312 ;; Gregorian months N:N+6 (the calendar shows
313 ;; displayed-month +/- 1 at any time).
314 ;; So to put it another way:
315 ;; (calendar-interval month 1 displayed-month
316 ;; (if (> month displayed-month) 2 1))
317 ;; must be >= 1 and <= 5. This could be expanded to:
318 ;; (if (> month displayed-month) (+ 12 (- displayed-month month))
319 ;; (- displayed-month month)
9c68082d 320 (list
4b112ac4
ER
321 (if (< 11 month) (- month 11) (+ month 1))
322 (if (< 10 month) (- month 10) (+ month 2))
323 (if (< 9 month) (- month 9) (+ month 3))
324 (if (< 8 month) (- month 8) (+ month 4))
325 (if (< 7 month) (- month 7) (+ month 5))))
2f264ff6 326 (calendar-nongregorian-visible-p
8fc9e5a0 327 month day 'calendar-hebrew-to-absolute
2f264ff6
GM
328 'calendar-hebrew-from-absolute
329 ;; Hebrew new year is start of month 7.
330 ;; If hmonth >= 7, choose the higher year.
331 (lambda (m) (> m 6)))))
6b789b4b
GM
332
333;;;###holiday-autoload
334(defun holiday-hebrew (month day string)
335 "Holiday on MONTH, DAY (Hebrew) called STRING.
336If MONTH, DAY (Hebrew) is visible, the value returned is corresponding
337Gregorian date in the form of the list (((month day year) STRING)). Returns
338nil if it is not visible in the current calendar window."
339 (let ((gdate (calendar-hebrew-date-is-visible-p month day)))
340 (if gdate (list (list gdate string)))))
4b112ac4 341
e475d400
GM
342;; h-r-h-e should be called from holidays code.
343(declare-function holiday-filter-visible-calendar "holidays" (l))
344
2f264ff6
GM
345(defvar displayed-year)
346
28b3c0f5 347;;;###holiday-autoload
8fc9e5a0 348(defun holiday-hebrew-rosh-hashanah (&optional all)
f2268dc0 349 "List of dates related to Rosh Hashanah, as visible in calendar window.
1c76c939 350Shows only the major holidays, unless `calendar-hebrew-all-holidays-flag'
f2268dc0
GM
351or ALL is non-nil."
352 (when (memq displayed-month '(8 9 10 11))
8fc9e5a0 353 (let ((abs-r-h (calendar-hebrew-to-absolute
f2268dc0
GM
354 (list 7 1 (+ displayed-year 3761)))))
355 (holiday-filter-visible-calendar
356 (append
357 (list
358 (list (calendar-gregorian-from-absolute abs-r-h)
359 (format "Rosh HaShanah %d" (+ 3761 displayed-year)))
360 (list (calendar-gregorian-from-absolute (+ abs-r-h 9))
361 "Yom Kippur")
362 (list (calendar-gregorian-from-absolute (+ abs-r-h 14))
363 "Sukkot")
364 (list (calendar-gregorian-from-absolute (+ abs-r-h 21))
365 "Shemini Atzeret")
366 (list (calendar-gregorian-from-absolute (+ abs-r-h 22))
367 "Simchat Torah"))
1c76c939 368 (when (or all calendar-hebrew-all-holidays-flag)
f2268dc0
GM
369 (list
370 (list (calendar-gregorian-from-absolute
371 (calendar-dayname-on-or-before 6 (- abs-r-h 4)))
372 "Selichot (night)")
373 (list (calendar-gregorian-from-absolute (1- abs-r-h))
374 "Erev Rosh HaShanah")
375 (list (calendar-gregorian-from-absolute (1+ abs-r-h))
376 "Rosh HaShanah (second day)")
377 (list (calendar-gregorian-from-absolute
85d50db7 378 (+ abs-r-h (if (= (% abs-r-h 7) 4) 3 2)))
f2268dc0
GM
379 "Tzom Gedaliah")
380 (list (calendar-gregorian-from-absolute
381 (calendar-dayname-on-or-before 6 (+ 7 abs-r-h)))
382 "Shabbat Shuvah")
383 (list (calendar-gregorian-from-absolute (+ abs-r-h 8))
384 "Erev Yom Kippur")
385 (list (calendar-gregorian-from-absolute (+ abs-r-h 13))
386 "Erev Sukkot")
387 (list (calendar-gregorian-from-absolute (+ abs-r-h 15))
388 "Sukkot (second day)")
389 (list (calendar-gregorian-from-absolute (+ abs-r-h 16))
390 "Hol Hamoed Sukkot (first day)")
391 (list (calendar-gregorian-from-absolute (+ abs-r-h 17))
392 "Hol Hamoed Sukkot (second day)")
393 (list (calendar-gregorian-from-absolute (+ abs-r-h 18))
394 "Hol Hamoed Sukkot (third day)")
395 (list (calendar-gregorian-from-absolute (+ abs-r-h 19))
396 "Hol Hamoed Sukkot (fourth day)")
397 (list (calendar-gregorian-from-absolute (+ abs-r-h 20))
398 "Hoshanah Rabbah"))))))))
4b112ac4 399
28b3c0f5 400;;;###holiday-autoload
8fc9e5a0
GM
401(define-obsolete-function-alias 'holiday-rosh-hashanah-etc
402 'holiday-hebrew-rosh-hashanah "23.1")
403
404;;;###holiday-autoload
405(defun holiday-hebrew-hanukkah (&optional all)
f2268dc0 406 "List of dates related to Hanukkah, as visible in calendar window.
1c76c939 407Shows only Hanukkah, unless `calendar-hebrew-all-holidays-flag' or ALL
f2268dc0 408is non-nil."
9c68082d 409 ;; This test is only to speed things up a bit, it works fine without it.
f2268dc0
GM
410 (when (memq displayed-month '(10 11 12 1 2))
411 (let* ((m displayed-month)
412 (y displayed-year)
413 (h-y (progn
e803eab7
GM
414 (calendar-increment-month m y 1)
415 (calendar-extract-year
f2268dc0
GM
416 (calendar-hebrew-from-absolute
417 (calendar-absolute-from-gregorian
418 (list m (calendar-last-day-of-month m y) y))))))
8fc9e5a0 419 (abs-h (calendar-hebrew-to-absolute (list 9 25 h-y)))
f2268dc0
GM
420 (ord ["first" "second" "third" "fourth" "fifth" "sixth"
421 "seventh" "eighth"])
422 han)
423 (holiday-filter-visible-calendar
1c76c939 424 (if (or all calendar-hebrew-all-holidays-flag)
f2268dc0
GM
425 (append
426 (list
427 (list (calendar-gregorian-from-absolute (1- abs-h))
428 "Erev Hanukkah"))
429 (dotimes (i 8 (nreverse han))
430 (push (list
431 (calendar-gregorian-from-absolute (+ abs-h i))
432 (format "Hanukkah (%s day)" (aref ord i)))
433 han)))
434 (list (list (calendar-gregorian-from-absolute abs-h) "Hanukkah")))))))
4b112ac4 435
28b3c0f5 436;;;###holiday-autoload
8fc9e5a0
GM
437(define-obsolete-function-alias 'holiday-hanukkah
438 'holiday-hebrew-hanukkah "23.1")
439
440;;;###holiday-autoload
441(defun holiday-hebrew-passover (&optional all)
f2268dc0 442 "List of dates related to Passover, as visible in calendar window.
1c76c939 443Shows only the major holidays, unless `calendar-hebrew-all-holidays-flag'
f2268dc0
GM
444or ALL is non-nil."
445 (when (< displayed-month 8)
8fc9e5a0 446 (let ((abs-p (calendar-hebrew-to-absolute
f2268dc0
GM
447 (list 1 15 (+ displayed-year 3760)))))
448 (holiday-filter-visible-calendar
449 ;; The first two are out of order when the others are added.
450 (append
451 (list
452 (list (calendar-gregorian-from-absolute abs-p) "Passover")
453 (list (calendar-gregorian-from-absolute (+ abs-p 50))
454 "Shavuot"))
1c76c939 455 (when (or all calendar-hebrew-all-holidays-flag)
85d50db7
GM
456 (let ((wday (% abs-p 7)))
457 (list
458 (list (calendar-gregorian-from-absolute
459 (calendar-dayname-on-or-before 6 (- abs-p 43)))
460 "Shabbat Shekalim")
461 (list (calendar-gregorian-from-absolute
462 (calendar-dayname-on-or-before 6 (- abs-p 30)))
463 "Shabbat Zachor")
464 (list (calendar-gregorian-from-absolute
465 (- abs-p (if (= wday 2) 33 31)))
466 "Fast of Esther")
467 (list (calendar-gregorian-from-absolute (- abs-p 31))
468 "Erev Purim")
469 (list (calendar-gregorian-from-absolute (- abs-p 30))
470 "Purim")
471 (list (calendar-gregorian-from-absolute
472 (- abs-p (if (zerop wday) 28 29)))
473 "Shushan Purim")
474 (list (calendar-gregorian-from-absolute
475 (- (calendar-dayname-on-or-before 6 (- abs-p 14)) 7))
476 "Shabbat Parah")
477 (list (calendar-gregorian-from-absolute
478 (calendar-dayname-on-or-before 6 (- abs-p 14)))
479 "Shabbat HaHodesh")
480 (list (calendar-gregorian-from-absolute
481 (calendar-dayname-on-or-before 6 (1- abs-p)))
482 "Shabbat HaGadol")
483 (list (calendar-gregorian-from-absolute (1- abs-p))
484 "Erev Passover")
485 (list (calendar-gregorian-from-absolute (1+ abs-p))
486 "Passover (second day)")
487 (list (calendar-gregorian-from-absolute (+ abs-p 2))
488 "Hol Hamoed Passover (first day)")
489 (list (calendar-gregorian-from-absolute (+ abs-p 3))
490 "Hol Hamoed Passover (second day)")
491 (list (calendar-gregorian-from-absolute (+ abs-p 4))
492 "Hol Hamoed Passover (third day)")
493 (list (calendar-gregorian-from-absolute (+ abs-p 5))
494 "Hol Hamoed Passover (fourth day)")
495 (list (calendar-gregorian-from-absolute (+ abs-p 6))
496 "Passover (seventh day)")
497 (list (calendar-gregorian-from-absolute (+ abs-p 7))
498 "Passover (eighth day)")
499 (list (calendar-gregorian-from-absolute
500 (+ abs-p (if (zerop (% (+ abs-p 12) 7))
501 13
502 12)))
503 "Yom HaShoah")
504 (list (calendar-gregorian-from-absolute
505 (+ abs-p
506 ;; If falls on Sat or Fri, moves to preceding Thurs.
507 ;; If falls on Mon, moves to Tues (since 2004).
508 (cond ((zerop wday) 18) ; Sat
509 ((= wday 6) 19) ; Fri
510 ((= wday 2) 21) ; Mon
511 (t 20))))
512 "Yom HaAtzma'ut")
513 (list (calendar-gregorian-from-absolute (+ abs-p 33))
514 "Lag BaOmer")
515 (list (calendar-gregorian-from-absolute (+ abs-p 43))
516 "Yom Yerushalaim")
517 (list (calendar-gregorian-from-absolute (+ abs-p 49))
518 "Erev Shavuot")
519 (list (calendar-gregorian-from-absolute (+ abs-p 51))
520 "Shavuot (second day)")))))))))
4b112ac4 521
28b3c0f5 522;;;###holiday-autoload
8fc9e5a0
GM
523(define-obsolete-function-alias 'holiday-passover-etc
524 'holiday-hebrew-passover "23.1")
525
526;;;###holiday-autoload
527(defun holiday-hebrew-tisha-b-av ()
4b112ac4 528 "List of dates around Tisha B'Av, as visible in calendar window."
f2268dc0 529 (when (memq displayed-month '(5 6 7 8 9))
85d50db7
GM
530 (let* ((abs-t-a (calendar-hebrew-to-absolute
531 (list 5 9 (+ displayed-year 3760))))
532 (wday (% abs-t-a 7)))
8705f7f3 533 (holiday-filter-visible-calendar
a1506d29 534 (list
4b112ac4 535 (list (calendar-gregorian-from-absolute
85d50db7 536 (- abs-t-a (if (= wday 6) 20 21)))
4b112ac4
ER
537 "Tzom Tammuz")
538 (list (calendar-gregorian-from-absolute
539 (calendar-dayname-on-or-before 6 abs-t-a))
540 "Shabbat Hazon")
541 (list (calendar-gregorian-from-absolute
85d50db7 542 (if (= wday 6) (1+ abs-t-a) abs-t-a))
4b112ac4
ER
543 "Tisha B'Av")
544 (list (calendar-gregorian-from-absolute
545 (calendar-dayname-on-or-before 6 (+ abs-t-a 7)))
546 "Shabbat Nahamu"))))))
547
8fc9e5a0
GM
548;;;###holiday-autoload
549(define-obsolete-function-alias 'holiday-tisha-b-av-etc
550 'holiday-hebrew-tisha-b-av "23.1")
551
f2268dc0
GM
552(autoload 'holiday-julian "cal-julian")
553
554;;;###holiday-autoload
555(defun holiday-hebrew-misc ()
556 "Miscellaneous Hebrew holidays, if visible in calendar window.
557Includes: Tal Umatar, Tzom Teveth, Tu B'Shevat, Shabbat Shirah, and
558Kiddush HaHamah."
559 (let ((m displayed-month)
560 (y displayed-year)
85d50db7 561 year h-year)
f2268dc0
GM
562 (append
563 (holiday-julian
564 11
565 (progn
e803eab7
GM
566 (calendar-increment-month m y -1)
567 (setq year (calendar-extract-year
f2268dc0
GM
568 (calendar-julian-from-absolute
569 (calendar-absolute-from-gregorian (list m 1 y)))))
570 (if (zerop (% (1+ year) 4))
571 22
572 21)) "\"Tal Umatar\" (evening)")
573 (holiday-hebrew
574 10
575 (progn
e803eab7 576 (setq h-year (calendar-extract-year
f2268dc0
GM
577 (calendar-hebrew-from-absolute
578 (calendar-absolute-from-gregorian
579 (list displayed-month 28 displayed-year)))))
8fc9e5a0 580 (if (= 6 (% (calendar-hebrew-to-absolute (list 10 10 h-year))
f2268dc0
GM
581 7))
582 11 10))
583 "Tzom Teveth")
584 (holiday-hebrew 11 15 "Tu B'Shevat")
585 (holiday-hebrew
586 11
587 (progn
588 (setq m displayed-month
589 y displayed-year
590 h-year (progn
e803eab7
GM
591 (calendar-increment-month m y 1)
592 (calendar-extract-year
f2268dc0
GM
593 (calendar-hebrew-from-absolute
594 (calendar-absolute-from-gregorian
85d50db7
GM
595 (list m (calendar-last-day-of-month m y) y))))))
596 (calendar-extract-day
597 (calendar-hebrew-from-absolute
598 (calendar-dayname-on-or-before
599 6 (calendar-hebrew-to-absolute
600 (list 11
601 (if (= 6
602 (% (calendar-hebrew-to-absolute
603 (list 7 1 h-year))
604 7))
605 17 16) h-year))))))
f2268dc0
GM
606 "Shabbat Shirah")
607 (and (progn
608 (setq m displayed-month
609 y displayed-year
610 year (progn
e803eab7
GM
611 (calendar-increment-month m y -1)
612 (calendar-extract-year
f2268dc0
GM
613 (calendar-julian-from-absolute
614 (calendar-absolute-from-gregorian (list m 1 y))))))
615 (= 21 (% year 28)))
616 (holiday-julian 3 26 "Kiddush HaHamah")))))
617
618
711d00e7 619(autoload 'diary-list-entries-1 "diary-lib")
c3efd659 620
28b3c0f5 621;;;###diary-autoload
8fc9e5a0 622(defun diary-hebrew-list-entries ()
4b112ac4 623 "Add any Hebrew date entries from the diary file to `diary-entries-list'.
0e96e25f 624Hebrew date diary entries must be prefaced by `diary-hebrew-entry-symbol'
8f11970d
GM
625\(normally an `H'). The same diary date forms govern the style
626of the Hebrew calendar entries, except that the Hebrew month
872edde5 627names cannot be abbreviated. The Hebrew months are numbered
8f11970d
GM
628from 1 to 13 with Nisan being 1, 12 being Adar I and 13 being
629Adar II; you must use `Adar I' if you want Adar of a common
630Hebrew year. If a Hebrew date diary entry begins with
631`diary-nonmarking-symbol', the entry will appear in the diary
632listing, but will not be marked in the calendar. This function
9ee4e581 633is provided for use with `diary-nongregorian-listing-hook'."
711d00e7 634 (diary-list-entries-1 calendar-hebrew-month-name-array-leap-year
0e96e25f 635 diary-hebrew-entry-symbol
711d00e7 636 'calendar-hebrew-from-absolute))
8fc9e5a0
GM
637;;;###diary-autoload
638(define-obsolete-function-alias 'list-hebrew-diary-entries
639 'diary-hebrew-list-entries "23.1")
4b112ac4 640
28c02796
GM
641(autoload 'calendar-mark-complex "diary-lib")
642
28b3c0f5 643;;;###diary-autoload
8fc9e5a0 644(defun calendar-hebrew-mark-date-pattern (month day year &optional color)
da3fc020 645 "Mark dates in calendar window that conform to Hebrew date MONTH/DAY/YEAR.
28c02796 646A value of 0 in any position is a wildcard. Optional argument COLOR is
e803eab7 647passed to `calendar-mark-visible-date' as MARK."
28c02796
GM
648 ;; FIXME not the same as the Bahai and Islamic cases, so can't use
649 ;; calendar-mark-1.
937e6a56 650 (with-current-buffer calendar-buffer
0d1bb2ff
GM
651 (if (and (not (zerop month)) (not (zerop day)))
652 (if (not (zerop year))
da3fc020
GM
653 ;; Fully specified Hebrew date.
654 (let ((date (calendar-gregorian-from-absolute
8fc9e5a0 655 (calendar-hebrew-to-absolute
da3fc020
GM
656 (list month day year)))))
657 (if (calendar-date-is-visible-p date)
e803eab7 658 (calendar-mark-visible-date date color)))
6b789b4b
GM
659 ;; Month and day in any year.
660 (let ((gdate (calendar-hebrew-date-is-visible-p month day)))
e803eab7 661 (if gdate (calendar-mark-visible-date gdate color))))
28c02796
GM
662 (calendar-mark-complex month day year
663 'calendar-hebrew-from-absolute color))))
da3fc020 664
8fc9e5a0
GM
665;;;###diary-autoload
666(define-obsolete-function-alias 'mark-hebrew-calendar-date-pattern
667 'calendar-hebrew-mark-date-pattern "23.1")
668
711d00e7 669(autoload 'diary-mark-entries-1 "diary-lib")
e475d400 670
28b3c0f5 671;;;###diary-autoload
8fc9e5a0 672(defun diary-hebrew-mark-entries ()
4b112ac4 673 "Mark days in the calendar window that have Hebrew date diary entries.
711d00e7
GM
674Marks each entry in `diary-file' (or included files) visible in the calendar
675window. See `list-hebrew-diary-entries' for more information."
8fc9e5a0 676 (diary-mark-entries-1 'calendar-hebrew-mark-date-pattern
618c03c1 677 calendar-hebrew-month-name-array-leap-year
0e96e25f 678 diary-hebrew-entry-symbol
618c03c1 679 'calendar-hebrew-from-absolute))
4b112ac4 680
8fc9e5a0
GM
681;;;###diary-autoload
682(define-obsolete-function-alias 'mark-hebrew-diary-entries
683 'diary-hebrew-mark-entries "23.1")
f2b46435
GM
684
685(autoload 'diary-insert-entry-1 "diary-lib")
686
28b3c0f5 687;;;###cal-autoload
8fc9e5a0
GM
688(defun diary-hebrew-insert-entry (arg)
689 "Insert a diary entry for the Hebrew date at point.
6afe7cdd 690Prefix argument ARG makes the entry nonmarking."
4b112ac4 691 (interactive "P")
f2b46435 692 (diary-insert-entry-1 nil arg calendar-hebrew-month-name-array-leap-year
0e96e25f 693 diary-hebrew-entry-symbol
f2b46435 694 'calendar-hebrew-from-absolute))
4b112ac4 695
8fc9e5a0
GM
696;;;###diary-autoload
697(define-obsolete-function-alias 'insert-hebrew-diary-entry
698 'diary-hebrew-insert-entry "23.1")
699
28b3c0f5 700;;;###cal-autoload
8fc9e5a0 701(defun diary-hebrew-insert-monthly-entry (arg)
4b112ac4
ER
702 "Insert a monthly diary entry.
703For the day of the Hebrew month corresponding to the date indicated by point.
6afe7cdd 704Prefix argument ARG makes the entry nonmarking."
4b112ac4 705 (interactive "P")
f2b46435 706 (diary-insert-entry-1 'monthly arg calendar-hebrew-month-name-array-leap-year
0e96e25f 707 diary-hebrew-entry-symbol
f2b46435 708 'calendar-hebrew-from-absolute))
8fc9e5a0
GM
709;;;###diary-autoload
710(define-obsolete-function-alias 'insert-monthly-hebrew-diary-entry
711 'diary-hebrew-insert-monthly-entry "23.1")
4b112ac4 712
28b3c0f5 713;;;###cal-autoload
8fc9e5a0 714(defun diary-hebrew-insert-yearly-entry (arg)
4b112ac4
ER
715 "Insert an annual diary entry.
716For the day of the Hebrew year corresponding to the date indicated by point.
6afe7cdd 717Prefix argument ARG makes the entry nonmarking."
4b112ac4 718 (interactive "P")
f2b46435 719 (diary-insert-entry-1 'yearly arg calendar-hebrew-month-name-array-leap-year
0e96e25f 720 diary-hebrew-entry-symbol
f2b46435 721 'calendar-hebrew-from-absolute))
8fc9e5a0
GM
722;;;###diary-autoload
723(define-obsolete-function-alias 'insert-yearly-hebrew-diary-entry
724 'diary-hebrew-insert-yearly-entry "23.1")
4b112ac4
ER
725
726;;;###autoload
4e740fd0 727(defun calendar-hebrew-list-yahrzeits (death-date start-year end-year)
4b112ac4
ER
728 "List Yahrzeit dates for *Gregorian* DEATH-DATE from START-YEAR to END-YEAR.
729When called interactively from the calendar window, the date of death is taken
730from the cursor position."
731 (interactive
732 (let* ((death-date
733 (if (equal (current-buffer) (get-buffer calendar-buffer))
734 (calendar-cursor-to-date)
735 (let* ((today (calendar-current-date))
736 (year (calendar-read
737 "Year of death (>0): "
c645b7bb 738 (lambda (x) (> x 0))
d92bcf94 739 (number-to-string (calendar-extract-year today))))
4b112ac4
ER
740 (month-array calendar-month-name-array)
741 (completion-ignore-case t)
abe4091c 742 (month (cdr (assoc-string
bf7b2caf
RS
743 (completing-read
744 "Month of death (name): "
745 (mapcar 'list (append month-array nil))
746 nil t)
abe4091c 747 (calendar-make-alist month-array 1) t)))
4b112ac4
ER
748 (last (calendar-last-day-of-month month year))
749 (day (calendar-read
750 (format "Day of death (1-%d): " last)
c645b7bb 751 (lambda (x) (and (< 0 x) (<= x last))))))
4b112ac4 752 (list month day year))))
e803eab7 753 (death-year (calendar-extract-year death-date))
4b112ac4
ER
754 (start-year (calendar-read
755 (format "Starting year of Yahrzeit table (>%d): "
756 death-year)
c645b7bb 757 (lambda (x) (> x death-year))
d92bcf94 758 (number-to-string (1+ death-year))))
4b112ac4
ER
759 (end-year (calendar-read
760 (format "Ending year of Yahrzeit table (>=%d): "
761 start-year)
71ea27ee
GM
762 (lambda (x) (>= x start-year)))))
763 (list death-date start-year end-year)))
6afe7cdd 764 (message "Computing Yahrzeits...")
66471e03 765 (let* ((h-date (calendar-hebrew-from-absolute
4b112ac4 766 (calendar-absolute-from-gregorian death-date)))
e803eab7
GM
767 (h-month (calendar-extract-month h-date))
768 (h-day (calendar-extract-day h-date))
769 (h-year (calendar-extract-year h-date))
2d354894 770 (i (1- start-year)))
e803eab7 771 (calendar-in-read-only-buffer calendar-hebrew-yahrzeit-buffer
318a5488
GM
772 (calendar-set-mode-line
773 (format "Yahrzeit dates for %s = %s"
774 (calendar-date-string death-date)
775 (let ((calendar-month-name-array
8fc9e5a0 776 (if (calendar-hebrew-leap-year-p h-year)
318a5488
GM
777 calendar-hebrew-month-name-array-leap-year
778 calendar-hebrew-month-name-array-common-year)))
779 (calendar-date-string h-date nil t))))
2d354894 780 (while (<= (setq i (1+ i)) end-year)
318a5488
GM
781 (insert
782 (calendar-date-string
783 (calendar-gregorian-from-absolute
8fc9e5a0 784 (calendar-hebrew-yahrzeit
318a5488 785 h-date
e803eab7 786 (calendar-extract-year
318a5488 787 (calendar-hebrew-from-absolute
2d354894
GM
788 (calendar-absolute-from-gregorian (list 1 1 i))))))) "\n"))))
789 (message "Computing Yahrzeits...done"))
4b112ac4 790
8fc9e5a0
GM
791;;;###autoload
792(define-obsolete-function-alias 'list-yahrzeit-dates
4e740fd0 793 'calendar-hebrew-list-yahrzeits "23.1")
8fc9e5a0 794
c3efd659
GM
795(defvar date)
796
9ee4e581 797;; To be called from diary-list-sexp-entries, where DATE is bound.
28b3c0f5 798;;;###diary-autoload
4b112ac4
ER
799(defun diary-hebrew-date ()
800 "Hebrew calendar equivalent of date diary entry."
801 (format "Hebrew date (until sunset): %s" (calendar-hebrew-date-string date)))
802
28b3c0f5 803;;;###diary-autoload
8fc9e5a0 804(defun diary-hebrew-omer (&optional mark)
4b112ac4 805 "Omer count diary entry.
9a27723c
RS
806Entry applies if date is within 50 days after Passover.
807
a1506d29 808An optional parameter MARK specifies a face or single-character string to
9a27723c 809use when highlighting the day in the calendar."
4b112ac4 810 (let* ((passover
8fc9e5a0 811 (calendar-hebrew-to-absolute
e803eab7 812 (list 1 15 (+ (calendar-extract-year date) 3760))))
4b112ac4
ER
813 (omer (- (calendar-absolute-from-gregorian date) passover))
814 (week (/ omer 7))
815 (day (% omer 7)))
816 (if (and (> omer 0) (< omer 50))
a1506d29 817 (cons mark
71ea27ee
GM
818 (format "Day %d%s of the omer (until sunset)"
819 omer
820 (if (zerop week)
821 ""
822 (format ", that is, %d week%s%s"
823 week
824 (if (= week 1) "" "s")
825 (if (zerop day)
826 ""
827 (format " and %d day%s"
828 day (if (= day 1) "" "s"))))))))))
8fc9e5a0
GM
829;;;###diary-autoload
830(define-obsolete-function-alias 'diary-omer 'diary-hebrew-omer "23.1")
4b112ac4 831
c3efd659
GM
832(defvar entry)
833
f2b46435
GM
834(autoload 'diary-make-date "diary-lib")
835
b4cb42a4
GM
836(declare-function diary-ordinal-suffix "diary-lib" (n))
837
28b3c0f5 838;;;###diary-autoload
8fc9e5a0 839(defun diary-hebrew-yahrzeit (death-month death-day death-year &optional mark)
6afe7cdd 840 "Yahrzeit diary entry--entry applies if date is Yahrzeit or the day before.
f2b46435
GM
841Parameters are DEATH-MONTH, DEATH-DAY, DEATH-YEAR; the diary
842entry is assumed to be the name of the person. Although the date
843of death is specified by the civil calendar, the proper Hebrew
844calendar Yahrzeit is determined.
845
846The order of the input parameters changes according to `calendar-date-style'
847\(e.g. to DEATH-DAY, DEATH-MONTH, DEATH-YEAR in the European style).
9a27723c 848
a1506d29 849An optional parameter MARK specifies a face or single-character string to
9a27723c 850use when highlighting the day in the calendar."
4b112ac4
ER
851 (let* ((h-date (calendar-hebrew-from-absolute
852 (calendar-absolute-from-gregorian
f2b46435 853 (diary-make-date death-month death-day death-year))))
e803eab7
GM
854 (h-month (calendar-extract-month h-date))
855 (h-day (calendar-extract-day h-date))
856 (h-year (calendar-extract-year h-date))
4b112ac4 857 (d (calendar-absolute-from-gregorian date))
e803eab7 858 (yr (calendar-extract-year (calendar-hebrew-from-absolute d)))
4b112ac4 859 (diff (- yr h-year))
8fc9e5a0 860 (y (calendar-hebrew-yahrzeit h-date yr)))
4b112ac4 861 (if (and (> diff 0) (or (= y d) (= y (1+ d))))
9a27723c 862 (cons mark
71ea27ee
GM
863 (format "Yahrzeit of %s%s: %d%s anniversary"
864 entry
865 (if (= y d) "" " (evening)")
866 diff
4980d28f
GM
867 (diary-ordinal-suffix diff))))))
868
8fc9e5a0
GM
869;;;###diary-autoload
870(define-obsolete-function-alias 'diary-yahrzeit 'diary-hebrew-yahrzeit "23.1")
4b112ac4 871
28b3c0f5 872;;;###diary-autoload
8fc9e5a0 873(defun diary-hebrew-rosh-hodesh (&optional mark)
4b112ac4 874 "Rosh Hodesh diary entry.
9a27723c
RS
875Entry applies if date is Rosh Hodesh, the day before, or the Saturday before.
876
a1506d29 877An optional parameter MARK specifies a face or single-character string to
9a27723c 878use when highlighting the day in the calendar."
4b112ac4
ER
879 (let* ((d (calendar-absolute-from-gregorian date))
880 (h-date (calendar-hebrew-from-absolute d))
e803eab7
GM
881 (h-month (calendar-extract-month h-date))
882 (h-day (calendar-extract-day h-date))
883 (h-year (calendar-extract-year h-date))
8fc9e5a0
GM
884 (leap-year (calendar-hebrew-leap-year-p h-year))
885 (last-day (calendar-hebrew-last-day-of-month h-month h-year))
4b112ac4
ER
886 (h-month-names
887 (if leap-year
888 calendar-hebrew-month-name-array-leap-year
889 calendar-hebrew-month-name-array-common-year))
890 (this-month (aref h-month-names (1- h-month)))
e803eab7 891 (h-yesterday (calendar-extract-day
4b112ac4
ER
892 (calendar-hebrew-from-absolute (1- d)))))
893 (if (or (= h-day 30) (and (= h-day 1) (/= h-month 7)))
a1506d29 894 (cons mark
71ea27ee
GM
895 (format
896 "Rosh Hodesh %s"
897 (if (= h-day 30)
898 (format
899 "%s (first day)"
900 ;; Next month must be in the same year since this
901 ;; month can't be the last month of the year since
902 ;; it has 30 days
903 (aref h-month-names h-month))
904 (if (= h-yesterday 30)
905 (format "%s (second day)" this-month)
906 this-month))))
907 (if (= (% d 7) 6) ; Saturday--check for Shabbat Mevarchim
a1506d29 908 (cons mark
71ea27ee
GM
909 (cond ((and (> h-day 22) (/= h-month 6) (= 29 last-day))
910 (format "Mevarchim Rosh Hodesh %s (%s)"
911 (aref h-month-names
912 (if (= h-month
8fc9e5a0 913 (calendar-hebrew-last-month-of-year
71ea27ee
GM
914 h-year))
915 0 h-month))
916 (aref calendar-day-name-array (- 29 h-day))))
917 ((and (< h-day 30) (> h-day 22) (= 30 last-day))
918 (format "Mevarchim Rosh Hodesh %s (%s-%s)"
919 (aref h-month-names h-month)
920 (if (= h-day 29)
921 "tomorrow"
922 (aref calendar-day-name-array (- 29 h-day)))
923 (aref calendar-day-name-array
924 (% (- 30 h-day) 7))))))
4b112ac4 925 (if (and (= h-day 29) (/= h-month 6))
347a0e23 926 (cons mark
71ea27ee
GM
927 (format "Erev Rosh Hodesh %s"
928 (aref h-month-names
929 (if (= h-month
8fc9e5a0 930 (calendar-hebrew-last-month-of-year
71ea27ee
GM
931 h-year))
932 0 h-month)))))))))
8fc9e5a0
GM
933;;;###diary-autoload
934(define-obsolete-function-alias 'diary-rosh-hodesh
935 'diary-hebrew-rosh-hodesh "23.1")
9a27723c 936
8fc9e5a0 937(defconst calendar-hebrew-parashiot-names
71ea27ee
GM
938 ["Bereshith" "Noah" "Lech L'cha" "Vayera" "Hayei Sarah" "Toledoth"
939 "Vayetze" "Vayishlah" "Vayeshev" "Mikketz" "Vayiggash" "Vayhi"
940 "Shemoth" "Vaera" "Bo" "Beshallah" "Yithro" "Mishpatim"
941 "Terumah" "Tetzavveh" "Ki Tissa" "Vayakhel" "Pekudei" "Vayikra"
942 "Tzav" "Shemini" "Tazria" "Metzora" "Aharei Moth" "Kedoshim"
943 "Emor" "Behar" "Behukkotai" "Bemidbar" "Naso" "Behaalot'cha"
944 "Shelah L'cha" "Korah" "Hukkath" "Balak" "Pinhas" "Mattoth"
945 "Masei" "Devarim" "Vaethanan" "Ekev" "Reeh" "Shofetim"
946 "Ki Tetze" "Ki Tavo" "Nitzavim" "Vayelech" "Haazinu"]
da3fc020
GM
947 "The names of the parashiot in the Torah.")
948
8fc9e5a0 949(defun calendar-hebrew-parasha-name (p)
da3fc020 950 "Name(s) corresponding to parasha P."
71ea27ee 951 (if (arrayp p) ; combined parasha
da3fc020 952 (format "%s/%s"
8fc9e5a0
GM
953 (aref calendar-hebrew-parashiot-names (aref p 0))
954 (aref calendar-hebrew-parashiot-names (aref p 1)))
955 (aref calendar-hebrew-parashiot-names p)))
da3fc020 956
711d00e7 957;; Following 14 constants are used in diary-parasha (intern).
8f11970d 958
9c68082d 959;; The seven ordinary year types (keviot).
8fc9e5a0 960(defconst calendar-hebrew-year-Saturday-incomplete-Sunday
4b112ac4 961 [nil 52 nil nil 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 [21 22]
71ea27ee
GM
962 23 24 nil 25 [26 27] [28 29] 30 [31 32] 33 34 35 36 37 38 39 40 [41 42]
963 43 44 45 46 47 48 49 50]
4b112ac4
ER
964 "The structure of the parashiot.
965Hebrew year starts on Saturday, is `incomplete' (Heshvan and Kislev each have
96629 days), and has Passover start on Sunday.")
967
8fc9e5a0 968(defconst calendar-hebrew-year-Saturday-complete-Tuesday
4b112ac4 969 [nil 52 nil nil 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 [21 22]
71ea27ee
GM
970 23 24 nil 25 [26 27] [28 29] 30 [31 32] 33 34 35 36 37 38 39 40 [41 42]
971 43 44 45 46 47 48 49 [50 51]]
4b112ac4
ER
972 "The structure of the parashiot.
973Hebrew year that starts on Saturday, is `complete' (Heshvan and Kislev each
974have 30 days), and has Passover start on Tuesday.")
975
8fc9e5a0 976(defconst calendar-hebrew-year-Monday-incomplete-Tuesday
4b112ac4 977 [51 52 nil 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 [21 22]
71ea27ee
GM
978 23 24 nil 25 [26 27] [28 29] 30 [31 32] 33 34 35 36 37 38 39 40 [41 42]
979 43 44 45 46 47 48 49 [50 51]]
4b112ac4
ER
980 "The structure of the parashiot.
981Hebrew year that starts on Monday, is `incomplete' (Heshvan and Kislev each
982have 29 days), and has Passover start on Tuesday.")
983
8fc9e5a0 984(defconst calendar-hebrew-year-Monday-complete-Thursday
4b112ac4 985 [51 52 nil 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 [21 22]
71ea27ee
GM
986 23 24 nil 25 [26 27] [28 29] 30 [31 32] 33 (nil . 34) (34 . 35) (35 . 36)
987 (36 . 37) (37 . 38) ([38 39] . 39) 40 [41 42] 43 44 45 46 47 48 49 [50 51]]
4b112ac4
ER
988 "The structure of the parashiot.
989Hebrew year that starts on Monday, is `complete' (Heshvan and Kislev each have
99030 days), and has Passover start on Thursday.")
991
8fc9e5a0 992(defconst calendar-hebrew-year-Tuesday-regular-Thursday
4b112ac4 993 [51 52 nil 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 [21 22]
71ea27ee
GM
994 23 24 nil 25 [26 27] [28 29] 30 [31 32] 33 (nil . 34) (34 . 35) (35 . 36)
995 (36 . 37) (37 . 38) ([38 39] . 39) 40 [41 42] 43 44 45 46 47 48 49 [50 51]]
4b112ac4
ER
996 "The structure of the parashiot.
997Hebrew year that starts on Tuesday, is `regular' (Heshvan has 29 days and
998Kislev has 30 days), and has Passover start on Thursday.")
999
8fc9e5a0 1000(defconst calendar-hebrew-year-Thursday-regular-Saturday
4b112ac4 1001 [52 nil nil 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 [21 22] 23
71ea27ee
GM
1002 24 nil (nil . 25) (25 . [26 27]) ([26 27] . [28 29]) ([28 29] . 30)
1003 (30 . 31) ([31 32] . 32) 33 34 35 36 37 38 39 40 [41 42] 43 44 45 46 47 48
1004 49 50]
4b112ac4
ER
1005 "The structure of the parashiot.
1006Hebrew year that starts on Thursday, is `regular' (Heshvan has 29 days and
1007Kislev has 30 days), and has Passover start on Saturday.")
1008
8fc9e5a0 1009(defconst calendar-hebrew-year-Thursday-complete-Sunday
4b112ac4 1010 [52 nil nil 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
71ea27ee
GM
1011 23 24 nil 25 [26 27] [28 29] 30 [31 32] 33 34 35 36 37 38 39 40 [41 42]
1012 43 44 45 46 47 48 49 50]
4b112ac4
ER
1013 "The structure of the parashiot.
1014Hebrew year that starts on Thursday, is `complete' (Heshvan and Kislev each
1015have 30 days), and has Passover start on Sunday.")
1016
9c68082d 1017;; The seven leap year types (keviot).
8fc9e5a0 1018(defconst calendar-hebrew-year-Saturday-incomplete-Tuesday
4b112ac4 1019 [nil 52 nil nil 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
71ea27ee
GM
1020 23 24 25 26 27 nil 28 29 30 31 32 33 34 35 36 37 38 39 40 [41 42]
1021 43 44 45 46 47 48 49 [50 51]]
4b112ac4
ER
1022 "The structure of the parashiot.
1023Hebrew year that starts on Saturday, is `incomplete' (Heshvan and Kislev each
1024have 29 days), and has Passover start on Tuesday.")
1025
8fc9e5a0 1026(defconst calendar-hebrew-year-Saturday-complete-Thursday
4b112ac4 1027 [nil 52 nil nil 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
71ea27ee
GM
1028 23 24 25 26 27 nil 28 29 30 31 32 33 (nil . 34) (34 . 35) (35 . 36)
1029 (36 . 37) (37 . 38) ([38 39] . 39) 40 [41 42] 43 44 45 46 47 48 49 [50 51]]
4b112ac4
ER
1030 "The structure of the parashiot.
1031Hebrew year that starts on Saturday, is `complete' (Heshvan and Kislev each
1032have 30 days), and has Passover start on Thursday.")
1033
8fc9e5a0 1034(defconst calendar-hebrew-year-Monday-incomplete-Thursday
4b112ac4 1035 [51 52 nil 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
71ea27ee
GM
1036 23 24 25 26 27 nil 28 29 30 31 32 33 (nil . 34) (34 . 35) (35 . 36)
1037 (36 . 37) (37 . 38) ([38 39] . 39) 40 [41 42] 43 44 45 46 47 48 49 [50 51]]
4b112ac4
ER
1038 "The structure of the parashiot.
1039Hebrew year that starts on Monday, is `incomplete' (Heshvan and Kislev each
1040have 29 days), and has Passover start on Thursday.")
1041
8fc9e5a0 1042(defconst calendar-hebrew-year-Monday-complete-Saturday
4b112ac4 1043 [51 52 nil 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
71ea27ee
GM
1044 23 24 25 26 27 nil (nil . 28) (28 . 29) (29 . 30) (30 . 31) (31 . 32)
1045 (32 . 33) (33 . 34) (34 . 35) (35 . 36) (36 . 37) (37 . 38) (38 . 39)
1046 (39 . 40) (40 . 41) ([41 42] . 42) 43 44 45 46 47 48 49 50]
4b112ac4
ER
1047 "The structure of the parashiot.
1048Hebrew year that starts on Monday, is `complete' (Heshvan and Kislev each have
104930 days), and has Passover start on Saturday.")
1050
8fc9e5a0 1051(defconst calendar-hebrew-year-Tuesday-regular-Saturday
4b112ac4 1052 [51 52 nil 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
71ea27ee
GM
1053 23 24 25 26 27 nil (nil . 28) (28 . 29) (29 . 30) (30 . 31) (31 . 32)
1054 (32 . 33) (33 . 34) (34 . 35) (35 . 36) (36 . 37) (37 . 38) (38 . 39)
1055 (39 . 40) (40 . 41) ([41 42] . 42) 43 44 45 46 47 48 49 50]
4b112ac4
ER
1056 "The structure of the parashiot.
1057Hebrew year that starts on Tuesday, is `regular' (Heshvan has 29 days and
1058Kislev has 30 days), and has Passover start on Saturday.")
1059
8fc9e5a0 1060(defconst calendar-hebrew-year-Thursday-incomplete-Sunday
4b112ac4 1061 [52 nil nil 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
71ea27ee
GM
1062 23 24 25 26 27 28 nil 29 30 31 32 33 34 35 36 37 38 39 40 41 42
1063 43 44 45 46 47 48 49 50]
4b112ac4
ER
1064 "The structure of the parashiot.
1065Hebrew year that starts on Thursday, is `incomplete' (Heshvan and Kislev both
1066have 29 days), and has Passover start on Sunday.")
1067
8fc9e5a0 1068(defconst calendar-hebrew-year-Thursday-complete-Tuesday
4b112ac4 1069 [52 nil nil 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
71ea27ee
GM
1070 23 24 25 26 27 28 nil 29 30 31 32 33 34 35 36 37 38 39 40 41 42
1071 43 44 45 46 47 48 49 [50 51]]
4b112ac4
ER
1072 "The structure of the parashiot.
1073Hebrew year that starts on Thursday, is `complete' (Heshvan and Kislev both
1074have 30 days), and has Passover start on Tuesday.")
1075
711d00e7 1076;;;###diary-autoload
8fc9e5a0 1077(defun diary-hebrew-parasha (&optional mark)
711d00e7
GM
1078 "Parasha diary entry--entry applies if date is a Saturday.
1079An optional parameter MARK specifies a face or single-character string to
1080use when highlighting the day in the calendar."
1081 (let ((d (calendar-absolute-from-gregorian date)))
1082 (if (= (% d 7) 6) ; Saturday
e803eab7 1083 (let* ((h-year (calendar-extract-year
711d00e7
GM
1084 (calendar-hebrew-from-absolute d)))
1085 (rosh-hashanah
8fc9e5a0 1086 (calendar-hebrew-to-absolute (list 7 1 h-year)))
711d00e7 1087 (passover
8fc9e5a0 1088 (calendar-hebrew-to-absolute (list 1 15 h-year)))
711d00e7
GM
1089 (rosh-hashanah-day
1090 (aref calendar-day-name-array (% rosh-hashanah 7)))
1091 (passover-day
1092 (aref calendar-day-name-array (% passover 7)))
8fc9e5a0
GM
1093 (long-h (calendar-hebrew-long-heshvan-p h-year))
1094 (short-k (calendar-hebrew-short-kislev-p h-year))
711d00e7
GM
1095 (type (cond ((and long-h (not short-k)) "complete")
1096 ((and (not long-h) short-k) "incomplete")
1097 (t "regular")))
1098 (year-format
1099 (symbol-value
8fc9e5a0 1100 (intern (format "calendar-hebrew-year-%s-%s-%s" ; keviah
711d00e7
GM
1101 rosh-hashanah-day type passover-day))))
1102 (first-saturday ; of Hebrew year
1103 (calendar-dayname-on-or-before 6 (+ 6 rosh-hashanah)))
1104 (saturday ; which Saturday of the Hebrew year
1105 (/ (- d first-saturday) 7))
1106 (parasha (aref year-format saturday)))
1107 (if parasha
1108 (cons mark
1109 (format
1110 "Parashat %s"
1111 (if (listp parasha) ; Israel differs from diaspora
1112 (if (car parasha)
1113 (format "%s (diaspora), %s (Israel)"
8fc9e5a0 1114 (calendar-hebrew-parasha-name
711d00e7 1115 (car parasha))
8fc9e5a0 1116 (calendar-hebrew-parasha-name
711d00e7
GM
1117 (cdr parasha)))
1118 (format "%s (Israel)"
8fc9e5a0 1119 (calendar-hebrew-parasha-name
711d00e7 1120 (cdr parasha))))
8fc9e5a0
GM
1121 (calendar-hebrew-parasha-name parasha)))))))))
1122
1123(define-obsolete-function-alias 'diary-parasha 'diary-hebrew-parasha "23.1")
711d00e7 1124
87e1e9cd
GM
1125
1126(declare-function solar-setup "solar" ())
1127(declare-function solar-sunrise-sunset "solar" (date))
1128(defvar calendar-latitude)
1129(defvar calendar-longitude)
1130(defvar calendar-time-zone)
1131
1132
9ee4e581 1133;; To be called from diary-list-sexp-entries, where DATE is bound.
87e1e9cd
GM
1134;;;###diary-autoload
1135(defun diary-hebrew-sabbath-candles (&optional mark)
1136 "Local time of candle lighting diary entry--applies if date is a Friday.
1137No diary entry if there is no sunset on that date. Uses
1138`diary-hebrew-sabbath-candles-minutes'.
1139
1140An optional parameter MARK specifies a face or single-character string to
1141use when highlighting the day in the calendar."
1142 (require 'solar)
1143 (or (and calendar-latitude calendar-longitude calendar-time-zone)
1144 (solar-setup))
1145 (if (= (% (calendar-absolute-from-gregorian date) 7) 5) ; Friday
d347df4f 1146 (let ((sunset (cadr (solar-sunrise-sunset date))))
87e1e9cd 1147 (if sunset
d347df4f
GM
1148 (cons mark (format
1149 "%s Sabbath candle lighting"
1150 (apply 'solar-time-string
1151 (cons (- (car sunset)
1152 (/ diary-hebrew-sabbath-candles-minutes
1153 60.0))
1154 (cdr sunset)))))))))
87e1e9cd
GM
1155
1156;;;###diary-autoload
1157(define-obsolete-function-alias 'diary-sabbath-candles
1158 'diary-hebrew-sabbath-candles "23.1")
1159
1160
4b112ac4
ER
1161(provide 'cal-hebrew)
1162
1163;;; cal-hebrew.el ends here