r3763: add
authorKevin M. Rosenberg <kevin@rosenberg.net>
Tue, 14 Jan 2003 08:41:22 +0000 (08:41 +0000)
committerKevin M. Rosenberg <kevin@rosenberg.net>
Tue, 14 Jan 2003 08:41:22 +0000 (08:41 +0000)
base.lisp
debian/changelog

index 5c2f88737630cb196207619d59747789e59b088f..feca6b151a1f79dc54e24e938d1de29546bf515f 100644 (file)
--- a/base.lisp
+++ b/base.lisp
@@ -7,7 +7,7 @@
 ;;;; Programmer:    Kevin M. Rosenberg
 ;;;; Date Started:  Aug 2002
 ;;;;
-;;;; $Id: base.lisp,v 1.3 2003/01/04 20:42:02 kevin Exp $
+;;;; $Id: base.lisp,v 1.4 2003/01/14 08:41:22 kevin Exp $
 ;;;;
 ;;;; This file, part of LML, is Copyright (c) 2002 by Kevin M. Rosenberg
 ;;;;
      (decf *indent*)
      (lml-print "</~(~A~)>" ',tag))))
 
+(defmacro with-no-endtag-attr-string (tag attr-string)
+  (let ((attr (gensym)))
+  `(let ((,attr ,attr-string))
+     (lml-print "<~(~A~)~A />" ',tag
+             (if (and (stringp ,attr) (plusp (length ,attr)))
+                 (format nil "~A" ,attr)
+               "")))))
+
 (defun one-keyarg-string (key value)
   "Return attribute string for keys"
   (format nil "~(~A~)=\"~A\"" key
           (push (one-keyarg-string (car ,kv) it) ,attr)))
        (with-attr-string ,tag (list-to-spaced-string (nreverse ,attr)) ,@body)))))
 
+(defmacro with-no-endtag-keyargs (tag keyargs)
+  (let ((attr (gensym))
+       (kv (gensym)))
+  `(progn
+     (let ((,attr '()))
+       (dolist (,kv ,keyargs)
+        (awhen (cdr ,kv)
+          (push (one-keyarg-string (car ,kv) it) ,attr)))
+       (with-no-endtag-attr-string ,tag (list-to-spaced-string (nreverse ,attr)))))))
+
 (defmacro bind-one-keyarg (keyarg)
   `(list ,(car keyarg) ,(cdr keyarg)))
 
     (setq keyargs (nreverse keyargs))
     (setq body (nreverse body))
     `(let ((,bound-keyargs ,(macroexpand `(bind-all-keyargs ,keyargs))))
-      ,(macroexpand `(with-keyargs ,tag ,bound-keyargs ,@body)))))
+       ,(macroexpand `(with-keyargs ,tag ,bound-keyargs ,@body)))))
 
-
-(defmacro keyargs-string (&rest args)
-  "Returns a string of attributes and values. Result contains a leading space."
-  (let ((keyarg-list '()))
-    (loop for ( name val ) on args by #'cddr
-         do
-         (when val
-           (push (one-keyarg-string name val) keyarg-list)))
-    (list-to-spaced-string (nreverse keyarg-list))))
-  
+(defmacro with-no-endtag (tag &rest args)
+  "Return a list of keyargs body of LML form"
+  (let ((keyargs '())
+       (bound-keyargs (gensym)))
+    (do* ((n (length args))
+         (i 0 (+ 2 i))
+         (arg (nth i args) (nth i args))
+         (value (when (< (1+ i) n)
+                  (nth (1+ i) args))
+                (when (< (1+ i) n)
+                  (nth (1+ i) args))))
+       ((or (not (keyword-symbol? arg))
+            (>= i n)))
+      (push (cons arg value) keyargs))
+    (setq keyargs (nreverse keyargs))
+    `(let ((,bound-keyargs ,(macroexpand `(bind-all-keyargs ,keyargs))))
+      ,(macroexpand `(with-no-endtag-keyargs ,tag ,bound-keyargs)))))
 
 (defmacro xhtml-prologue ()
   `(progn
 (defmacro link-c (class dest &body body)
   `(with a :href ,dest :class (quote ,class) ,@body))
 
-(defmacro img (dest &key class id alt style width height align)
-  (let ((attr
-        (eval `(keyargs-string :class ,class :id ,id :alt ,alt :style ,style
-                            :width ,width :height ,height :align ,align))))
-    `(lml-print ,(format nil "<img src=\"~A\"~A />" dest attr))))
+(defmacro img (dest &rest args)
+  `(with-no-endtag :src ,dest ,@args))
 
-(defmacro input (&key name class id type style size maxlength value checked)
-  (let ((attr
-        (eval `(keyargs-string :name ,name :class ,class :id ,id :style ,style
-                            :size ,size :maxlength ,maxlength :value ,value
-                            :type ,type :checked ,checked))))
-    `(lml-print ,(format nil "<input~A />" attr))))
+(defmacro input (&rest args)
+  `(with-no-endtag input ,@args))
 
 (defmacro meta (name content)
   `(with meta :name ,name :content ,content))
 (defmacro meta-key (&key name content http-equiv)
   `(with meta :name ,name :content ,content :http-equiv ,http-equiv))
 
-(defmacro br ()
-  `(lml-print "<br />"))
+(defmacro br (&rest args)
+  `(with-no-endtag br ,@args))
 
-(defmacro hr ()
-  `(lml-print "<hr />"))
+(defmacro hr (&rest args)
+  `(with-no-endtag hr ,@args))
 
 (defmacro lml-tag-macro (tag)
   `(progn
index 1757e72aaedbdaa6213c82bdecbf4a8e3c471abf..c3c391ea90365d3a0c42209e1ed1f56bd43aeb52 100644 (file)
@@ -1,3 +1,10 @@
+cl-lml (2.1.0-1) unstable; urgency=low
+
+  * Rework tags that don't have endtags (such as BR and HR) to evaluate
+  keyword arguments
+
+ -- Kevin M. Rosenberg <kmr@debian.org>  Tue, 14 Jan 2003 01:38:52 -0700
+
 cl-lml (2.0.2-1) unstable; urgency=low
 
   * Fix with-dir to properly evaluate parameters (Thanks Matthew Danish)