aboutsummaryrefslogtreecommitdiff
path: root/module/vcomponent
diff options
context:
space:
mode:
Diffstat (limited to 'module/vcomponent')
-rw-r--r--module/vcomponent/base.scm8
-rw-r--r--module/vcomponent/ical/output.scm8
-rw-r--r--module/vcomponent/ical/parse.scm2
-rw-r--r--module/vcomponent/search.scm18
-rw-r--r--module/vcomponent/xcal/parse.scm17
5 files changed, 36 insertions, 17 deletions
diff --git a/module/vcomponent/base.scm b/module/vcomponent/base.scm
index ae10fe01..34d4416b 100644
--- a/module/vcomponent/base.scm
+++ b/module/vcomponent/base.scm
@@ -169,14 +169,6 @@
(copy-vline value))))
(get-component-properties component)))))
-;; updates target with all fields from source.
-;; fields in target but not in source left unchanged.
-;; parent and children unchanged
-(define-public (vcomponent-update! target source)
- (for key in (property-keys source)
- (set! (prop* target key)
- (prop* source key))))
-
(define-public (extract field)
(lambda (e) (prop e field)))
diff --git a/module/vcomponent/ical/output.scm b/module/vcomponent/ical/output.scm
index a0816679..bcc6bb1d 100644
--- a/module/vcomponent/ical/output.scm
+++ b/module/vcomponent/ical/output.scm
@@ -44,12 +44,16 @@
[(memv key '(FREEBUSY))
(get-writer 'PERIOD)]
+ [(memv key '(CATEGORIES RESOURCES))
+ (lambda (p v)
+ (string-join (map (lambda (v) ((get-writer 'TEXT) p v))
+ v)
+ ","))]
+
[(memv key '(CALSCALE METHOD PRODID COMMENT DESCRIPTION
LOCATION SUMMARY TZID TZNAME
CONTACT RELATED-TO UID
- CATEGORIES RESOURCES
-
VERSION))
(get-writer 'TEXT)]
diff --git a/module/vcomponent/ical/parse.scm b/module/vcomponent/ical/parse.scm
index 9c555bca..8499d289 100644
--- a/module/vcomponent/ical/parse.scm
+++ b/module/vcomponent/ical/parse.scm
@@ -135,7 +135,7 @@
(let ((v ((get-parser 'TEXT) params value)))
(unless (= 1 (length v))
(warning "List in non-list field: ~s" v))
- (car v)))]
+ (string-join v ",")))]
;; TEXT, but allow a list
[(memv key '(CATEGORIES RESOURCES))
diff --git a/module/vcomponent/search.scm b/module/vcomponent/search.scm
index a402bd49..a850fb40 100644
--- a/module/vcomponent/search.scm
+++ b/module/vcomponent/search.scm
@@ -52,6 +52,13 @@
(define-public (prepare-string str)
(call-with-input-string (close-parenthese str) read))
+;; TODO place this in a proper module
+(define (bindings-for module-name)
+ ;; Wrapping list so we can later export sub-modules.
+ (list (cons module-name
+ (module-map (lambda (a . _) a)
+ (resolve-interface module-name)))))
+
;; Evaluates the given expression in a sandbox.
;; NOTE Should maybe be merged inte prepare-query. The argument against is that
;; eval-in-sandbox is possibly slow, and that would prevent easy caching by the
@@ -63,9 +70,9 @@
(eval `(lambda (event) ,@expressions)
(make-sandbox-module
`(
- ((vcomponent base) prop param children type)
+ ((vcomponent base) prop param children type parent)
((ice-9 regex) string-match)
- ;; TODO datetime
+ ,@(bindings-for '(datetime))
,@all-pure-bindings)
)))
@@ -155,8 +162,11 @@
(set-max-page! paginator (max page (get-max-page paginator)))
result))))
(lambda (err proc fmt args data)
- ;; TODO ensure the error actually is index out of range.
- ;; (format (current-error-port) "~?~%" fmt args)
+ ;; NOTE This is mostly a hack to see that we
+ ;; actually check for the correct error.
+ (unless (string=? fmt "beyond end of stream")
+ (scm-error err proc fmt args data))
+
(set-max-page! paginator (get-max-page paginator))
(set-true-max-page! paginator)
(throw 'max-page (get-max-page paginator))
diff --git a/module/vcomponent/xcal/parse.scm b/module/vcomponent/xcal/parse.scm
index 17c684fc..6b877b9f 100644
--- a/module/vcomponent/xcal/parse.scm
+++ b/module/vcomponent/xcal/parse.scm
@@ -25,7 +25,10 @@
;; TODO possibly trim whitespace on text fields
[(cal-address uri text unknown) (car value)]
- [(date) (parse-iso-date (car value))]
+ [(date)
+ ;; TODO this is correct, but ensure remaining types
+ (hashq-set! props 'VALUE "DATE")
+ (parse-iso-date (car value))]
[(date-time) (parse-iso-datetime (car value))]
@@ -108,6 +111,12 @@
data '(AUDIO DISPLAY EMAIL NONE)))
[else data]))
+;; Note
+;; This doesn't verify the inter-field validity of the object,
+;; meaning that value(DTSTART) == DATE and value(DTEND) == DATE-TIME
+;; are possibilities, which other parts of the code will crash on.
+;; TODO
+;; since we are feeding user input into this it really should be fixed.
(define-public (sxcal->vcomponent sxcal)
(define type (symbol-upcase (car sxcal)))
(define component (make-vcomponent type))
@@ -147,7 +156,11 @@
(set! (prop* component tag*)
(make-vline tag*
(handle-tag
- tag (handle-value type params value))
+ tag (let ((v (handle-value type params value)))
+ ;; TODO possibly more list fields
+ (if (eq? tag 'categories)
+ (string-split v #\,)
+ v)))
params)))))])))
;; children