X-Git-Url: http://git.kpe.io/?a=blobdiff_plain;ds=inline;f=base.lisp;h=feca6b151a1f79dc54e24e938d1de29546bf515f;hb=63a46255032f6cb25666c40205a23409677eb757;hp=421eac0d8aefd2efd310ec8ff6f7e55bdd9dab61;hpb=73631a484a54cfd9596d7610e303295778cf4b11;p=lml.git
diff --git a/base.lisp b/base.lisp
index 421eac0..feca6b1 100644
--- a/base.lisp
+++ b/base.lisp
@@ -7,7 +7,7 @@
;;;; Programmer: Kevin M. Rosenberg
;;;; Date Started: Aug 2002
;;;;
-;;;; $Id: base.lisp,v 1.2 2003/01/04 13:26:14 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
;;;;
@@ -76,6 +76,14 @@
(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
@@ -97,6 +105,16 @@
(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)))
@@ -140,18 +158,25 @@
(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
@@ -162,20 +187,13 @@
`(with a :href ,dest ,@body))
(defmacro link-c (class dest &body body)
- `(with a :href ,dest :class ,class ,@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 "" 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 "" attr))))
+(defmacro input (&rest args)
+ `(with-no-endtag input ,@args))
(defmacro meta (name content)
`(with meta :name ,name :content ,content))
@@ -183,11 +201,11 @@
(defmacro meta-key (&key name content http-equiv)
`(with meta :name ,name :content ,content :http-equiv ,http-equiv))
-(defmacro br ()
- `(lml-print "
"))
+(defmacro br (&rest args)
+ `(with-no-endtag br ,@args))
-(defmacro hr ()
- `(lml-print "