blob: cf60c209588155c3b8a12bc3f2fe5dcdaf316b1d (
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
|
(declare (module (boudin page))
(export make-page page?
page-content page-output page-template page-writer
page-meta page-meta-set! page-ref page-set!
page-slug page-updated page-url))
(import (boudin site)
(boudin util)
(chicken file posix)
(chicken file)
(chicken pathname)
(chicken time posix)
(srfi 1))
(define-record-type page
(make-page content output template writer meta)
page?
(content page-content)
(output page-output)
(template page-template)
(writer page-writer)
(meta page-meta page-meta-set!))
(define (page-ref pg k)
(assoc-ref k (or (page-meta pg) '())))
(define (page-set! pg k v)
(page-meta-set! pg (cons (cons k v)
(page-meta pg))))
(define (*urlify path)
(normalize-pathname
(make-pathname (list (string-append "https://" (site-host))
(pathname-strip-extension path))
"index.html")))
(define (page-url pg) ; foo.html => http://site.com/foo/index.html
(or (page-ref pg "url") ; memoization
(let ((url (*urlify (page-ref pg "source"))))
(page-set! pg "url" url)
url)))
(define (*slugify url) ; I don't love how this is written..
(let-values (((_ _ dirs) (decompose-directory url)))
(let loop ((this (car dirs))
(rest (cdr dirs)))
(if (null? (cdr rest))
(make-pathname (list "/" this) #f)
(loop (car rest)
(cdr rest))))))
(define (page-slug pg) ; http://site.com/foo/index.html => /foo/
(or (page-ref pg "slug") ; memoization
(let ((slug (*slugify (page-url pg))))
(page-set! pg "slug" slug)
slug)))
(define (*page-mtime pg)
(let ((file (page-ref pg "source")))
(and file
(file-exists? file)
(time->string (seconds->utc-time (file-modification-time file))))))
(define (page-updated pg)
(let ((meta-date (page-ref pg "date")))
(or (and meta-date ; memoization
(find (lambda (fmt) (string->time meta-date fmt))
(site-date-formats)))
(*page-mtime pg)
(site-build-time))))
|