blob: accc92755c804a2ded68367f0f4e8384a4291fed (
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
|
(module md-parser (read-md-frontmatter)
(import scheme
(chicken base)
(chicken format)
(chicken file)
(chicken io)
(chicken irregex)
(chicken sort)
srfi-1
srfi-13
utils
)
(define (collect-fm-lines lines #!optional (acc '()))
(if (string=? "---" (car lines))
acc
(collect-fm-lines (cdr lines) (cons (car lines) acc))))
(define (extract-field field fm) (call/cc (@ extract-field* field fm)))
(define (extract-field* field fm return)
(define (search line)
(define irx (format "^~A: (.+?)$" field))
(define m (irregex-search irx line))
(if m
(return (submatch m))))
(for-each search fm)
#f)
(define (parse-line line)
(define irx (format "^(.+?): (.+?)$" line))
(define m (irregex-search irx line))
(if m
(cons (submatch m 1) (submatch m 2))
#f))
(define (read-md-frontmatter md-path)
(define lines (with-input-from-file md-path
(λ () (read-lines))))
(define (inner return)
(if (not (string=? "---" (car lines)))
(return #f))
(define fm (collect-fm-lines (cdr lines)))
(map parse-line fm))
(call/cc (@ inner))))
|