From 1c19ab87c0b1dc2147e1c672939d1e45afc3de19 Mon Sep 17 00:00:00 2001 From: nisstyre56 Date: Mon, 10 Feb 2014 00:16:46 -0500 Subject: [PATCH] first commit --- migrate.rkt | 215 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 215 insertions(+) create mode 100755 migrate.rkt diff --git a/migrate.rkt b/migrate.rkt new file mode 100755 index 0000000..a7d5d21 --- /dev/null +++ b/migrate.rkt @@ -0,0 +1,215 @@ +#! /usr/bin/racket +#lang racket + +(define (parse-flags bitf) + (filter identity + (map + (lambda (flag) + (cond + [(bitwise-bit-set? bitf (cadr flag)) + (cons + (car flag) + (caddr flag))] + [else #f])) + [list (list "try_all_servers" 0 "no weechat equivalent") + (list "use_default" 1 #t) + (list "ssl" 2 "on") + (list "autoconnect" 3 "on") + (list "proxy" 4 "\"\"") + (list "ssl_verify" 5 "off") + (list "favourited" 6 "no weechat equivalent")]))) + +(define (make-server params) + (let* ([lines (regexp-split + #px"\n" + params)] + [assocs (map parse-equation + (filter-not + (curry equal? "") + lines))]) + (make-hash (gather-dups + (map + (lambda (p) + (match (car p) + ["F" + (cons + (translate-prop (car p)) + (parse-flags + (string->number (cdr p))))] + [_ (cons + (translate-prop (car p)) + (cdr p))])) + assocs))))) + +(define (parse-equation line) + (let* ([splitted (regexp-split + #px"=" + line)] + [name (car splitted)] + [val (cadr splitted)]) + (cons name val))) + +(define (parse-file str) + (let ([servers (regexp-split + #px"(?m:^[:blank:]*$)" + str)]) + (map make-server (drop servers 1)))) + +(define (get-xchat) + (parse-file + (file->string + (string->path + "/home/wes/.xchat2/servlist_.conf")))) + +(define translate-prop + (let ([hash (make-hash + '(["N" . "name"] + ["I" . "nicks"] + ["i" . "nicks"] + ["U" . "username"] + ["R" . "realname"] + ["J" . "autojoin"] + ["B" . "password"] + ["S" . "addresses"] + ["P" . "password"] + ["E" . "encoding"] + ["C" . "connect_cmd"] + ["F" . "flags"] + ["D" . "primary_server_number"]))]) + (lambda (key) + (hash-ref hash key "")))) + +(define translate-val + (let ([hash (make-hash + (list + [cons "addresses" (lambda (val) (format "\"~a\"" val))] + [cons "realname" (lambda (val) (regexp-replace #px"\\s" val ""))] + [cons "username" (lambda (val) (regexp-replace #px"\\s" val ""))]))]) + (lambda (prop val) + ((hash-ref hash + prop + (const identity)) + val)))) + +(define (take-while pred xs) + (cond + [(empty? xs) '()] + [(not (pred (car xs))) '()] + [else (cons + (car xs) + (take-while pred (cdr xs)))])) + +(define (drop-while pred xs) + (cond + [(empty? xs) '()] + [(not (pred (car xs))) xs] + [else (drop-while pred (cdr xs))])) + +(define (take-dups xs) + (take-while + (lambda (x) (equal? + (caar xs) + (car x))) + xs)) + +(define (drop-dups xs) + (drop-while + (lambda (x) (equal? + (caar xs) + (car x))) + xs)) + +(define (group-sorted xs) + (cond + [(empty? xs) '()] + [else + (let ([chunk (take-dups xs)] + [rest (drop-dups xs)]) + (cons + chunk + (group-sorted rest)))])) + +(define (collapse-pairs pairs) + (cons + (caar pairs) + (list + (map cdr pairs)))) + +(define (gather-dups assocs) + (let* ([sorted + (sort assocs + string