HTML Generation

We have functions that turn sexps into HTML. The format of the sexp is

((element-name {:attribute-name attribute-value}*) {contents})
where element-name is a symbol, attribute-name is a keyword, and contents are more elements, or strings. If there are no attributes, the parens around element-name can be omitted. For example
(html
 (head (title "Title"))
 (body (p "Click here to visit ((a :href "http://www.google.com/") "Google"))))

The functions are HTML (returns a string) and HTML-STREAM (outputs directly to a stream). The latter is much less consy, so to be preferred

We also have a pattern-based rewriting system so that you can "invent your own tags" (sic), using DEFINE-PATTERNS. See example 6 in ../examples/main.lisp. This is used in the DEFINE-PAGE macro, which also gives you correct handling of conditional GETs for free.