r4981: Auto commit for Debian build
[kmrcl.git] / web-utils.lisp
1 ;;;; -*- Mode: Lisp; Syntax: ANSI-Common-Lisp; Base: 10 -*-
2 ;;;; *************************************************************************
3 ;;;; FILE IDENTIFICATION
4 ;;;;
5 ;;;; Name:          web-utils.lisp
6 ;;;; Purpose:       Basic web utility functions
7 ;;;; Programmer:    Kevin M. Rosenberg
8 ;;;; Date Started:  Apr 2000
9 ;;;;
10 ;;;; $Id: web-utils.lisp,v 1.9 2002/10/18 05:14:49 kevin Exp $
11 ;;;;
12 ;;;; This file, part of KMRCL, is Copyright (c) 2002 by Kevin M. Rosenberg
13 ;;;;
14 ;;;; KMRCL users are granted the rights to distribute and use this software
15 ;;;; as governed by the terms of the Lisp Lesser GNU Public License
16 ;;;; (http://opensource.franz.com/preamble.html), also known as the LLGPL.
17 ;;;; *************************************************************************
18
19 (in-package :kmrcl)
20 (declaim (optimize (speed 3) (safety 1) (compilation-speed 0) (debug 3)))
21
22
23 ;;; HTML/XML constants
24
25 (defvar *standard-xml-header* 
26   #.(format nil "<?xml version=\"1.0\" ?>~%<?xml-stylesheet type=\"text/css\" href=\"http://b9.com/umlsxml.css\" ?>~%~%"))
27
28 (defvar *standard-html-header* "<!DOCTYPE HTML PUBLIC \"-//IETF//DTD HTML//EN\">")
29
30 (defvar *standard-xhtml-header*
31   #.(format nil "<?xml version=\"1.0\" standalone=\"yes\"?>~%<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" \"http://www.w3c.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">"))
32
33
34 ;;; User agent functions
35
36 (defun user-agent-ie-p (agent)
37   "Takes a user-agent string and returns T for Internet Explorer."
38   (when (or (string-equal "Microsoft" (subseq agent 0 (length "Microsoft")))
39             (string-equal "Internet Explore" (subseq agent 0 (length "Internet Explore")))
40             (search "MSIE" agent))
41     t))
42
43 ;;; URL Functions
44
45 (defvar *base-url* "")
46 (defun base-url! (url)
47   (setq *base-url* url))
48
49 (defun make-url (page-name &key (base-dir *base-url*) (format :html) (vars nil))
50   (let ((amp (case format
51                (:html
52                 "&")
53                ((:xml :ie-xml)
54                 "&amp;"))))
55     (concatenate 'string 
56       base-dir page-name
57       (if vars
58           (let ((first-var (first vars)))
59             (concatenate 'string 
60               "?"  (car first-var) "=" (cadr first-var)
61               (mapcar-append-string 
62                #'(lambda (var) 
63                    (when (and (car var) (cadr var))
64                      (concatenate 'string 
65                        amp (car var) "=" (cadr var))))
66                (rest vars))))
67         ""))))