summaryrefslogtreecommitdiff
path: root/z.scm
blob: 6e8972afc6cbcb4449c03354102b17868aaebbc0 (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
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
(import (Alpha Core))
(import (prefix (Alpha String) string.))
(import (srfi srfi-1))
(import (only (srfi srfi-19) date->string current-date))
(import (prefix (re) re.))

;; general functions

(import (only (ice-9 ftw) scandir))
(define (os.listdir path)
  (scandir path))

(define (os.path.expanduser path)
  (let ([home (getenv "HOME")])
    (string.replace path "~" home)))

(import (only (srfi srfi-1) remove))
(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)]))

(import (only (ice-9 rdelim) read-delimited))
(define (readlines fname)
  (call-with-input-file fname
    (lambda [p]
      (read-delimited "" p 'concat))))

;; 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
      (string.replace ".md" "")
      (string.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 (list-nodes)
  (list-nodes* *zdir*))

(define (latest-node ls)
  (if (eq? ls '())
      0
      (apply max ls)))

(define (make-node title)
  (call-with-output-file
      (-> (list-nodes) latest-node inc id->path)
    (fn [file]
        (format file "title: ~a\n" title)
        (format file "created: ~a\n"
                (date->string (current-date) "~Y.~m.~d..~H.~M"))
        (format file "tags:\n")
        (display "---\n" file))))

(define (read-node id)
  (readlines (id->path id)))

(define (cat-node id)
  (prn (read-node id)))

;; Indexing

(define (get-title id)
  (-> id
      read-node
      (re.match "title: ([^\n]*)")
      (match:substring 1)))

(define (index-titles)
  (fold
   (lambda (node ls) (acons (get-title node) node ls))
   '()
   (list-nodes)))

(define (get-by-title title)
  (let ([index (index-titles)])
    (assoc title index)))

(comment
 (define index-tags)
 (define index-links)
 )