#lang pollen/mode racket/base
; SPDX-License-Identifier: BlueOak-1.0.0
; This file is licensed under the Blue Oak Model License 1.0.0.
;; Builds the paginated “blog” HTML files (blog-pg1.html ...) from the SQLite cache
;; The files will be written out every time this module is evaluated! (see end)
(require "crystalize.rkt"
"snippets-html.rkt"
"dust.rkt"
racket/file
sugar/list)
(provide main)
;; How many items per blog page
(define per-page 5)
;; Returns a string containing the entire HTML contents of a given blog page
(define (blog-page posts-str pagenum total-pages)
(define page-nav (html$-paginate-navlinks pagenum total-pages "blog"))
◊string-append{
<!DOCTYPE html>
<html lang="en">
◊html$-page-head[(format "The Local Yarn: Blog, p. ~a" pagenum)]
◊html$-page-body-open[]
<aside><i>Everything, in reverse time order. Well, almost everything.</i></aside>
<nav id="top-nav"><ul>◊|page-nav|</ul></nav>
◊posts-str
<nav id="bottom-nav"><ul>◊|page-nav|</ul></nav>
◊html$-page-body-close[]
</html>})
;; Grabs all the articles+notes from the cache and writes out all the blog page files
(define (build-blog)
(listing-context 'blog) ; honor conceal directives for the blog
(define arts-n-notes (slice-at (listing-htmls (articles+notes 'full #:series #f)) per-page))
(define pagecount (length arts-n-notes))
(for ([pagenum (in-range 1 (+ 1 pagecount))]
[page (in-list arts-n-notes)])
(define filename (format "blog-pg~a.html" pagenum))
(displayln (format "Writing: ~a" filename))
(display-to-file (blog-page (apply string-append page) pagenum pagecount)
filename
#:mode 'text
#:exists 'replace)))
(define (main)
;; Do it!
(build-blog))