feat calfw: multi-source (Agenda+Suky+Klára+Rodina), universal sorter, calfw-org-create-file-source pro caldav

This commit is contained in:
2026-02-24 23:29:25 +01:00
parent 762435acb4
commit f6dc7ca679

View File

@@ -1958,10 +1958,39 @@ current frame."
"<" #'calfw-navi-prev-view "<" #'calfw-navi-prev-view
">" #'calfw-navi-next-view) ">" #'calfw-navi-next-view)
;; Universal sorter: time-of-day prop (agenda source) NEBO "HH:MM " prefix (file source)
(defun my/calfw-extract-time (str)
(when (string-match "^\\([0-9]\\{2\\}\\):\\([0-9]\\{2\\}\\) " str)
(+ (* (string-to-number (match-string 1 str)) 100)
(string-to-number (match-string 2 str)))))
(defun my/calfw-sorter (t1 t2)
(let ((a (or (get-text-property 0 'time-of-day t1) (my/calfw-extract-time t1)))
(b (or (get-text-property 0 'time-of-day t2) (my/calfw-extract-time t2))))
(cond ((and a b) (< a b)) (a t) (b nil) (t (string-lessp t1 t2)))))
(defun my/open-calendar () (defun my/open-calendar ()
"Calfw — stabilní verze, org-agenda-files." "Calfw: org-agenda (SeaGreen) + CalDAV soubory (Suky=modrá, Klára=žlutá, Rodina=zelená).
org-caldav ukládá plain active timestamps → calfw-org-create-file-source je správná volba."
(interactive) (interactive)
(calfw-org-open-calendar)) (condition-case err
(let* ((cd (expand-file-name "~/org/caldav/"))
(sources (delq nil
(list
(calfw-org-create-source nil "Agenda" "SeaGreen4")
(when (file-exists-p (concat cd "suky.org"))
(calfw-org-create-file-source "Suky" (concat cd "suky.org") "SteelBlue"))
(when (file-exists-p (concat cd "klara.org"))
(calfw-org-create-file-source "Klára" (concat cd "klara.org") "Gold"))
(when (file-exists-p (concat cd "family.org"))
(calfw-org-create-file-source "Rodina" (concat cd "family.org") "ForestGreen"))))))
(calfw-open-calendar-buffer
:contents-sources sources
:view 'month
:custom-map calfw-org-custom-map
:sorter #'my/calfw-sorter))
(error
(message "calfw multi-source: %s → fallback" (error-message-string err))
(calfw-org-open-calendar))))
(map! :leader "o C" #'my/open-calendar)) (map! :leader "o C" #'my/open-calendar))