web/dom: more pre-defined elemnts; simplify dlist accordingly
This commit is contained in:
		
							parent
							
								
									64dea8453d
								
							
						
					
					
						commit
						464bbfde65
					
				
					 1 changed files with 15 additions and 8 deletions
				
			
		
							
								
								
									
										23
									
								
								web/dom.lisp
									
										
									
									
									
								
							
							
						
						
									
										23
									
								
								web/dom.lisp
									
										
									
									
									
								
							| 
						 | 
					@ -40,6 +40,8 @@
 | 
				
			||||||
        (put c))
 | 
					        (put c))
 | 
				
			||||||
      (end tag))))
 | 
					      (end tag))))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					;;;; void element (e.g. <input ...>): no body, no explicit closing of tag
 | 
				
			||||||
 | 
					
 | 
				
			||||||
(defclass void-element (element) ())
 | 
					(defclass void-element (element) ())
 | 
				
			||||||
 | 
					
 | 
				
			||||||
(defun void-element (tag attrs)
 | 
					(defun void-element (tag attrs)
 | 
				
			||||||
| 
						 | 
					@ -48,27 +50,32 @@
 | 
				
			||||||
(defmethod put ((el void-element))
 | 
					(defmethod put ((el void-element))
 | 
				
			||||||
  (start (tag el) (attrs el)))
 | 
					  (start (tag el) (attrs el)))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					;;;; automatically define standard HTML elements
 | 
				
			||||||
 | 
					
 | 
				
			||||||
(defmacro make-elements (tags &optional (elem-fn 'elem))
 | 
					(defmacro make-elements (tags &optional (elem-fn 'elem))
 | 
				
			||||||
  `(progn
 | 
					  `(progn
 | 
				
			||||||
     ,@(mapcar (lambda (tag) ;`(make-element ,tag)) tags)))
 | 
					     ,@(mapcar (lambda (tag) ;`(make-element ,tag)) tags)))
 | 
				
			||||||
                 `(defun ,tag (attrs &rest body)
 | 
					                 `(defun ,tag (attrs &rest body)
 | 
				
			||||||
                   (funcall #',elem-fn ',tag attrs body)))
 | 
					                   (funcall (function ,elem-fn) ',tag attrs body)))
 | 
				
			||||||
               tags)))
 | 
					               tags)))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
(eval-when (:compile-toplevel :load-toplevel :execute)
 | 
					(eval-when (:compile-toplevel :load-toplevel :execute)
 | 
				
			||||||
    (make-elements (div label)))
 | 
					    (make-elements (a dd div dl dt label)))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					(eval-when (:compile-toplevel :load-toplevel :execute)
 | 
				
			||||||
 | 
					    (make-elements (br input) :void-element))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
;;;; elements with specific functionality
 | 
					;;;; elements with specific functionality
 | 
				
			||||||
 | 
					
 | 
				
			||||||
(defun dlist (attrs plist)
 | 
					(defun dlist (attrs plist)
 | 
				
			||||||
  (elem :dl attrs
 | 
					  (dl attrs
 | 
				
			||||||
    (util:loop-plist plist key val append
 | 
					    (util:loop-plist plist key val append
 | 
				
			||||||
          (cons (element :dt nil (string-downcase key)) (dds nil val)))))
 | 
					          (cons (dt nil (string-downcase key)) (dds nil val)))))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
(defun dds (attrs cont)
 | 
					(defun dds (attrs cont)
 | 
				
			||||||
  (if (atom cont)
 | 
					  (if (atom cont)
 | 
				
			||||||
    (list (element :dd attrs cont))
 | 
					    (list (dd attrs cont))
 | 
				
			||||||
    (mapcar #'(lambda (x) (element :dd nil x)) cont)))
 | 
					    (mapcar #'(lambda (x) (dd nil x)) cont)))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
;;;; rendering
 | 
					;;;; rendering
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -84,8 +91,8 @@
 | 
				
			||||||
  (put-string tag)
 | 
					  (put-string tag)
 | 
				
			||||||
  (put-attrs attrs)
 | 
					  (put-attrs attrs)
 | 
				
			||||||
  (if close
 | 
					  (if close
 | 
				
			||||||
    (put-char #\/))
 | 
					    (put-string " />")
 | 
				
			||||||
  (put-char #\>))
 | 
					    (put-char #\>)))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
(defun end (tag)
 | 
					(defun end (tag)
 | 
				
			||||||
  (put-string "</")
 | 
					  (put-string "</")
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		
		Reference in a new issue