summaryrefslogtreecommitdiffstats
path: root/md-parser.scm
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))))