blob: 051687f309bdcee699b721164595b7b76d80ceea (
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
|
(define-module (portfolio)
#:use-module (haunt artifact)
#:use-module (haunt html)
#:use-module (ice-9 match)
#:use-module (srfi srfi-1)
#:use-module (srfi srfi-9)
#:export (project
project?
project-name
project-synopsis
project-link
project-tags
project-license
project-involvement
project-description
projects/filter-authored
portfolio
portfolio-theme
portfolio-theme?
portfolio-name
portfolio-layout
portfolio-project-template
portfolio-collection-template))
(define-record-type <project>
(make-project name synopsis link tags license involvement description)
project?
(name project-name)
(synopsis project-synopsis)
(description project-description)
(tags project-tags)
(link project-link)
(license project-license)
(involvement project-involvement))
(define (projects/filter-authored projects)
(filter (lambda (project)
(equal? (project-involvement project) 'author)) projects))
(define* (project #:key
name synopsis description tags link involvement
(license "Unspecified"))
(make-project name synopsis link tags license involvement description))
(define-record-type <portfolio-theme>
(make-portfolio-theme name layout project-template collection-template)
portfolio-theme?
(name portfolio-theme-name)
(layout portfolio-theme-layout)
(project-template portfolio-theme-project-template)
(collection-template portfolio-theme-collection-template))
(define* (portfolio-theme #:key
name layout project-template collection-template)
(make-portfolio-theme name layout project-template collection-template))
(define (with-portfolio-layout theme site title body)
((portfolio-theme-layout theme) site title body))
(define (render-project theme site project)
((portfolio-theme-project-template theme) project))
(define (render-portfolio theme site title projects prefix)
((portfolio-theme-collection-template theme) site title projects prefix))
(define* (portfolio #:key theme prefix projects collections (filter identity))
"Return a procedure that creates pages decorated by THEME for a list of
PROJECTS that satisfy FILTER, whose URLs start with PREFIX, and for
COLLECTIONS."
(define (make-file-name base-name)
(if prefix
(string-append prefix "/" base-name)
base-name))
(lambda (site posts)
(define (project->page project)
(let ((base-name (string-append (project-name project) ".html")))
(serialized-artifact (make-file-name base-name)
(with-portfolio-layout
theme site (project-name project)
(render-project theme site project))
sxml->html)))
(define collection->page
(match-lambda
((title file-name)
(list
(serialized-artifact (make-file-name file-name)
(with-portfolio-layout
theme site title
(render-portfolio
theme site title projects prefix))
sxml->html)))))
(append (map project->page (filter projects))
(append-map collection->page collections))))
|