r2656: initial import
[lml.git] / stdsite.cl
1 ;;;; -*- Mode: LISP; Syntax: ANSI-Common-Lisp; Base: 10 -*-
2 ;;;; *************************************************************************
3 ;;;; FILE IDENTIFICATION
4 ;;;;
5 ;;;; Name:          stdsite.cl
6 ;;;; Purpose:       Functions to create my standard style sites
7 ;;;; Programmer:    Kevin M. Rosenberg
8 ;;;; Date Started:  Aug 2002
9 ;;;;
10 ;;;; $Id: stdsite.cl,v 1.1 2002/09/16 01:13:49 kevin Exp $
11 ;;;;
12 ;;;; This file, part of LML, is Copyright (c) 2002 by Kevin M. Rosenberg
13 ;;;;
14 ;;;; LML users are granted the rights to distribute and use this software
15 ;;;; as governed by the terms of the GNU General Public License v2
16 ;;;; (http://www.gnu.org/licenses/gpl.html)
17 ;;;; *************************************************************************
18
19 ;;; A "standard site" is a format for a certain style of web page.
20 ;;; It is based on the LML package.
21 ;;; A stdsite page expects to include the following files:
22 ;;;  head.lml_
23 ;;;  banner.lml_
24 ;;;  content.lml_
25 ;;;  footer.lml_
26
27 (declaim (optimize (debug 3) (speed 3) (safety 1) (compilation-speed 0)))
28 (in-package :lml)
29
30 (defmacro std-head (title &body body)
31   `(head 
32     (title ,title)
33     (lml-load #p"head.lml_")
34     ,@body))
35
36
37 (defun std-footer (file)
38   (div-c "disclaimsec"
39     (let ((ds (date-string 
40                (file-write-date (make-pathname
41                                  :defaults *sources-dir*
42                                  :type "lml"
43                                  :name (pathname-name file))))))
44       (when ds
45         (div-c "lastmod"
46                (lml-print "Last modified: ~A" ds)))))
47   (lml-load #p"footer.lml_")
48   (values))
49
50
51 (defmacro std-body (file &body body)
52   `(body
53     (lml-load #p"banner.lml_")
54     (table-c "stdbodytable" :border "0" :cellpadding "3" 
55              (tbody 
56               (tr :valign "top"
57                   (td-c "stdcontentcell"
58                         (lml-load #p"contents.lml_"))
59                   (td :valign "top"
60                       ,@body
61                       (std-footer ,file)))))))
62   
63
64 (defmacro print-std-page (file title &body body)
65   `(progn
66      (xhtml-prologue)
67      (html :xmlns "http://www.w3.org/1999/xhtml"
68            (std-head ,title)
69            (std-body ,file ,@body))))
70
71 (defmacro std-page (out-file title &body body)
72   `(let ((*indent* 0))
73      (with-open-file (*html-output* (lml-file-name ,out-file :output)
74                       :direction :output
75                       :if-exists :supersede)
76        (print-std-page (lml-file-name ,out-file :source) ,title ,@body))))
77
78 (defmacro titled-pre-section (title &body body)
79   `(progn
80      (h1 ,title)
81      (pre :style "padding-left:30pt;"
82           ,@body)))
83
84
85