Commit | Line | Data |
---|---|---|
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. | |
40 | Used 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. |
59 | Measured 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. |
118 | The absolute date is the number of days elapsed since the (imaginary) | |
119 | Gregorian 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. | |
144 | The absolute date is the number of days elapsed since the (imaginary) | |
145 | Gregorian 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. | |
179 | Defaults to today's date if DATE is not given. | |
180 | Driven 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. | |
238 | Reads 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. | |
294 | Returns 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. | |
336 | If MONTH, DAY (Hebrew) is visible, the value returned is corresponding | |
337 | Gregorian date in the form of the list (((month day year) STRING)). Returns | |
338 | nil 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 | 350 | Shows only the major holidays, unless `calendar-hebrew-all-holidays-flag' |
f2268dc0 GM |
351 | or 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 | 407 | Shows only Hanukkah, unless `calendar-hebrew-all-holidays-flag' or ALL |
f2268dc0 | 408 | is 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 | 443 | Shows only the major holidays, unless `calendar-hebrew-all-holidays-flag' |
f2268dc0 GM |
444 | or 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. | |
557 | Includes: Tal Umatar, Tzom Teveth, Tu B'Shevat, Shabbat Shirah, and | |
558 | Kiddush 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 | 624 | Hebrew 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 |
626 | of the Hebrew calendar entries, except that the Hebrew month | |
872edde5 | 627 | names cannot be abbreviated. The Hebrew months are numbered |
8f11970d GM |
628 | from 1 to 13 with Nisan being 1, 12 being Adar I and 13 being |
629 | Adar II; you must use `Adar I' if you want Adar of a common | |
630 | Hebrew year. If a Hebrew date diary entry begins with | |
631 | `diary-nonmarking-symbol', the entry will appear in the diary | |
632 | listing, but will not be marked in the calendar. This function | |
9ee4e581 | 633 | is 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 | 646 | A value of 0 in any position is a wildcard. Optional argument COLOR is |
e803eab7 | 647 | passed 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 |
674 | Marks each entry in `diary-file' (or included files) visible in the calendar |
675 | window. 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 | 690 | Prefix 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. |
703 | For the day of the Hebrew month corresponding to the date indicated by point. | |
6afe7cdd | 704 | Prefix 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. |
716 | For the day of the Hebrew year corresponding to the date indicated by point. | |
6afe7cdd | 717 | Prefix 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. |
729 | When called interactively from the calendar window, the date of death is taken | |
730 | from 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 |
806 | Entry applies if date is within 50 days after Passover. |
807 | ||
a1506d29 | 808 | An optional parameter MARK specifies a face or single-character string to |
9a27723c | 809 | use 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 |
841 | Parameters are DEATH-MONTH, DEATH-DAY, DEATH-YEAR; the diary |
842 | entry is assumed to be the name of the person. Although the date | |
843 | of death is specified by the civil calendar, the proper Hebrew | |
844 | calendar Yahrzeit is determined. | |
845 | ||
846 | The 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 | 849 | An optional parameter MARK specifies a face or single-character string to |
9a27723c | 850 | use 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 |
875 | Entry applies if date is Rosh Hodesh, the day before, or the Saturday before. |
876 | ||
a1506d29 | 877 | An optional parameter MARK specifies a face or single-character string to |
9a27723c | 878 | use 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. |
965 | Hebrew year starts on Saturday, is `incomplete' (Heshvan and Kislev each have | |
966 | 29 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. |
973 | Hebrew year that starts on Saturday, is `complete' (Heshvan and Kislev each | |
974 | have 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. |
981 | Hebrew year that starts on Monday, is `incomplete' (Heshvan and Kislev each | |
982 | have 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. |
989 | Hebrew year that starts on Monday, is `complete' (Heshvan and Kislev each have | |
990 | 30 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. |
997 | Hebrew year that starts on Tuesday, is `regular' (Heshvan has 29 days and | |
998 | Kislev 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. |
1006 | Hebrew year that starts on Thursday, is `regular' (Heshvan has 29 days and | |
1007 | Kislev 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. |
1014 | Hebrew year that starts on Thursday, is `complete' (Heshvan and Kislev each | |
1015 | have 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. |
1023 | Hebrew year that starts on Saturday, is `incomplete' (Heshvan and Kislev each | |
1024 | have 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. |
1031 | Hebrew year that starts on Saturday, is `complete' (Heshvan and Kislev each | |
1032 | have 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. |
1039 | Hebrew year that starts on Monday, is `incomplete' (Heshvan and Kislev each | |
1040 | have 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. |
1048 | Hebrew year that starts on Monday, is `complete' (Heshvan and Kislev each have | |
1049 | 30 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. |
1057 | Hebrew year that starts on Tuesday, is `regular' (Heshvan has 29 days and | |
1058 | Kislev 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. |
1065 | Hebrew year that starts on Thursday, is `incomplete' (Heshvan and Kislev both | |
1066 | have 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. |
1073 | Hebrew year that starts on Thursday, is `complete' (Heshvan and Kislev both | |
1074 | have 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. |
1079 | An optional parameter MARK specifies a face or single-character string to | |
1080 | use 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. | |
1137 | No diary entry if there is no sunset on that date. Uses | |
1138 | `diary-hebrew-sabbath-candles-minutes'. | |
1139 | ||
1140 | An optional parameter MARK specifies a face or single-character string to | |
1141 | use 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 |