]> code.delx.au - gnu-emacs/blobdiff - lisp/calendar/holidays.el
(calendar-mode-map): Refer to diary-show-all-entries rather than alias
[gnu-emacs] / lisp / calendar / holidays.el
index b262ac50a38592e0b0822d8f72a653450d7c4db2..5a29bf8fff1fa57b0426f4d15e4be525fa66e7c4 100644 (file)
@@ -1,8 +1,10 @@
 ;;; holidays.el --- holiday functions for the calendar package
 
 ;;; holidays.el --- holiday functions for the calendar package
 
-;; Copyright (C) 1989, 90, 92, 93, 94, 1997 Free Software Foundation, Inc.
+;; Copyright (C) 1989, 1990, 1992, 1993, 1994, 1997, 2001, 2002, 2003,
+;;   2004, 2005, 2006  Free Software Foundation, Inc.
 
 ;; Author: Edward M. Reingold <reingold@cs.uiuc.edu>
 
 ;; Author: Edward M. Reingold <reingold@cs.uiuc.edu>
+;; Maintainer: Glenn Morris <rgm@gnu.org>
 ;; Keywords: holidays, calendar
 
 ;; This file is part of GNU Emacs.
 ;; Keywords: holidays, calendar
 
 ;; This file is part of GNU Emacs.
@@ -19,8 +21,8 @@
 
 ;; You should have received a copy of the GNU General Public License
 ;; along with GNU Emacs; see the file COPYING.  If not, write to the
 
 ;; You should have received a copy of the GNU General Public License
 ;; along with GNU Emacs; see the file COPYING.  If not, write to the
-;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-;; Boston, MA 02111-1307, USA.
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
 
 ;;; Commentary:
 
 
 ;;; Commentary:
 
@@ -28,8 +30,8 @@
 ;; in calendar.el.
 
 ;; Technical details of all the calendrical calculations can be found in
 ;; in calendar.el.
 
 ;; Technical details of all the calendrical calculations can be found in
-;; ``Calendrical Calculations'' by Nachum Dershowitz and Edward M. Reingold,
-;; Cambridge University Press (1997).
+;; ``Calendrical Calculations: The Millennium Edition'' by Edward M. Reingold
+;; and Nachum Dershowitz, Cambridge University Press (2001).
 
 ;; An earlier version of the technical details appeared in
 ;; ``Calendrical Calculations'' by Nachum Dershowitz and Edward M. Reingold,
 
 ;; An earlier version of the technical details appeared in
 ;; ``Calendrical Calculations'' by Nachum Dershowitz and Edward M. Reingold,
   "Holiday on MONTH, DAY (Islamic) called STRING."
   t)
 
   "Holiday on MONTH, DAY (Islamic) called STRING."
   t)
 
+(autoload 'holiday-bahai "cal-bahai"
+  "Holiday on MONTH, DAY (Baha'i) called STRING."
+  t)
+
 (autoload 'holiday-chinese-new-year "cal-china"
   "Date of Chinese New Year."
   t)
 (autoload 'holiday-chinese-new-year "cal-china"
   "Date of Chinese New Year."
   t)
@@ -113,8 +119,21 @@ This function is suitable for execution in a .emacs file."
 (defun list-holidays (y1 y2 &optional l label)
   "Display holidays for years Y1 to Y2 (inclusive).
 
 (defun list-holidays (y1 y2 &optional l label)
   "Display holidays for years Y1 to Y2 (inclusive).
 
-The optional list of holidays L defaults to `calendar-holidays'.  See the
-documentation for that variable for a description of holiday lists.
+The optional list of holidays L defaults to `calendar-holidays'.
+If you want to control what holidays are displayed, use a
+different list.  For example,
+
+  (list-holidays 2006 2006
+    (append general-holidays local-holidays other-holidays))
+
+will display holidays for the year 2006 defined in the 3
+mentioned lists, and nothing else.
+
+When called interactively, this command offers a choice of
+holidays, based on the variables `solar-holidays' etc.  See the
+documentation of `calendar-holidays' for a list of the variables
+that control the choices, as well as a description of the format
+of a holiday list.
 
 The optional LABEL is used to label the buffer created."
   (interactive
 
 The optional LABEL is used to label the buffer created."
   (interactive
@@ -141,6 +160,7 @@ The optional LABEL is used to label the buffer created."
             (if christian-holidays (cons "Christian" christian-holidays))
             (if hebrew-holidays (cons "Hebrew" hebrew-holidays))
             (if islamic-holidays (cons "Islamic" islamic-holidays))
             (if christian-holidays (cons "Christian" christian-holidays))
             (if hebrew-holidays (cons "Hebrew" hebrew-holidays))
             (if islamic-holidays (cons "Islamic" islamic-holidays))
+            (if bahai-holidays (cons "Baha'i" bahai-holidays))
             (if oriental-holidays (cons "Oriental" oriental-holidays))
             (if solar-holidays (cons "Solar" solar-holidays))
             (cons "Ask" nil)))
             (if oriental-holidays (cons "Oriental" oriental-holidays))
             (if solar-holidays (cons "Solar" solar-holidays))
             (cons "Ask" nil)))
