;; -*- mode: common-lisp; package: lml2 -*-
;;
-;; $Id: htmlgen.lisp,v 1.11 2003/06/29 16:21:09 kevin Exp $
+;; $Id: htmlgen.lisp,v 1.13 2003/07/15 04:28:56 kevin Exp $
;;
;; copyright (c) 1986-2000 Franz Inc, Berkeley, CA
;; copyright (c) 2003 Kevin Rosenberg
;; Main changes from Allegro version:
;; - Support XHTML end tags
;; - lowercase symbol names for attributes
-;; - Add custom tags such as :jscript, :insert-file, :nbsp
+;; - Add custom tags such as :jscript, :insert-file, :load-file, :nbsp
;; - removal of if* macro -- partially complete
;;
;; This code is free software; you can redistribute it and/or
;; argsp is true if this isn't a singleton tag (i.e. it has
;; a body) .. (:tag ...) or ((:tag ...) ...)
;; body is the body if any of the form
- ;;
+ ;;
(let (spec)
(if* (setq spec (html-process-special ent))
then ; do something different
(push `(,(html-process-macro ent) :unset) res)
nil
else ; some args
- (push `(,(html-process-macro ent) ,args
- ,(process-html-forms body env))
+ (push `(,(html-process-macro ent)
+ ,args
+ ,(process-html-forms body env))
res)
nil)))))
(prin1-safe-http-string ,(cadddr xx)))
res)
(pop xx) (pop xx)
+ elseif (eq :fformat (car xx))
+ then
+ ;; process :fformat
+ (unless (and (listp (cadr xx))
+ (>= (length (cadr xx)) 2))
+ (error ":fformat must be given a list"))
+ (push
+ `(write-string
+ ,(format nil " ~(~a~)=\"" (car (cadr xx)))
+ *html-stream*)
+ res)
+ (push
+ `(fformat *html-stream* ,(cadr (cadr xx))
+ ,@(cddr (cadr xx)))
+ res)
+ (push '(write-char #\" *html-stream*) res)
+ elseif (eq :optional (car xx))
+ then
+ (push
+ `(when ,(cadr (cadr xx))
+ (write-string
+ ,(format nil " ~(~a~)=\"" (car (cadr xx)))
+ *html-stream*)
+ (fformat *html-stream* "~A\""
+ ,(cadr (cadr xx))))
+ res)
else
(push `(write-string
;; must use <!-- --> syntax
(declare (ignore ent args argsp))
`(progn
- (write-string "<script language=\"JavasSript\" type=\"text/javascript\">" *html-stream*)
+ (write-string "<script language=\"JavaScript\" type=\"text/javascript\">" *html-stream*)
(write-char #\newline *html-stream*)
(write-string "//![CDATA[" *html-stream*)
(write-char #\newline *html-stream*)
(write-string " " stream)
(error ":nbsp in an illegal place: ~s" form)))))
-(def-special-html :insert-file
+
+(def-special-html :load-file
(named-function html-nbsp-function
(lambda (ent args argsp body)
(declare (ignore ent args argsp))
(unless body
- (error "must have a body with :insert-file"))
+ (error "must have a body with :load-file"))
`(progn ,@(mapcar #'(lambda (bod)
`(lml-load ,bod))
body))))
(assert (eql 2 (length form)))
(if (eq cmd :full)
(lml-load (cadr form))
- (error ":insert-file must be given an argument")))))
+ (error ":load-file must be given an argument")))))
+(def-special-html :insert-file
+ (named-function html-nbsp-function
+ (lambda (ent args argsp body)
+ (declare (ignore ent args argsp))
+ (unless body
+ (error "must have a body with :insert-file"))
+ `(progn ,@(mapcar #'(lambda (bod)
+ `(insert-file ,bod))
+ body))))
+
+ (named-function html-nbsp-print-function
+ (lambda (ent cmd args form subst unknown stream)
+ (declare (ignore ent unknown subst stream args))
+ (assert (eql 2 (length form)))
+ (if (eq cmd :full)
+ (insert-file (cadr form))
+ (error ":insert-file must be given an argument")))))
(def-special-html :write-string
(named-function html-write-string-function
(if (eq cmd :full)
(write-char (cadr form) stream)
(error ":write-char must be given an argument")))))
+
+;; fast formatter
+(def-special-html :fformat
+ (named-function html-write-char-function
+ (lambda (ent args argsp body)
+ (declare (ignore ent args argsp))
+ `(progn ,@(mapcar #'(lambda (bod)
+ `(progn
+ (format *html-stream* " ~(~A~)=\"" (car ,bod))
+ (apply #'format *html-stream* (cdr ,bod))
+ (write-char #\" *html-stream*)))
+ body))))
+
+ (named-function html-write-char-print-function
+ (lambda (ent cmd args form subst unknown stream)
+ (declare (ignore args ent unknown subst))
+ (assert (eql 2 (length form)))
+ (if (eq cmd :full)
+ (progn
+ (format stream " ~(~A~)=\"" (car form))
+ (apply #'format stream (cdr form))
+ (write-char #\" stream))
+ (error ":fformat must be given an argument")))))
+