Subject: Re: bug#13072: 24.3.50; Fancy Diary display fontification failures

From: Lars Ingebrigtsen <[email-masked]>
Date: Fri, 21 Aug 2020 14:35:08 +0200

Stephen Berman <[email-masked]> writes:

> The doc string of calendar-date-display-form says:
>
>     For example, a typical American form would be
>     '(month "/" day "/" (substring year -2))
>     whereas
>     '((format "%9s, %9s %2s, %4s" dayname monthname day year))
>     would give the usual American style in fixed-length fields.
>
> But if you set calendar-date-display-form to either of these values
> (either via setq in your user-init-file or via the Custom interface),
> then in the Fancy Diary display the date header line is not fontified.

I've respun your patch for Emacs 28...

However, I'm not really sure why Fancy Diary Mode is doing any of
this -- it seems kinda misguided, and as you say, your patch only fixes
half of the problem.

Instead of inserting the heading, and then trying to make a regexp to
match the heading and letting font-lock fontize, why doesn't it just put
the correct face on the heading when it inserts it?  Because trying to
make that regexp is bound to have strange edge cases.

Historical reasons?

diff --git a/lisp/calendar/diary-lib.el b/lisp/calendar/diary-lib.el
index da98e44926..8ea831554b 100644
--- a/lisp/calendar/diary-lib.el
+++ b/lisp/calendar/diary-lib.el
@@ -2406,9 +2406,18 @@ diary-fancy-date-pattern
      ;; string form"; eg the iso version calls string-to-number on some.
      ;; Therefore we cannot eg just let day = "[0-9]+".  (Bug#8583).
      ;; Assumes no integers in c-day/month-name-array.
-     (replace-regexp-in-string "[0-9]+" "[0-9]+"
-                               (mapconcat #'eval calendar-date-display-form "")
-                               nil t))
+      (replace-regexp-in-string
+       "[0-9]+" "[0-9]+"
+       (mapconcat (lambda (x)
+                    (if (or (atom x) (eq (car x) 'format))
+ 			(eval x)
+ 		      (catch 'end
+ 			(while (consp x)
+ 			  (let ((y (pop x)))
+ 			    (when (or (eq y 'year) (eq y 'month) (eq y 'day))
+ 			      (throw 'end (eval y))))))))
+ 		  calendar-date-display-form "")
+       nil t))
    ;; Optional ": holiday name" after the date.
    "\\(: .*\\)?"))

-- 
(domestic pets only, the antidote for overdose, milk.)
   bloggy blog: http://lars.ingebrigtsen.no