(define-module (theme) #:use-module (haunt html) #:use-module (haunt site) #:use-module (haunt post) #:use-module (haunt builder blog) #:use-module (sxml xpath) #:export (hwebs-theme-blog hwebs-theme-now flat-page-template)) (define (post-uri post site prefix) (string-append "/" (or prefix "") "/" (site-post-slug site post) ".html")) ;; ;; BLOG ;; (define layout (lambda (site title body) `((doctype "html") (html (head (meta (@ (http-equiv "Content-Type") (content "text/html") (charset "utf-8"))) (meta (@ (name "viewport") (content "width=device-width, initial-scale=1.0"))) (link (@ (rel "stylesheet") (type "text/css") (href "/style.css"))) (title ,(string-append title " — " (site-title site)))) (body (header (span ,(assq-ref (site-default-metadata site) 'author)) (nav (ul (li (a (@ (href "/")) "Home")) (li (a (@ (href "/now")) "Now")) (li (a (@ (href "/blog")) "Blog"))))) (main (article (h1 ,title) ,body))))))) (define hwebs-theme-blog (theme #:name "hwebs" #:layout layout #:post-template (lambda (post) ;; TODO fill in datetime correctly ;; TODO add ? (as hidden?) `((time ,(date->string*(post-date post))) ,(post-sxml post))) #:collection-template (lambda (site title posts prefix) `((ul ,@(map (lambda (post) `(li (a (@ (href ,(post-uri post site prefix))) ,(post-ref post 'title) " — " ,(date->string* (post-date post))))) posts)))))) (define (flat-page-template site metadata body) ((theme-layout hwebs-theme-blog) site (assq-ref metadata 'title) body)) ;; ;; NOW ;; (define (rss-items-template items) `(ul ,@(map (lambda (item) `(li ,item)) items))) (define (rss-items post) ((sxpath '(rss channel item title *text*)) (post-sxml post))) (define hwebs-theme-now (theme #:name "hwebs-now" #:layout layout #:post-template (lambda (post) ;; TODO (define (post-entries post) ((sxpath '(rss channel item title *text*)) (post-sxml post))) (rss-items-template (post-entries post))) #:collection-template (lambda (site title posts prefix) `(,@(map (lambda (post) (define items (rss-items post)) `(section (h2 ,(post-ref post 'title)) ,(rss-items-template ;; not optimal, btw (list-head items (min 5 (length items)))) ;; TODO only show if there are more entries than max? (a (@ (href ,(post-uri post site prefix))) "See more."))) posts)))))