869 lines
27 KiB
Plaintext
869 lines
27 KiB
Plaintext
\input texinfo
|
|
@c -*-texinfo-*-
|
|
|
|
@c %**start of header
|
|
@setfilename haunt.info
|
|
@documentencoding UTF-8
|
|
@settitle Haunt Reference Manual
|
|
@c %**end of header
|
|
|
|
@include version.texi
|
|
|
|
@copying
|
|
Copyright @copyright{} 2015 David Thompson@*
|
|
|
|
Permission is granted to copy, distribute and/or modify this document
|
|
under the terms of the GNU Free Documentation License, Version 1.3 or
|
|
any later version published by the Free Software Foundation; with no
|
|
Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A
|
|
copy of the license is included in the section entitled ``GNU Free
|
|
Documentation License''.
|
|
@end copying
|
|
|
|
@dircategory Web development
|
|
@direntry
|
|
* Haunt: (haunt). Haunt, the functional static site generator.
|
|
@end direntry
|
|
|
|
@titlepage
|
|
@title Haunt Reference Manual
|
|
@subtitle Using Haunt
|
|
@author The Haunt Developers
|
|
|
|
@page
|
|
@vskip 0pt plus 1filll
|
|
Edition @value{EDITION} @*
|
|
@value{UPDATED} @*
|
|
|
|
@insertcopying
|
|
@end titlepage
|
|
|
|
@contents
|
|
|
|
@node Top
|
|
@top Haunt
|
|
|
|
This document describes Haunt version @value{VERSION}, an extensible,
|
|
functional static site generator.
|
|
|
|
@menu
|
|
* Introduction:: About Haunt.
|
|
* Installation:: Installing Haunt.
|
|
* Tutorial:: How to get started quickly.
|
|
* Command-line Interface:: Using Haunt from the command-line.
|
|
* Programming Interface:: Using the Haunt API in Scheme.
|
|
* Contributing:: How to contribute to Haunt.
|
|
|
|
* GNU Free Documentation License:: The license of this manual.
|
|
* Concept Index:: Concepts.
|
|
* Programming Index:: Data types, procedures, syntax, and variables.
|
|
|
|
@detailmenu
|
|
--- The Detailed Node Listing ---
|
|
|
|
Installation
|
|
|
|
* Downloading:: Downloading the source code.
|
|
* Requirements:: Software needed to build and run Haunt.
|
|
* Building:: Building from source code.
|
|
|
|
@end detailmenu
|
|
@end menu
|
|
|
|
@node Introduction
|
|
@chapter Introduction
|
|
|
|
Haunt is a hackable static site generator written in Guile Scheme. A
|
|
static site generator assists an author with generating the HTML pages
|
|
that they publish on the web. Unlike ``content management systems''
|
|
such as Wordpress or Drupal, static site generators are not dynamic
|
|
web applications (complete with a relational database) that build
|
|
pages on-the-fly. Instead, web pages are built in advance, on the
|
|
author's computer, and copied to a web server when it is time to
|
|
publish changes. The consequence of this design is that the web
|
|
server no longer needs to run a complex, potentially insecure web
|
|
application that connects to a database to retrieve data. Static
|
|
files can be served easily by any generic web server. Since there is
|
|
no web application or database server to deal with, static websites
|
|
are easier to maintain, more secure, and resistant to high web traffic
|
|
(``slashdotting.'') Furthermore, the entire website is stored in
|
|
plain text, which allows the files to be version-controlled rather
|
|
than kept in a relational database with no concept of history that
|
|
needs to be backed up regularly.
|
|
|
|
At the time that Haunt was conceived, there existed literally hundreds
|
|
of other static site generators. Why add another one? Haunt
|
|
differentiates itself from most other static site generators in that
|
|
it aspires to the Emacs philosophy of ``practical software freedom.''
|
|
Not only is the source code available under a Free Software license,
|
|
as most static site generators are, it is designed to be easily hacked
|
|
and extended without altering the core source code. Haunt
|
|
purposefully blurs the line between document and program, author and
|
|
programmer, by embracing the notion of data as code. A Haunt-based
|
|
website is not simply data, but a computer program. This design
|
|
strategy encourages authors to automate repetitive tasks and empowers
|
|
them to extend the software with their own ideas.
|
|
|
|
To make such a system work well, a general-purpose, extensible
|
|
programming language is needed. A traditional configuration file
|
|
format simply will not do. The programming language that we feel is
|
|
best suited to this task is Scheme, a clean and elegant dialect of
|
|
Lisp. We believe that by giving authors the full expressive power of
|
|
Scheme, they will be able to produce better websites and make better
|
|
use of their time than with less programmable systems and less capable
|
|
programming languages. Authors should feel empowered to hack the
|
|
system to make it do what they want rather than what some programmer
|
|
decided they should want. And perhaps most importantly, building
|
|
websites with Haunt should be @emph{fun}.
|
|
|
|
Websites written in Haunt are described as purely functional programs
|
|
that accept ``posts'', text documents containing arbitrary metadata,
|
|
as input and transform them into complete HTML pages using Scheme
|
|
procedures. Haunt has no opinion about what markup language authors
|
|
should use to write their posts and will happily work with any format
|
|
for which a ``reader'' procedure exists. Likewise, Haunt also has no
|
|
opinion about how authors should structure their sites, but has sane
|
|
defaults. Currently, there exist helpful ``builder'' procedures that
|
|
do common tasks such as generating a blog or Atom feed. While the
|
|
built-in features may be enough for some, they surely will not be
|
|
enough for all. Haunt's Scheme API empowers authors to easily tweak
|
|
existing components, write replacements, or add entirely new features
|
|
that do things no else has thought to do yet.
|
|
|
|
Happy haunting!
|
|
|
|
@node Installation
|
|
@chapter Installation
|
|
|
|
@menu
|
|
* Downloading:: Downloading the source code.
|
|
* Requirements:: Software needed to build and run Haunt.
|
|
* Building:: Building from source code.
|
|
@end menu
|
|
|
|
@node Downloading
|
|
@section Downloading
|
|
|
|
Official Haunt source code release tarballs can be found on the
|
|
@url{http://haunt.dthompson.us/downloads.html, downloads page} of
|
|
Haunt's website, along with their associated checksums.
|
|
|
|
@node Requirements
|
|
@section Requirements
|
|
|
|
Haunt depends on the following packages:
|
|
|
|
@itemize
|
|
@item
|
|
@url{https://gnu.org/software/guile, GNU Guile} version 2.0.11 or
|
|
later
|
|
@end itemize
|
|
|
|
The following dependencies are optional:
|
|
|
|
@itemize
|
|
@item
|
|
@url{http://www.nongnu.org/guile-reader/, Guile-Reader} version 0.6 or
|
|
later (for Skribe support)
|
|
@item
|
|
@url{https://github.com/OrangeShark/guile-commonmark, guile-commonmark}
|
|
version 0.1 or later (for CommonMark support)
|
|
@end itemize
|
|
|
|
@node Building
|
|
@section Building
|
|
|
|
Haunt uses the standard GNU build system, so the basic installation
|
|
procedure looks like this:
|
|
|
|
@example
|
|
./configure
|
|
make
|
|
make install
|
|
@end example
|
|
|
|
@node Tutorial
|
|
@chapter Tutorial
|
|
|
|
The goal of this tutorial is to quickly create a barebones blog with
|
|
Haunt in order to demonstrate the basic workflow and key concepts.
|
|
|
|
First, create a directory for the new site:
|
|
|
|
@example
|
|
mkdir haunt-tutorial
|
|
cd haunt-tutorial
|
|
@end example
|
|
|
|
Next, create the site configuration file @file{haunt.scm}. This is
|
|
where all of the code for building the website will go.
|
|
|
|
Here's what a simple Haunt configuration looks like:
|
|
|
|
@example
|
|
(use-modules (haunt asset)
|
|
(haunt site)
|
|
(haunt builder blog)
|
|
(haunt builder atom)
|
|
(haunt reader skribe))
|
|
|
|
(site #:title "My First Haunt Site"
|
|
#:domain "example.com"
|
|
#:default-metadata
|
|
'((author . "Eva Luator")
|
|
(email . "eva@@example.com"))
|
|
#:readers (list skribe-reader)
|
|
#:builders (list (blog)
|
|
(atom-feed)
|
|
(atom-feeds-by-tag)))
|
|
@end example
|
|
|
|
Haunt represents the full configuration of the website using the
|
|
@code{site} procedure. Site objects specify things like the site
|
|
title, the default metadata to use for posts, which markup formats are
|
|
supported, and which builders are used to generate web pages.
|
|
|
|
With the above code saved into the @file{haunt.scm} file, the next
|
|
step is to create a @file{posts} directory and populate it with
|
|
articles to publish. Put the text below into a file named
|
|
@file{posts/hello.skr}:
|
|
|
|
@example
|
|
(post
|
|
:title "Hello, World!"
|
|
:date (make-date* 2015 10 15)
|
|
:tags '("hello")
|
|
|
|
(h1 [Hello, World!])
|
|
|
|
(p [This is my very first Skribe document!]))
|
|
@end example
|
|
|
|
This is a
|
|
@url{http://www.nongnu.org/skribilo/doc/user-3.html#skribe-syntax,
|
|
Skribe} document. Skribe is one of the built-in languages that Haunt
|
|
knows how to work with. It's basically Scheme, but with support for
|
|
writing literal text without quoting it all by enclosing it in square
|
|
brackets. The code above defines a post named ``Hello, World!'' with
|
|
a publishing date of 2015-10-15, whose contents are just a single
|
|
heading and a paragraph.
|
|
|
|
To build the site, run @command{haunt build} to compile all of the
|
|
HTML pages. To view the results, run @command{haunt serve} and visit
|
|
@url{http://localhost:8080} in a web browser. @command{haunt serve}
|
|
is a handy utility that serves the contents of the website using
|
|
Guile's built-in HTTP server. Since the blog builder was specified in
|
|
@file{haunt.scm}, the default index page is a simple listing of all
|
|
posts, which for now is a single post. Clicking on the post title
|
|
will display a page with only that post's contents.
|
|
|
|
In addition to the basic blog builder, the @file{haunt.scm} file
|
|
specifies two additional builders for Atom feeds. The
|
|
@code{atom-feed} builder creates a feed of all posts located at
|
|
@url{http://localhost:8080/feed.xml}. The @code{atom-feeds-by-tag}
|
|
builder creates one feed for each unique tag specified in the post
|
|
metadata. There's only one tag right now, ``hello'', and its feed is
|
|
located at @url{http://localhost/feeds/tags/hello.xml}.
|
|
|
|
Tweaking a post, rebuilding the site, and viewing the results in a web
|
|
browser is the typical Haunt workflow. However, having to run
|
|
@command{haunt build} every after each edit is tedious. To address
|
|
this, run @command{haunt serve --watch}. The Haunt web server, in
|
|
addition to serving web pages, will now watch for changes to important
|
|
files and automatically rebuild the site when they are edited. This
|
|
streamlines the workflow into an edit, save, view loop.
|
|
|
|
Now that we've introduced the basic utilities and concepts, continue
|
|
reading this manual to learn more about Haunt's command-line and
|
|
programming interfaces.
|
|
|
|
@node Command-line Interface
|
|
@chapter Command-line Interface
|
|
|
|
@menu
|
|
* Invoking haunt build:: Build the website.
|
|
* Invoking haunt serve:: Serve the website over HTTP.
|
|
@end menu
|
|
|
|
The Haunt command-line interface is composed of many subcommands. The
|
|
general syntax for all Haunt commands is:
|
|
|
|
@example
|
|
haunt @var{subcommand} @var{options}@dots{}
|
|
@end example
|
|
|
|
@node Invoking haunt build
|
|
@section Invoking @command{haunt build}
|
|
|
|
The @command{haunt build} command realizes a Haunt site configuration
|
|
file by compiling web pages and copying static assets to the output
|
|
directory. For details on how to configure a Haunt site,
|
|
@pxref{Sites}.
|
|
|
|
Example:
|
|
|
|
@example
|
|
haunt build --config=haunt.scm
|
|
@end example
|
|
|
|
@table @code
|
|
|
|
@item --config=@var{configuration-file}
|
|
@itemx -c @var{configuration-file}
|
|
Load the Haunt site declaration from @var{configuration-file}.
|
|
|
|
@end table
|
|
|
|
@node Invoking haunt serve
|
|
@section Invoking @command{haunt serve}
|
|
|
|
The @command{haunt serve} command allows one to quickly view a local
|
|
preview of the generated website before publishing the finished
|
|
product to a remote web server. When @command{haunt serve} runs, a
|
|
local HTTP server is spawned. Visit the server using a web browser to
|
|
inspect the results of the build. By default, the web server listens
|
|
on port 8080, so the URL to visit would be
|
|
@url{http://localhost:8080}.
|
|
|
|
While developing, it is common to rebuild the site frequently to view
|
|
the results of incremental changes. Rather than manually running
|
|
@command{haunt build} (@ref{Invoking haunt build}) each time changes
|
|
are made, the @code{--watch} flag can be used to automatically rebuild
|
|
the site when a source file changes on disk.
|
|
|
|
@table @code
|
|
|
|
@item --config=@var{configuration-file}
|
|
@itemx -c @var{configuration-file}
|
|
Load the Haunt site declaration from @var{configuration-file}.
|
|
|
|
@item --port=@var{port}
|
|
@itemx -p @var{port}
|
|
|
|
Listen for HTTP requests on @var{port}.
|
|
|
|
@item --watch
|
|
@itemx -w
|
|
|
|
Automatically rebuild the site when source files change.
|
|
|
|
@end table
|
|
|
|
@node Programming Interface
|
|
@chapter Programming Interface
|
|
|
|
@menu
|
|
* Sites:: Description of the site and how to build it.
|
|
* Posts:: Articles, prose, blog posts, etc.
|
|
* Readers:: Post interpreters.
|
|
* Pages:: HTML/XML pages.
|
|
* Assets:: Images, stylesheets, etc.
|
|
* Builders:: Web page builders.
|
|
@end menu
|
|
|
|
Haunt is a fully-programmable system composed of several Guile Scheme
|
|
modules. This section documents the public API.
|
|
|
|
@node Sites
|
|
@section Sites
|
|
|
|
@example
|
|
(use-modules (haunt site))
|
|
@end example
|
|
|
|
A site object defines all of the properties for a Haunt website: The
|
|
site name, domain name, where blog posts are found, what post formats
|
|
are understood, which procedures are used to build the site, where the
|
|
output files are written to, etc.
|
|
|
|
@deffn {Scheme Procedure} site [#:title "This Place is Haunted"] @
|
|
[#:domain "example.com"] [#:posts-directory "posts"] @
|
|
[#:file-filter @code{default-file-filter}] @
|
|
[#:build-directory "site"] [#:default-metadata '()] @
|
|
[#:make-slug @code{post-slug}] [#:readers '()] @
|
|
[#:builders '()]
|
|
Create a new site object. All arguments are optional:
|
|
|
|
@table @var
|
|
|
|
@item title
|
|
The name of the site.
|
|
|
|
@item posts-directory
|
|
The directory where posts are found.
|
|
|
|
@item file-filter
|
|
A predicate procedure that returns @code{#f} when a post file should
|
|
be ignored, and @code{#t} otherwise. Emacs temporary files are
|
|
ignored by default.
|
|
|
|
@item build-directory
|
|
The directory that generated pages are stored in.
|
|
|
|
@item default-metadata
|
|
An alist of arbitrary default metadata for posts whose keys are
|
|
symbols.
|
|
|
|
@item make-slug
|
|
A procedure generating a file name slug from a post.
|
|
|
|
@item readers
|
|
A list of reader objects for processing posts.
|
|
|
|
@item builders
|
|
A list of procedures for building pages from posts.
|
|
|
|
@end table
|
|
|
|
@end deffn
|
|
|
|
@deffn {Scheme Procedure} site? @var{obj}
|
|
Return @code{#t} if @var{obj} is a site object.
|
|
@end deffn
|
|
|
|
@deffn {Scheme Procedure} site-title @var{site}
|
|
Return the title of @var{site}.
|
|
@end deffn
|
|
|
|
@deffn {Scheme Procedure} site-domain @var{site}
|
|
Return the domain of @var{site}.
|
|
@end deffn
|
|
|
|
@deffn {Scheme Procedure} site-posts-directory @var{site}
|
|
Return the posts directory for @var{site}.
|
|
@end deffn
|
|
|
|
@deffn {Scheme Procedure} site-file-filter @var{site}
|
|
Return the file filter procedure for @var{site}.
|
|
@end deffn
|
|
|
|
@deffn {Scheme Procedure} site-build-directory @var{site}
|
|
Return the build directory of @var{site}.
|
|
@end deffn
|
|
|
|
@deffn {Scheme Procedure} site-make-slug @var{site}
|
|
Return the slug constructor for @var{site}.
|
|
@end deffn
|
|
|
|
@deffn {Scheme Procedure} site-readers @var{site}
|
|
Return the list of reader procedures for @var{site}.
|
|
@end deffn
|
|
|
|
@deffn {Scheme Procedure} site-builders @var{site}
|
|
Return the list of builder procedures for @var{site}.
|
|
@end deffn
|
|
|
|
@node Posts
|
|
@section Posts
|
|
|
|
@example
|
|
(use-modules (haunt post))
|
|
@end example
|
|
|
|
Posts represent the articles that are kept in a site's post directory
|
|
and written in a markup format that Haunt can
|
|
understand. @pxref{Readers}) for how files on disk can be transformed
|
|
into posts.
|
|
|
|
@deffn {Scheme Procedure} make-post @var{file-name} @var{metadata} @var{sxml}
|
|
Create a new post object that represents the contents of the file
|
|
@var{file-name}. The body of the post, @var{sxml}, is represented as
|
|
an SXML tree (@pxref{SXML, SXML,, guile, GNU Guile Reference Manual})
|
|
and the metadata is an association list (@pxref{Association Lists,
|
|
Association Lists,, guile, GNU Guile Reference Manual}) of arbitrary
|
|
key/value pairs.
|
|
@end deffn
|
|
|
|
@deffn {Scheme Procedure} post? @var{object}
|
|
Return @code{#t} if @var{object} is a post.
|
|
@end deffn
|
|
|
|
@deffn {Scheme Procedure} post-file-name @var{post}
|
|
Return the file name for @var{post}.
|
|
@end deffn
|
|
|
|
@deffn {Scheme Procedure} post-metadata @var{post}
|
|
Return the metadata association list for @var{post}.
|
|
@end deffn
|
|
|
|
@deffn {Scheme Procedure} post-sxml @var{post}
|
|
Return the SXML tree for @var{post}.
|
|
@end deffn
|
|
|
|
@deffn {Scheme Procedure} post-ref @var{post} @var{key}
|
|
Return the metadata value corresponding to @var{key} within
|
|
@var{post}.
|
|
@end deffn
|
|
|
|
@deffn {Scheme Procedure} post-slug @var{post}
|
|
Transform the title of @var{post} into a URL slug suitable for the
|
|
file name of a web page.
|
|
@end deffn
|
|
|
|
@defvr {Scheme Variable} %default-date
|
|
The default date of a post when no other date is specified in the
|
|
metadata association list.
|
|
@end defvr
|
|
|
|
@deffn {Scheme Procedure} post-date @var{post}
|
|
Return the date for @var{post}, or @code{%default-date} if no date is
|
|
specified.
|
|
@end deffn
|
|
|
|
@deffn {Scheme Procedure} posts/reverse-chronological @var{posts}
|
|
Sort @var{posts}, a list of posts, in reverse chronological order.
|
|
@end deffn
|
|
|
|
@deffn {Scheme Procedure} posts/group-by-tag @var{posts}
|
|
Create an association list of tags mapped to the posts in the list
|
|
@var{posts} that used them.
|
|
@end deffn
|
|
|
|
@node Readers
|
|
@section Readers
|
|
|
|
@example
|
|
(use-modules (haunt reader))
|
|
@end example
|
|
|
|
The purpose of a reader is to translate the markup within a post file
|
|
into an SXML tree representing the HTML structure and associate some
|
|
metadata with it.
|
|
|
|
@deffn {Scheme Procedure} make-reader @var{matcher} @var{proc}
|
|
Create a new reader. The reader is to be activated when
|
|
@var{matcher}, a procedure that accepts a file name as its only
|
|
argument, returns @code{#t}. When a post file matches, the procedure
|
|
@var{proc}, which also accepts a file name as its only argument, reads
|
|
the contents and returns a post object (@pxref{Posts}).
|
|
@end deffn
|
|
|
|
@deffn {Scheme Procedure} reader? @var{object}
|
|
Return @code{#t} if @var{object} is a reader.
|
|
@end deffn
|
|
|
|
@deffn {Scheme Procedure} reader-matcher @var{reader}
|
|
Return the match procedure for @var{reader}.
|
|
@end deffn
|
|
|
|
@deffn {Scheme Procedure} reader-proc @var{reader}
|
|
Return the read procedure for @var{reader}.
|
|
@end deffn
|
|
|
|
@deffn {Scheme Procedure} reader-match? @var{reader} @var{file-name}
|
|
Return @code{#t} if @var{file-name} is a file supported by
|
|
@var{reader}.
|
|
@end deffn
|
|
|
|
@deffn {Scheme Procedure} read-post @var{reader} @var{file-name} [@var{default-metadata}]
|
|
Read a post object from @var{file-name} using @var{reader}, merging
|
|
its metadata with @var{default-metadata}, or the empty list if not
|
|
specified.
|
|
@end deffn
|
|
|
|
@deffn {Scheme Procedure} read-posts @var{directory} @var{keep?} @var{readers} [@var{default-metadata}]
|
|
Read all of the files in @var{directory} that match @var{keep?} as
|
|
post objects. The @var{readers} list must contain a matching reader
|
|
for every post.
|
|
@end deffn
|
|
|
|
@deffn {Scheme Procedure} make-file-extension-matcher @var{ext}
|
|
Create a procedure that returns @code{#t} when a file name ends with
|
|
``.ext''.
|
|
@end deffn
|
|
|
|
@defvr {Scheme Procedure} sxml-reader
|
|
A basic reader for posts written as Scheme code that evaluates to an
|
|
an association list. The special key @code{content} contains the post
|
|
body as an SXML tree.
|
|
|
|
Example:
|
|
|
|
@example
|
|
(use-modules (haunt utils))
|
|
|
|
`((title . "Hello, world!")
|
|
(date . ,(string->date* "2015-04-10 23:00"))
|
|
(tags "foo" "bar")
|
|
(summary . "Just a test")
|
|
(content
|
|
((h2 "Hello!")
|
|
(p "This is Haunt. A static site generator for GNU Guile."))))
|
|
@end example
|
|
|
|
@end defvr
|
|
|
|
@defvr {Scheme Procedure} html-reader
|
|
A basic reader for posts written in plain ol' HTML. Metadata is
|
|
encoded as the @code{key: value} pairs, one per line, at the beginning
|
|
of the file. A line with the @code{---} sentinel marks the end of the
|
|
metadata section and the rest of the file is encoded as HTML.
|
|
|
|
Example:
|
|
|
|
@example
|
|
title: A Foo Walks Into a Bar
|
|
date: 2015-04-11 20:00
|
|
tags: bar
|
|
---
|
|
<p>
|
|
This is an example using raw HTML, because Guile doesn't have a
|
|
Markdown parser.
|
|
</p>
|
|
@end example
|
|
|
|
@end defvr
|
|
|
|
@node Pages
|
|
@section Pages
|
|
|
|
@example
|
|
(use-modules (haunt page))
|
|
@end example
|
|
|
|
Page objects represent files that have yet to be written to disk.
|
|
Their contents may be any arbitrary object that their writer procedure
|
|
knows how to serialize. In practice, pages are almost always written
|
|
to disk as HTML or XML.
|
|
|
|
@deffn {Scheme Procedure} make-page @var{file-name} @var{contents} @var{writer}
|
|
Create a new page object. The string @var{file-name} specifies where
|
|
the page should be written to in the file system. The procedure
|
|
@var{writer} is responsible for serializing @var{contents}.
|
|
@end deffn
|
|
|
|
@deffn {Scheme Procedure} page? @var{object}
|
|
Return @code{#t} if @var{object} is a page object.
|
|
@end deffn
|
|
|
|
@deffn {Scheme Procedure} page-file-name @var{page}
|
|
Return the file name string for @var{page}.
|
|
@end deffn
|
|
|
|
@deffn {Scheme Procedure} page-contents @var{page}
|
|
Return the contents of @var{page}.
|
|
@end deffn
|
|
|
|
@deffn {Scheme Procedure} page-writer @var{page}
|
|
Return the writer procedure @var{page}.
|
|
@end deffn
|
|
|
|
@deffn {Scheme Procedure} write-page @var{page} @var{output-directory}
|
|
Write @var{page} to @var{output-directory}.
|
|
@end deffn
|
|
|
|
@node Assets
|
|
@section Assets
|
|
|
|
@example
|
|
(use-modules (haunt asset))
|
|
@end example
|
|
|
|
Assets represent files on disk that should be copied verbatim to a
|
|
site's output directory. Common types of assets include CSS,
|
|
JavaScript, images, and fonts.
|
|
|
|
@deffn {Scheme Procedure} make-asset @var{source} @var{target}
|
|
Create a new asset object. The @var{source} and @var{target}
|
|
arguments are file names that are relative to a site source and target
|
|
directory, respectively (@pxref{Sites}).
|
|
@end deffn
|
|
|
|
@deffn {Scheme Procedure} asset? @var{object}
|
|
Return @code{#t} if @var{object} is an asset object.
|
|
@end deffn
|
|
|
|
@deffn {Scheme Procedure} asset-source @var{asset}
|
|
Return the source file name for @var{asset}.
|
|
@end deffn
|
|
|
|
@deffn {Scheme Procedure} asset-target @var{asset}
|
|
Return the target file name for @var{asset}.
|
|
@end deffn
|
|
|
|
@deffn {Scheme Procedure} install-asset @var{asset} @var{prefix}
|
|
Install the source file of @var{asset} into the target directory
|
|
within @var{prefix}.
|
|
@end deffn
|
|
|
|
@deffn {Scheme Procedure} directory-assets @var{directory} @var{keep?} @var{dest}
|
|
Create a list of asset objects to be stored within @var{dest} for all
|
|
files in @var{directory} that match @var{keep?}, recursively.
|
|
@end deffn
|
|
|
|
@node Builders
|
|
@section Builders
|
|
|
|
@menu
|
|
* Static Assets:: Images, CSS, JavaScript, etc.
|
|
* Blog:: Dear diary...
|
|
* Atom:: Atom feeds.
|
|
@end menu
|
|
|
|
Builders are procedures that return one or more page objects
|
|
(@pxref{Pages}) when applied. A builder accepts two arguments: A site
|
|
(@pxref{Sites} and a list of posts (@pxref{Posts}).
|
|
|
|
Haunt comes with a few convenient builders to help users who want to
|
|
create a simple blog with an Atom feed.
|
|
|
|
@node Static Assets
|
|
@subsection Static Assets
|
|
|
|
@example
|
|
(use-modules (haunt builder assets))
|
|
@end example
|
|
|
|
@deffn {Scheme Procedure} static-directory @var{directory} @
|
|
[@var{dest} @var{directory}]
|
|
|
|
Create a builder procedure that recursively copies all of the files in
|
|
@var{directory}, a file names relative to a site's source directory,
|
|
and copies them into @var{dest}, a prefix relative to a site's target
|
|
output directory. By default, @var{dest} is @var{directory}.
|
|
@end deffn
|
|
|
|
@node Blog
|
|
@subsection Blog
|
|
|
|
@example
|
|
(use-modules (haunt builder blog))
|
|
@end example
|
|
|
|
@deffn {Scheme Procedure} theme [#:name #:layout #:post-template #:collection-template]
|
|
Create a new theme named @var{name}.
|
|
|
|
The procedure @var{layout} accepts three arguments: a site, a page
|
|
title string, and an SXML tree. Its purpose is to wrap the contents
|
|
of a post with the theme's header/footer and return the complete SXML
|
|
tree for a web page.
|
|
|
|
The procedure @var{post-template} accepts a single argument: a post.
|
|
Its purpose is to return an SXML tree containing the contents of the
|
|
post, applying any desired post-processing operations. The values
|
|
returned from this procedure will be wrapped in the theme's layout.
|
|
|
|
The procedure @var{collection-template} accepts four arguments: a
|
|
site, a title string, a list of posts, and a URL prefix string. Its
|
|
purpose is to return an SXML tree containing the body of the
|
|
collection page. The values returned from this procedure will be
|
|
wrapped in the theme's layout.
|
|
@end deffn
|
|
|
|
@deffn {Scheme Procedure} theme? @var{object}
|
|
Return @code{#t} if @var{object} is a theme object.
|
|
@end deffn
|
|
|
|
@deffn {Scheme Procedure} blog [#:theme #:prefix #:collections]
|
|
Create a builder procedure that transforms a list of posts into pages
|
|
decorated by @var{theme}, a theme object, whose URLs start with
|
|
@var{prefix}.
|
|
|
|
Additionally, this builder creates pages that aggregate previews of
|
|
many posts corresponding to what is specified in the list
|
|
@var{collections}. Each collection is a three element list in the
|
|
form @code{(title file-name filter)}.
|
|
|
|
@table @var
|
|
|
|
@item title
|
|
The human readable name of the collection.
|
|
|
|
@item file-name
|
|
The HTML file that will contain the rendered collection.
|
|
|
|
@item filter
|
|
A procedure that accepts a list of posts as its only argument and
|
|
returns a new list of posts. The filter procedure is used to remove
|
|
and/or sort the posts into the desired form for the collection. For
|
|
example, a filter could sort posts in reverse chronological order or
|
|
select all posts that are written by a particular author.
|
|
|
|
@end table
|
|
|
|
By default, a single collection is created that lists posts in reverse
|
|
chronological order and writes to @file{index.html}.
|
|
|
|
The default theme is intended only for testing purposes.
|
|
|
|
@end deffn
|
|
|
|
@node Atom
|
|
@subsection Atom
|
|
|
|
@example
|
|
(use-modules (haunt builder atom))
|
|
@end example
|
|
|
|
@deffn {Scheme Procedure} atom-feed [#:file-name #:subtitle #:filter #:max-entries #:blog-prefix]
|
|
Return a builder procedure that renders a site's posts as an Atom
|
|
feed. All arguments are optional:
|
|
|
|
@table @var
|
|
|
|
@item file-name:
|
|
The page file name. The default is @file{feed.xml}.
|
|
|
|
@item subtitle
|
|
The feed subtitle. The default is ``Recent Posts''.
|
|
|
|
@item filter
|
|
The procedure called to manipulate the posts list before rendering.
|
|
The default is to keep all posts and sort them in reverse
|
|
chronological order.
|
|
|
|
@item max-entries
|
|
The maximum number of posts to render in the feed. The default is 20.
|
|
@end table
|
|
|
|
@end deffn
|
|
|
|
@deffn {Scheme Procedure} atom-feeds-by-tag [#:prefix #:filter #:max-entries #:blog-prefix]
|
|
Return a builder procedure that renders an atom feed for every tag
|
|
used in a post. All arguments are optional:
|
|
|
|
@table @var
|
|
|
|
@item prefix
|
|
The directory in which to write the feeds. The default is
|
|
@file{feeds/tags}.
|
|
|
|
@item filter
|
|
The procedure called to manipulate the posts list before rendering.
|
|
The default is to keep all posts and sort them in reverse
|
|
chronological order.
|
|
|
|
@item max-entries
|
|
The maximum number of posts to render in each feed. The default is
|
|
20.
|
|
|
|
@end table
|
|
|
|
@end deffn
|
|
|
|
@node Contributing
|
|
@chapter Contributing
|
|
|
|
@c *********************************************************************
|
|
@node GNU Free Documentation License
|
|
@appendix GNU Free Documentation License
|
|
|
|
@include fdl-1.3.texi
|
|
|
|
@c *********************************************************************
|
|
@node Concept Index
|
|
@unnumbered Concept Index
|
|
@printindex cp
|
|
|
|
@node Programming Index
|
|
@unnumbered Programming Index
|
|
@syncodeindex tp fn
|
|
@syncodeindex vr fn
|
|
@printindex fn
|
|
|
|
@bye
|
|
|
|
@c Local Variables:
|
|
@c ispell-local-dictionary: "american";
|
|
@c End:
|