From 0bfdb8ce894453b1022e9a37662cf13d8289025d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hugo=20H=C3=B6rnquist?= Date: Mon, 11 Mar 2019 00:07:35 +0100 Subject: Work on RRULE's. --- vcalendar/recur.scm | 75 +++++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 61 insertions(+), 14 deletions(-) (limited to 'vcalendar') diff --git a/vcalendar/recur.scm b/vcalendar/recur.scm index db3adc2f..ccdb3aa7 100644 --- a/vcalendar/recur.scm +++ b/vcalendar/recur.scm @@ -134,26 +134,57 @@ (map (cut string-split <> #\=) (string-split str #\;)))) +(define (seconds-in interval) + (case interval + ((SECONDLY) 1) + ((MINUTELY) 60 ) + ((HOURLY) (* 60 60)) + ((DAILY) (* 60 60 24)) + ((WEEKLY) (* 60 60 24 7)))) + (define (generate-next event rule) + + (when (count rule) + (set! (count rule) + (1- (count rule))) + + (when (zero? (count rule)) + ;; TODO early return + (values '() '()))) + + (let ((ne (copy-vcomponent event))) ; new event - (case (freq rule) - ((WEEKLY) - (mod! (attr ne "DTSTART") (cut time-add <> 1 weeks)) + (cond - (set! (attr ne "DTEND") - (add-duration (attr ne "DTSTART") - (attr ne "DURATION"))) - (values ne rule)) + ;; BYDAY and the like depend on the freq? + ;; Line 7100 + ;; Table @ 2430 - ((DAILY) - (mod! (attr ne "DTSTART") (cut time-add <> 1 days)) + ((memv (freq rule) '(SECONDLY MINUTELY HOURLY DAILY WEEKLY)) + (mod! (attr ne "DTSTART") + (cut add-duration! <> + (make-duration (* (interval rule) + (seconds-in (freq rule))))))) + ((memv (freq rule) '(MONTHLY YEARLY)) + ;; Hur fasen beräkrnar man det här!!!! + ) + (else #f)) - (set! (attr ne "DTEND") - (add-duration (attr ne "DTSTART") - (attr ne "DURATION"))) - (values ne rule)) - (else (values '() rule))))) + ;; Make sure DTSTART is updated before this point + + (and=> (until rule) + (lambda (u) + (when (time