summaryrefslogtreecommitdiff
path: root/src/operationnull/theme.scm
blob: 31292035777b69f927141c11dfb61fce6bb71cad (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
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
(define-module (operationnull theme)
  #:use-module (haunt artifact)
  #:use-module (haunt builder blog)
  #:use-module (haunt html)
  #:use-module (haunt post)
  #:use-module (haunt site)
  #:use-module (ice-9 match)
  #:use-module (srfi srfi-19)
  #:export (main-theme))

(define %cc-by-sa-link
  '(a (@ (href "https://creativecommons.org/licenses/by-sa/4.0/"))
      "CC-BY-SA 4.0"))

(define (first-paragraph post)
  (let loop ((sxml (post-sxml post)))
    (match sxml
      (() '())
      (((and paragraph ('p . _)) . _)
       (list paragraph))
      ((head . tail)
       (cons head (loop tail))))))

(define (stylesheet name)
  `(link (@ (rel "stylesheet")
            (href ,(string-append "/assets/" name ".css")))))

(define main-theme
  (theme #:name "bdunahu"
         #:layout
         (lambda (site title body)
           `((doctype "html")
             (head
              (meta (@ (charset "utf-8")))
              (meta (@ (name "viewport")
                       (content "width=device-width, initial-scale=1")))
              (link (@ (rel "icon")
                       (type "image/x-icon")
                       (href "/assets/favicon.ico")))
              (title ,(string-append title " — " (site-title site)))
              (link (@ (rel "alternate")
                       (type "application/atom+xml")
                       (title "Atom feed")
                       (href "/feed.xml")))
              ,(stylesheet "site")
              )
             (body
              (intro
               '(div (@ (class "container"))
                     (img (@ (alt "raven") (class "no-border")
                             (src "/assets/raven.png")))
                     (h1 (span (@ (class "white")) bdunahu))
                     (p "cs graduate student @ "
                        (a (@ (href "https://www.cics.umass.edu/"))
                           "UMass Amherst"))))
              (nav
               '(div (@ (class "container"))
                     (ul (li (a (@ (href "https://git.operationnull.com/"))
                                "git"))
                         (li (a (@ (href "/pages/contact.html"))
                                "contact"))
                         (li (a (@ (href "/posts/"))
                                "rand"))
                         (li (a (@ (href "/"))
                                "home")))))
              ,body
              (footer (@ (class "footer"))
                      "Copyright © 2024 bdunahu"
                      (br)
                      "Site content available under the " ,%cc-by-sa-link " license "
                      (a (@ (href "https://git.operationnull.com/operationnull.git/"))
                         "here")
                      "."
                      (br)
                      "Last updated on "
                      ,(date->string (current-date) "~b ~d, ~Y")
                      ". Generated with "
                      (a (@ (href "https://dthompson.us/projects/haunt.html"))
                         "Haunt")
                      " and "
                      (a (@ (href "https://gnu.org/software/guile"))
                         "Guile Scheme")
                      "."))))
         #:post-template
         (lambda (post)
           `((article
              (h3 (@ (class "title")),(post-ref post 'title))
              (div (@ (class "date"))
                   ,(date->string (post-date post)
                                  "~B ~d, ~Y"))
              (div (@ (class "post"))
                   ,(post-sxml post)))))
         #:collection-template
         (lambda (site title posts prefix)
           (define (post-uri post)
             (string-append prefix "/" (site-post-slug site post) ".html"))

           `(article (h2 ,title
                         (a (@ (href "/feed.xml"))
                            (img (@ (class "feed-icon") (src "/assets/feed.png")))))
                     ,(map (lambda (post)
                             (let ((uri (post-uri post)))
                               `(article (@ (class "summary"))
                                         (h3 (a (@ (href ,uri))
                                                ,(post-ref post 'title)))
                                         (div (@ (class "date"))
                                              ,(date->string (post-date post)
                                                             "~B ~d, ~Y"))
                                         (div (@ (class "post"))
                                              ,(first-paragraph post))
                                         (a (@ (href ,uri)) "more..."))))
                           posts)))
         #:pagination-template
         (lambda (site body previous-page next-page)
           `(,@body
             (div (@ (class "paginator"))
                  ,(if previous-page
                       `(a (@ (class "paginator-prev") (href ,previous-page))
                           "← Newer")
                       '())
                  ,(if next-page
                       `(a (@ (class "paginator-next") (href ,next-page))
                           "Older →")
                       '()))))
         ))