blob: e897f86f049c21aee2e9256ff8b9fe48558ebe70 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
|
(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*>/<string>.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)))))
|