- 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
+          #:do-html-when
+          #:do-html-unless
           #:html-escape))
 
 (in-package :html)
@@ -200,7 +202,7 @@ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
      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
@@ -249,6 +251,22 @@ where appropriate."
            (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,
@@ -293,10 +311,9 @@ user code must explicitely use this function where necessary."
       (: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)