;;; Copyright © 2015 David Thompson ;;; ;;; This program is free software; you can redistribute it and/or ;;; modify it under the terms of the GNU General Public License as ;;; published by the Free Software Foundation; either version 3 of the ;;; License, or (at your option) any later version. ;;; ;;; This program is distributed in the hope that it will be useful, ;;; but WITHOUT ANY WARRANTY; without even the implied warranty of ;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ;;; General Public License for more details. ;;; ;;; You should have received a copy of the GNU General Public License ;;; along with this program. If not, see ;;; . ;; (define (add-to-load-path* directory) ;; (unless (member directory %load-path) ;; (add-to-load-path directory))) ;; (add-to-load-path* "/home/dave/Code/guile-syntax-highlight") (use-modules (haunt asset) (haunt builder blog) (haunt builder atom) (haunt builder assets) (haunt html) (haunt page) (haunt post) (haunt reader) (haunt reader commonmark) (haunt site) (haunt utils) ;; (syntax-highlight) ;; (syntax-highlight scheme) (sxml match) (sxml transform) (texinfo) (texinfo html) (srfi srfi-19) (ice-9 rdelim) (ice-9 regex) (ice-9 match) (web uri)) (define (stylesheet name) `(link (@ (rel "stylesheet") (href ,(string-append "/css/" name ".css"))))) (define (anchor content uri) `(a (@ (href ,uri)) ,content)) (define %cc-by-sa-link '(a (@ (href "https://creativecommons.org/licenses/by-sa/4.0/")) "Creative Commons Attribution Share-Alike 4.0 International")) (define %cc-by-sa-button '(a (@ (class "cc-button") (href "https://creativecommons.org/licenses/by-sa/4.0/")) (img (@ (src "https://licensebuttons.net/l/by-sa/4.0/80x15.png"))))) (define %piwik-code '((script (@ (type "text/javascript") (src "/js/piwik.js"))) (noscript (p (img (@ (src "//stats.dthompson.us/piwik.php?idsite=3") (style "border:0;") (alt ""))))))) (define (link name uri) `(a (@ (href ,uri)) ,name)) (define (first-paragraph post) (let loop ((sxml (post-sxml post)) (result '())) (match sxml (() (reverse result)) ((or (('p ...) _ ...) (paragraph _ ...)) (reverse (cons paragraph result))) ((head . tail) (loop tail (cons head result)))))) (define dthompson-theme (theme #:name "dthompson" #:layout (lambda (site title body) `((doctype "html") (head (meta (@ (charset "utf-8"))) (title ,(string-append title " — " (site-title site))) ,(stylesheet "reset") ,(stylesheet "fonts") ,(stylesheet "dthompson")) (body (div (@ (class "container")) (div (@ (class "nav")) (ul (li ,(link "David Thompson" "/")) (li (@ (class "fade-text")) "λ") (li ,(link "About" "/about.html")) (li ,(link "Blog" "/index.html")) (li ,(link "Projects" "/projects.html")))) ,body (footer (@ (class "text-center")) (p (@ (class "copyright")) "© 2015 David Thompson" ,%cc-by-sa-button) (p "The text and images on this site are free culture works available under the " ,%cc-by-sa-link " license.") (p "This website is built with " (a (@ (href "http://haunt.dthompson.us")) "Haunt") ", a static site generator written in " (a (@ (href "https://gnu.org/software/guile")) "Guile Scheme") ".")))))) #:post-template (lambda (post) `((h1 (@ (class "title")),(post-ref post 'title)) (div (@ (class "date")) ,(date->string (post-date post) "~B ~d, ~Y")) (div (@ (class "post")) ,(post-sxml post)))) #:collection-template (lambda (site title posts prefix) (define (post-uri post) (string-append "/" (or prefix "") (site-post-slug site post) ".html")) `((h1 ,title) ,(map (lambda (post) (let ((uri (string-append "/" (site-post-slug site post) ".html"))) `(div (@ (class "summary")) (h2 (a (@ (href ,uri)) ,(post-ref post 'title))) (div (@ (class "date")) ,(date->string (post-date post) "~B ~d, ~Y")) (div (@ (class "post")) ,(first-paragraph post)) (a (@ (href ,uri)) "read more ➔")))) posts))))) ;; (define (static-page file theme reader) ;; (lambda (site posts) ;; (make-page "foo.html" ;; (with-layout theme )))) (define %collections `(("Recent Blog Posts" "index.html" ,posts/reverse-chronological))) (define parse-lang (let ((rx (make-regexp "-*-[ ]+([a-z]*)[ ]+-*-"))) (lambda (port) (let ((line (read-line port))) (match:substring (regexp-exec rx line) 1))))) (define (maybe-highlight-code source) (call-with-input-string source (lambda (port) (let ((lang (string->symbol (parse-lang port)))) (if lang (highlights->sxml (highlight (match lang ('scheme lex-scheme) ('xml lex-xml)) port)) source))))) (define (sxml-identity . args) args) (define (highlight-code . tree) (sxml-match tree ((pre (@ . ,attrs) ,source) `(pre (@ ,@attrs) ,(maybe-highlight-code source))))) (site #:title "dthompson" #:domain "dthompson.us" #:default-metadata '((author . "David Thompson") (email . "davet@gnu.org")) #:readers (list commonmark-reader) #:builders (list (blog #:theme dthompson-theme #:collections %collections) (atom-feed) (atom-feeds-by-tag) (static-directory "css") (static-directory "fonts") (static-directory "images") (static-directory "src")))