- Add DO-HTML-WHEN and DO-HTML-UNLESS
authorMatthew Mondor <mmondor@pulsar-zone.net>
Fri, 19 Aug 2011 13:05:10 +0000 (13:05 +0000)
committerMatthew Mondor <mmondor@pulsar-zone.net>
Fri, 19 Aug 2011 13:05:10 +0000 (13:05 +0000)
- Fix a bug in DO-HTML

mmsoftware/cl/server/html.lisp

index 64912f3..dc92d8b 100644 (file)
@@ -1,4 +1,4 @@
-;;;; $Id: html.lisp,v 1.2 2011/08/19 11:58:25 mmondor Exp $
+;;;; $Id: html.lisp,v 1.3 2011/08/19 13:05:10 mmondor Exp $
 
 #|
 
 
 #|
 
@@ -41,6 +41,8 @@ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
   (:export #:*html-mode*
           #:do-html
           #:do-html-loop
   (:export #:*html-mode*
           #:do-html
           #:do-html-loop
+          #:do-html-when
+          #:do-html-unless
           #:html-escape))
 
 (in-package :html)
           #:html-escape))
 
 (in-package :html)
@@ -200,7 +202,7 @@ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
      list)
     (reverse out)))
 
      list)
     (reverse out)))
 
-(defmacro do-html (stream tree)
+(defmacro do-html (stream &body tree)
   "Utility macro to generate HTML easily from Common Lisp code.
 At compile time, the supplied TREE template is converted to a list
 of strings and objects, and the compiler generates code to output the
   "Utility macro to generate HTML easily from Common Lisp code.
 At compile time, the supplied TREE template is converted to a list
 of strings and objects, and the compiler generates code to output the
@@ -249,6 +251,22 @@ where appropriate."
            (do-html ,s-stream
              ,@body)))))
 
            (do-html ,s-stream
              ,@body)))))
 
+(defmacro do-html-when (condition &body body)
+  "Similar to WHEN, but returns an empty string otherwise, and includes an
+implicit DO-HTML NIL.  For use within DO-HTML forms."
+  `(if ,condition
+       (do-html nil
+        ,@body)
+       ""))
+
+(defmacro do-html-unless (condition &body body)
+  "Similar to UNLESS, but returns an empty string otherwise, and includes an
+implicit DO-HTML NIL.  For use within DO-HTML forms."
+  `(if (not ,condition)
+       (do-html nil
+        ,@body)
+       ""))
+
 (defun html-escape (string)
   "Returns a fresh copy of STRING which is safe for use within HTML.
 Note that for simplicity, efficiency and to allow nested DO-HTML forms,
 (defun html-escape (string)
   "Returns a fresh copy of STRING which is safe for use within HTML.
 Note that for simplicity, efficiency and to allow nested DO-HTML forms,
@@ -293,10 +311,9 @@ user code must explicitely use this function where necessary."
       (:html (:head (:title title))
             (:body
              (:h1 title)
       (:html (:head (:title title))
             (:body
              (:h1 title)
-             (if description
-                 (do-html nil
-                   (:p (html-escape description)))
-                 "")
+             (do-html-when description
+               (do-html nil
+                 (:p (html-escape description))))
              (:small
               (html-escape (format nil "~A/~A"
                                    (lisp-implementation-type)
              (:small
               (html-escape (format nil "~A/~A"
                                    (lisp-implementation-type)