annotate lisp/calendar/cal-persia.el @ 67086:7ae3d744378e

(Custom-reset-standard): Make it handle Custom group buffers correctly. (It used to throw an error in such buffers.) Make it ask for confirmation in group buffers and other Custom buffers containing more than one customization item.
author Luc Teirlinck <teirllm@auburn.edu>
date Tue, 22 Nov 2005 23:28:28 +0000
parents ac895e21e622
children a55ee709ec8d a3716f7538f2
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
38422
7a94f1c588c4 Some fixes to follow coding conventions.
Pavel Janík <Pavel@Janik.cz>
parents: 24186
diff changeset
1 ;;; cal-persia.el --- calendar functions for the Persian calendar
14914
8fbe0c9dc86f Initial revision
Edward M. Reingold <reingold@emr.cs.iit.edu>
parents:
diff changeset
2
20462
d179de7ad92e Add reference to new Calendrical Calculations book.
Paul Eggert <eggert@twinsun.com>
parents: 17382
diff changeset
3 ;; Copyright (C) 1996, 1997 Free Software Foundation, Inc.
14914
8fbe0c9dc86f Initial revision
Edward M. Reingold <reingold@emr.cs.iit.edu>
parents:
diff changeset
4
8fbe0c9dc86f Initial revision
Edward M. Reingold <reingold@emr.cs.iit.edu>
parents:
diff changeset
5 ;; Author: Edward M. Reingold <reingold@cs.uiuc.edu>
8fbe0c9dc86f Initial revision
Edward M. Reingold <reingold@emr.cs.iit.edu>
parents:
diff changeset
6 ;; Keywords: calendar
8fbe0c9dc86f Initial revision
Edward M. Reingold <reingold@emr.cs.iit.edu>
parents:
diff changeset
7 ;; Human-Keywords: Persian calendar, calendar, diary
8fbe0c9dc86f Initial revision
Edward M. Reingold <reingold@emr.cs.iit.edu>
parents:
diff changeset
8
8fbe0c9dc86f Initial revision
Edward M. Reingold <reingold@emr.cs.iit.edu>
parents:
diff changeset
9 ;; This file is part of GNU Emacs.
8fbe0c9dc86f Initial revision
Edward M. Reingold <reingold@emr.cs.iit.edu>
parents:
diff changeset
10
8fbe0c9dc86f Initial revision
Edward M. Reingold <reingold@emr.cs.iit.edu>
parents:
diff changeset
11 ;; GNU Emacs is free software; you can redistribute it and/or modify
8fbe0c9dc86f Initial revision
Edward M. Reingold <reingold@emr.cs.iit.edu>
parents:
diff changeset
12 ;; it under the terms of the GNU General Public License as published by
8fbe0c9dc86f Initial revision
Edward M. Reingold <reingold@emr.cs.iit.edu>
parents:
diff changeset
13 ;; the Free Software Foundation; either version 2, or (at your option)
8fbe0c9dc86f Initial revision
Edward M. Reingold <reingold@emr.cs.iit.edu>
parents:
diff changeset
14 ;; any later version.
8fbe0c9dc86f Initial revision
Edward M. Reingold <reingold@emr.cs.iit.edu>
parents:
diff changeset
15
8fbe0c9dc86f Initial revision
Edward M. Reingold <reingold@emr.cs.iit.edu>
parents:
diff changeset
16 ;; GNU Emacs is distributed in the hope that it will be useful,
8fbe0c9dc86f Initial revision
Edward M. Reingold <reingold@emr.cs.iit.edu>
parents:
diff changeset
17 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
8fbe0c9dc86f Initial revision
Edward M. Reingold <reingold@emr.cs.iit.edu>
parents:
diff changeset
18 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
8fbe0c9dc86f Initial revision
Edward M. Reingold <reingold@emr.cs.iit.edu>
parents:
diff changeset
19 ;; GNU General Public License for more details.
8fbe0c9dc86f Initial revision
Edward M. Reingold <reingold@emr.cs.iit.edu>
parents:
diff changeset
20
8fbe0c9dc86f Initial revision
Edward M. Reingold <reingold@emr.cs.iit.edu>
parents:
diff changeset
21 ;; You should have received a copy of the GNU General Public License
15070
ec84bec5804e Update some comments.
Edward M. Reingold <reingold@emr.cs.iit.edu>
parents: 14914
diff changeset
22 ;; along with GNU Emacs; see the file COPYING. If not, write to the
64085
18a818a2ee7c Update FSF's address.
Lute Kamstra <lute@gnu.org>
parents: 61148
diff changeset
23 ;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
18a818a2ee7c Update FSF's address.
Lute Kamstra <lute@gnu.org>
parents: 61148
diff changeset
24 ;; Boston, MA 02110-1301, USA.
14914
8fbe0c9dc86f Initial revision
Edward M. Reingold <reingold@emr.cs.iit.edu>
parents:
diff changeset
25
8fbe0c9dc86f Initial revision
Edward M. Reingold <reingold@emr.cs.iit.edu>
parents:
diff changeset
26 ;;; Commentary:
8fbe0c9dc86f Initial revision
Edward M. Reingold <reingold@emr.cs.iit.edu>
parents:
diff changeset
27
8fbe0c9dc86f Initial revision
Edward M. Reingold <reingold@emr.cs.iit.edu>
parents:
diff changeset
28 ;; This collection of functions implements the features of calendar.el and
8fbe0c9dc86f Initial revision
Edward M. Reingold <reingold@emr.cs.iit.edu>
parents:
diff changeset
29 ;; diary.el that deal with the Persian calendar.
8fbe0c9dc86f Initial revision
Edward M. Reingold <reingold@emr.cs.iit.edu>
parents:
diff changeset
30
20462
d179de7ad92e Add reference to new Calendrical Calculations book.
Paul Eggert <eggert@twinsun.com>
parents: 17382
diff changeset
31 ;; Technical details of all the calendrical calculations can be found in
61148
7f7db25577d9 Update reference to "Calendrical Calculations" book; there's a new edition.
Paul Eggert <eggert@twinsun.com>
parents: 52401
diff changeset
32 ;; ``Calendrical Calculations: The Millennium Edition'' by Edward M. Reingold
7f7db25577d9 Update reference to "Calendrical Calculations" book; there's a new edition.
Paul Eggert <eggert@twinsun.com>
parents: 52401
diff changeset
33 ;; and Nachum Dershowitz, Cambridge University Press (2001).
20462
d179de7ad92e Add reference to new Calendrical Calculations book.
Paul Eggert <eggert@twinsun.com>
parents: 17382
diff changeset
34
14914
8fbe0c9dc86f Initial revision
Edward M. Reingold <reingold@emr.cs.iit.edu>
parents:
diff changeset
35 ;; Comments, corrections, and improvements should be sent to
8fbe0c9dc86f Initial revision
Edward M. Reingold <reingold@emr.cs.iit.edu>
parents:
diff changeset
36 ;; Edward M. Reingold Department of Computer Science
8fbe0c9dc86f Initial revision
Edward M. Reingold <reingold@emr.cs.iit.edu>
parents:
diff changeset
37 ;; (217) 333-6733 University of Illinois at Urbana-Champaign
8fbe0c9dc86f Initial revision
Edward M. Reingold <reingold@emr.cs.iit.edu>
parents:
diff changeset
38 ;; reingold@cs.uiuc.edu 1304 West Springfield Avenue
8fbe0c9dc86f Initial revision
Edward M. Reingold <reingold@emr.cs.iit.edu>
parents:
diff changeset
39 ;; Urbana, Illinois 61801
8fbe0c9dc86f Initial revision
Edward M. Reingold <reingold@emr.cs.iit.edu>
parents:
diff changeset
40
8fbe0c9dc86f Initial revision
Edward M. Reingold <reingold@emr.cs.iit.edu>
parents:
diff changeset
41 ;;; Code:
8fbe0c9dc86f Initial revision
Edward M. Reingold <reingold@emr.cs.iit.edu>
parents:
diff changeset
42
65145
ac895e21e622 (date): Add defvar.
Juanma Barranquero <lekktu@gmail.com>
parents: 64085
diff changeset
43 (defvar date)
ac895e21e622 (date): Add defvar.
Juanma Barranquero <lekktu@gmail.com>
parents: 64085
diff changeset
44
14914
8fbe0c9dc86f Initial revision
Edward M. Reingold <reingold@emr.cs.iit.edu>
parents:
diff changeset
45 (require 'cal-julian)
8fbe0c9dc86f Initial revision
Edward M. Reingold <reingold@emr.cs.iit.edu>
parents:
diff changeset
46
8fbe0c9dc86f Initial revision
Edward M. Reingold <reingold@emr.cs.iit.edu>
parents:
diff changeset
47 (defvar persian-calendar-month-name-array
8fbe0c9dc86f Initial revision
Edward M. Reingold <reingold@emr.cs.iit.edu>
parents:
diff changeset
48 ["Farvardin" "Ordibehest" "Xordad" "Tir" "Mordad" "Sahrivar" "Mehr" "Aban"
8fbe0c9dc86f Initial revision
Edward M. Reingold <reingold@emr.cs.iit.edu>
parents:
diff changeset
49 "Azar" "Dey" "Bahman" "Esfand"])
8fbe0c9dc86f Initial revision
Edward M. Reingold <reingold@emr.cs.iit.edu>
parents:
diff changeset
50
8fbe0c9dc86f Initial revision
Edward M. Reingold <reingold@emr.cs.iit.edu>
parents:
diff changeset
51 (defvar persian-calendar-epoch (calendar-absolute-from-julian '(3 19 622))
8fbe0c9dc86f Initial revision
Edward M. Reingold <reingold@emr.cs.iit.edu>
parents:
diff changeset
52 "Absolute date of start of Persian calendar = March 19, 622 A.D. (Julian).")
8fbe0c9dc86f Initial revision
Edward M. Reingold <reingold@emr.cs.iit.edu>
parents:
diff changeset
53
8fbe0c9dc86f Initial revision
Edward M. Reingold <reingold@emr.cs.iit.edu>
parents:
diff changeset
54 (defun persian-calendar-leap-year-p (year)
8fbe0c9dc86f Initial revision
Edward M. Reingold <reingold@emr.cs.iit.edu>
parents:
diff changeset
55 "True if YEAR is a leap year on the Persian calendar."
8fbe0c9dc86f Initial revision
Edward M. Reingold <reingold@emr.cs.iit.edu>
parents:
diff changeset
56 (< (mod (* (mod (mod (if (<= 0 year)
8fbe0c9dc86f Initial revision
Edward M. Reingold <reingold@emr.cs.iit.edu>
parents:
diff changeset
57 ; No year zero
8fbe0c9dc86f Initial revision
Edward M. Reingold <reingold@emr.cs.iit.edu>
parents:
diff changeset
58 (+ year 2346)
8fbe0c9dc86f Initial revision
Edward M. Reingold <reingold@emr.cs.iit.edu>
parents:
diff changeset
59 (+ year 2347))
8fbe0c9dc86f Initial revision
Edward M. Reingold <reingold@emr.cs.iit.edu>
parents:
diff changeset
60 2820)
8fbe0c9dc86f Initial revision
Edward M. Reingold <reingold@emr.cs.iit.edu>
parents:
diff changeset
61 768)
8fbe0c9dc86f Initial revision
Edward M. Reingold <reingold@emr.cs.iit.edu>
parents:
diff changeset
62 683)
8fbe0c9dc86f Initial revision
Edward M. Reingold <reingold@emr.cs.iit.edu>
parents:
diff changeset
63 2820)
8fbe0c9dc86f Initial revision
Edward M. Reingold <reingold@emr.cs.iit.edu>
parents:
diff changeset
64 683))
8fbe0c9dc86f Initial revision
Edward M. Reingold <reingold@emr.cs.iit.edu>
parents:
diff changeset
65
8fbe0c9dc86f Initial revision
Edward M. Reingold <reingold@emr.cs.iit.edu>
parents:
diff changeset
66 (defun persian-calendar-last-day-of-month (month year)
8fbe0c9dc86f Initial revision
Edward M. Reingold <reingold@emr.cs.iit.edu>
parents:
diff changeset
67 "Return last day of MONTH, YEAR on the Persian calendar."
8fbe0c9dc86f Initial revision
Edward M. Reingold <reingold@emr.cs.iit.edu>
parents:
diff changeset
68 (cond
8fbe0c9dc86f Initial revision
Edward M. Reingold <reingold@emr.cs.iit.edu>
parents:
diff changeset
69 ((< month 7) 31)
8fbe0c9dc86f Initial revision
Edward M. Reingold <reingold@emr.cs.iit.edu>
parents:
diff changeset
70 ((or (< month 12) (persian-calendar-leap-year-p year)) 30)
8fbe0c9dc86f Initial revision
Edward M. Reingold <reingold@emr.cs.iit.edu>
parents:
diff changeset
71 (t 29)))
8fbe0c9dc86f Initial revision
Edward M. Reingold <reingold@emr.cs.iit.edu>
parents:
diff changeset
72
8fbe0c9dc86f Initial revision
Edward M. Reingold <reingold@emr.cs.iit.edu>
parents:
diff changeset
73 (defun calendar-absolute-from-persian (date)
8fbe0c9dc86f Initial revision
Edward M. Reingold <reingold@emr.cs.iit.edu>
parents:
diff changeset
74 "Compute absolute date from Persian date DATE.
8fbe0c9dc86f Initial revision
Edward M. Reingold <reingold@emr.cs.iit.edu>
parents:
diff changeset
75 The absolute date is the number of days elapsed since the (imaginary)
8fbe0c9dc86f Initial revision
Edward M. Reingold <reingold@emr.cs.iit.edu>
parents:
diff changeset
76 Gregorian date Sunday, December 31, 1 BC."
8fbe0c9dc86f Initial revision
Edward M. Reingold <reingold@emr.cs.iit.edu>
parents:
diff changeset
77 (let ((month (extract-calendar-month date))
8fbe0c9dc86f Initial revision
Edward M. Reingold <reingold@emr.cs.iit.edu>
parents:
diff changeset
78 (day (extract-calendar-day date))
8fbe0c9dc86f Initial revision
Edward M. Reingold <reingold@emr.cs.iit.edu>
parents:
diff changeset
79 (year (extract-calendar-year date)))
8fbe0c9dc86f Initial revision
Edward M. Reingold <reingold@emr.cs.iit.edu>
parents:
diff changeset
80 (if (< year 0)
8fbe0c9dc86f Initial revision
Edward M. Reingold <reingold@emr.cs.iit.edu>
parents:
diff changeset
81 (+ (calendar-absolute-from-persian
8fbe0c9dc86f Initial revision
Edward M. Reingold <reingold@emr.cs.iit.edu>
parents:
diff changeset
82 (list month day (1+ (mod year 2820))))
8fbe0c9dc86f Initial revision
Edward M. Reingold <reingold@emr.cs.iit.edu>
parents:
diff changeset
83 (* 1029983 (floor year 2820)))
8fbe0c9dc86f Initial revision
Edward M. Reingold <reingold@emr.cs.iit.edu>
parents:
diff changeset
84 (+ (1- persian-calendar-epoch); Days before epoch
8fbe0c9dc86f Initial revision
Edward M. Reingold <reingold@emr.cs.iit.edu>
parents:
diff changeset
85 (* 365 (1- year)) ; Days in prior years.
8fbe0c9dc86f Initial revision
Edward M. Reingold <reingold@emr.cs.iit.edu>
parents:
diff changeset
86 (* 683 ; Leap days in prior 2820-year cycles
8fbe0c9dc86f Initial revision
Edward M. Reingold <reingold@emr.cs.iit.edu>
parents:
diff changeset
87 (floor (+ year 2345) 2820))
8fbe0c9dc86f Initial revision
Edward M. Reingold <reingold@emr.cs.iit.edu>
parents:
diff changeset
88 (* 186 ; Leap days in prior 768 year cycles
8fbe0c9dc86f Initial revision
Edward M. Reingold <reingold@emr.cs.iit.edu>
parents:
diff changeset
89 (floor (mod (+ year 2345) 2820) 768))
8fbe0c9dc86f Initial revision
Edward M. Reingold <reingold@emr.cs.iit.edu>
parents:
diff changeset
90 (floor; Leap years in current 768 or 516 year cycle
8fbe0c9dc86f Initial revision
Edward M. Reingold <reingold@emr.cs.iit.edu>
parents:
diff changeset
91 (* 683 (mod (mod (+ year 2345) 2820) 768))
8fbe0c9dc86f Initial revision
Edward M. Reingold <reingold@emr.cs.iit.edu>
parents:
diff changeset
92 2820)
8fbe0c9dc86f Initial revision
Edward M. Reingold <reingold@emr.cs.iit.edu>
parents:
diff changeset
93 -568 ; Leap years in Persian years -2345...-1
8fbe0c9dc86f Initial revision
Edward M. Reingold <reingold@emr.cs.iit.edu>
parents:
diff changeset
94 (calendar-sum ; Days in prior months this year.
8fbe0c9dc86f Initial revision
Edward M. Reingold <reingold@emr.cs.iit.edu>
parents:
diff changeset
95 m 1 (< m month)
8fbe0c9dc86f Initial revision
Edward M. Reingold <reingold@emr.cs.iit.edu>
parents:
diff changeset
96 (persian-calendar-last-day-of-month m year))
8fbe0c9dc86f Initial revision
Edward M. Reingold <reingold@emr.cs.iit.edu>
parents:
diff changeset
97 day)))) ; Days so far this month.
8fbe0c9dc86f Initial revision
Edward M. Reingold <reingold@emr.cs.iit.edu>
parents:
diff changeset
98
8fbe0c9dc86f Initial revision
Edward M. Reingold <reingold@emr.cs.iit.edu>
parents:
diff changeset
99 (defun calendar-persian-year-from-absolute (date)
8fbe0c9dc86f Initial revision
Edward M. Reingold <reingold@emr.cs.iit.edu>
parents:
diff changeset
100 "Persian year corresponding to the absolute DATE."
8fbe0c9dc86f Initial revision
Edward M. Reingold <reingold@emr.cs.iit.edu>
parents:
diff changeset
101 (let* ((d0 ; Prior days since start of 2820 cycles
8fbe0c9dc86f Initial revision
Edward M. Reingold <reingold@emr.cs.iit.edu>
parents:
diff changeset
102 (- date (calendar-absolute-from-persian (list 1 1 -2345))))
8fbe0c9dc86f Initial revision
Edward M. Reingold <reingold@emr.cs.iit.edu>
parents:
diff changeset
103 (n2820 ; Completed 2820-year cycles
8fbe0c9dc86f Initial revision
Edward M. Reingold <reingold@emr.cs.iit.edu>
parents:
diff changeset
104 (floor d0 1029983))
8fbe0c9dc86f Initial revision
Edward M. Reingold <reingold@emr.cs.iit.edu>
parents:
diff changeset
105 (d1 ; Prior days not in n2820
8fbe0c9dc86f Initial revision
Edward M. Reingold <reingold@emr.cs.iit.edu>
parents:
diff changeset
106 (mod d0 1029983))
8fbe0c9dc86f Initial revision
Edward M. Reingold <reingold@emr.cs.iit.edu>
parents:
diff changeset
107 (n768 ; 768-year cycles not in n2820
8fbe0c9dc86f Initial revision
Edward M. Reingold <reingold@emr.cs.iit.edu>
parents:
diff changeset
108 (floor d1 280506))
8fbe0c9dc86f Initial revision
Edward M. Reingold <reingold@emr.cs.iit.edu>
parents:
diff changeset
109 (d2 ; Prior days not in n2820 or n768
8fbe0c9dc86f Initial revision
Edward M. Reingold <reingold@emr.cs.iit.edu>
parents:
diff changeset
110 (mod d1 280506))
8fbe0c9dc86f Initial revision
Edward M. Reingold <reingold@emr.cs.iit.edu>
parents:
diff changeset
111 (n1 ; Years not in n2820 or n768
8fbe0c9dc86f Initial revision
Edward M. Reingold <reingold@emr.cs.iit.edu>
parents:
diff changeset
112 ; we want is
8fbe0c9dc86f Initial revision
Edward M. Reingold <reingold@emr.cs.iit.edu>
parents:
diff changeset
113 ; (floor (+ (* 2820 d2) (* 2820 366)) 1029983))
8fbe0c9dc86f Initial revision
Edward M. Reingold <reingold@emr.cs.iit.edu>
parents:
diff changeset
114 ; but that causes overflow, so we use
8fbe0c9dc86f Initial revision
Edward M. Reingold <reingold@emr.cs.iit.edu>
parents:
diff changeset
115 (let ((a (floor d2 366)); we use 366 as the divisor because
8fbe0c9dc86f Initial revision
Edward M. Reingold <reingold@emr.cs.iit.edu>
parents:
diff changeset
116 ; (2820*366 mod 1029983) is small
8fbe0c9dc86f Initial revision
Edward M. Reingold <reingold@emr.cs.iit.edu>
parents:
diff changeset
117 (b (mod d2 366)))
8fbe0c9dc86f Initial revision
Edward M. Reingold <reingold@emr.cs.iit.edu>
parents:
diff changeset
118 (+ 1 a (floor (+ (* 2137 a) (* 2820 b) 2137) 1029983))))
8fbe0c9dc86f Initial revision
Edward M. Reingold <reingold@emr.cs.iit.edu>
parents:
diff changeset
119 (year (+ (* 2820 n2820); Complete 2820 year cycles
8fbe0c9dc86f Initial revision
Edward M. Reingold <reingold@emr.cs.iit.edu>
parents:
diff changeset
120 (* 768 n768) ; Complete 768 year cycles
8fbe0c9dc86f Initial revision
Edward M. Reingold <reingold@emr.cs.iit.edu>
parents:
diff changeset
121 (if ; Remaining years
8fbe0c9dc86f Initial revision
Edward M. Reingold <reingold@emr.cs.iit.edu>
parents:
diff changeset
122 ; Last day of 2820 year cycle
8fbe0c9dc86f Initial revision
Edward M. Reingold <reingold@emr.cs.iit.edu>
parents:
diff changeset
123 (= d1 1029617)
8fbe0c9dc86f Initial revision
Edward M. Reingold <reingold@emr.cs.iit.edu>
parents:
diff changeset
124 (1- n1)
8fbe0c9dc86f Initial revision
Edward M. Reingold <reingold@emr.cs.iit.edu>
parents:
diff changeset
125 n1)
8fbe0c9dc86f Initial revision
Edward M. Reingold <reingold@emr.cs.iit.edu>
parents:
diff changeset
126 -2345))) ; Years before year 1
8fbe0c9dc86f Initial revision
Edward M. Reingold <reingold@emr.cs.iit.edu>
parents:
diff changeset
127 (if (< year 1)
8fbe0c9dc86f Initial revision
Edward M. Reingold <reingold@emr.cs.iit.edu>
parents:
diff changeset
128 (1- year); No year zero
8fbe0c9dc86f Initial revision
Edward M. Reingold <reingold@emr.cs.iit.edu>
parents:
diff changeset
129 year)))
8fbe0c9dc86f Initial revision
Edward M. Reingold <reingold@emr.cs.iit.edu>
parents:
diff changeset
130
8fbe0c9dc86f Initial revision
Edward M. Reingold <reingold@emr.cs.iit.edu>
parents:
diff changeset
131 (defun calendar-persian-from-absolute (date)
8fbe0c9dc86f Initial revision
Edward M. Reingold <reingold@emr.cs.iit.edu>
parents:
diff changeset
132 "Compute the Persian equivalent for absolute date DATE.
8fbe0c9dc86f Initial revision
Edward M. Reingold <reingold@emr.cs.iit.edu>
parents:
diff changeset
133 The result is a list of the form (MONTH DAY YEAR).
8fbe0c9dc86f Initial revision
Edward M. Reingold <reingold@emr.cs.iit.edu>
parents:
diff changeset
134 The absolute date is the number of days elapsed since the imaginary
8fbe0c9dc86f Initial revision
Edward M. Reingold <reingold@emr.cs.iit.edu>
parents:
diff changeset
135 Gregorian date Sunday, December 31, 1 BC."
8fbe0c9dc86f Initial revision
Edward M. Reingold <reingold@emr.cs.iit.edu>
parents:
diff changeset
136 (let* ((year (calendar-persian-year-from-absolute date))
8fbe0c9dc86f Initial revision
Edward M. Reingold <reingold@emr.cs.iit.edu>
parents:
diff changeset
137 (month ; Search forward from Farvardin
8fbe0c9dc86f Initial revision
Edward M. Reingold <reingold@emr.cs.iit.edu>
parents:
diff changeset
138 (1+ (calendar-sum m 1
8fbe0c9dc86f Initial revision
Edward M. Reingold <reingold@emr.cs.iit.edu>
parents:
diff changeset
139 (> date
8fbe0c9dc86f Initial revision
Edward M. Reingold <reingold@emr.cs.iit.edu>
parents:
diff changeset
140 (calendar-absolute-from-persian
8fbe0c9dc86f Initial revision
Edward M. Reingold <reingold@emr.cs.iit.edu>
parents:
diff changeset
141 (list
8fbe0c9dc86f Initial revision
Edward M. Reingold <reingold@emr.cs.iit.edu>
parents:
diff changeset
142 m
8fbe0c9dc86f Initial revision
Edward M. Reingold <reingold@emr.cs.iit.edu>
parents:
diff changeset
143 (persian-calendar-last-day-of-month m year)
8fbe0c9dc86f Initial revision
Edward M. Reingold <reingold@emr.cs.iit.edu>
parents:
diff changeset
144 year)))
8fbe0c9dc86f Initial revision
Edward M. Reingold <reingold@emr.cs.iit.edu>
parents:
diff changeset
145 1)))
8fbe0c9dc86f Initial revision
Edward M. Reingold <reingold@emr.cs.iit.edu>
parents:
diff changeset
146 (day ; Calculate the day by subtraction
8fbe0c9dc86f Initial revision
Edward M. Reingold <reingold@emr.cs.iit.edu>
parents:
diff changeset
147 (- date (1- (calendar-absolute-from-persian
8fbe0c9dc86f Initial revision
Edward M. Reingold <reingold@emr.cs.iit.edu>
parents:
diff changeset
148 (list month 1 year))))))
8fbe0c9dc86f Initial revision
Edward M. Reingold <reingold@emr.cs.iit.edu>
parents:
diff changeset
149 (list month day year)))
8fbe0c9dc86f Initial revision
Edward M. Reingold <reingold@emr.cs.iit.edu>
parents:
diff changeset
150
8fbe0c9dc86f Initial revision
Edward M. Reingold <reingold@emr.cs.iit.edu>
parents:
diff changeset
151 (defun calendar-persian-date-string (&optional date)
8fbe0c9dc86f Initial revision
Edward M. Reingold <reingold@emr.cs.iit.edu>
parents:
diff changeset
152 "String of Persian date of Gregorian DATE.
8fbe0c9dc86f Initial revision
Edward M. Reingold <reingold@emr.cs.iit.edu>
parents:
diff changeset
153 Defaults to today's date if DATE is not given."
8fbe0c9dc86f Initial revision
Edward M. Reingold <reingold@emr.cs.iit.edu>
parents:
diff changeset
154 (let* ((persian-date (calendar-persian-from-absolute
8fbe0c9dc86f Initial revision
Edward M. Reingold <reingold@emr.cs.iit.edu>
parents:
diff changeset
155 (calendar-absolute-from-gregorian
8fbe0c9dc86f Initial revision
Edward M. Reingold <reingold@emr.cs.iit.edu>
parents:
diff changeset
156 (or date (calendar-current-date)))))
8fbe0c9dc86f Initial revision
Edward M. Reingold <reingold@emr.cs.iit.edu>
parents:
diff changeset
157 (y (extract-calendar-year persian-date))
8fbe0c9dc86f Initial revision
Edward M. Reingold <reingold@emr.cs.iit.edu>
parents:
diff changeset
158 (m (extract-calendar-month persian-date)))
8fbe0c9dc86f Initial revision
Edward M. Reingold <reingold@emr.cs.iit.edu>
parents:
diff changeset
159 (let ((monthname (aref persian-calendar-month-name-array (1- m)))
8fbe0c9dc86f Initial revision
Edward M. Reingold <reingold@emr.cs.iit.edu>
parents:
diff changeset
160 (day (int-to-string (extract-calendar-day persian-date)))
8fbe0c9dc86f Initial revision
Edward M. Reingold <reingold@emr.cs.iit.edu>
parents:
diff changeset
161 (dayname nil)
8fbe0c9dc86f Initial revision
Edward M. Reingold <reingold@emr.cs.iit.edu>
parents:
diff changeset
162 (month (int-to-string m))
8fbe0c9dc86f Initial revision
Edward M. Reingold <reingold@emr.cs.iit.edu>
parents:
diff changeset
163 (year (int-to-string y)))
8fbe0c9dc86f Initial revision
Edward M. Reingold <reingold@emr.cs.iit.edu>
parents:
diff changeset
164 (mapconcat 'eval calendar-date-display-form ""))))
8fbe0c9dc86f Initial revision
Edward M. Reingold <reingold@emr.cs.iit.edu>
parents:
diff changeset
165
8fbe0c9dc86f Initial revision
Edward M. Reingold <reingold@emr.cs.iit.edu>
parents:
diff changeset
166 (defun calendar-print-persian-date ()
8fbe0c9dc86f Initial revision
Edward M. Reingold <reingold@emr.cs.iit.edu>
parents:
diff changeset
167 "Show the Persian calendar equivalent of the selected date."
8fbe0c9dc86f Initial revision
Edward M. Reingold <reingold@emr.cs.iit.edu>
parents:
diff changeset
168 (interactive)
8fbe0c9dc86f Initial revision
Edward M. Reingold <reingold@emr.cs.iit.edu>
parents:
diff changeset
169 (message "Persian date: %s"
8fbe0c9dc86f Initial revision
Edward M. Reingold <reingold@emr.cs.iit.edu>
parents:
diff changeset
170 (calendar-persian-date-string (calendar-cursor-to-date t))))
8fbe0c9dc86f Initial revision
Edward M. Reingold <reingold@emr.cs.iit.edu>
parents:
diff changeset
171
8fbe0c9dc86f Initial revision
Edward M. Reingold <reingold@emr.cs.iit.edu>
parents:
diff changeset
172 (defun calendar-goto-persian-date (date &optional noecho)
8fbe0c9dc86f Initial revision
Edward M. Reingold <reingold@emr.cs.iit.edu>
parents:
diff changeset
173 "Move cursor to Persian date DATE.
8fbe0c9dc86f Initial revision
Edward M. Reingold <reingold@emr.cs.iit.edu>
parents:
diff changeset
174 Echo Persian date unless NOECHO is t."
8fbe0c9dc86f Initial revision
Edward M. Reingold <reingold@emr.cs.iit.edu>
parents:
diff changeset
175 (interactive (persian-prompt-for-date))
8fbe0c9dc86f Initial revision
Edward M. Reingold <reingold@emr.cs.iit.edu>
parents:
diff changeset
176 (calendar-goto-date (calendar-gregorian-from-absolute
8fbe0c9dc86f Initial revision
Edward M. Reingold <reingold@emr.cs.iit.edu>
parents:
diff changeset
177 (calendar-absolute-from-persian date)))
8fbe0c9dc86f Initial revision
Edward M. Reingold <reingold@emr.cs.iit.edu>
parents:
diff changeset
178 (or noecho (calendar-print-persian-date)))
8fbe0c9dc86f Initial revision
Edward M. Reingold <reingold@emr.cs.iit.edu>
parents:
diff changeset
179
8fbe0c9dc86f Initial revision
Edward M. Reingold <reingold@emr.cs.iit.edu>
parents:
diff changeset
180 (defun persian-prompt-for-date ()
8fbe0c9dc86f Initial revision
Edward M. Reingold <reingold@emr.cs.iit.edu>
parents:
diff changeset
181 "Ask for a Persian date."
8fbe0c9dc86f Initial revision
Edward M. Reingold <reingold@emr.cs.iit.edu>
parents:
diff changeset
182 (let* ((today (calendar-current-date))
8fbe0c9dc86f Initial revision
Edward M. Reingold <reingold@emr.cs.iit.edu>
parents:
diff changeset
183 (year (calendar-read
8fbe0c9dc86f Initial revision
Edward M. Reingold <reingold@emr.cs.iit.edu>
parents:
diff changeset
184 "Persian calendar year (not 0): "
8fbe0c9dc86f Initial revision
Edward M. Reingold <reingold@emr.cs.iit.edu>
parents:
diff changeset
185 '(lambda (x) (/= x 0))
8fbe0c9dc86f Initial revision
Edward M. Reingold <reingold@emr.cs.iit.edu>
parents:
diff changeset
186 (int-to-string
8fbe0c9dc86f Initial revision
Edward M. Reingold <reingold@emr.cs.iit.edu>
parents:
diff changeset
187 (extract-calendar-year
8fbe0c9dc86f Initial revision
Edward M. Reingold <reingold@emr.cs.iit.edu>
parents:
diff changeset
188 (calendar-persian-from-absolute
8fbe0c9dc86f Initial revision
Edward M. Reingold <reingold@emr.cs.iit.edu>
parents:
diff changeset
189 (calendar-absolute-from-gregorian today))))))
8fbe0c9dc86f Initial revision
Edward M. Reingold <reingold@emr.cs.iit.edu>
parents:
diff changeset
190 (completion-ignore-case t)
8fbe0c9dc86f Initial revision
Edward M. Reingold <reingold@emr.cs.iit.edu>
parents:
diff changeset
191 (month (cdr (assoc
8fbe0c9dc86f Initial revision
Edward M. Reingold <reingold@emr.cs.iit.edu>
parents:
diff changeset
192 (completing-read
8fbe0c9dc86f Initial revision
Edward M. Reingold <reingold@emr.cs.iit.edu>
parents:
diff changeset
193 "Persian calendar month name: "
8fbe0c9dc86f Initial revision
Edward M. Reingold <reingold@emr.cs.iit.edu>
parents:
diff changeset
194 (mapcar 'list
8fbe0c9dc86f Initial revision
Edward M. Reingold <reingold@emr.cs.iit.edu>
parents:
diff changeset
195 (append persian-calendar-month-name-array nil))
24186
8aae7db1922c (persian-prompt-for-date): Use assoc-ignore-case and do not capitalize
Richard M. Stallman <rms@gnu.org>
parents: 20462
diff changeset
196 nil t)
14914
8fbe0c9dc86f Initial revision
Edward M. Reingold <reingold@emr.cs.iit.edu>
parents:
diff changeset
197 (calendar-make-alist persian-calendar-month-name-array
24186
8aae7db1922c (persian-prompt-for-date): Use assoc-ignore-case and do not capitalize
Richard M. Stallman <rms@gnu.org>
parents: 20462
diff changeset
198 1))))
14914
8fbe0c9dc86f Initial revision
Edward M. Reingold <reingold@emr.cs.iit.edu>
parents:
diff changeset
199 (last (persian-calendar-last-day-of-month month year))
8fbe0c9dc86f Initial revision
Edward M. Reingold <reingold@emr.cs.iit.edu>
parents:
diff changeset
200 (day (calendar-read
8fbe0c9dc86f Initial revision
Edward M. Reingold <reingold@emr.cs.iit.edu>
parents:
diff changeset
201 (format "Persian calendar day (1-%d): " last)
8fbe0c9dc86f Initial revision
Edward M. Reingold <reingold@emr.cs.iit.edu>
parents:
diff changeset
202 '(lambda (x) (and (< 0 x) (<= x last))))))
8fbe0c9dc86f Initial revision
Edward M. Reingold <reingold@emr.cs.iit.edu>
parents:
diff changeset
203 (list (list month day year))))
8fbe0c9dc86f Initial revision
Edward M. Reingold <reingold@emr.cs.iit.edu>
parents:
diff changeset
204
8fbe0c9dc86f Initial revision
Edward M. Reingold <reingold@emr.cs.iit.edu>
parents:
diff changeset
205 (defun diary-persian-date ()
8fbe0c9dc86f Initial revision
Edward M. Reingold <reingold@emr.cs.iit.edu>
parents:
diff changeset
206 "Persian calendar equivalent of date diary entry."
17382
41db5b776fe4 (diary-persian-date): Use `date'.
Richard M. Stallman <rms@gnu.org>
parents: 15259
diff changeset
207 (format "Persian date: %s" (calendar-persian-date-string date)))
14914
8fbe0c9dc86f Initial revision
Edward M. Reingold <reingold@emr.cs.iit.edu>
parents:
diff changeset
208
15259
984ea4011d7e Renamed from cal-persian.el to avoid 14-character limitation.
Karl Heuer <kwzh@gnu.org>
parents: 15070
diff changeset
209 (provide 'cal-persia)
14914
8fbe0c9dc86f Initial revision
Edward M. Reingold <reingold@emr.cs.iit.edu>
parents:
diff changeset
210
52401
695cf19ef79e Add arch taglines
Miles Bader <miles@gnu.org>
parents: 38422
diff changeset
211 ;;; arch-tag: 2832383c-e4b4-4dc2-8ee9-cfbdd53e5e2d
15259
984ea4011d7e Renamed from cal-persian.el to avoid 14-character limitation.
Karl Heuer <kwzh@gnu.org>
parents: 15070
diff changeset
212 ;;; cal-persia.el ends here