(define-module (builder base) #:use-module (haunt site) #:use-module (builder components) #:use-module (builder includes) #:use-module (srfi srfi-19) #:use-module (json) #:export (base-template contained-template page-template)) (define stylesheets (list "https://fonts.bunny.net/css?family=alegreya:400,400i,800,800i" "/static/normalize.css" "/static/reset.css" "/static/main.css")) (define open-graph '(("og:title" "Eltrac") ("og:url" "https://eltr.ac") ("og:image" "/static/avatar.jpg") ("og:type" "profile") ("profile:username" "Eltrac"))) (define (base-template site page-title . content) (let ((title (if page-title (string-append page-title " ยท " (site-title site)) (site-title site)))) `((doctype "html") (html (@ (lang "en")) (head (meta (@ (charset "utf-8"))) (meta (@ (content "width=device-width,initial-scale=1") (name "viewport"))) (link (@ (rel "icon") (href "/static/favicon.ico"))) (link (@ (rel "preconnect") (href "https://fonts.bunny.net"))) ;; Open Graph ,@(map (lambda (item) `(meta (@ (name ,(car item)) (value ,(list-ref (cdr item) 0))))) open-graph) ;; JSON-LD (script (@ (type "application/ld+json")) ,(scm->json-string '(("@context" . "https://schema.org") ("@type" . "Person") ("name" . "Eltrac") ("url" . "https://eltr.ac") ("image" . "https://eltr.ac/static/avatar.jpg") ("description" . "I write software, fictions and non-fictions.") ("email" . "mailto:hi@eltr.ac") ("sameAs" . #("https://geedea.pro/" "https://geedea.pro/en/" "https://codeberg.org/eltrac"))))) ;; stylesheet ,@(map (lambda (uri) `(link (@ (rel "stylesheet") (href ,uri)))) stylesheets) (title ,title)) (body ,@content))))) (define (container content) `(div (@ (class "container")) ,@content)) (define (contained-template site . content) (base-template site #f (container content))) (define (page-template site metadata body) (base-template site (assq-ref metadata 'title) `(div (@ (class "container wider")) (main (@ (class "page prose")) ` ,,body ,(let ((lastmod (assq-ref metadata 'lastmod))) (when lastmod `(p (@ (class "prose-container small")) "Last modified: " ,(date->string lastmod "~Y-~m-~d ~H:~M"))))) (footer (@ (style "margin: 2rem 0")) ,(navigation)))))