#lang pollen/mode racket/base
;; Copyright (c) 2019 Joel Dueck.
;;
;; Licensed under the Apache License, Version 2.0 (the "License");
;; you may not use this file except in compliance with the License.
;; A copy of the License is included with this source code, in the
;; file "LICENSE.txt".
;; You may also obtain a copy of the License at
;;
;; http://www.apache.org/licenses/LICENSE-2.0
;;
;; Unless required by applicable law or agreed to in writing, software
;; distributed under the License is distributed on an "AS IS" BASIS,
;; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
;; See the License for the specific language governing permissions and
;; limitations under the License.
;;
;; Author contact information:
;; joel@jdueck.net
;; https://joeldueck.com
;; -------------------------------------------------------------------------
;; 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"
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)
(spell-of-summoning!) ; Turn on the DB
(define articles+notes (slice-at (list/articles+notes 'listing_full_html #:series #f) per-page))
(define pagecount (length articles+notes))
(for ([pagenum (in-range 1 (+ 1 pagecount))]
[page (in-list articles+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))