From b0f67cc477a984c1088d79d3706fec6947115445 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hugo=20H=C3=B6rnquist?= Date: Mon, 15 Jun 2020 11:52:39 +0200 Subject: Fix multi-valued fields. --- module/vcomponent/parse/component.scm | 23 +++++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) (limited to 'module/vcomponent') diff --git a/module/vcomponent/parse/component.scm b/module/vcomponent/parse/component.scm index 78482b61..d1470694 100644 --- a/module/vcomponent/parse/component.scm +++ b/module/vcomponent/parse/component.scm @@ -20,6 +20,12 @@ (file get-file) (line get-line)) +(define-immutable-record-type + (make-geo latitude longitude) + geo-pos? + (latitude geo-latitude) + (longitude geo-longitude)) + ;; port → (list string) (define (read-file port) (define fname (port-filename port)) @@ -174,8 +180,8 @@ ;; two semicolon sepparated floats (lambda (params value) (let* (((left right) (string-split value #\;))) - (cons ((get-parser 'FLOAT) params left) - ((get-parser 'FLOAT) params right))))] + (make-geo ((get-parser 'FLOAT) params left) + ((get-parser 'FLOAT) params right))))] [(memv key '(RRULE)) (get-parser 'RECUR)] @@ -189,7 +195,17 @@ [else (warning "Unknown key ~a" key) (get-parser 'TEXT)]))) - (make-vline key (parser params value) params))) + + ;; If we produced a list create multiple VLINES from it. + ;; NOTE that the created vlines share parameter tables. + ;; TODO possibly allow vlines to reference each other, to + ;; indicate that all these vlines are the same. + (let ((parsed (parser params value))) + (if (list? parsed) + (apply values + (map (lambda (p) (make-vline key p params)) + parsed)) + (make-vline key parsed params))))) ;; (parse-itemline '("DTEND" "20200407T130000")) ;; => DTEND @@ -267,7 +283,6 @@ ;; See RFC 5545 p.53 for list of all repeating types ;; (for vcomponent) - ;; TODO split on comman (,) here? (if (memv key '(ATTACH ATTENDEE CATEGORIES COMMENT CONTACT EXDATE REQUEST-STATUS RELATED-TO -- cgit v1.2.3