# HG changeset patch # User Glenn Morris # Date 1252184835 0 # Node ID f1938074431ecb2fb9acf03686cd9e092b8763ff # Parent 03f15a6c0c319787697fd350f310fab6407b748b (holiday-chinese): Make it slightly more efficient. diff -r 03f15a6c0c31 -r f1938074431e lisp/ChangeLog --- a/lisp/ChangeLog Sat Sep 05 21:00:39 2009 +0000 +++ b/lisp/ChangeLog Sat Sep 05 21:07:15 2009 +0000 @@ -1,5 +1,8 @@ 2009-09-05 Glenn Morris + * calendar/cal-china.el (holiday-chinese): Make it slightly more + efficient. + * font-lock.el (lisp-font-lock-keywords-2): Add letf. * emacs-lisp/bytecomp.el (emacs-lisp-file-regexp): Doc fix. diff -r 03f15a6c0c31 -r f1938074431e lisp/calendar/cal-china.el --- a/lisp/calendar/cal-china.el Sat Sep 05 21:00:39 2009 +0000 +++ b/lisp/calendar/cal-china.el Sat Sep 05 21:07:15 2009 +0000 @@ -517,37 +517,42 @@ If MONTH, DAY (Chinese) is visible, returns the corresponding Gregorian date as the list (((month day year) STRING)). Returns nil if it is not visible in the current calendar window." - ;; This is calendar-nongregorian-visible-p adapted for the form of - ;; chinese dates: (cycle year month day) as opposed to (month day year). - (let* ((m1 displayed-month) - (y1 displayed-year) - (m2 displayed-month) - (y2 displayed-year) - ;; Absolute date of first/last dates in calendar window. - (start-date (progn - (calendar-increment-month m1 y1 -1) - (calendar-absolute-from-gregorian (list m1 1 y1)))) - (end-date (progn - (calendar-increment-month m2 y2 1) - (calendar-absolute-from-gregorian - (list m2 (calendar-last-day-of-month m2 y2) y2)))) - ;; Local date of first/last date in calendar window. - (local-start (calendar-chinese-from-absolute start-date)) - ;; A basic optimization. We only care about the year part, - ;; and the Chinese year can only change if Jan or Feb are - ;; visible. FIXME can we do more? - (local-end (if (memq displayed-month '(12 1 2 3)) - (calendar-chinese-from-absolute end-date) - local-start)) - ;; When Chinese New Year is visible on the far right of the - ;; calendar, what is the earliest Chinese month in the - ;; previous year that might still visible? This test doesn't - ;; have to be precise. - (local (if (< month 10) local-end local-start)) - (cycle (car local)) - (year (cadr local)) - (date (calendar-gregorian-from-absolute - (calendar-chinese-to-absolute (list cycle year month day))))) + (let ((date + (calendar-gregorian-from-absolute + ;; A basic optimization. Chinese year can only change if + ;; Jan or Feb are visible. FIXME can we do more? + (if (memq displayed-month '(12 1 2 3)) + ;; This is calendar-nongregorian-visible-p adapted for + ;; the form of chinese dates: (cycle year month day) as + ;; opposed to (month day year). + (let* ((m1 displayed-month) + (y1 displayed-year) + (m2 displayed-month) + (y2 displayed-year) + ;; Absolute date of first/last dates in calendar window. + (start-date (progn + (calendar-increment-month m1 y1 -1) + (calendar-absolute-from-gregorian + (list m1 1 y1)))) + (end-date (progn + (calendar-increment-month m2 y2 1) + (calendar-absolute-from-gregorian + (list m2 (calendar-last-day-of-month m2 y2) + y2)))) + ;; Local date of first/last date in calendar window. + (local-start (calendar-chinese-from-absolute start-date)) + (local-end (calendar-chinese-from-absolute end-date)) + ;; When Chinese New Year is visible on the far + ;; right of the calendar, what is the earliest + ;; Chinese month in the previous year that might + ;; still visible? This test doesn't have to be precise. + (local (if (< month 10) local-end local-start)) + (cycle (car local)) + (year (cadr local))) + (calendar-chinese-to-absolute (list cycle year month day))) + ;; Simple form for when new years are not visible. + (+ (cadr (assoc month (calendar-chinese-year displayed-year))) + (1- day)))))) (if (calendar-date-is-visible-p date) (list (list date string)))))