summary refs log tree commit diff stats
path: root/boudin.page.instances.scm
blob: 1a3a12e7649eff43a162d4b0d062e7ed5ff8c815 (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
(declare (module (boudin page instances))
         (export make-feed
                 make-index
                 make-post
                 post-path-transformers
                 post-text-transformers))

(import (boudin page write)
        (boudin page)
        (boudin site)
        (boudin util)
        (chicken pathname)
        (html-parser)
        (except (schmaltz)
                render-specials
                render-unprintables)
        (schmaltz chicken)
        (srfi 152))

(define (make-post path)
  (let ((sxml ((apply o (post-text-transformers))
               (with-input-from-file path slurp))))
    (make-page sxml
               ((apply o (post-path-transformers)) path)
               (post-template)
               (post-writer)
               (cons (cons "source" path)
                     (*extract-metadata sxml)))))

(define (*extract-metadata sxml)
  (let loop ((tree sxml)
             (acc '()))
    (cond
     ((not (pair? tree))
      (reverse acc))
     ((and (list? (car tree))
           (eq? (caar tree) '*COMMENT*))
      (loop (cdr tree)
            (map (lambda (ln)
                   (let ((kv (string-split ln ":" 'infix 1)))
                     (cons (string-trim-both (car kv))
                           (string-trim (cdr kv)))))
                 (string-split (cadar tree) "\n"))))
     ((list? (car tree))
      (loop (cdr tree)
            (let ((subtree (loop (car tree) '())))
              (if (null? subtree)
                  acc
                  (cons subtree acc)))))
     (else (loop (cdr tree) acc)))))

(define (make-index pgs)
  (make-page ((index-template) pgs)
             (make-pathname (site-output) "index.html")
             page-content
             (index-writer)
             `()))

(define (make-feed pgs)
  (make-page ((feed-template) pgs)
             (make-pathname (site-output) "feed.xml")
             page-content
             (feed-writer)
             `()))

;; Configurables

(define post-text-transformers
  (make-parameter
   (list html->sxml
         wrap-paragraphs
         render-string->string)))

(define post-path-transformers
  (make-parameter
   (list (lambda (path)
           (make-pathname (list (site-output)
                                (pathname-strip-extension path))
                          "index.html")))))