comparison lisp/calendar/cal-islam.el @ 92926:b87a8e95883b

(displayed-month, displayed-year) (original-date): Move declarations where needed. (islamic-calendar-day-number): Remove unused local variable `day'. (calendar-goto-islamic-date): Doc fix. (holiday-islamic): Use unless. (list-islamic-diary-entries, mark-islamic-diary-entries): Move some constant variables outside the loop. Use dolist. (mark-islamic-calendar-date-pattern): Move definition before use. Use unless. (mark-islamic-diary-entries): Doc fix. (insert-islamic-diary-entry, insert-monthly-islamic-diary-entry) (insert-yearly-islamic-diary-entry): Use let rather than let*.
author Glenn Morris <rgm@gnu.org>
date Fri, 14 Mar 2008 07:13:35 +0000
parents 0f2bf92fe13d
children 56c7e60586c9
comparison
equal deleted inserted replaced
92925:85bb22fa60a0 92926:b87a8e95883b
33 ;; Technical details of all the calendrical calculations can be found in 33 ;; Technical details of all the calendrical calculations can be found in
34 ;; ``Calendrical Calculations: The Millennium Edition'' by Edward M. Reingold 34 ;; ``Calendrical Calculations: The Millennium Edition'' by Edward M. Reingold
35 ;; and Nachum Dershowitz, Cambridge University Press (2001). 35 ;; and Nachum Dershowitz, Cambridge University Press (2001).
36 36
37 ;;; Code: 37 ;;; Code:
38
39 (defvar displayed-month)
40 (defvar displayed-year)
41 (defvar original-date)
42 38
43 (require 'cal-julian) 39 (require 'cal-julian)
44 40
45 (defvar calendar-islamic-month-name-array 41 (defvar calendar-islamic-month-name-array
46 ["Muharram" "Safar" "Rabi I" "Rabi II" "Jumada I" "Jumada II" 42 ["Muharram" "Safar" "Rabi I" "Rabi II" "Jumada I" "Jumada II"
62 ((memq month (list 2 4 6 8 10)) 29) 58 ((memq month (list 2 4 6 8 10)) 29)
63 (t (if (islamic-calendar-leap-year-p year) 30 29)))) 59 (t (if (islamic-calendar-leap-year-p year) 30 29))))
64 60
65 (defun islamic-calendar-day-number (date) 61 (defun islamic-calendar-day-number (date)
66 "Return the day number within the year of the Islamic date DATE." 62 "Return the day number within the year of the Islamic date DATE."
67 (let* ((month (extract-calendar-month date)) 63 (let ((month (extract-calendar-month date)))
68 (day (extract-calendar-day date))) 64 (+ (* 30 (/ month 2))
69 (+ (* 30 (/ month 2)) 65 (* 29 (/ (1- month) 2))
70 (* 29 (/ (1- month) 2)) 66 (extract-calendar-day date))))
71 day)))
72 67
73 (defun calendar-absolute-from-islamic (date) 68 (defun calendar-absolute-from-islamic (date)
74 "Absolute date of Islamic DATE. 69 "Absolute date of Islamic DATE.
75 The absolute date is the number of days elapsed since the (imaginary) 70 The absolute date is the number of days elapsed since the (imaginary)
76 Gregorian date Sunday, December 31, 1 BC." 71 Gregorian date Sunday, December 31, 1 BC."
77 (let* ((month (extract-calendar-month date)) 72 (let* ((month (extract-calendar-month date))
78 (day (extract-calendar-day date)) 73 (day (extract-calendar-day date))
79 (year (extract-calendar-year date)) 74 (year (extract-calendar-year date))
80 (y (% year 30)) 75 (y (% year 30))
81 (leap-years-in-cycle 76 (leap-years-in-cycle
82 (cond 77 (cond ((< y 3) 0)
83 ((< y 3) 0) ((< y 6) 1) ((< y 8) 2) ((< y 11) 3) ((< y 14) 4) 78 ((< y 6) 1)
84 ((< y 17) 5) ((< y 19) 6) ((< y 22) 7) ((< y 25) 8) ((< y 27) 9) 79 ((< y 8) 2)
85 (t 10)))) 80 ((< y 11) 3)
81 ((< y 14) 4)
82 ((< y 17) 5)
83 ((< y 19) 6)
84 ((< y 22) 7)
85 ((< y 25) 8)
86 ((< y 27) 9)
87 (t 10))))
86 (+ (islamic-calendar-day-number date) ; days so far this year 88 (+ (islamic-calendar-day-number date) ; days so far this year
87 (* (1- year) 354) ; days in all non-leap years 89 (* (1- year) 354) ; days in all non-leap years
88 (* 11 (/ year 30)) ; leap days in complete cycles 90 (* 11 (/ year 30)) ; leap days in complete cycles
89 leap-years-in-cycle ; leap days this cycle 91 leap-years-in-cycle ; leap days this cycle
90 (1- calendar-islamic-epoch)))) ; days before start of calendar 92 (1- calendar-islamic-epoch)))) ; days before start of calendar
140 (message "Date is pre-Islamic") 142 (message "Date is pre-Islamic")
141 (message "Islamic date (until sunset): %s" i)))) 143 (message "Islamic date (until sunset): %s" i))))
142 144
143 ;;;###cal-autoload 145 ;;;###cal-autoload
144 (defun calendar-goto-islamic-date (date &optional noecho) 146 (defun calendar-goto-islamic-date (date &optional noecho)
145 "Move cursor to Islamic DATE; echo Islamic date unless NOECHO is t." 147 "Move cursor to Islamic DATE; echo Islamic date unless NOECHO is non-nil."
146 (interactive 148 (interactive
147 (let* ((today (calendar-current-date)) 149 (let* ((today (calendar-current-date))
148 (year (calendar-read 150 (year (calendar-read
149 "Islamic calendar year (>0): " 151 "Islamic calendar year (>0): "
150 (lambda (x) (> x 0)) 152 (lambda (x) (> x 0))
167 (list (list month day year)))) 169 (list (list month day year))))
168 (calendar-goto-date (calendar-gregorian-from-absolute 170 (calendar-goto-date (calendar-gregorian-from-absolute
169 (calendar-absolute-from-islamic date))) 171 (calendar-absolute-from-islamic date)))
170 (or noecho (calendar-print-islamic-date))) 172 (or noecho (calendar-print-islamic-date)))
171 173
174 (defvar displayed-month) ; from generate-calendar
175 (defvar displayed-year)
176
172 ;;;###holiday-autoload 177 ;;;###holiday-autoload
173 (defun holiday-islamic (month day string) 178 (defun holiday-islamic (month day string)
174 "Holiday on MONTH, DAY (Islamic) called STRING. 179 "Holiday on MONTH, DAY (Islamic) called STRING.
175 If MONTH, DAY (Islamic) is visible, the value returned is corresponding 180 If MONTH, DAY (Islamic) is visible, the value returned is corresponding
176 Gregorian date in the form of the list (((month day year) STRING)). Returns 181 Gregorian date in the form of the list (((month day year) STRING)). Returns
179 (calendar-absolute-from-gregorian 184 (calendar-absolute-from-gregorian
180 (list displayed-month 15 displayed-year)))) 185 (list displayed-month 15 displayed-year))))
181 (m (extract-calendar-month islamic-date)) 186 (m (extract-calendar-month islamic-date))
182 (y (extract-calendar-year islamic-date)) 187 (y (extract-calendar-year islamic-date))
183 (date)) 188 (date))
184 (if (< m 1) 189 (unless (< m 1) ; Islamic calendar doesn't apply
185 nil ; Islamic calendar doesn't apply
186 (increment-calendar-month m y (- 10 month)) 190 (increment-calendar-month m y (- 10 month))
187 (if (> m 7) ; Islamic date might be visible 191 (if (> m 7) ; Islamic date might be visible
188 (let ((date (calendar-gregorian-from-absolute 192 (let ((date (calendar-gregorian-from-absolute
189 (calendar-absolute-from-islamic (list month day y))))) 193 (calendar-absolute-from-islamic (list month day y)))))
190 (if (calendar-date-is-visible-p date) 194 (if (calendar-date-is-visible-p date)
191 (list (list date string)))))))) 195 (list (list date string))))))))
192 196
193 ;; l-i-d-e should be called from diary code. 197 ;; l-i-d-e should be called from diary code.
194 (declare-function add-to-diary-list "diary-lib" 198 (declare-function add-to-diary-list "diary-lib"
195 (date string specifier &optional marker globcolor literal)) 199 (date string specifier &optional marker globcolor literal))
196 200
197 (defvar number) ; from diary-list-entries 201 (defvar number) ; from diary-list-entries
202 (defvar original-date)
198 203
199 ;;;###diary-autoload 204 ;;;###diary-autoload
200 (defun list-islamic-diary-entries () 205 (defun list-islamic-diary-entries ()
201 "Add any Islamic date entries from the diary file to `diary-entries-list'. 206 "Add any Islamic date entries from the diary file to `diary-entries-list'.
202 Islamic date diary entries must be prefaced by `islamic-diary-entry-symbol' 207 Islamic date diary entries must be prefaced by `islamic-diary-entry-symbol'
212 (let ((buffer-read-only nil) 217 (let ((buffer-read-only nil)
213 (diary-modified (buffer-modified-p)) 218 (diary-modified (buffer-modified-p))
214 (gdate original-date) 219 (gdate original-date)
215 (mark (regexp-quote diary-nonmarking-symbol))) 220 (mark (regexp-quote diary-nonmarking-symbol)))
216 (dotimes (idummy number) 221 (dotimes (idummy number)
217 (let* ((d diary-date-forms) 222 (let* ((idate (calendar-islamic-from-absolute
218 (idate (calendar-islamic-from-absolute
219 (calendar-absolute-from-gregorian gdate))) 223 (calendar-absolute-from-gregorian gdate)))
220 (month (extract-calendar-month idate)) 224 (month (extract-calendar-month idate))
221 (day (extract-calendar-day idate)) 225 (day (extract-calendar-day idate))
222 (year (extract-calendar-year idate))) 226 (year (extract-calendar-year idate))
223 (while d 227 backup)
224 (let* 228 (dolist (date-form diary-date-forms)
225 ((date-form (if (equal (car (car d)) 'backup) 229 (if (setq backup (eq (car date-form) 'backup))
226 (cdr (car d)) 230 (setq date-form (cdr date-form)))
227 (car d))) 231 (let* ((dayname
228 (backup (equal (car (car d)) 'backup)) 232 (format "%s\\|%s\\.?"
229 (dayname 233 (calendar-day-name gdate)
230 (format "%s\\|%s\\.?" 234 (calendar-day-name gdate 'abbrev)))
231 (calendar-day-name gdate) 235 (calendar-month-name-array
232 (calendar-day-name gdate 'abbrev))) 236 calendar-islamic-month-name-array)
233 (calendar-month-name-array 237 (monthname
234 calendar-islamic-month-name-array) 238 (concat "\\*\\|" (calendar-month-name month)))
235 (monthname 239 (month (concat "\\*\\|0*" (int-to-string month)))
236 (concat 240 (day (concat "\\*\\|0*" (int-to-string day)))
237 "\\*\\|" 241 (year
238 (calendar-month-name month))) 242 (concat "\\*\\|0*" (int-to-string year)
239 (month (concat "\\*\\|0*" (int-to-string month))) 243 (if abbreviated-calendar-year
240 (day (concat "\\*\\|0*" (int-to-string day))) 244 (concat "\\|" (int-to-string (% year 100)))
241 (year 245 "")))
242 (concat 246 ;; FIXME ^M can go now.
243 "\\*\\|0*" (int-to-string year) 247 (regexp
244 (if abbreviated-calendar-year 248 (concat
245 (concat "\\|" (int-to-string (% year 100))) 249 "\\(\\`\\|\^M\\|\n\\)" mark "?"
246 ""))) 250 (regexp-quote islamic-diary-entry-symbol)
247 (regexp 251 "\\("
248 (concat 252 (mapconcat 'eval date-form "\\)\\(")
249 "\\(\\`\\|\^M\\|\n\\)" mark "?" 253 "\\)"))
250 (regexp-quote islamic-diary-entry-symbol) 254 (case-fold-search t))
251 "\\("
252 (mapconcat 'eval date-form "\\)\\(")
253 "\\)"))
254 (case-fold-search t))
255 (goto-char (point-min)) 255 (goto-char (point-min))
256 (while (re-search-forward regexp nil t) 256 (while (re-search-forward regexp nil t)
257 (if backup (re-search-backward "\\<" nil t)) 257 (if backup (re-search-backward "\\<" nil t))
258 (if (and (or (char-equal (preceding-char) ?\^M) 258 (if (and (or (char-equal (preceding-char) ?\^M)
259 (char-equal (preceding-char) ?\n)) 259 (char-equal (preceding-char) ?\n))
274 (add-to-diary-list 274 (add-to-diary-list
275 gdate 275 gdate
276 (buffer-substring-no-properties entry-start (point)) 276 (buffer-substring-no-properties entry-start (point))
277 (buffer-substring-no-properties 277 (buffer-substring-no-properties
278 (1+ date-start) (1- entry-start)) 278 (1+ date-start) (1- entry-start))
279 (copy-marker entry-start)))))) 279 (copy-marker entry-start))))))))
280 (setq d (cdr d))))
281 (setq gdate 280 (setq gdate
282 (calendar-gregorian-from-absolute 281 (calendar-gregorian-from-absolute
283 (1+ (calendar-absolute-from-gregorian gdate))))) 282 (1+ (calendar-absolute-from-gregorian gdate)))))
284 (set-buffer-modified-p diary-modified)) 283 (set-buffer-modified-p diary-modified))
285 (goto-char (point-min)))) 284 (goto-char (point-min))))
286
287 (declare-function diary-name-pattern "diary-lib"
288 (string-array &optional abbrev-array paren))
289
290 (declare-function mark-calendar-days-named "diary-lib"
291 (dayname &optional color))
292
293 ;;;###diary-autoload
294 (defun mark-islamic-diary-entries ()
295 "Mark days in the calendar window that have Islamic date diary entries.
296 Each entry in `diary-file' (or included files) visible in the calendar window
297 is marked. Islamic date entries are prefaced by `islamic-diary-entry-symbol'
298 \(normally an `I'). The same `diary-date-forms' govern the style of the Islamic
299 calendar entries, except that the Islamic month names must be spelled in full.
300 The Islamic months are numbered from 1 to 12 with Muharram being 1 and 12 being
301 Dhu al-Hijjah. Islamic date diary entries that begin with a
302 `diary-nonmarking-symbol' will not be marked in the calendar. This function is
303 provided for use as part of the `nongregorian-diary-marking-hook'."
304 (let ((d diary-date-forms))
305 (while d
306 (let*
307 ((date-form (if (equal (car (car d)) 'backup)
308 (cdr (car d))
309 (car d))) ; ignore 'backup directive
310 (dayname (diary-name-pattern calendar-day-name-array
311 calendar-day-abbrev-array))
312 (monthname
313 (format "%s\\|\\*"
314 (diary-name-pattern calendar-islamic-month-name-array)))
315 (month "[0-9]+\\|\\*")
316 (day "[0-9]+\\|\\*")
317 (year "[0-9]+\\|\\*")
318 (l (length date-form))
319 (d-name-pos (- l (length (memq 'dayname date-form))))
320 (d-name-pos (if (/= l d-name-pos) (+ 2 d-name-pos)))
321 (m-name-pos (- l (length (memq 'monthname date-form))))
322 (m-name-pos (if (/= l m-name-pos) (+ 2 m-name-pos)))
323 (d-pos (- l (length (memq 'day date-form))))
324 (d-pos (if (/= l d-pos) (+ 2 d-pos)))
325 (m-pos (- l (length (memq 'month date-form))))
326 (m-pos (if (/= l m-pos) (+ 2 m-pos)))
327 (y-pos (- l (length (memq 'year date-form))))
328 (y-pos (if (/= l y-pos) (+ 2 y-pos)))
329 (regexp
330 (concat
331 "\\(\\`\\|\^M\\|\n\\)"
332 (regexp-quote islamic-diary-entry-symbol)
333 "\\("
334 (mapconcat 'eval date-form "\\)\\(")
335 "\\)"))
336 (case-fold-search t))
337 (goto-char (point-min))
338 (while (re-search-forward regexp nil t)
339 (let* ((dd-name
340 (if d-name-pos
341 (buffer-substring
342 (match-beginning d-name-pos)
343 (match-end d-name-pos))))
344 (mm-name
345 (if m-name-pos
346 (buffer-substring
347 (match-beginning m-name-pos)
348 (match-end m-name-pos))))
349 (mm (string-to-number
350 (if m-pos
351 (buffer-substring
352 (match-beginning m-pos)
353 (match-end m-pos))
354 "")))
355 (dd (string-to-number
356 (if d-pos
357 (buffer-substring
358 (match-beginning d-pos)
359 (match-end d-pos))
360 "")))
361 (y-str (if y-pos
362 (buffer-substring
363 (match-beginning y-pos)
364 (match-end y-pos))))
365 (yy (if (not y-str)
366 0
367 (if (and (= (length y-str) 2)
368 abbreviated-calendar-year)
369 (let* ((current-y
370 (extract-calendar-year
371 (calendar-islamic-from-absolute
372 (calendar-absolute-from-gregorian
373 (calendar-current-date)))))
374 (y (+ (string-to-number y-str)
375 (* 100 (/ current-y 100)))))
376 (if (> (- y current-y) 50)
377 (- y 100)
378 (if (> (- current-y y) 50)
379 (+ y 100)
380 y)))
381 (string-to-number y-str)))))
382 (if dd-name
383 (mark-calendar-days-named
384 (cdr (assoc-string dd-name
385 (calendar-make-alist
386 calendar-day-name-array
387 0 nil calendar-day-abbrev-array) t)))
388 (if mm-name
389 (setq mm (if (string-equal mm-name "*") 0
390 (cdr (assoc-string
391 mm-name
392 (calendar-make-alist
393 calendar-islamic-month-name-array) t)))))
394 (mark-islamic-calendar-date-pattern mm dd yy)))))
395 (setq d (cdr d)))))
396 285
397 ;;;###diary-autoload 286 ;;;###diary-autoload
398 (defun mark-islamic-calendar-date-pattern (month day year) 287 (defun mark-islamic-calendar-date-pattern (month day year)
399 "Mark dates in calendar window that conform to Islamic date MONTH/DAY/YEAR. 288 "Mark dates in calendar window that conform to Islamic date MONTH/DAY/YEAR.
400 A value of 0 in any position is a wildcard." 289 A value of 0 in any position is a wildcard."
413 (calendar-absolute-from-gregorian 302 (calendar-absolute-from-gregorian
414 (list displayed-month 15 displayed-year)))) 303 (list displayed-month 15 displayed-year))))
415 (m (extract-calendar-month islamic-date)) 304 (m (extract-calendar-month islamic-date))
416 (y (extract-calendar-year islamic-date)) 305 (y (extract-calendar-year islamic-date))
417 (date)) 306 (date))
418 (if (< m 1) 307 (unless (< m 1) ; Islamic calendar doesn't apply
419 nil ; Islamic calendar doesn't apply
420 (increment-calendar-month m y (- 10 month)) 308 (increment-calendar-month m y (- 10 month))
421 (if (> m 7) ; Islamic date might be visible 309 (if (> m 7) ; Islamic date might be visible
422 (let ((date (calendar-gregorian-from-absolute 310 (let ((date (calendar-gregorian-from-absolute
423 (calendar-absolute-from-islamic 311 (calendar-absolute-from-islamic
424 (list month day y))))) 312 (list month day y)))))
425 (if (calendar-date-is-visible-p date) 313 (if (calendar-date-is-visible-p date)
426 (mark-visible-calendar-date date))))))) 314 (mark-visible-calendar-date date)))))))
451 (or (zerop year) 339 (or (zerop year)
452 (= year i-year)) 340 (= year i-year))
453 (mark-visible-calendar-date 341 (mark-visible-calendar-date
454 (calendar-gregorian-from-absolute date))))))))) 342 (calendar-gregorian-from-absolute date)))))))))
455 343
344 (declare-function diary-name-pattern "diary-lib"
345 (string-array &optional abbrev-array paren))
346
347 (declare-function mark-calendar-days-named "diary-lib"
348 (dayname &optional color))
349
350 ;;;###diary-autoload
351 (defun mark-islamic-diary-entries ()
352 "Mark days in the calendar window that have Islamic date diary entries.
353 Mark each entry in `diary-file' (or included files) visible in the calendar
354 window. Islamic date entries are prefaced by `islamic-diary-entry-symbol'
355 \(normally an `I'). The same `diary-date-forms' govern the style
356 of the Islamic calendar entries, except that the Islamic month
357 names must be spelled in full. The Islamic months are numbered
358 from 1 to 12 with Muharram being 1 and 12 being Dhu al-Hijjah.
359 Islamic date diary entries that begin with `diary-nonmarking-symbol'
360 are not marked. This function is provided for use as part of
361 `nongregorian-diary-marking-hook'."
362 (let ((dayname (diary-name-pattern calendar-day-name-array
363 calendar-day-abbrev-array))
364 (monthname
365 (format "%s\\|\\*"
366 (diary-name-pattern calendar-islamic-month-name-array)))
367 (month "[0-9]+\\|\\*")
368 (day "[0-9]+\\|\\*")
369 (year "[0-9]+\\|\\*")
370 (case-fold-search t))
371 (dolist (date-form diary-date-forms)
372 (if (eq (car date-form) 'backup) ; ignore 'backup directive
373 (setq date-form (cdr date-form)))
374 (let* ((l (length date-form))
375 (d-name-pos (- l (length (memq 'dayname date-form))))
376 (d-name-pos (if (/= l d-name-pos) (+ 2 d-name-pos)))
377 (m-name-pos (- l (length (memq 'monthname date-form))))
378 (m-name-pos (if (/= l m-name-pos) (+ 2 m-name-pos)))
379 (d-pos (- l (length (memq 'day date-form))))
380 (d-pos (if (/= l d-pos) (+ 2 d-pos)))
381 (m-pos (- l (length (memq 'month date-form))))
382 (m-pos (if (/= l m-pos) (+ 2 m-pos)))
383 (y-pos (- l (length (memq 'year date-form))))
384 (y-pos (if (/= l y-pos) (+ 2 y-pos)))
385 (regexp
386 (concat
387 "\\(\\`\\|\^M\\|\n\\)"
388 (regexp-quote islamic-diary-entry-symbol)
389 "\\("
390 (mapconcat 'eval date-form "\\)\\(")
391 "\\)")))
392 (goto-char (point-min))
393 (while (re-search-forward regexp nil t)
394 (let* ((dd-name
395 (if d-name-pos
396 (buffer-substring
397 (match-beginning d-name-pos)
398 (match-end d-name-pos))))
399 (mm-name
400 (if m-name-pos
401 (buffer-substring
402 (match-beginning m-name-pos)
403 (match-end m-name-pos))))
404 (mm (string-to-number
405 (if m-pos
406 (buffer-substring
407 (match-beginning m-pos)
408 (match-end m-pos))
409 "")))
410 (dd (string-to-number
411 (if d-pos
412 (buffer-substring
413 (match-beginning d-pos)
414 (match-end d-pos))
415 "")))
416 (y-str (if y-pos
417 (buffer-substring
418 (match-beginning y-pos)
419 (match-end y-pos))))
420 (yy (if (not y-str)
421 0
422 (if (and (= (length y-str) 2)
423 abbreviated-calendar-year)
424 (let* ((current-y
425 (extract-calendar-year
426 (calendar-islamic-from-absolute
427 (calendar-absolute-from-gregorian
428 (calendar-current-date)))))
429 (y (+ (string-to-number y-str)
430 (* 100 (/ current-y 100)))))
431 (if (> (- y current-y) 50)
432 (- y 100)
433 (if (> (- current-y y) 50)
434 (+ y 100)
435 y)))
436 (string-to-number y-str)))))
437 (if dd-name
438 (mark-calendar-days-named
439 (cdr (assoc-string dd-name
440 (calendar-make-alist
441 calendar-day-name-array
442 0 nil calendar-day-abbrev-array) t)))
443 (if mm-name
444 (setq mm (if (string-equal mm-name "*") 0
445 (cdr (assoc-string
446 mm-name
447 (calendar-make-alist
448 calendar-islamic-month-name-array) t)))))
449 (mark-islamic-calendar-date-pattern mm dd yy))))))))
450
456 ;;;###cal-autoload 451 ;;;###cal-autoload
457 (defun insert-islamic-diary-entry (arg) 452 (defun insert-islamic-diary-entry (arg)
458 "Insert a diary entry. 453 "Insert a diary entry.
459 For the Islamic date corresponding to the date indicated by point. 454 For the Islamic date corresponding to the date indicated by point.
460 Prefix argument ARG makes the entry nonmarking." 455 Prefix argument ARG makes the entry nonmarking."
461 (interactive "P") 456 (interactive "P")
462 (let* ((calendar-month-name-array calendar-islamic-month-name-array)) 457 (let ((calendar-month-name-array calendar-islamic-month-name-array))
463 (make-diary-entry 458 (make-diary-entry
464 (concat 459 (concat islamic-diary-entry-symbol
465 islamic-diary-entry-symbol 460 (calendar-date-string
466 (calendar-date-string 461 (calendar-islamic-from-absolute
467 (calendar-islamic-from-absolute 462 (calendar-absolute-from-gregorian (calendar-cursor-to-date t)))
468 (calendar-absolute-from-gregorian 463 nil t))
469 (calendar-cursor-to-date t)))
470 nil t))
471 arg))) 464 arg)))
472 465
473 ;;;###cal-autoload 466 ;;;###cal-autoload
474 (defun insert-monthly-islamic-diary-entry (arg) 467 (defun insert-monthly-islamic-diary-entry (arg)
475 "Insert a monthly diary entry. 468 "Insert a monthly diary entry.
476 For the day of the Islamic month corresponding to the date indicated by point. 469 For the day of the Islamic month corresponding to the date indicated by point.
477 Prefix argument ARG makes the entry nonmarking." 470 Prefix argument ARG makes the entry nonmarking."
478 (interactive "P") 471 (interactive "P")
479 (let* ((calendar-date-display-form 472 (let ((calendar-date-display-form (if european-calendar-style
480 (if european-calendar-style '(day " * ") '("* " day ))) 473 '(day " * ")
481 (calendar-month-name-array calendar-islamic-month-name-array)) 474 '("* " day )))
475 (calendar-month-name-array calendar-islamic-month-name-array))
482 (make-diary-entry 476 (make-diary-entry
483 (concat 477 (concat islamic-diary-entry-symbol
484 islamic-diary-entry-symbol 478 (calendar-date-string
485 (calendar-date-string 479 (calendar-islamic-from-absolute
486 (calendar-islamic-from-absolute 480 (calendar-absolute-from-gregorian (calendar-cursor-to-date t)))))
487 (calendar-absolute-from-gregorian
488 (calendar-cursor-to-date t)))))
489 arg))) 481 arg)))
490 482
491 ;;;###cal-autoload 483 ;;;###cal-autoload
492 (defun insert-yearly-islamic-diary-entry (arg) 484 (defun insert-yearly-islamic-diary-entry (arg)
493 "Insert an annual diary entry. 485 "Insert an annual diary entry.
494 For the day of the Islamic year corresponding to the date indicated by point. 486 For the day of the Islamic year corresponding to the date indicated by point.
495 Prefix argument ARG makes the entry nonmarking." 487 Prefix argument ARG makes the entry nonmarking."
496 (interactive "P") 488 (interactive "P")
497 (let* ((calendar-date-display-form 489 (let ((calendar-date-display-form (if european-calendar-style
498 (if european-calendar-style 490 '(day " " monthname)
499 '(day " " monthname) 491 '(monthname " " day)))
500 '(monthname " " day))) 492 (calendar-month-name-array calendar-islamic-month-name-array))
501 (calendar-month-name-array calendar-islamic-month-name-array))
502 (make-diary-entry 493 (make-diary-entry
503 (concat 494 (concat islamic-diary-entry-symbol
504 islamic-diary-entry-symbol 495 (calendar-date-string
505 (calendar-date-string 496 (calendar-islamic-from-absolute
506 (calendar-islamic-from-absolute 497 (calendar-absolute-from-gregorian (calendar-cursor-to-date t)))))
507 (calendar-absolute-from-gregorian
508 (calendar-cursor-to-date t)))))
509 arg))) 498 arg)))
510 499
511 (defvar date) 500 (defvar date)
512 501
513 ;; To be called from diary-sexp-entry, where DATE, ENTRY are bound. 502 ;; To be called from diary-sexp-entry, where DATE, ENTRY are bound.