tsv2vcard/tsv2vcard.scm

35 lines
1.0 KiB
Scheme

;; Copyright (C) 2023 Camden Dixie O'Brien
;; SPDX-License-Identifier: AGPL-3.0-only
(define (tsv-fields line)
(reverse
(let iter ((len (string-length line))
(rem (string-copy line))
(idx 0)
(res '()))
(cond ((>= idx len) (cons rem res))
((char=? #\tab (string-ref rem idx))
(iter (- len idx 1)
(substring rem (+ idx 1) len)
0
(cons (substring rem 0 idx) res)))
(else (iter len rem (+ idx 1) res))))))
(define (vcard name number)
(format "BEGIN:VCARD~%N:;~a;;;~%TEL;TYPE=cell:~a~%END:VCARD~%" name number))
(define (tsv-contact->vcard line)
(let* ((fields (tsv-fields line))
(number (list-ref fields 0))
(name (list-ref fields 1)))
(vcard name number)))
(define (foreach-line thunk)
(let loop ()
(let ((line (get-line (current-input-port))))
(unless (eof-object? line)
(display (thunk line))
(loop)))))
(foreach-line tsv-contact->vcard)