|
20 | 20 | "paths.rkt" |
21 | 21 | "build/metadata.rkt" |
22 | 22 | "build/render/scribble.rkt" |
| 23 | + "build/render/feed.rkt" |
23 | 24 | "build/render/page.rkt") |
24 | 25 |
|
25 | 26 | (define num-posts-per-page 10) |
|
89 | 90 | (display "<!doctype html>" out) |
90 | 91 | (write-xexpr xexpr out)) |
91 | 92 |
|
| 93 | +(define (write-xml xexpr out) |
| 94 | + (display "<?xml version=\"1.0\" encoding=\"utf-8\"?>" out) |
| 95 | + (write-xexpr xexpr out)) |
| 96 | + |
92 | 97 | (define (build-post-body dep) |
93 | 98 | (define src-mod-time (file-or-directory-modify-seconds (post-dep-src-path dep) #f (λ () #f))) |
94 | 99 | (define info-mod-time (file-or-directory-modify-seconds (post-dep-info-path dep) #f (λ () #f))) |
|
132 | 137 | out-path |
133 | 138 | (λ~>> (write-html (post-page info))))) |
134 | 139 |
|
135 | | -(define (build-post-index total-pages number posts) |
136 | | - (define site-path (index-path number #:file? #t)) |
| 140 | +(define (build-index-page total-pages page-number posts #:tag [tag #f]) |
| 141 | + (define site-path (index-path page-number #:tag tag #:file? #t)) |
| 142 | + (define out-path (reroot-path site-path output-dir)) |
137 | 143 | (eprintf "~a rendering <output>~a\n" (timestamp-string) site-path) |
| 144 | + (make-parent-directory* out-path) |
138 | 145 | (call-with-output-file* #:exists 'truncate/replace |
139 | | - (reroot-path site-path output-dir) |
140 | | - (λ~>> (write-html (post-index-page total-pages number posts))))) |
| 146 | + out-path |
| 147 | + (λ~>> (write-html (index-page total-pages page-number posts #:tag tag))))) |
| 148 | + |
| 149 | +(define (build-feeds posts #:tag [tag #f]) |
| 150 | + (build-feed 'atom posts #:tag tag) |
| 151 | + (build-feed 'rss posts #:tag tag)) |
141 | 152 |
|
142 | | -(define (build-tag-index total-pages page-number tag posts) |
143 | | - (define site-path (tag-index-path tag page-number)) |
| 153 | +(define (build-feed type posts #:tag tag) |
| 154 | + (define site-path (feed-path type #:tag tag)) |
144 | 155 | (define out-path (reroot-path site-path output-dir)) |
145 | 156 | (eprintf "~a rendering <output>~a\n" (timestamp-string) site-path) |
146 | 157 | (make-parent-directory* out-path) |
147 | 158 | (call-with-output-file* #:exists 'truncate/replace |
148 | 159 | out-path |
149 | | - (λ~>> (write-html (tag-index-page total-pages page-number tag posts))))) |
| 160 | + (λ~>> (write-xml (feed type posts #:tag tag))))) |
150 | 161 |
|
151 | 162 | (define (build-all) |
152 | 163 | (make-directory* build-dir) |
153 | 164 | (make-directory* output-dir) |
154 | | - (define post-infos |
| 165 | + (define all-posts |
155 | 166 | (for/list ([dep (in-list all-post-deps)]) |
156 | 167 | (define info (build-post-body dep)) |
157 | 168 | (build-post-page dep info) |
158 | 169 | info)) |
159 | 170 |
|
160 | 171 | (define total-pages (ceiling (/ (length all-post-deps) num-posts-per-page))) |
161 | | - (for ([posts (in-slice num-posts-per-page (reverse post-infos))] |
| 172 | + (for ([posts (in-slice num-posts-per-page (reverse all-posts))] |
162 | 173 | [number (in-naturals 1)]) |
163 | | - (build-post-index total-pages number posts)) |
| 174 | + (build-index-page total-pages number posts)) |
| 175 | + (build-feeds (reverse all-posts)) |
164 | 176 |
|
165 | 177 | (define tagged-posts |
166 | 178 | (for*/fold ([tagged-deps+infos (hash)]) |
167 | | - ([post (in-list post-infos)] |
| 179 | + ([post (in-list all-posts)] |
168 | 180 | [tag (in-list (rendered-post-tags post))]) |
169 | 181 | (hash-update tagged-deps+infos tag (λ~>> (cons post)) '()))) |
170 | 182 |
|
171 | 183 | (for ([(tag posts) (in-immutable-hash tagged-posts)]) |
172 | 184 | (define total-pages (ceiling (/ (length posts) num-posts-per-page))) |
173 | 185 | (for ([posts (in-slice num-posts-per-page posts)] |
174 | 186 | [page-number (in-naturals 1)]) |
175 | | - (build-tag-index total-pages page-number tag posts)))) |
| 187 | + (build-index-page total-pages page-number posts #:tag tag)) |
| 188 | + (build-feeds posts #:tag tag))) |
176 | 189 |
|
177 | 190 | (module+ main |
178 | 191 | (build-all)) |
0 commit comments