builder: Add primitive blog builder.
* haunt/builder/blog.scm: New file. * Makefile.am (SOURCES): Add it.
This commit is contained in:
		@@ -48,6 +48,7 @@ SOURCES =					\
 | 
				
			|||||||
  haunt/site.scm				\
 | 
					  haunt/site.scm				\
 | 
				
			||||||
  haunt/build/html.scm				\
 | 
					  haunt/build/html.scm				\
 | 
				
			||||||
  haunt/builder/atom.scm			\
 | 
					  haunt/builder/atom.scm			\
 | 
				
			||||||
 | 
					  haunt/builder/blog.scm			\
 | 
				
			||||||
  haunt/ui.scm					\
 | 
					  haunt/ui.scm					\
 | 
				
			||||||
  haunt/ui/build.scm				\
 | 
					  haunt/ui/build.scm				\
 | 
				
			||||||
  haunt/ui/serve.scm				\
 | 
					  haunt/ui/serve.scm				\
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										81
									
								
								haunt/builder/blog.scm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										81
									
								
								haunt/builder/blog.scm
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,81 @@
 | 
				
			|||||||
 | 
					;;; Haunt --- Static site generator for GNU Guile
 | 
				
			||||||
 | 
					;;; Copyright © 2015 David Thompson <davet@gnu.org>
 | 
				
			||||||
 | 
					;;;
 | 
				
			||||||
 | 
					;;; This file is part of Haunt.
 | 
				
			||||||
 | 
					;;;
 | 
				
			||||||
 | 
					;;; Haunt 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.
 | 
				
			||||||
 | 
					;;;
 | 
				
			||||||
 | 
					;;; Haunt 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 Haunt.  If not, see <http://www.gnu.org/licenses/>.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					;;; Commentary:
 | 
				
			||||||
 | 
					;;
 | 
				
			||||||
 | 
					;; Page builders
 | 
				
			||||||
 | 
					;;
 | 
				
			||||||
 | 
					;;; Code:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					(define-module (haunt builder blog)
 | 
				
			||||||
 | 
					  #:use-module (srfi srfi-19)
 | 
				
			||||||
 | 
					  #:use-module (haunt site)
 | 
				
			||||||
 | 
					  #:use-module (haunt post)
 | 
				
			||||||
 | 
					  #:use-module (haunt page)
 | 
				
			||||||
 | 
					  #:use-module (haunt utils)
 | 
				
			||||||
 | 
					  #:use-module (haunt build html)
 | 
				
			||||||
 | 
					  #:export (blog))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					(define (ugly-theme site post)
 | 
				
			||||||
 | 
					  "Render POST on SITE with an unstyled, barebones theme."
 | 
				
			||||||
 | 
					  `((doctype "html")
 | 
				
			||||||
 | 
					    (head
 | 
				
			||||||
 | 
					     (title ,(string-append (post-ref post 'title)
 | 
				
			||||||
 | 
					                            " — "
 | 
				
			||||||
 | 
					                            (site-title site))))
 | 
				
			||||||
 | 
					    (body
 | 
				
			||||||
 | 
					     (h1 ,(post-ref post 'title))
 | 
				
			||||||
 | 
					     (h3 ,(post-ref post 'author))
 | 
				
			||||||
 | 
					     (div ,(post-sxml post)))))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					(define* (blog #:key (theme ugly-theme) prefix)
 | 
				
			||||||
 | 
					  "Return a procedure that transforms a list of posts into pages
 | 
				
			||||||
 | 
					decorated by THEME, whose URLs start with PREFIX."
 | 
				
			||||||
 | 
					  (define (make-file-name base-name)
 | 
				
			||||||
 | 
					    (if prefix
 | 
				
			||||||
 | 
					        (string-append prefix "/" base-name)
 | 
				
			||||||
 | 
					        base-name))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  (define (post-uri post)
 | 
				
			||||||
 | 
					    (string-append "/" (or prefix "") (post-slug post) ".html"))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  (define (post->recent-post-entry post)
 | 
				
			||||||
 | 
					    `(li
 | 
				
			||||||
 | 
					      (a (@ (href ,(post-uri post)))
 | 
				
			||||||
 | 
					         ,(post-ref post 'title))))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  (lambda (site posts)
 | 
				
			||||||
 | 
					    (define (post->page post)
 | 
				
			||||||
 | 
					      (let ((base-name (string-append (post-slug post) ".html")))
 | 
				
			||||||
 | 
					        (make-page (make-file-name base-name)
 | 
				
			||||||
 | 
					                   (theme site post)
 | 
				
			||||||
 | 
					                   sxml->html)))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    (define index-page
 | 
				
			||||||
 | 
					      (make-page (make-file-name "index.html")
 | 
				
			||||||
 | 
					                 `((doctype "html")
 | 
				
			||||||
 | 
					                   (head
 | 
				
			||||||
 | 
					                    (title ,(site-title site)))
 | 
				
			||||||
 | 
					                   (body
 | 
				
			||||||
 | 
					                    (h1 ,(site-title site))
 | 
				
			||||||
 | 
					                    (h3 "Recent Posts")
 | 
				
			||||||
 | 
					                    (ul ,@(map post->recent-post-entry
 | 
				
			||||||
 | 
					                               (posts/reverse-chronological posts)))))
 | 
				
			||||||
 | 
					                 sxml->html))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    (cons index-page (map post->page posts))))
 | 
				
			||||||
		Reference in New Issue
	
	Block a user