(import (Alpha Core)) (import (Alpha String)) (import (only (Alpha String) replace)) (import (only (ice-9 ftw) scandir)) (import (only (srfi srfi-1) remove)) ;; general functions (define (os.listdir path) (scandir path)) (define (os.path.expanduser path) (let ([home (getenv "HOME")]) (replace path "~" home))) (define (rm ls item) (remove (/. x (eq? x item)) ls)) (define (set.difference s1 s2) (cond [(null? s1) '()] [(not (member? (first s1) s2)) (cons (first s1) (set.difference (rest s1) s2))] [else (set.difference (rest s1) s2)])) ;; z program (define *zdir* (os.path.expanduser "~/test-z-wiki")) ;; A node 'id' is a monotonically increasing number. ;; It can be represented as a string, in which case it is encoded in ;; base 36. (define (id->string id) (number->string id 36)) (define (string->id s) (string->number s 36)) ;; It can be represented as a path, in which case it is ;; `<*zdir*>/.md' (define (path->id fname) "Given a path, parse out the node id." (-> fname (replace ".md" "") (replace *zdir* "") (string->id))) (define (id->path id) "Given an id, return the absolute path to the file." (fmt "~a/~a.md" *zdir* (id->string id))) ;; Manipulating nodes (define (list-nodes dir) (->> dir (os.listdir) ;; remove '.' and '..' ((/. s (set.difference s '("." "..")))) (map path->id))) (define (latest-node ls) (if (eq? ls '()) 0 (apply max ls))) (define (make-node title) (let ([id (inc (-> *zdir* list-nodes latest-node))]) (call-with-output-file (id->path id) (fn [file] (format file "title: ~a" title) (newline file)))))