;; Copyright (c) 2003-2009, Dr. Edmund Weitz. All rights reserved.
;;
;; Redistribution and use in source and binary forms, with or without
;; modification, are permitted provided that the following conditions
;; are met:
;;
;; * Redistributions of source code must retain the above copyright
;; notice, this list of conditions and the following disclaimer.
;;
;; * Redistributions in binary form must reproduce the above
;; copyright notice, this list of conditions and the following
;; disclaimer in the documentation and/or other materials
;; provided with the distribution.
;;
;; THIS SOFTWARE IS PROVIDED BY THE AUTHOR 'AS IS' AND ANY EXPRESSED
;; OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
;; WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
;; ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
;; DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
;; DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
;; GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
;; INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
;; WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
;; NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
;; SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
(in-package "tl-who-priv")
;; Kind of simulate Common Lisp defconstant.
(defmacro defconstant (name value)
^(unless (boundp ',name)
(defsymacro ,name (macro-time ,value))))
;; This is the first line that'll be printed if the :prologue keyword
;; argument is true.
(defvar *prologue*
"")
;; Whether to insert line breaks and indent. Also controls amount of
;; indentation dynamically.
(defvar *indent* nil)
;; :sgml for (SGML-)HTML, :xml (default) for xhtml, :html5 for html5.")
(defvar *html-mode* :xml)
;; Set this to t to enable attribute minimization (also called
;; 'boolean attributes', or 'empty attribute syntax' according to the w3
;; html standard). In XHTML attribute minimization is forbidden, and all
;; attributes must have a value. Thus in XHTML boolean attributes must be
;; defined as . In HTML5 boolean attributes
;; can be defined as .
(defvar *empty-attribute-syntax* nil)
;; If true, tag and attribute names will be converted to upper case only
;; if they contain no upper case letters. This is useful when one needs to
;; output case sensitive XML.
(defvar *upcase-tokens-p* nil)
;; Quote character for attributes.
(defvar *attribute-quote-char* #\')
;; End of an empty tag. Default is XML style.
(defvar *empty-tag-end* " />")
;; The list of HTML tags that should disable indentation inside them.
;; The initial value is a list containing only :pre and :textarea.
(defvar *html-no-indent-tags* '(:pre :textarea))
;; The list of HTML tags that should be output as empty tags.
;; See *html-empty-tag-aware-p*.
(defvar *html-empty-tags*
'(:area
:atop
:audioscope
:base
:basefont
:br
:choose
:col
:command
:embed
:frame
:hr
:img
:input
:isindex
:keygen
:left
:limittext
:link
:meta
:nextid
:of
:over
:param
:range
:right
:source
:spacer
:spot
:tab
:track
:wbr))
;; Set this to NIL to if you want to use CL-WHO as a strict XML
;; generator. Otherwise, CL-WHO will only write empty tags listed
;; in *HTML-EMPTY-TAGS* as (XHTML mode) or (SGML
;; mode and HTML5 mode). For all other tags, it will always generate
;;
(defvar *html-empty-tag-aware-p* t)
;; Change certain TL-WHO behaviors to original CL-WHO behaviors. These
;; are behaviors TL-WHO changed in order to improve the security.
;; TL-WHO performs implicit HTML escaping on the output of the
;; expressions that calculate attribute values. TL-WHO's fmt function
;; also escapes the formatted output. If this varaible is twrue, these
;; behaviors revert to the CL-WHO behaviors of not escaping.
(defvar *cl-who-compat* nil)
;; Hash table with tag macro bindings for deftag.
(defvar *tag-macro* (hash))
;; Current html form being expanded.
(defvar *cur-form* (hash))
;; Current macro-expansion environment.
(defvar *cur-env* (hash))
;; Used for indentation.
(defconstant +newline+ "\n")