From 67f35806b89e6fa04d2779a88737ae2e88505a96 Mon Sep 17 00:00:00 2001 From: Jaidyn Ann <10477760+JadedCtrl@users.noreply.github.com> Date: Mon, 5 Feb 2024 11:24:30 -0600 Subject: [PATCH] Init --- vcarded.scm | 59 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) create mode 100644 vcarded.scm diff --git a/vcarded.scm b/vcarded.scm new file mode 100644 index 0000000..13642c8 --- /dev/null +++ b/vcarded.scm @@ -0,0 +1,59 @@ +;; Copyright © 2024 Jaidyn Ann +;; +;; This program is free software: you can redistribute it and/or +;; modify it under the terms of the GNU General Public License as +;; published by the Free Software Foundation, either version 3 of +;; the License, or (at your option) any later version. +;; +;; This program is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. +;; +;; You should have received a copy of the GNU General Public License +;; along with this program. If not, see . + +(import + scheme + (chicken io) + (chicken irregex) + (chicken string) + srfi-1) + + +;; Splits a string into a list of CRLF’d lines. +(define (lines string) + (remove string-null? (string-split string "\r\n"))) + + +;; Create irregx-format regex for matching an unescaped character. +(define (regex-unescaped-char char-string) + `(: (neg-look-behind "\\") ,char-string)) + + +;; Splits a line into a list of key/value pairs. +(define (split-vcard-line line) + (let ([split (irregex-split (regex-unescaped-char ":") line)]) + (if (>= (length split) 2) + (cons + (car split) + (reduce-right (lambda (a b) (conc a ":" b)) "" (cdr split))) + #f))) + + +;; Splits a key or value-element into its (potentially multiple) parameters. +(define (split-vcard-element key-or-value) + (irregex-split (regex-unescaped-char ";") key-or-value)) + + +;; Parse a line of a vcard file into an alist-friendly format: +;; (KEY ("keyprop1=d" "keyprop2=b") "VALUE" ("valprop1=a" "valprop2=b")) +(define (parse-vcard-line line) + (let* ([key-value-strings (split-vcard-line line)] + [key-elements (split-vcard-element (car key-value-strings))] + [value-elements (split-vcard-element (cdr key-value-strings))]) + (list (string->symbol (car key-elements)) + (cdr key-elements) + (car value-elements) + (cdr value-elements)))) +