Start adding serializing vCard alists into strings
This commit is contained in:
parent
076fe6f24b
commit
dabda67b33
38
vcarded.scm
38
vcarded.scm
|
@ -148,7 +148,9 @@
|
||||||
(list date-prop
|
(list date-prop
|
||||||
string->any-date
|
string->any-date
|
||||||
(lambda (datetime)
|
(lambda (datetime)
|
||||||
(date->string datetime "~Y~m~dT~H~M~S~z"))))
|
(if (date? datetime)
|
||||||
|
(date->string datetime "~Y~m~dT~H~M~S~z")
|
||||||
|
datetime))))
|
||||||
vcard-datetime-properties)
|
vcard-datetime-properties)
|
||||||
(map (lambda (csv-prop)
|
(map (lambda (csv-prop)
|
||||||
(list csv-prop
|
(list csv-prop
|
||||||
|
@ -199,11 +201,17 @@
|
||||||
(string-split string delimiter)))))
|
(string-split string delimiter)))))
|
||||||
|
|
||||||
|
|
||||||
(define (parse-vcard-prop property elements)
|
;; Given a vCard property and its values (e.g., “VERSION” and “3.0”),
|
||||||
|
;; parse them into a list.
|
||||||
|
;; “EMAIL;TYPE=home” "mom@dad.com” → '(EMAIL ("TYPE=home") "mom@dad.com")
|
||||||
|
(define (parse-vcard-property property elements)
|
||||||
(append (list property)
|
(append (list property)
|
||||||
(list elements)))
|
(list elements)))
|
||||||
|
|
||||||
|
|
||||||
|
;; Given the value(s) of a vCard element’s value string(s), returned a
|
||||||
|
;; parsed object.
|
||||||
|
;; 'BIRTHDAY "2024-01-02T00:00:00" → #@2024-01-02T00:00:00-0600
|
||||||
(define (parse-vcard-value prop elements)
|
(define (parse-vcard-value prop elements)
|
||||||
(let [(parser-and-unparser-funcs (alist-ref prop vcard-value-parsers))]
|
(let [(parser-and-unparser-funcs (alist-ref prop vcard-value-parsers))]
|
||||||
(if parser-and-unparser-funcs
|
(if parser-and-unparser-funcs
|
||||||
|
@ -213,6 +221,30 @@
|
||||||
(list elements))))
|
(list elements))))
|
||||||
|
|
||||||
|
|
||||||
|
;; With an element of a parsed vCard alist, serialize it (back) into a
|
||||||
|
;; string.
|
||||||
|
(define (serialize-vcard-element element)
|
||||||
|
(let [(property (string-join
|
||||||
|
(append (list (symbol->string (car element)))
|
||||||
|
(second element)) ";"))
|
||||||
|
(value (serialize-vcard-value (car element) (last element)))]
|
||||||
|
(string-join (list property value) ":")))
|
||||||
|
|
||||||
|
|
||||||
|
;; Serialize the value of a vCard property (from a parsed vCard alist)
|
||||||
|
;; into a string.
|
||||||
|
(define (serialize-vcard-value prop value)
|
||||||
|
(let [(parser-and-unparser-funcs (alist-ref prop vcard-value-parsers))]
|
||||||
|
(if parser-and-unparser-funcs
|
||||||
|
(apply (cadr parser-and-unparser-funcs) (list value))
|
||||||
|
value)))
|
||||||
|
|
||||||
|
|
||||||
|
;; Serialize a vCard parsed-alist into a set of line-strings, once more.
|
||||||
|
(define (serialized-vcard vcard-alist)
|
||||||
|
(map serialize-vcard-element vcard-alist))
|
||||||
|
|
||||||
|
|
||||||
;; Parse a line of a vcard file into an alist-friendly format:
|
;; Parse a line of a vcard file into an alist-friendly format:
|
||||||
;; (KEY ("keyprop1=d" "keyprop2=b") "VALUE" ("valprop1=a" "valprop2=b"))
|
;; (KEY ("keyprop1=d" "keyprop2=b") "VALUE" ("valprop1=a" "valprop2=b"))
|
||||||
(define (parse-vcard-line line)
|
(define (parse-vcard-line line)
|
||||||
|
@ -220,7 +252,7 @@
|
||||||
(prop-elements (string-split-unescaped (car prop-value-strings) ";"))
|
(prop-elements (string-split-unescaped (car prop-value-strings) ";"))
|
||||||
(value-elements (cdr prop-value-strings))
|
(value-elements (cdr prop-value-strings))
|
||||||
(property (string->symbol (string-upcase (car prop-elements))))]
|
(property (string->symbol (string-upcase (car prop-elements))))]
|
||||||
(append (parse-vcard-prop property (cdr prop-elements))
|
(append (parse-vcard-property property (cdr prop-elements))
|
||||||
(parse-vcard-value property value-elements))))
|
(parse-vcard-value property value-elements))))
|
||||||
|
|
||||||
|
|
||||||
|
|
Ŝarĝante…
Reference in New Issue