aboutsummaryrefslogtreecommitdiff
path: root/module/vcomponent
diff options
context:
space:
mode:
authorHugo Hörnquist <hugo@hornquist.se>2019-11-04 14:14:53 +0100
committerHugo Hörnquist <hugo@hornquist.se>2019-11-04 14:14:53 +0100
commit8be804ad5f9e91befa0d1d5738b242ebc368cf36 (patch)
treee5e2a9b6331bf79c83e692fdcbb22fd50582fef5 /module/vcomponent
parentSet geiser scheme to guile in main. (diff)
downloadcalp-8be804ad5f9e91befa0d1d5738b242ebc368cf36.tar.gz
calp-8be804ad5f9e91befa0d1d5738b242ebc368cf36.tar.xz
Maybe fixed timezone?
Diffstat (limited to 'module/vcomponent')
-rw-r--r--module/vcomponent/base.scm4
-rw-r--r--module/vcomponent/parse.scm2
-rw-r--r--module/vcomponent/recurrence/generate.scm37
3 files changed, 40 insertions, 3 deletions
diff --git a/module/vcomponent/base.scm b/module/vcomponent/base.scm
index 52bbe0c3..2041e126 100644
--- a/module/vcomponent/base.scm
+++ b/module/vcomponent/base.scm
@@ -16,8 +16,8 @@
(value get-vline-value set-vline-value!)
(parameters get-vline-parameters))
-(define*-public (make-vline value #:optional ht)
- (make-vline% value (or ht (make-hash-table))))
+(define*-public (make-vline value #:optional (ht (make-hash-table)))
+ (make-vline% value ht))
(define-record-type <vcomponent>
(make-vcomponent% type children parent attributes)
diff --git a/module/vcomponent/parse.scm b/module/vcomponent/parse.scm
index 04a06d54..f862b18a 100644
--- a/module/vcomponent/parse.scm
+++ b/module/vcomponent/parse.scm
@@ -40,7 +40,7 @@
(define (fold-proc ctx c)
- ;; First extra character optionall read is to get the \n if our line
+ ;; First extra character optional read is to get the \n if our line
;; ended with \r\n. Secound read is to get the first character of the
;; next line. The initial \r which might recide in @var{c} is discarded.
(let ((pair (cons (if (char=? #\newline (integer->char c))
diff --git a/module/vcomponent/recurrence/generate.scm b/module/vcomponent/recurrence/generate.scm
index 3f4cb869..ea17b0e0 100644
--- a/module/vcomponent/recurrence/generate.scm
+++ b/module/vcomponent/recurrence/generate.scm
@@ -43,6 +43,41 @@
;; TODO My current naïve aproach to simple adding a constant time to an event
;; breaks with time-zones. betwen 12:00 two adjacent days might NOT be 24h.
;; Specifically, 23h or 25h when going between summer and "normal" time.
+
+(define (next-event ev r)
+ (let ((e (copy-vcomponent ev))
+ (tz (getenv "TZ")))
+ ;; (setenv "TZ" (car (prop (attr* e 'DTSTART) 'TZID)))
+ (aif (prop (attr* e 'DTSTART) 'TZID)
+ (setenv "TZ" (car it))
+ ;; Should missing be this, or explicitly GMT?
+ (unsetenv "TZ"))
+
+ (let ((d (time-utc->date (attr e 'DTSTART)))
+ (i (interval r)))
+ (case (freq r)
+ ((SECONDLY) (mod! (second d) = (+ i)))
+ ((MINUTELY) (mod! (minute d) = (+ i)))
+ ((HOURLY) (mod! (hour d) = (+ i)))
+ ((DAILY) (mod! (day d) = (+ i)))
+ ((WEEKLY) (mod! (day d) = (+ (* i 7))))
+ ((MONTHLY) (mod! (month d) = (+ i)))
+ ((YEARLY) (mod! (year d) = (+ i))))
+
+ (set! (zone-offset d)
+ (zone-offset (time-utc->date (date->time-utc d))))
+
+ (set! (attr e 'DTSTART) (date->time-utc d)))
+
+ (when (attr e 'DTEND)
+ (set! (attr e 'DTEND)
+ (add-duration (attr e 'DTSTART) (attr e 'DURATION))))
+
+ (setenv "TZ" tz)
+
+ e))
+
+#;
(define (next-event ev r)
(let* ((e (copy-vcomponent ev))
(d (time-utc->date
@@ -68,6 +103,8 @@
(date->time-utc d))
(when (prop (attr* e 'DTSTART) 'TZID)
+ ;; (list "Europe/Stockholm"), or similar
+ ;; (format (current-error-port) "TZID = ~a~%" (prop (attr* e 'DTSTART) 'TZID))
(let ((of (get-tz-offset e)))
;; This addition works, but we still get lunch at 13
(set! (zone-offset d) of)))