@@ -393,86 +413,88 @@ date.  If date is nil, or if the date is not visible, there is no holiday."
              (string (if date (eval string))))
         (list (list date string)))))))
 
              (string (if date (eval string))))
         (list (list date string)))))))
 
-(defun holiday-advent ()
-  "Date of Advent, if visible in calendar window."
-  (let ((year displayed-year)
-        (month displayed-month))
-    (increment-calendar-month month year -1)
-    (let ((advent (calendar-gregorian-from-absolute
-                   (calendar-dayname-on-or-before 0
-                    (calendar-absolute-from-gregorian
-                     (list 12 3 year))))))
-      (if (calendar-date-is-visible-p advent)
-          (list (list advent "Advent"))))))
-
-(defun holiday-easter-etc ()
-  "List of dates related to Easter, as visible in calendar window."
- (if (and (> displayed-month 5) (not all-christian-calendar-holidays))
-     nil;; Ash Wednesday, Good Friday, and Easter are not visible.
-   (let* ((century (1+ (/ displayed-year 100)))
-          (shifted-epact        ;; Age of moon for April 5...
-           (% (+ 14 (* 11 (% displayed-year 19));;     ...by Nicaean rule
-                 (-           ;; ...corrected for the Gregorian century rule
-                  (/ (* 3 century) 4))
-                 (/    ;; ...corrected for Metonic cycle inaccuracy.
-                  (+ 5 (* 8 century)) 25)
-                 (* 30 century));;              Keeps value positive.
-              30))
-          (adjusted-epact       ;;  Adjust for 29.5 day month.
-           (if (or (= shifted-epact 0)
-                   (and (= shifted-epact 1) (< 10 (% displayed-year 19))))
-               (1+ shifted-epact)
-             shifted-epact))
-          (paschal-moon       ;; Day after the full moon on or after March 21.
-           (- (calendar-absolute-from-gregorian (list 4 19 displayed-year))
-              adjusted-epact))
-          (abs-easter (calendar-dayname-on-or-before 0 (+ paschal-moon 7)))
-          (mandatory
-           (list
-            (list (calendar-gregorian-from-absolute abs-easter)
-                  "Easter Sunday")
-            (list (calendar-gregorian-from-absolute (- abs-easter 2))
-                  "Good Friday")
-            (list (calendar-gregorian-from-absolute (- abs-easter 46))
-                  "Ash Wednesday")))
-          (optional
-           (list
-            (list (calendar-gregorian-from-absolute (- abs-easter 63))
-                  "Septuagesima Sunday")
-            (list (calendar-gregorian-from-absolute (- abs-easter 56))
-                  "Sexagesima Sunday")
-            (list (calendar-gregorian-from-absolute (- abs-easter 49))
-                  "Shrove Sunday")
-            (list (calendar-gregorian-from-absolute (- abs-easter 48))
-                  "Shrove Monday")
-            (list (calendar-gregorian-from-absolute (- abs-easter 47))
-                  "Shrove Tuesday")
-            (list (calendar-gregorian-from-absolute (- abs-easter 14))
-                  "Passion Sunday")
-            (list (calendar-gregorian-from-absolute (- abs-easter 7))
-                  "Palm Sunday")
-            (list (calendar-gregorian-from-absolute (- abs-easter 3))
-                  "Maundy Thursday")
-            (list (calendar-gregorian-from-absolute (+ abs-easter 35))
-                  "Rogation Sunday")
-            (list (calendar-gregorian-from-absolute (+ abs-easter 39))
-                  "Ascension Day")
-            (list (calendar-gregorian-from-absolute (+ abs-easter 49))
-                  "Pentecost (Whitsunday)")
-            (list (calendar-gregorian-from-absolute (+ abs-easter 50))
-                  "Whitmonday")
-            (list (calendar-gregorian-from-absolute (+ abs-easter 56))
-                  "Trinity Sunday")
-            (list (calendar-gregorian-from-absolute (+ abs-easter 60))
-                  "Corpus Christi")))
-          (output-list
-           (filter-visible-calendar-holidays mandatory)))
-     (if all-christian-calendar-holidays
-         (setq output-list
-               (append
-                (filter-visible-calendar-holidays optional)
-                output-list)))
-     output-list)))
+(defun holiday-advent (&optional n string)
+  "Date of Nth day after advent (named STRING), if visible in calendar window.
+Negative values of N are interpreted as days before advent.
+STRING is used purely for display purposes.  The return value has
+the form ((MONTH DAY YEAR) STRING), where the date is that of the
+Nth day before or after advent.
+
+For backwards compatibility, if this function is called with no
+arguments, then it returns the value appropriate for advent itself."
+  ;; Backwards compatibility layer.
+  (if (not n)
+      (holiday-advent 0 "Advent")
+    (let ((year displayed-year)
+          (month displayed-month))
+      (increment-calendar-month month year -1)
+      (let ((advent (calendar-gregorian-from-absolute
+                     (+ n
+                        (calendar-dayname-on-or-before
+                         0
+                         (calendar-absolute-from-gregorian
+                          (list 12 3 year)))))))
+        (if (calendar-date-is-visible-p advent)
+            (list (list advent string)))))))
+
+(defun holiday-easter-etc (&optional n string)
+  "Date of Nth day after Easter (named STRING), if visible in calendar window.
+Negative values of N are interpreted as days before Easter.
+STRING is used purely for display purposes.  The return value has
+the form ((MONTH DAY YEAR) STRING), where the date is that of the
+Nth day before or after Easter.
+
+For backwards compatibility, if this function is called with no
+arguments, then it returns a list of \"standard\" Easter-related
+holidays (with more entries if `all-christian-calendar-holidays'
+is non-nil)."
+  ;; Backwards compatibility layer.
+  (if (not n)
+      (let (res-list res)
+        (dolist (elem (append
+                       (if all-christian-calendar-holidays
+                           '((-63 . "Septuagesima Sunday")
+                             (-56 . "Sexagesima Sunday")
+                             (-49 . "Shrove Sunday")
+                             (-48 . "Shrove Monday")
+                             (-47 . "Shrove Tuesday")
+                             (-14 . "Passion Sunday")
+                             (-7 . "Palm Sunday")
+                             (-3 . "Maundy Thursday")
+                             (35 . "Rogation Sunday")
+                             (39 . "Ascension Day")
+                             (49 . "Pentecost (Whitsunday)")
+                             (50 . "Whitmonday")
+                             (56 . "Trinity Sunday")
+                             (60 . "Corpus Christi")))
+                       '((0 . "Easter Sunday")
+                         (-2 . "Good Friday")
+                         (-46 . "Ash Wednesday")))
+                      res-list)
+          ;; Filter out nil (not visible) values.
+          (if (setq res (holiday-easter-etc (car elem) (cdr elem)))
+              (setq res-list (append res res-list)))))
+    (let* ((century (1+ (/ displayed-year 100)))
+           (shifted-epact ;; Age of moon for April 5...
+            (% (+ 14 (* 11 (% displayed-year 19)) ;;     ...by Nicaean rule
+                  (- ;; ...corrected for the Gregorian century rule
+                   (/ (* 3 century) 4))
+                  (/ ;; ...corrected for Metonic cycle inaccuracy.
+                   (+ 5 (* 8 century)) 25)
+                  (* 30 century)) ;;              Keeps value positive.
+               30))
+           (adjusted-epact ;;  Adjust for 29.5 day month.
+            (if (or (zerop shifted-epact)
+                    (and (= shifted-epact 1) (< 10 (% displayed-year 19))))
+                (1+ shifted-epact)
+              shifted-epact))
+           (paschal-moon ;; Day after the full moon on or after March 21.
+            (- (calendar-absolute-from-gregorian (list 4 19 displayed-year))
+               adjusted-epact))
+           (abs-easter (calendar-dayname-on-or-before 0 (+ paschal-moon 7))))
+      (filter-visible-calendar-holidays
+       (list (list (calendar-gregorian-from-absolute (+ abs-easter n))
+                   string))))))
 
 (defun holiday-greek-orthodox-easter ()
   "Date of Easter according to the rule of the Council of Nicaea."
 
 (defun holiday-greek-orthodox-easter ()
   "Date of Easter according to the rule of the Council of Nicaea."